# ___________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright (c) 2008-2025
# 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.
# ___________________________________________________________________________
import logging
import types
from pyomo.common.log import is_debug_set
from pyomo.common.timing import ConstructionTimer
from pyomo.core.base.component import ModelComponentFactory
from pyomo.core.base.indexed_component import IndexedComponent
from pyomo.core.base.misc import apply_indexed_rule
logger = logging.getLogger('pyomo.core')
[docs]
@ModelComponentFactory.register(
"A component that performs tests during model construction. The action rule is applied to every index value."
)
class BuildCheck(IndexedComponent):
"""
A build check, which executes a rule for all valid indices. If
the function returns False an exception is raised.
Constructor arguments:
rule The rule that is executed for every indice.
Private class attributes:
_rule The rule that is executed for every indice.
"""
[docs]
def __init__(self, *args, **kwd):
self._rule = kwd.pop('rule', None)
kwd['ctype'] = BuildCheck
IndexedComponent.__init__(self, *args, **kwd)
#
if not type(self._rule) is types.FunctionType:
raise ValueError(
"BuildCheck must have an 'rule' option specified whose value is a function"
)
def _pprint(self):
return ([], None, None, None)
[docs]
def construct(self, data=None):
"""Apply the rule to construct values in this set"""
if is_debug_set(logger): # pragma:nocover
logger.debug("Constructing Check, name=" + self.name)
#
if self._constructed: # pragma:nocover
return
timer = ConstructionTimer(self)
self._constructed = True
#
if not self.is_indexed():
# Scalar component
res = self._rule(self._parent())
if not res:
raise ValueError("BuildCheck %r identified error" % self.name)
else:
# Indexed component
for index in self._index_set:
res = apply_indexed_rule(self, self._rule, self._parent(), index)
if not res:
raise ValueError(
"BuildCheck %r identified error with index %r"
% (self.name, str(index))
)
timer.report()