diff --git a/kenzo-test.asd b/kenzo-test.asd index c877384..6fd63cc 100644 --- a/kenzo-test.asd +++ b/kenzo-test.asd @@ -9,6 +9,7 @@ :pathname #P"test/" :components ((:file "package") (:file "common") + #| (:file "combinations-test") (:file "various-test") (:file "chain-complexes-test") @@ -27,4 +28,6 @@ ;;(:file "cl-space-efhm-test") (:file "tensor-products-test") (:file "k-pi-n-test") + |# + (:file "simplicial-sets-test") )) diff --git a/package.lisp b/package.lisp index f724741..9717b21 100644 --- a/package.lisp +++ b/package.lisp @@ -107,6 +107,7 @@ CMBN-DEGR CMBN-LIST DEGR + DGOP DFFR1 EFHM F @@ -272,9 +273,27 @@ ;; simplicial-sets.lisp + 1DGNR + 1DGOP*DGOP + 1DLOP-DGOP + A-CMPR3 + A-FACE4 + BSPN-P + CHECK-FACES + CHECK-SMST DGOP*DGOP + DGOP/DGOP + DGOP-EXT-INT + DGOP-INT-EXT DLOP-EXT-INT DLOP-INT-EXT + FACE-BNDR + FACE*-BNDR + HYPHENIZE-LIST + INTR-DIAGONAL + NDGNR + NFACE + REMOVE-BIT ;; smith.lisp @@ -282,8 +301,11 @@ ;; special-smsts.lisp - SPHERE BUILD-FINITE-SS + MOORE + R-PROJ-SPACE + SPHERE + SPHERE-FACE ;; tensor-products.lisp diff --git a/src/abbreviations.lisp b/src/abbreviations.lisp index 795357d..3255e11 100644 --- a/src/abbreviations.lisp +++ b/src/abbreviations.lisp @@ -17,6 +17,7 @@ :BNDR "BouNDaRy" :BRGN "BaR-GeNerator" :BSGN "BaSe GeNerator" + :BSPN "BaSe-PoiNt" ;; C :CBGN "CoBar-GeNerator" diff --git a/src/simplicial-sets.lisp b/src/simplicial-sets.lisp index 26aacb2..675f859 100644 --- a/src/simplicial-sets.lisp +++ b/src/simplicial-sets.lisp @@ -8,58 +8,41 @@ (DEFUN DGOP-EXT-INT (ext-dgop) - (declare (list ext-dgop)) - ;; (list fixnum) - (when ext-dgop - (unless (apply #'> ext-dgop) - (error "In DGOP-EXT-INT, the external dgop ~A is not decreasing." ext-dgop))) - (the fixnum - (apply #'logxor (mapcar - #'(lambda (item) - (declare (fixnum item)) - (the fixnum (2-exp item))) - ext-dgop)))) + (declare (list ext-dgop)) + ;; (list fixnum) + (when ext-dgop + (unless (apply #'> ext-dgop) + (error "In DGOP-EXT-INT, the external dgop ~A is not decreasing." ext-dgop))) + (the fixnum + (apply #'logxor (mapcar + #'(lambda (item) + (declare (fixnum item)) + (the fixnum (2-exp item))) + ext-dgop)))) -#| -(dgop-ext-int '()) -(dgop-ext-int '(2 2)) -(dgop-ext-int '(4 0)) -|# (DEFUN DGOP-INT-EXT (dgop) - (declare (fixnum dgop)) - (unless (typep dgop 'dgop) - (error "In DXOP-INT-EXT, ~A is not a dxop." dgop)) - (the list - (do ((dgop dgop (ash dgop -1)) - (rslt +empty-list+) - (bmark 0 (1+ bmark))) - ((zerop dgop) rslt) + (declare (fixnum dgop)) + (unless (typep dgop 'dgop) + (error "In DXOP-INT-EXT, ~A is not a dxop." dgop)) + (the list + (do ((dgop dgop (ash dgop -1)) + (rslt +empty-list+) + (bmark 0 (1+ bmark))) + ((zerop dgop) rslt) (declare - (fixnum dgop bmark) - (list rslt)) + (fixnum dgop bmark) + (list rslt)) (when (oddp dgop) - (push bmark rslt))))) + (push bmark rslt))))) -#| - (dgop-int-ext 0) - (dgop-int-ext 4) - (dgop-int-ext 63) - (dotimes (i 33) - (print (dgop-ext-int (dgop-int-ext i))))) -|# (DEFUN HYPHENIZE-LIST (list) - (declare (list list)) - (if list + (declare (list list)) + (if list (format nil "~D~{-~D~}" (first list) (rest list)) (format nil "-"))) -#| - (hyphenize-list '()) - (hyphenize-list '(3)) - (hyphenize-list '(5 3 1))) -|# (DEFUN ABSM-PRINT (absm stream depth) (declare @@ -67,68 +50,71 @@ (type stream stream) (ignore depth)) (format stream - "" - (hyphenize-list (dgop-int-ext (dgop absm))) - (gmsm absm)) + "" + (hyphenize-list (dgop-int-ext (dgop absm))) + (gmsm absm)) absm) + (DEFUN FACE4 (smst indx dmns gmsm-or-absm) - (if (typep gmsm-or-absm 'absm) + (if (typep gmsm-or-absm 'absm) (a-face4 (face1 smst) indx dmns gmsm-or-absm) (funcall (face1 smst) indx dmns gmsm-or-absm))) + #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((smst simplicial-set) stream) - (the simplicial-set - (progn + (the simplicial-set + (progn (format stream "[K~D Simplicial-Set]" (idnm smst)) - smst))) + smst))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN SMST (n) - (declare (fixnum n)) - (the (or simplicial-set null) - (find n *smst-list* :key #'idnm))) + (declare (fixnum n)) + (the (or simplicial-set null) + (find n *smst-list* :key #'idnm))) + (DEFUN BUILD-SMST (&key cmpr basis bspn face face* intr-bndr bndr-strt - intr-dgnl dgnl-strt orgn) - (declare - (type cmprf cmpr) - (type basis basis) - (type gmsm bspn) - (type face face) - (type (or null face*) face*) - (type (or intr-mrph null) intr-bndr intr-dgnl) - (type (or strt null) bndr-strt dgnl-strt) - (list orgn)) - (let ((already (find orgn *smst-list* :test #'equal :key #'orgn))) - (declare (type (or simplicial-set null) already)) - (when already - (return-from build-smst already))) - (if intr-bndr + intr-dgnl dgnl-strt orgn) + (declare + (type cmprf cmpr) + (type basis basis) + (type gmsm bspn) + (type face face) + (type (or null face*) face*) + (type (or intr-mrph null) intr-bndr intr-dgnl) + (type (or strt null) bndr-strt dgnl-strt) + (list orgn)) + (let ((already (find orgn *smst-list* :test #'equal :key #'orgn))) + (declare (type (or simplicial-set null) already)) + (when already + (return-from build-smst already))) + (if intr-bndr (unless bndr-strt - (error "In BUILD-SMST, an intr-bndr is given but not its strategy.")) + (error "In BUILD-SMST, an intr-bndr is given but not its strategy.")) (cond (face* - (setf bndr-strt :gnrt - intr-bndr (face*-bndr cmpr face*))) + (setf bndr-strt :gnrt + intr-bndr (face*-bndr cmpr face*))) (face - (setf bndr-strt :gnrt - intr-bndr (face-bndr cmpr face))))) - (if intr-dgnl + (setf bndr-strt :gnrt + intr-bndr (face-bndr cmpr face))))) + (if intr-dgnl (unless dgnl-strt - (error "In BUILD-SMST, an intr-dgnl is given but not its strategy.")) + (error "In BUILD-SMST, an intr-dgnl is given but not its strategy.")) (setf dgnl-strt :gnrt intr-dgnl (intr-diagonal face))) - (the simplicial-set - (let ((rslt (build-chcm :cmpr cmpr :basis basis :bsgn bspn - :intr-dffr intr-bndr - :strt bndr-strt :orgn orgn))) + (the simplicial-set + (let ((rslt (build-chcm :cmpr cmpr :basis basis :bsgn bspn + :intr-dffr intr-bndr + :strt bndr-strt :orgn orgn))) (change-chcm-to-clgb rslt - :intr-cprd intr-dgnl :cprd-strt dgnl-strt) + :intr-cprd intr-dgnl :cprd-strt dgnl-strt) (setf (slot-value (dgnl rslt) 'orgn) `(diagonal ,rslt)) (change-class rslt 'simplicial-set) @@ -136,359 +122,246 @@ (push rslt *smst-list*) rslt))) + (DEFUN A-BASIS2 (basis dmns) (declare - (type basis basis) - (fixnum dmns)) + (type basis basis) + (fixnum dmns)) (the list - (let ((basis-array (make-array (1+ dmns) :element-type 'list))) - (declare (type (vector list) basis-array)) - (dotimes (i (1+ dmns)) - (declare (fixnum i)) - (setf (aref basis-array i) (funcall basis i))) - (do ((dgop (mask dmns) (1- dgop)) - (rslt +empty-list+ - (nconc (mapcar - #'(lambda (gmsm) - (declare (type gmsm gmsm)) - (absm dgop gmsm)) - (aref basis-array (- dmns (logcount dgop)))) - rslt))) - ((minusp dgop) rslt))))) + (let ((basis-array (make-array (1+ dmns) :element-type 'list))) + (declare (type (vector list) basis-array)) + (dotimes (i (1+ dmns)) + (declare (fixnum i)) + (setf (aref basis-array i) (funcall basis i))) + (do ((dgop (mask dmns) (1- dgop)) + (rslt +empty-list+ + (nconc (mapcar + #'(lambda (gmsm) + (declare (type gmsm gmsm)) + (absm dgop gmsm)) + (aref basis-array (- dmns (logcount dgop)))) + rslt))) + ((minusp dgop) rslt))))) -#| -(setf m (moore 2 2)) -(dotimes (i 4) - (print (basis m i :dgnr))) -|# (DEFUN INTR-DIAGONAL (face) (declare (type face face)) (flet ((rslt (dmns gmsm) - (declare - (fixnum dmns) - (type gmsm gmsm)) - (the cmbn - (let ((del-0-s +empty-list+) - (rslt +empty-list+)) - (declare (list del-0-s rslt)) - (do ((dmns dmns (1- dmns)) - (absm (absm 0 gmsm) (a-face4 face 0 dmns absm))) - ((zerop dmns) (push absm del-0-s)) - (declare (fixnum dmns) (type absm absm)) - (push absm del-0-s)) - (do ((ldmns dmns (1- ldmns)) - (rdmns 0 (1+ rdmns)) - (absm (absm 0 gmsm) (a-face4 face ldmns ldmns absm)) - (mark-del-0 del-0-s (cdr mark-del-0))) - ((zerop ldmns) - (push (term 1 (tnpr 0 (gmsm absm) dmns gmsm)) - rslt)) - (declare - (fixnum ldmns rdmns) - (type gmsm gmsm) - (list mark-del-0)) - (unless (or (plusp (dgop absm)) - (plusp (dgop (car mark-del-0)))) - (push (term 1 (tnpr ldmns (gmsm absm) - rdmns (gmsm (car mark-del-0)))) - rslt))) - (make-cmbn :degr dmns :list rslt))))) + (declare + (fixnum dmns) + (type gmsm gmsm)) + (the cmbn + (let ((del-0-s +empty-list+) + (rslt +empty-list+)) + (declare (list del-0-s rslt)) + (do ((dmns dmns (1- dmns)) + (absm (absm 0 gmsm) (a-face4 face 0 dmns absm))) + ((zerop dmns) (push absm del-0-s)) + (declare (fixnum dmns) (type absm absm)) + (push absm del-0-s)) + (do ((ldmns dmns (1- ldmns)) + (rdmns 0 (1+ rdmns)) + (absm (absm 0 gmsm) (a-face4 face ldmns ldmns absm)) + (mark-del-0 del-0-s (cdr mark-del-0))) + ((zerop ldmns) + (push (term 1 (tnpr 0 (gmsm absm) dmns gmsm)) + rslt)) + (declare + (fixnum ldmns rdmns) + (type gmsm gmsm) + (list mark-del-0)) + (unless (or (plusp (dgop absm)) + (plusp (dgop (car mark-del-0)))) + (push (term 1 (tnpr ldmns (gmsm absm) + rdmns (gmsm (car mark-del-0)))) + rslt))) + (make-cmbn :degr dmns :list rslt))))) (the intr-mrph #'rslt))) -#| -() -(setf cmpr #'f-cmpr - face #'delta-face) -(setf diag (intr-diagonal face)) -(funcall diag 4 (mask 5)) -(funcall diag 0 4) -(setf cmpr #'s-cmpr - face (sphere-face 4)) -(setf diag (intr-diagonal face)) -(funcall diag 4 's4) -(funcall diag 0 '*) -(setf s4 (sphere 4)) -(dgnl s4 4 's4) -|# (DEFUN FACE-BNDR (cmpr face) - (declare - (type cmprf cmpr) - (type face face)) - (flet ((rslt (dmns gmsm) - (declare - (fixnum dmns) - (type gmsm gmsm)) - (the cmbn + (declare + (type cmprf cmpr) + (type face face)) + (flet ((rslt (dmns gmsm) + (declare + (fixnum dmns) + (type gmsm gmsm)) + (the cmbn (progn - (when (zerop dmns) - (return-from rslt +zero-negative-cmbn+)) - (let ((pre-rslt +empty-list+)) - (declare (list pre-rslt)) - ;; (list (cons cffc face)) - (dotimes (indx (1+ dmns)) - (declare (fixnum indx)) - (let ((face (funcall face indx dmns gmsm))) - (declare (type absm face)) - (unless (degenerate-p face) - (push (term (-1-expt-n indx) (gmsm face)) - pre-rslt)))) - (apply #'nterm-add cmpr (1- dmns) pre-rslt)))))) - (the intr-mrph #'rslt))) + (when (zerop dmns) + (return-from rslt +zero-negative-cmbn+)) + (let ((pre-rslt +empty-list+)) + (declare (list pre-rslt)) + ;; (list (cons cffc face)) + (dotimes (indx (1+ dmns)) + (declare (fixnum indx)) + (let ((face (funcall face indx dmns gmsm))) + (declare (type absm face)) + (unless (degenerate-p face) + (push (term (-1-expt-n indx) (gmsm face)) + pre-rslt)))) + (apply #'nterm-add cmpr (1- dmns) pre-rslt)))))) + (the intr-mrph #'rslt))) -#| - (setf face #'(lambda (indx dmns gmsm) - (absm 0 (append - (subseq gmsm 0 indx) - (subseq gmsm (1+ indx)))))) - (setf bndr (face-bndr #'l-cmpr face)) - (funcall bndr 0 '(a)) - (funcall bndr 1 '(a b)) - (funcall bndr 2 '(a b c)) - (funcall bndr 3 '(a b c d)) - (funcall bndr 3 '(d c b a)) - (funcall bndr 1 '(a a)) - (funcall bndr 2 '(a a a)) - (funcall bndr 3 '(a a a a)) - (setf face #'(lambda (index dmns gmsm) - (absm (dgop-ext-int (nreverse ( dmns 1) - (let ((dmns-1 (1- dmns))) - (declare (fixnum dmns-1)) - (dotimes (i dmns) - (declare (fixnum i)) - (dotimes (j (1+ i)) - (declare (fixnum j)) - (let ((rslt1 (a-face4 face i dmns-1 (funcall face j dmns gmsm))) - (rslt2 (a-face4 face j dmns-1 (funcall face (1+ i) dmns gmsm)))) - (declare (type absm rslt1 rslt2)) - (unless (eq (a-cmpr3 cmpr rslt1 rslt2) :equal) - (cerror "CHECK-FACES will return NIL." - "Noncoherent boundary operators detected by CHECK-FACES :~@ + (let ((dmns-1 (1- dmns))) + (declare (fixnum dmns-1)) + (dotimes (i dmns) + (declare (fixnum i)) + (dotimes (j (1+ i)) + (declare (fixnum j)) + (let ((rslt1 (a-face4 face i dmns-1 + (funcall face j dmns gmsm))) + (rslt2 (a-face4 face j dmns-1 + (funcall face (1+ i) dmns gmsm)))) + (declare (type absm rslt1 rslt2)) + (unless (eq (a-cmpr3 cmpr rslt1 rslt2) :equal) + (cerror "CHECK-FACES will return NIL." + "Noncoherent boundary operators detected by CHECK-FACES :~@ Simplex => ~A~@ del_~D o del_~D => ~A~@ del_~D o del_~D => ~A" - gmsm i j rslt1 j (1+ i) rslt2) - (return-from check-faces nil))))))) + gmsm i j rslt1 j (1+ i) rslt2) + (return-from check-faces nil))))))) t))) -#| - (setf d (delta-infinity)) - (check-faces #'f-cmpr (face d) 4 31) -|# (DEFUN CHECK-SMST (smst dmns1 &optional (dmns2 (1+ dmns1))) - (declare - (type simplicial-set smst) - (fixnum dmns1 dmns2)) - (with-slots (cmpr basis face) smst - (declare - (type cmprf cmpr) - (type face face)) - (when (eq basis :locally-effective) + (declare + (type simplicial-set smst) + (fixnum dmns1 dmns2)) + (with-slots (cmpr basis face) smst + (declare + (type cmprf cmpr) + (type face face)) + (when (eq basis :locally-effective) (error "In CHECK-SMST, the locally-effective simplicial-set ~A~@ cannot be checked." smst)) - (do ((rslt t) - (dmns dmns1 (1+ dmns))) - ((>= dmns dmns2) rslt) - (declare - (type boolean rslt) - (fixnum dmns)) - (format t "~%Checking the ~D-simplices..." dmns) - (dolist (gmsm (funcall basis dmns)) - (declare (type gmsm gmsm)) - (unless (check-faces cmpr face dmns gmsm) - (setf rslt nil)))))) - -#| - (check-smst (delta-infinity) 5) - (check-smst (delta 3) 2) - (check-smst (delta 3) 2 4) -|# - + (do ((rslt t) + (dmns dmns1 (1+ dmns))) + ((>= dmns dmns2) rslt) + (declare + (type boolean rslt) + (fixnum dmns)) + (format t "~%Checking the ~D-simplices..." dmns) + (dolist (gmsm (funcall basis dmns)) + (declare (type gmsm gmsm)) + (unless (check-faces cmpr face dmns gmsm) + (setf rslt nil)))))) diff --git a/test/simplicial-sets-test.lisp b/test/simplicial-sets-test.lisp new file mode 100644 index 0000000..65b3a4a --- /dev/null +++ b/test/simplicial-sets-test.lisp @@ -0,0 +1,204 @@ + +(in-package :kenzo-test) + +(in-suite :kenzo) + +(test dgop-ext-int + (is (= 0 (cat:dgop-ext-int '()))) + (signals simple-error (cat:dgop-ext-int '(2 2))) + (is (= 17 (cat:dgop-ext-int '(4 0))))) + + +(test dgop-int-ext + (is (null (cat:dgop-int-ext 0))) + (is (equal '(2) (cat:dgop-int-ext 4))) + (is (equal '(5 4 3 2 1 0) (cat:dgop-int-ext 63))) + (dotimes (i 33) + (is (= i (cat:dgop-ext-int (cat:dgop-int-ext i)))))) + + +(test hyphenize-list + (is (string= "-" (cat:hyphenize-list '()))) + (is (string= "3" (cat:hyphenize-list '(3)))) + (is (string= "5-3-1" (cat:hyphenize-list '(5 3 1))))) + + +(test moore + (let ((m (cat:moore 2 2))) + (dotimes (i 4) + (print (cat:basis m i :dgnr))))) + +#| +(test intr-diagonal + (let* ((cmpr #'cat:f-cmpr) + (face #'cat:delta-face) + (diag (cat:intr-diagonal face))) + (funcall diag 4 (cat:mask 5)) + (funcall diag 0 4) + (setf cmpr #'cat:s-cmpr face (cat:sphere-face 4)) + (setf diag (cat:intr-diagonal face)) + (funcall diag 4 's4) + (funcall diag 0 '*) + (setf s4 (cat:sphere 4)) + (cat:dgnl s4 4 's4))) +|# + +(test face-bndr + (let* ((face #'(lambda (indx dmns gmsm) + (cat:absm 0 (append + (subseq gmsm 0 indx) + (subseq gmsm (1+ indx)))))) + (bndr (cat:face-bndr #'cat:l-cmpr face))) + (funcall bndr 0 '(a)) + (funcall bndr 1 '(a b)) + (funcall bndr 2 '(a b c)) + (funcall bndr 3 '(a b c d)) + (funcall bndr 3 '(d c b a)) + (funcall bndr 1 '(a a)) + (funcall bndr 2 '(a a a)) + (funcall bndr 3 '(a a a a)) + (setf face #'(lambda (index dmns gmsm) + (cat:absm (cat:dgop-ext-int + (nreverse (cat: