Exemple #1
0
def test_determinize_machine_init():
    mach = transys.MealyMachine()
    mach.add_inputs({'a': {0, 1}})
    mach.add_outputs({'b': {0, 1}, 'c': {0, 1}})
    u = 'Sinit'
    mach.add_nodes_from([u, 1, 2])

    # initial reactions:

    # to input: a=0
    mach.add_edge(u, 1, a=0, b=0, c=1)
    mach.add_edge(u, 2, a=0, b=0, c=1)
    mach.add_edge(u, 1, a=0, b=1, c=0)
    mach.add_edge(u, 2, a=0, b=1, c=1)

    # to input: a=1
    mach.add_edge(u, 1, a=1, b=0, c=1)
    mach.add_edge(u, 2, a=1, b=0, c=1)
    mach.add_edge(u, 1, a=1, b=1, c=0)
    mach.add_edge(u, 2, a=1, b=1, c=1)

    # determinize all outputs arbitrarily
    detmach = synth.determinize_machine_init(mach)
    assert detmach is not mach

    for a in {0, 1}:
        edges = [(i, j) for (i, j, d) in detmach.edges_iter(u, data=True)
                 if d['a'] == a]
        assert len(edges) == 1

    # determinize output b arbitrarily,
    # but output c is constrained to the initial value 0
    detmach = synth.determinize_machine_init(mach, {'c': 0})

    for a in {0, 1}:
        edges = [(i, j, d) for (i, j, d) in detmach.edges_iter(u, data=True)
                 if d['a'] == a]
        assert len(edges) == 1

        ((i, j, d), ) = edges
        assert j == 1
        assert d['b'] == 1
Exemple #2
0
def simulate(randParkSignal, sys_dyn, ctrl, disc_dynamics, T):
    # initialization:
    #     pick initial continuous state consistent with
    #     initial controller state (discrete)
    u, v, edge_data = list(ctrl.edges('Sinit', data=True))[1]
    s0_part = edge_data['loc']
    init_poly_v = pc.extreme(disc_dynamics.ppp[s0_part][0])
    x_init = sum(init_poly_v) / init_poly_v.shape[0]
    x = [x_init[0]]
    y = [x_init[1]]
    N = disc_dynamics.disc_params['N']
    s0_part = find_controller.find_discrete_state([x[0], y[0]],
                                                  disc_dynamics.ppp)
    ctrl = synth.determinize_machine_init(ctrl, {'loc': s0_part})
    (s, dum) = ctrl.reaction('Sinit', {'park': randParkSignal[0]})
    print(dum)
    for i in range(0, T):
        (s, dum) = ctrl.reaction(s, {'park': randParkSignal[i]})
        u = find_controller.get_input(x0=np.array([x[i * N], y[i * N]]),
                                      ssys=sys_dyn,
                                      abstraction=disc_dynamics,
                                      start=s0_part,
                                      end=disc_dynamics.ppp2ts.index(
                                          dum['loc']),
                                      ord=1,
                                      mid_weight=5)
        for ind in range(N):
            s_now = np.dot(sys_dyn.A, [x[-1], y[-1]]) + np.dot(
                sys_dyn.B, u[ind])
            x.append(s_now[0])
            y.append(s_now[1])
        s0_part = find_controller.find_discrete_state([x[-1], y[-1]],
                                                      disc_dynamics.ppp)
        s0_loc = disc_dynamics.ppp2ts[s0_part]
        print(s0_loc)
        print(dum['loc'])
        print(dum)
    show_traj = True
    if show_traj:
        assert plt, 'failed to import matplotlib'
        plt.plot(x)
        plt.plot(y)
        plt.show()
Exemple #3
0
disc_dynamics.disc_params['conservative'] = True
disc_dynamics.disc_params['closed_loop'] = False

# initialization:
#     pick initial continuous state consistent with
#     initial controller state (discrete)
u, v, edge_data = list(ctrl.edges('Sinit', data=True))[1]
s0_part = edge_data['loc']
init_poly_v = pc.extreme(disc_dynamics.ppp[s0_part][0])
x_init = sum(init_poly_v) / init_poly_v.shape[0]
x = [x_init[0]]
y = [x_init[1]]
N = disc_dynamics.disc_params['N']
s0_part = find_controller.find_discrete_state(
    [x[0], y[0]], disc_dynamics.ppp)
ctrl = synth.determinize_machine_init(ctrl, {'loc': s0_part})
(s, dum) = ctrl.reaction('Sinit', {'park': randParkSignal[0]})
print(dum)
for i in range(0, T):
    (s, dum) = ctrl.reaction(s, {'park': randParkSignal[i]})
    u = find_controller.get_input(
        x0=np.array([x[i * N], y[i * N]]),
        ssys=sys_dyn,
        abstraction=disc_dynamics,
        start=s0_part,
        end=disc_dynamics.ppp2ts.index(dum['loc']),
        ord=1,
        mid_weight=5)
    for ind in range(N):
        s_now = np.dot(
            sys_dyn.A, [x[-1], y[-1]]
T = 100
# let us pick an environment signal
randParkSignal = [random.randint(0, 1) for b in range(1, T + 1)]
# initialization:
#     pick initial continuous state consistent with
#     initial controller state (discrete)
u, v, edge_data = ctrl.edges('Sinit', data=True)[1]
s0_part = edge_data['loc']
init_poly_v = pc.extreme(disc_dynamics.ppp[s0_part][0])
x_init = sum(init_poly_v) / init_poly_v.shape[0]
x = [x_init[0]]
y = [x_init[1]]
N = disc_dynamics.disc_params['N']
s0_part = find_controller.find_discrete_state(
    [x[0], y[0]], disc_dynamics.ppp)
ctrl = synth.determinize_machine_init(ctrl, {'loc': s0_part})
(s, dum) = ctrl.reaction('Sinit', {'park': randParkSignal[0]})
print(dum)
for i in range(0, T):
    (s, dum) = ctrl.reaction(s, {'park': randParkSignal[i]})
    u = find_controller.get_input(
        x0=np.array([x[i * N], y[i * N]]),
        ssys=sys_dyn,
        abstraction=disc_dynamics,
        start=s0_part,
        end=disc_dynamics.ppp2ts.index(dum['loc']),
        ord=1,
        mid_weight=5)
    for ind in range(N):
        s_now = np.dot(
            sys_dyn.A, [x[-1], y[-1]]