|
Topological Material Analysis 0.5
Analyse the structures of materials using tools from TDA
|
Public Member Functions | |
| __init__ (self, inputfile=None, box=True, r_Li=0, d_P=2.5, d_S=2, sign_var=-1, grid_size=22, axes=[0, 1], dim=3, simply_connected_top_bottom=False, swap_res_grid_and_balls=False, close_loops_with_boundary_conditions=False, z_axis_boundaries=True, simplify_grid_with_triangles=True, cut_paths_until_A_0=True, a=1, b=0.5, c=0.1, K_graph=1, MP=True, verbose=False) | |
| produce_fobidden_region (self, balls_centres_=None, balls_radii_=None, M_=None, m_=None) | |
| setup_triangulation (self, balls_centres_=None, balls_radii_=None, M_=None, m_=None) | |
| estimate_atoms_min_distances (self, n=10) | |
| produce_res_grid (self, balls_centres_=None, balls_radii_=None, M_=None, m_=None) | |
| setup_geodesics_and_boundaries (self) | |
| make_edges (self) | |
| make_cubic_to_res (self, cubic_grid) | |
| make_triangulation (self) | |
| make_N (self) | |
| sample_diffusion (self) | |
| preprocess_path (self, path) | |
| cut_until_A_0 (self, path) | |
| simplify_path_with_homology (self, path) | |
| equivalence (self, v_path) | |
| fill_loop (self, idxs_list, BOUNDARY_MAT=None, RED_MAT=None, V_MAT=None, find_chain=False, plot=False) | |
| cluster_deadlocks (self, PATHS) | |
| traslate_box (self, coords, v_=None) | |
| check_cluster (self, n_clus, n=5, plot=False) | |
| proj_lithium_paths (self, LIST, plot=True) | |
| reeb_graph (self, grid, axis=-1, D_=None) | |
| build_graph (self, E, emb, fun) | |
| plot_pts (self, pts) | |
| plot_voids (self) | |
| plot_balls (self) | |
| plot_triangulation (self, axis=-1) | |
| plot_path (self, path) | |
| plot_vector_field (self, axis=1) | |
| plot_paths_clustered (self, min_len=5, k=0, aggregate=True) | |
| plot_results (self, min_len=5, k=0, aggregate=False) | |
| network_plot_3D (self, G, fun) | |
| plot_triangulation_and_paths (self, LIST, axis=-1, k=0.1) | |
| check_lithium_ranges (self, plot=True) | |
| check_lithium_paths (self, n=5) | |
| reduce_boundary_mat (self) | |
| compute_vector_field_penalties (self, v_=np.array([0, 0, 1])) | |
| make_markov_chain_matrix (self, eps_=1) | |
| equivalence_wrapper (self, loop) | |
| run_A_0_to_A_1_diffusion (self, n_paths=200, save=False, folder_path='/Users/ye72al/Library/Mobile Documents/com~apple~CloudDocs/Glass_TDA/') | |
| random_simplification_wrapper_MP (self, LIST) | |
| random_simplification_wrapper (self, path, n=20, verbose=False) | |
| simplify_paths_with_homology (self, n=100, random=False) | |
| simplify_deadlocks_with_homology (self) | |
| cluster_paths (self, save=False) | |
| reeb_graph_voids (self, axis=-1, plot=True) | |
| reeb_graph_balls (self, axis=-1, plot=True) | |
| prova (self, paths, BOUNDARY_MAT=None, RED_MAT=None, V_MAT=None, verbose=False) | |
| make_boundary_matrix_from_paths (self, BOUNDARY_PATHS, add_top_bottom=False) | |
| make_overlapping_summary (self, paths, step=1, plot=True, plot_steps=False) | |
| fill_loop_on_slice (self, paths, z_l, z_u, plot=True, FIG=None) | |
Public Attributes | |
| inputfile = inputfile | |
| r_Li = r_Li | |
| d_P = d_P | |
| d_S = d_S | |
| sign_var = sign_var | |
| grid_size = grid_size | |
| axes = axes | |
| dim = dim | |
| MP = MP | |
| swap_res_grid_and_balls = swap_res_grid_and_balls | |
| close_loops_with_boundary_conditions = close_loops_with_boundary_conditions | |
| bool | simply_connected_top_bottom = True |
| z_axis_boundaries = z_axis_boundaries | |
| simplify_grid_with_triangles = simplify_grid_with_triangles | |
| cut_paths_until_A_0 = cut_paths_until_A_0 | |
| a = a | |
| b = b | |
| K_graph = K_graph | |
| verbose = verbose | |
| Li | |
| P | |
| S | |
| N | |
| M_x | |
| M_y | |
| m_x | |
| m_y | |
| r_P = self.d_P + self.sign_var*np.var(np.linalg.norm(self.P-P_centres,axis=-1)[:,aux_P]) | |
| r_S = self.d_S + self.sign_var*np.var(np.linalg.norm(self.S-S_centres,axis=-1)[:,aux_S]) | |
| d_Li = bp['caps'][0].get_ydata()[0] | |
| nx | |
| ny | |
| tuple | nz = (self.grid_size, self.grid_size, self.grid_size) |
| x = np.linspace(self.m_x, self.M_x, self.nx+tmp)[:-1] | |
| y = np.linspace(self.m_y, self.M_y, self.ny+tmp)[:-1] | |
| z = np.linspace(self.m_z, self.M_z, self.nz+tmp)[:-1] | |
| d_x = self.x[1]-self.x[0] | |
| d_y = self.y[1]-self.y[0] | |
| d_z = self.z[1]-self.z[0] | |
| z_0 = self.z[0]+self.d_z*k | |
| z_1 = self.z[-1]-self.d_z*k | |
| grid = np.zeros((self.nx*self.ny*self.nz,self.dim)) | |
| float | r_graph = np.sqrt(np.max([self.d_x,self.d_y,self.d_z])**2)*np.sqrt(2)*1.001*self.K_graph |
| res_grid = np.array([p for i,p in enumerate(res_grid) if i in comp]) | |
| D_force_graph = np.ones((self.N,self.N)) | |
| list | ITRIS |
| idxs_to_edge | |
| idxs = np.array(idxs) | |
| dict | grid_to_res_grid = {} |
| balls = self.grid[np.array([i for i in np.arange(len(self.grid)) if i not in self.idxs])] | |
| D | |
| geod | |
| idxs_A_0 = np.array([t[0] for t in np.argwhere(self.res_grid[:,-1]<self.z_0)]) | |
| A_0 = self.res_grid[self.idxs_A_0] | |
| dict | A_0_to_res = {} |
| dict | res_to_A_0 = {} |
| geod_A_0 | |
| idxs_A_1 = np.array([t[0] for t in np.argwhere(self.res_grid[:,-1]>self.z_1)]) | |
| A_1 = self.res_grid[self.idxs_A_1] | |
| dict | A_1_to_res = {} |
| dict | res_to_A_1 = {} |
| geod_A_1 | |
| dict | edge_idxs = {} |
| float | r_graph_aux = np.sqrt(self.d_x**2 + self.d_y**2+self.d_z**2)*1.001*self.K_graph |
| N_1 = aux | |
| dict | cubic_to_res = {} |
| N_2 = len(ITRIS) | |
| B = B[:self.N_2,:] | |
| A = A | |
| int | REEB_GRAPH = -1*np.ones((grid.shape[0],values.shape[0])).astype(int) |
| int | n = len(emb)-1 |
| list | CLUSTERS |
| GF = galois.GF(2) | |
| V = Q[:,-B.shape[0]:] | |
| B_red = Q[:,:B.shape[1]] | |
| pivot_cols = np.where(np.sum(self.B_red==1,axis=0)==1)[0] | |
| rank = np.sum(np.max(self.B_red, axis=-1)>0) | |
| V_ = Q[:,-A_.shape[0]:] | |
| A_red = Q[:,:A_.shape[1]] | |
| rank_A = np.sum(np.max(self.A_red, axis=-1)>0) | |
| v = np.ones_like(self.res_grid)*v_ | |
| grad_pen = np.array([grad_r2(pt, self.balls_centres, self.balls_radii) for pt in self.res_grid]) | |
| direction = np.zeros_like(self.D) | |
| repulsion = np.zeros_like(self.D) | |
| eps = eps_ | |
| list | DEADLOCKS = [] |
| list | PATHS = [] |
Static Public Attributes | |
| balls_radii = np.array([self.r_P for _ in P_centres] + [self.r_S for _ in S_centres]) + self.r_Li | |
| M | |
| m | |
| M_z | |
| m_z | |
| balls_centres = balls_centres_ | |
| vtx = self.res_grid[tr,:] | |
| tri = Poly3DCollection([vtx], alpha=0.3) | |
| linewidth | |
| linestyle | |
| c | |
| aux = self.traslate_box(self.res_grid[p,:]) | |
| e = self.idxs_to_edge[idx,:] | |
| list | chain = [] |
Diffusion Class
| diffusion.Diffusion.__init__ | ( | self, | |
| inputfile = None, | |||
| box = True, | |||
| r_Li = 0, | |||
| d_P = 2.5, | |||
| d_S = 2, | |||
| sign_var = -1, | |||
| grid_size = 22, | |||
| axes = [0,1], | |||
| dim = 3, | |||
| simply_connected_top_bottom = False, | |||
| swap_res_grid_and_balls = False, | |||
| close_loops_with_boundary_conditions = False, | |||
| z_axis_boundaries = True, | |||
| simplify_grid_with_triangles = True, | |||
| cut_paths_until_A_0 = True, | |||
| a = 1, | |||
| b = 0.5, | |||
| c = 0.1, | |||
| K_graph = 1, | |||
| MP = True, | |||
| verbose = False ) |
LEGEND
simply_connected_top_bottom -> consider A_0 and A_1 as simply connected, ignoring the forbidden region in such sets.
swap_res_grid_and_balls -> swap forbidden region and residual grid.
close_loops_with_boundary_conditions -> consider all possible combinations for closing loops,
as made available by boundary conditions.
Requires A_0 and A_1 simply connected and geodesically convex.
z_axis_boundaries -> consider periodicity also on the z-axis to setup the forbidden region.
simplify_grid_with_triangles -> make sure that every edge is in a triangle.
cut_paths_until_A_0 -> when simplifying a path, cuts the part of the path which is in A_0, but for the latest point.
homological_simplification -> when simplifying a path, uses homology to shorten it.
K_graph -> coefficient for building a graph on the grid when check path connected comp. Keep it equal to 1.
MP -> using multiprocessing when checking if to paths are homologous.
| diffusion.Diffusion.build_graph | ( | self, | |
| E, | |||
| emb, | |||
| fun ) |
| diffusion.Diffusion.check_cluster | ( | self, | |
| n_clus, | |||
| n = 5, | |||
| plot = False ) |
| diffusion.Diffusion.check_lithium_paths | ( | self, | |
| n = 5 ) |
| diffusion.Diffusion.check_lithium_ranges | ( | self, | |
| plot = True ) |
| diffusion.Diffusion.cluster_deadlocks | ( | self, | |
| PATHS ) |
| diffusion.Diffusion.cluster_paths | ( | self, | |
| save = False ) |
| diffusion.Diffusion.compute_vector_field_penalties | ( | self, | |
| v_ = np.array([0,0,1]) ) |
| diffusion.Diffusion.cut_until_A_0 | ( | self, | |
| path ) |
| diffusion.Diffusion.equivalence | ( | self, | |
| v_path ) |
| diffusion.Diffusion.equivalence_wrapper | ( | self, | |
| loop ) |
| diffusion.Diffusion.estimate_atoms_min_distances | ( | self, | |
| n = 10 ) |
| diffusion.Diffusion.fill_loop | ( | self, | |
| idxs_list, | |||
| BOUNDARY_MAT = None, | |||
| RED_MAT = None, | |||
| V_MAT = None, | |||
| find_chain = False, | |||
| plot = False ) |
Finds the 2-chain which fills the loop in p,q are homologous. Se é "None" prendo A_0 e A_1. BOUNDARY_MAT -> la matrice A, che genera il sottospazio di bord RED_MAT -> la matrice A_red cioé la versione row-reduced di A[rank(B):,:] V_MAT -> la matrice che porta A[rank(B):,:] in forma A_red
| diffusion.Diffusion.fill_loop_on_slice | ( | self, | |
| paths, | |||
| z_l, | |||
| z_u, | |||
| plot = True, | |||
| FIG = None ) |
| diffusion.Diffusion.make_boundary_matrix_from_paths | ( | self, | |
| BOUNDARY_PATHS, | |||
| add_top_bottom = False ) |
| diffusion.Diffusion.make_cubic_to_res | ( | self, | |
| cubic_grid ) |
| diffusion.Diffusion.make_edges | ( | self | ) |
| diffusion.Diffusion.make_markov_chain_matrix | ( | self, | |
| eps_ = 1 ) |
| diffusion.Diffusion.make_N | ( | self | ) |
| diffusion.Diffusion.make_overlapping_summary | ( | self, | |
| paths, | |||
| step = 1, | |||
| plot = True, | |||
| plot_steps = False ) |
| diffusion.Diffusion.make_triangulation | ( | self | ) |
| diffusion.Diffusion.network_plot_3D | ( | self, | |
| G, | |||
| fun ) |
| diffusion.Diffusion.plot_balls | ( | self | ) |
| diffusion.Diffusion.plot_path | ( | self, | |
| path ) |
| diffusion.Diffusion.plot_paths_clustered | ( | self, | |
| min_len = 5, | |||
| k = 0, | |||
| aggregate = True ) |
| diffusion.Diffusion.plot_pts | ( | self, | |
| pts ) |
| diffusion.Diffusion.plot_results | ( | self, | |
| min_len = 5, | |||
| k = 0, | |||
| aggregate = False ) |
| diffusion.Diffusion.plot_triangulation | ( | self, | |
| axis = -1 ) |
| diffusion.Diffusion.plot_triangulation_and_paths | ( | self, | |
| LIST, | |||
| axis = -1, | |||
| k = 0.1 ) |
| diffusion.Diffusion.plot_vector_field | ( | self, | |
| axis = 1 ) |
| diffusion.Diffusion.plot_voids | ( | self | ) |
| diffusion.Diffusion.preprocess_path | ( | self, | |
| path ) |
| diffusion.Diffusion.produce_fobidden_region | ( | self, | |
| balls_centres_ = None, | |||
| balls_radii_ = None, | |||
| M_ = None, | |||
| m_ = None ) |
| diffusion.Diffusion.produce_res_grid | ( | self, | |
| balls_centres_ = None, | |||
| balls_radii_ = None, | |||
| M_ = None, | |||
| m_ = None ) |
| diffusion.Diffusion.proj_lithium_paths | ( | self, | |
| LIST, | |||
| plot = True ) |
| diffusion.Diffusion.prova | ( | self, | |
| paths, | |||
| BOUNDARY_MAT = None, | |||
| RED_MAT = None, | |||
| V_MAT = None, | |||
| verbose = False ) |
Check se una lista di paths paths sono riempibili con una 2-chain a meno di un sottospazio generato da una BOUNDARY_MAT. Si sovrappone con fill_loop. BOUNDARY_MAT -> la matrice A, che genera il sottospazio di bordo. Se é "None" prendo A_0 e A_1. RED_MAT -> la matrice A_red cioé la versione row-reduced di A[rank(B):,:] V_MAT -> la matrice che porta A[rank(B):,:] in forma A_red
| diffusion.Diffusion.random_simplification_wrapper | ( | self, | |
| path, | |||
| n = 20, | |||
| verbose = False ) |
| diffusion.Diffusion.random_simplification_wrapper_MP | ( | self, | |
| LIST ) |
| diffusion.Diffusion.reduce_boundary_mat | ( | self | ) |
| diffusion.Diffusion.reeb_graph | ( | self, | |
| grid, | |||
| axis = -1, | |||
| D_ = None ) |
| diffusion.Diffusion.reeb_graph_balls | ( | self, | |
| axis = -1, | |||
| plot = True ) |
| diffusion.Diffusion.reeb_graph_voids | ( | self, | |
| axis = -1, | |||
| plot = True ) |
| diffusion.Diffusion.run_A_0_to_A_1_diffusion | ( | self, | |
| n_paths = 200, | |||
| save = False, | |||
| folder_path = '/Users/ye72al/Library/Mobile Documents/com~apple~CloudDocs/Glass_TDA/' ) |
| diffusion.Diffusion.sample_diffusion | ( | self | ) |
| diffusion.Diffusion.setup_geodesics_and_boundaries | ( | self | ) |
| diffusion.Diffusion.setup_triangulation | ( | self, | |
| balls_centres_ = None, | |||
| balls_radii_ = None, | |||
| M_ = None, | |||
| m_ = None ) |
| diffusion.Diffusion.simplify_deadlocks_with_homology | ( | self | ) |
| diffusion.Diffusion.simplify_path_with_homology | ( | self, | |
| path ) |
| diffusion.Diffusion.simplify_paths_with_homology | ( | self, | |
| n = 100, | |||
| random = False ) |
| diffusion.Diffusion.traslate_box | ( | self, | |
| coords, | |||
| v_ = None ) |
| diffusion.Diffusion.A = A |
| diffusion.Diffusion.a = a |
| diffusion.Diffusion.A_0 = self.res_grid[self.idxs_A_0] |
| dict diffusion.Diffusion.A_0_to_res = {} |
| diffusion.Diffusion.A_1 = self.res_grid[self.idxs_A_1] |
| dict diffusion.Diffusion.A_1_to_res = {} |
| diffusion.Diffusion.A_red = Q[:,:A_.shape[1]] |
|
static |
| diffusion.Diffusion.axes = axes |
| diffusion.Diffusion.B = B[:self.N_2,:] |
| diffusion.Diffusion.b = b |
| diffusion.Diffusion.B_red = Q[:,:B.shape[1]] |
| diffusion.Diffusion.balls = self.grid[np.array([i for i in np.arange(len(self.grid)) if i not in self.idxs])] |
|
static |
|
static |
|
static |
|
static |
| diffusion.Diffusion.close_loops_with_boundary_conditions = close_loops_with_boundary_conditions |
| diffusion.Diffusion.CLUSTERS |
| dict diffusion.Diffusion.cubic_to_res = {} |
| diffusion.Diffusion.cut_paths_until_A_0 = cut_paths_until_A_0 |
| diffusion.Diffusion.D |
| diffusion.Diffusion.D_force_graph = np.ones((self.N,self.N)) |
| diffusion.Diffusion.d_Li = bp['caps'][0].get_ydata()[0] |
| diffusion.Diffusion.d_P = d_P |
| diffusion.Diffusion.d_S = d_S |
| diffusion.Diffusion.d_x = self.x[1]-self.x[0] |
| diffusion.Diffusion.d_y = self.y[1]-self.y[0] |
| diffusion.Diffusion.d_z = self.z[1]-self.z[0] |
| diffusion.Diffusion.DEADLOCKS = [] |
| diffusion.Diffusion.dim = dim |
| diffusion.Diffusion.direction = np.zeros_like(self.D) |
|
static |
| dict diffusion.Diffusion.edge_idxs = {} |
| diffusion.Diffusion.eps = eps_ |
| diffusion.Diffusion.geod |
| diffusion.Diffusion.geod_A_0 |
| diffusion.Diffusion.geod_A_1 |
| diffusion.Diffusion.GF = galois.GF(2) |
| diffusion.Diffusion.grad_pen = np.array([grad_r2(pt, self.balls_centres, self.balls_radii) for pt in self.res_grid]) |
| diffusion.Diffusion.grid = np.zeros((self.nx*self.ny*self.nz,self.dim)) |
| diffusion.Diffusion.grid_size = grid_size |
| dict diffusion.Diffusion.grid_to_res_grid = {} |
| diffusion.Diffusion.idxs = np.array(idxs) |
| diffusion.Diffusion.idxs_A_0 = np.array([t[0] for t in np.argwhere(self.res_grid[:,-1]<self.z_0)]) |
| diffusion.Diffusion.idxs_A_1 = np.array([t[0] for t in np.argwhere(self.res_grid[:,-1]>self.z_1)]) |
| diffusion.Diffusion.idxs_to_edge |
| diffusion.Diffusion.inputfile = inputfile |
| list diffusion.Diffusion.ITRIS |
| diffusion.Diffusion.K_graph = K_graph |
| diffusion.Diffusion.Li |
|
static |
|
static |
|
static |
|
static |
| diffusion.Diffusion.M_x |
| diffusion.Diffusion.m_x |
| diffusion.Diffusion.M_y |
| diffusion.Diffusion.m_y |
|
static |
|
static |
| diffusion.Diffusion.MP = MP |
| diffusion.Diffusion.N |
| int diffusion.Diffusion.n = len(emb)-1 |
| diffusion.Diffusion.N_1 = aux |
| diffusion.Diffusion.N_2 = len(ITRIS) |
| diffusion.Diffusion.nx |
| diffusion.Diffusion.ny |
| diffusion.Diffusion.nz = (self.grid_size, self.grid_size, self.grid_size) |
| diffusion.Diffusion.P |
| diffusion.Diffusion.PATHS = [] |
| diffusion.Diffusion.pivot_cols = np.where(np.sum(self.B_red==1,axis=0)==1)[0] |
| float diffusion.Diffusion.r_graph = np.sqrt(np.max([self.d_x,self.d_y,self.d_z])**2)*np.sqrt(2)*1.001*self.K_graph |
| float diffusion.Diffusion.r_graph_aux = np.sqrt(self.d_x**2 + self.d_y**2+self.d_z**2)*1.001*self.K_graph |
| diffusion.Diffusion.r_Li = r_Li |
| diffusion.Diffusion.r_P = self.d_P + self.sign_var*np.var(np.linalg.norm(self.P-P_centres,axis=-1)[:,aux_P]) |
| diffusion.Diffusion.r_S = self.d_S + self.sign_var*np.var(np.linalg.norm(self.S-S_centres,axis=-1)[:,aux_S]) |
| diffusion.Diffusion.rank = np.sum(np.max(self.B_red, axis=-1)>0) |
| diffusion.Diffusion.rank_A = np.sum(np.max(self.A_red, axis=-1)>0) |
| int diffusion.Diffusion.REEB_GRAPH = -1*np.ones((grid.shape[0],values.shape[0])).astype(int) |
| diffusion.Diffusion.repulsion = np.zeros_like(self.D) |
| diffusion.Diffusion.res_grid = np.array([p for i,p in enumerate(res_grid) if i in comp]) |
| dict diffusion.Diffusion.res_to_A_0 = {} |
| dict diffusion.Diffusion.res_to_A_1 = {} |
| diffusion.Diffusion.S |
| diffusion.Diffusion.sign_var = sign_var |
| diffusion.Diffusion.simplify_grid_with_triangles = simplify_grid_with_triangles |
| bool diffusion.Diffusion.simply_connected_top_bottom = True |
| diffusion.Diffusion.swap_res_grid_and_balls = swap_res_grid_and_balls |
|
static |
| diffusion.Diffusion.V = Q[:,-B.shape[0]:] |
| diffusion.Diffusion.v = np.ones_like(self.res_grid)*v_ |
| diffusion.Diffusion.V_ = Q[:,-A_.shape[0]:] |
| diffusion.Diffusion.verbose = verbose |
|
static |
| diffusion.Diffusion.x = np.linspace(self.m_x, self.M_x, self.nx+tmp)[:-1] |
| diffusion.Diffusion.y = np.linspace(self.m_y, self.M_y, self.ny+tmp)[:-1] |
| diffusion.Diffusion.z = np.linspace(self.m_z, self.M_z, self.nz+tmp)[:-1] |
| diffusion.Diffusion.z_0 = self.z[0]+self.d_z*k |
| diffusion.Diffusion.z_1 = self.z[-1]-self.d_z*k |
| diffusion.Diffusion.z_axis_boundaries = z_axis_boundaries |