def _apply_to(self, model, **kwds): for boolean_var in model.component_objects(ctype=BooleanVar, descend_into=(Block, Disjunct)): new_varlist = None for bool_vardata in boolean_var.values(): if new_varlist is None and bool_vardata.get_associated_binary( ) is None: new_var_list_name = unique_component_name( model, boolean_var.local_name + '_asbinary') new_varlist = VarList(domain=Binary) setattr(model, new_var_list_name, new_varlist) if bool_vardata.get_associated_binary() is None: new_binary_vardata = new_varlist.add() bool_vardata.associate_binary_var(new_binary_vardata) if bool_vardata.value is not None: new_binary_vardata.value = int(bool_vardata.value) if bool_vardata.fixed: new_binary_vardata.fix() # Process statements in global (entire model) context _process_logical_constraints_in_logical_context(model) # Process statements that appear in disjuncts for disjunct in model.component_data_objects(Disjunct, descend_into=(Block, Disjunct), active=True): _process_logical_constraints_in_logical_context(disjunct)
def _transform_boolean_varData(self, bool_vardata, new_varlists): # This transformation tries to group the binaries it creates for indexed # BooleanVars onto the same VarList. This won't work across separate # calls to the transformation, but within one call it's fine. So we have # two cases: 1) either we have created a VarList for this # BooleanVarData's parent_component, but have yet to add its binary to # said list, or 2) we have neither the binary nor the VarList parent_component = bool_vardata.parent_component() new_varlist = new_varlists.get(parent_component) if new_varlist is None and \ bool_vardata.get_associated_binary() is None: # Case 2) we have neither the VarList nor an associated binary parent_block = bool_vardata.parent_block() new_var_list_name = unique_component_name( parent_block, parent_component.local_name + '_asbinary') new_varlist = VarList(domain=Binary) setattr(parent_block, new_var_list_name, new_varlist) new_varlists[parent_component] = new_varlist if bool_vardata.get_associated_binary() is None: # Case 1) we already have a VarList, but need to create the # associated binary new_binary_vardata = new_varlist.add() bool_vardata.associate_binary_var(new_binary_vardata) if bool_vardata.value is not None: new_binary_vardata.value = int(bool_vardata.value) if bool_vardata.fixed: new_binary_vardata.fix()