Skip to content

Commit

Permalink
Resolving weakrefs in properties for both disjuncts and transformed d…
Browse files Browse the repository at this point in the history
…isjuncts
  • Loading branch information
emma58 committed Nov 1, 2022
1 parent 516cd01 commit 4bcf833
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 76 deletions.
3 changes: 2 additions & 1 deletion pyomo/gdp/disjunct.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,8 @@ class _DisjunctData(_BlockData):

@property
def transformation_block(self):
return self._transformation_block
return None if self._transformation_block is None else \
self._transformation_block()

def __init__(self, component):
_BlockData.__init__(self, component)
Expand Down
4 changes: 2 additions & 2 deletions pyomo/gdp/plugins/bigm.py
Original file line number Diff line number Diff line change
Expand Up @@ -878,9 +878,9 @@ def get_all_M_values_by_constraint(self, model):
Disjunct,
active=None,
descend_into=(Block, Disjunct)):
transBlock = disj.transformation_block
# First check if it was transformed at all.
if disj.transformation_block is not None:
transBlock = disj.transformation_block()
if transBlock is not None:
# If it was transformed with BigM, we get the M values.
if hasattr(transBlock, 'bigm_src'):
for cons in transBlock.bigm_src:
Expand Down
4 changes: 2 additions & 2 deletions pyomo/gdp/plugins/cuttingplane.py
Original file line number Diff line number Diff line change
Expand Up @@ -820,8 +820,8 @@ def _get_disaggregated_vars(self, hull):
descend_into=(Disjunct,
Block)):
for disjunct in disjunction.disjuncts:
if disjunct.transformation_block is not None:
transBlock = disjunct.transformation_block()
transBlock = disjunct.transformation_block
if transBlock is not None:
for v in transBlock.disaggregatedVars.\
component_data_objects(Var):
disaggregatedVars.add(v)
Expand Down
50 changes: 25 additions & 25 deletions pyomo/gdp/tests/common_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def checkb0TargetsTransformed(self, m, transformation):
(1,1),
]
for i, j in pairs:
self.assertIs(m.b[0].disjunct[i].transformation_block(),
self.assertIs(m.b[0].disjunct[i].transformation_block,
disjBlock[j])
self.assertIs(trans.get_src_disjunct(disjBlock[j]),
m.b[0].disjunct[i])
Expand All @@ -133,7 +133,7 @@ def check_user_deactivated_disjuncts(self, transformation,
rBlock = m.component("_pyomo_gdp_%s_reformulation" % transformation)
disjBlock = rBlock.relaxedDisjuncts
self.assertEqual(len(disjBlock), 1)
self.assertIs(disjBlock[0], m.d[1].transformation_block())
self.assertIs(disjBlock[0], m.d[1].transformation_block)
self.assertIs(transform.get_src_disjunct(disjBlock[0]), m.d[1])

def check_improperly_deactivated_disjuncts(self, transformation, **kwargs):
Expand Down Expand Up @@ -537,7 +537,7 @@ def check_only_targets_get_transformed(self, transformation):
(1, 1)
]
for i, j in pairs:
self.assertIs(disjBlock[i], m.disjunct1[j].transformation_block())
self.assertIs(disjBlock[i], m.disjunct1[j].transformation_block)
self.assertIs(trans.get_src_disjunct(disjBlock[i]), m.disjunct1[j])

self.assertIsNone(m.disjunct2[0].transformation_block)
Expand Down Expand Up @@ -604,16 +604,16 @@ def check_indexedDisj_only_targets_transformed(self, transformation):
relaxedDisjuncts
self.assertEqual(len(disjBlock), 4)
self.assertIsInstance(
m.disjunct1[1,0].transformation_block().component("disjunct1[1,0].c"),
m.disjunct1[1,0].transformation_block.component("disjunct1[1,0].c"),
Constraint)
self.assertIsInstance(
m.disjunct1[1,1].transformation_block().component("disjunct1[1,1].c"),
m.disjunct1[1,1].transformation_block.component("disjunct1[1,1].c"),
Constraint)
self.assertIsInstance(
m.disjunct1[2,0].transformation_block().component("disjunct1[2,0].c"),
m.disjunct1[2,0].transformation_block.component("disjunct1[2,0].c"),
Constraint)
self.assertIsInstance(
m.disjunct1[2,1].transformation_block().component("disjunct1[2,1].c"),
m.disjunct1[2,1].transformation_block.component("disjunct1[2,1].c"),
Constraint)

# This relies on the disjunctions being transformed in the same order
Expand All @@ -637,7 +637,7 @@ def check_indexedDisj_only_targets_transformed(self, transformation):

for i, j in pairs:
self.assertIs(trans.get_src_disjunct(disjBlock[j]), m.disjunct1[i])
self.assertIs(disjBlock[j], m.disjunct1[i].transformation_block())
self.assertIs(disjBlock[j], m.disjunct1[i].transformation_block)

def check_warn_for_untransformed(self, transformation, **kwargs):
# Check that we complain if we find an untransformed Disjunct inside of
Expand Down Expand Up @@ -725,7 +725,7 @@ def check_disjData_only_targets_transformed(self, transformation):
((2,1), 1),
]
for i, j in pairs:
self.assertIs(m.disjunct1[i].transformation_block(), disjBlock[j])
self.assertIs(m.disjunct1[i].transformation_block, disjBlock[j])
self.assertIs(trans.get_src_disjunct(disjBlock[j]), m.disjunct1[i])

def check_indexedBlock_targets_inactive(self, transformation, **kwargs):
Expand Down Expand Up @@ -798,7 +798,7 @@ def check_indexedBlock_only_targets_transformed(self, transformation):
disjBlock = disjBlock1
if blocknum == 1:
disjBlock = disjBlock2
self.assertIs(original[i].transformation_block(), disjBlock[j])
self.assertIs(original[i].transformation_block, disjBlock[j])
self.assertIs(trans.get_src_disjunct(disjBlock[j]), original[i])

def check_blockData_targets_inactive(self, transformation, **kwargs):
Expand Down Expand Up @@ -1156,7 +1156,7 @@ def check_block_only_targets_transformed(self, transformation):
(1,1),
]
for i, j in pairs:
self.assertIs(m.b.disjunct[i].transformation_block(), disjBlock[j])
self.assertIs(m.b.disjunct[i].transformation_block, disjBlock[j])
self.assertIs(trans.get_src_disjunct(disjBlock[j]), m.b.disjunct[i])

# common error messages
Expand Down Expand Up @@ -1483,7 +1483,7 @@ def check_disjunct_only_targets_transformed(self, transformation):
transform.get_src_disjunct(disjBlock[j]))
self.assertIs(disjBlock[j],
m.simpledisjunct.component(
'innerdisjunct%d'%i).transformation_block())
'innerdisjunct%d'%i).transformation_block)

def check_disjunctData_targets_inactive(self, transformation, **kwargs):
m = models.makeNestedDisjunctions()
Expand Down Expand Up @@ -1530,33 +1530,33 @@ def check_disjunctData_only_targets_transformed(self, transformation):
for i, j in pairs:
self.assertIs(transform.get_src_disjunct(disjBlock[j]),
m.disjunct[1].innerdisjunct[i])
self.assertIs(m.disjunct[1].innerdisjunct[i].transformation_block(),
self.assertIs(m.disjunct[1].innerdisjunct[i].transformation_block,
disjBlock[j])

def check_all_components_transformed(self, m):
# checks that all the disjunctive components claim to be transformed in the
# makeNestedDisjunctions_NestedDisjuncts model.
self.assertIsInstance(m.disj.algebraic_constraint(), Constraint)
self.assertIsInstance(m.d1.disj2.algebraic_constraint(), Constraint)
self.assertIsInstance(m.d1.transformation_block(), _BlockData)
self.assertIsInstance(m.d2.transformation_block(), _BlockData)
self.assertIsInstance(m.d1.d3.transformation_block(), _BlockData)
self.assertIsInstance(m.d1.d4.transformation_block(), _BlockData)
self.assertIsInstance(m.d1.transformation_block, _BlockData)
self.assertIsInstance(m.d2.transformation_block, _BlockData)
self.assertIsInstance(m.d1.d3.transformation_block, _BlockData)
self.assertIsInstance(m.d1.d4.transformation_block, _BlockData)

def check_transformation_blocks_nestedDisjunctions(self, m, transformation):
disjunctionTransBlock = m.disj.algebraic_constraint().parent_block()
transBlocks = disjunctionTransBlock.relaxedDisjuncts
self.assertEqual(len(transBlocks), 4)
if transformation == 'bigm':
self.assertIs(transBlocks[0], m.d1.d3.transformation_block())
self.assertIs(transBlocks[1], m.d1.d4.transformation_block())
self.assertIs(transBlocks[2], m.d1.transformation_block())
self.assertIs(transBlocks[3], m.d2.transformation_block())
self.assertIs(transBlocks[0], m.d1.d3.transformation_block)
self.assertIs(transBlocks[1], m.d1.d4.transformation_block)
self.assertIs(transBlocks[2], m.d1.transformation_block)
self.assertIs(transBlocks[3], m.d2.transformation_block)
if transformation == 'hull':
self.assertIs(transBlocks[2], m.d1.d3.transformation_block())
self.assertIs(transBlocks[3], m.d1.d4.transformation_block())
self.assertIs(transBlocks[0], m.d1.transformation_block())
self.assertIs(transBlocks[1], m.d2.transformation_block())
self.assertIs(transBlocks[2], m.d1.d3.transformation_block)
self.assertIs(transBlocks[3], m.d1.d4.transformation_block)
self.assertIs(transBlocks[0], m.d1.transformation_block)
self.assertIs(transBlocks[1], m.d2.transformation_block)

def check_nested_disjunction_target(self, transformation):
m = models.makeNestedDisjunctions_NestedDisjuncts()
Expand Down
26 changes: 13 additions & 13 deletions pyomo/gdp/tests/test_bigm.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def test_disjunct_and_constraint_maps(self):
# we are counting on the fact that the disjuncts get relaxed in the
# same order every time.
for i in [0,1]:
self.assertIs(oldblock[i].transformation_block(), disjBlock[i])
self.assertIs(oldblock[i].transformation_block, disjBlock[i])
self.assertIs(bigm.get_src_disjunct(disjBlock[i]), oldblock[i])

# check the constraint mappings
Expand Down Expand Up @@ -662,7 +662,7 @@ def test_disjunct_and_constraint_maps(self):
self.assertIs(bigm.get_src_disjunct(transformedDisjunct),
srcDisjunct)
self.assertIs(transformedDisjunct,
srcDisjunct.transformation_block())
srcDisjunct.transformation_block)

transformed = bigm.get_transformed_constraints(srcDisjunct.c)
if src[0]:
Expand Down Expand Up @@ -1800,22 +1800,22 @@ def test_disjunct_mappings(self):

# I want to check that I correctly updated the pointers to the
# transformation blocks on the inner Disjuncts.
self.assertIs(m.disjunct[1].innerdisjunct[0].transformation_block(),
self.assertIs(m.disjunct[1].innerdisjunct[0].transformation_block,
disjunctBlocks[4])
self.assertIs(disjunctBlocks[4]._src_disjunct(),
m.disjunct[1].innerdisjunct[0])

self.assertIs(m.disjunct[1].innerdisjunct[1].transformation_block(),
self.assertIs(m.disjunct[1].innerdisjunct[1].transformation_block,
disjunctBlocks[5])
self.assertIs(disjunctBlocks[5]._src_disjunct(),
m.disjunct[1].innerdisjunct[1])

self.assertIs(m.simpledisjunct.innerdisjunct0.transformation_block(),
self.assertIs(m.simpledisjunct.innerdisjunct0.transformation_block,
disjunctBlocks[0])
self.assertIs(disjunctBlocks[0]._src_disjunct(),
m.simpledisjunct.innerdisjunct0)

self.assertIs(m.simpledisjunct.innerdisjunct1.transformation_block(),
self.assertIs(m.simpledisjunct.innerdisjunct1.transformation_block,
disjunctBlocks[1])
self.assertIs(disjunctBlocks[1]._src_disjunct(),
m.simpledisjunct.innerdisjunct1)
Expand Down Expand Up @@ -1918,7 +1918,7 @@ def test_transformed_constraints(self):
# transformed by the outer ones.
m = models.makeNestedDisjunctions()
TransformationFactory('gdp.bigm').apply_to(m)
cons1 = m.disjunct[1].innerdisjunct[0].transformation_block().component(
cons1 = m.disjunct[1].innerdisjunct[0].transformation_block.component(
m.disjunct[1].innerdisjunct[0].c.name)
cons1lb = cons1['lb']
self.assertEqual(cons1lb.lower, 0)
Expand All @@ -1930,14 +1930,14 @@ def test_transformed_constraints(self):
self.check_bigM_constraint(cons1ub, m.z, 10,
m.disjunct[1].innerdisjunct[0].indicator_var)

cons2 = m.disjunct[1].innerdisjunct[1].transformation_block().component(
cons2 = m.disjunct[1].innerdisjunct[1].transformation_block.component(
m.disjunct[1].innerdisjunct[1].c.name)['lb']
self.assertEqual(cons2.lower, 5)
self.assertIsNone(cons2.upper)
self.check_bigM_constraint(cons2, m.z, -5,
m.disjunct[1].innerdisjunct[1].indicator_var)

cons3 = m.simpledisjunct.innerdisjunct0.transformation_block().\
cons3 = m.simpledisjunct.innerdisjunct0.transformation_block.\
component(
m.simpledisjunct.innerdisjunct0.c.name)['ub']
self.assertEqual(cons3.upper, 2)
Expand All @@ -1946,7 +1946,7 @@ def test_transformed_constraints(self):
cons3, m.x, 7,
m.simpledisjunct.innerdisjunct0.indicator_var)

cons4 = m.simpledisjunct.innerdisjunct1.transformation_block().\
cons4 = m.simpledisjunct.innerdisjunct1.transformation_block.\
component(
m.simpledisjunct.innerdisjunct1.c.name)['lb']
self.assertEqual(cons4.lower, 4)
Expand Down Expand Up @@ -1977,7 +1977,7 @@ def test_transformed_constraints(self):
ct.check_linear_coef(self, repn, m.simpledisjunct.binary_indicator_var,
-1)

cons6 = m.disjunct[0].transformation_block().component("disjunct[0].c")
cons6 = m.disjunct[0].transformation_block.component("disjunct[0].c")
cons6lb = cons6['lb']
self.assertIsNone(cons6lb.upper)
self.assertEqual(cons6lb.lower, 2)
Expand All @@ -1995,7 +1995,7 @@ def test_transformed_constraints(self):
[m.disjunct[1].innerdisjunct[0],
m.disjunct[1].innerdisjunct[1]])

cons8 = m.disjunct[1].transformation_block().component(
cons8 = m.disjunct[1].transformation_block.component(
"disjunct[1].c")['ub']
self.assertIsNone(cons8.lower)
self.assertEqual(cons8.upper, 2)
Expand Down Expand Up @@ -2056,7 +2056,7 @@ def innerIndexed(d, i):
m.d1.indexedDisjunct1[1], m.d1.indexedDisjunct2[0],
m.d1.indexedDisjunct2[1]]
for disjunct in disjuncts:
self.assertIs(disjunct.transformation_block().parent_component(),
self.assertIs(disjunct.transformation_block.parent_component(),
m._pyomo_gdp_bigm_reformulation.relaxedDisjuncts)

def check_first_disjunct_constraint(self, disj1c, x, ind_var):
Expand Down
Loading

0 comments on commit 4bcf833

Please sign in to comment.