Skip to content

Commit bf98769

Browse files
committed
New project architecture for scaling up
1 parent b9ce448 commit bf98769

18 files changed

+66
-11
lines changed
-7.7 KB
Loading
4.99 KB
Loading
6.22 KB
Loading

data/results/Shared value loss.png

7.41 KB
Loading

exact_solver.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import argparse
2-
from common import init_several_1D, init_2D, init_several_2D, init_3D, load_instance, directory
2+
from tools.common import init_several_1D, init_2D, init_several_2D, init_3D, load_instance, directory
33
from model.instance import Instance
44
from model.solution import Solution
55
import pandas as pd

gns_ppo_trainer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pickle
22
import os
33
from model.instance import Instance
4-
from common import directory
4+
from tools.common import directory
55
import torch
66
torch.autograd.set_detect_anomaly(True)
77
import random

gns_solver.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
from model.instance import Instance
33
from model.graph import GraphInstance, NO, NOT_YET, YES
44
from model.gnn import L1_EmbbedingGNN, L1_MaterialActor, L1_OutousrcingActor, L1_SchedulingActor, L1_CommonCritic
5-
from common import load_instance, to_bool, directory
5+
from tools.common import load_instance, to_bool, directory
66
import torch
77
torch.autograd.set_detect_anomaly(True)
88
import pandas as pd
99
import time as systime
1010
from typing import Callable
1111
from torch import Tensor
1212
from torch.nn import Module
13-
from instance2graph_translator import translate
13+
from translators.instance2graph_translator import translate
1414
from debug.debug_gns import check_completeness, debug_printer
1515
from gns_ppo_trainer import reward, PPO_train
1616
from model.agent import MultiAgent_OneInstance

instance_generator.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import random
33
import pickle
44
from model.instance import Instance
5-
from common import init_several_1D, init_several_2D, init_2D, init_1D, init_several_3D, directory
5+
from tools.common import init_several_1D, init_several_2D, init_2D, init_1D, init_several_3D, directory
66

77
# ==============================================================
88
# =*= RANDOM INSTANCE GENERATOR =*=

model/agent.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Tuple
55
import numpy as np
66
from torch.nn import Module
7-
from tensors import add_into_tensor
7+
from tools.tensors import add_into_tensor
88

99
# ===========================================================
1010
# =*= DATA MODEL FOR PPO AGENT CONFIGURATION AND RESULTS =*=

model/graph.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from torch_geometric.data.storage import EdgeStorage
44
from torch_geometric.utils import to_dense_adj
55
from torch import Tensor
6-
from common import num_feature
7-
from tensors import features2tensor, id2tensor
6+
from tools.common import num_feature
7+
from tools.tensors import features2tensor, id2tensor
88
from .instance import Instance
99

1010
# =============================================================

model/instance.py

+6
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,12 @@ def loop_projects(self):
289289

290290
def loop_items(self, p: int):
291291
return range(self.E_size[p])
292+
293+
def loop_resources(self):
294+
return range(self.nb_resources)
295+
296+
def loop_rts(self):
297+
return range(self.nb_resource_types)
292298

293299
def loop_operations(self, p: int):
294300
return range(self.O_size[p])

model/solution.py

+35-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
from model.instance import Instance
2+
from tools.common import init_several_1D, init_2D, init_several_2D, init_3D
3+
import random
4+
15
# ====================================================================
26
# =*= EXACT (Google OR-Tool) SOLUTION DATA STRUCTURE =*=
37
# ====================================================================
@@ -12,4 +16,34 @@ def __init__(self):
1216
self.precedes = [] # Relation between operations (p1, p2, o1, o2, feasible r)
1317
self.D_setup = [] # Design setup (p, o, r, s)
1418
self.Cmax = -1 # Cmax and objective
15-
self.obj = []
19+
self.obj = []
20+
21+
class HeuristicSolution(Solution):
22+
def __init__(self):
23+
Solution.__init__(self)
24+
self.sequences = [] # Sequences of each resource rt = (p,o)
25+
self.selection = [] # Selection of resourses for each operations and feasible resource type p, o, rt = r
26+
27+
def random_start_from_instance(self, i: Instance):
28+
nb_projects = i.get_nb_projects()
29+
elts_per_project = range(i.E_size[0])
30+
self.sequences = [[(p,o) for p, o in i.operations_by_resource_type(rt)] for rt in i.loop_rts()]
31+
for rt in i.loop_rts():
32+
random.shuffle(self.sequences[rt])
33+
self.selection = [[[random.choice(i.resources_by_type(rt)) for rt in i.required_rt(p,o)] for o in i.loop_operations(p)] for p in i.loop_projects()]
34+
self.E_start = [[0 for e in elts_per_project] for p in i.loop_projects()]
35+
self.E_outsourced = [[False for e in elts_per_project] for p in i.loop_projects()]
36+
self.E_prod_start = [[0 for e in elts_per_project] for p in i.loop_projects()]
37+
self.E_end = [[0 for e in elts_per_project] for p in i.loop_projects()]
38+
self.E_validated = [[0 for e in elts_per_project] for p in i.loop_projects()]
39+
self.O_uses_init_quantity, self.O_start, self.O_setup, self.O_end, self.O_executed, self.D_setup = init_several_1D(nb_projects, None, 6)
40+
self.precedes = init_2D(nb_projects, nb_projects, None)
41+
self.Cmax = 0
42+
for p in i.loop_projects():
43+
nb_ops = i.O_size[p]
44+
self.O_uses_init_quantity[p], self.O_setup[p], self.O_executed[p] = init_several_2D(nb_ops, i.nb_resources, False, 3)
45+
self.O_start[p], self.O_end[p] = init_several_2D(nb_ops, i.nb_resources, 0, 2)
46+
self.D_setup[p] = init_3D(nb_ops, i.nb_resources, i.nb_settings, False)
47+
for p2 in i.loop_projects():
48+
nb_ops2 = i.O_size[p2]
49+
self.precedes[p][p2] = init_3D(nb_ops, nb_ops2, i.nb_resources, False)

results_analysis.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import argparse
33
import glob
44
import os
5-
from common import directory
5+
from tools.common import directory
66
import pickle
77
from model.agent import MAPPO_Losses
88
from torch import Tensor

tabu_search_solver.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# =====================================================================
2+
# =*= Tabu Search Solver (generate or improve an existing solution) =*=
3+
# =====================================================================
4+
__author__ = "Anas Neumann - [email protected]"
5+
__version__ = "1.0.0"
6+
__license__ = "Apache 2.0 License"

common.py tools/common.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,4 @@ def search_object_by_id(objects: list[generic_object], id: int):
6969
for obj in objects:
7070
if obj['id'] == id:
7171
return obj
72-
return None
72+
return None

tensors.py tools/tensors.py

File renamed without changes.
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
# =============================================================================
3+
# =*= TRANSLATE GRPAH 2 SOLUTION =*=
4+
# Complete code to translate a model.GraphInstance to a model.HeuristicSolution
5+
# =============================================================================
6+
__author__ = "Anas Neumann - [email protected]"
7+
__version__ = "1.0.0"
8+
__license__ = "Apache 2.0 License"
9+
File renamed without changes.

0 commit comments

Comments
 (0)