-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshape_def.py
32 lines (23 loc) · 1.1 KB
/
shape_def.py
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
import itertools
import numpy as np
from numpy.typing import NDArray
class Shape:
def __init__(self, vertices: NDArray[np.float64], edges: NDArray[np.int_]) -> None:
self.vertices: NDArray[np.float64] = vertices
self.edges: NDArray[np.int_] = edges
@staticmethod
def define_n_dimensional_cube(n: int) -> 'Shape':
vertices = np.array(list(itertools.product([-1, 1], repeat=n)), dtype=np.float64)
edges = []
dimension = vertices.shape[1]
vertex_to_index = {tuple(vertex): idx for idx, vertex in enumerate(vertices)}
for idx, vertex in enumerate(vertices):
for dim in range(dimension):
neighbor = vertex.copy()
neighbor[dim] *= -1
neighbor_tuple = tuple(neighbor)
neighbor_idx = vertex_to_index.get(neighbor_tuple)
if neighbor_idx is not None and neighbor_idx > idx:
edges.append((idx, neighbor_idx))
edges_array = np.array(edges, dtype=np.int_)
return Shape(vertices, edges_array)