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: for d in range(sinfo["dims"]-1): key = elements[d] keys[d][key] = True if (len(current_list) < d+2) or (current_list[d+1][0] != key): current_list = current_list[0:d+1] if not key in current_list[d][1]: num_dims_created += 1 current_list[d][1][key] = gdxdim(self) current_list = current_list + [(key, current_list[d][1][key])] d = sinfo["dims"]-1 key = elements[d] keys[d][key] = True read_symbol(H, current_list[d][1], key, sinfo["typename"], values) logger.debug("Created {} gdxdims for {} records (ratio = {}). len(current_list) = {}".format( num_dims_created, records, float(num_dims_created)/float(records), len(current_list))) #- Write a GDX file ------------------------------------------------------------ def write(self, filename, gams_dir=None): H = gdxx.open(gams_dir) assert gdxcc.gdxOpenWrite(H, filename, "gdxdict.py")[0], "Couldn't open %s" % filename # write the universal set gdxcc.gdxUELRegisterRawStart(H) for key, key_data in self.universal_items():
def write(self,index=None): if not self.loaded: raise Error("Cannot write unloaded symbol {}.".format(repr(self.name))) if self.data_type == GamsDataType.Set: self._fixup_set_value() if index is not None: self._index = index if self.index == 0: # universal set gdxcc.gdxUELRegisterRawStart(self.file.H) gdxcc.gdxUELRegisterRaw(self.file.H,self.name) gdxcc.gdxUELRegisterDone(self.file.H) return # write the data userinfo = 0 if self.variable_type is not None: userinfo = self.variable_type.value elif self.equation_type is not None: userinfo = self.equation_type.value if not gdxcc.gdxDataWriteStrStart(self.file.H, self.name, self.description, self.num_dims, self.data_type.value, userinfo): raise GdxError(self.file.H,"Could not start writing data for symbol {}".format(repr(self.name))) # set domain information if self.num_dims > 0: if self.index: if not gdxcc.gdxSymbolSetDomainX(self.file.H,self.index,self.dims): raise GdxError(self.file.H,"Could not set domain information for {}. Domains are {}".format(repr(self.name),repr(self.dims))) else: logger.info("Not writing domain information because symbol index is unknown.") values = gdxcc.doubleArray(gdxcc.GMS_VAL_MAX) # make sure index is clean -- needed for merging in convert_np_to_gdx_svs self.dataframe = self.dataframe.reset_index(drop=True) for row in convert_np_to_gdx_svs(self.dataframe,self.num_dims,self.file).itertuples(index=False,name=None): dims = [str(x) for x in row[:self.num_dims]] vals = row[self.num_dims:] for col_name, col_ind in self.value_cols: values[col_ind] = float(0.0) try: if isinstance(vals[col_ind],Number): values[col_ind] = float(vals[col_ind]) except: raise Error("Unable to set element {} from {}.".format(col_ind,vals)) gdxcc.gdxDataWriteStr(self.file.H,dims,values) gdxcc.gdxDataWriteDone(self.file.H) return
def write(self, filename, gams_dir=None): H = gdxx.open(gams_dir) assert gdxcc.gdxOpenWrite( H, filename, "gdxdict.py")[0], "Couldn't open %s" % filename # write the universal set gdxcc.gdxUELRegisterRawStart(H) for key, key_data in self.universal_items(): gdxcc.gdxUELRegisterRaw(H, key_data['name']) gdxcc.gdxUELRegisterDone(H) for k in self: symbol = self[k] info = self.getinfo(k) if info["dims"] == 0: if not gdxcc.gdxDataWriteStrStart( H, k, info["description"], 0, get_type_code(info["typename"]), info["userinfo"]): raise gdxx.GDX_error(H, "couldn't start writing data") set_symbol(H, self, k, info["typename"], info["userinfo"], values, []) gdxcc.gdxDataWriteDone(H) else: if not gdxcc.gdxDataWriteStrStart( H, k, info["description"], info["dims"], get_type_code(info["typename"]), info["userinfo"]): raise gdxx.GDX_error(H, "couldn't start writing data") domain = [] for d in info["domain"]: domain.append(d["key"]) if gdxcc.gdxSymbolSetDomain(H, domain) != 1: raise gdxx.GDX_error( H, "couldn't set domain for symbol %s to %s" % (k, domain)) write_symbol(H, info["typename"], info["userinfo"], symbol, []) gdxcc.gdxDataWriteDone(H) gdxcc.gdxClose(H) gdxcc.gdxFree(H)