diff --git a/package.lisp b/package.lisp index fd6678c..708668a 100644 --- a/package.lisp +++ b/package.lisp @@ -533,6 +533,8 @@ ;; special-smsts.lisp + #:ABSM-EXT-INT + #:ABSM-INT-EXT #:BUILD-FINITE-SS #:BUILD-SMST #:FINITE-SS-PRE-TABLE @@ -545,6 +547,7 @@ #:SPHERE #:SPHERE-FACE #:SPHERE-WEDGE + #:VERTEX-I ;; suspensions.lisp diff --git a/src/special-smsts.lisp b/src/special-smsts.lisp index d22d91d..702685a 100644 --- a/src/special-smsts.lisp +++ b/src/special-smsts.lisp @@ -1,3 +1,4 @@ +;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -* ;;; SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS ;;; SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS ;;; SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS SPECIAL-SMSTS @@ -13,42 +14,42 @@ (declare (list list)) (the list (let ((pre-rslt +empty-list+) - (dmns-mark nil) - (gmsm-mark nil)) + (dmns-mark nil) + (gmsm-mark nil)) (declare (list pre-rslt dmns-mark gmsm-mark)) (dolist (item list) - (declare (type (or fixnum symbol list) item)) - (cond ((typep item 'fixnum) - (let ((found (assoc item pre-rslt))) - (declare (list found)) - (setf dmns-mark - (or found - (car (push (list item) pre-rslt))) - gmsm-mark nil))) - ((symbolp item) - (when (assoc item (cdr dmns-mark)) - (error "In BUILD-FINITE-SS, the symbol ~A is present two times." - item)) - (setf gmsm-mark (car (push (list item) (cdr dmns-mark))))) - ((listp item) - (unless gmsm-mark - (error "In BUILD-FINITE-SS, the face list ~A~@ + (declare (type (or fixnum symbol list) item)) + (cond ((typep item 'fixnum) + (let ((found (assoc item pre-rslt))) + (declare (list found)) + (setf dmns-mark + (or found + (car (push (list item) pre-rslt))) + gmsm-mark nil))) + ((symbolp item) + (when (assoc item (cdr dmns-mark)) + (error "In BUILD-FINITE-SS, the symbol ~A is present two times." + item)) + (setf gmsm-mark (car (push (list item) (cdr dmns-mark))))) + ((listp item) + (unless gmsm-mark + (error "In BUILD-FINITE-SS, the face list ~A~@ is not after a symbol." item)) - (nconc gmsm-mark item) - (setf gmsm-mark nil)) - (t - (error "In BUILD-FINITE-SS, the argument ~A does not make sense." item)))) + (nconc gmsm-mark item) + (setf gmsm-mark nil)) + (t + (error "In BUILD-FINITE-SS, the argument ~A does not make sense." item)))) (do ((mark1 pre-rslt (cdr mark1))) ((endp mark1)) - (declare (list mark1)) - (do ((mark2 (rest mark1) (cdr mark2))) - ((endp mark2)) - (declare (list mark2)) - (let ((inter (intersection (cdar mark1) (cdar mark2) - :key #'first))) - (declare (list inter)) - (when inter - (error "In BUILD-FINITE-SS, the symbol ~A is present two times." + (declare (list mark1)) + (do ((mark2 (rest mark1) (cdr mark2))) + ((endp mark2)) + (declare (list mark2)) + (let ((inter (intersection (cdar mark1) (cdar mark2) + :key #'first))) + (declare (list inter)) + (when inter + (error "In BUILD-FINITE-SS, the symbol ~A is present two times." (caar inter)))))) pre-rslt))) @@ -56,14 +57,14 @@ (DEFUN FINITE-SS-PRE-TABLE-TABLE (pre-table) (declare (list pre-table)) (let* ((maxdim (1+ (apply #'max (mapcar #'first pre-table)))) - (table (make-array maxdim :initial-element +empty-list+))) + (table (make-array maxdim :initial-element +empty-list+))) (declare (fixnum maxdim) (simple-vector table)) (dolist (item pre-table) (declare (list item)) (setf (svref table (first item)) - (sort (rest item) #'string< :key #'first))) + (sort (rest item) #'string< :key #'first))) table)) @@ -77,7 +78,7 @@ (let ((found (find gmsm (svref table dmns) :test #'eq :key #'car))) (declare (type (or cons null) found)) (when found - (return-from finite-ss-find-gmsm dmns))))) + (return-from finite-ss-find-gmsm dmns))))) (DEFUN FINITE-SS-FINISH-TABLE (table bspn) @@ -93,10 +94,10 @@ (simple-vector table) (fixnum dmns)) (setf (svref table dmns) - (mapcar - #'(lambda (entry) - (finite-ss-finish-entry table entry dmns bspn)) - (svref table dmns)))) + (mapcar + #'(lambda (entry) + (finite-ss-finish-entry table entry dmns bspn)) + (svref table dmns)))) (DEFUN FINITE-SS-FINISH-ENTRY (table entry dmns bspn) @@ -106,64 +107,64 @@ (fixnum dmns) (symbol bspn)) (let ((simplex (first entry)) - (faces (rest entry))) + (faces (rest entry))) (declare (symbol simplex) (list faces)) (when (zerop dmns) (return-from finite-ss-finish-entry - (make-gmsm-faces-info - :gmsm simplex :faces +s-empty-vector+ - :bndr +zero-negative-cmbn+))) + (make-gmsm-faces-info + :gmsm simplex :faces +s-empty-vector+ + :bndr +zero-negative-cmbn+))) (setf faces (nconc faces (make-list (1+ (- dmns (length faces))) - :initial-element bspn))) + :initial-element bspn))) (let ((rslt (make-gmsm-faces-info :gmsm simplex))) (declare (cons rslt)) (flet ((process-face (face) - (declare (type (or symbol list) face)) - (when (symbolp face) - (setf face (list face))) - (let* ((gmsm2 (car (last face))) - (dgop-ext (nbutlast face)) - (dmns2 (finite-ss-find-gmsm table gmsm2 0 dmns))) - (declare - (symbol gmsm2) - (list dgop-ext) - (type (or fixnum null) dmns2)) - (unless dmns2 - (error "In BUILD-FINITE-SS, the face ~A is absent." gmsm2)) - (when (zerop (length dgop-ext)) - (setf dgop-ext (nreverse (= dmns l)) - +empty-list+ - (list dmns))))) - (the basis #'rslt))))) + (when (eq l :infinity) + (setf l most-positive-fixnum)) + (flet + ((rslt (dmns) + (declare (fixnum dmns)) + (the list + (if (or (minusp dmns) + (< 0 dmns k) + (>= dmns l)) + +empty-list+ + (list dmns))))) + (the basis #'rslt))))) (DEFUN R-PROJ-SPACE-FACE (k) (declare (fixnum k)) (flet ((rslt (indx dmns gmsm) (declare - (fixnum indx dmns) - (ignore gmsm)) + (fixnum indx dmns) + (ignore gmsm)) (if (<= dmns k) - (absm (mask (1- dmns)) 0) - (if (or (zerop indx) - (= indx dmns)) - (absm 0 (1- dmns)) - (if (= dmns (1+ k)) - (absm (mask (1- dmns)) 0) - (absm (2-exp (1- indx)) (- dmns 2))))))) + (absm (mask (1- dmns)) 0) + (if (or (zerop indx) + (= indx dmns)) + (absm 0 (1- dmns)) + (if (= dmns (1+ k)) + (absm (mask (1- dmns)) 0) + (absm (2-exp (1- indx)) (- dmns 2))))))) (the face #'rslt))) @@ -455,15 +456,15 @@ (flet ((rslt (cmbn) (declare (type cmbn cmbn)) (with-cmbn (degr list) cmbn - (unless list - (return-from rslt (zero-cmbn (1- degr)))) - (if (<= degr k) - (zero-cmbn (1- degr)) - (if (evenp degr) - (make-cmbn - :degr (1- degr) - :list (list (term (* 2 (-cffc list)) (1- degr)))) - (zero-cmbn (1- degr))))))) + (unless list + (return-from rslt (zero-cmbn (1- degr)))) + (if (<= degr k) + (zero-cmbn (1- degr)) + (if (evenp degr) + (make-cmbn + :degr (1- degr) + :list (list (term (* 2 (-cffc list)) (1- degr)))) + (zero-cmbn (1- degr))))))) (the intr-mrph #'rslt))) (DEFUN R-PROJ-SPACE (&optional (l :infinity) (k 1)) @@ -476,13 +477,13 @@ (<= k l))))) (the simplicial-set (build-smst - :cmpr #'R-proj-space-cmpr - :basis (R-proj-space-basis k l) - :bspn 0 - :face (R-proj-space-face k) - :intr-bndr (R-proj-space-intr-bndr k) - :bndr-strt :cmbn - :orgn `(R-proj-space ,k ,l)))) + :cmpr #'R-proj-space-cmpr + :basis (R-proj-space-basis k l) + :bspn 0 + :face (R-proj-space-face k) + :intr-bndr (R-proj-space-intr-bndr k) + :bndr-strt :cmbn + :orgn `(R-proj-space ,k ,l)))) ;;; Constructing a small simplicial subset @@ -498,13 +499,13 @@ (DEFUN GMSMS-SUBSMST (smst gmsms - &aux - (dmns (typecase gmsms - (cmbn (cmbn-degr gmsms)) - (otherwise (first gmsms)))) - (cmpr= #'(lambda (gmsm1 gmsm2) - (declare (type gmsm gmsm1 gmsm2)) - (the boolean + &aux + (dmns (typecase gmsms + (cmbn (cmbn-degr gmsms)) + (otherwise (first gmsms)))) + (cmpr= #'(lambda (gmsm1 gmsm2) + (declare (type gmsm gmsm1 gmsm2)) + (the boolean (eq (cmpr smst gmsm1 gmsm2) :equal))))) (declare (type simplicial-set smst) @@ -515,42 +516,85 @@ (setf gmsms (cmbn-gmsms gmsms))) (the (values simplicial-set morphism) (let ((prslt (make-array (1+ dmns) :initial-element +empty-list+))) - (declare (type simple-vector prslt)) - (setf (svref prslt dmns) (rest gmsms)) - (do ((d dmns (1- d))) - ((zerop d)) - (declare (fixnum d)) - (dolist (gmsm (svref prslt d)) - (declare (type gmsm gmsm)) - (dotimes (iface (1+ d)) - (declare (fixnum iface)) - (with-absm (dgop gmsm) (face smst iface d gmsm) - (declare (fixnum dgop) (type gmsm gmsm)) - (pushnew gmsm (svref prslt (- d 1 (logcount dgop))) - :test cmpr=))))) - (let ((rslt-basis #'(lambda (k) - (declare (fixnum dmns)) - (the list - (if (<= 0 k dmns) - (aref prslt k) - +empty-list+))))) - (declare (type (function (fixnum) list) rslt-basis)) - (let ((subsmst (build-smst - :cmpr (cmpr smst) - :basis rslt-basis - :bspn (let ((bspn (bspn smst))) - (declare (type gmsm bspn)) - (pushnew bspn (svref prslt 0) :test cmpr=) - bspn) - :face (face smst) - :orgn `(gmsms-subsmst ,gmsms)))) - (declare (type simplicial-set subsmst)) - (values subsmst - (build-mrph :sorc subsmst - :trgt smst - :degr 0 - :intr #'(lambda (cmbn) - (declare (type cmbn cmbn)) - (the cmbn cmbn)) - :strt :cmbn - :orgn `(gmsms-subsmst-incl ,gmsms)))))))) + (declare (type simple-vector prslt)) + (setf (svref prslt dmns) (rest gmsms)) + (do ((d dmns (1- d))) + ((zerop d)) + (declare (fixnum d)) + (dolist (gmsm (svref prslt d)) + (declare (type gmsm gmsm)) + (dotimes (iface (1+ d)) + (declare (fixnum iface)) + (with-absm (dgop gmsm) (face smst iface d gmsm) + (declare (fixnum dgop) (type gmsm gmsm)) + (pushnew gmsm (svref prslt (- d 1 (logcount dgop))) + :test cmpr=))))) + (let ((rslt-basis #'(lambda (k) + (declare (fixnum dmns)) + (the list + (if (<= 0 k dmns) + (aref prslt k) + +empty-list+))))) + (declare (type (function (fixnum) list) rslt-basis)) + (let ((subsmst (build-smst + :cmpr (cmpr smst) + :basis rslt-basis + :bspn (let ((bspn (bspn smst))) + (declare (type gmsm bspn)) + (pushnew bspn (svref prslt 0) :test cmpr=) + bspn) + :face (face smst) + :orgn `(gmsms-subsmst ,gmsms)))) + (declare (type simplicial-set subsmst)) + (values subsmst + (build-mrph :sorc subsmst + :trgt smst + :degr 0 + :intr #'(lambda (cmbn) + (declare (type cmbn cmbn)) + (the cmbn cmbn)) + :strt :cmbn + :orgn `(gmsms-subsmst-incl ,gmsms)))))))) + +(defun absm-ext-int (vlist) + (do ((dgop nil) + (gmsm (list (first vlist))) + (mark (rest vlist) (cdr mark)) + (idgop 0 (1+ idgop))) + ((endp mark) (absm (dgop-ext-int dgop) + (dgop-ext-int gmsm))) + (if (= (first gmsm) (car mark)) + (push idgop dgop) + (push (car mark) gmsm)))) + + +(defun absm-int-ext (absm) + (with-absm + (dgop gmsm) absm + (do ((dgop (nreverse (dgop-int-ext dgop))) + (gmsm (rest (dlop-int-ext gmsm))) + (i 0 (1+ i)) + (rslt (list (first (dlop-int-ext gmsm))))) + ((and (endp dgop) (endp gmsm)) (nreverse rslt)) + (if dgop + (if (= i (car dgop)) + (progn + (pop dgop) + (push (first rslt) rslt)) + (push (pop gmsm) rslt)) + (return (nreconc rslt gmsm)))))) + + +(defun vertex-i (absm i) + (with-absm + (dgop gmsm) absm + (let ((dgop (nreverse (dgop-int-ext dgop))) + (gmsm (dlop-int-ext gmsm))) + (do ((dgop-mark dgop) + (gmsm-mark gmsm) + (ii 0 (1+ ii))) + ((= i ii) (car gmsm-mark)) + (if (and dgop-mark + (= ii (car dgop-mark))) + (pop dgop-mark) + (pop gmsm-mark)))))) diff --git a/test/kan-test.lisp b/test/kan-test.lisp index 78b1260..a5e8a4d 100644 --- a/test/kan-test.lisp +++ b/test/kan-test.lisp @@ -1,99 +1,55 @@ +;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -* (in-package :kenzo-test) (in-suite :kenzo) -(defun vertex-i (absm i) - (cat:with-absm - (dgop gmsm) absm - (let ((dgop (nreverse (cat:dgop-int-ext dgop))) - (gmsm (cat:dlop-int-ext gmsm))) - (do ((dgop-mark dgop) - (gmsm-mark gmsm) - (ii 0 (1+ ii))) - ((= i ii) (car gmsm-mark)) - (if (and dgop-mark - (= ii (car dgop-mark))) - (pop dgop-mark) - (pop gmsm-mark)))))) - - (test vertex-i (let ((d (cat:delta-infinity))) - (vertex-i (cat:absm 0 1) 0) - (vertex-i (cat:absm 1 1) 0) - (vertex-i (cat:absm 1 1) 1) - (vertex-i (cat:absm 0 3) 0) - (vertex-i (cat:absm 0 3) 1) - (vertex-i (cat:absm 3 1) 0) - (vertex-i (cat:absm 3 1) 1) - (vertex-i (cat:absm 3 1) 2) - (vertex-i (cat:absm 1 3) 0) - (vertex-i (cat:absm 1 3) 1) - (vertex-i (cat:absm 1 3) 2) - (vertex-i (cat:absm 2 3) 0) - (vertex-i (cat:absm 2 3) 1) - (vertex-i (cat:absm 2 3) 2) - (vertex-i (cat:absm 0 7) 0) - (vertex-i (cat:absm 0 7) 1) - (vertex-i (cat:absm 0 7) 2))) - - -(defun absm-int-ext (absm) - (cat:with-absm - (dgop gmsm) absm - (do ((dgop (nreverse (cat:dgop-int-ext dgop))) - (gmsm (rest (cat:dlop-int-ext gmsm))) - (i 0 (1+ i)) - (rslt (list (first (cat:dlop-int-ext gmsm))))) - ((and (endp dgop) (endp gmsm)) (nreverse rslt)) - (if dgop - (if (= i (car dgop)) - (progn - (pop dgop) - (push (first rslt) rslt)) - (push (pop gmsm) rslt)) - (return (nreconc rslt gmsm)))))) - - -(defun absm-ext-int (vlist) - (do ((dgop nil) - (gmsm (list (first vlist))) - (mark (rest vlist) (cdr mark)) - (idgop 0 (1+ idgop))) - ((endp mark) (cat:absm (cat:dgop-ext-int dgop) - (cat:dgop-ext-int gmsm))) - (if (= (first gmsm) (car mark)) - (push idgop dgop) - (push (car mark) gmsm)))) - + (cat:vertex-i (cat:absm 0 1) 0) + (cat:vertex-i (cat:absm 1 1) 0) + (cat:vertex-i (cat:absm 1 1) 1) + (cat:vertex-i (cat:absm 0 3) 0) + (cat:vertex-i (cat:absm 0 3) 1) + (cat:vertex-i (cat:absm 3 1) 0) + (cat:vertex-i (cat:absm 3 1) 1) + (cat:vertex-i (cat:absm 3 1) 2) + (cat:vertex-i (cat:absm 1 3) 0) + (cat:vertex-i (cat:absm 1 3) 1) + (cat:vertex-i (cat:absm 1 3) 2) + (cat:vertex-i (cat:absm 2 3) 0) + (cat:vertex-i (cat:absm 2 3) 1) + (cat:vertex-i (cat:absm 2 3) 2) + (cat:vertex-i (cat:absm 0 7) 0) + (cat:vertex-i (cat:absm 0 7) 1) + (cat:vertex-i (cat:absm 0 7) 2))) (test absm-int-ext - (absm-ext-int '(0 0 0 1 2 3 3 3)) - (absm-ext-int '(0 1 1 1 2)) - (absm-int-ext (absm-ext-int '(0 0 0 1 2 3 3 3))) - (absm-int-ext (absm-ext-int '(0 1 1 1 2)))) + (cat:absm-ext-int '(0 0 0 1 2 3 3 3)) + (cat:absm-ext-int '(0 1 1 1 2)) + (cat:absm-int-ext (cat:absm-ext-int '(0 0 0 1 2 3 3 3))) + (cat:absm-int-ext (cat:absm-ext-int '(0 1 1 1 2)))) (defun dkfll (indx dmns hat) (cond ((= 1 dmns) - (cat:absm 1 (cat:gmsm (first hat)))) - ((= 0 indx) - (let ((del-1 (absm-int-ext (first hat))) - (del-2 (absm-int-ext (second hat)))) - (absm-ext-int - (cons (first del-1) - (cons (second del-2) (rest del-1)))))) - ((= 1 indx) - (let ((del-0 (absm-int-ext (first hat))) - (del-2 (absm-int-ext (second hat)))) - (absm-ext-int - (cons (first del-2) del-0)))) - (t - (let ((del-0 (absm-int-ext (first hat))) - (del-1 (absm-int-ext (second hat)))) - (absm-ext-int - (cons (first del-1) del-0)))))) + (cat:absm 1 (cat:gmsm (first hat)))) + ((= 0 indx) + (let ((del-1 (cat:absm-int-ext (first hat))) + (del-2 (cat:absm-int-ext (second hat)))) + (cat:absm-ext-int + (cons (first del-1) + (cons (second del-2) (rest del-1)))))) + ((= 1 indx) + (let ((del-0 (cat:absm-int-ext (first hat))) + (del-2 (cat:absm-int-ext (second hat)))) + (cat:absm-ext-int + (cons (first del-2) del-0)))) + (t + (let ((del-0 (cat:absm-int-ext (first hat))) + (del-1 (cat:absm-int-ext (second hat)))) + (cat:absm-ext-int + (cons (first del-1) del-0)))))) (let ((d (cat:delta-infinity))) @@ -108,12 +64,12 @@ (test check-hat (let* ((od (cat:gdeltab)) - (s (cat:loop3 0 31 2)) - (faces (mapcar #'(lambda (indx) (cat:face od indx 3 s)) - '(0 1 2 3)))) - (delete (nth 1 faces) faces) - (cat:check-hat od 1 3 faces) - (setf (nth 2 faces) (nth 1 faces)) - (signals #-ecl simple-error - #+ecl simple-type-error - (cat:check-hat od 1 3 faces)))) + (s (cat:loop3 0 31 2)) + (faces (mapcar #'(lambda (indx) (cat:face od indx 3 s)) + '(0 1 2 3)))) + (delete (nth 1 faces) faces) + (cat:check-hat od 1 3 faces) + (setf (nth 2 faces) (nth 1 faces)) + (signals #-ecl simple-error + #+ecl simple-type-error + (cat:check-hat od 1 3 faces))))