swarm-sim.py 3.55 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_dir_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
        round_start_timestamp = time.perf_counter()
32

33
        run_solution(swarm_sim_world)
34

35
36
37
38
        if config_data.visualization:
            swarm_sim_world.window.draw_world(round_start_timestamp)
            if swarm_sim_world.window.window_active is False:
                break
Ahmad Reza's avatar
Ahmad Reza committed
39

40
    generate_data(config_data, swarm_sim_world)
Ahmad Reza's avatar
Ahmad Reza committed
41

42
    logging.info('Finished')
Ahmad Reza's avatar
Ahmad Reza committed
43

Ahmad Reza's avatar
Ahmad Reza committed
44
45

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


71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
def create_dir_for_data(config_data):
    if config_data.multiple_sim == 1:
        config_data.dir_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
                               "_" + config_data.solution.rsplit('.', 1)[0] + "/" + \
                               str(config_data.seed_value)

        config_data.dir_name = "./outputs/mulitple/" + config_data.dir_name

    else:
        config_data.dir_name = config_data.local_time + "_" + config_data.scenario.rsplit('.', 1)[0] + \
                               "_" + config_data.solution.rsplit('.', 1)[0] + "_" + \
                               str(config_data.seed_value)
        config_data.dir_name = "./outputs/" + config_data.dir_name
    if not os.path.exists(config_data.dir_name):
        os.makedirs(config_data.dir_name)


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())
    swarm_sim_world.inc_round_cnter()
Ahmad Reza's avatar
Ahmad Reza committed
93

94
95
96
97
98
99
100
101

def generate_data(config_data, swarm_sim_world):
    swarm_sim_world.csv_aggregator()
    gnuplot_generator(config_data.dir_name)


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