def test_perturb_parameters_indexed(self): delta = 1.0 model = make_indexed_model() param_list = [model.eta] model.perturbed_eta = Param( [1, 2], mutable=True, initialize={i: p.value + delta for i, p in model.eta.items()}) ptb_list = [model.perturbed_eta] sens = SensitivityInterface(model, clone_model=False) sens.setup_sensitivity(param_list) sens.perturb_parameters(ptb_list) instance = sens.model_instance block = sens.block param_var_map = ComponentMap( (param, var) for var, param, _, _ in sens.block._sens_data_list) param_con_map = ComponentMap( (param, block.paramConst[i + 1]) for i, (_, param, _, _) in enumerate(sens.block._sens_data_list)) for param, ptb in zip(param_list, ptb_list): for idx in param: obj = param[idx] ptb_data = ptb[idx] var = param_var_map[obj] con = param_con_map[obj] self.assertEqual(instance.sens_state_value_1[var], ptb_data.value) self.assertEqual(instance.DeltaP[con], -delta)
def test_clear_dir_dot_sens(self): m = simple_model_1() sens = SensitivityInterface(m, clone_model=False) k_aug = K_augInterface() opt_ipopt.solve(m, tee=True) m.ptb = pyo.Param(mutable=True, initialize=1.5) cwd = os.getcwd() dir_contents = os.listdir(cwd) sens_param = [m.p] sens.setup_sensitivity(sens_param) # Call k_aug k_aug.k_aug(m, tee=True) self.assertIsInstance(k_aug.data["dsdp_in_.in"], str) sens.perturb_parameters([m.ptb]) # Call dot_sens. In the process, we re-write dsdp_in_.in k_aug.dot_sens(m, tee=True) # Make sure we get the values we expect. This problem is easy enough # to solve by hand: # x = [1, 1, -2] = [v1, v2, dual] # Sensitivity system: # | 2 -2 1 | # |-2 2 1 | dx/dp = -[dL/dxdp, dc/dp]^T = -[0, 0, -1]^T # | 1 1 0 | # => dx/dp = [0.5, 0.5, 0]^T # Here, dp = [0.5] # => dx = [0.25, 0.25, 0]^T # => x_new = [1.25, 1.25, -2] self.assertAlmostEqual(m.v1.value, 1.25, 7) self.assertAlmostEqual(m.v2.value, 1.25, 7) # We are back in our working directory self.assertEqual(cwd, os.getcwd()) # The contents of this directory have not changed self.assertEqual(dir_contents, os.listdir(cwd)) self.assertFalse(os.path.exists("dsdp_in_.in")) self.assertFalse(os.path.exists("delta_p.out")) self.assertFalse(os.path.exists("dot_out.out")) self.assertFalse(os.path.exists("timings_dot_driver_dsdp.txt")) # And we have saved strings of the file contents. self.assertIsInstance(k_aug.data["dsdp_in_.in"], str) self.assertIsInstance(k_aug.data["delta_p.out"], str) self.assertIsInstance(k_aug.data["dot_out.out"], str) self.assertIsInstance(k_aug.data["timings_dot_driver_dsdp.txt"], str)
def test_perturb_indexed_parameters_with_scalar(self): model = make_indexed_model() param_list = [model.eta] ptb_list = [10.0] sens = SensitivityInterface(model, clone_model=False) sens.setup_sensitivity(param_list) sens.perturb_parameters(ptb_list) instance = sens.model_instance block = sens.block param_var_map = ComponentMap( (param, var) for var, param, _, _ in sens.block._sens_data_list) param_con_map = ComponentMap( (param, block.paramConst[i + 1]) for i, (_, param, _, _) in enumerate(sens.block._sens_data_list)) for param, ptb in zip(param_list, ptb_list): for idx in param: obj = param[idx] var = param_var_map[obj] con = param_con_map[obj] self.assertEqual(instance.sens_state_value_1[var], ptb) self.assertEqual(instance.DeltaP[con], obj.value - ptb)