Example #1
0
def vdp_pwa2sal(pwa_rep, module_name):
    init_set = C.IntervalCons(np.array([-0.4, -0.4]), np.array([0.4, 0.4]))
    prop = C.IntervalCons(np.array([-1, -6.5]), np.array([-0.7, -5.6]))
    sal_trans_sys = st.SALTransSys(module_name, 2, init_set, prop)

    for sub_model in pwa_rep:
        g = st.Guard(sub_model.p.C, sub_model.p.d)
        r = st.Reset(sub_model.m.A, sub_model.m.b)
        t = st.Transition(g, r)
        sal_trans_sys.add_transition(t)
    return sal_trans_sys
Example #2
0
    def error(self, X, Y):
        """error

        Parameters
        ----------
        X : Test input
        Y : Test Output

        Returns
        -------
        Computes signed error against passed in test samples.
        Sound error interval vector (non-symmeteric).
        The interal must be added and NOT subtracted to make a sound
        model. e.g. Y_sound = A*X + e
        or,
            predict(X) + e_l <= Y_sound <= predict(X) + e_h
            Y_sound = predict(X) + [e_l, e_h]

        Notes
        ------
        Computes interval vector e = Y_true - Y_predict, such that
        the interval is sound w.r.t. to passed in test samples
        """
        Yp = self.predict(X)
        assert (Y.shape == Yp.shape)
        delta = Y - Yp
        max_e = np.max(delta, axis=0)
        min_e = np.min(delta, axis=0)
        return cons.IntervalCons(min_e, max_e)
Example #3
0
def ival_constraints(cell, eps):
    """ival_constraints

    Parameters
    ----------
    cell : cell id tuple
    eps : grid eps

    Returns
    -------

    Notes
    ------
    Cell is defined as left closed and right open: [ )
    This is achieved by subtracting a small % of eps from the cell's
    'right' boundary (ic.h)
    """
    tol = (1e-5) * np.array(eps)  # 0.001% of eps
    cell_coordinates = np.array(cell) * eps
    ival_l = cell_coordinates
    ival_h = cell_coordinates + eps - tol
    return cons.IntervalCons(ival_l, ival_h)
Example #4
0
'''
parses the file bbal.log
which took 4.8 days to compute
real    17391m21.106s
user    17260m31.784s
sys     125m51.456s

'''
import constraints as C
import fileops as fops

fr = fops.ReadLine('./bbal.log')

s = 'dummy'
x = C.IntervalCons((4.9, ), (5.0, ))

while s:
    if s.strip().find('1.0*x3 \\in ') == 0:
        ss = s.strip().replace('1.0*x3 \\in ', '')
        ic = C.IntervalCons(*map(lambda x: (float(x), ), ss[1:-1].split(',')))
        if x & ic is not None:
            print ic
    s = fr.readline()
Example #5
0
def parse(file_path, plant_pvt_init_data):
    test_des_file = file_path
    path = fp.get_abs_base_path(file_path)
    sys_name = fp.split_filename_ext(fp.get_file_name_from_path(file_path))[0]

    test_dir = fp.get_abs_base_path(test_des_file)
    SYS.path.append(test_dir)

    try:
        sut = imp.load_source('test_des', test_des_file)
    except IOError as e:
        print('File not found: {}'.format(test_des_file))
        raise e

    sut.plant_pvt_init_data = plant_pvt_init_data

    try:
        assert (len(sut.initial_set) == 2)
        assert (len(sut.error_set) == 2)
        assert (len(sut.ci) == 2)
        assert (len(sut.pi) == 2)

        assert (len(sut.ci[0]) == len(sut.ci[1]))
        assert (len(sut.pi[0]) == len(sut.pi[1]))

        assert (len(sut.initial_set[0]) == len(sut.initial_set[1]))
        assert (len(sut.error_set[0]) == len(sut.error_set[1]))

        assert (len(sut.initial_set[0]) == len(sut.error_set[0]))

        assert (len(sut.initial_set[0]) == len(sut.grid_eps))

        num_dims = NumDims(
            si=len(sut.initial_controller_integer_state),
            sf=len(sut.initial_controller_float_state),
            s=len(sut.initial_controller_integer_state) +
            len(sut.initial_controller_float_state),
            x=len(sut.initial_set[0]),
            u=sut.num_control_inputs,
            ci=len(sut.ci[0]),
            pi=len(sut.pi[0]),
            d=len(sut.initial_discrete_state),
            pvt=0,
        )

        if not hasattr(sut, 'ci_grid_eps') or len(sut.ci_grid_eps) == 0:
            sut.ci_grid_eps = []

#         if hasattr(sut, 'ci_grid_eps'):
#             if len(sut.ci_grid_eps) == 0:
#                 sut.ci_grid_eps = None
#         else:
#             sut.ci_grid_eps = None

        if not hasattr(sut, 'pi_grid_eps') or len(sut.pi_grid_eps) == 0:
            sut.pi_grid_eps = []

#         if hasattr(sut, 'pi_grid_eps'):
#             if len(sut.pi_grid_eps) == 0:
#                 sut.pi_grid_eps = None
#         else:
#             sut.pi_grid_eps = None

        if num_dims.ci == 0:
            ci = None
        else:
            ci = cns.IntervalCons(np.array(sut.ci[0]), np.array(sut.ci[1]))

        if num_dims.pi == 0:
            pi = None
        else:
            pi = cns.IntervalCons(np.array(sut.pi[0]), np.array(sut.pi[1]))

        assert ((pi is None and sut.pi_grid_eps == [])
                or (pi is not None and sut.pi_grid_eps != []))
        assert ((ci is None and sut.ci_grid_eps == [])
                or (ci is not None and sut.ci_grid_eps != []))

        if pi is not None:
            assert (len(sut.pi[0]) == len(sut.pi_grid_eps))

        if ci is not None:
            assert (len(sut.ci[0]) == len(sut.ci_grid_eps))

        plant_config_dict = {
            'plant_description': sut.plant_description,
            'plant_path': sut.plant_path,
            #'refinement_factor': sut.refinement_factor,
            'eps': np.array(sut.grid_eps, dtype=float),
            #'pi_eps': np.array(sut.pi_grid_eps, dtype=float),
            'num_samples': int(sut.num_samples),
            'delta_t': float(sut.delta_t),
            #'type': 'string',
            'type': 'value',
        }
        #print(plant_config_dict)
        #for k, d in plant_config_dict.iteritems():
        #    plant_config_dict[k] = str(d)

        # TODO: fix the list hack, once the controller ifc matures

        init_cons = cns.IntervalCons(np.array(sut.initial_set[0]),
                                     np.array(sut.initial_set[1]))

        init_cons_list = [init_cons]

        final_cons = cns.IntervalCons(np.array(sut.error_set[0]),
                                      np.array(sut.error_set[1]))
        T = sut.T
        delta_t = sut.delta_t

        if sut.controller_path is not None:
            controller_object_str = fp.split_filename_ext(
                sut.controller_path)[0]
            controller_path_dir_path = fp.construct_path(
                sut.controller_path_dir_path, path)
        else:
            controller_object_str = None
            controller_path_dir_path = None

        initial_discrete_state = sut.initial_discrete_state
        initial_controller_state = (sut.initial_controller_integer_state +
                                    sut.initial_controller_float_state)
        MAX_ITER = sut.MAX_ITER

        num_segments = int(np.ceil(T / delta_t))

        controller_path = sut.controller_path
        plant_pvt_init_data = sut.plant_pvt_init_data

        min_smt_sample_dist = sut.min_smt_sample_dist
        ci_grid_eps = sut.ci_grid_eps
        pi_grid_eps = sut.pi_grid_eps

        #num_sim_samples = sut.num_sim_samples
        #METHOD = sut.METHOD
        #symbolic_analyzer = sut.symbolic_analyzer
        #plot = sut.plot
        #MODE = sut.MODE
        #opts = Options(plot, MODE, num_sim_samples, METHOD, symbolic_analyzer)
    except AttributeError as e:
        raise MissingSystemDefError(e)

    # ROI is not mandatory and defaults to xi \in (-inf, inf)
    try:
        ROI = cns.IntervalCons(*sut.ROI)
        assert (ROI.dim == num_dims.x)
    except AttributeError:
        ROI = cns.top2ic(num_dims.x)

    sys = System(sys_name, controller_path, num_dims, plant_config_dict,
                 delta_t, controller_path_dir_path, controller_object_str,
                 path, plant_pvt_init_data, min_smt_sample_dist, ci_grid_eps,
                 pi_grid_eps)
    prop = Property(T, init_cons_list, init_cons, final_cons, ci, pi,
                    initial_discrete_state, initial_controller_state, MAX_ITER,
                    num_segments, ROI)

    print('system loaded...')
    return sys, prop
Example #6
0
def box(_, x):
    ival_cons = cons.IntervalCons(np.min(x, axis=0), np.max(x, axis=0))
    return ival_cons.poly()
Example #7
0
 def get_ival_constraints(self, abs_state):
     ival_l = np.array(abs_state.s)
     ival_h = np.array(abs_state.s)
     return cons.IntervalCons(ival_l, ival_h)
Example #8
0
def ival_constraints(cell, eps):
    cell_coordinates = np.array(cell) * eps
    ival_l = cell_coordinates
    ival_h = cell_coordinates + eps
    return cons.IntervalCons(ival_l, ival_h)
Example #9
0
def parse_without_sanity_check(file_path):
    test_des_file = file_path
    path = fp.get_abs_base_path(file_path)

    test_dir = fp.get_abs_base_path(test_des_file)
    SYS.path.append(test_dir)

    sut = imp.load_source('test_des', test_des_file)

    plant_config_dict = {
        'plant_description': sut.plant_description,
        'plant_path': sut.plant_path,
        'refinement_factor': sut.refinement_factor,
        #  'grid_eps': sut.grid_eps,
        #  'num_samples': sut.num_samples,
        'delta_t': sut.delta_t,
        'type': 'string',
    }

    for k, d in plant_config_dict.iteritems():
        plant_config_dict[k] = str(d)

    num_dims = NumDims(
        si=len(sut.initial_controller_integer_state),
        sf=len(sut.initial_controller_float_state),
        s=len(sut.initial_controller_integer_state) +
        len(sut.initial_controller_float_state),
        x=len(sut.initial_set[0]),
        u=sut.num_control_inputs,
        ci=len(sut.ci[0]),
        pi=0,
        d=len(sut.initial_discrete_state),
        pvt=0,
    )

    if num_dims.ci == 0:
        ci = None
    else:

        ci = cns.IntervalCons(np.array(sut.ci[0]), np.array(sut.ci[1]))
    if num_dims.pi == 0:
        pi = None
    else:
        pi = cns.IntervalCons(np.array(sut.pi[0]), np.array(sut.pi[1]))

    # TODO: fix the list hack, once the controller ifc matures

    init_cons = cns.IntervalCons(np.array(sut.initial_set[0]),
                                 np.array(sut.initial_set[1]))

    init_cons_list = [init_cons]

    final_cons = cns.IntervalCons(np.array(sut.error_set[0]),
                                  np.array(sut.error_set[1]))
    T = sut.T

    if sut.controller_path is not None:
        controller_object_str = fp.split_filename_ext(sut.controller_path)[0]
        controller_path_dir_path = fp.construct_path(
            sut.controller_path_dir_path, path)
    else:
        controller_object_str = None
        controller_path_dir_path = None

    delta_t = sut.delta_t
    #try:  # enforce it for now!
    #except:
    #    controller_path_dir_path = None
    initial_discrete_state = sut.initial_discrete_state
    initial_controller_state = sut.initial_controller_integer_state \
                             + sut.initial_controller_float_state
    MAX_ITER = sut.MAX_ITER
    #try:  # enforce it for now!
    #except:
    #    None
    num_segments = int(np.ceil(T / delta_t))

    controller_path = sut.controller_path
    plant_pvt_init_data = sut.plant_pvt_init_data

    sys = System(controller_path, num_dims, plant_config_dict, delta_t,
                 controller_path_dir_path, controller_object_str, path,
                 plant_pvt_init_data)
    prop = Property(T, init_cons_list, init_cons, final_cons, ci, pi,
                    initial_discrete_state, initial_controller_state, MAX_ITER,
                    num_segments)

    #num_sim_samples = sut.num_sim_samples
    #METHOD = sut.METHOD
    #symbolic_analyzer = sut.symbolic_analyzer
    #plot = sut.plot
    #MODE = sut.MODE
    #opts = Options(plot, MODE, num_sim_samples, METHOD, symbolic_analyzer)
    return sys, prop
Example #10
0
def overapprox_x0(num_dims, prop, pwa_trace, solver=gopts.opt_engine):
    A_ub, b_ub = pwatrace2lincons(pwa_trace, num_dims, prop)

    num_opt_vars = A_ub.shape[1]

    nvars = num_dims.x + num_dims.pi

    #directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
    I = np.eye(nvars)
    directions = np.vstack((I, -I))
    left_over_vars = num_opt_vars - nvars
    directions_ext = np.pad(directions, [(0, 0), (0, left_over_vars)],
                            'constant')

    # LP structure: A_ub [x x'] <= b_ub

    x_arr = np.array(sym.symbols(['x{}'.format(i) for i in range(nvars)]))

    A_ub, b_ub = truncate(A_ub, b_ub)

    res = solve_mult_lp(lpfun(solver), directions_ext, A_ub, b_ub)

    l = len(res)
    assert (l % 2 == 0)
    #min_directions, max_directions = np.split(directions, l/2, axis=1)
    min_res, max_res = res[:l // 2], res[l // 2:]

    ranges = []

    for di, rmin, rmax in zip(directions, min_res, max_res):
        if (rmin.success and rmax.success):
            print('{} \in [{}, {}]'.format(np.dot(di, x_arr), rmin.fun,
                                           -rmax.fun))
            ranges.append([rmin.fun, -rmax.fun])
        else:
            if settings.debug:
                print('LP failed')
                print('rmin status:', rmin.status)
                print('rmax status:', rmax.status)
            return None

            #raise e

    # For python2/3 compatibility
#     try:
#         input = raw_input
#     except NameError:
#         pass
#     prompt = input('load the prompt? (y/Y)')
#     if prompt.lower() == 'y':
#         import IPython
#         IPython.embed()

#ranges = [[0.00416187, 0.00416187],[3.47047152,3.47047152],[9.98626028,9.98626028],[4.98715449,4.98715449]]
    r = np.asarray(ranges)
    # due to numerical errors, the interval can be malformed
    try:
        ret_val = cons.IntervalCons(r[:, 0], r[:, 1])
    except:
        #from IPython import embed
        err.warn('linprog fp failure: Malformed Interval! Please fix.')
        #embed()
        return None

    return ret_val