Ejemplo n.º 1
0
    def test_power(self):
        m = aml.Model()
        x = 2.5
        y = -3.7
        m.x = aml.Var(x)
        m.y = aml.Var(y)

        expr = m.x ** (m.y)
        self.assertAlmostEqual(expr.evaluate(), x ** y, 10)
        ders = expr.reverse_ad()
        self.assertAlmostEqual(ders[m.x], y * x ** (y - 1), 10)
        self.assertAlmostEqual(ders[m.y], x ** y * np.log(x), 10)
Ejemplo n.º 2
0
    def test_multiply(self):
        m = aml.Model()
        x = 2.5
        y = -3.7
        m.x = aml.Var(x)
        m.y = aml.Var(y)

        expr = m.x * m.y
        self.assertAlmostEqual(expr.evaluate(), x * y, 10)
        ders = expr.reverse_ad()
        self.assertEqual(ders[m.x], y)
        self.assertEqual(ders[m.y], x)
Ejemplo n.º 3
0
    def test_divide(self):
        m = aml.Model()
        x = 2.5
        y = -3.7
        m.x = aml.Var(x)
        m.y = aml.Var(y)

        expr = m.x / m.y
        self.assertAlmostEqual(expr.evaluate(), x / y, 10)
        ders = expr.reverse_ad()
        self.assertAlmostEqual(ders[m.x], 1 / y, 10)
        self.assertAlmostEqual(ders[m.y], -x / y ** 2, 10)
Ejemplo n.º 4
0
    def test_subtract(self):
        m = aml.Model()
        x = 2.5
        y = -3.7
        m.x = aml.Var(x)
        m.y = aml.Var(y)

        expr = m.x - m.y
        self.assertAlmostEqual(expr.evaluate(), x - y, 10)
        ders = expr.reverse_ad()
        self.assertEqual(ders[m.x], 1)
        self.assertEqual(ders[m.y], -1)
Ejemplo n.º 5
0
 def test_structure_exception(self):
     m = aml.Model()
     m.x = aml.Var()
     m.c = aml.Constraint(m.x - 1)
     with self.assertRaises(RuntimeError):
         m.get_x()
     m.set_structure()
     m.get_x()
     m.y = aml.Var()
     m.c2 = aml.Constraint(m.x + m.y)
     with self.assertRaises(RuntimeError):
         m.get_x()
     m.set_structure()
     x = m.get_x()
     self.assertEqual(len(x), 2)
Ejemplo n.º 6
0
    def test_log(self):
        m = aml.Model()
        x = 2.5
        m.x = aml.Var(x)

        expr = aml.log(m.x)
        self.assertAlmostEqual(aml.value(expr), np.log(x), 10)
        self.assertAlmostEqual(expr.reverse_ad()[m.x], 1 / x, 10)
Ejemplo n.º 7
0
    def test_add(self):
        m = aml.Model()
        x = 2.5
        y = -3.7
        z = 10.0
        c1 = 8.6
        c2 = 3.3
        m.x = aml.Var(x)
        m.y = aml.Var(y)
        m.c1 = aml.Param(c1)

        expr = m.x + m.y + m.c1 + c2

        self.assertAlmostEqual(expr.evaluate(), x + y + c1 + c2, 10)
        ders = expr.reverse_ad()
        self.assertEqual(ders[m.x], 1)
        self.assertEqual(ders[m.y], 1)
Ejemplo n.º 8
0
    def test_chain_rule(self):
        m = aml.Model()
        x = 1.1
        m.x = aml.Var(x)

        expr = aml.exp((m.x + m.x**0.5)**2) - m.x

        actual_deriv = np.exp((x + x**0.5)**2)*2*(x + x**0.5)*(1 + 0.5*x**(-0.5)) - 1
        self.assertAlmostEqual(aml.value(expr), np.exp((x + x**0.5)**2) - x, 10)
        self.assertAlmostEqual(expr.reverse_ad()[m.x], actual_deriv, 10)
Ejemplo n.º 9
0
    def test_basic_constraints(self):
        m = aml.Model()
        x = 2.5
        y = -3.7
        c = 1.5
        m.x = aml.Var(x)
        m.y = aml.Var(y)
        m.c = aml.Param(c)

        m.con1 = aml.Constraint(m.x + 2.0 * m.y + m.c)
        m.con2 = aml.Constraint(m.x ** 2 - m.y ** 2 + 10)

        true_con_values = OrderedDict()
        true_con_values[m.con1] = x + 2 * y + c
        true_con_values[m.con2] = x ** 2 - y ** 2 + 10

        true_jac = OrderedDict()
        true_jac[m.con1] = OrderedDict()
        true_jac[m.con2] = OrderedDict()
        true_jac[m.con1][m.x] = 1
        true_jac[m.con1][m.y] = 2
        true_jac[m.con2][m.x] = 2 * x
        true_jac[m.con2][m.y] = -2 * y

        compare_evaluation(self, m, true_con_values, true_jac)

        del true_con_values[m.con2]
        del true_jac[m.con2]
        del m.con2
        m.con3 = aml.Constraint(m.x * m.y)
        true_con_values[m.con3] = x * y
        true_jac[m.con3] = OrderedDict()
        true_jac[m.con3][m.x] = y
        true_jac[m.con3][m.y] = x

        compare_evaluation(self, m, true_con_values, true_jac)
Ejemplo n.º 10
0
def leak_rate_var(m, wn, index_over=None):
    """
    Add a variable to the model for leak flow rate

    Parameters
    ----------
    m: wntr.aml.aml.aml.Model
    wn: wntr.network.model.WaterNetworkModel
    index_over: list of str
        list of junction/tank names
    """
    if not hasattr(m, 'leak_rate'):
        m.leak_rate = aml.VarDict()

    if index_over is None:
        index_over = wn.junction_name_list + wn.tank_name_list

    for node_name in index_over:
        m.leak_rate[node_name] = aml.Var(0)
Ejemplo n.º 11
0
def head_var(m, wn, index_over=None):
    """
    Add a head variable to the model

    Parameters
    ----------
    m: wntr.aml.aml.aml.Model
    wn: wntr.network.model.WaterNetworkModel
    index_over: list of str
        list of junction names
    """
    if not hasattr(m, 'head'):
        m.head = aml.VarDict()

    if index_over is None:
        index_over = wn.junction_name_list

    for node_name in index_over:
        node = wn.get_node(node_name)
        m.head[node_name] = aml.Var(node.elevation)
Ejemplo n.º 12
0
def flow_var(m, wn, index_over=None):
    """
    Add a flow variable to the model

    Parameters
    ----------
    m: wntr.aml.aml.aml.Model
    wn: wntr.network.model.WaterNetworkModel
    index_over: list of str
        list of link names
    """
    if not hasattr(m, 'flow'):
        m.flow = aml.VarDict()

    if index_over is None:
        index_over = wn.link_name_list

    for link_name in index_over:
        link = wn.get_link(link_name)
        m.flow[link_name] = aml.Var(0.001)
Ejemplo n.º 13
0
def demand_var(m, wn, index_over=None):
    """
    Add a demand variable to the model

    Parameters
    ----------
    m: wntr.aml.aml.aml.Model
    wn: wntr.network.model.WaterNetworkModel
    index_over: list of str
        list of junction names
    """
    if not hasattr(m, 'demand'):
        m.demand = aml.VarDict()

    if index_over is None:
        index_over = wn.junction_name_list

    demand_multiplier = wn.options.hydraulic.demand_multiplier
    pattern_start = wn.options.time.pattern_start
    
    for node_name in index_over:
        node = wn.get_node(node_name)
        m.demand[node_name] = aml.Var(node.demand_timeseries_list.at(wn.sim_time+pattern_start, multiplier=demand_multiplier))
Ejemplo n.º 14
0
    def test_register_and_remove_constraint(self):
        m = aml.Model()
        m.x = aml.Var(2.0)
        m.y = aml.Var(3.0)
        m.z = aml.Var(4.0)
        m.v = aml.Var(10.0)
        m.c1 = aml.Constraint(m.x + m.y)
        m.c2 = aml.Constraint(m.x * m.y * m.v)
        m.c3 = aml.Constraint(m.z ** 3.0)
        m.c4 = aml.Constraint(m.x + 1.0 / m.v)
        m.set_structure()
        con_values = m.evaluate_residuals()
        A = m.evaluate_jacobian()

        true_con_values = OrderedDict()
        true_con_values[m.c1] = 5.0
        true_con_values[m.c2] = 60.0
        true_con_values[m.c3] = 64.0
        true_con_values[m.c4] = 2.1
        for c in m.cons():
            self.assertTrue(true_con_values[c] == con_values[c.index])
        true_jac = OrderedDict()
        true_jac[m.c1] = OrderedDict()
        true_jac[m.c2] = OrderedDict()
        true_jac[m.c3] = OrderedDict()
        true_jac[m.c4] = OrderedDict()
        true_jac[m.c1][m.x] = 1.0
        true_jac[m.c1][m.y] = 1.0
        true_jac[m.c1][m.z] = 0.0
        true_jac[m.c1][m.v] = 0.0
        true_jac[m.c2][m.x] = 30.0
        true_jac[m.c2][m.y] = 20.0
        true_jac[m.c2][m.z] = 0.0
        true_jac[m.c2][m.v] = 6.0
        true_jac[m.c3][m.x] = 0.0
        true_jac[m.c3][m.y] = 0.0
        true_jac[m.c3][m.z] = 48.0
        true_jac[m.c3][m.v] = 0.0
        true_jac[m.c4][m.x] = 1.0
        true_jac[m.c4][m.y] = 0.0
        true_jac[m.c4][m.z] = 0.0
        true_jac[m.c4][m.v] = -0.01
        for c in m.cons():
            for v in m.vars():
                self.assertTrue(true_jac[c][v] == A[c.index, v.index])

        del m.c3
        m.c3 = aml.Constraint(m.z)
        m.set_structure()
        con_values = m.evaluate_residuals()
        A = m.evaluate_jacobian()

        true_con_values[m.c1] = 5.0
        true_con_values[m.c2] = 60.0
        true_con_values[m.c3] = 4.0
        true_con_values[m.c4] = 2.1
        for c in m.cons():
            self.assertTrue(true_con_values[c] == con_values[c.index])
        true_jac[m.c3] = OrderedDict()
        true_jac[m.c3][m.x] = 0.0
        true_jac[m.c3][m.y] = 0.0
        true_jac[m.c3][m.z] = 1.0
        true_jac[m.c3][m.v] = 0.0
        for c in m.cons():
            for v in m.vars():
                self.assertTrue(true_jac[c][v] == A[c.index, v.index])
Ejemplo n.º 15
0
    def test_if_then_constraints(self):
        m = aml.Model()
        x = -4.5
        y = -3.7
        m.x = aml.Var(x)
        m.y = aml.Var(y)

        e = aml.ConditionalExpression()
        e.add_condition(
            aml.inequality(body=m.x, ub=-1), -((-m.x) ** 1.852) - (-m.x) ** 2 - m.y
        )
        e.add_condition(aml.inequality(body=m.x, ub=1), m.x)
        e.add_final_expr(m.x ** 1.852 + m.x ** 2 - m.y)
        m.con1 = aml.Constraint(e)

        e = aml.ConditionalExpression()
        e.add_condition(
            aml.inequality(body=m.y, ub=-1), -((-m.y) ** (1.852)) - (-m.y) ** (2) - m.x
        )
        e.add_condition(aml.inequality(body=m.y, ub=1), m.y)
        e.add_final_expr(m.y ** (1.852) + m.y ** (2) - m.x)
        m.con2 = aml.Constraint(e)

        true_con_values = OrderedDict()
        true_jac = OrderedDict()
        true_con_values[m.con1] = -(abs(x) ** 1.852 + abs(x) ** 2) - y
        true_con_values[m.con2] = -(abs(y) ** 1.852 + abs(y) ** 2) - x
        true_jac[m.con1] = OrderedDict()
        true_jac[m.con2] = OrderedDict()
        true_jac[m.con1][m.x] = 1.852 * abs(x) ** 0.852 + 2 * abs(x)
        true_jac[m.con1][m.y] = -1
        true_jac[m.con2][m.x] = -1
        true_jac[m.con2][m.y] = 1.852 * abs(y) ** 0.852 + 2 * abs(y)
        compare_evaluation(self, m, true_con_values, true_jac)

        x = 0.5
        y = 0.3
        m.x.value = x
        m.y.value = y
        true_con_values[m.con1] = x
        true_con_values[m.con2] = y
        true_jac[m.con1][m.x] = 1
        true_jac[m.con1][m.y] = 0
        true_jac[m.con2][m.x] = 0
        true_jac[m.con2][m.y] = 1
        compare_evaluation(self, m, true_con_values, true_jac)

        x = 4.5
        y = 3.7
        m.x.value = x
        m.y.value = y
        true_con_values[m.con1] = x ** 1.852 + x ** 2 - y
        true_con_values[m.con2] = y ** 1.852 + y ** 2 - x
        true_jac[m.con1][m.x] = 1.852 * x ** 0.852 + 2 * x
        true_jac[m.con1][m.y] = -1
        true_jac[m.con2][m.x] = -1
        true_jac[m.con2][m.y] = 1.852 * y ** 0.852 + 2 * y
        compare_evaluation(self, m, true_con_values, true_jac)

        del true_con_values[m.con2]
        del true_jac[m.con2]
        del m.con2
        e = aml.ConditionalExpression()
        e.add_condition(
            aml.inequality(body=m.y, ub=-1), -((-m.y) ** 2.852) - (-m.y) ** 3 - m.x
        )
        e.add_condition(aml.inequality(body=m.y, ub=1), m.y ** 2)
        e.add_final_expr(m.y ** 2.852 + m.y ** 3 - m.x)
        m.con2 = aml.Constraint(e)

        true_jac[m.con2] = OrderedDict()
        x = -4.5
        y = -3.7
        m.x.value = x
        m.y.value = y
        true_con_values[m.con1] = -(abs(x) ** 1.852 + abs(x) ** 2) - y
        true_con_values[m.con2] = -(abs(y) ** 2.852 + abs(y) ** 3) - x
        true_jac[m.con1][m.x] = 1.852 * abs(x) ** 0.852 + 2 * abs(x)
        true_jac[m.con1][m.y] = -1
        true_jac[m.con2][m.x] = -1
        true_jac[m.con2][m.y] = 2.852 * abs(y) ** 1.852 + 3 * abs(y) ** 2
        compare_evaluation(self, m, true_con_values, true_jac)

        x = 0.5
        y = 0.3
        m.x.value = x
        m.y.value = y
        true_con_values[m.con1] = x
        true_con_values[m.con2] = y ** 2
        true_jac[m.con1][m.x] = 1
        true_jac[m.con1][m.y] = 0
        true_jac[m.con2][m.x] = 0
        true_jac[m.con2][m.y] = 2 * y
        compare_evaluation(self, m, true_con_values, true_jac)

        x = 4.5
        y = 3.7
        m.x.value = x
        m.y.value = y
        true_con_values[m.con1] = x ** 1.852 + x ** 2 - y
        true_con_values[m.con2] = y ** 2.852 + y ** 3 - x
        true_jac[m.con1][m.x] = 1.852 * x ** 0.852 + 2 * x
        true_jac[m.con1][m.y] = -1
        true_jac[m.con2][m.x] = -1
        true_jac[m.con2][m.y] = 2.852 * y ** 1.852 + 3 * y ** 2
        compare_evaluation(self, m, true_con_values, true_jac)