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, H, msg): """ Pulls information from gdxcc about the last encountered error and appends it to msg. Positional Arguments: - H (pointer or None) - SWIG binding pointer to a GDX object - msg (str) - gdxpds error message """ self.msg = msg + "." if H: self.msg += " " + gdxcc.gdxErrorStr(H, gdxcc.gdxGetLastError(H))[1] + "." super().__init__(self.msg)
def __init__(self, H, msg): """ Pulls information from gdxcc about the last encountered error and appends it to msg. Parameters ---------- H : pointer or None SWIG binding pointer to a GDX object msg : str gdxpds error message Attributes ---------- msg : str msg that is passed in with a gdxErrorStr appended """ if H: msg += ". " + gdxcc.gdxErrorStr(H, gdxcc.gdxGetLastError(H))[1] + "." super().__init__(msg)
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 __init__(self, H, msg): self.msg = msg if H: self.msg += ": " + gdxcc.gdxErrorStr(H, gdxcc.gdxGetLastError(H))[1]
def _write_symbol(self, symname: str, symbol: _GAMSSymbol): """Write a Pandas series to a GAMS Set symbol Args: symbol: GAMS symbol object Raises: RuntimeError """ # Get number of dimensions dim = symbol.dimension try: recs = len(symbol) except TypeError: recs = 1 set_has_text = False # TODO # Begin writing to a symbol ret = gdxcc.gdxDataWriteStrStart( self._h, symname, symbol.expl_text, dim, GMS_DTYPES[symbol._type], GMS_USERINFO_SET_PARAMETER, ) if not ret: raise RuntimeError( gdxcc.gdxErrorStr(self._h, gdxcc.gdxGetLastError(self._h))[1]) # Define domain if symbol.domain is not None: domain = [(d if d is not None else '*') for d in symbol.domain] else: domain = dim * ['*'] ret = gdxcc.gdxSymbolSetDomainX(self._h, self._find_symbol(symname), domain) if not ret: raise RuntimeError( "Unable to set domain for symbol '{}'".format(symname)) # Init value array value_arr = gdxcc.doubleArray(gdxcc.GMS_VAL_MAX) if dim == 0: # It’s a scalar value_arr[GMS_VAL_LEVEL] = float(symbol) gdxcc.gdxDataWriteStr(self._h, list(), value_arr) elif isinstance(symbol, GAMSSet): for key in symbol: # For sets, register the associated text in the string table and # store index number as the value if set_has_text: pass # TODO # assoc_text = copy(values[i]) # ret, value_arr[GMS_VAL_LEVEL] = gdxAddSetText(self._h, # str(assoc_text)) # if not ret: # warn("Unable to register string '{}' " # "to string table".format(assoc_text)) else: value_arr[GMS_VAL_LEVEL] = 0 gdxcc.gdxDataWriteStr(self._h, list(key), value_arr) elif isinstance(symbol, GAMSParameter): for key, value in symbol: value_arr[GMS_VAL_LEVEL] = value gdxcc.gdxDataWriteStr(self._h, list(key), value_arr) gdxcc.gdxDataWriteDone(self._h)
def _read_symbol(self, symno: int): """Read a GAMS symbol as a Pandas Series object Args: symno: Symbol number Raises: RuntimeError """ # Get symbol info ret, _sym, dim, symtype = gdxcc.gdxSymbolInfo(self._h, symno) if not ret: warn("Symbol not found!") return None # Get domain of symbol domain = [(d if d != '*' else None) for d in self._get_domain(symno)] if not any(domain): domain = None # Get explanatory text expl_text = self._get_expl_text(symno) # Get length of longest label _label_maxlen = gdxcc.gdxSymbIndxMaxLength(self._h, symno)[0] # Start reading symbol ret, recs = gdxcc.gdxDataReadStrStart(self._h, symno) if not ret: raise Exception( gdxcc.gdxErrorStr(self._h, gdxcc.gdxGetLastError(self._h))[1]) # Initialize keys and values arrays keys = recs * [tuple()] values = recs * [float()] if gdxcc.gdxSetHasText(self._h, symno): assoc_texts = recs * [str()] else: assoc_texts = None # Read GDX data # Code inside the loop is as small as possible for performance, # so the if statements are outside. if symtype == GMS_DT_SET and assoc_texts: for i in range(recs): _ret, key_arr, value_arr, _afdim = gdxcc.gdxDataReadStr( self._h) keys[i] = (key_arr[0] if dim == 1 else tuple(key_arr) ) # Squeze out dimension of 1-dim keys assoc_texts[i] = self._get_set_assoc_text( value_arr[GMS_VAL_LEVEL]) elif symtype == GMS_DT_SET and not assoc_texts: for i in range(recs): _ret, key_arr, _value_arr, _afdim = gdxcc.gdxDataReadStr( self._h) keys[i] = (key_arr[0] if dim == 1 else tuple(key_arr) ) # Squeze out dimension of 1-dim keys elif symtype == GMS_DT_PAR: for i in range(recs): _ret, key_arr, value_arr, _afdim = gdxcc.gdxDataReadStr( self._h) keys[i] = (key_arr[0] if dim == 1 else tuple(key_arr) ) # Squeze out dimension of 1-dim keys val = value_arr[GMS_VAL_LEVEL] values[i] = SPECIAL_VALUES.get(val, val) # Done reading gdxcc.gdxDataReadDone(self._h) # Construct GAMS symbols and return if symtype == GMS_DT_SET: return GAMSSet(keys, domain, expl_text=expl_text, assoc_texts=assoc_texts) elif symtype == GMS_DT_PAR: if dim == 0: return GAMSScalar(values[0], expl_text=expl_text) else: return GAMSParameter(dict(zip(keys, values)), domain=domain, expl_text=expl_text)
def __init__(self, H, msg): self.msg = msg if H: self.msg += ": " + gdxcc.gdxErrorStr(H, gdxcc.gdxGetLastError(H))[1]