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
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()
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]]