diff --git a/src/dispatch/pyomo_dispatch.py b/src/dispatch/pyomo_dispatch.py index ce31c361..9d6d9695 100644 --- a/src/dispatch/pyomo_dispatch.py +++ b/src/dispatch/pyomo_dispatch.py @@ -3,13 +3,16 @@ """ pyomo-based dispatch strategy """ +import os import time as time_mod import pprint import numpy as np import pyutilib.subprocess.GlobalData +import logging import pyomo.environ as pyo from pyomo.opt import SolverStatus, TerminationCondition +from pyomo.util.infeasible import log_infeasible_constraints from ravenframework.utils import InputData, InputTypes from . import putils @@ -318,8 +321,11 @@ def _solve_dispatch(self, m, meta): putils.debug_pyomo_print(m.model) print('Resource Map:') pprint.pprint(m.model.resource_index_map) + log_infeasible_constraints(m.model, log_expression=True, log_variables=True) + log_name = 'constraint_violations.log' + logging.basicConfig(filename=log_name, encoding='utf-8', level=logging.INFO) raise DispatchError( - f"Solve was unsuccessful! Status: {soln.solver.status} Termination: {soln.solver.termination_condition}" + f'Solve was unsuccessful, see log file located at: "{os.getcwd()}/{log_name}" for more details! Status: {soln.solver.status} Termination: {soln.solver.termination_condition}' ) # try validating diff --git a/tests/integration_tests/mechanics/infeasible_constraints/gold/Sweep_Runs_o/sweep/1/Sweep_Runs_i/constraint_violations.log b/tests/integration_tests/mechanics/infeasible_constraints/gold/Sweep_Runs_o/sweep/1/Sweep_Runs_i/constraint_violations.log new file mode 100644 index 00000000..8d95c660 --- /dev/null +++ b/tests/integration_tests/mechanics/infeasible_constraints/gold/Sweep_Runs_o/sweep/1/Sweep_Runs_i/constraint_violations.log @@ -0,0 +1,87 @@ +WARNING:pyomo.core:Loading a SolverResults object with a warning status into model.name="unknown"; + - termination condition: infeasible + - message from solver: +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[0]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,0] + Electric_Grid_1_production[0,0] =/= 0.0 + - VAR Generator_production[0,0]: 1095.0 + - VAR Electric_Grid_1_production[0,0]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[1]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,1] + Electric_Grid_1_production[0,1] =/= 0.0 + - VAR Generator_production[0,1]: 1095.0 + - VAR Electric_Grid_1_production[0,1]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[2]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,2] + Electric_Grid_1_production[0,2] =/= 0.0 + - VAR Generator_production[0,2]: 1095.0 + - VAR Electric_Grid_1_production[0,2]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[3]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,3] + Electric_Grid_1_production[0,3] =/= 0.0 + - VAR Generator_production[0,3]: 1095.0 + - VAR Electric_Grid_1_production[0,3]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[4]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,4] + Electric_Grid_1_production[0,4] =/= 0.0 + - VAR Generator_production[0,4]: 1095.0 + - VAR Electric_Grid_1_production[0,4]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[5]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,5] + Electric_Grid_1_production[0,5] =/= 0.0 + - VAR Generator_production[0,5]: 1095.0 + - VAR Electric_Grid_1_production[0,5]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[6]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,6] + Electric_Grid_1_production[0,6] =/= 0.0 + - VAR Generator_production[0,6]: 1095.0 + - VAR Electric_Grid_1_production[0,6]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[7]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,7] + Electric_Grid_1_production[0,7] =/= 0.0 + - VAR Generator_production[0,7]: 1095.0 + - VAR Electric_Grid_1_production[0,7]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[8]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,8] + Electric_Grid_1_production[0,8] =/= 0.0 + - VAR Generator_production[0,8]: 1095.0 + - VAR Electric_Grid_1_production[0,8]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[9]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,9] + Electric_Grid_1_production[0,9] =/= 0.0 + - VAR Generator_production[0,9]: 1095.0 + - VAR Electric_Grid_1_production[0,9]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[10]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,10] + Electric_Grid_1_production[0,10] =/= 0.0 + - VAR Generator_production[0,10]: 1095.0 + - VAR Electric_Grid_1_production[0,10]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[11]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,11] + Electric_Grid_1_production[0,11] =/= 0.0 + - VAR Generator_production[0,11]: 1095.0 + - VAR Electric_Grid_1_production[0,11]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[12]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,12] + Electric_Grid_1_production[0,12] =/= 0.0 + - VAR Generator_production[0,12]: 1095.0 + - VAR Electric_Grid_1_production[0,12]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[13]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,13] + Electric_Grid_1_production[0,13] =/= 0.0 + - VAR Generator_production[0,13]: 1095.0 + - VAR Electric_Grid_1_production[0,13]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[14]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,14] + Electric_Grid_1_production[0,14] =/= 0.0 + - VAR Generator_production[0,14]: 1095.0 + - VAR Electric_Grid_1_production[0,14]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[15]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,15] + Electric_Grid_1_production[0,15] =/= 0.0 + - VAR Generator_production[0,15]: 1095.0 + - VAR Electric_Grid_1_production[0,15]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[16]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,16] + Electric_Grid_1_production[0,16] =/= 0.0 + - VAR Generator_production[0,16]: 1095.0 + - VAR Electric_Grid_1_production[0,16]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[17]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,17] + Electric_Grid_1_production[0,17] =/= 0.0 + - VAR Generator_production[0,17]: 1095.0 + - VAR Electric_Grid_1_production[0,17]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[18]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,18] + Electric_Grid_1_production[0,18] =/= 0.0 + - VAR Generator_production[0,18]: 1095.0 + - VAR Electric_Grid_1_production[0,18]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[19]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,19] + Electric_Grid_1_production[0,19] =/= 0.0 + - VAR Generator_production[0,19]: 1095.0 + - VAR Electric_Grid_1_production[0,19]: -20000.0 +INFO:pyomo.util.infeasible:CONSTR electricity_conservation[20]: -18905.0 =/= 0.0 + - EXPR: Generator_production[0,20] + Electric_Grid_1_production[0,20] =/= 0.0 + - VAR Generator_production[0,20]: 1095.0 + - VAR Electric_Grid_1_production[0,20]: -20000.0 diff --git a/tests/integration_tests/mechanics/infeasible_constraints/heron_input.xml b/tests/integration_tests/mechanics/infeasible_constraints/heron_input.xml new file mode 100644 index 00000000..93f8ffa4 --- /dev/null +++ b/tests/integration_tests/mechanics/infeasible_constraints/heron_input.xml @@ -0,0 +1,72 @@ + + + InfeasibleConstraints + dylanjm + 2024-01-25 + + Tests HERON violating contraints and the resulting constraints_violations.log file. + + HERON + + + + sweep + 2 + + Time + 2 + 21 + + + 3 + 0.08 + 0.0 + 0.0 + + + + + + + + + 1095,1098 + + + + 27 + + + + + + + -2e4 + + + + 3 + + + electricity + -1 + + + 10.0 + + + 1 + + + 1 + + + + + + + + %HERON_DATA%/TSA/Sine/arma.pk + + + diff --git a/tests/integration_tests/mechanics/infeasible_constraints/tests b/tests/integration_tests/mechanics/infeasible_constraints/tests new file mode 100644 index 00000000..49a408da --- /dev/null +++ b/tests/integration_tests/mechanics/infeasible_constraints/tests @@ -0,0 +1,13 @@ +[Tests] + [./InfeasibleConstraints] + type = HeronIntegration + input = heron_input.xml + expected_fail = true + # prereq = SineArma + [./logfile] + type = Text + output = 'Sweep_Runs_o/sweep/1/Sweep_Runs_i/contraint_violations.log' + [../] + [../] + +[]