1import pyomo.environ as pyo
2import numpy.random as rnd
3import pyomo.contrib.pynumero.examples.external_grey_box.param_est.models as pm
4import pandas as pd
5
6def generate_data(N, UA_mean, UA_std, seed=42):
7    rnd.seed(seed)
8    m = pyo.ConcreteModel()
9    pm.build_single_point_model_pyomo_only(m)
10
11    # dummy objective since this is a square problem
12    m.obj = pyo.Objective(expr=1)
13
14    # create the ipopt solver
15    solver = pyo.SolverFactory('ipopt')
16
17    data = {'run': [], 'Th_in': [], 'Tc_in': [], 'Th_out':[],
18            'Tc_out': []}
19    for i in range(N):
20        # draw a random value for the parameters
21        ua = float(rnd.normal(UA_mean, UA_std))
22        # draw a noisy value for the test input conditions
23        Th_in = 100 + float(rnd.normal(0, 2))
24        Tc_in = 30  + float(rnd.normal(0, 2))
25        m.UA.fix(ua)
26        m.Th_in.fix(Th_in)
27        m.Tc_in.fix(Tc_in)
28
29        status = solver.solve(m, tee=False)
30        data['run'].append(i)
31        data['Th_in'].append(pyo.value(m.Th_in))
32        data['Tc_in'].append(pyo.value(m.Tc_in))
33        data['Th_out'].append(pyo.value(m.Th_out))
34        data['Tc_out'].append(pyo.value(m.Tc_out))
35
36    return pd.DataFrame(data)
37
38def generate_data_external(N, UA_mean, UA_std, seed=42):
39    rnd.seed(seed)
40    m = pyo.ConcreteModel()
41    pm.build_single_point_model_external(m)
42
43    # Add mutable parameters for the rhs of the equalities
44    m.UA_spec = pyo.Param(initialize=200, mutable=True)
45    m.Th_in_spec = pyo.Param(initialize=100, mutable=True)
46    m.Tc_in_spec = pyo.Param(initialize=30, mutable=True)
47    m.UA_spec_con = pyo.Constraint(expr=m.egb.inputs['UA'] == m.UA_spec)
48    m.Th_in_spec_con = pyo.Constraint(expr=m.egb.inputs['Th_in'] == m.Th_in_spec)
49    m.Tc_in_spec_con = pyo.Constraint(expr=m.egb.inputs['Tc_in'] == m.Tc_in_spec)
50
51
52    # dummy objective since this is a square problem
53    m.obj = pyo.Objective(expr=(m.egb.inputs['UA'] - m.UA_spec)**2)
54
55    # create the ipopt solver
56    solver = pyo.SolverFactory('cyipopt')
57
58    data = {'run': [], 'Th_in': [], 'Tc_in': [], 'Th_out':[],
59            'Tc_out': []}
60    for i in range(N):
61        # draw a random value for the parameters
62        UA = float(rnd.normal(UA_mean, UA_std))
63        # draw a noisy value for the test input conditions
64        Th_in = 100 + float(rnd.normal(0, 2))
65        Tc_in = 30  + float(rnd.normal(0, 2))
66        m.UA_spec.value = UA
67        m.Th_in_spec.value = Th_in
68        m.Tc_in_spec.value = Tc_in
69
70        status = solver.solve(m, tee=False)
71        data['run'].append(i)
72        data['Th_in'].append(pyo.value(m.egb.inputs['Th_in']))
73        data['Tc_in'].append(pyo.value(m.egb.inputs['Tc_in']))
74        data['Th_out'].append(pyo.value(m.egb.inputs['Th_out']))
75        data['Tc_out'].append(pyo.value(m.egb.inputs['Tc_out']))
76
77    return pd.DataFrame(data)
78
79if __name__ == '__main__':
80    #df = generate_data(50, 200, 5)
81    df = generate_data_external(50, 200, 5)
82    df.to_csv('data.csv', index=False)
83
84
85