swarm-sim.py 3.54 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
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
    while swarm_sim_world.get_actual_round() <= config_data.max_round and swarm_sim_world.get_end() is False:
31
32
        round_start_timestamp = time.perf_counter()
        if config_data.visualization:
Karol Actun's avatar
Karol Actun committed
33
            swarm_sim_world.window.run(round_start_timestamp)
Ahmad Reza's avatar
Ahmad Reza committed
34
35
36
        run_solution(swarm_sim_world)


Ahmad Reza's avatar
Ahmad Reza committed
37

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

40
    logging.info('Finished')
Ahmad Reza's avatar
Ahmad Reza committed
41

Ahmad Reza's avatar
Ahmad Reza committed
42
43

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


69
def create_direction_for_data(config_data):
70
    if config_data.multiple_sim == 1:
71
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
72
73
74
                               "_" + config_data.solution.rsplit('.', 1)[0] + "/" + \
                               str(config_data.seed_value)

75
        config_data.direction_name = "./outputs/mulitple/" + config_data.direction_name
76
77

    else:
78
        config_data.direction_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
79
80
                               "_" + config_data.solution.rsplit('.', 1)[0] + "_" + \
                               str(config_data.seed_value)
81
82
83
        config_data.direction_name = "./outputs/" + config_data.direction_name
    if not os.path.exists(config_data.direction_name):
        os.makedirs(config_data.direction_name)
84
85
86
87
88
89


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

92
93
94

def generate_data(config_data, swarm_sim_world):
    swarm_sim_world.csv_aggregator()
95
    gnuplot_generator(config_data.direction_name)
96
97
98
99


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