summaryrefslogtreecommitdiff
path: root/ero1/src/generation/snow_generation.py
blob: 449a4ec2c8a1ffa6afc72d95328831e8abe50dee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# FICHIER DEPRECATED : Ce fichier n'est plus utilisé.

import random
import parameters as params


def place_snow(G):
    """
    Place de la neige sur les egdes du graphe
    Parameters:
        G (voir quel type on veut utiliser): le graphe des routes
    Returns:
        None: le graphe est modifié en place
    """
    # WARNING: je ne suis pas sûr de cette manière de faire qui me semble boffe, je pense qu'une manière plus random (mais plus sale/lente) serait de shuffle la liste d'edges. Le soucis avec la méthode actuelle c'est que si G.egdes(...) ordonne les arcs/arêtes d'une manière prédéfinie, alors le début/la fin de la liste sera composé de beacoup/peu de neige, ce qui n'est pas uniforme
    edges = list(G.edges(keys=True, data=True))
    n = len(edges)
    random.shuffle(edges)
    amount_to_cover = int(params.SNOW_PERCENTAGE * n)
    quantity: float = 0

    for u, v, k, data in edges:
        if (amount_to_cover == 0):  # we should place > 2.5cm snow
            quantity = random.uniform(
                params.SNOW_THRESHOLD + 0.01, params.SNOW_MAX)
        else:  # we do not care
            quantity = random.uniform(params.SNOW_MIN, params.SNOW_MAX)

        if (quantity >= params.SNOW_THRESHOLD):
            amount_to_cover -= 1

        data['snow'] = quantity


def place_snow_v2(G):
    """
    Place de la neige sur les egdes du graphe, moins opti que la v1 mais gère les cas (u,v) et (v,u) (plus réaliste)
    Parameters:
        G (voir quel type on veut utiliser): le graphe des routes
    Returns:
        (int, int): (nb_edges_oriented, nb_edges_nonoriented), renvoie le nombre d'edges qui ont plus de 2.5 cm de neige (utile pour débug les drônes)
    """
    edges = list(G.edges(keys=True, data=True))
    n = len(edges)
    random.shuffle(edges)
    amount_to_cover = int(params.SNOW_PERCENTAGE * n)
    TO_DELETE = amount_to_cover  # pls delete once testing is finished
    quantity: float = 0

    res_oriented = 0
    res_unoriented = 0
    visited = {}  # (u,v) => quantity

    for u, v, k, data in edges:
        if (v, u) in visited:
            data['snow'] = visited[(v, u)]
            amount_to_cover -= 1

            res_unoriented += 1
            # we do not increment res_oriented since (u,v) and (v,u) are the same thing
            # => check to_undirected but should be good
        elif (u, v) in visited:
            data['snow'] = visited[(u, v)]
            # WARNING: this implementation might not be the most accurate/best

            amount_to_cover -= 1
            # TODO : wtf do I do with the counters ... technically nothing ?
        else:
            if (amount_to_cover <= 0):  # we should place > 2.5cm snow
                quantity = random.uniform(
                    params.SNOW_THRESHOLD + 0.01, params.SNOW_MAX)
            else:  # we do not care
                quantity = random.uniform(params.SNOW_MIN, params.SNOW_MAX)

            if (quantity >= params.SNOW_THRESHOLD):
                amount_to_cover -= 1

            data['snow'] = quantity
            visited[(u, v)] = quantity

            res_unoriented += 1
            res_oriented += 1

    # assert (TO_DELETE == res_unoriented) => need to check how to handle duplicate of the form (u,v)
    return res_oriented, res_unoriented