Skip to main content

Input type to tupledict.sum() in gurobipy

Answered

Comments

6 comments

  • Official comment
    Simranjit Kaur
    • Gurobi Staff
    This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum, or try Gurobot, our chatbot interface offering instant, expert-level support.
  • Jonasz Staszek
    • Community Moderator
    • Gurobi-versary
    • Thought Leader
    • First Question

    I would not expect RegEx patterns to be the required input here, but rather the patterns of the type that you were typing in. Perhaps someone from Gurobi support team can confirm this?

    Additionally, if the keys in your x dictionary are tuples, you could try the following:

    gp.quicksum(x[i] for i in x.keys() if y in i)

    It should do the same work in a much faster (and less complicated) way.

    Best regards,
    Jonasz

    0
  • Jaromił Najman
    • Gurobi Staff

    No, the pattern does not mean a RegEx pattern module. It refers to a value in a field. As an example

    import gurobipy as gp

    m = gp.Model()
    indices = ['x', 'y', 'z']
    x = m.addVars(indices, indices)
    m.addConstr(x.sum('y','*') == 0)

    generates constraint

    var[y,x] + var[y,y] + var[y,z] = 0

    It looks like your \(\texttt{y}\) index is an object and not a string. Is this correct? Depending on the object's properties, it might not be usable as input for the \(\texttt{sum}\) method. In the case that the above does not answer your question, could you please provide a minimal working example showing what you are trying to achieve?

    As a side note, I agree with Jonasz and recommend using quicksum.

    Best regards, 
    Jaromił

    0
  • GurobiUser
    • Gurobi-versary
    • First Comment
    • First Question

    Hi Jonasz and Jaromil,

    Thank you both for your input. Jonasz suggestion of using quicksum in this fashion worked and solved my immediate problem. However, I still want to gain a deeper understanding of tupledict.select() (or alternatively tupledict.sum(), the issue is the same issue). I find the choice to have tupledict.select() behave differently when the input is packed as a tuple a bit strange, because it seems to exclude the use of this function when one must generate the input separately. Let me be concrete. Consider the following code:

    d = gp.tupledict([((1,2), 'onetwo'), ((1,3), 'onethree'), ((2,3), 'twothree')])
    x = SOMEEXPRESSION
    d.select(x)

    Using (1,'*') for SOMEEXPRESSION will not give the same result as d.select(1,'*'). Is there a value of SOMEEXPRESSION which would make the above code yield the same result as d.select(1,'*')? The answer should work for any tupledict d, not just the one in the example. Thank you!

    0
  • Jaromił Najman
    • Gurobi Staff

    When you set

    x = (1,'*')

    you provide a tuple to the \(\texttt{select}\) method instead of 2 input arguments. So what you actually call is

    d.select((1,'*'))

    instead of

    d.select(1,'*')

    One way to avoid this, is to unpack the tuple

    x = (1,'*')
    d.select(*x)

    Best regards, 
    Jaromił

    0
  • GurobiUser
    • Gurobi-versary
    • First Comment
    • First Question

    Thank you Jaromil, this resolves my issue.

    0

Post is closed for comments.