Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setup Framework to Log Infeasible Constraints for User #336

Merged
merged 4 commits into from
May 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/dispatch/pyomo_dispatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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: <undefined>
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<HERON>
<TestInfo>
<name>InfeasibleConstraints</name>
<author>dylanjm</author>
<created>2024-01-25</created>
<description>
Tests HERON violating contraints and the resulting constraints_violations.log file.
</description>
<classesTested>HERON</classesTested>
</TestInfo>

<Case name="Sweep_Runs">
<mode>sweep</mode>
<num_arma_samples>2</num_arma_samples>
<time_discretization>
<time_variable>Time</time_variable>
<end_time>2</end_time>
<num_steps>21</num_steps>
</time_discretization>
<economics>
<ProjectTime>3</ProjectTime>
<DiscountRate>0.08</DiscountRate>
<tax>0.0</tax>
<inflation>0.0</inflation>
</economics>
<dispatcher><pyomo/></dispatcher>
</Case>

<Components>
<Component name="Generator">
<produces resource="electricity" dispatch="fixed">
<capacity resource="electricity">
<sweep_values>1095,1098</sweep_values> <!-- Here we are purposely under-specifying capacity to force a failure -->
</capacity>
</produces>
<economics>
<lifetime>27</lifetime>
</economics>
</Component>

<Component name="Electric_Grid_1">
<demands resource="electricity" dispatch="fixed">
<capacity>
<fixed_value>-2e4</fixed_value> <!-- Dispatch is fixed at 2000, meaning we should fall short by 5, 3 units respectively and that should show up in the contraint log" -->
</capacity>
</demands>
<economics>
<lifetime>3</lifetime>
<CashFlow name="e_sales" type="repeating" taxable='True' inflation='none' mult_target='False'>
<driver>
<activity>electricity</activity>
<multiplier>-1</multiplier>
</driver>
<reference_price>
<fixed_value>10.0</fixed_value>
</reference_price>
<reference_driver>
<fixed_value>1</fixed_value>
</reference_driver>
<scaling_factor_x>
<fixed_value>1</fixed_value>
</scaling_factor_x>
</CashFlow>
</economics>
</Component>
</Components>

<DataGenerators>
<ARMA name='Speed' variable="Signal">%HERON_DATA%/TSA/Sine/arma.pk</ARMA>
</DataGenerators>

</HERON>
13 changes: 13 additions & 0 deletions tests/integration_tests/mechanics/infeasible_constraints/tests
Original file line number Diff line number Diff line change
@@ -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'
[../]
[../]

[]
Loading