コード例 #1
0
ファイル: gdxdict.py プロジェクト: rubythonode/gdx-pandas
    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
コード例 #2
0
ファイル: gdxdict.py プロジェクト: NREL/gdx-pandas
        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():
コード例 #3
0
ファイル: special.py プロジェクト: cdgaete/gdx-pandas
def load_specials(gams_dir_finder):
    """
    Load special values

    Needs to be called after gdxcc is loaded. Populates the module attributes
    SPECIAL_VALUES, GDX_TO_NP_SVS, and NP_TO_GDX_SVS.

    Parameters
    ----------
    gams_dir_finder : :class:`gdxpds.tools.GamsDirFinder`
    """
    global SPECIAL_VALUES
    global GDX_TO_NP_SVS
    global NP_TO_GDX_SVS

    H = gdxcc.new_gdxHandle_tp()
    rc = gdxcc.gdxCreateD(H, gams_dir_finder.gams_dir, gdxcc.GMS_SSSIZE)
    if not rc:
        raise Exception(rc[1])
    # get special values
    special_values = gdxcc.doubleArray(gdxcc.GMS_SVIDX_MAX)
    gdxcc.gdxGetSpecialValues(H, special_values)

    SPECIAL_VALUES = []
    GDX_TO_NP_SVS = {}
    NP_TO_GDX_SVS = {}
    for i in range(gdxcc.GMS_SVIDX_MAX):
        if i >= len(NUMPY_SPECIAL_VALUES):
            break
        SPECIAL_VALUES.append(special_values[i])
        gdx_val = special_values[i]
        GDX_TO_NP_SVS[gdx_val] = NUMPY_SPECIAL_VALUES[i]
        NP_TO_GDX_SVS[NUMPY_SPECIAL_VALUES[i]] = gdx_val

    gdxcc.gdxFree(H)
コード例 #4
0
ファイル: __init__.py プロジェクト: shaohuizhang/gdx-pandas
def load_gdxcc(gams_dir=None):
    if 'pandas' in sys.modules:
        logger.warn("Especially on Linux, gdxpds should be imported before " + \
                    "pandas to avoid a library conflict. Also make sure your " + \
                    "GAMS directory is listed in LD_LIBRARY_PATH.")
    import gdxcc
    from gdxpds.tools import GamsDirFinder
    finder = GamsDirFinder(gams_dir=gams_dir)
    H = gdxcc.new_gdxHandle_tp()
    rc = gdxcc.gdxCreateD(H, finder.gams_dir, gdxcc.GMS_SSSIZE)
    gdxcc.gdxFree(H)
    return
コード例 #5
0
ファイル: __init__.py プロジェクト: mmowers/reeds-pivot
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
コード例 #6
0
ファイル: __init__.py プロジェクト: serdar-/gdx-pandas
def load_gdxcc(gams_dir=None):
    """
    Method to initialize GAMS, especially to load required libraries that can 
    sometimes conflict with other packages.

    Parameters
    ----------
    gams_dir : None or str
        if not None, directory containing the GAMS executable
    """
    if 'pandas' in sys.modules:
        logger.warn("Especially on Linux, gdxpds should be imported before " + \
                    "pandas to avoid a library conflict. Also make sure your " + \
                    "GAMS directory is listed in LD_LIBRARY_PATH.")
    import gdxcc
    from gdxpds.tools import GamsDirFinder
    finder = GamsDirFinder(gams_dir=gams_dir)
    H = gdxcc.new_gdxHandle_tp()
    rc = gdxcc.gdxCreateD(H, finder.gams_dir, gdxcc.GMS_SSSIZE)
    gdxcc.gdxFree(H)
    return
コード例 #7
0
ファイル: gdxdict.py プロジェクト: rubythonode/gdx-pandas
    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)
コード例 #8
0
ファイル: gdxdict.py プロジェクト: NREL/gdx-pandas
                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.""")
コード例 #9
0
 def cleanup(self):
     gdxcc.gdxFree(self.H)
コード例 #10
0
ファイル: gdxdict.py プロジェクト: rubythonode/gdx-pandas
    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
コード例 #11
0
 def close(self):
     h = self.gdxHandle
     gdxcc.gdxClose(h)
     gdxcc.gdxFree(h)
コード例 #12
0
ファイル: gdxpy.py プロジェクト: jackjackk/gdxpy
 def close(self):
     '''Close Gdx file and free up resources.'''
     h = self.gdx_handle
     gdxcc.gdxClose(h)
     gdxcc.gdxFree(h)
コード例 #13
0
ファイル: gdxdict.py プロジェクト: NREL/gdx-pandas
            
        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)
コード例 #14
0
ファイル: gdxdict.py プロジェクト: djhume/py-gdx
    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)
コード例 #15
0
ファイル: gdxfile.py プロジェクト: rusty-s/GDX2py
 def __del__(self):
     gdxcc.gdxFree(self._h)
コード例 #16
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)