def test_sipopt_deprecated(self): m = param_ex.create_model() m.perturbed_eta1 = Param(initialize = 4.0) m.perturbed_eta2 = Param(initialize = 1.0) output = StringIO() with LoggingIntercept(output, 'pyomo.contrib.sensitivity_toolbox', logging.WARNING): sipopt(m,[m.eta1,m.eta1], [m.perturbed_eta1,m.perturbed_eta2], cloneModel=False) self.assertIn("DEPRECATED: The sipopt function has been deprecated. Use the " "sensitivity_calculation() function with method='sipopt' to access", output.getvalue().replace('\n', ' '))
def test_bad_arg(self): m = ConcreteModel() m.t = ContinuousSet(bounds=(0, 1)) m.a = Param(initialize=1, mutable=True) m.b = Param(initialize=2, mutable=True) m.c = Param(initialize=3, mutable=False) m.x = Var(m.t) list_one = [m.a, m.b] list_two = [m.a, m.b, m.c] list_three = [m.a, m.x] list_four = [m.a, m.c] #verify ValueError thrown when param and perturb list are different # lengths try: Result = sipopt(m, list_one, list_two) self.fail("Expected ValueError: for different length lists") except ValueError: pass #verify ValueError thrown when param list has a Var in it try: Result = sipopt(m, list_three, list_two) self.fail( "Expected ValueError: variable sent through paramSubList") except ValueError: pass #verify ValueError thrown when perturb list has Var in it try: Result = sipopt(m, list_one, list_three) self.fail("Expected ValueError: variable sent through perturbList") except ValueError: pass #verify ValueError thrown when param list has an unmutable param try: Result = sipopt(m, list_four, list_one) self.fail("Expected ValueError:" "unmutable param sent through paramSubList") except ValueError: pass
def test_bad_arg(self): m = ConcreteModel() m.t = ContinuousSet(bounds=(0,1)) m.a = Param(initialize=1, mutable=True) m.b = Param(initialize=2, mutable=True) m.c = Param(initialize=3, mutable=False) m.x = Var(m.t) list_one = [m.a,m.b] list_two = [m.a,m.b,m.c] list_three = [m.a, m.x] list_four = [m.a,m.c] #verify ValueError thrown when param and perturb list are different # lengths try: Result = sipopt(m,list_one,list_two) self.fail("Expected ValueError: for different length lists") except ValueError: pass #verify ValueError thrown when param list has a Var in it try: Result = sipopt(m,list_three,list_two) self.fail("Expected ValueError: variable sent through paramSubList") except ValueError: pass #verify ValueError thrown when perturb list has Var in it try: Result = sipopt(m,list_one,list_three) self.fail("Expected ValueError: variable sent through perturbList") except ValueError: pass #verify ValueError thrown when param list has an unmutable param try: Result = sipopt(m,list_four,list_one) self.fail("Expected ValueError:" "unmutable param sent through paramSubList") except ValueError: pass
def test_constraintSub(self): m = ri.create_model() m.pert_a = Param(initialize=0.01) m.pert_b = Param(initialize=1.01) m_sipopt = sipopt(m, [m.a, m.b], [m.pert_a, m.pert_b]) #verify substitutions in equality constraint self.assertTrue(m_sipopt.C_equal.lower.ctype is Param and m_sipopt.C_equal.upper.ctype is Param) self.assertFalse(m_sipopt.C_equal.active) self.assertTrue( m_sipopt._sipopt_data.constList[3].lower == 0.0 and m_sipopt._sipopt_data.constList[3].upper == 0.0 and len( list( identify_variables( m_sipopt._sipopt_data.constList[3].body))) == 2) #verify substitutions in one-sided bounded constraint self.assertTrue(m_sipopt.C_singleBnd.lower is None and m_sipopt.C_singleBnd.upper.ctype is Param) self.assertFalse(m_sipopt.C_singleBnd.active) self.assertTrue( m_sipopt._sipopt_data.constList[4].lower is None and m_sipopt._sipopt_data.constList[4].upper == 0.0 and len( list( identify_variables( m_sipopt._sipopt_data.constList[4].body))) == 2) #verify substitutions in ranged inequality constraint self.assertTrue(m_sipopt.C_rangedIn.lower.ctype is Param and m_sipopt.C_rangedIn.upper.ctype is Param) self.assertFalse(m_sipopt.C_rangedIn.active) self.assertTrue( m_sipopt._sipopt_data.constList[1].lower is None and m_sipopt._sipopt_data.constList[1].upper == 0.0 and len( list( identify_variables( m_sipopt._sipopt_data.constList[1].body))) == 2) self.assertTrue( m_sipopt._sipopt_data.constList[2].lower is None and m_sipopt._sipopt_data.constList[2].upper == 0.0 and len( list( identify_variables( m_sipopt._sipopt_data.constList[2].body))) == 2)
def test_constraintSub(self): m = ri.create_model() m.pert_a = Param(initialize=0.01) m.pert_b = Param(initialize=1.01) m_sipopt = sipopt(m,[m.a,m.b], [m.pert_a,m.pert_b]) #verify substitutions in equality constraint self.assertTrue(m_sipopt.C_equal.lower.type() is Param and m_sipopt.C_equal.upper.type() is Param) self.assertFalse(m_sipopt.C_equal.active) self.assertTrue(m_sipopt._sipopt_data.constList[3].lower == 0.0 and m_sipopt._sipopt_data.constList[3].upper == 0.0 and len(list(identify_variables( m_sipopt._sipopt_data.constList[3].body))) == 2) #verify substitutions in one-sided bounded constraint self.assertTrue(m_sipopt.C_singleBnd.lower is None and m_sipopt.C_singleBnd.upper.type() is Param) self.assertFalse(m_sipopt.C_singleBnd.active) self.assertTrue(m_sipopt._sipopt_data.constList[4].lower is None and m_sipopt._sipopt_data.constList[4].upper == 0.0 and len(list(identify_variables( m_sipopt._sipopt_data.constList[4].body))) == 2) #verify substitutions in ranged inequality constraint self.assertTrue(m_sipopt.C_rangedIn.lower.type() is Param and m_sipopt.C_rangedIn.upper.type() is Param) self.assertFalse(m_sipopt.C_rangedIn.active) self.assertTrue(m_sipopt._sipopt_data.constList[1].lower is None and m_sipopt._sipopt_data.constList[1].upper == 0.0 and len(list(identify_variables( m_sipopt._sipopt_data.constList[1].body))) == 2) self.assertTrue(m_sipopt._sipopt_data.constList[2].lower is None and m_sipopt._sipopt_data.constList[2].upper == 0.0 and len(list(identify_variables( m_sipopt._sipopt_data.constList[2].body))) == 2)
def test_indexedParamsMapping(self): m = hiv.create_model() hiv.initialize_model(m,10,5,1) m.epsDelta = Param(initialize = 0.75001) q_del = {} q_del[(0,0)] = 1.001 q_del[(0,1)] = 1.002 q_del[(1,0)] = 1.003 q_del[(1,1)] = 1.004 q_del[(2,0)] = 0.83001 q_del[(2,1)] = 0.83002 q_del[(3,0)] = 0.42001 q_del[(4,0)] = 0.17001 m.qqDelta = Param(m.ij, initialize = q_del) m.aaDelta = Param(initialize =0.0001001) m_sipopt = sipopt(m, [m.eps,m.qq,m.aa], [m.epsDelta,m.qqDelta,m.aaDelta]) #param to var data self.assertEqual( m_sipopt._sipopt_data.paramConst[1].lower.local_name, 'eps') self.assertEqual( m_sipopt._sipopt_data.paramConst[1].body.local_name, 'eps') self.assertEqual( m_sipopt._sipopt_data.paramConst[1].upper.local_name, 'eps') self.assertEqual( m_sipopt._sipopt_data.paramConst[6].lower.local_name, 'qq[2,0]') self.assertEqual( m_sipopt._sipopt_data.paramConst[6].body.local_name, 'qq[2,0]') self.assertEqual( m_sipopt._sipopt_data.paramConst[6].upper.local_name, 'qq[2,0]') self.assertEqual( m_sipopt._sipopt_data.paramConst[10].lower.local_name, 'aa') self.assertEqual( m_sipopt._sipopt_data.paramConst[10].body.local_name, 'aa') self.assertEqual( m_sipopt._sipopt_data.paramConst[10].upper.local_name, 'aa')
def test_indexedParamsMapping(self): m = hiv.create_model() hiv.initialize_model(m, 10, 5, 1) m.epsDelta = Param(initialize=0.75001) q_del = {} q_del[(0, 0)] = 1.001 q_del[(0, 1)] = 1.002 q_del[(1, 0)] = 1.003 q_del[(1, 1)] = 1.004 q_del[(2, 0)] = 0.83001 q_del[(2, 1)] = 0.83002 q_del[(3, 0)] = 0.42001 q_del[(4, 0)] = 0.17001 m.qqDelta = Param(m.ij, initialize=q_del) m.aaDelta = Param(initialize=0.0001001) m_sipopt = sipopt(m, [m.eps, m.qq, m.aa], [m.epsDelta, m.qqDelta, m.aaDelta]) #param to var data self.assertEqual(m_sipopt._sipopt_data.paramConst[1].lower.local_name, 'eps') self.assertEqual(m_sipopt._sipopt_data.paramConst[1].body.local_name, 'eps') self.assertEqual(m_sipopt._sipopt_data.paramConst[1].upper.local_name, 'eps') self.assertEqual(m_sipopt._sipopt_data.paramConst[6].lower.local_name, 'qq[2,0]') self.assertEqual(m_sipopt._sipopt_data.paramConst[6].body.local_name, 'qq[2,0]') self.assertEqual(m_sipopt._sipopt_data.paramConst[6].upper.local_name, 'qq[2,0]') self.assertEqual(m_sipopt._sipopt_data.paramConst[10].lower.local_name, 'aa') self.assertEqual(m_sipopt._sipopt_data.paramConst[10].body.local_name, 'aa') self.assertEqual(m_sipopt._sipopt_data.paramConst[10].upper.local_name, 'aa')
def test_sipopt_equivalent(self): m1 = param_ex.create_model() m1.perturbed_eta1 = Param(initialize = 4.0) m1.perturbed_eta2 = Param(initialize = 1.0) m2 = param_ex.create_model() m2.perturbed_eta1 = Param(initialize = 4.0) m2.perturbed_eta2 = Param(initialize = 1.0) m11 = sipopt(m1,[m1.eta1,m1.eta2], [m1.perturbed_eta1,m1.perturbed_eta2], cloneModel=True) m22 = sensitivity_calculation('sipopt',m2,[m2.eta1,m2.eta2], [m2.perturbed_eta1,m2.perturbed_eta2], cloneModel=True) out1 = StringIO() out2 = StringIO() m11._SENSITIVITY_TOOLBOX_DATA.constList.pprint(ostream=out1) m22._SENSITIVITY_TOOLBOX_DATA.constList.pprint(ostream=out2) self.assertMultiLineEqual(out1.getvalue(), out2.getvalue())
discretizer = TransformationFactory('dae.collocation') discretizer.apply_to(m,nfe=n_nfe,ncp=n_ncp,scheme='LAGRANGE-RADAU') sim.initialize_model() if __name__=='__main__': m = create_model() initialize_model(m,10,5,1) m.epsDelta = Param(initialize = 0.75001) q_del={} q_del[(0,0)] = 1.001 q_del[(0,1)] = 1.002 q_del[(1,0)] = 1.003 q_del[(1,1)] = 1.004 q_del[(2,0)] = 0.83001 q_del[(2,1)] = 0.83002 q_del[(3,0)] = 0.42001 q_del[(4,0)] = 0.17001 m.qqDelta = Param(m.ij, initialize=q_del) m.aaDelta = Param(initialize = .0001001) m_sipopt = sipopt(m,[m.eps,m.qq,m.aa], [m.epsDelta,m.qqDelta,m.aaDelta], streamSoln = True)
plt.subplot(132) plt.plot(m.t.value,u,'ro',label='u') plt.title('Control Soln') plt.xlabel('time') plt.subplot(133) plt.plot(m.t.value,F,'ro',label='Cost Integrand') plt.title('Anti-derivative of \n Cost Integrand') plt.xlabel('time') #plt.show() return plt ###################################### if __name__ == '__main__': m = create_model() initialize_model(m,100) # plt = plot_optimal_solution(m) # plt.show() m.perturbed_a = Param(initialize=-0.25) m.perturbed_H = Param(initialize=0.55) m_sipopt = sipopt(m,[m.a,m.H], [m.perturbed_a,m.perturbed_H], cloneModel=True, streamSoln=True)
# from pyomo.environ import ConcreteModel, Param, Var, Constraint, inequality from pyomo.contrib.sensitivity_toolbox.sens import sipopt def create_model(): m = ConcreteModel() m.a = Param(initialize=0, mutable=True) m.b = Param(initialize=1, mutable=True) m.x = Var(initialize=1.0) m.y = Var() m.C_rangedIn = Constraint(expr=inequality(m.a, m.x, m.b)) m.C_equal = Constraint(expr=m.y == m.b) m.C_singleBnd = Constraint(expr=m.x <= m.b) return m if __name__ == '__main__': m = create_model() m.pert_a = Param(initialize=0.01) m.pert_b = Param(initialize=1.01) m_sipopt = sipopt(m, [m.a, m.b], [m.pert_a, m.pert_b], streamSoln=True)
from pyomo.contrib.sensitivity_toolbox.sens import sipopt def create_model(): m = ConcreteModel() m.x1 = Var(initialize = 0.15, within=NonNegativeReals) m.x2 = Var(initialize = 0.15, within=NonNegativeReals) m.x3 = Var(initialize = 0.0, within=NonNegativeReals) m.eta1 = Param(initialize=4.5,mutable=True) m.eta2 = Param(initialize=1.0,mutable=True) m.const1 = Constraint(expr=6*m.x1+3*m.x2+2*m.x3-m.eta1 ==0) m.const2 = Constraint(expr=m.eta2*m.x1+m.x2-m.x3-1 ==0) m.cost = Objective(expr=m.x1**2+m.x2**2+m.x3**2) return m if __name__=='__main__': m = create_model() m.perturbed_eta1 = Param(initialize = 4.0) m.perturbed_eta2 = Param(initialize = 1.0) m_sipopt = sipopt(m,[m.eta1,m.eta2], [m.perturbed_eta1,m.perturbed_eta2], streamSoln=True)
def test_clonedModel_soln(self): m_orig = fc.create_model() fc.initialize_model(m_orig,100) m_orig.perturbed_a = Param(initialize=-0.25) m_orig.perturbed_H = Param(initialize=0.55) m_sipopt = sipopt(m_orig,[m_orig.a,m_orig.H], [m_orig.perturbed_a,m_orig.perturbed_H], cloneModel=True) #verify cloned model has _sipopt_data block # and original model is untouched self.assertFalse(m_sipopt == m_orig) self.assertTrue(hasattr(m_sipopt,'_sipopt_data') and m_sipopt._sipopt_data.type() is Block) self.assertFalse(hasattr(m_orig,'_sipopt_data')) self.assertFalse(hasattr(m_orig,'b')) #verify variable declaration self.assertTrue(hasattr(m_sipopt._sipopt_data,'a') and m_sipopt._sipopt_data.a.type() is Var) self.assertTrue(hasattr(m_sipopt._sipopt_data,'H') and m_sipopt._sipopt_data.H.type() is Var) #verify suffixes self.assertTrue(hasattr(m_sipopt,'sens_state_0') and m_sipopt.sens_state_0.type() is Suffix and m_sipopt.sens_state_0[m_sipopt._sipopt_data.H]==2 and m_sipopt.sens_state_0[m_sipopt._sipopt_data.a]==1) self.assertTrue(hasattr(m_sipopt,'sens_state_1') and m_sipopt.sens_state_1.type() is Suffix and m_sipopt.sens_state_1[m_sipopt._sipopt_data.H]==2 and m_sipopt.sens_state_1[m_sipopt._sipopt_data.a]==1) self.assertTrue(hasattr(m_sipopt,'sens_state_value_1') and m_sipopt.sens_state_value_1.type() is Suffix and m_sipopt.sens_state_value_1[ m_sipopt._sipopt_data.H]==0.55 and m_sipopt.sens_state_value_1[ m_sipopt._sipopt_data.a]==-0.25) self.assertTrue(hasattr(m_sipopt,'sens_init_constr') and m_sipopt.sens_init_constr.type() is Suffix and m_sipopt.sens_init_constr[ m_sipopt._sipopt_data.paramConst[1]]==1 and m_sipopt.sens_init_constr[ m_sipopt._sipopt_data.paramConst[2]]==2) self.assertTrue(hasattr(m_sipopt,'sens_sol_state_1') and m_sipopt.sens_sol_state_1.type() is Suffix) self.assertAlmostEqual( m_sipopt.sens_sol_state_1[ m_sipopt.F[15]],-0.00102016765,8) self.assertTrue(hasattr(m_sipopt,'sens_sol_state_1_z_L') and m_sipopt.sens_sol_state_1_z_L.type() is Suffix) self.assertAlmostEqual( m_sipopt.sens_sol_state_1_z_L[ m_sipopt.u[15]],-2.181712e-09,13) self.assertTrue(hasattr(m_sipopt,'sens_sol_state_1_z_U') and m_sipopt.sens_sol_state_1_z_U.type() is Suffix) self.assertAlmostEqual( m_sipopt.sens_sol_state_1_z_U[ m_sipopt.u[15]],6.580899e-09,13) #verify deactivated constraints for cloned model self.assertFalse(m_sipopt.FDiffCon[0].active and m_sipopt.FDiffCon[7.5].active and m_sipopt.FDiffCon[15].active ) self.assertFalse(m_sipopt.x_dot[0].active and m_sipopt.x_dot[7.5].active and m_sipopt.x_dot[15].active ) #verify constraints on original model are still active self.assertTrue(m_orig.FDiffCon[0].active and m_orig.FDiffCon[7.5].active and m_orig.FDiffCon[15].active ) self.assertTrue(m_orig.x_dot[0].active and m_orig.x_dot[7.5].active and m_orig.x_dot[15].active ) #verify solution self.assertAlmostEqual(value(m_sipopt.J),0.0048956783,8)
def run_example(print_flag=True): ''' Execute the example Arguments: print_flag: Toggle on/off printing Returns: sln_dict: Dictionary containing solution (used for automated testing) ''' m = create_model() m.perturbed_eta1 = Param(initialize=4.0) m.perturbed_eta2 = Param(initialize=1.0) m_sipopt = sipopt(m, [m.eta1, m.eta2], [m.perturbed_eta1, m.perturbed_eta2], streamSoln=True) if print_flag: print("\nOriginal parameter values:") print("\teta1 =", m.eta1()) print("\teta2 =", m.eta2()) print("Initial point:") print("\tObjective =", value(m.cost)) print("\tx1 =", m.x1()) print("\tx2 =", m.x2()) print("\tx3 =", m.x3()) print("Solution with the original parameter values:") print("\tObjective =", m_sipopt.cost()) print("\tx1 =", m_sipopt.x1()) print("\tx2 =", m_sipopt.x2()) print("\tx3 =", m_sipopt.x3()) print("\nNew parameter values:") print("\teta1 =", m_sipopt.perturbed_eta1()) print("\teta2 =", m_sipopt.perturbed_eta2()) # This highlights one limitation of sipopt. It will only return the # perturbed solution. The user needs to calculate relevant values such as # the objective or expressions x1 = m_sipopt.sens_sol_state_1[m_sipopt.x1] x2 = m_sipopt.sens_sol_state_1[m_sipopt.x2] x3 = m_sipopt.sens_sol_state_1[m_sipopt.x3] obj = x1**2 + x2**2 + x3**2 if print_flag: print("(Approximate) solution with the new parameter values:") print("\tObjective =", obj) print("\tx1 =", m_sipopt.sens_sol_state_1[m_sipopt.x1]) print("\tx2 =", m_sipopt.sens_sol_state_1[m_sipopt.x2]) print("\tx3 =", m_sipopt.sens_sol_state_1[m_sipopt.x3]) # Save the results in a dictionary. # This is optional and makes automated testing convenient. # This code is not important for a Minimum Working Example (MWE) of sipopt d = dict() d['eta1'] = m.eta1() d['eta2'] = m.eta2() d['x1_init'] = m.x1() d['x2_init'] = m.x2() d['x3_init'] = m.x3() d['x1_sln'] = m_sipopt.x1() d['x2_sln'] = m_sipopt.x2() d['x3_sln'] = m_sipopt.x3() d['cost_sln'] = m_sipopt.cost() d['eta1_pert'] = m_sipopt.perturbed_eta1() d['eta2_pert'] = m_sipopt.perturbed_eta2() d['x1_pert'] = x1 d['x2_pert'] = x2 d['x3_pert'] = x3 d['cost_pert'] = obj return d
plt.xlabel('time') plt.subplot(132) plt.plot(m.t.value, u, 'ro', label='u') plt.title('Control Soln') plt.xlabel('time') plt.subplot(133) plt.plot(m.t.value, F, 'ro', label='Cost Integrand') plt.title('Anti-derivative of \n Cost Integrand') plt.xlabel('time') #plt.show() return plt ###################################### if __name__ == '__main__': m = create_model() initialize_model(m, 100) # plt = plot_optimal_solution(m) # plt.show() m.perturbed_a = Param(initialize=-0.25) m.perturbed_H = Param(initialize=0.55) m_sipopt = sipopt(m, [m.a, m.H], [m.perturbed_a, m.perturbed_H], cloneModel=True, streamSoln=True)
from pyomo.environ import * from pyomo.contrib.sensitivity_toolbox.sens import sipopt def create_model(): m = ConcreteModel() m.x1 = Var(initialize=0.15, within=NonNegativeReals) m.x2 = Var(initialize=0.15, within=NonNegativeReals) m.x3 = Var(initialize=0.0, within=NonNegativeReals) m.eta1 = Param(initialize=4.5, mutable=True) m.eta2 = Param(initialize=1.0, mutable=True) m.const1 = Constraint(expr=6 * m.x1 + 3 * m.x2 + 2 * m.x3 - m.eta1 == 0) m.const2 = Constraint(expr=m.eta2 * m.x1 + m.x2 - m.x3 - 1 == 0) m.cost = Objective(expr=m.x1**2 + m.x2**2 + m.x3**2) return m if __name__ == '__main__': m = create_model() m.perturbed_eta1 = Param(initialize=4.0) m.perturbed_eta2 = Param(initialize=1.0) m_sipopt = sipopt(m, [m.eta1, m.eta2], [m.perturbed_eta1, m.perturbed_eta2], streamSoln=True)
from pyomo.dae import ContinuousSet from pyomo.contrib.sensitivity_toolbox.sens import sipopt def create_model(): m = ConcreteModel() m.a = Param(initialize=0, mutable=True) m.b = Param(initialize=1, mutable=True) m.x = Var(initialize = 1.0) m.y = Var() m.C_rangedIn = Constraint(expr=inequality(m.a,m.x,m.b)) m.C_equal = Constraint(expr=m.y==m.b) m.C_singleBnd = Constraint(expr=m.x<=m.b) return m if __name__=='__main__': m = create_model() m.pert_a = Param(initialize=0.01) m.pert_b = Param(initialize=1.01) m_sipopt = sipopt(m,[m.a,m.b],[m.pert_a,m.pert_b], streamSoln=True)
def test_noClone_soln(self): m_orig = fc.create_model() fc.initialize_model(m_orig, 100) m_orig.perturbed_a = Param(initialize=-0.25) m_orig.perturbed_H = Param(initialize=0.55) m_sipopt = sipopt(m_orig, [m_orig.a, m_orig.H], [m_orig.perturbed_a, m_orig.perturbed_H], cloneModel=False) self.assertTrue(m_sipopt == m_orig) #test _sipopt_data block exists self.assertTrue( hasattr(m_orig, '_sipopt_data') and m_orig._sipopt_data.type() is Block) #test variable declaration self.assertTrue( hasattr(m_sipopt._sipopt_data, 'a') and m_sipopt._sipopt_data.a.type() is Var) self.assertTrue( hasattr(m_sipopt._sipopt_data, 'H') and m_sipopt._sipopt_data.H.type() is Var) #test for suffixes self.assertTrue( hasattr(m_sipopt, 'sens_state_0') and m_sipopt.sens_state_0.type() is Suffix and m_sipopt.sens_state_0[m_sipopt._sipopt_data.H] == 2 and m_sipopt.sens_state_0[m_sipopt._sipopt_data.a] == 1) self.assertTrue( hasattr(m_sipopt, 'sens_state_1') and m_sipopt.sens_state_1.type() is Suffix and m_sipopt.sens_state_1[m_sipopt._sipopt_data.H] == 2 and m_sipopt.sens_state_1[m_sipopt._sipopt_data.a] == 1) self.assertTrue( hasattr(m_sipopt, 'sens_state_value_1') and m_sipopt.sens_state_value_1.type() is Suffix and m_sipopt.sens_state_value_1[m_sipopt._sipopt_data.H] == 0.55 and m_sipopt.sens_state_value_1[m_sipopt._sipopt_data.a] == -0.25) self.assertTrue( hasattr(m_sipopt, 'sens_init_constr') and m_sipopt.sens_init_constr.type() is Suffix and m_sipopt.sens_init_constr[m_sipopt._sipopt_data.paramConst[1]] == 1 and m_sipopt.sens_init_constr[m_sipopt._sipopt_data.paramConst[2]] == 2) self.assertTrue( hasattr(m_sipopt, 'sens_sol_state_1') and m_sipopt.sens_sol_state_1.type() is Suffix) self.assertAlmostEqual(m_sipopt.sens_sol_state_1[m_sipopt.F[15]], -0.00102016765, 8) self.assertTrue( hasattr(m_sipopt, 'sens_sol_state_1_z_L') and m_sipopt.sens_sol_state_1_z_L.type() is Suffix) self.assertAlmostEqual(m_sipopt.sens_sol_state_1_z_L[m_sipopt.u[15]], -2.181712e-09, 13) self.assertTrue( hasattr(m_sipopt, 'sens_sol_state_1_z_U') and m_sipopt.sens_sol_state_1_z_U.type() is Suffix) self.assertAlmostEqual(m_sipopt.sens_sol_state_1_z_U[m_sipopt.u[15]], 6.580899e-09, 13) #verify deactivated constraints on model self.assertFalse(m_sipopt.FDiffCon[0].active and m_sipopt.FDiffCon[7.5].active and m_sipopt.FDiffCon[15].active) self.assertFalse(m_sipopt.x_dot[0].active and m_sipopt.x_dot[7.5].active and m_sipopt.x_dot[15].active) #test model solution self.assertAlmostEqual(value(m_sipopt.J), 0.0048956783, 8)
def test_clonedModel_soln(self): m_orig = fc.create_model() fc.initialize_model(m_orig, 100) m_orig.perturbed_a = Param(initialize=-0.25) m_orig.perturbed_H = Param(initialize=0.55) m_sipopt = sipopt(m_orig, [m_orig.a, m_orig.H], [m_orig.perturbed_a, m_orig.perturbed_H], cloneModel=True) #verify cloned model has _sipopt_data block # and original model is untouched self.assertFalse(m_sipopt == m_orig) self.assertTrue( hasattr(m_sipopt, '_sipopt_data') and m_sipopt._sipopt_data.ctype is Block) self.assertFalse(hasattr(m_orig, '_sipopt_data')) self.assertFalse(hasattr(m_orig, 'b')) #verify variable declaration self.assertTrue( hasattr(m_sipopt._sipopt_data, 'a') and m_sipopt._sipopt_data.a.ctype is Var) self.assertTrue( hasattr(m_sipopt._sipopt_data, 'H') and m_sipopt._sipopt_data.H.ctype is Var) #verify suffixes self.assertTrue( hasattr(m_sipopt, 'sens_state_0') and m_sipopt.sens_state_0.ctype is Suffix and m_sipopt.sens_state_0[m_sipopt._sipopt_data.H] == 2 and m_sipopt.sens_state_0[m_sipopt._sipopt_data.a] == 1) self.assertTrue( hasattr(m_sipopt, 'sens_state_1') and m_sipopt.sens_state_1.ctype is Suffix and m_sipopt.sens_state_1[m_sipopt._sipopt_data.H] == 2 and m_sipopt.sens_state_1[m_sipopt._sipopt_data.a] == 1) self.assertTrue( hasattr(m_sipopt, 'sens_state_value_1') and m_sipopt.sens_state_value_1.ctype is Suffix and m_sipopt.sens_state_value_1[m_sipopt._sipopt_data.H] == 0.55 and m_sipopt.sens_state_value_1[m_sipopt._sipopt_data.a] == -0.25) self.assertTrue( hasattr(m_sipopt, 'sens_init_constr') and m_sipopt.sens_init_constr.ctype is Suffix and m_sipopt.sens_init_constr[m_sipopt._sipopt_data.paramConst[1]] == 1 and m_sipopt.sens_init_constr[m_sipopt._sipopt_data.paramConst[2]] == 2) self.assertTrue( hasattr(m_sipopt, 'sens_sol_state_1') and m_sipopt.sens_sol_state_1.ctype is Suffix) self.assertAlmostEqual(m_sipopt.sens_sol_state_1[m_sipopt.F[15]], -0.00102016765, 8) self.assertTrue( hasattr(m_sipopt, 'sens_sol_state_1_z_L') and m_sipopt.sens_sol_state_1_z_L.ctype is Suffix) self.assertAlmostEqual(m_sipopt.sens_sol_state_1_z_L[m_sipopt.u[15]], -2.181712e-09, 13) self.assertTrue( hasattr(m_sipopt, 'sens_sol_state_1_z_U') and m_sipopt.sens_sol_state_1_z_U.ctype is Suffix) self.assertAlmostEqual(m_sipopt.sens_sol_state_1_z_U[m_sipopt.u[15]], 6.580899e-09, 13) #verify deactivated constraints for cloned model self.assertFalse(m_sipopt.FDiffCon[0].active and m_sipopt.FDiffCon[7.5].active and m_sipopt.FDiffCon[15].active) self.assertFalse(m_sipopt.x_dot[0].active and m_sipopt.x_dot[7.5].active and m_sipopt.x_dot[15].active) #verify constraints on original model are still active self.assertTrue(m_orig.FDiffCon[0].active and m_orig.FDiffCon[7.5].active and m_orig.FDiffCon[15].active) self.assertTrue(m_orig.x_dot[0].active and m_orig.x_dot[7.5].active and m_orig.x_dot[15].active) #verify solution self.assertAlmostEqual(value(m_sipopt.J), 0.0048956783, 8)
m = create_model() initialize_model(m,10,5,1) m.epsDelta = Param(initialize = 0.75001) q_del={} q_del[(0,0)] = 1.001 q_del[(0,1)] = 1.002 q_del[(1,0)] = 1.003 q_del[(1,1)] = 1.004 q_del[(2,0)] = 0.83001 q_del[(2,1)] = 0.83002 q_del[(3,0)] = 0.42001 q_del[(4,0)] = 0.17001 m.qqDelta = Param(m.ij, initialize=q_del) m.aaDelta = Param(initialize = .0001001) m_sipopt = sipopt(m,[m.eps,m.qq,m.aa], [m.epsDelta,m.qqDelta,m.aaDelta], streamSoln = True)