Пример #1
0
def simulator_factory(config_dict,
                      benchmark_os_path,
                      plt,
                      plant_pvt_init_data,
                      parallel=False,
                      test_params=None,
                      sim_args=None):

    # ##!!##logger.debug('requested simulator creation')

    sim_type = config_dict['plant_description']
    if sim_type == 'matlab':
        logger.info('creating matlab simulator')

        # get the m_file's path

        m_file_path = config_dict['plant_path']
        abs_m_file_path = fp.construct_path(m_file_path, benchmark_os_path)
        if fp.validate_file_names([abs_m_file_path]):

            # return MatlabSim(m_file_path, benchmark_os_path, parallel)

            return MEngPy(m_file_path, benchmark_os_path, parallel, sim_args)
        else:
            raise err.FileNotFound('file does not exist: ' + m_file_path)
    elif sim_type == 'simulink':
        return SimulinkSim()
    elif sim_type == 'python':
        logger.info('creating Native Python simulator')

        # get the file path

        python_file_path = config_dict['plant_path']
        #(module_name, file_ext) = python_file_path.split('.')
        (module_name, file_ext) = fp.split_filename_ext(python_file_path)
        if file_ext != 'py':
            raise err.Fatal(
                'Python file extension py expected, found: {}'.format(
                    file_ext))
        module_path = fp.construct_path(python_file_path, benchmark_os_path)
        if fp.validate_file_names([module_path]):
            return NativeSim(module_name, module_path, plt,
                             plant_pvt_init_data, parallel)
        else:
            raise err.FileNotFound('file does not exist: ' + python_file_path)
    elif sim_type == 'test':
        return TestSim(test_params)
    else:
        raise err.Fatal('unknown sim type : {}'.format(sim_type))
Пример #2
0
def simulator_factory(
        config_dict,
        benchmark_os_path,
        plt,
        plant_pvt_init_data,
        parallel=False,
        test_params=None,
        sim_args=None
        ):

    # ##!!##logger.debug('requested simulator creation')

    sim_type = config_dict['plant_description']
    if sim_type == 'matlab':
        logger.info('creating matlab simulator')

        # get the m_file's path

        m_file_path = config_dict['plant_path']
        abs_m_file_path = fp.construct_path(m_file_path, benchmark_os_path)
        if fp.validate_file_names([abs_m_file_path]):

            # return MatlabSim(m_file_path, benchmark_os_path, parallel)

            return MEngPy(m_file_path, benchmark_os_path, parallel, sim_args)
        else:
            raise err.FileNotFound('file does not exist: ' + m_file_path)
    elif sim_type == 'simulink':
        return SimulinkSim()
    elif sim_type == 'python':
        logger.info('creating Native Python simulator')

        # get the file path

        python_file_path = config_dict['plant_path']
        #(module_name, file_ext) = python_file_path.split('.')
        (module_name, file_ext) = fp.split_filename_ext(python_file_path)
        if file_ext != 'py':
            raise err.Fatal('Python file extension py expected, found: {}'.format(file_ext))
        module_path = fp.construct_path(python_file_path, benchmark_os_path)
        if fp.validate_file_names([module_path]):
            return NativeSim(module_name, module_path, plt, plant_pvt_init_data, parallel)
        else:
            raise err.FileNotFound('file does not exist: ' + python_file_path)
    elif sim_type == 'test':
        return TestSim(test_params)
    else:
        raise err.Fatal('unknown sim type : {}'.format(sim_type))
Пример #3
0
    def __init__(self, controller_path, num_dims, plant_config_dict, delta_t,
                 controller_path_dir_path, controller_object_str, path,
                 plant_pvt_init_data):
        self.num_dims = num_dims
        self.controller_path = controller_path
        self.controller_object_str = controller_object_str
        self.plant_pvt_init_data = plant_pvt_init_data
        self.plant_config_dict = plant_config_dict

        self.delta_t = delta_t
        self.controller_path_dir_path = controller_path_dir_path
        self.path = path

        self.sanity_check = U.assert_no_Nones

        try:
            sim_type = self.plant_config_dict['plant_description']
            if sim_type == 'python':
                logger.info('creating Native Python simulator')

                # get the file path

                python_file_path = plant_config_dict['plant_path']
                #(module_name, file_ext) = python_file_path.split('.')
                (module_name,
                 file_ext) = fp.split_filename_ext(python_file_path)
                if file_ext != 'py':
                    raise err.Fatal(
                        'Python file extension py expected, found: {}'.format(
                            file_ext))
                module_path = fp.construct_path(python_file_path, self.path)
                if fp.validate_file_names([module_path]):

                    sim_module = imp.load_source(module_name, module_path)
                    self.sim_obj = sim_module.SIM(self.plant_pvt_init_data)
                    self.sim = self.sim_obj.sim

                    self.stateDict = {}

                    # inputs and params are unhandled...

                    self.inputs = None
                    self.params = None

                    # # currently plot in matlab itself

                    # self.plot = None
                else:
                    raise err.FileNotFound('file does not exist: ' +
                                           python_file_path)
            else:
                raise err.Fatal('unknown sim type : {}'.format(sim_type))

        except KeyError, key:
            raise err.Fatal(
                'expected abstraction parameter undefined: {}'.format(key))
Пример #4
0
 def init_sims(self, plt_lib, psim_args):
     self.plant_sim = psim.simulator_factory(
         self.plant_config_dict,
         self.path,
         plt=plt_lib,
         plant_pvt_init_data=self.plant_pvt_init_data,
         parallel=False,
         sim_args=psim_args)  # TAG:MSH
     if self.controller_path is None:
         self.controller_sim = csim.DummyController(self.num_dims)
     else:
         self.controller_sim = csim.ControllerSO(
             fp.construct_path(self.controller_path, self.path),
             self.num_dims)
     self.controller_sim.compute = self.controller_sim.call
Пример #5
0
 def init_sims(self, plt_lib, psim_args):
     self.plant_sim = psim.simulator_factory(
         self.plant_config_dict,
         self.path,
         plt=plt_lib,
         plant_pvt_init_data=self.plant_pvt_init_data,
         parallel=False,
         sim_args=psim_args)# TAG:MSH
     if self.controller_path is None:
         self.controller_sim = csim.DummyController(self.num_dims)
     else:
         self.controller_sim = csim.ControllerSO(
             fp.construct_path(self.controller_path, self.path),
             self.num_dims)
     self.controller_sim.compute = self.controller_sim.call
Пример #6
0
def parse(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)

    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

        sys = System(controller_path, num_dims, plant_config_dict, delta_t,
                     controller_path_dir_path, controller_object_str, path,
                     plant_pvt_init_data, sut.min_smt_sample_dist,
                     sut.ci_grid_eps, sut.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)

        #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)
    print('system loaded...')
    return sys, prop
Пример #7
0
def main():
    logger.info('execution begins')
    LIST_OF_SYEMX_ENGINES = ['klee', 'pathcrawler']
    LIST_OF_CONTROLLER_REPRS = ['smt2', 'trace']
    LIST_OF_TRACE_STRUCTS = ['list', 'tree']
    LIST_OF_REFINEMENTS = ['init', 'trace']

    usage = '%(prog)s <filename>'
    parser = argparse.ArgumentParser(description='S3CAM', usage=usage)
    parser.add_argument('-f',
                        '--filename',
                        default=None,
                        metavar='file_path.tst')

    #parser.add_argument('--run-benchmarks', action="store_true", default=False,
    #                    help='run pacakged benchmarks')

    parser.add_argument('-s',
                        '--simulate',
                        type=int,
                        metavar='num-sims',
                        help='simulate')
    parser.add_argument('-c',
                        '--ss-concrete',
                        action="store_true",
                        help='scatter & simulate')
    parser.add_argument(
        '--ss-concolic',
        action="store_true",
        help='scatter & simulate with concolic execution using KLEE')
    parser.add_argument('-x',
                        '--ss-symex',
                        type=str,
                        metavar='engine',
                        choices=LIST_OF_SYEMX_ENGINES,
                        help='SS + SymEx with static paths')

    parser.add_argument('-r',
                        '--cntrl-rep',
                        type=str,
                        metavar='repr',
                        choices=LIST_OF_CONTROLLER_REPRS,
                        help='Controller Representation')

    parser.add_argument('-p',
                        '--plot',
                        action='store_true',
                        help='enable plotting')

    parser.add_argument('--dump',
                        action='store_true',
                        help='dump trace in mat file')

    parser.add_argument('--seed',
                        type=int,
                        metavar='seed_value',
                        help='seed for the random generator')

    # TAG:MSH
    parser.add_argument('--meng',
                        type=str,
                        metavar='engine_name',
                        help='Shared Matlab Engine name')

    parser.add_argument('-t',
                        '--trace-struct',
                        type=str,
                        metavar='struct',
                        default='tree',
                        choices=LIST_OF_TRACE_STRUCTS,
                        help='structure for cntrl-rep')

    parser.add_argument('--refine',
                        type=str,
                        metavar='method',
                        default='init',
                        choices=LIST_OF_REFINEMENTS,
                        help='Refinement method')

    parser.add_argument('-o',
                        '--output',
                        type=str,
                        default='vio.log',
                        help='violation log')

    #    argcomplete.autocomplete(parser)
    args = parser.parse_args()
    #print(args)

    if args.filename is None:
        print('No file to test. Please use --help')
        exit()
        print('No arguments passed. Loading list of packaged benchmarks!')
        example_list = egl.get_example_list()
        print('select from a list of examples')
        for (idx, example) in enumerate(example_list):
            print('({}) {}'.format(idx, example_list[idx]['description']))

        i = int(raw_input())
        filename = example_list[i]['filename']
        path = example_list[i]['path']
        filepath = fp.construct_path(filename, path)
    else:
        filepath = args.filename

    if args.seed is not None:
        np.random.seed(args.seed)

    # TODO:
    # dynamicall generate an opt class to mimic the same defined in
    # loadsystem.py
    # switch this to a reg class later.
    Options = type('Options', (), {})
    opts = Options()
    if args.simulate is not None:
        opts.MODE = 'simulate'
        opts.num_sim_samples = args.simulate
    elif args.ss_concrete:
        opts.MODE = 'falsify'
        opts.METHOD = 'concrete'
    elif args.ss_concolic:
        opts.MODE = 'falsify'
        opts.METHOD = 'concolic'
        print('removed concolic (KLEE)')
        exit(0)
    elif args.ss_symex is not None:
        opts.MODE = 'falsify'
        opts.METHOD = 'symbolic'
        opts.symbolic_analyzer = args.ss_symex
        #if opts.symbolic_analyzer not in LIST_OF_SYEMX_ENGINES:
        #    raise err.Fatal('unknown symbolic analyses engine requested.')
        if args.cntrl_rep is None:
            raise err.Fatal('controller representation must be provided')
        else:
            opts.cntrl_rep = args.cntrl_rep
            opts.trace_struct = args.trace_struct
    else:
        raise err.Fatal('no options passed. Check usage.')
    opts.plot = args.plot
    opts.dump_trace = args.dump
    opts.refine = args.refine
    opts.op_fname = args.output
    opts.sys_path = filepath

    sys, prop = loadsystem.parse(filepath)
    # TAG:MSH
    matlab_engine = args.meng
    sys.init_sims(plt, psim_args=matlab_engine)

    if opts.plot:
        pass
        #import matplotlib

        # Force GTK3 backend. By default GTK2 gets loaded and conflicts with
        # graph-tool

        #matplotlib.use('GTK3Agg')
        #global plt
        #import matplotlib.pyplot as plt
    sanity_check_input(sys, prop, opts)
    run_secam(sys, prop, opts)
Пример #8
0
def parse(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)

    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

        sys = System(controller_path, num_dims, plant_config_dict,
                     delta_t, controller_path_dir_path,
                     controller_object_str, path, plant_pvt_init_data,
                     sut.min_smt_sample_dist, sut.ci_grid_eps,
                     sut.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)

        #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)
    print('system loaded...')
    return sys, prop
Пример #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