<jupyter_start><jupyter_text>Parámetros en Pyomo<jupyter_code># Esta celda da el estilo al notebook
from IPython.core.display import HTML
css_folder = r'Styles_for_JN'
css_style = 'style_1.css'
css_file = css_folder + '\\' + css_style
HTML(open(css_file, "r").read())<jupyter_output><empty_output><jupyter_text>Importes Se importa Pyomo:<jupyter_code>from pyomo.environ import *<jupyter_output><empty_output><jupyter_text>Declaraciones Para declarar un parámetro en un modelo, primero debe crease el modelo:<jupyter_code>model = ConcreteModel()<jupyter_output><empty_output><jupyter_text>La declaración más simple es:<jupyter_code>model.Z = Param()
model.Z.pprint()<jupyter_output>Z : Size=1, Index=None, Domain=Any, Default=None, Mutable=False
ERROR: evaluating object as numeric value: Z
        (object: <class 'pyomo.core.base.param.SimpleParam'>)
    Error evaluating Param value (Z):
    	The Param value is undefined and no default value is specified
    Key : Value
    None :  None<jupyter_text>Se pueden proporcionar parámetros indexados. Así, creamos el índice:<jupyter_code>model.Index = Set(initialize = ['Primer', 'Segun', 'Terce'], ordered = True)<jupyter_output><empty_output><jupyter_text>Indicamos que el parámetro depende de un índice:<jupyter_code>model.ZIndex = Param(model.Index)
model.ZIndex.pprint()<jupyter_output>ZIndex : Size=0, Index=Index, Domain=Any, Default=None, Mutable=False
    Key : Value<jupyter_text>Aqui no tiene valor. Podemos indicarle un valor al igual que un set. Inicializarlo.<jupyter_code>model.ZIni = Param(model.Index, initialize = {'Primer':32, 'Segun': 23,'Terce': 21})
model.ZIni.pprint()<jupyter_output>ZIni : Size=3, Index=Index, Domain=Any, Default=None, Mutable=False
    Key    : Value
    Primer :    32
     Segun :    23
     Terce :    21<jupyter_text>La inicialización también puede hacerse mediante una palabra clave:<jupyter_code>def Initialization(model, i):
    return i + ' Parametro'
model.ZRule = Param(model.Index, initialize = Initialization)
model.ZRule.pprint()<jupyter_output>ZRule : Size=3, Index=Index, Domain=Any, Default=None, Mutable=False
    Key    : Value
    Primer : Primer Parametro
     Segun : Segun Parametro
     Terce : Terce Parametro<jupyter_text>Se puede referir a previos parámetros en el modelo esa regla, incluso, pero el set debe ser ordenado:<jupyter_code>def Previo(model, i):
    if i == 'Primer':
        return 'Primer' + i
    return i + model.ZPrevio['Primer']
model.ZPrevio = Param(model.Index, initialize = Previo)
model.ZPrevio.pprint()<jupyter_output>ZPrevio : Size=3, Index=Index, Domain=Any, Default=None, Mutable=False
    Key    : Value
    Primer :      PrimerPrimer
     Segun : SegunPrimerPrimer
     Terce : TercePrimerPrimer<jupyter_text>Los parámetros pueden contener cualquier tipo de datos. El dominio por defecto es `Any`. En ocasiones, es mejor marcar un dominio para validar que lo que estamos introduciendo es correcto:<jupyter_code>model.ZReal = Param(within = Reals)<jupyter_output><empty_output><jupyter_text>Mutabilidad Los parámetros representan valores constantes. Sin embargo, es posible utilizar parámetros mutables en Pyomo. Por ejemplo, generaremos la siguiente expresión:$$ x_{1} + 17x_{2} - 4x_{3}$$<jupyter_code>model = ConcreteModel()
model.A = Set(initialize = [1,2,3])
model.P = Param(model.A, initialize = {1:1, 2:17, 3:-4})
model.x = Var(model.A, within = NonNegativeReals)
def Obj_Rule(model):
    return sum(model.P[i]*model.x[i] for i in model.A)
model.Obj = Objective(rule = Obj_Rule)
model.Obj.pprint()<jupyter_output>Obj : Size=1, Index=None, Active=True
    Key  : Active : Sense    : Expression
    None :   True : minimize : x[1] + 17*x[2] - 4*x[3]<jupyter_text>Observamos que ha substituido el valor de los parámetros. Mutabilidad está en cero. Ahora probamos a hacerlo activando la mutabilidad.<jupyter_code>model = ConcreteModel()
model.A = Set(initialize = [1,2,3])
model.P = Param(model.A, initialize = {1:1, 2:17, 3:-4}, mutable = True)
model.x = Var(model.A, within = NonNegativeReals)
def Obj_Rule(model):
    return sum(model.P[i]*model.x[i] for i in model.A)
model.Obj = Objective(rule = Obj_Rule)
model.Obj.pprint()<jupyter_output>Obj : Size=1, Index=None, Active=True
    Key  : Active : Sense    : Expression
    None :   True : minimize : P[1] * x[1] + P[2] * x[2] + P[3] * x[3]<jupyter_text>Ahora no ha substituido el valor de los parámetros . Y estos pueden cambiarse con expresiones como:<jupyter_code>model.P[2] = 4.2<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11694352159468438, 'fraction_numerical': 0.013510520487264673, 'mean_word_length': 5.246196403872752, 'pattern_counts': {'":': 0, '<': 47, '<?xml version=': 0, '>': 47, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '419648', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 1700, 'n_tokens_neox': 1672, 'n_words': 398, 'path': '# 01 - Notebooks/2_Parameters.ipynb', 'repo_name': 'CAChemE/pyomo-tutorial', 'size': '4515'}