Source code for pyomo.contrib.trustregion.util

#  ___________________________________________________________________________
#
#  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.
#
#  Development of this module was conducted as part of the Institute for
#  the Design of Advanced Energy Systems (IDAES) with support through the
#  Simulation-Based Engineering, Crosscutting Research Program within the
#  U.S. Department of Energy’s Office of Fossil Energy and Carbon Management.
#
#  This software is distributed under the 3-clause BSD License.
#  ___________________________________________________________________________

"""
Common utilities for Trust Region Framework
"""

import logging

logger = logging.getLogger('pyomo.contrib.trustregion')


[docs] def minIgnoreNone(a, b): """ Return the min of two numbers, ignoring None """ if a is None: return b if b is None: return a if a < b: return a return b
[docs] def maxIgnoreNone(a, b): """ Return the max of two numbers, ignoring None """ if a is None: return b if b is None: return a if a < b: return b return a
[docs] class IterationRecord: """ Record relevant information at each individual iteration """
[docs] def __init__( self, iteration, feasibility=None, objectiveValue=None, trustRadius=None, stepNorm=None, ): self.iteration = iteration self.fStep, self.thetaStep, self.rejected = [False] * 3 if feasibility is not None: self.feasibility = feasibility if objectiveValue is not None: self.objectiveValue = objectiveValue if trustRadius is not None: self.trustRadius = trustRadius if stepNorm is not None: self.stepNorm = stepNorm
[docs] def detailLogger(self): """ Print information about the iteration to the log. """ logger.info("****** Iteration %d ******" % self.iteration) logger.info("trustRadius = %s" % self.trustRadius) logger.info("feasibility = %s" % self.feasibility) logger.info("objectiveValue = %s" % self.objectiveValue) logger.info("stepNorm = %s" % self.stepNorm) if self.fStep: logger.info("INFO: f-type step") if self.thetaStep: logger.info("INFO: theta-type step") if self.rejected: logger.info("INFO: step rejected")
[docs] def verboseLogger(self): """ Print information about the iteration to the console """ print("****** Iteration %d ******" % self.iteration) print("objectiveValue = %s" % self.objectiveValue) print("feasibility = %s" % self.feasibility) print("trustRadius = %s" % self.trustRadius) print("stepNorm = %s" % self.stepNorm) if self.fStep: print("INFO: f-type step") if self.thetaStep: print("INFO: theta-type step") if self.rejected: print("INFO: step rejected") print(25 * '*')
[docs] class IterationLogger: """ Log (and print) information for all iterations """
[docs] def __init__(self): self.iterations = []
[docs] def newIteration( self, iteration, feasibility, objectiveValue, trustRadius, stepNorm ): """ Add a new iteration to the list of iterations """ self.iterrecord = IterationRecord( iteration, feasibility=feasibility, objectiveValue=objectiveValue, trustRadius=trustRadius, stepNorm=stepNorm, ) self.iterations.append(self.iterrecord)
[docs] def updateIteration( self, feasibility=None, objectiveValue=None, trustRadius=None, stepNorm=None ): """ Update values in current record """ if feasibility is not None: self.iterrecord.feasibility = feasibility if objectiveValue is not None: self.iterrecord.objectiveValue = objectiveValue if trustRadius is not None: self.iterrecord.trustRadius = trustRadius if stepNorm is not None: self.iterrecord.stepNorm = stepNorm
[docs] def logIteration(self): """ Log detailed information about the iteration to the log """ self.iterrecord.detailLogger()
[docs] def printIteration(self): """ Print information to the screen """ self.iterrecord.verboseLogger()