Example #1
0
 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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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