Esempio n. 1
0
def run_sim_basic(
        sim_params,
        env_params,
        life_params={},
        collections=None,
        save_to=None,
        media_name=None,
        save_data_flag=True,
        enrich=False,
        experiment=None,
        par_config=dat.SimParConf,
        seed=1,
        **kwargs):
    if collections is None:
        collections = ['pose']
    np.random.seed(seed)
    id = sim_params['sim_id']
    dt = sim_params['dt']
    Nsec = sim_params['sim_dur'] * 60
    path = sim_params['path']
    Box2D = sim_params['Box2D']

    if save_to is None:
        save_to = paths.SimFolder
    if path is not None:
        save_to = os.path.join(save_to, path)
    dir_path = os.path.join(save_to, id)

    # Store the parameters so that we can save them in the results folder
    sim_date = datetime.datetime.now()
    param_dict = locals()
    start = time.time()
    Nsteps = int(Nsec / dt)
    # # FIXME This only takes the first configuration into account
    # print(env_params['larva_params'].values())
    Npoints = list(env_params['larva_params'].values())[0]['model']['body_params']['Nsegs'] + 1


    d = LarvaDataset(dir=dir_path, id=id, fr=int(1 / dt),
                     Npoints=Npoints, Ncontour=0,
                     arena_pars=env_params['arena_params'],
                     par_conf=par_config, save_data_flag=save_data_flag, load_data=False,
                     life_params=life_params
                     )

    collected_pars = collection_conf(dataset=d, collections=collections)
    env = LarvaWorldSim(id=id, dt=dt, Box2D=Box2D,
                        # larva_pars=larva_pars,
                        env_params=env_params,  collected_pars=collected_pars,
                        life_params=life_params, Nsteps=Nsteps,
                        media_name=media_name, save_to=d.vis_dir,experiment=experiment,
                        ** kwargs)
    # Prepare the odor layer for a number of timesteps
    odor_prep_time = 0.0
    larva_prep_time = 0.5
    env.prepare_odor_layer(int(odor_prep_time * 60 / env.dt))
    # Prepare the flies for a number of timesteps
    env.prepare_flies(int(larva_prep_time * 60 / env.dt))
    print(f'Initialized simulation {id}!')

    # Run the simulation
    completed = env.run()

    if not completed:
        d.delete()
        print(f'Simulation not completed!')
        res = None
    else:
        # Read the data collected during the simulation
        env.larva_end_col.collect(env)
        env.food_end_col.collect(env)

        d.set_step_data(env.larva_step_col.get_agent_vars_dataframe())
        d.set_end_data(env.larva_end_col.get_agent_vars_dataframe().droplevel('Step'))
        d.set_food_end_data(env.food_end_col.get_agent_vars_dataframe().droplevel('Step'))

        end = time.time()
        dur = end - start
        param_dict['duration'] = np.round(dur, 2)

        # Save simulation data and parameters
        if save_data_flag:
            if enrich and experiment is not None:
                d = sim_enrichment(d, experiment)
            d.save()
            fun.dict_to_file(param_dict, d.sim_pars_file_path)
            # Save the odor layer
            if env.Nodors > 0:
                env.plot_odorscape(save_to=d.plot_dir)
        print(f'Simulation completed in {dur} seconds!')
        res= d
    env.close()
    return res
Esempio n. 2
0
def run_sim_basic(sim_id,
                  sim_params,
                  env_params,
                  fly_params,
                  save_to=None,
                  common_folder=None,
                  media_name=None,
                  save_data_flag=True,
                  enrich=False,
                  experiment=None,
                  par_config=conf.SimParConf,
                  starvation_hours=[],
                  deb_base_f=1,
                  preview=False,
                  **kwargs):

    # print(starvation_hours)
    if save_to is None:
        save_to = paths.SimFolder
    # current_date = date.today()
    # Store the parameters so that we can save them in the results folder
    sim_date = datetime.datetime.now()
    param_dict = locals()
    start = time.time()
    dt = sim_params['dt']
    Nsec = sim_params['sim_time_in_min'] * 60
    Nsteps = int(Nsec / dt)

    print(sim_params['sim_time_in_min'])

    if common_folder:
        parentdir = os.path.join(save_to, common_folder)
    else:
        parentdir = save_to
    dir_path = os.path.join(parentdir, sim_id)

    # FIXME This only takes the first configuration into account
    if not type(fly_params) == list:
        Npoints = fly_params['body_params']['Nsegs'] + 1
    else:
        Npoints = fly_params[0]['body_params']['Nsegs'] + 1

    # Build the environment
    # try :
    d = LarvaDataset(dir=dir_path,
                     id=sim_id,
                     fr=int(1 / dt),
                     Npoints=Npoints,
                     Ncontour=0,
                     arena_pars=env_params['arena_params'],
                     par_conf=par_config,
                     save_data_flag=save_data_flag,
                     load_data=False,
                     starvation_hours=starvation_hours,
                     deb_base_f=deb_base_f)

    collected_pars = data_collection_config(dataset=d, sim_params=sim_params)
    env = LarvaWorldSim(fly_params,
                        id=sim_id,
                        env_params=env_params,
                        dt=dt,
                        Nsteps=Nsteps,
                        collected_pars=collected_pars,
                        media_name=media_name,
                        save_to=d.vis_dir,
                        starvation_hours=starvation_hours,
                        deb_base_f=deb_base_f,
                        **kwargs)
    # Prepare the odor layer for a number of timesteps
    env.prepare_odor_layer(
        int(sim_params['odor_prep_time_in_min'] * 60 / env.dt))
    # Prepare the flies for a number of timesteps
    env.prepare_flies(int(sim_params['fly_prep_time_in_min'] * 60 / env.dt))
    print(f'Initialized simulation {sim_id}!')
    if preview:
        env.step()
        env.render()

        im = env.get_image_path()
        env.close()
        return im
    # except :
    #     print (f'Failed to initialize simulation {sim_id}.')
    #     return None

    # Run the simulation
    completed = env.run()

    if not completed:
        print(f'Simulation not completed!')
        return None
    else:
        # Read the data collected during the simulation
        larva_step_data = env.larva_step_collector.get_agent_vars_dataframe()

        env.larva_endpoint_collector.collect(env)
        env.food_endpoint_collector.collect(env)
        larva_endpoint_data = env.larva_endpoint_collector.get_agent_vars_dataframe(
        )
        food_endpoint_data = env.food_endpoint_collector.get_agent_vars_dataframe(
        )
        env.close()

        larva_endpoint_data = larva_endpoint_data.droplevel('Step')
        food_endpoint_data = food_endpoint_data.droplevel('Step')
        if 'cum_dur' in sim_params['end_pars']:
            larva_endpoint_data['cum_dur'] = larva_step_data.index.unique(
                'Step').size * d.dt
        if 'num_ticks' in sim_params['end_pars']:
            larva_endpoint_data['num_ticks'] = larva_step_data.index.unique(
                'Step').size
        d.set_step_data(larva_step_data)
        d.set_endpoint_data(larva_endpoint_data)
        d.set_food_endpoint_data(food_endpoint_data)

        end = time.time()
        dur = end - start
        param_dict['duration'] = np.round(dur, 2)

        # Save simulation data and parameters
        if save_data_flag:
            if enrich and experiment is not None:
                d = sim_enrichment(d, experiment)
            d.save()
            fun.dict_to_file(param_dict, d.sim_pars_file_path)
            # Show the odor layer
            if env.Nodors > 0:
                env.plot_odorscape(save_to=d.plot_dir)
        print(f'Simulation completed in {dur} seconds!')
        return d