Skip to main content

Index names of decision variables implicitly changes when added via gurobi pandas method

Answered

Comments

6 comments

  • Riley Clement
    Gurobi Staff Gurobi Staff

    Hi Madhushini,

    Can you share how you are creating variables?  This may influence what can be done.

    For example in the following snippet:

    import gurobipy as gp
    import gurobipy_pandas as gppd
    import pandas as pd

    m = gp.Model()
    vars = gppd.add_vars(
        model=m, 
        pandas_obj=pd.Series(range(10)),
        name=pd.Series([f"AB-{100+i}" for i in range(10)]),
    )

    the variable names are AB-100, AB-101, ... , AB-109 and there is no conversion to underscores (at least not with pandas 2).

    - Riley

    0
  • Madhushini Narayana Prasad
    Gurobi-versary
    Conversationalist
    First Question

    Hi Riley,

    I am reading these values from an excel sheet. Please see the code snippet below:

    lstNames = ['AB-101','AC-102','BG-203']
    weekLst = list(range(0, 21))
    tmp_data = pandas.DataFrame(list(product(lstNames, weekLst)), columns=['Name', 'Age'])
    opt_data=tmp_data.set_index(["Name","Age"])
     
    m = gp.Model()
    CV_StartVars = gppd.add_vars(m, opt_data, name="dens", lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS)
    CV_EndVars = m.addVars(lstNames, lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="Yale" )
     
    m.optimize()
    var_vals = m.getVars()
    print(var_vals)
     
     
    0
  • Riley Clement
    Gurobi Staff Gurobi Staff

    Hi Madhushini,

    I can confirm that gurobipy-pandas is deliberately replacing "-" with "_" in the names.  As an aside, it is also replacing "+", "-", "*", "^" with "_". 

    If you wish to avoid this default behavior you can add the index_formatter argument to add_vars:

    CV_StartVars = gppd.add_vars(
    m,
    opt_data,
    name="dens",
    lb=0,
    ub=GRB.INFINITY,
    vtype=GRB.CONTINUOUS,
    index_formatter="disable",
    )

    - Riley

    0
  • Madhushini Narayana Prasad
    Gurobi-versary
    Conversationalist
    First Question

    Thanks Riley. Unfortunately it gives me the following error when I try adding the index_formatter to add_vars:

    File "/opt/anaconda3/envs/shrimpfeed/lib/python3.9/site-packages/gurobipy_pandas/api.py", line 158, in add_vars
        return add_vars_from_dataframe(
      File "/opt/anaconda3/envs/shrimpfeed/lib/python3.9/site-packages/gurobipy_pandas/variables.py", line 170, in add_vars_from_dataframe
        namearg = create_names(name, data.index, index_formatter)
      File "/opt/anaconda3/envs/shrimpfeed/lib/python3.9/site-packages/gurobipy_pandas/util.py", line 39, in create_names
        mapper = create_mapper(index_formatter)
      File "/opt/anaconda3/envs/shrimpfeed/lib/python3.9/site-packages/gurobipy_pandas/index_mappers.py", line 21, in create_mapper
        if arg == "disable":
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    Warning: environment still referenced so free is deferred
    Warning: remote job 1655ab5b-ea63-42b3-8f35-2441dae9dcfe on server http://gurobi-dev.cargill.com:7183 killed because environment was freed

    0
  • Riley Clement
    Gurobi Staff Gurobi Staff

    Hi Madhushini,

    Apologies, I did not pick up this error.  I've since realized the simplest solution is to use

    index_formatter="disable"

    I have updated my answer above to reflect this.

    - Riley

    0
  • Madhushini Narayana Prasad
    Gurobi-versary
    Conversationalist
    First Question

    It works now, thanks a lot for your help and support Riley.

    0

Please sign in to leave a comment.