def _apply_to_impl(self, instance, **kwds): if not instance.ctype in (Block, Disjunct): raise GDP_Error("Transformation called on %s of type %s. " "'instance' must be a ConcreteModel, Block, or " "Disjunct (in the case of nested disjunctions)." % (instance.name, instance.ctype)) config = self.CONFIG(kwds.pop('options', {})) # We will let args override suffixes and estimate as a last # resort. More specific args/suffixes override ones anywhere in # the tree. Suffixes lower down in the tree override ones higher # up. config.set_value(kwds) bigM = config.bigM self.assume_fixed_vars_permanent = config.assume_fixed_vars_permanent targets = config.targets # We need to check that all the targets are in fact on instance. As we # do this, we will use the set below to cache components we know to be # in the tree rooted at instance. knownBlocks = {} if targets is None: targets = (instance, ) # we need to preprocess targets to make sure that if there are any # disjunctions in targets that their disjuncts appear before them in # the list. targets = preprocess_targets(targets, instance, knownBlocks) for t in targets: if t.ctype is Disjunction: if t.is_indexed(): self._transform_disjunction(t, bigM) else: self._transform_disjunctionData(t, bigM, t.index()) else: # We know t.ctype in (Block, Disjunct) after preprocessing if t.is_indexed(): self._transform_block(t, bigM) else: self._transform_blockData(t, bigM) # issue warnings about anything that was in the bigM args dict that we # didn't use if bigM is not None: unused_args = ComponentSet(bigM.keys()) - \ ComponentSet(self.used_args.keys()) if len(unused_args) > 0: warning_msg = ("Unused arguments in the bigM map! " "These arguments were not used by the " "transformation:\n") for component in unused_args: if hasattr(component, 'name'): warning_msg += "\t%s\n" % component.name else: warning_msg += "\t%s\n" % component logger.warning(warning_msg) # at the end, transform any logical constraints that might be on # instance TransformationFactory('core.logical_to_linear').apply_to(instance)
def _apply_to_impl(self, instance, **kwds): if not instance.ctype in (Block, Disjunct): raise GDP_Error( "Transformation called on %s of type %s. 'instance' " "must be a ConcreteModel, Block, or Disjunct (in " "the case of nested disjunctions)." % (instance.name, instance.ctype)) config = self.CONFIG(kwds.pop('options', {})) # We will let args override suffixes and estimate as a last # resort. More specific args/suffixes override ones anywhere in # the tree. Suffixes lower down in the tree override ones higher # up. if 'default_bigM' in kwds: deprecation_warning( "the 'default_bigM=' argument has been " "replaced by 'bigM='", version='5.4') config.bigM = kwds.pop('default_bigM') config.set_value(kwds) bigM = config.bigM self.assume_fixed_vars_permanent = config.assume_fixed_vars_permanent targets = config.targets if targets is None: targets = (instance, ) else: # we need to preprocess targets to make sure that if there are any # disjunctions in targets that their disjuncts appear before them in # the list. targets = preprocess_targets(targets) # We need to check that all the targets are in fact on # instance. As we do this, we will use the set below to cache components # we know to be in the tree rooted at instance. knownBlocks = {} for t in targets: # check that t is in fact a child of instance if not is_child_of( parent=instance, child=t, knownBlocks=knownBlocks): raise GDP_Error( "Target '%s' is not a component on instance '%s'!" % (t.name, instance.name)) elif t.ctype is Disjunction: if t.is_indexed(): self._transform_disjunction(t, bigM) else: self._transform_disjunctionData(t, bigM, t.index()) elif t.ctype in (Block, Disjunct): if t.is_indexed(): self._transform_block(t, bigM) else: self._transform_blockData(t, bigM) else: raise GDP_Error( "Target '%s' was not a Block, Disjunct, or Disjunction. " "It was of type %s and can't be transformed." % (t.name, type(t))) # issue warnings about anything that was in the bigM args dict that we # didn't use if bigM is not None: unused_args = ComponentSet(bigM.keys()) - \ ComponentSet(self.used_args.keys()) if len(unused_args) > 0: warning_msg = ("Unused arguments in the bigM map! " "These arguments were not used by the " "transformation:\n") for component in unused_args: if hasattr(component, 'name'): warning_msg += "\t%s\n" % component.name else: warning_msg += "\t%s\n" % component logger.warning(warning_msg)