Esempio n. 1
0
 def test_var_bound_propagate_revert(self):
     """Test to make sure bound propagation revert works."""
     m = ConcreteModel()
     m.v1 = Var(initialize=1, bounds=(1, 3))
     m.v2 = Var(initialize=2, bounds=(0, 8))
     m.v3 = Var(initialize=3, bounds=(2, 4))
     m.v4 = Var(initialize=4, bounds=(0, 5))
     m.c1 = Constraint(expr=m.v1 == m.v2)
     m.c2 = Constraint(expr=m.v2 == m.v3)
     m.c3 = Constraint(expr=m.v3 == m.v4)
     xfrm = TransformationFactory('contrib.propagate_eq_var_bounds')
     xfrm.apply_to(m, tmp=True)
     self.assertEquals(value(m.v1.lb), 2)
     self.assertEquals(value(m.v1.lb), value(m.v2.lb))
     self.assertEquals(value(m.v1.lb), value(m.v3.lb))
     self.assertEquals(value(m.v1.lb), value(m.v4.lb))
     self.assertEquals(value(m.v1.ub), 3)
     self.assertEquals(value(m.v1.ub), value(m.v2.ub))
     self.assertEquals(value(m.v1.ub), value(m.v3.ub))
     self.assertEquals(value(m.v1.ub), value(m.v4.ub))
     xfrm.revert(m)
     self.assertEquals(value(m.v1.lb), 1)
     self.assertEquals(value(m.v2.lb), 0)
     self.assertEquals(value(m.v3.lb), 2)
     self.assertEquals(value(m.v4.lb), 0)
     self.assertEquals(value(m.v1.ub), 3)
     self.assertEquals(value(m.v2.ub), 8)
     self.assertEquals(value(m.v3.ub), 4)
     self.assertEquals(value(m.v4.ub), 5)
Esempio n. 2
0
    def test_fixed_var_revert(self):
        """Test for reversion of fixed variables."""
        m = ConcreteModel()
        m.v1 = Var(initialize=1)
        m.v2 = Var(initialize=2)
        m.v1.setub(2)
        m.v1.setlb(2)

        xfrm = TransformationFactory('contrib.detect_fixed_vars')
        xfrm.apply_to(m, tmp=True)
        self.assertTrue(m.v1.fixed)
        self.assertFalse(m.v2.fixed)
        xfrm.revert(m)
        self.assertFalse(m.v1.fixed)
        self.assertEqual(value(m.v1), 1)
    def test_deactivate_trivial_constraints_revert(self):
        """Test for reversion of trivial constraint deactivation."""
        m = ConcreteModel()
        m.v1 = Var(initialize=1)
        m.v2 = Var(initialize=2)
        m.v3 = Var(initialize=3)
        m.c = Constraint(expr=m.v1 <= m.v2)
        m.c2 = Constraint(expr=m.v2 >= m.v3)
        m.c3 = Constraint(expr=m.v1 <= 5)
        m.v1.fix()

        xfrm = TransformationFactory(
            'contrib.deactivate_trivial_constraints')
        xfrm.apply_to(m, tmp=True)
        self.assertTrue(m.c.active)
        self.assertTrue(m.c2.active)
        self.assertFalse(m.c3.active)

        xfrm.revert(m)
        self.assertTrue(m.c3.active)
Esempio n. 4
0
 def test_var_fix_revert(self):
     """Test to make sure that variable fixing reversion works."""
     m = ConcreteModel()
     m.v1 = Var(initialize=1)
     m.v2 = Var(initialize=2)
     m.v3 = Var(initialize=3)
     m.v4 = Var(initialize=4)
     m.c1 = Constraint(expr=m.v1 == m.v2)
     m.c2 = Constraint(expr=m.v2 == m.v3)
     m.c3 = Constraint(expr=m.v3 == m.v4)
     m.v2.fix()
     fvp = TransformationFactory('contrib.propagate_fixed_vars')
     fvp.apply_to(m, tmp=True)
     self.assertTrue(m.v1.fixed)
     self.assertTrue(m.v2.fixed)
     self.assertTrue(m.v3.fixed)
     self.assertTrue(m.v4.fixed)
     fvp.revert(m)
     self.assertFalse(m.v1.fixed)
     self.assertTrue(m.v2.fixed)
     self.assertFalse(m.v3.fixed)
     self.assertFalse(m.v4.fixed)
Esempio n. 5
0
 def test_var_fix_revert(self):
     """Test to make sure that variable fixing reversion works."""
     m = ConcreteModel()
     m.v1 = Var(initialize=1)
     m.v2 = Var(initialize=2)
     m.v3 = Var(initialize=3)
     m.v4 = Var(initialize=4)
     m.c1 = Constraint(expr=m.v1 == m.v2)
     m.c2 = Constraint(expr=m.v2 == m.v3)
     m.c3 = Constraint(expr=m.v3 == m.v4)
     m.v2.fix()
     fvp = TransformationFactory('contrib.propagate_fixed_vars')
     fvp.apply_to(m, tmp=True)
     self.assertTrue(m.v1.fixed)
     self.assertTrue(m.v2.fixed)
     self.assertTrue(m.v3.fixed)
     self.assertTrue(m.v4.fixed)
     fvp.revert(m)
     self.assertFalse(m.v1.fixed)
     self.assertTrue(m.v2.fixed)
     self.assertFalse(m.v3.fixed)
     self.assertFalse(m.v4.fixed)
Esempio n. 6
0
    def test_no_strip_domain(self):
        """Test bounds stripping without domain change."""
        m = ConcreteModel()
        m.v0 = Var(bounds=(2, 4))
        m.v1 = Var(domain=NonNegativeReals)
        m.v2 = Var(domain=PositiveReals)
        m.v3 = Var(bounds=(-1, 1))
        m.v4 = Var(domain=Binary)
        m.v5 = Var(domain=Integers, bounds=(15, 16))

        xfrm = TransformationFactory('contrib.strip_var_bounds')
        xfrm.apply_to(m, strip_domains=False, reversible=True)
        self.assertEqual(m.v0.bounds, (None, None))
        self.assertEqual(m.v1.bounds, (0, None))
        self.assertEqual(m.v2.bounds, (0, None))
        self.assertEqual(m.v3.bounds, (None, None))
        self.assertEqual(m.v4.bounds, (0, 1))
        self.assertEqual(m.v5.bounds, (None, None))
        self.assertEqual(m.v0.domain, Reals)
        self.assertEqual(m.v1.domain, NonNegativeReals)
        self.assertEqual(m.v2.domain, PositiveReals)
        self.assertEqual(m.v3.domain, Reals)
        self.assertEqual(m.v4.domain, Binary)
        self.assertEqual(m.v5.domain, Integers)

        xfrm.revert(m)
        self.assertEqual(m.v0.bounds, (2, 4))
        self.assertEqual(m.v1.bounds, (0, None))
        self.assertEqual(m.v2.bounds, (0, None))
        self.assertEqual(m.v3.bounds, (-1, 1))
        self.assertEqual(m.v4.bounds, (0, 1))
        self.assertEqual(m.v5.bounds, (15, 16))
        self.assertEqual(m.v0.domain, Reals)
        self.assertEqual(m.v1.domain, NonNegativeReals)
        self.assertEqual(m.v2.domain, PositiveReals)
        self.assertEqual(m.v3.domain, Reals)
        self.assertEqual(m.v4.domain, Binary)
        self.assertEqual(m.v5.domain, Integers)
Esempio n. 7
0
class SquareSolveContext(object):
    """
    Utility class to prepare DynamicBlock for a square solve.
    """
    def __init__(
        self,
        dynamic_block,
        samples=None,
        strip_var_bounds=True,
        input_option=InputOption.CURRENT,
    ):
        """
        Parameters
        ----------
            dynamic_block: A _DynamicBlockData object
            samples: A list of integers corresponding to the samples that
                     will be solved

        """
        self.block = dynamic_block
        self.samples = samples
        self.strip_var_bounds = strip_var_bounds
        self.input_option = input_option

        # Get indices for the time points where we need to fix inputs.
        if samples is None:
            # Assume we need to fix inputs for all non-initial time
            self.time_indices = range(2, len(dynamic_block.time) + 1)
        else:
            # Get the indices of all time points in the samples specified
            sample_points = dynamic_block.sample_points
            time = dynamic_block.time
            time_indices = []
            already_visited = set()
            for s in samples:
                # s is an integer in range(1, len(sample_points)+1)
                # the ith sample is the interval (ts_{i-1}, ts_i]
                t0 = sample_points[s - 1]
                ts = sample_points[s]
                idx_0 = time.find_nearest_index(t0)
                idx_s = time.find_nearest_index(ts)
                for i in range(idx_0 + 1,
                               idx_s + 1):  # Pyomo sets are 1-indexed
                    if i not in already_visited:
                        # Want to make sure each index gets added at most
                        # once in the case of repeated samples...
                        time_indices.append(i)
                        already_visited.add(i)
            self.time_indices = time_indices

    def __enter__(self):
        # Strip bounds:
        if self.strip_var_bounds:
            self.strip_bounds = TransformationFactory(
                'contrib.strip_var_bounds')
            self.strip_bounds.apply_to(self.block.mod, reversible=True)

        # Fix inputs:
        time = self.block.time
        t0 = time.first()
        time_indices = self.time_indices
        input_vars = self.block.input_vars
        input_option = self.input_option
        if input_option is InputOption.CURRENT:
            input_vals = [None for _ in input_vars]
        elif input_option is InputOption.INITIAL:
            input_vals = [v[t0] for v in input_vars]
        elif input_option is InputOption.SETPOINT:
            input_vals = [v.setpoint for v in input_vars]
        else:
            raise NotImplementedError('Unrecognized input option')

        for var, val in zip(input_vars, input_vals):
            for i in time_indices:
                t = time[i]
                if val is None:
                    var[t].fix()
                else:
                    var[t].fix(val)

        # Model should now be square and bound-free
        return self

    def __exit__(self, ex_type, ex_val, ex_tb):
        # Unfix inputs:
        time = self.block.time
        time_indices = self.time_indices
        input_vars = self.block.input_vars
        for var in input_vars:
            for i in time_indices:
                t = time[i]
                var[t].unfix()

        if self.strip_var_bounds:
            self.strip_bounds.revert(self.block.mod)