Skip to content

Commit fbecd6c

Browse files
authored
Merge pull request #58 from LIHPC-Computational-Geometry/57-gymnasium-env
57 gymnasium env
2 parents 620e9df + d548165 commit fbecd6c

File tree

79 files changed

+1568
-79
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1568
-79
lines changed

actions/triangular_actions.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from mesh_model.mesh_struct.mesh import Mesh
44
from mesh_model.mesh_struct.mesh_elements import Dart, Node
5-
from mesh_model.mesh_analysis import isFlipOk, isCollapseOk, adjacent_darts, isSplitOk
5+
from mesh_model.mesh_analysis import isFlipOk, isCollapseOk, isSplitOk
66

77

88
def flip_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
@@ -11,9 +11,12 @@ def flip_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
1111

1212
def flip_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
1313
found, d = mesh.find_inner_edge(n1, n2)
14-
15-
if not found or not isFlipOk(d):
16-
return False
14+
if found:
15+
topo, geo = isFlipOk(d)
16+
if not geo or not topo:
17+
return False, topo, geo
18+
else:
19+
return False, False, False
1720

1821
d2, d1, d11, d21, d211, n1, n2, n3, n4 = mesh.active_triangles(d)
1922

@@ -42,7 +45,7 @@ def flip_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
4245
d2.set_node(n4)
4346
d211.set_face(f1)
4447
d11.set_face(f2)
45-
return True
48+
return True, topo, geo
4649

4750

4851
def split_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
@@ -51,8 +54,13 @@ def split_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
5154

5255
def split_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
5356
found, d = mesh.find_inner_edge(n1, n2)
54-
if not found or not isSplitOk(d):
55-
return False
57+
58+
if found:
59+
topo, geo = isSplitOk(d)
60+
if not geo or not topo:
61+
return False, topo, geo
62+
else:
63+
return False, True, False
5664

5765
d2, d1, _, d21, _, n1, n2, n3, n4 = mesh.active_triangles(d)
5866

@@ -78,7 +86,7 @@ def split_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
7886
db2 = d.get_beta(2)
7987
db21 = db2.get_beta(1)
8088
mesh.set_beta2(db21)
81-
return True
89+
return True, topo, geo
8290

8391

8492
def collapse_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
@@ -87,9 +95,12 @@ def collapse_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
8795

8896
def collapse_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
8997
found, d = mesh.find_inner_edge(n1, n2)
90-
91-
if not found or not isCollapseOk(d):
92-
return False
98+
if found:
99+
topo, geo = isCollapseOk(d)
100+
if not geo or not topo:
101+
return False, topo, geo
102+
else:
103+
return False, False, False
93104

94105
_, d1, d11, d21, d211, n1, n2, _, _ = mesh.active_triangles(d)
95106

@@ -145,7 +156,7 @@ def collapse_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
145156
#delete n2 node
146157
mesh.del_node(n2)
147158

148-
return mesh_check(mesh)
159+
return mesh_check(mesh), topo, geo
149160

150161

151162
def check_beta2_relation(mesh: Mesh) -> bool:

environment/gymnasium_envs/__init__.py

Whitespace-only changes.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from gymnasium.envs.registration import register
2+
from environment.gymnasium_envs.trimesh_flip_env.envs.trimesh import TriMeshEnvFlip
3+
4+
register(
5+
id="TrimeshFlip-v0",
6+
entry_point="environment.gymnasium_envs.trimesh_flip_env.envs:TriMeshEnvFlip",
7+
max_episode_steps=100,
8+
kwargs={"mesh": None, "mesh_size": 30, "n_darts_selected": 20, "deep": 6, "with_degree_obs": True, "action_restriction": False},
9+
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from environment.gymnasium_envs.trimesh_flip_env.envs.trimesh import TriMeshEnvFlip
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
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

Comments
 (0)