Esempio n. 1
0
 def test_nested_blocks(self):
     """Test with nested blocks."""
     m = ConcreteModel()
     m.b = Block()
     m.inactive_b = Block()
     m.inactive_b.deactivate()
     m.b.x = Var()
     m.b.x2 = Var(domain=Binary)
     m.b.x3 = Var(domain=Integers)
     m.inactive_b.x = Var()
     m.b.c = Constraint(expr=m.b.x == m.b.x2)
     m.inactive_b.c = Constraint(expr=m.b.x == 1)
     m.inactive_b.c2 = Constraint(expr=m.inactive_b.x == 15)
     model_size = build_model_size_report(m)
     self.assertEqual(model_size.activated.variables, 2)
     self.assertEqual(model_size.overall.variables, 4)
     self.assertEqual(model_size.activated.binary_variables, 1)
     self.assertEqual(model_size.overall.binary_variables, 1)
     self.assertEqual(model_size.activated.integer_variables, 0)
     self.assertEqual(model_size.overall.integer_variables, 1)
     self.assertEqual(model_size.activated.constraints, 1)
     self.assertEqual(model_size.overall.constraints, 3)
     self.assertEqual(model_size.activated.disjuncts, 0)
     self.assertEqual(model_size.overall.disjuncts, 0)
     self.assertEqual(model_size.activated.disjunctions, 0)
     self.assertEqual(model_size.overall.disjunctions, 0)
Esempio n. 2
0
def setup_results_object(solve_data, config):
    """Record problem statistics for original model."""
    # Create the solver results object
    res = solve_data.results
    prob = res.problem
    res.problem.name = solve_data.original_model.name
    res.problem.number_of_nonzeros = None  # TODO
    # TODO work on termination condition and message
    res.solver.termination_condition = None
    res.solver.message = None
    res.solver.user_time = None
    res.solver.system_time = None
    res.solver.wallclock_time = None
    res.solver.termination_message = None

    num_of = build_model_size_report(solve_data.original_model)

    # Get count of constraints and variables
    prob.number_of_constraints = num_of.activated.constraints
    prob.number_of_disjunctions = num_of.activated.disjunctions
    prob.number_of_variables = num_of.activated.variables
    prob.number_of_binary_variables = num_of.activated.binary_variables
    prob.number_of_continuous_variables = num_of.activated.continuous_variables
    prob.number_of_integer_variables = num_of.activated.integer_variables

    config.logger.info(
        "Original model has %s constraints (%s nonlinear) "
        "and %s disjunctions, "
        "with %s variables, of which %s are binary, %s are integer, "
        "and %s are continuous." %
        (num_of.activated.constraints, num_of.activated.nonlinear_constraints,
         num_of.activated.disjunctions, num_of.activated.variables,
         num_of.activated.binary_variables, num_of.activated.integer_variables,
         num_of.activated.continuous_variables))
Esempio n. 3
0
 def test_nine_process(self):
     """Test with the nine process problem model."""
     exfile = import_file(join(exdir, 'nine_process', 'small_process.py'))
     simple_model = exfile.build_model()
     simple_model_size = build_model_size_report(simple_model)
     self.assertEqual(simple_model_size.overall.variables, 34)
     self.assertEqual(simple_model_size.activated.variables, 34)
Esempio n. 4
0
def compute_model_stats():
    models_loaded_from_cache = _load_from_model_stats_cache()

    _failed_model_names = []
    for test_model in models.values():
        if test_model.name in models_loaded_from_cache:
            continue
        build_start_time = monotonic()
        try:
            pyomo_model = test_model.build_function()
        except Exception as err:
            print(
                f"Failed to build {test_model.name} due to exception: {err}.")
            print("Temporarily removing model from library.")
            _failed_model_names.append(test_model.name)
            continue
        build_end_time = monotonic()
        test_model.build_time = int(ceil(build_end_time - build_start_time))
        size_report = build_model_size_report(pyomo_model)
        # update test_model object with information from model size report
        test_model.update(size_report.activated)
        if test_model.model_type is None:
            test_model.model_type = _infer_model_type(test_model)
        # Determine objective sense
        active_obj = next(
            pyomo_model.component_data_objects(pyo.Objective, active=True))
        test_model.objective_sense = 'minimize' if active_obj.sense == pyo.minimize else 'maximize'

    for failed_model in _failed_model_names:
        del models[failed_model]

    # Cache the model stats
    _cache_model_stats()
Esempio n. 5
0
 def test_deactivated_variables(self):
     m = ConcreteModel()
     m.x = Var()
     m.y = Var()
     m.c = Constraint(expr=m.x >= 1)
     m.c2 = Constraint(expr=m.y <= 6)
     m.c2.deactivate()
     model_size = build_model_size_report(m)
     self.assertEqual(model_size.activated.variables, 1)
     self.assertEqual(model_size.overall.variables, 2)
Esempio n. 6
0
 def test_unassociated_disjunct(self):
     m = ConcreteModel()
     m.x = Var(domain=Integers)
     m.d = Disjunct()
     m.d.c = Constraint(expr=m.x == 1)
     m.d2 = Disjunct()
     m.d2.c = Constraint(expr=m.x == 5)
     m.disj = Disjunction(expr=[m.d2])
     model_size = build_model_size_report(m)
     self.assertEqual(model_size.warning.unassociated_disjuncts, 1)
Esempio n. 7
0
 def test_nonlinear(self):
     """Test nonlinear constraint detection."""
     m = ConcreteModel()
     m.x = Var()
     m.y = Var()
     m.z = Var()
     m.z.fix(3)
     m.c = Constraint(expr=m.x ** 2 == 4)
     m.c2 = Constraint(expr=m.x / m.y == 3)
     m.c3 = Constraint(expr=m.x * m.z == 5)
     m.c4 = Constraint(expr=m.x * m.y == 5)
     m.c4.deactivate()
     model_size = build_model_size_report(m)
     self.assertEqual(model_size.activated.nonlinear_constraints, 2)
     self.assertEqual(model_size.overall.nonlinear_constraints, 3)
Esempio n. 8
0
 def test_disjunctive_model(self):
     from pyomo.gdp.tests.models import makeNestedDisjunctions
     m = makeNestedDisjunctions()
     model_size = build_model_size_report(m)
     self.assertEqual(model_size.activated.variables, 10)
     self.assertEqual(model_size.overall.variables, 10)
     self.assertEqual(model_size.activated.binary_variables, 7)
     self.assertEqual(model_size.overall.binary_variables, 7)
     self.assertEqual(model_size.activated.integer_variables, 0)
     self.assertEqual(model_size.overall.integer_variables, 0)
     self.assertEqual(model_size.activated.constraints, 6)
     self.assertEqual(model_size.overall.constraints, 6)
     self.assertEqual(model_size.activated.disjuncts, 7)
     self.assertEqual(model_size.overall.disjuncts, 7)
     self.assertEqual(model_size.activated.disjunctions, 3)
     self.assertEqual(model_size.overall.disjunctions, 3)
Esempio n. 9
0
 def test_constrained_layout(self):
     """Test with the constrained layout GDP model."""
     exfile = import_file(join(
         exdir, 'constrained_layout', 'cons_layout_model.py'))
     model = exfile.build_constrained_layout_model()
     model_size = build_model_size_report(model)
     self.assertEqual(model_size.activated.variables, 30)
     self.assertEqual(model_size.overall.variables, 30)
     self.assertEqual(model_size.activated.binary_variables, 18)
     self.assertEqual(model_size.overall.binary_variables, 18)
     self.assertEqual(model_size.activated.integer_variables, 0)
     self.assertEqual(model_size.overall.integer_variables, 0)
     self.assertEqual(model_size.activated.constraints, 48)
     self.assertEqual(model_size.overall.constraints, 48)
     self.assertEqual(model_size.activated.disjuncts, 18)
     self.assertEqual(model_size.overall.disjuncts, 18)
     self.assertEqual(model_size.activated.disjunctions, 6)
     self.assertEqual(model_size.overall.disjunctions, 6)
Esempio n. 10
0
 def test_eight_process(self):
     """Test with the eight process problem model."""
     exfile = import_file(
         join(exdir, 'eight_process', 'eight_proc_model.py'))
     eight_process = exfile.build_eight_process_flowsheet()
     model_size = build_model_size_report(eight_process)
     self.assertEqual(model_size.activated.variables, 44)
     self.assertEqual(model_size.overall.variables, 44)
     self.assertEqual(model_size.activated.binary_variables, 12)
     self.assertEqual(model_size.overall.binary_variables, 12)
     self.assertEqual(model_size.activated.integer_variables, 0)
     self.assertEqual(model_size.overall.integer_variables, 0)
     self.assertEqual(model_size.activated.constraints, 52)
     self.assertEqual(model_size.overall.constraints, 52)
     self.assertEqual(model_size.activated.disjuncts, 12)
     self.assertEqual(model_size.overall.disjuncts, 12)
     self.assertEqual(model_size.activated.disjunctions, 5)
     self.assertEqual(model_size.overall.disjunctions, 5)
Esempio n. 11
0
def compute_model_stats(only_models: Set[str] = ()):
    models_loaded_from_cache = _load_from_model_stats_cache()

    _failed_model_names = []
    uncached_models = False
    for test_model in models.values():
        if test_model.name in models_loaded_from_cache:
            continue
        if only_models and test_model.name not in only_models:
            continue
        # Model is not already in the cache. Compute its statistics.
        print(f"Model '{test_model.name}' is not in the cache. "
              "Building the model and computing its statistics now. "
              "This may take some time for larger models.")
        uncached_models = True
        build_start_time = monotonic()
        try:
            pyomo_model = test_model.build_function()
        except Exception as err:
            print(f"Failed to build {test_model.name} due to exception: {err}.")
            print("Temporarily removing model from library.")
            _failed_model_names.append(test_model.name)
            continue
        build_end_time = monotonic()
        test_model.build_time = int(ceil(build_end_time - build_start_time))
        size_report = build_model_size_report(pyomo_model)
        # update test_model object with information from model size report
        test_model.update(size_report.activated)
        if test_model.model_type is None:
            test_model.model_type = _infer_model_type(test_model)
        # Determine objective sense
        active_obj = next(pyomo_model.component_data_objects(pyo.Objective, active=True))
        test_model.objective_sense = 'minimize' if active_obj.sense == pyo.minimize else 'maximize'

    for failed_model in _failed_model_names:
        del models[failed_model]

    # Cache the model stats
    if uncached_models:
        _cache_model_stats()
Esempio n. 12
0
 def setup_results_object(self, solve_data, model, config):
     solve_data.results.solver.name = 'GDPbb - %s' % (str(config.solver))
     num_of = build_model_size_report(model)
     prob = solve_data.results.problem
     prob.name = model.name
     prob.number_of_constraints = num_of.activated.constraints
     prob.number_of_disjunctions = num_of.activated.disjunctions
     prob.number_of_variables = num_of.activated.variables
     prob.number_of_binary_variables = num_of.activated.binary_variables
     prob.number_of_continuous_variables = num_of.activated.continuous_variables
     prob.number_of_integer_variables = num_of.activated.integer_variables
     config.logger.info(
         "Original model has %s constraints (%s nonlinear) "
         "and %s disjunctions, "
         "with %s variables, of which %s are binary, %s are integer, "
         "and %s are continuous." %
         (num_of.activated.constraints,
          num_of.activated.nonlinear_constraints,
          num_of.activated.disjunctions, num_of.activated.variables,
          num_of.activated.binary_variables,
          num_of.activated.integer_variables,
          num_of.activated.continuous_variables))
Esempio n. 13
0
def setup_results_object(solve_data, config):
    """Record problem statistics for original model."""
    # Create the solver results object
    res = solve_data.results
    prob = res.problem
    res.problem.name = solve_data.original_model.name
    res.problem.number_of_nonzeros = None  # TODO
    # TODO work on termination condition and message
    res.solver.termination_condition = None
    res.solver.message = None
    res.solver.user_time = None
    res.solver.system_time = None
    res.solver.wallclock_time = None
    res.solver.termination_message = None

    num_of = build_model_size_report(solve_data.original_model)

    # Get count of constraints and variables
    prob.number_of_constraints = num_of.activated.constraints
    prob.number_of_disjunctions = num_of.activated.disjunctions
    prob.number_of_variables = num_of.activated.variables
    prob.number_of_binary_variables = num_of.activated.binary_variables
    prob.number_of_continuous_variables = num_of.activated.continuous_variables
    prob.number_of_integer_variables = num_of.activated.integer_variables

    config.logger.info(
        "Original model has %s constraints (%s nonlinear) "
        "and %s disjunctions, "
        "with %s variables, of which %s are binary, %s are integer, "
        "and %s are continuous." %
        (num_of.activated.constraints,
         num_of.activated.nonlinear_constraints,
         num_of.activated.disjunctions,
         num_of.activated.variables,
         num_of.activated.binary_variables,
         num_of.activated.integer_variables,
         num_of.activated.continuous_variables))
Esempio n. 14
0
 def test_empty_model(self):
     """Test with an empty model."""
     empty_model = ConcreteModel()
     model_size = build_model_size_report(empty_model)
     for obj in model_size.activated.values():
         self.assertEqual(obj, 0)