Example #1
0
    def read_symbol(self, symbol_name):
        if not (self.lazy_load and self.filename):
            raise RuntimeError(
                """This feature only works if the gdxdict is initialized in 
                               lazy_load mode, and read has already been called."""
            )
        if not symbol_name in self:
            raise RuntimeError(
                "{} is not a symbol in this gdxdict.".format(symbol_name))

        H = gdxx.open(self.gams_dir)
        assert gdxcc.gdxOpenRead(
            H, self.filename)[0], "Couldn't open %s" % filename

        sinfo = self.getinfo(symbol_name)
        set_map = self.set_map
        all_keys = self.all_keys

        self.__read_one_symbol(H, sinfo, all_keys)

        gdxcc.gdxClose(H)
        gdxcc.gdxFree(H)

        guess_domains(self, set_map, all_keys)
        guess_ancestor_domains(self)
        self.set_map = set_map
        self.all_keys = all_keys
Example #2
0
def get_df(file_name, param_name):
    ws = gams.GamsWorkspace()

    gdxFile = os.path.join(os.getcwd(), file_name)

    gdxHandle = gdxcc.new_gdxHandle_tp()
    rc =  gdxcc.gdxCreate(gdxHandle, gdxcc.GMS_SSSIZE)
    assert rc[0],rc[1]
    assert gdxcc.gdxOpenRead(gdxHandle, gdxFile)[0]
    nrUels = gdxcc.gdxUMUelInfo(gdxHandle)[1]
    uelMap = []

    for i in range(nrUels+1):
        uelMap.append(gdxcc.gdxUMUelGet(gdxHandle, i)[1])
    ret, symNr = gdxcc.gdxFindSymbol(gdxHandle, param_name)
    assert ret, param_name + " parameter not found"
    ret, nrRecs = gdxcc.gdxDataReadRawStart(gdxHandle, symNr)
    assert ret, "Error in gdxDataReadRawStart: " + gdxcc.gdxErrorStr(gdxHandle, gdxcc.gdxGetLastError(gdxHandle))[1]

    ls = []
    for i in range(nrRecs):
        ret = gdxcc.gdxDataReadRaw(gdxHandle)
        sets = [uelMap[x] for x in ret[1]]
        val = ret[2][gdxcc.GMS_VAL_LEVEL]
        if val == 5e300:
            val = 0
        ls.append(sets+[val])

    assert not gdxcc.gdxClose(gdxHandle)
    assert gdxcc.gdxFree(gdxHandle)
    df = pd.DataFrame(ls)
    return df
Example #3
0
 def __init__(self, filename=None,gamsdir=None):
     assert os.access(filename, os.R_OK) != None, 'Gdx file "{}" not found or readable!'.format(filename)
     self.internal_filename = os.path.abspath(filename)
     self.gdx_handle = gdxcc.new_gdxHandle_tp()
     rc = gdxcc.gdxCreateD(self.gdx_handle, _gamsdir, gdxcc.GMS_SSSIZE)
     assert rc[0], rc[1]
     assert gdxcc.gdxOpenRead(self.gdx_handle, self.internal_filename)[0], 'Unable to read "{}"!'.format(filename)
     for symb in self.get_symbols_list():
         setattr(self, symb.name.lower(), symb)
Example #4
0
def dump_GDX_file(H, filename):
    assert gdxcc.gdxOpenRead(H, filename)[0], "Couldn't open %s" % filename

    info = gdxx.file_info(H)
    print "*  File Version   : %s" % info["version"]
    print "*  Producer       : %s" % info["producer"]
    print "*  Symbols        : %d" % info["symbol_count"]
    print "*  Unique Elements: %d" % info["element_count"]

    print "$ontext"
    for i in range(1, info["symbol_count"] + 1):
        sinfo = gdxx.symbol_info(H, i)
        print "%-15s %3d %-12s %s" % (sinfo["name"], sinfo["dims"], sinfo["typename"], sinfo["description"])
    print "$offtext\n$onempty onembedded"

    for i in range(1, info["symbol_count"] + 1):
        sinfo = gdxx.symbol_info(H, i)
        name = "%s %s" % (sinfo["full_typename"], sinfo["name"])
        dim_string = ""
        if sinfo["dims"] > 0:
            dim_string = "("
            for j in sinfo["domain"]:
                if j["index"] > 0:
                    dim_string += ","
                d = sinfo["domain"][j["index"]]
                dim_string += d["key"]
            dim_string += ")"
        desc = sinfo["description"]
        sm = '"' if "'" in desc else "'"
        print "%s%s %s%s%s /" % (name, dim_string, sm, desc, sm)

        ok, records = gdxcc.gdxDataReadStrStart(H, i)

        for i in range(records):
            ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
            if not ok:
                raise GDX_error(H, "Error in gdxDataReadStr")
            if values[gdxcc.GMS_VAL_LEVEL] == 0:
                continue
            dim_string = ""
            for d in range(sinfo["dims"]):
                if d > 0:
                    dim_string += "."
                dim_string += "'%s'" % elements[d]

            value_string = ""
            if sinfo["type"] == gdxcc.GMS_DT_PAR or sinfo["type"] == gdxcc.GMS_DT_VAR:
                value_string = "%g" % values[gdxcc.GMS_VAL_LEVEL]
            if sinfo["type"] == gdxcc.GMS_DT_SET:
                ret, description, node = gdxcc.gdxGetElemText(H, int(values[gdxcc.GMS_VAL_LEVEL]))
                if ret != 0:
                    sm = '"' if "'" in description else "'"
                    value_string = "%s%s%s" % (sm, description, sm)
            print "%s %s" % (dim_string, value_string)

        print "/;\n"
Example #5
0
    def read(self, filename):
        """
        Opens gdx file at filename and reads meta-data. If not self.lazy_load, 
        also loads all symbols.

        Throws an Error if not self.empty.

        Throws a GdxError if any calls to gdxcc fail.
        """
        if not self.empty:
            raise Error(
                "GdxFile.read can only be used if the GdxFile is .empty")

        # open the file
        rc = gdxcc.gdxOpenRead(self.H, filename)
        if not rc[0]:
            raise GdxError(self.H, "Could not open '{}'".format(filename))
        self._filename = filename

        # read in meta-data ...
        # ... for the file
        ret, self._version, self._producer = gdxcc.gdxFileVersion(self.H)
        if ret != 1:
            raise GdxError(self.H, "Could not get file version")
        ret, symbol_count, element_count = gdxcc.gdxSystemInfo(self.H)
        logger.debug(
            "Opening '{}' with {} symbols and {} elements with lazy_load = {}."
            .format(filename, symbol_count, element_count, self.lazy_load))
        # ... for the symbols
        ret, name, dims, data_type = gdxcc.gdxSymbolInfo(self.H, 0)
        if ret != 1:
            raise GdxError(self.H,
                           "Could not get symbol info for the universal set")
        self.universal_set = GdxSymbol(name,
                                       data_type,
                                       dims=dims,
                                       file=self,
                                       index=0)
        for i in range(symbol_count):
            index = i + 1
            ret, name, dims, data_type = gdxcc.gdxSymbolInfo(self.H, index)
            if ret != 1:
                raise GdxError(
                    self.H,
                    "Could not get symbol info for symbol {}".format(index))
            self.append(
                GdxSymbol(name, data_type, dims=dims, file=self, index=index))

        # read all symbols if not lazy_load
        if not self.lazy_load:
            for symbol in self:
                symbol.load()
        return
Example #6
0
def dump_GDX_file(H, filename):
    assert gdxcc.gdxOpenRead(H, filename)[0], "Couldn't open %s" % filename

    info = gdxx.file_info(H)
    print "*  File Version   : %s" % info["version"]
    print "*  Producer       : %s" % info["producer"]
    print "*  Symbols        : %d" % info["symbol_count"]
    print "*  Unique Elements: %d" % info["element_count"]

    print "$ontext"
    for i in range(1, info["symbol_count"]+1):
        sinfo = gdxx.symbol_info(H, i)
        print "%-15s %3d %-12s %s" % (sinfo["name"], sinfo["dims"], sinfo["typename"], sinfo["description"])
    print "$offtext\n$onempty onembedded"

    for i in range(1, info["symbol_count"]+1):
        sinfo = gdxx.symbol_info(H, i)
        name = "%s %s" % (sinfo["full_typename"], sinfo["name"])
        dim_string = ""
        if sinfo["dims"] > 0:
            dim_string = "("
            for j in sinfo["domain"]:
                if j["index"] > 0: dim_string += ","
                d = sinfo["domain"][j["index"]]
                dim_string += d["key"]
            dim_string += ")"
        desc = sinfo["description"]
        sm = '"' if "'" in desc else "'"
        print "%s%s %s%s%s /" % (name, dim_string, sm, desc, sm)
        
        ok, records = gdxcc.gdxDataReadStrStart(H, i)
        
        for i in range(records):
            ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
            if not ok: raise GDX_error(H, "Error in gdxDataReadStr")
            if values[gdxcc.GMS_VAL_LEVEL] == 0: continue
            dim_string = ""
            for d in range(sinfo["dims"]):
                if d > 0: dim_string += "."
                dim_string += "'%s'" % elements[d]

            value_string = ""
            if sinfo["type"] == gdxcc.GMS_DT_PAR or sinfo["type"] == gdxcc.GMS_DT_VAR:
                value_string = "%g" % values[gdxcc.GMS_VAL_LEVEL]
            if sinfo["type"] == gdxcc.GMS_DT_SET:
                ret, description, node =  gdxcc.gdxGetElemText(H, int(values[gdxcc.GMS_VAL_LEVEL]))
                if ret != 0:
                    sm = '"' if "'" in description else "'"
                    value_string = "%s%s%s" % (sm, description, sm)
            print "%s %s" % (dim_string, value_string)

        print "/;\n"
Example #7
0
    def __init__(self, filename: str, mode: str = 'r', gams_dir: str = None):
        """Constructor for GdxFile
        
        Args:
            filename: str
            mode: File open mode: 'r' for reading, 'w' for writing, 'w+' for appending (replaces existing symbol)
            gams_dir (optional): Location of GAMS installation directory

        Raises:
            RuntimeError: Unable to load gdx library, invalid mode
            FileNotFoundError: Input file not found
            ValueError: Unsupported mode
            OSError: Unable to read/write file
            Exception: Other errors
        """

        self._h = gdxcc.new_gdxHandle_tp()  # Create a gdx handle
        if gams_dir is None:
            ret, err = gdxcc.gdxCreate(self._h, gdxcc.GMS_SSSIZE)
        else:
            ret, err = gdxcc.gdxCreateD(self._h, gams_dir, gdxcc.GMS_SSSIZE)
        if ret == 0:
            raise RuntimeError(err)

        creator = 'Python {}'.format(sys.version)

        self.filename = os.path.abspath(filename)
        if mode == 'r':
            ret, errno = gdxcc.gdxOpenRead(self._h, self.filename)
        elif mode == 'w':
            ret, errno = gdxcc.gdxOpenWrite(self._h, self.filename, creator)
        elif mode == 'w+' or mode == 'a':
            ret, errno = gdxcc.gdxOpenAppend(self._h, self.filename, creator)
            # Fallback to creating a new file if not found
            if ret == 0 and errno == -100041:
                ret, errno = gdxcc.gdxOpenWrite(self._h, self.filename,
                                                creator)
        else:
            raise ValueError("Unsupported mode '{}'.".format(mode))
        self._mode = mode

        # Error checking
        if ret == 0:
            if errno == 2:
                raise FileNotFoundError(self.filename)
            else:
                raise OSError(gdxcc.gdxErrorStr(self._h, errno)[1])

        # Set up unique element map
        self._UEL_map = {}
Example #8
0
 def __init__(self, filename=None,gamsdir=None):
     global __gdxpy_mode__
     # Check filename
     if filename == None:
        raise Exception('No GDX provided')
     self.internal_filename = filename
     if not os.access(filename, os.R_OK):
         raise Exception('GDX "%s" not found or readable' % filename)
     # Identify access mode (through gdxcc API or shell)
     if __gdxpy_mode__ == GDX_MODE_API:
         try:
             self.gdxHandle = gdxcc.new_gdxHandle_tp()
             rc = gdxcc.gdxCreateD(self.gdxHandle, __gdxpy_gamsdir__, gdxcc.GMS_SSSIZE)
             assert rc[0],rc[1]
             assert gdxcc.gdxOpenRead(self.gdxHandle, self.internal_filename)[0]
         except Exception as e:
             print_traceback(e)
             print("GDX API NOT WORKING: FALLING BACK TO GDX SHELL MODE")
             __gdxpy_mode__ = GDX_MODE_SHELL
     # Access symbols as class members
     #for symb in self.get_symbols_list():
     for symb in self.get_symbols_list():
         setattr(self, symb.name.lower(), symb)
Example #9
0
                continue
                
            logger.debug("Reading {}. ".format(sinfo['name']) + gdxpds.memory_use_str())
            self.__read_one_symbol(H, sinfo, all_keys)
            logger.debug("Read {}. ".format(sinfo['name']) + gdxpds.memory_use_str())

        gdxcc.gdxClose(H)
        gdxcc.gdxFree(H)
        
        logger.debug("Closed the gdx file. " + gdxpds.memory_use_str())

        guess_domains(self, set_map, all_keys)
        guess_ancestor_domains(self)
        
        logger.debug("Finished guessing domains. " + gdxpds.memory_use_str())
        if self.lazy_load:
            self.set_map = set_map
            self.all_keys = all_keys
        
    def read_symbol(self, symbol_name):
        if not (self.lazy_load and self.filename):
            raise RuntimeError("""This feature only works if the gdxdict is initialized in 
                               lazy_load mode, and read has already been called.""")
Example #10
0
def gdx_to_list(gams_dir, filename, varname='all', verbose=False):
    """
    This function loads the gdx with the results of the simulation
    All results are stored in an unordered list

    :param gams_dir:    Gams working directory
    :param filename:    Path to the gdx file to be read
    :param varname:     In case online one variable is needed, specify it name (otherwise specify 'all')
    :returns:        Dictionary with all the collected values (within lists)
    """



    from gdxcc import gdxSymbolInfo, gdxCreateD, gdxOpenRead, GMS_SSSIZE, gdxDataReadDone, new_gdxHandle_tp, \
        gdxDataReadStr, gdxFindSymbol, gdxErrorStr, gdxDataReadStrStart, gdxGetLastError
    out = {}
    tgdx = tm.time()
    gdxHandle = new_gdxHandle_tp()
    gdxCreateD(gdxHandle, gams_dir, GMS_SSSIZE)

    # make sure the file path is properly formatted:
    filename = filename.replace('/', os.path.sep).replace(
        '\\\\', os.path.sep).replace('\\', os.path.sep)
    filename = str(filename)  # removing possible unicode formatting

    if not os.path.isfile(filename):
        logging.critical('Gdx file "' + filename + '" does not exist')
        sys.exit(1)

    gdxOpenRead(gdxHandle, filename)

    if varname == 'all':
        # go through all the symbols one by one and add their data to the dict
        symNr = 0
        SymbolInfo = gdxSymbolInfo(gdxHandle, 0)
        while SymbolInfo[0] > 0:
            ret, nrRecs = gdxDataReadStrStart(gdxHandle, symNr)
            assert ret, "Error in gdx data string" + gdxErrorStr(
                gdxHandle, gdxGetLastError(gdxHandle))[1]

            res = []
            for i in range(nrRecs):
                ret, elements, values, afdim = gdxDataReadStr(gdxHandle)
                res.append(elements + [values[0]])
            out[SymbolInfo[1]] = res
            symNr += 1
            SymbolInfo = gdxSymbolInfo(gdxHandle, symNr)
    else:
        # find the number of the required symbol:
        ret, symNr = gdxFindSymbol(gdxHandle, varname)
        assert ret, "Symbol not found"

        ret, nrRecs = gdxDataReadStrStart(gdxHandle, symNr)
        assert ret, "Error in gdx data string" + gdxErrorStr(
            gdxHandle, gdxGetLastError(gdxHandle))[1]

        res = []
        for i in range(nrRecs):
            ret, elements, values, afdim = gdxDataReadStr(gdxHandle)
            res.append(elements + [values[0]])
        out[varname] = res

    gdxDataReadDone(gdxHandle)
    if verbose:
        logging.info("Loading gdx file " + filename +
                     " took {}s".format(tm.time() - tgdx))
    return out
Example #11
0
    def read(self, filename, gams_dir=None):
        if self.lazy_load:
            self.filename = filename
            self.gams_dir = gams_dir

        H = gdxx.open(gams_dir)
        assert gdxcc.gdxOpenRead(H, filename)[0], "Couldn't open %s" % filename

        logger.debug("Opened the file. " + gdxpds.memory_use_str())

        info = gdxx.file_info(H)
        for k in info:
            if not k in self.file_info:
                self.file_info[k] = info[k]

        logger.debug("Retrieved the file info. " + gdxpds.memory_use_str())

        # read the universal set
        uinfo = gdxx.symbol_info(H, 0)
        for k in uinfo:
            if not k in self.universal_info:
                self.universal_info[k] = uinfo[k]

        logger.debug("Read the universal set. " + gdxpds.memory_use_str())

        ok, records = gdxcc.gdxDataReadStrStart(H, 0)
        for i in range(records):
            ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
            if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
            key = elements[0]
            ret, description, node = gdxcc.gdxGetElemText(
                H, int(values[gdxcc.GMS_VAL_LEVEL]))
            if ret == 0: description = None
            self.add_key(key, description)

        all_keys = {}

        # Read all the 1-D sets
        # Map backwards so we have a map from every set key back to all the sets it's in
        set_map = {}
        for i in range(1, info["symbol_count"] + 1):
            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1:

                self.add_symbol(sinfo)
                symbol_name = sinfo["name"]
                all_keys[symbol_name] = [{}]
                keys = all_keys[symbol_name]
                symbol = self[symbol_name]
                symbol._gdxdim__read_in = True
                ok, records = gdxcc.gdxDataReadStrStart(H, i)
                for i in range(records):
                    ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
                    if not ok:
                        raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
                    e = elements[0]
                    read_symbol(H, symbol, e, sinfo["typename"], values)
                    if not e in set_map: set_map[e] = {}
                    set_map[e][symbol_name] = True
                    keys[0][e] = True

        # Read all the other symbols
        for i in range(1, info["symbol_count"] + 1):
            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1: continue

            self.add_symbol(sinfo)
            if self.lazy_load and sinfo["dims"] > 0:
                continue

            logger.debug("Reading {}. ".format(sinfo['name']) +
                         gdxpds.memory_use_str())
            self.__read_one_symbol(H, sinfo, all_keys)
            logger.debug("Read {}. ".format(sinfo['name']) +
                         gdxpds.memory_use_str())

        gdxcc.gdxClose(H)
        gdxcc.gdxFree(H)

        logger.debug("Closed the gdx file. " + gdxpds.memory_use_str())

        guess_domains(self, set_map, all_keys)
        guess_ancestor_domains(self)

        logger.debug("Finished guessing domains. " + gdxpds.memory_use_str())
        if self.lazy_load:
            self.set_map = set_map
            self.all_keys = all_keys
Example #12
0
            
        info["type"] = typecode
        info["typename"] = typename


# -- Read a gdx file -----------------------------------------------------------

    def read(self, filename, gams_dir=None):
        if self.lazy_load:
            self.filename = filename
            self.gams_dir = gams_dir
    
        H = gdxx.open(gams_dir)
        assert gdxcc.gdxOpenRead(H, filename)[0], "Couldn't open %s" % filename
        
        logger.debug("Opened the file. " + gdxpds.memory_use_str())

        info = gdxx.file_info(H)
        for k in info:
            if not k in self.file_info:
                self.file_info[k] = info[k]
                
        logger.debug("Retrieved the file info. " + gdxpds.memory_use_str())

        # read the universal set
        uinfo = gdxx.symbol_info(H, 0)
        for k in uinfo:
            if not k in self.universal_info: 
                self.universal_info[k] = uinfo[k]

        logger.debug("Read the universal set. " + gdxpds.memory_use_str())
                
        ok, records = gdxcc.gdxDataReadStrStart(H, 0)        
        for i in range(records):
            ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
            if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
            key = elements[0]
            ret, description, node = gdxcc.gdxGetElemText(H, int(values[gdxcc.GMS_VAL_LEVEL]))
            if ret == 0: description = None
            self.add_key(key, description)
        
        all_keys = {}

        # Read all the 1-D sets
        # Map backwards so we have a map from every set key back to all the sets it's in
        set_map = {}
        for i in range(1, info["symbol_count"]+1):
            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1:

                self.add_symbol(sinfo)
                symbol_name = sinfo["name"]
                all_keys[symbol_name] = [{}]
                keys = all_keys[symbol_name]
                symbol = self[symbol_name]
                symbol._gdxdim__read_in = True
                ok, records = gdxcc.gdxDataReadStrStart(H, i)
                for i in range(records):
                    ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
                    if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
                    e = elements[0]
                    read_symbol(H, symbol, e, sinfo["typename"], values)
                    if not e in set_map: set_map[e] = {}
                    set_map[e][symbol_name] = True
                    keys[0][e] = True
        
        # Read all the other symbols
        for i in range(1, info["symbol_count"]+1):
            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1: continue

            self.add_symbol(sinfo)
Example #13
0
    def read(self, filename, gams_dir=None):
        H = gdxx.open(gams_dir)
        assert gdxcc.gdxOpenRead(H, filename)[0], "Couldn't open %s" % filename

        info = gdxx.file_info(H)
        for k in info:
            if not k in self.file_info:
                self.file_info[k] = info[k]

        # read the universal set
        uinfo = gdxx.symbol_info(H, 0)
        for k in uinfo:
            if not k in self.universal_info: 
                self.universal_info[k] = uinfo[k]

        ok, records = gdxcc.gdxDataReadStrStart(H, 0)        
        for i in range(records):
            ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
            if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
            key = elements[0]
            ret, description, node = gdxcc.gdxGetElemText(H, int(values[gdxcc.GMS_VAL_LEVEL]))
            if ret == 0: description = None
            self.add_key(key, description)

        all_keys = {}

        # Read all the 1-D sets
        # Map backwards so we have a map from every set key back to all the sets it's in
        set_map = {}
        for i in range(1, info["symbol_count"]+1):
            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1:

                self.add_symbol(sinfo)
                symbol_name = sinfo["name"]
                all_keys[symbol_name] = [{}]
                keys = all_keys[symbol_name]
                symbol = self[symbol_name]
                ok, records = gdxcc.gdxDataReadStrStart(H, i)
                for i in range(records):
                    ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
                    if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
                    e = elements[0]
                    read_symbol(H, symbol, e, sinfo["typename"], values)
                    if not e in set_map: set_map[e] = {}
                    set_map[e][symbol_name] = True
                    keys[0][e] = True

        # Read all the other symbols
        for i in range(1, info["symbol_count"]+1):

            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1: continue

            self.add_symbol(sinfo)
            symbol_name = sinfo["name"]
            all_keys[symbol_name] = []
            keys = all_keys[symbol_name]
            for d in range(sinfo["dims"]): keys.append({})

            ok, records = gdxcc.gdxDataReadStrStart(H, i)
        
            for i in range(records):
                ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
                if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
                if sinfo["dims"] == 0:
                    read_symbol(H, self, symbol_name, sinfo["typename"], values)
                else:
                    symbol = self[sinfo["name"]]
                    current = symbol
                    for d in range(sinfo["dims"]-1):
                        key = elements[d]
                        keys[d][key] = True
                        if not key in current:
                            current[key] = gdxdim(self)
                        current = current[key]
                    d = sinfo["dims"]-1
                    key = elements[d]
                    keys[d][key] = True
                    read_symbol(H, current, key, sinfo["typename"], values)

        gdxcc.gdxClose(H)
        gdxcc.gdxFree(H)

        guess_domains(self, set_map, all_keys)
        guess_ancestor_domains(self)
Example #14
0
    def read(self, filename, gams_dir=None):
        H = gdxx.open(gams_dir)
        assert gdxcc.gdxOpenRead(H, filename)[0], "Couldn't open %s" % filename

        info = gdxx.file_info(H)
        for k in info:
            if not k in self.file_info:
                self.file_info[k] = info[k]

        # read the universal set
        uinfo = gdxx.symbol_info(H, 0)
        for k in uinfo:
            if not k in self.universal_info:
                self.universal_info[k] = uinfo[k]

        ok, records = gdxcc.gdxDataReadStrStart(H, 0)
        for i in range(records):
            ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
            if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
            key = elements[0]
            ret, description, node = gdxcc.gdxGetElemText(
                H, int(values[gdxcc.GMS_VAL_LEVEL]))
            if ret == 0: description = None
            self.add_key(key, description)

        all_keys = {}

        # Read all the 1-D sets
        # Map backwards so we have a map from every set key back to all the sets it's in
        set_map = {}
        for i in range(1, info["symbol_count"] + 1):
            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1:

                self.add_symbol(sinfo)
                symbol_name = sinfo["name"]
                all_keys[symbol_name] = [{}]
                keys = all_keys[symbol_name]
                symbol = self[symbol_name]
                ok, records = gdxcc.gdxDataReadStrStart(H, i)
                for i in range(records):
                    ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
                    if not ok:
                        raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
                    e = elements[0]
                    read_symbol(H, symbol, e, sinfo["typename"], values)
                    if not e in set_map: set_map[e] = {}
                    set_map[e][symbol_name] = True
                    keys[0][e] = True

        # Read all the other symbols
        for i in range(1, info["symbol_count"] + 1):

            sinfo = gdxx.symbol_info(H, i)
            if sinfo["typename"] == "Set" and sinfo["dims"] == 1: continue

            self.add_symbol(sinfo)
            symbol_name = sinfo["name"]
            all_keys[symbol_name] = []
            keys = all_keys[symbol_name]
            for d in range(sinfo["dims"]):
                keys.append({})

            ok, records = gdxcc.gdxDataReadStrStart(H, i)

            for i in range(records):
                ok, elements, values, afdim = gdxcc.gdxDataReadStr(H)
                if not ok: raise gdxx.GDX_error(H, "Error in gdxDataReadStr")
                if sinfo["dims"] == 0:
                    read_symbol(H, self, symbol_name, sinfo["typename"],
                                values)
                else:
                    symbol = self[sinfo["name"]]
                    current = symbol
                    for d in range(sinfo["dims"] - 1):
                        key = elements[d]
                        keys[d][key] = True
                        if not key in current:
                            current[key] = gdxdim(self)
                        current = current[key]
                    d = sinfo["dims"] - 1
                    key = elements[d]
                    keys[d][key] = True
                    read_symbol(H, current, key, sinfo["typename"], values)

        gdxcc.gdxClose(H)
        gdxcc.gdxFree(H)

        guess_domains(self, set_map, all_keys)
        guess_ancestor_domains(self)