Beispiel #1
0
    def test_CtcFunction_on_heterogeneous_variables(self):

        x = IntervalVector([[0, 1], [-2, 3]])
        a = Interval(1, 20)

        ctc_add = CtcFunction(Function("b[2]", "a", "b[0]+b[1]-a"))

        cn = ContractorNetwork()
        cn.add(ctc_add, [x, a])
        cn.contract()

        self.assertEqual(x[0], Interval(0, 1))
        self.assertEqual(x[1], Interval(0, 3))
        self.assertEqual(a, Interval(1, 4))
Beispiel #2
0
    def test_CN_simple(self):

        ctc_plus = CtcFunction(Function("a", "b", "c", "a+b-c"))
        a = Interval(0, 1)
        b = Interval(-1, 1)
        c = Interval(1.5, 2)

        cn = ContractorNetwork()
        cn.add(ctc_plus, [a, b, c])
        cn.contract()

        self.assertEqual(a, Interval(0.5, 1))
        self.assertEqual(b, Interval(0.5, 1))
        self.assertEqual(c, Interval(1.5, 2))

        self.assertEqual(cn.nb_dom(), 3)
        self.assertEqual(cn.nb_ctc(), 1)
Beispiel #3
0
    def test_dependencies_on_vector_components(self):

        ctc_plus = CtcFunction(Function("a", "b", "c",
                                        "a+b-c"))  # algebraic constraint a+b=c

        a = IntervalVector(2, [0, 1])
        b = IntervalVector(2, [-1, 1])
        c = IntervalVector(2, [1.5, 2])
        d = IntervalVector(2, [0., 0.])
        e = IntervalVectore(2)

        cn = ContractorNetwork()
        # Contractors are added to the graph,
        # the first one contracts the vector sets, the second one then contracts the components intervals,
        # and so it should trigger again the first one since components have changed.
        cn.add(ctc_plus, [b, d, e])
        cn.add(ctc_plus, [b, d, e])
        cn.add(ctc_plus, [b, d, e])
        cn.add(ctc_plus, [a[0], b[0], c[0]])
        cn.add(ctc_plus, [a[0], b[0], c[0]])
        cn.add(ctc_plus, [a[0], b[0], c[0]])
        cn.add(ctc_plus, [a[0], b[0], c[0]])
        cn.contract()

        self.assertEqual(a[0], Interval(0.5, 1))
        self.assertEqual(b[0], Interval(0.5, 1))
        self.assertEqual(c[0], Interval(1.5, 2))
        self.assertEqual(d[0], Interval(0))
        self.assertEqual(e[0], Interval(0.5, 1))

        # Before setting names (some vectors not added entirely):
        self.assertEqual(cn.nb_dom(), 3 * 3 + 2)
        # vector items contractors + ctc_plus in array mode + ctc_plus on scalar values
        self.assertEqual(cn.nb_ctc(), 3 + 2 + 1)

        cn.set_name(a, "a")
        cn.set_name(b, "b")
        cn.set_name(c, "c")
        cn.set_name(d, "d")
        cn.set_name(e, "e")
        cn.set_name(ctc_plus, "+")
        cn.print_dot_graph("cn_vector_dependencies")

        self.assertEqual(cn.nb_dom(), 3 * 5)
        # vector items contractors + ctc_plus in array mode + ctc_plus on scalar values
        self.assertEqual(cn.nb_ctc(), 5 + 2 + 1)
Beispiel #4
0
    def test_heterogeneous_variables_with_CtcFunction_3(self):

        dt = 0.1
        tdomain = Interval(0., 10.)

        x = Interval(2., 2.5)
        a = Tube(tdomain, dt, Interval(0., 10.))
        b = Tube(tdomain, dt, Interval(7.))

        ctc_add = CtcFunction(Function("x", "a", "b", "x+a-b"))

        cn = ContractorNetwork()
        cn.add(ctc_add, [x, a, b])
        cn.contract()

        self.assertEqual(x, Interval(2., 2.5))
        self.assertEqual(a.codomain(), Interval(4.5, 5.))
        self.assertEqual(b.codomain(), Interval(7.))
Beispiel #5
0
    def test_simple_static_case(self):

        ctc_plus = CtcFunction(Function("a", "b", "c",
                                        "a+b-c"))  # algebraic constraint a+b=c

        a = IntervalVector(2, [0, 1])
        b = IntervalVector(2, [-1, 1])
        c = IntervalVector(2, [1.5, 2])

        cn = ContractorNetwork()
        cn.add(ctc_plus, [a[0], b[0], c[0]])
        cn.contract()

        self.assertEqual(a[0], Interval(0.5, 1))
        self.assertEqual(b[0], Interval(0.5, 1))
        self.assertEqual(c[0], Interval(1.5, 2))

        self.assertEqual(cn.nb_dom(), 3)
        self.assertEqual(cn.nb_ctc(), 1)
Beispiel #6
0
    def test_heterogeneous_variables_with_CtcFunction_4(self):

        dt = 0.1
        tdomain = Interval(0., 10.)

        x = Interval(2., 2.5)
        a = Tube(tdomain, dt, TFunction("cos(t)"))
        b = Tube(tdomain, dt)

        ctc_add = CtcFunction(Function("x", "a", "b", "x+a-b"))

        cn = ContractorNetwork()
        cn.add(ctc_add, [x, a, b])
        cn.contract()

        result = Tube(tdomain, dt, TFunction("cos(t)"))
        result += x

        self.assertEqual(x, Interval(2., 2.5))
        self.assertEqual(b, result)
Beispiel #7
0
    def test_heterogeneous_variables_with_CtcFunction_2(self):

        dt = 0.1
        tdomain = Interval(0., 10.)

        x = Interval(-1., 3.)
        a = Tube(tdomain, dt, Interval(6., 7.))
        b = Tube(tdomain, dt, Interval(7.))

        ctc_add = CtcFunction(Function("x", "a", "b", "x+a-b"))

        cn = ContractorNetwork()
        cn.add(ctc_add, [x, a, b])
        cn.contract()

        cn.set_name(x, "x")
        cn.set_name(a, "a")
        cn.set_name(b, "b")

        self.assertEqual(x, Interval(0., 1.))
        self.assertEqual(a.codomain(), Interval(6., 7.))
        self.assertEqual(b.codomain(), Interval(7.))
Beispiel #8
0
    def test_dependencies_on_vector_components(self):

        dt = 5.
        domain = Interval(0., 20.)
        x = Tube(domain, dt, Interval(-10., 10.))
        v = Tube(domain, dt, Interval(0.))

        ctc_deriv = CtcDeriv()
        ctc_f = CtcFunction(Function("x", "xdot", "xdot+sin(x)"))

        cn = ContractorNetwork()
        cn.add(ctc_deriv, [x, v])
        cn.add(ctc_f, [x, v])

        self.assertEqual(v.codomain(), Interval(0.))
        self.assertEqual(x.codomain(), Interval(-10., 10.))
        self.assertEqual(x.nb_slices(), 4)
        self.assertEqual(v.nb_slices(), 4)
        self.assertEqual(cn.nb_ctc(), 16)
        self.assertEqual(cn.nb_dom(), 10)

        cn.set_fixedpoint_ratio(0.8)
        cn.contract()
Beispiel #9
0
    def test_singleton_variables_double_or_Vector_1(self):

        x = Interval(0, 1)
        y = Interval(-2, 3)
        a = Interval(1, 20)

        double_y = 1.
        vector_y = [2, 1.]
        ivx = IntervalVector(2, x)
        ivy = IntervalVector(2, y)
        iva = IntervalVector(2, a)

        ctc_add = CtcFunction(Function("b", "c", "a", "b+c-a"))

        cn = ContractorNetwork()

        cn.add(ctc_add, [x, double_y, a])
        cn.add(ctc_add, [x, double_y, a])  # redundant adding
        cn.add(ctc_add, [x, double_y, a])  # redundant adding
        cn.contract()

        self.assertEqual(x, Interval(0, 1))
        self.assertEqual(double_y, 1.)
        self.assertEqual(a, Interval(1, 2))
Beispiel #10
0
                if n.right.xin.is_flat():
                    n.right.xin.set_empty()

                stack.extendleft([n.left, n.right])
            elif X.is_empty() or X.max_diam() < eps:
                n.left, n.right = None, None
            # else:
            # vibes.drawBox(X[0][0], X[0][1], X[1][0], X[1][1], '[y]')


if __name__ == '__main__':

    from pyibex import Function, SepFwdBwd

    funcs_dict = {
        "SepMini": Function("x", "y", "(x - 1/2.)^2 + abs(2*y) - 1/4."),
        "SepNonMini": Function("x", "y", "x^2 + abs(2*y) - x"),
    }
    funcs_dict = {"SepNonMini": Function("x", "y", "x^2 + abs(2*y) - x")}

    # funcs_dict = { "SepNonMini" : Function("x", "y", "x^2 + y^2 + x - x + x^3 - x^3") }

    vibes.beginDrawing()
    X0 = IntervalVector(2, [-6, 6])
    for name, func in funcs_dict.items():
        vibes.newFigure(name)
        sep = SepFwdBwd(func, [3, 5])
        vibes.setFigureSize(600, 600)
        # pySIVIA(X0, sep, 0.1, use_patch=True, color_out='#888888[#DDDDDD]',
        # color_in='#888888[#444444]', color_maybe='#AAAAAA[w]')
        # pySIVIA(X0, sep, 0.1, **siviaParams)