예제 #1
0
    def test_sim_overflow_error(self):
        'regression test for an overflow error that was encountered'

        ha = HybridAutomaton()
        ha.variables = ["barrier_clock", "x", "y"]
        on = ha.new_mode('on')

        def inv(state):
            'state invariant'

            rv = (state[1]**2) + (state[2]**2) - 9 <= 0.0001

            #print "inv returning {}".format(rv)

            return rv

        on.inv = inv
        on.der = lambda _, state: [
            1, -state[2], -(-state[1] + state[2] * (-state[1]**2 + 1))
        ]
        on.der_interval_list = [[0, 0], [0, 0], [0, 0]]
        error = ha.new_mode('error')
        error.inv = lambda state: True
        error.der = lambda _, state: [0, 0, 0]
        error.der_interval_list = [[0, 0], [0, 0], [0, 0]]
        t = ha.new_transition(on, error)
        t.guard = lambda state: state[0] >= 5
        t.reset = lambda state: [None, None, None]

        res = util.simulate_multi_trajectory_time(
            ha, ['on'], [[0.0, 0.0, -2.9142074584950004]], 5.0001)

        # two points before, invariant should still be true
        point = res.split(';')[-2]

        _, t, x, y = point.split(",")

        self.assertTrue(inv([float(t), float(x), float(y)]),
                        msg="Invariant should be true at last point")
def define_ha():
    '''make the hybrid automaton and return it'''

    ha = HybridAutomaton()
    ha.variables = ["x", "y", "xvel", "yvel"]

    mode_0_0 = ha.new_mode('mode_0_0')
    mode_0_0.inv = lambda state: state[0] <= 1.0 and state[1] <= 1.0
    mode_0_0.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.7071067811865476) + 0.1 *
        (state[3] - -0.7071067811865475), 0.2 *
        (state[2] - 0.7071067811865476) + -1.2 *
        (state[3] - -0.7071067811865475)
    ]
    mode_0_0.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_1_0 = ha.new_mode('mode_1_0')
    mode_1_0.inv = lambda state: state[0] >= 1.0 and state[0] <= 2.0 and state[
        1] <= 1.0
    mode_1_0.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - 1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - 1.0)
    ]
    mode_1_0.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_2_0 = ha.new_mode('mode_2_0')
    mode_2_0.inv = lambda state: state[0] >= 2.0 and state[0] <= 3.0 and state[
        1] <= 1.0
    mode_2_0.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - 1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - 1.0)
    ]
    mode_2_0.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_3_0 = ha.new_mode('mode_3_0')
    mode_3_0.inv = lambda state: state[0] >= 3.0 and state[0] <= 4.0 and state[
        1] <= 1.0
    mode_3_0.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - -1.0) + 0.1 *
        (state[3] - 0.0), 0.2 * (state[2] - -1.0) + -1.2 * (state[3] - 0.0)
    ]
    mode_3_0.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_4_0 = ha.new_mode('mode_4_0')
    mode_4_0.inv = lambda state: state[0] >= 4.0 and state[1] <= 1.0
    mode_4_0.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - -1.0) + 0.1 *
        (state[3] - 0.0), 0.2 * (state[2] - -1.0) + -1.2 * (state[3] - 0.0)
    ]
    mode_4_0.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_0_1 = ha.new_mode('mode_0_1')
    mode_0_1.inv = lambda state: state[0] <= 1.0 and state[1] >= 1.0 and state[
        1] <= 2.0
    mode_0_1.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.7071067811865476) + 0.1 *
        (state[3] - -0.7071067811865475), 0.2 *
        (state[2] - 0.7071067811865476) + -1.2 *
        (state[3] - -0.7071067811865475)
    ]
    mode_0_1.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_1_1 = ha.new_mode('mode_1_1')
    mode_1_1.inv = lambda state: state[0] >= 1.0 and state[0] <= 2.0 and state[
        1] >= 1.0 and state[1] <= 2.0
    mode_1_1.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - 1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - 1.0)
    ]
    mode_1_1.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_2_1 = ha.new_mode('mode_2_1')
    mode_2_1.inv = lambda state: state[0] >= 2.0 and state[0] <= 3.0 and state[
        1] >= 1.0 and state[1] <= 2.0
    mode_2_1.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - 1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - 1.0)
    ]
    mode_2_1.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_3_1 = ha.new_mode('mode_3_1')
    mode_3_1.inv = lambda state: state[0] >= 3.0 and state[0] <= 4.0 and state[
        1] >= 1.0 and state[1] <= 2.0
    mode_3_1.der = lambda _, state: [0.0, 0.0, 0.0, 0.0]
    mode_3_1.der_interval_list = [[0, 0], [0, 0], [0, 0], [0, 0]]

    mode_4_1 = ha.new_mode('mode_4_1')
    mode_4_1.inv = lambda state: state[0] >= 4.0 and state[1] >= 1.0 and state[
        1] <= 2.0
    mode_4_1.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - -1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - -1.0)
    ]
    mode_4_1.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_0_2 = ha.new_mode('mode_0_2')
    mode_0_2.inv = lambda state: state[0] <= 1.0 and state[1] >= 2.0 and state[
        1] <= 3.0
    mode_0_2.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - -1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - -1.0)
    ]
    mode_0_2.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_1_2 = ha.new_mode('mode_1_2')
    mode_1_2.inv = lambda state: state[0] >= 1.0 and state[0] <= 2.0 and state[
        1] >= 2.0 and state[1] <= 3.0
    mode_1_2.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 1.0) + 0.1 *
        (state[3] - 0.0), 0.2 * (state[2] - 1.0) + -1.2 * (state[3] - 0.0)
    ]
    mode_1_2.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_2_2 = ha.new_mode('mode_2_2')
    mode_2_2.inv = lambda state: state[0] >= 2.0 and state[0] <= 3.0 and state[
        1] >= 2.0 and state[1] <= 3.0
    mode_2_2.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.7071067811865475) + 0.1 *
        (state[3] - 0.7071067811865476), 0.2 *
        (state[2] - 0.7071067811865475) + -1.2 *
        (state[3] - 0.7071067811865476)
    ]
    mode_2_2.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_3_2 = ha.new_mode('mode_3_2')
    mode_3_2.inv = lambda state: state[0] >= 3.0 and state[0] <= 4.0 and state[
        1] >= 2.0 and state[1] <= 3.0
    mode_3_2.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.7071067811865475) + 0.1 *
        (state[3] - 0.7071067811865476), 0.2 *
        (state[2] - 0.7071067811865475) + -1.2 *
        (state[3] - 0.7071067811865476)
    ]
    mode_3_2.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_4_2 = ha.new_mode('mode_4_2')
    mode_4_2.inv = lambda state: state[0] >= 4.0 and state[1] >= 2.0 and state[
        1] <= 3.0
    mode_4_2.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - -1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - -1.0)
    ]
    mode_4_2.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_0_3 = ha.new_mode('mode_0_3')
    mode_0_3.inv = lambda state: state[0] <= 1.0 and state[1] >= 3.0 and state[
        1] <= 4.0
    mode_0_3.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - -1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - -1.0)
    ]
    mode_0_3.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_1_3 = ha.new_mode('mode_1_3')
    mode_1_3.inv = lambda state: state[0] >= 1.0 and state[0] <= 2.0 and state[
        1] >= 3.0 and state[1] <= 4.0
    mode_1_3.der = lambda _, state: [0.0, 0.0, 0.0, 0.0]
    mode_1_3.der_interval_list = [[0, 0], [0, 0], [0, 0], [0, 0]]

    mode_2_3 = ha.new_mode('mode_2_3')
    mode_2_3.inv = lambda state: state[0] >= 2.0 and state[0] <= 3.0 and state[
        1] >= 3.0 and state[1] <= 4.0
    mode_2_3.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.7071067811865475) + 0.1 *
        (state[3] - 0.7071067811865476), 0.2 *
        (state[2] - 0.7071067811865475) + -1.2 *
        (state[3] - 0.7071067811865476)
    ]
    mode_2_3.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_3_3 = ha.new_mode('mode_3_3')
    mode_3_3.inv = lambda state: state[0] >= 3.0 and state[0] <= 4.0 and state[
        1] >= 3.0 and state[1] <= 4.0
    mode_3_3.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.7071067811865475) + 0.1 *
        (state[3] - 0.7071067811865476), 0.2 *
        (state[2] - 0.7071067811865475) + -1.2 *
        (state[3] - 0.7071067811865476)
    ]
    mode_3_3.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_4_3 = ha.new_mode('mode_4_3')
    mode_4_3.inv = lambda state: state[0] >= 4.0 and state[1] >= 3.0 and state[
        1] <= 4.0
    mode_4_3.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - -1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - -1.0)
    ]
    mode_4_3.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_0_4 = ha.new_mode('mode_0_4')
    mode_0_4.inv = lambda state: state[0] <= 1.0 and state[1] >= 4.0
    mode_0_4.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - -1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - -1.0)
    ]
    mode_0_4.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_1_4 = ha.new_mode('mode_1_4')
    mode_1_4.inv = lambda state: state[0] >= 1.0 and state[0] <= 2.0 and state[
        1] >= 4.0
    mode_1_4.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - -1.0) + 0.1 *
        (state[3] - 0.0), 0.2 * (state[2] - -1.0) + -1.2 * (state[3] - 0.0)
    ]
    mode_1_4.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_2_4 = ha.new_mode('mode_2_4')
    mode_2_4.inv = lambda state: state[0] >= 2.0 and state[0] <= 3.0 and state[
        1] >= 4.0
    mode_2_4.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - -1.0) + 0.1 *
        (state[3] - 0.0), 0.2 * (state[2] - -1.0) + -1.2 * (state[3] - 0.0)
    ]
    mode_2_4.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_3_4 = ha.new_mode('mode_3_4')
    mode_3_4.inv = lambda state: state[0] >= 3.0 and state[0] <= 4.0 and state[
        1] >= 4.0
    mode_3_4.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - -1.0) + 0.1 *
        (state[3] - 0.0), 0.2 * (state[2] - -1.0) + -1.2 * (state[3] - 0.0)
    ]
    mode_3_4.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    mode_4_4 = ha.new_mode('mode_4_4')
    mode_4_4.inv = lambda state: state[0] >= 4.0 and state[1] >= 4.0
    mode_4_4.der = lambda _, state: [
        state[2], state[3], -1.2 * (state[2] - 0.0) + 0.1 *
        (state[3] - -1.0), 0.2 * (state[2] - 0.0) + -1.2 * (state[3] - -1.0)
    ]
    mode_4_4.der_interval_list = [[0, 0], [0, 0], [-0.1, 0.1], [-0.1, 0.1]]

    t = ha.new_transition(mode_0_0, mode_1_0)
    t.guard = lambda state: state[0] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_0, mode_0_1)
    t.guard = lambda state: state[1] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_0, mode_0_0)
    t.guard = lambda state: state[0] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_0, mode_2_0)
    t.guard = lambda state: state[0] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_0, mode_1_1)
    t.guard = lambda state: state[1] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_0, mode_1_0)
    t.guard = lambda state: state[0] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_0, mode_3_0)
    t.guard = lambda state: state[0] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_0, mode_2_1)
    t.guard = lambda state: state[1] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_0, mode_2_0)
    t.guard = lambda state: state[0] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_0, mode_4_0)
    t.guard = lambda state: state[0] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_0, mode_3_1)
    t.guard = lambda state: state[1] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_0, mode_3_0)
    t.guard = lambda state: state[0] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_0, mode_4_1)
    t.guard = lambda state: state[1] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_1, mode_1_1)
    t.guard = lambda state: state[0] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_1, mode_0_0)
    t.guard = lambda state: state[1] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_1, mode_0_2)
    t.guard = lambda state: state[1] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_1, mode_0_1)
    t.guard = lambda state: state[0] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_1, mode_2_1)
    t.guard = lambda state: state[0] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_1, mode_1_0)
    t.guard = lambda state: state[1] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_1, mode_1_2)
    t.guard = lambda state: state[1] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_1, mode_1_1)
    t.guard = lambda state: state[0] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_1, mode_3_1)
    t.guard = lambda state: state[0] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_1, mode_2_0)
    t.guard = lambda state: state[1] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_1, mode_2_2)
    t.guard = lambda state: state[1] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_1, mode_2_1)
    t.guard = lambda state: state[0] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_1, mode_4_1)
    t.guard = lambda state: state[0] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_1, mode_3_0)
    t.guard = lambda state: state[1] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_1, mode_3_2)
    t.guard = lambda state: state[1] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_1, mode_3_1)
    t.guard = lambda state: state[0] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_1, mode_4_0)
    t.guard = lambda state: state[1] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_1, mode_4_2)
    t.guard = lambda state: state[1] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_2, mode_1_2)
    t.guard = lambda state: state[0] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_2, mode_0_1)
    t.guard = lambda state: state[1] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_2, mode_0_3)
    t.guard = lambda state: state[1] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_2, mode_0_2)
    t.guard = lambda state: state[0] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_2, mode_2_2)
    t.guard = lambda state: state[0] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_2, mode_1_1)
    t.guard = lambda state: state[1] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_2, mode_1_3)
    t.guard = lambda state: state[1] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_2, mode_1_2)
    t.guard = lambda state: state[0] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_2, mode_3_2)
    t.guard = lambda state: state[0] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_2, mode_2_1)
    t.guard = lambda state: state[1] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_2, mode_2_3)
    t.guard = lambda state: state[1] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_2, mode_2_2)
    t.guard = lambda state: state[0] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_2, mode_4_2)
    t.guard = lambda state: state[0] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_2, mode_3_1)
    t.guard = lambda state: state[1] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_2, mode_3_3)
    t.guard = lambda state: state[1] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_2, mode_3_2)
    t.guard = lambda state: state[0] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_2, mode_4_1)
    t.guard = lambda state: state[1] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_2, mode_4_3)
    t.guard = lambda state: state[1] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_3, mode_1_3)
    t.guard = lambda state: state[0] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_3, mode_0_2)
    t.guard = lambda state: state[1] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_3, mode_0_4)
    t.guard = lambda state: state[1] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_3, mode_0_3)
    t.guard = lambda state: state[0] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_3, mode_2_3)
    t.guard = lambda state: state[0] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_3, mode_1_2)
    t.guard = lambda state: state[1] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_3, mode_1_4)
    t.guard = lambda state: state[1] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_3, mode_1_3)
    t.guard = lambda state: state[0] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_3, mode_3_3)
    t.guard = lambda state: state[0] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_3, mode_2_2)
    t.guard = lambda state: state[1] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_3, mode_2_4)
    t.guard = lambda state: state[1] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_3, mode_2_3)
    t.guard = lambda state: state[0] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_3, mode_4_3)
    t.guard = lambda state: state[0] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_3, mode_3_2)
    t.guard = lambda state: state[1] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_3, mode_3_4)
    t.guard = lambda state: state[1] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_3, mode_3_3)
    t.guard = lambda state: state[0] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_3, mode_4_2)
    t.guard = lambda state: state[1] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_3, mode_4_4)
    t.guard = lambda state: state[1] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_4, mode_1_4)
    t.guard = lambda state: state[0] >= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_0_4, mode_0_3)
    t.guard = lambda state: state[1] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_4, mode_0_4)
    t.guard = lambda state: state[0] <= 1.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_4, mode_2_4)
    t.guard = lambda state: state[0] >= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_1_4, mode_1_3)
    t.guard = lambda state: state[1] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_4, mode_1_4)
    t.guard = lambda state: state[0] <= 2.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_4, mode_3_4)
    t.guard = lambda state: state[0] >= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_2_4, mode_2_3)
    t.guard = lambda state: state[1] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_4, mode_2_4)
    t.guard = lambda state: state[0] <= 3.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_4, mode_4_4)
    t.guard = lambda state: state[0] >= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_3_4, mode_3_3)
    t.guard = lambda state: state[1] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_4, mode_3_4)
    t.guard = lambda state: state[0] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    t = ha.new_transition(mode_4_4, mode_4_3)
    t.guard = lambda state: state[1] <= 4.0
    t.reset = lambda state: [None, None, None, None]

    return ha