def setUp(self):
     self.A1 = np.eye(2)
     self.A2 = np.array([[0, 1], [0, 0]])
     self.B1 = np.array([[0] ,[1]])
     self.B2 = np.array([[1], [0]])
     self.poly1 = pc.Polytope.from_box([[0, 1], [0, 1]])
     self.poly2 = pc.Polytope.from_box([[1, 2], [0, 1]])
     self.total_box = pc.Region(list_poly=[self.poly1, self.poly2])
     self.Uset = pc.Polytope.from_box([[0, 1]])
     self.env_labels = ('hi', 'hello')
     self.sys_labels = ('mode1',)
     self.disc_domain_size = (2, 1)
     self.LTI1 = hybrid.LtiSysDyn(A=self.A1, B=self.B1,
                                  Uset=self.Uset, domain=self.poly1,
                                  time_semantics='sampled', timestep=.1)
     self.LTI2 = hybrid.LtiSysDyn(A=self.A2, B=self.B2,
                                  Uset=self.Uset, domain=self.poly2,
                                  time_semantics='sampled', timestep=.1)
     self.LTI3 = hybrid.LtiSysDyn(A=self.A1, B=self.B1,
                                  Uset=self.Uset, domain=self.poly2,
                                  time_semantics='sampled', timestep=.1)
     self.LTI4 = hybrid.LtiSysDyn(A=self.A2, B=self.B2,
                                  Uset=self.Uset, domain=self.poly1,
                                  time_semantics='sampled', timestep=.1)
     self.PWA1 = hybrid.PwaSysDyn(list_subsys=[self.LTI1, self.LTI2],
                                  domain=self.total_box,
                                  time_semantics='sampled', timestep=.1)
     self.PWA2 = hybrid.PwaSysDyn(list_subsys=[self.LTI3, self.LTI4],
                                  domain=self.total_box,
                                  time_semantics='sampled', timestep=.1)
     self.dynamics1 = {(self.env_labels[0], self.sys_labels[0]): self.PWA1,
                       (self.env_labels[1], self.sys_labels[0]): self.PWA2}
Beispiel #2
0
def transition_directions_test():
    """
    unit test for correctness of abstracted transition directions, with:
    
      - uni-directional control authority
      - no disturbance
    """
    modes = []
    modes.append(('normal', 'fly'))
    modes.append(('refuel', 'fly'))
    env_modes, sys_modes = zip(*modes)

    cont_state_space = pc.box2poly([[0., 3.], [0., 2.]])
    pwa_sys = dict()
    pwa_sys[('normal', 'fly')] = hybrid.PwaSysDyn([subsys0()],
                                                  cont_state_space)
    pwa_sys[('refuel', 'fly')] = hybrid.PwaSysDyn([subsys1()],
                                                  cont_state_space)

    switched_dynamics = hybrid.SwitchedSysDyn(
        disc_domain_size=(len(env_modes), len(sys_modes)),
        dynamics=pwa_sys,
        env_labels=env_modes,
        disc_sys_labels=sys_modes,
        cts_ss=cont_state_space)

    cont_props = {}
    cont_props['home'] = pc.box2poly([[0., 1.], [0., 1.]])
    cont_props['lot'] = pc.box2poly([[2., 3.], [1., 2.]])

    ppp = abstract.prop2part(cont_state_space, cont_props)
    ppp, new2old = abstract.part2convex(ppp)

    N = 8
    trans_len = 1

    disc_params = {}
    for mode in modes:
        disc_params[mode] = {'N': N, 'trans_length': trans_len}

    swab = abstract.discretize_switched(ppp,
                                        switched_dynamics,
                                        disc_params,
                                        plot=True,
                                        show_ts=True,
                                        only_adjacent=False)

    ts = swab.modes[('normal', 'fly')].ts
    edges = {(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (1, 2), (1, 4),
             (1, 5), (2, 3), (2, 5), (2, 0), (3, 0), (4, 5), (5, 0)}

    logger.debug(set(ts.edges()).symmetric_difference(edges))
    assert (set(ts.edges()) == edges)

    ts = swab.ts

    assert (set(ts.edges()) == edges)
    for i, j in edges:
        assert (ts[i][j][0]['env_actions'] == 'normal')
        assert (ts[i][j][0]['sys_actions'] == 'fly')
Beispiel #3
0
    def test_correct_pwa_construction(self):
        # Putting pwa together successfully, without time overwrite
        LTI1 = hybrid.LtiSysDyn(A=self.A1,
                                B=self.B1,
                                Uset=self.Uset,
                                domain=self.poly1,
                                time_semantics='sampled',
                                timestep=.1)
        LTI2 = hybrid.LtiSysDyn(A=self.A2,
                                B=self.B2,
                                Uset=self.Uset,
                                domain=self.poly2,
                                time_semantics='sampled',
                                timestep=.1)
        LTI3 = hybrid.LtiSysDyn(A=self.A2,
                                B=self.B2,
                                Uset=self.Uset,
                                domain=self.poly1)
        LTI4 = hybrid.LtiSysDyn(A=self.A1,
                                B=self.B2,
                                Uset=self.Uset,
                                domain=self.poly2)
        PWA1 = hybrid.PwaSysDyn(list_subsys=[LTI3, LTI4],
                                domain=self.total_box,
                                overwrite_time=False)

        # Putting pwa together successfully, with time overwrite
        PWA2 = hybrid.PwaSysDyn(list_subsys=[LTI1, LTI2],
                                domain=self.total_box,
                                time_semantics='sampled',
                                timestep=.1,
                                overwrite_time=True)
Beispiel #4
0
def transition_directions_test():
    """Unit test for correctness of abstracted transition directions, with:

      - uni-directional control authority
      - no disturbance
    """
    modes = list()
    modes.append(('normal', 'fly'))
    modes.append(('refuel', 'fly'))
    env_modes, sys_modes = zip(*modes)
    # dynamics
    cont_state_space = pc.box2poly([[0.0, 3.0], [0.0, 2.0]])
    pwa_sys = dict()
    pwa_sys[('normal', 'fly')] = hybrid.PwaSysDyn([subsys0()],
                                                  cont_state_space)
    pwa_sys[('refuel', 'fly')] = hybrid.PwaSysDyn([subsys1()],
                                                  cont_state_space)
    switched_dynamics = hybrid.SwitchedSysDyn(
        disc_domain_size=(len(env_modes), len(sys_modes)),
        dynamics=pwa_sys,
        env_labels=env_modes,
        disc_sys_labels=sys_modes,
        cts_ss=cont_state_space)
    # propositions
    cont_props = dict()
    cont_props['home'] = pc.box2poly([[0.0, 1.0], [0.0, 1.0]])
    cont_props['lot'] = pc.box2poly([[2.0, 3.0], [1.0, 2.0]])
    # partition
    ppp = abstract.prop2part(cont_state_space, cont_props)
    ppp, new2old = abstract.part2convex(ppp)
    # configure discretization
    N = 8
    trans_len = 1
    disc_params = dict()
    for mode in modes:
        disc_params[mode] = dict(N=N, trans_length=trans_len)
    # discretize
    swab = abstract.discretize_switched(ppp,
                                        switched_dynamics,
                                        disc_params,
                                        plot=True,
                                        show_ts=True,
                                        only_adjacent=False)
    # assertions
    ts = swab.modes[('normal', 'fly')].ts
    edges = {(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (1, 2), (1, 4),
             (1, 5), (2, 3), (2, 5), (2, 0), (3, 0), (4, 5), (5, 0)}
    h = nx.MultiDiGraph()
    h.add_edges_from(edges)
    assert nx.is_isomorphic(ts, h)
    ts = swab.ts
    assert nx.is_isomorphic(ts, h)
    for _, _, d in ts.edges(data=True):
        assert d['env_actions'] == 'normal'
        assert d['sys_actions'] == 'fly'
Beispiel #5
0
def load(filename):
    data = scipy.io.loadmat(filename)
    islti = bool(data['islti'][0][0])
    ispwa = bool(data['ispwa'][0][0])

    if islti:
        sys = load_lti(data['A'], data['B'], data['domainA'], data['domainB'],
                       data['UsetA'], data['UsetB'])

    elif ispwa:
        nlti = len(data['A'][0])
        lti_systems = []

        for i in xrange(nlti):
            A = data['A'][0][i]
            B = data['B'][0][i]
            K = data['K'][0][i]
            domainA = data['domainA'][0][i]
            domainB = data['domainB'][0][i]
            UsetA = data['UsetA'][0][i]
            UsetB = data['UsetB'][0][i]

            ltisys = load_lti(A, B, K, domainA, domainB, UsetA, UsetB)
            lti_systems.append(ltisys)

        cts_ss = polytope.Polytope(data['ctsA'], data['ctsB'])
        sys = hybrid.PwaSysDyn(list_subsys=lti_systems, domain=cts_ss)

    return sys
 def test_pwa_invalid_semantics(self):
     LTI1 = hybrid.LtiSysDyn(A=self.A1, B=self.B1,
                             Uset=self.Uset, domain=self.poly1,
                             time_semantics='sampled', timestep=.1)
     LTI2 = hybrid.LtiSysDyn(A=self.A2, B=self.B2,
                             Uset=self.Uset, domain=self.poly2,
                             time_semantics='sampled', timestep=.1)
     PWA = hybrid.PwaSysDyn(list_subsys=[LTI1, LTI2], domain=self.total_box,
                            time_semantics='hello')
 def test_pwa_difftseman_from_subsys(self):
     """LtiSysDyn subsystems time semantics do not match that of PwaSysDyn"""
     LTI1 = hybrid.LtiSysDyn(A=self.A1, B=self.B1,
                             Uset=self.Uset, domain=self.poly1,
                             time_semantics='sampled', timestep=.1)
     LTI2 = hybrid.LtiSysDyn(A=self.A2, B=self.B2,
                             Uset=self.Uset, domain=self.poly2,
                             time_semantics='sampled', timestep=.1)
     PWA = hybrid.PwaSysDyn(list_subsys=[LTI1, LTI2], domain=self.total_box,
                            time_semantics='discrete', overwrite_time=False)
 def test_pwa_difftstep_among_subsys(self):
     """Different timesteps among LtiSysDyn subsystems of PwaSysDyn"""
     LTI1 = hybrid.LtiSysDyn(A=self.A1, B=self.B1,
                             Uset=self.Uset, domain=self.poly1,
                             time_semantics='sampled', timestep=.1)
     LTI2 = hybrid.LtiSysDyn(A=self.A2, B=self.B2,
                             Uset=self.Uset, domain=self.poly2,
                             time_semantics='sampled', timestep=.2)
     PWA = hybrid.PwaSysDyn(list_subsys=[LTI1, LTI2], domain=self.total_box,
                            time_semantics='sampled', timestep=.1,
                            overwrite_time=False)
Beispiel #9
0
def _import_pwasys(node):

	domain = node.findall('domain')
	if domain:
		domain = _import_xml(domain[0])
	else:
		domain = None

	# Get list of ltisys
	ltilist = node.findall('ltilist')[0]
	list_subsys = _import_xml(ltilist)

	return hybrid.PwaSysDyn(list_subsys=list_subsys, domain=domain)
def switched_system_test():
    subsystems = []
    
    # subsystem 0
    A = np.eye(2)
    B = np.eye(2)
    
    Uset = pc.box2poly([[0.0, 1.0], [0.0, 1.0]])
    domain0 = pc.box2poly([[0.0, 2.0], [0.0, 2.0]])
    
    subsystems += [hybrid.LtiSysDyn(A, B, Uset=Uset, domain=domain0)]
    
    # subsystem 1
    domain1 = pc.box2poly([[2.0, 4.0], [0.0, 2.0]])
    
    subsystems += [hybrid.LtiSysDyn(A, B, Uset=Uset, domain=domain1)]
    
    # PWA system
    domain = domain0.union(domain1)
    pwa = hybrid.PwaSysDyn(subsystems, domain)
    
    # Switched system (mode dynamics the same, just testing code)
    dom = (2, 2)
    dyn = {
        ('a', 'c'):pwa,
        ('a', 'd'):pwa,
        ('b', 'c'):pwa,
    }
    env_labels = ['a', 'b']
    sys_labels = ['c', 'd']
    
    hyb = hybrid.SwitchedSysDyn(
        disc_domain_size=dom,
        dynamics=dyn,
        cts_ss=domain,
        env_labels=env_labels,
        disc_sys_labels=sys_labels
    )
    
    print(hyb)
    
    assert(hyb.disc_domain_size == dom)
    assert(hyb.dynamics == dyn)
    assert(hyb.env_labels == env_labels)
    assert(hyb.disc_sys_labels == sys_labels)
    assert(hyb.cts_ss == domain)
Beispiel #11
0
                 np.array([input_ub, -input_lb, 0]))
U2 = pc.Polytope(np.array([[1, 0, 0], [-1, 0, 0], [1, -1, 0]]),
                 np.array([input_ub, -input_lb, refill_rate]))
W = pc.Polytope(np.array([[1], [-1]]), np.array([disturbance, disturbance]))

# Normal operation dynamics
cont_dyn_normal = hybrid.LtiSysDyn(A, B, E, K1, U1, W, domain=cont_ss)

# Aerial refueling mode dynamics
cont_dyn_refuel = hybrid.LtiSysDyn(A, B, E, K2, U2, W, domain=cont_ss)

## Switched Dynamics
env_modes = ('normal', 'refuel')
sys_modes = ('fly', )

pwa_normal = hybrid.PwaSysDyn([cont_dyn_normal], domain=cont_ss)
pwa_refuel = hybrid.PwaSysDyn([cont_dyn_refuel], domain=cont_ss)

dynamics_dict = {('normal', 'fly'): pwa_normal, ('refuel', 'fly'): pwa_refuel}

switched_dynamics = hybrid.SwitchedSysDyn(cts_ss=cont_ss,
                                          disc_domain_size=(len(env_modes),
                                                            len(sys_modes)),
                                          dynamics=dynamics_dict,
                                          env_labels=env_modes,
                                          disc_sys_labels=sys_modes)

## Create convex proposition preserving partition
ppp = abstract.prop2part(cont_ss, cont_props)
ppp, new2old = abstract.part2convex(ppp)
Beispiel #12
0
cont_props['OUTSIDE'] = box2poly([[24., 25.], [24., 25.]])
orig_props = set(cont_props)
out = []
out.append(box2poly([[24., 25.], [24., 25.]]))

sdyn_off = hybrid.LtiSysDyn(A_off, B_zero, None, K_off, None, None,
                            cont_state_space)
sdyn_heat = hybrid.LtiSysDyn(A_heat, B_zero, None, K_heat, None, None,
                             cont_state_space)
sdyn_cool = hybrid.LtiSysDyn(A_cool, B_zero, None, K_cool, None, None,
                             cont_state_space)
sdyn_on = hybrid.LtiSysDyn(A_on, B_zero, None, K_on, None, None,
                           cont_state_space)

pwa_off = hybrid.PwaSysDyn(
    list_subsys=[sdyn_off],
    domain=cont_state_space)  #,time_semantics='sampled',timestep=0.1)
pwa_heat = hybrid.PwaSysDyn(list_subsys=[sdyn_heat], domain=cont_state_space)
pwa_cool = hybrid.PwaSysDyn(list_subsys=[sdyn_cool], domain=cont_state_space)
pwa_on = hybrid.PwaSysDyn(list_subsys=[sdyn_on], domain=cont_state_space)

#print pwa_off

sys_dyn = {}
sys_dyn['regular', 'off'] = pwa_off
sys_dyn['regular', 'heat'] = pwa_heat
sys_dyn['regular', 'cool'] = pwa_cool
sys_dyn['regular', 'on'] = pwa_on
ssd = hybrid.SwitchedSysDyn(disc_domain_size=(1, 4),
                            dynamics=sys_dyn,
                            cts_ss=cont_state_space,
Beispiel #13
0
    U = box2poly([[-1., 1.], [-1., 1.]])
    U.scale(input_bound)

    W = box2poly([[-1., 1.], [-1., 1.]])
    W.scale(uncertainty)

    dom = box2poly([[0., 3.], [0., h]])

    sys_dyn = hybrid.LtiSysDyn(A, B, E, None, U, W, dom)

    return sys_dyn

for mode, h in zip(modes, allh):
    subsystems = [subsys0(h), subsys1(h)]
    sys_dyn[mode] = hybrid.PwaSysDyn(subsystems, cont_state_space)

"""Switched Dynamics"""

# collect env, sys_modes
env_modes, sys_modes = zip(*modes)
msg = 'Found:\n'
msg += '\t Environment modes: ' + str(env_modes)
msg += '\t System modes: ' + str(sys_modes)

switched_dynamics = hybrid.SwitchedSysDyn(
    disc_domain_size=(len(env_modes), len(sys_modes)),
    dynamics=sys_dyn,
    env_labels=env_modes,
    disc_sys_labels=sys_modes,
    cts_ss=cont_state_space