swarm-sim.py 3.6 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
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
    config_data = config.ConfigData()
Karol Actun's avatar
Karol Actun committed
21

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
    random.seed(config_data.seed_value)
27
    swarm_sim_world = world.World(config_data)
Karol Actun's avatar
Karol Actun committed
28
29
    while (config_data.max_round == 0 or swarm_sim_world.get_actual_round() <= config_data.max_round) \
            and swarm_sim_world.get_end() is False:
30
31
        round_start_timestamp = time.perf_counter()
        if config_data.visualization:
Karol Actun's avatar
Karol Actun committed
32
            swarm_sim_world.vis.run(round_start_timestamp)
Ahmad Reza's avatar
Ahmad Reza committed
33
34
        run_solution(swarm_sim_world)

Karol Actun's avatar
Karol Actun committed
35
    logging.info('Finished')
Ahmad Reza's avatar
Ahmad Reza committed
36

Karol Actun's avatar
Karol Actun committed
37
    # generate_data(config_data, swarm_sim_world)
Ahmad Reza's avatar
Ahmad Reza committed
38
39
40


def read_cmd_args(argv, config_data):
Ahmad Reza's avatar
Ahmad Reza committed
41
    try:
42
        opts, args = getopt.getopt(argv, "hs:w:r:n:m:d:v:", ["solution=", "scenario="])
Ahmad Reza's avatar
Ahmad Reza committed
43
    except getopt.GetoptError:
44
        print('Error: swarm-swarm_sim_world.py -r <seed> -w <scenario> -s <solution> -n <maxRounds>')
Ahmad Reza's avatar
Ahmad Reza committed
45
46
47
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
48
            print('swarm-swarm_sim_world.py -r <seed> -w <scenario> -s <solution> -n <maxRounds>')
Ahmad Reza's avatar
Ahmad Reza committed
49
50
            sys.exit()
        elif opt in ("-s", "--solution"):
Ahmad Reza's avatar
Ahmad Reza committed
51
            config_data.solution = arg
52
        elif opt in ("-w", "--scenario"):
Ahmad Reza's avatar
Ahmad Reza committed
53
            config_data.scenario = arg
Ahmad Reza's avatar
Ahmad Reza committed
54
        elif opt in ("-r", "--seed"):
Ahmad Reza's avatar
Ahmad Reza committed
55
            config_data.seed_value = int(arg)
Ahmad Reza's avatar
Ahmad Reza committed
56
        elif opt in ("-n", "--maxrounds"):
Ahmad Reza's avatar
Ahmad Reza committed
57
58
59
60
            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
61
            config_data.visualization = int(arg)
Ahmad Reza's avatar
Ahmad Reza committed
62
63
        elif opt in "-d":
            config_data.local_time = str(arg)
Ahmad Reza's avatar
Ahmad Reza committed
64
65


66
def create_direction_for_data(config_data):
67
    if config_data.multiple_sim == 1:
68
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
Karol Actun's avatar
Karol Actun committed
69
70
                                     "_" + config_data.solution.rsplit('.', 1)[0] + "/" + \
                                     str(config_data.seed_value)
71

72
        config_data.direction_name = "./outputs/mulitple/" + config_data.direction_name
73
74

    else:
75
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
Karol Actun's avatar
Karol Actun committed
76
77
                                     "_" + config_data.solution.rsplit('.', 1)[0] + "_" + \
                                     str(config_data.seed_value)
78
79
80
        config_data.direction_name = "./outputs/" + config_data.direction_name
    if not os.path.exists(config_data.direction_name):
        os.makedirs(config_data.direction_name)
81
82
83
84
85
86


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())
87
    swarm_sim_world.inc_round_counter_by(number=1)
Ahmad Reza's avatar
Ahmad Reza committed
88

89
90
91

def generate_data(config_data, swarm_sim_world):
    swarm_sim_world.csv_aggregator()
92
    gnuplot_generator(config_data.direction_name)
93
94
95


if __name__ == "__main__":
Karol Actun's avatar
Karol Actun committed
96
    swarm_sim(sys.argv[1:])