import itertools import pyomo.common.unittest as unittest from pyomo.common.collections import ComponentSet, ComponentMap from pyomo.core.expr.visitor import identify_variables import pyomo.environ as pyo from pyomo.contrib.pynumero.dependencies import (numpy as np, numpy_available, scipy, scipy_available) if not (numpy_available and scipy_available): raise unittest.SkipTest("Pynumero needs scipy and numpy to run NLP tests") from pyomo.common.dependencies.scipy import sparse as sps from pyomo.contrib.pynumero.asl import AmplInterface if not AmplInterface.available(): raise unittest.SkipTest( "Pynumero needs the ASL extension to run cyipopt tests") from pyomo.contrib.pynumero.algorithms.solvers.cyipopt_solver import ( cyipopt_available, ) from pyomo.contrib.pynumero.interfaces.external_pyomo_model import ( ExternalPyomoModel, get_hessian_of_constraint, ) from pyomo.contrib.pynumero.interfaces.external_grey_box import ( ExternalGreyBoxBlock, ScalarExternalGreyBoxBlock, IndexedExternalGreyBoxBlock, ) from pyomo.contrib.pynumero.interfaces.pyomo_grey_box_nlp import (
# ___________________________________________________________________________ import pyutilib.th as unittest import pyomo.environ as pyo from pyomo.opt import check_optimal_termination from pyomo.common.dependencies import attempt_import np, numpy_available = attempt_import('numpy', 'inverse_reduced_hessian numpy', minimum_version='1.13.0') scipy, scipy_available = attempt_import( 'scipy', 'inverse_reduced_hessian requires scipy') if numpy_available: from pyomo.contrib.pynumero.asl import AmplInterface asl_available = AmplInterface.available() else: asl_available = False if not (numpy_available and scipy_available and asl_available): raise unittest.SkipTest( 'inverse_reduced_hessian tests require numpy, scipy, and asl') from pyomo.common.dependencies import (pandas as pd, pandas_available) ipopt_solver = pyo.SolverFactory('ipopt') if not ipopt_solver.available(exception_flag=False): raise unittest.SkipTest('ipopt is not available') numdiff_available = True try: import numdifftools as nd
return m.P[i] / m.P[i - 1] - (m.rho[i] / m.rho[i - 1])**m.gamma == 0 m.expansion = pyo.Constraint(m.streams, rule=expansion) def ideal_gas(m, i): return m.P[i] - m.rho[i] * m.R * m.T[i] == 0 m.ideal_gas = pyo.Constraint(m.streams, rule=ideal_gas) return m @unittest.skipUnless(networkx_available, "networkx is not available.") @unittest.skipUnless(scipy_available, "scipy is not available.") @unittest.skipUnless(AmplInterface.available(), "pynumero_ASL is not available") class TestGasExpansionNumericIncidenceMatrix(unittest.TestCase): """ This class tests the get_numeric_incidence_matrix function on the gas expansion model. """ def test_incidence_matrix(self): N = 5 model = make_gas_expansion_model(N) all_vars = list(model.component_data_objects(pyo.Var)) all_cons = list(model.component_data_objects(pyo.Constraint)) imat = get_numeric_incidence_matrix(all_vars, all_cons) n_var = 4 * (N + 1) n_con = 4 * N + 1 self.assertEqual(imat.shape, (n_con, n_var))