# ____________________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright (c) 2008-2026 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 import Var
from pyomo.core.base.indexed_component import UnindexedComponent_set
[docs]
def create_var(comp, name, block, index_set=None):
if index_set is None:
if comp.is_indexed():
index_set = comp.index_set()
else:
index_set = UnindexedComponent_set
new_var = Var(index_set)
block.add_component(name, new_var)
return new_var
def _tighten(src, dest):
starting_lb = dest.lb
starting_ub = dest.ub
if not src.is_continuous():
dest.domain = src.domain
if src.lb is not None:
if starting_lb is None:
dest.setlb(src.lb)
else:
dest.setlb(max(starting_lb, src.lb))
if src.ub is not None:
if starting_ub is None:
dest.setub(src.ub)
else:
dest.setub(min(starting_ub, src.ub))
[docs]
def tighten_var_domain(comp, new_var, index_set=None):
if index_set is None:
if comp.is_indexed():
index_set = comp.index_set()
else:
index_set = UnindexedComponent_set
if comp.is_indexed():
for i in index_set:
try:
# set bounds for every member in case they differ
_tighten(comp[i], new_var[i])
except AttributeError:
break
else:
try:
# set bounds for every member in case they differ
_tighten(comp, new_var)
except AttributeError:
pass
return new_var
[docs]
def replicate_var(comp, name, block, index_set=None):
"""
Create a new variable that will have the same indexing set, domain,
and bounds as the provided component, and add it to the given block.
Optionally pass an index set to use that to build the variable, but
this set must be symmetric to comp's index set.
"""
new_var = create_var(comp, name, block, index_set)
tighten_var_domain(comp, new_var, index_set)
return new_var