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
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
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)
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"
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
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"
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 = {}
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)
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.""")
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
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
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)
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)
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)