Source code for pyomo.core.base.global_set

#  ___________________________________________________________________________
#
#  Pyomo: Python Optimization Modeling Objects
#  Copyright (c) 2008-2024
#  National Technology and Engineering Solutions of Sandia, LLC
#  Under the terms of Contract DE-NA0003525 with National Technology and
#  Engineering Solutions of Sandia, LLC, the U.S. Government retains certain
#  rights in this software.
#  This software is distributed under the 3-clause BSD License.
#  ___________________________________________________________________________

from pyomo.core.pyomoobject import PyomoObject
from pyomo.core.base.range import NonNumericRange

GlobalSets = {}


def _get_global_set(name):
    return GlobalSets[name]


_get_global_set.__safe_for_unpickling__ = True


[docs] class GlobalSetBase(PyomoObject): """The base class for all Global sets""" __slots__ = () def __reduce__(self): # Cause pickle to preserve references to this object return _get_global_set, (self.local_name,) def __deepcopy__(self, memo): # Prevent deepcopy from duplicating this object return self def __str__(self): # Override str() to always print out the global set name return self.name # # Override the private "_parent" attribute: as this is a # _global_ set, we disallow assigning the set to a block. # @property def _parent(self): return None @_parent.setter def _parent(self, val): if val is None: return val = val() # dereference the weakref raise RuntimeError( "Cannot assign a GlobalSet '%s' to %s '%s'" % ( self.global_name, 'model' if val.model() is val else 'block', val.name or 'unknown', ) )
# FIXME: This mocks up part of the Set API until we can break up the set # module to resolve circular dependencies and can make this a proper # GlobalSet (Scalar IndexedComponent objects are indexed by # UnindexedComponent_set, but we would like UnindexedComponent_set to be # a proper scalar IndexedComponent). # # UnindexedComponent_set = set([None]) class _UnindexedComponent_set(GlobalSetBase): local_name = 'UnindexedComponent_set' _anonymous_sets = GlobalSetBase def __init__(self, name): self.name = name self._constructed = True def __contains__(self, val): return val is None def get(self, value, default): if value is None: return value return default def __iter__(self): return (None,).__iter__() def __reversed__(self): return iter(self) def ordered_iter(self): return iter(self) def sorted_iter(self): return iter(self) def data(self): return tuple(self) def ordered_data(self): return tuple(self) def sorted_data(self): return tuple(self) def subsets(self, expand_all_set_operators=None): return [self] def construct(self): pass def ranges(self): yield NonNumericRange(None) def bounds(self): return (None, None) def get_interval(self): return (None, None, None) def __len__(self): return 1 def __eq__(self, other): return self is other def __ne__(self, other): return self is not other @property def dimen(self): return 0 def isdiscrete(self): return True def isfinite(self): return True def isordered(self): # As this set only has a single element, it is implicitly "ordered" return True def at(self, index): if index == 1: return None raise IndexError("%s index out of range" % (self.name,)) def ord(self, item): if item is None: return 1 raise IndexError( "Cannot identify position of %s in Set %s: item not in Set" % (item, self.name) ) def first(self): return None def last(self): return None def next(self, item, step=1): # make sure that item is None (and raise the standard error if it is not) self.ord(item) if step < 0: raise IndexError("Cannot advance before the beginning of the Set") else: raise IndexError("Cannot advance past the end of the Set") def nextw(self, item, step=1): # make sure that item is None (and raise the standard error if it is not) self.ord(item) return None def prev(self, item, step=1): return self.next(item, -step) def prevw(self, item, step=1): return self.nextw(item, -step) def parent_block(self): return None def parent_component(self): return self UnindexedComponent_set = _UnindexedComponent_set('UnindexedComponent_set') GlobalSets[UnindexedComponent_set.local_name] = UnindexedComponent_set UnindexedComponent_index = next(iter(UnindexedComponent_set))