1+ import numpy as np
2+ from mesh_model .mesh_analysis import isValidAction , find_template_opposite_node
3+ from mesh_model .mesh_struct .mesh_elements import Dart
4+ from mesh_model .mesh_struct .mesh import Mesh
5+
6+
7+ def get_x (state : Mesh , n_darts_selected : int , deep :int , degree : bool , restricted :bool , nodes_scores : list [int ], nodes_adjacency : list [int ]):
8+ mesh = state
9+ if degree :
10+ template , darts_id = get_template_deg (mesh , deep , nodes_scores , nodes_adjacency )
11+ else :
12+ template , darts_id = get_template (mesh , deep , nodes_scores )
13+
14+ if restricted :
15+ darts_to_delete = []
16+ darts_id = []
17+ for i , d_info in enumerate (mesh .active_darts ()):
18+ d_id = d_info [0 ]
19+ if d_info [2 ] == - 1 or not isValidAction (mesh , d_info [0 ], 0 )[0 ]: # test the validity of all action type
20+ darts_to_delete .append (i )
21+ else :
22+ darts_id .append (d_id )
23+ valid_template = np .delete (template , darts_to_delete , axis = 0 )
24+ else :
25+ valid_template = template
26+ score_sum = np .sum (np .abs (valid_template [:,:deep ]), axis = 1 )
27+ indices_selected_darts = np .argsort (score_sum )[- n_darts_selected :][::- 1 ]
28+ valid_dart_ids = [darts_id [i ] for i in indices_selected_darts ]
29+ X = valid_template [indices_selected_darts , :]
30+ return X , np .array (valid_dart_ids )
31+
32+
33+ def get_template (mesh : Mesh , deep : int , nodes_scores ):
34+ size = len (mesh .dart_info )
35+ template = np .zeros ((size , deep ), dtype = np .int64 )
36+ dart_ids = []
37+ n_darts = 0
38+
39+ for d_info in mesh .active_darts ():
40+ n_darts += 1
41+ d_id = d_info [0 ]
42+ dart_ids .append (d_id )
43+ d = Dart (mesh , d_id )
44+ A = d .get_node ()
45+ d1 = d .get_beta (1 )
46+ B = d1 .get_node ()
47+ d11 = d1 .get_beta (1 )
48+ C = d11 .get_node ()
49+
50+ # Template niveau 1
51+ template [n_darts - 1 , 0 ] = nodes_scores [C .id ]
52+ template [n_darts - 1 , 1 ] = nodes_scores [A .id ]
53+ template [n_darts - 1 , 2 ] = nodes_scores [B .id ]
54+
55+ if deep > 3 :
56+ # template niveau 2 deep = 6
57+ n_id = find_template_opposite_node (d )
58+ if n_id is not None :
59+ template [n_darts - 1 , 3 ] = nodes_scores [n_id ]
60+ n_id = find_template_opposite_node (d1 )
61+ if n_id is not None :
62+ template [n_darts - 1 , 4 ] = nodes_scores [n_id ]
63+ n_id = find_template_opposite_node (d11 )
64+ if n_id is not None :
65+ template [n_darts - 1 , 5 ] = nodes_scores [n_id ]
66+
67+ if deep > 6 :
68+ # template niveau 3 - deep = 12
69+ d2 , d1 , d11 , d21 , d211 , n1 , n2 , n3 , n4 = mesh .active_triangles (d )
70+ #Triangle F2
71+ n_id = find_template_opposite_node (d21 )
72+ if n_id is not None :
73+ template [n_darts - 1 , 6 ] = nodes_scores [n_id ]
74+ n_id = find_template_opposite_node (d211 )
75+ if n_id is not None :
76+ template [n_darts - 1 , 7 ] = nodes_scores [n_id ]
77+ # Triangle T3
78+ d12 = d1 .get_beta (2 )
79+ d121 = d12 .get_beta (1 )
80+ d1211 = d121 .get_beta (1 )
81+ n_id = find_template_opposite_node (d121 )
82+ if n_id is not None :
83+ template [n_darts - 1 , 8 ] = nodes_scores [n_id ]
84+ n_id = find_template_opposite_node (d1211 )
85+ if n_id is not None :
86+ template [n_darts - 1 , 9 ] = nodes_scores [n_id ]
87+ # Triangle T4
88+ d112 = d11 .get_beta (2 )
89+ d1121 = d112 .get_beta (1 )
90+ d11211 = d1121 .get_beta (1 )
91+ n_id = find_template_opposite_node (d1121 )
92+ if n_id is not None :
93+ template [n_darts - 1 , 10 ] = nodes_scores [n_id ]
94+ n_id = find_template_opposite_node (d11211 )
95+ if n_id is not None :
96+ template [n_darts - 1 , 11 ] = nodes_scores [n_id ]
97+
98+ template = template [:n_darts , :]
99+
100+ return template , dart_ids
101+
102+ def get_template_deg (mesh : Mesh , deep : int , nodes_scores , nodes_adjacency ):
103+ size = len (mesh .dart_info )
104+ template = np .zeros ((size , deep * 2 ), dtype = np .int64 )
105+ dart_ids = []
106+ n_darts = 0
107+
108+ for d_info in mesh .active_darts ():
109+ n_darts += 1
110+ d_id = d_info [0 ]
111+ dart_ids .append (d_id )
112+ d = Dart (mesh , d_id )
113+ A = d .get_node ()
114+ d1 = d .get_beta (1 )
115+ B = d1 .get_node ()
116+ d11 = d1 .get_beta (1 )
117+ C = d11 .get_node ()
118+
119+ # Template niveau 1
120+ template [n_darts - 1 , 0 ] = nodes_scores [C .id ]
121+ template [n_darts - 1 , deep ] = nodes_adjacency [C .id ]
122+ template [n_darts - 1 , 1 ] = nodes_scores [A .id ]
123+ template [n_darts - 1 , deep + 1 ] = nodes_adjacency [A .id ]
124+ template [n_darts - 1 , 2 ] = nodes_scores [B .id ]
125+ template [n_darts - 1 , deep + 2 ] = nodes_adjacency [B .id ]
126+
127+ if deep > 3 :
128+ # template niveau 2
129+ n_id = find_template_opposite_node (d )
130+ if n_id is not None :
131+ template [n_darts - 1 , 3 ] = nodes_scores [n_id ]
132+ template [n_darts - 1 , deep + 3 ] = nodes_adjacency [n_id ]
133+ n_id = find_template_opposite_node (d1 )
134+ if n_id is not None :
135+ template [n_darts - 1 , 4 ] = nodes_scores [n_id ]
136+ template [n_darts - 1 , deep + 4 ] = nodes_adjacency [n_id ]
137+ n_id = find_template_opposite_node (d11 )
138+ if n_id is not None :
139+ template [n_darts - 1 , 5 ] = nodes_scores [n_id ]
140+ template [n_darts - 1 , deep + 5 ] = nodes_adjacency [n_id ]
141+
142+ if deep > 6 :
143+ # template niveau 3 - deep = 12
144+ if d .get_beta (2 ) is not None :
145+ d2 , d1 , d11 , d21 , d211 , n1 , n2 , n3 , n4 = mesh .active_triangles (d )
146+ #Triangle F2
147+ n_id = find_template_opposite_node (d21 )
148+ if n_id is not None :
149+ template [n_darts - 1 , 6 ] = nodes_scores [n_id ]
150+ template [n_darts - 1 , deep + 6 ] = nodes_adjacency [n_id ]
151+ n_id = find_template_opposite_node (d211 )
152+ if n_id is not None :
153+ template [n_darts - 1 , 7 ] = nodes_scores [n_id ]
154+ template [n_darts - 1 , deep + 7 ] = nodes_adjacency [n_id ]
155+ # Triangle T3
156+ d12 = d1 .get_beta (2 )
157+ if d12 is not None :
158+ d121 = d12 .get_beta (1 )
159+ d1211 = d121 .get_beta (1 )
160+ n_id = find_template_opposite_node (d121 )
161+ if n_id is not None :
162+ template [n_darts - 1 , 8 ] = nodes_scores [n_id ]
163+ template [n_darts - 1 , deep + 8 ] = nodes_adjacency [n_id ]
164+ n_id = find_template_opposite_node (d1211 )
165+ if n_id is not None :
166+ template [n_darts - 1 , 9 ] = nodes_scores [n_id ]
167+ template [n_darts - 1 , deep + 9 ] = nodes_adjacency [n_id ]
168+ # Triangle T4
169+ d112 = d11 .get_beta (2 )
170+ if d112 is not None :
171+ d1121 = d112 .get_beta (1 )
172+ d11211 = d1121 .get_beta (1 )
173+ n_id = find_template_opposite_node (d1121 )
174+ if n_id is not None :
175+ template [n_darts - 1 , 10 ] = nodes_scores [n_id ]
176+ template [n_darts - 1 , deep + 10 ] = nodes_adjacency [n_id ]
177+ n_id = find_template_opposite_node (d11211 )
178+ if n_id is not None :
179+ template [n_darts - 1 , 11 ] = nodes_scores [n_id ]
180+ template [n_darts - 1 , deep + 11 ] = nodes_adjacency [n_id ]
181+
182+ template = template [:n_darts , :]
183+ return template , dart_ids
0 commit comments