def initial_lattice(self): lattice = [] vertex_ref = cln.OrderedDict() ref_vertex = cln.OrderedDict() n = self.dim for m in range(self.dim): num = 2**(n - m) * self.ncr(n, m) d = cln.OrderedDict() for i in range(num): id = rf.Refer(i) d.update({id: [set(), set()]}) if m == 0: vertex_ref.update({self.vertex[i]: id}) ref_vertex.update({id: self.vertex[i]}) lattice.append(d) return lattice, vertex_ref, ref_vertex
def intersect_hss(self, m, n, aset): set0 = set() set1 = cp.copy(aset) set2 = set() hss = [] m_face = cln.OrderedDict() for i in range(m, n + 1): for ref in set1: val_temp = cp.copy(self.lattice[i][ref]) set2.update(val_temp[1]) m_face.update({ ref: [ cp.copy(self.lattice[i][ref][0]), cp.copy(self.lattice[i][ref][1]) ] }) val_temp2 = cp.copy(val_temp[0]) for r in val_temp2: if r not in set0: m_face[ref][0].remove(r) hss.append(m_face) m_face = cln.OrderedDict() set0 = cp.copy(set1) set1 = cp.copy(set2) set2 = set() # m == 1 when to find the intersected hss if m == 1 and n >= 1: new_ref = rf.Refer(-1) new_facet = cln.OrderedDict({new_ref: [set(), set()]}) for ref in hss[n - 1].keys(): hss[n - 1][ref][1] = set([new_ref]) new_facet[new_ref][0].add(ref) hss.append(new_facet) return hss
def intersectPlane(self, idx): # map the plane into lower dimension a = self.M[idx, :] d = self.b[idx, :] new_pl = np.concatenate((a, d)) # insert ones to vertices matrix start_time = time.time() Varray = self.vertex Varray1 = np.insert(Varray, Varray.shape[1], 1, axis=1) Vsign = np.dot(Varray1, new_pl) end_time = time.time() - start_time # x1 = np.dot(self.M, Varray.transpose()) + self.b # x255 = x1[255,:] # x255p = len(x255[x255>=0]) # ********* no intersection *******************# if np.all(Vsign <= 0): return [], self, end_time elif np.all(Vsign >= 0): return self, [], end_time # ********************************************# ref_keys = list(self.ref_vertex.keys()) pVlist = [ ref_keys[idx] for idx in range(Vsign.shape[0]) if Vsign[idx] >= 0 ] sign_dict = cln.OrderedDict((el, 1) for el in pVlist) nVlist = [ ref_keys[idx] for idx in range(Vsign.shape[0]) if Vsign[idx] <= 0 ] sign_dict.update(cln.OrderedDict((el, -1) for el in nVlist)) # ********** self.actual_dim==1 ***************# if self.actual_dim == 1: p0 = self.ref_vertex[pVlist[0]] p1 = self.ref_vertex[nVlist[0]] vvector = p1 - p0 interp = p0 - vvector * ((d + np.dot(p0, a.transpose())) / (np.dot(vvector, a.transpose()))) self.vertex = np.concatenate((self.vertex, interp)) ref0 = rf.Refer(-1) p_ref_vertex = cln.OrderedDict({pVlist[0]: p0, ref0: interp}) p_hss = [ cln.OrderedDict({ pVlist[0]: [set(), set()], ref0: [set(), set()] }) ] p_lattice = PolyLattice(p_hss, p_ref_vertex, 1, cp.copy(self.M), cp.copy(self.b)) n_ref_vertex = cln.OrderedDict({nVlist[0]: p1, ref0: interp}) n_hss = [ cln.OrderedDict({ nVlist[0]: [set(), set()], ref0: [set(), set()] }) ] n_lattice = PolyLattice(n_hss, n_ref_vertex, 1, cp.copy(self.M), cp.copy(self.b)) # ************* self.actual_dim>2 ***************# # consider the smaller set if len(pVlist) >= len(nVlist): lessVlist = nVlist sign_flag = 1 else: lessVlist = pVlist sign_flag = -1 f1_set = set() # store all the 1_face that intersects with plane ref_interp = cln.OrderedDict() for lessV in lessVlist: for f1 in self.lattice[0][lessV][1]: for f0 in self.lattice[1][f1][0]: lessVn = f0 if sign_dict[lessVn] == sign_flag: p0 = self.ref_vertex[lessV] p1 = self.ref_vertex[lessVn] vvector = p1 - p0 point = p0 - vvector * ((d + np.dot(p0, a)) / (np.dot(vvector, a))) pointxx = np.dot(self.M, np.array([point ]).transpose()) + self.b f1_set.add(f1) # input new vertex ref_interp.update({f1: point}) point = np.array([point]) self.vertex = np.append(self.vertex, point, axis=0) # extract the intersected hss orig_hss = self.intersect_hss(1, self.actual_dim - 1, f1_set) # assign different memory address to the hss new_hss = cp.deepcopy(orig_hss) # insert the new hss to the orginal lattice point_refs = self.insert_hss(orig_hss, new_hss, ref_interp) pVlist.extend(point_refs) nVlist.extend(point_refs) n_lattice = self.extract_polylattice(nVlist, f1_set) p_lattice = self.extract_polylattice(pVlist, f1_set) return p_lattice, n_lattice, end_time
def intersectHalfspace(self, pl_a, pl_d): # map the plane into lower dimension a = np.dot(pl_a, self.M) d = np.dot(pl_a, self.b) + pl_d new_pl = np.concatenate((a, d)) # insert ones to vertices matrix # Varray = np.array(self.vertex) Varray = self.vertex Varray1 = np.insert(Varray, Varray.shape[1], 1, axis=1) # signs indicate vertex's side of plane Vsign = np.dot(Varray1, new_pl) ref_keys = list(self.ref_vertex.keys()) pVlist = [ ref_keys[idx] for idx in range(Vsign.shape[0]) if Vsign[idx] >= 0 ] sign_dict = cln.OrderedDict((el, 1) for el in pVlist) nVlist = [ ref_keys[idx] for idx in range(Vsign.shape[0]) if Vsign[idx] <= 0 ] sign_dict.update(cln.OrderedDict((el, -1) for el in nVlist)) # ********* no intersection *******************# if not pVlist: return self elif not nVlist: return None # ********** self.actual_dim==1 ***************# if self.actual_dim == 1: p0 = self.ref_vertex[pVlist[0]] p1 = self.ref_vertex[nVlist[0]] vvector = p1 - p0 interp = p0 - vvector * ((d + np.dot(p0, a.transpose())) / (np.dot(vvector, a.transpose()))) interp = np.array([interp]) self.vertex = np.append(self.vertex, interp, axis=0) ref0 = rf.Refer(-1) n_ref_vertex = cln.OrderedDict({nVlist[0]: p1, ref0: interp}) n_hss = [ cln.OrderedDict({ nVlist[0]: [set(), set()], ref0: [set(), set()] }) ] n_vertex = np.concatenate((p1, interp), axis=0) n_lattice = PolyLattice(n_hss, n_ref_vertex, n_vertex, 1, cp.copy(self.M), cp.copy(self.b)) return n_lattice # ************* self.actual_dim>2 ***************# # consider the smaller set if len(pVlist) >= len(nVlist): lessVlist = nVlist sign_flag = 1 else: lessVlist = pVlist sign_flag = -1 f1_set = set() # store all the 1_face that intersects with plane ref_interp = cln.OrderedDict() for lessV in lessVlist: for f1 in self.lattice[0][lessV][1]: for f0 in self.lattice[1][f1][0]: lessVn = f0 if sign_dict[lessVn] == sign_flag: p0 = self.ref_vertex[lessV] p1 = self.ref_vertex[lessVn] vvector = p1 - p0 point = p0 - vvector * ((d + np.dot(p0, a)) / (np.dot(vvector, a))) f1_set.add(f1) # input new vertex ref_interp.update({f1: point}) point = np.array([point]) self.vertex = np.append(self.vertex, point, axis=0) # extract the intersected hss orig_hss = self.intersect_hss(1, self.actual_dim - 1, f1_set) # self.test_face_num(self.lattice) # self.test_face_num(orig_hss) # assign different memory address to the hss new_hss = cp.deepcopy(orig_hss) # insert the new hss to the orginal lattice point_refs = self.insert_hss(orig_hss, new_hss, ref_interp) # pVlist.extend(point_refs) nVlist.extend(point_refs) n_lattice = self.extract_polylattice(nVlist, f1_set) return n_lattice
def intersectPlane_mnist(self, idx): a = np.zeros(self.vertex.shape[1]) a[idx] = 1 d = np.array([0]) vertex = self.vertex if np.all(vertex[:, idx] >= 0): return self, [] elif np.all(vertex[:, idx] <= 0): return [], self ref_keys = list(self.ref_vertex.keys()) pVlist = [ ref_keys[i] for i in range(vertex.shape[0]) if vertex[i, idx] >= 0 ] sign_dict = cln.OrderedDict((el, 1) for el in pVlist) nVlist = [ ref_keys[i] for i in range(vertex.shape[0]) if vertex[i, idx] <= 0 ] sign_dict.update(cln.OrderedDict((el, -1) for el in nVlist)) # ********** self.actual_dim==1 ***************# if self.actual_dim == 1: p0 = self.ref_vertex[pVlist[0]] p1 = self.ref_vertex[nVlist[0]] vvector = p1 - p0 interp = p0 + vvector * np.abs((p0[idx]) / vvector[idx]) self.vertex = np.concatenate((self.vertex, interp)) ref0 = rf.Refer(-1) p_ref_vertex = cln.OrderedDict({pVlist[0]: p0, ref0: interp}) p_hss = [ cln.OrderedDict({ pVlist[0]: [set(), set()], ref0: [set(), set()] }) ] p_lattice = PolyLattice(p_hss, p_ref_vertex, 1, cp.copy(self.M), cp.copy(self.b)) n_ref_vertex = cln.OrderedDict({nVlist[0]: p1, ref0: interp}) n_hss = [ cln.OrderedDict({ nVlist[0]: [set(), set()], ref0: [set(), set()] }) ] n_lattice = PolyLattice(n_hss, n_ref_vertex, 1, cp.copy(self.M), cp.copy(self.b)) return p_lattice, n_lattice # ************* self.actual_dim>2 ***************# # consider the smaller set if len(pVlist) >= len(nVlist): lessVlist = nVlist sign_flag = 1 else: lessVlist = pVlist sign_flag = -1 f1_set = set() # store all the 1_face that intersects with plane ref_interp = cln.OrderedDict() for lessV in lessVlist: for f1 in self.lattice[0][lessV][1]: for f0 in self.lattice[1][f1][0]: lessVn = f0 if sign_dict[lessVn] == sign_flag: p0 = self.ref_vertex[lessV] p1 = self.ref_vertex[lessVn] vvector = p1 - p0 point = p0 + vvector * np.abs((p0[idx]) / vvector[idx]) # point = p0 - vvector * ((d + np.dot(p0, a)) / (np.dot(vvector, a))) f1_set.add(f1) # input new vertex ref_interp.update({f1: point}) point = np.array([point]) self.vertex = np.append(self.vertex, point, axis=0) # extract the intersected hss orig_hss = self.intersect_hss(1, self.actual_dim - 1, f1_set) # assign different memory address to the hss new_hss = cp.deepcopy(orig_hss) # insert the new hss to the orginal lattice point_refs = self.insert_hss(orig_hss, new_hss, ref_interp) pVlist.extend(point_refs) nVlist.extend(point_refs) n_lattice = self.extract_polylattice(nVlist, f1_set) p_lattice = self.extract_polylattice(pVlist, f1_set) return p_lattice, n_lattice