Skip to content

Commit

Permalink
Investigating why second name in distillation.py is incorrect when se…
Browse files Browse the repository at this point in the history
…lf.update() is called in addVariable
  • Loading branch information
jajhall committed May 7, 2024
1 parent 2191d0e commit d0d8031
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 12 deletions.
4 changes: 2 additions & 2 deletions examples/chip.py
Expand Up @@ -13,8 +13,8 @@
varNames.append('Tables')
varNames.append('Sets of chairs')

x1 = h.addVar(obj = 10, name = varNames[0])
x2 = h.addVar(obj = 25, name = varNames[1])
x1 = h.addVariable(obj = 10, name = varNames[0])
x2 = h.addVariable(obj = 25, name = varNames[1])

vars = list()
vars.append(x1)
Expand Down
33 changes: 28 additions & 5 deletions examples/distillation.py
Expand Up @@ -15,13 +15,36 @@
varNames.append('TypeA')
varNames.append('TypeB')

useTypeA = h.addVar(obj = 8, name = varNames[0])
useTypeB = h.addVar(obj = 10, name = varNames[1])
print("DEBUG ", varNames)

update_in_addVariable = True
if update_in_addVariable:
print("DEBUG update_in_addVariable is True")
else:
print("DEBUG update_in_addVariable is False")

useTypeA = h.addVariable(obj = 8, name = varNames[0], update = update_in_addVariable)
useTypeB = h.addVariable(obj = 10, name = varNames[1], update = update_in_addVariable)

# With update_in_addVariable = False (so runs as originally written,
# with self.update() being called only in addConstr) useTypeB.name is
# "TypeB"
#
# With update_in_addVariable = True (so self.update() is called in addVariable) useTypeB.name is
# "TypeA"
#
# Looks as if the internal stack of names isn't being cleared, so
# TypeA is still on top when useTypeB is being defined

print('\nDEBUG Names: useTypeA', useTypeA.name, "; varNames[0]", varNames[0])
print('DEBUG Names: useTypeB', useTypeB.name, "; varNames[0]", varNames[1])

vars = list()
vars.append(useTypeA)
vars.append(useTypeB)

print("\nDEBUG vars: ", vars)

constrNames = list()
constrNames.append('Product1')
constrNames.append('Product2')
Expand All @@ -44,12 +67,12 @@
print('Solved as LP')

for var in vars:
print('Use', h.varValue(var), h.varName(var), ': Reduced cost', h.varDual(var))
print('Use {0:6f} of {1:6s}: reduced cost {2:6f}'.format(h.varValue(var), h.varName(var), h.varDual(var)))
print('Use', h.varValues(vars), 'of', h.varNames(vars))
print('Use', h.allVarValues(), 'of', h.allVarNames())

for name in constrNames:
print('Constraint', name, 'has value', h.constrValue(name), 'and dual', h.constrDual(name))
print('Constraint {0:6s} has value {1:6f} and dual {2:6f}'.format(name, h.constrValue(name), h.constrDual(name)))

print('Constraints have values', h.constrValues(constrNames), 'and duals', h.constrDuals(constrNames))

Expand All @@ -66,6 +89,6 @@
print('Solved as MIP')

for var in vars:
print('Use', h.varValue(var), h.varName(var))
print('Use {0:6f} of {1:6s}'.format(h.varValue(var), h.varName(var)))

print('Optimal objective value is', h.getObjectiveValue())
4 changes: 2 additions & 2 deletions examples/minimal.py
Expand Up @@ -2,8 +2,8 @@

h = highspy.Highs()

x1 = h.addVar(lb=-h.inf)
x2 = h.addVar(lb=-h.inf)
x1 = h.addVariable(lb = -h.inf)
x2 = h.addVariable(lb = -h.inf)

h.addConstr(x2 - x1 >= 2)
h.addConstr(x1 + x2 >= 0)
Expand Down
13 changes: 10 additions & 3 deletions src/highspy/highs.py
Expand Up @@ -104,9 +104,10 @@ def maximize(self, obj=None):
# update variables
def update(self):
current_batch_size = len(self._batch.obj)

print("\nDEBUG update(self): On entry - current_batch_size = ", current_batch_size)
if current_batch_size > 0:
names = [self._vars[i].name for i in range(current_batch_size)]
print("DEBUG update(self): names = [", names, "] costs = ", self._batch.obj)

super().addVars(int(current_batch_size), self._batch.lb, self._batch.ub)
super().changeColsCost(current_batch_size, self._batch.idx, self._batch.obj)
Expand All @@ -119,6 +120,7 @@ def update(self):
super().passColName(int(self._batch.idx[i]), str(names[i]))

self._batch = highs_batch(self)
print("DEBUG update(self): On exit - current_batch_size = ", len(self._batch.obj))

def val(self, var):
return super().getSolution().col_value[var.index]
Expand Down Expand Up @@ -214,13 +216,17 @@ def allConstrDuals(self):
#
# Change the name of addVar to addVariable to prevent shadowing of
# highspy binding to Highs::addVar
def addVariable(self, lb = 0, ub = kHighsInf, obj = 0, type=HighsVarType.kContinuous, name = None):
def addVariable(self, lb = 0, ub = kHighsInf, obj = 0, type=HighsVarType.kContinuous, name = None, update = False):
print("\nDEBUG addVariable: name = ", name, "; obj = ", obj, "; lb = ", lb, "; ub = ", ub, " with update = ", update)
var = self._batch.add(obj, lb, ub, type, name, self)
self._vars.append(var)
# No longer acumulate a batch of variables so that addVariable
# behaves like Highs::addVar and highspy bindings modifying
# column data and adding rows can be used
self.update()
if update:
self.update()
print("\nDEBUG ")
print("DEBUG addVariable: On exit - current_batch_size = ", len(self._batch.obj))
return var

def addIntegral(self, lb = 0, ub = kHighsInf, obj = 0, name = None):
Expand Down Expand Up @@ -554,5 +560,6 @@ def add(self, obj, lb, ub, type,name,solver):
self.type.append(type)

newIndex = self.highs.numVars + len(self.obj)-1
print("\nDEBUG add: newIndex = ", newIndex)
self.idx.append(newIndex)
return highs_var(newIndex, solver, name)

0 comments on commit d0d8031

Please sign in to comment.