swarm-sim.py 4.03 KB
Newer Older
1
"""This is the main module of the Opportunistic Robotics Network Simulator"""
Ahmad Reza's avatar
Ahmad Reza committed
2
import importlib
Ahmad Reza's avatar
Ahmad Reza committed
3
4
5
6
import getopt
import logging
import os
import sys
7
import time
8
import random
9
from lib import world, config, vis
Ahmad Reza's avatar
Ahmad Reza committed
10
from lib.gnuplot_generator import gnuplot_generator
Ahmad Reza's avatar
Ahmad Reza committed
11
12


13
def swarm_sim(argv):
Ahmad Reza's avatar
Ahmad Reza committed
14
    """In the main function first the config is getting parsed and than
15
    the swarm_sim_world and the swarm_sim_world object is created. Afterwards the run method of the swarm_sim_world
Ahmad Reza's avatar
Ahmad Reza committed
16
    is called in which the simlator is going to start to run"""
Ahmad Reza's avatar
Ahmad Reza committed
17
18
19
    logging.basicConfig(filename='system.log', filemode='w', level=logging.INFO, format='%(message)s')
    logging.info('Started')

20
21
    config_data = config.ConfigData()
    
Ahmad Reza's avatar
Ahmad Reza committed
22
23
    read_cmd_args(argv, config_data)

24
    create_direction_for_data(config_data)
Ahmad Reza's avatar
Ahmad Reza committed
25

26
27
    random.seed(config_data.seed_value)

28
    swarm_sim_world = world.World(config_data)
Ahmad Reza's avatar
Ahmad Reza committed
29

30
31
32
33
34
    draw_scenario(config_data, swarm_sim_world)

    if config_data.visualization:
        window = vis.VisWindow(config_data.window_size_x, config_data.window_size_y, swarm_sim_world)

35
    while swarm_sim_world.get_actual_round() <= config_data.max_round and swarm_sim_world.get_end() is False:
36
37
        round_start_timestamp = time.perf_counter()
        if config_data.visualization:
38
39
            window.draw_world(round_start_timestamp)
            if window.window_active is False:
40
                break
Ahmad Reza's avatar
Ahmad Reza committed
41
42
43
        run_solution(swarm_sim_world)


Ahmad Reza's avatar
Ahmad Reza committed
44

45
    generate_data(config_data, swarm_sim_world)
Ahmad Reza's avatar
Ahmad Reza committed
46

47
    logging.info('Finished')
Ahmad Reza's avatar
Ahmad Reza committed
48

Ahmad Reza's avatar
Ahmad Reza committed
49

50
51
52
53
54
55
56
def draw_scenario(config_data, swarm_sim_world):
    mod = importlib.import_module('scenario.' + config_data.scenario)
    mod.scenario(swarm_sim_world)
    if config_data.particle_random_order:
        random.shuffle(swarm_sim_world.particles)


Ahmad Reza's avatar
Ahmad Reza committed
57
def read_cmd_args(argv, config_data):
Ahmad Reza's avatar
Ahmad Reza committed
58
    try:
59
        opts, args = getopt.getopt(argv, "hs:w:r:n:m:d:v:", ["solution=", "scenario="])
Ahmad Reza's avatar
Ahmad Reza committed
60
    except getopt.GetoptError:
61
        print('Error: swarm-swarm_sim_world.py -r <seed> -w <scenario> -s <solution> -n <maxRounds>')
Ahmad Reza's avatar
Ahmad Reza committed
62
63
64
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
65
            print('swarm-swarm_sim_world.py -r <seed> -w <scenario> -s <solution> -n <maxRounds>')
Ahmad Reza's avatar
Ahmad Reza committed
66
67
            sys.exit()
        elif opt in ("-s", "--solution"):
Ahmad Reza's avatar
Ahmad Reza committed
68
            config_data.solution = arg
69
        elif opt in ("-w", "--scenario"):
Ahmad Reza's avatar
Ahmad Reza committed
70
            config_data.scenario = arg
Ahmad Reza's avatar
Ahmad Reza committed
71
        elif opt in ("-r", "--seed"):
Ahmad Reza's avatar
Ahmad Reza committed
72
            config_data.seed_value = int(arg)
Ahmad Reza's avatar
Ahmad Reza committed
73
        elif opt in ("-n", "--maxrounds"):
Ahmad Reza's avatar
Ahmad Reza committed
74
75
76
77
            config_data.max_round = int(arg)
        elif opt in "-m":
            config_data.multiple_sim = int(arg)
        elif opt in "-v":
Ahmad Reza's avatar
Ahmad Reza committed
78
            config_data.visualization = int(arg)
Ahmad Reza's avatar
Ahmad Reza committed
79
80
        elif opt in "-d":
            config_data.local_time = str(arg)
Ahmad Reza's avatar
Ahmad Reza committed
81
82


83
def create_direction_for_data(config_data):
84
    if config_data.multiple_sim == 1:
85
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
86
87
88
                               "_" + config_data.solution.rsplit('.', 1)[0] + "/" + \
                               str(config_data.seed_value)

89
        config_data.direction_name = "./outputs/mulitple/" + config_data.direction_name
90
91

    else:
92
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
93
94
                               "_" + config_data.solution.rsplit('.', 1)[0] + "_" + \
                               str(config_data.seed_value)
95
96
97
        config_data.direction_name = "./outputs/" + config_data.direction_name
    if not os.path.exists(config_data.direction_name):
        os.makedirs(config_data.direction_name)
98
99
100
101
102
103


def run_solution(swarm_sim_world):
    mod = importlib.import_module('solution.' + swarm_sim_world.config_data.solution)
    mod.solution(swarm_sim_world)
    swarm_sim_world.csv_round.next_line(swarm_sim_world.get_actual_round())
104
    swarm_sim_world.inc_round_counter_by(number=1)
Ahmad Reza's avatar
Ahmad Reza committed
105

106
107
108

def generate_data(config_data, swarm_sim_world):
    swarm_sim_world.csv_aggregator()
109
    gnuplot_generator(config_data.direction_name)
110
111
112
113


if __name__ == "__main__":
    swarm_sim(sys.argv[1:])