From 8f0d75b1057dc36ec4cac088edbf68c74731745e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Romero=20Ib=C3=A1=C3=B1ez?= Date: Mon, 16 Sep 2019 18:45:53 +0200 Subject: [PATCH 1/2] Functions for change a chain complex to a filtered chain complex modified Example of bicomplex added --- src/anromero/bicomplexes.lisp | 58 +- src/anromero/filtered-complexes.lisp | 1085 ++++++++++++------------- src/anromero/persistent-homology.lisp | 2 +- src/anromero/spectral-sequences.lisp | 21 +- 4 files changed, 585 insertions(+), 581 deletions(-) diff --git a/src/anromero/bicomplexes.lisp b/src/anromero/bicomplexes.lisp index 889afd5..ad7bf82 100644 --- a/src/anromero/bicomplexes.lisp +++ b/src/anromero/bicomplexes.lisp @@ -373,8 +373,64 @@ (slot-makunbound chcm 'bsgn) chcm))) + + #| -;; Example of bicomplex from a list of morphisms of two chain complexes +;; EXAMPLE OF BICOMPLEX + +(cat-init) + + +(defun bcbasis (degr1 degr2) + (if (and (= degr1 0) (= degr2 1)) (return-from bcbasis '(a1 a2))) + (if (and (= degr1 1) (= degr2 0)) (return-from bcbasis '(b))) + (if (and (= degr1 1) (= degr2 1)) (return-from bcbasis '(c1 c2))) + (if (and (= degr1 2) (= degr2 0)) (return-from bcbasis '(d1 d2))) + (return-from bcbasis nil)) + +(defun dif1 (degr1 degr2 gnrt) + (if (and (= degr1 1) (= degr2 1) (eql gnrt 'c1)) (return-from dif1 (list (cons 2 'a1)))) + (if (and (= degr1 1) (= degr2 1) (eql gnrt 'c2)) (return-from dif1 (list (cons 2 'a2)))) + (if (and (= degr1 2) (= degr2 0) (eql gnrt 'd1)) (return-from dif1 (list (cons 2 'b)))) + (return-from dif1 nil)) + +(defun dif2 (degr1 degr2 gnrt) + (if (and (= degr1 1) (= degr2 1) (eql gnrt 'c1)) (return-from dif2 (list (cons 1 'b)))) + (return-from dif2 nil)) + +(setf bc (build-bicm :cmpr #'s-cmpr :bcbasis #'bcbasis :dffr1 #'dif1 :dffr2 #'dif2 + :orgn '(Bicomplex1))) + +(basis bc 1) + +(change-bicm-to-flcc bc) + + +(do ((r 1 (1+ r))) + ((> r 3)) + (dotimes (n 3) + (dotimes (p (+ n 1)) + (let ((q (- n p))) + (spsq-group bc r p q) + (terpri) + (terpri) + )))) + +(SPSQ-DFFR-OF-ONE-ELEMENT bc 1 1 1 '(1)) + +(SPSQ-DFFR-OF-ONE-ELEMENT bc 2 2 0 '(1 0)) + +(SPSQ-DFFR-OF-ONE-ELEMENT bc 2 2 0 '(0 1)) + +(spsq-cnvg bc 4) + +|# + + + + +#| +;; EXAMPLE OF BICOMPLEX FROM A LIST OF MORPHISMS OF TWO CHAIN COMPLEXES ;; First we build the three chain complexes diff --git a/src/anromero/filtered-complexes.lisp b/src/anromero/filtered-complexes.lisp index d9a5e83..eaa8f14 100644 --- a/src/anromero/filtered-complexes.lisp +++ b/src/anromero/filtered-complexes.lisp @@ -9,11 +9,11 @@ (DEFTYPE degr () 'fixnum) (DEFTYPE CHCM-FLIN () 'function) - ;; '(function (degr gnrt) degr) +;; '(function (degr gnrt) degr) (DEFCLASS FILTERED-CHAIN-COMPLEX (chain-complex) - ((flin :type chcm-flin :initarg :flin :reader flin1))) + ((flin :type chcm-flin :initarg :flin :reader flin1))) (DEFVAR *flcc-list*) (SETF *flcc-list* +empty-list+) @@ -22,278 +22,254 @@ #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((flcm FILTERED-CHAIN-COMPLEX) stream) -(the FILTERED-CHAIN-COMPLEX - (progn + (the FILTERED-CHAIN-COMPLEX + (progn (format stream "[K~D Filtered-Chain-Complex]" (idnm flcm)) - flcm))) + flcm))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN FLCC (idnm) - (declare (type fixnum idnm)) - (the (or FILTERED-CHAIN-COMPLEX null) - (find idnm *flcc-list* :key #'idnm))) + (declare (type fixnum idnm)) + (the (or FILTERED-CHAIN-COMPLEX null) + (find idnm *flcc-list* :key #'idnm))) ;; Function that builds a filtered chain complex. (DEFUN BUILD-FLCC (&key cmpr basis bsgn intr-dffr dffr-strt flin orgn) - (declare - (type cmprf cmpr) - (type intr-mrph intr-dffr) - (type basis basis) - (type gnrt bsgn) - (type strt dffr-strt) - (type Chcm-Flin flin) - (list orgn)) - (the FILTERED-CHAIN-COMPLEX - (progn - (let ((already (find orgn *flcc-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-CHAIN-COMPLEX) already)) - (when already - (return-from build-flcc already))) - (let ((rslt (build-chcm :cmpr cmpr :basis basis :bsgn bsgn - :intr-dffr intr-dffr :strt dffr-strt - :orgn orgn))) - (declare (type chain-complex rslt)) - (change-class rslt 'FILTERED-CHAIN-COMPLEX) - (setf (slot-value rslt 'flin) flin) - (push rslt *flcc-list*) - rslt)))) + (declare + (type cmprf cmpr) + (type intr-mrph intr-dffr) + (type basis basis) + (type gnrt bsgn) + (type strt dffr-strt) + (type Chcm-Flin flin) + (list orgn)) + (the FILTERED-CHAIN-COMPLEX + (progn + (let ((already (find orgn *flcc-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-CHAIN-COMPLEX) already)) + (when already + (return-from build-flcc already))) + (let ((rslt (build-chcm :cmpr cmpr :basis basis :bsgn bsgn + :intr-dffr intr-dffr :strt dffr-strt + :orgn orgn))) + (declare (type chain-complex rslt)) + (change-class rslt 'FILTERED-CHAIN-COMPLEX) + (setf (slot-value rslt 'flin) flin) + (push rslt *flcc-list*) + rslt)))) -;; Function that changes a chain complex chcm to a filtered complex, with filtration -;; index of a generator defined by the function flin, and origin orgn. -#|(DEFUN CHANGE-CHCM-TO-FLCC (chcm &key flin orgn) - (declare - (type chain-complex chcm) - (type chcm-flin flin) - (type list orgn)) - (the FILTERED-CHAIN-COMPLEX - (progn - (change-class chcm 'FILTERED-CHAIN-COMPLEX) - ;;(setf orgn (list (orgn chcm) 'then orgn)) - (let ((already (find orgn *flcc-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-CHAIN-COMPLEX) already)) - (when already - (return-from change-chcm-to-flcc already))) - (setf (slot-value chcm 'flin) flin) - ;;(setf (slot-value chcm 'orgn) orgn) - (push chcm *flcc-list*) - chcm))) -|# - - -(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm chain-complex) flin flin-orgn) - (declare - (type chain-complex chcm) - (type chcm-flin flin) - ;;(type list flin-orgn) -) - (the FILTERED-CHAIN-COMPLEX - (progn - (change-class chcm 'FILTERED-CHAIN-COMPLEX) - (let* ((orgn (orgn chcm)) - (already (find orgn *flcc-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-CHAIN-COMPLEX) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) - (push chcm *flcc-list*)) - chcm))) +(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm chain-complex) flin) + (declare + (type chain-complex chcm) + (type chcm-flin flin)) + (the FILTERED-CHAIN-COMPLEX + (progn + (change-class chcm 'FILTERED-CHAIN-COMPLEX) + (let* ((orgn (orgn chcm)) + (already (find orgn *flcc-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-CHAIN-COMPLEX) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) + (push chcm *flcc-list*)) + chcm))) (DEFMACRO FLIN (&rest rest) - (ecase (length rest) - (1 `(flin1 ,@rest)) - (2 `(flin2 ,@rest)) - (3 `(flin3 ,@rest)))) + (ecase (length rest) + (1 `(flin1 ,@rest)) + (2 `(flin2 ,@rest)) + (3 `(flin3 ,@rest)))) (DEFUN FLIN3 (object degr gnrt) - (declare - (type FILTERED-CHAIN-COMPLEX object) - (fixnum degr) - (type gnrt gnrt)) - (the fixnum - (with-slots (flin) object - (declare (type chcm-flin flin)) - (funcall flin degr gnrt)))) + (declare + (type FILTERED-CHAIN-COMPLEX object) + (fixnum degr) + (type gnrt gnrt)) + (the fixnum + (with-slots (flin) object + (declare (type chcm-flin flin)) + (funcall flin degr gnrt)))) (DEFUN FLIN2 (object cmbn) - (declare - (type FILTERED-CHAIN-COMPLEX object) - (type cmbn cmbn)) - (the fixnum - (with-slots (flin) object - (declare (type chcm-flin flin)) - (with-cmbn (degr cmbn-list) cmbn - (declare - (fixnum degr) - (list cmbn-list)) - (labels ((list-max (list) - (declare (type list list)) - (let* ((max-int (car list))) - (do ((mark1 list (cdr mark1))) - ((endp mark1)) - (setq max-int (max max-int (car mark1)))) - max-int))) - (if (endp cmbn-list) - 0 + (declare + (type FILTERED-CHAIN-COMPLEX object) + (type cmbn cmbn)) + (the fixnum + (with-slots (flin) object + (declare (type chcm-flin flin)) + (with-cmbn (degr cmbn-list) cmbn + (declare + (fixnum degr) + (list cmbn-list)) + (labels ((list-max (list) + (declare (type list list)) + (let* ((max-int (car list))) + (do ((mark1 list (cdr mark1))) + ((endp mark1)) + (setq max-int (max max-int (car mark1)))) + max-int))) + (if (endp cmbn-list) + 0 (list-max - (mapcar - #'(lambda (term) - (flin3 object degr (gnrt term))) - cmbn-list)))))))) - + (mapcar + #'(lambda (term) + (flin3 object degr (gnrt term))) + cmbn-list)))))))) + ;; Function that returns the min and max of the filtration index of the elements of the basis ;; for degree degr (DEFUN FLIN-MIN-MAX (fltrcm degr) - (declare (type FILTERED-CHAIN-COMPLEX fltrcm) - (type fixnum degr)) - (when (eq (basis fltrcm) :locally-effective) + (declare (type FILTERED-CHAIN-COMPLEX fltrcm) + (type fixnum degr)) + (when (eq (basis fltrcm) :locally-effective) (error "flin-min-max cannot work with a LOCALLY-EFFECTIVE chain complex.")) - (the list - (let* ((basis (basis fltrcm degr))) - (declare (list basis)) - (if (endp basis) - (list 0 0) - (let* ((min (flin fltrcm degr (first basis))) - (max min)) - (declare (type fixnum min max)) - (dolist (gnrt (cdr basis)) - (let ((aux (flin fltrcm degr gnrt))) - (declare (type fixnum aux)) - (if (< aux min) - (setf min aux) - (if (> aux max) - (setf max aux))))) - (list min max)))))) - - - + (the list + (let* ((basis (basis fltrcm degr))) + (declare (list basis)) + (if (endp basis) + (list 0 0) + (let* ((min (flin fltrcm degr (first basis))) + (max min)) + (declare (type fixnum min max)) + (dolist (gnrt (cdr basis)) + (let ((aux (flin fltrcm degr gnrt))) + (declare (type fixnum aux)) + (if (< aux min) + (setf min aux) + (if (> aux max) + (setf max aux))))) + (list min max)))))) + + + ;; Function that returns the elements of the basis that have bidegree (p,q). (DEFUN BIGRD-BASIS (fltrcm p q) - (declare (type FILTERED-CHAIN-COMPLEX fltrcm) - (type fixnum p q)) - (when (eq (basis fltrcm) :locally-effective) + (declare (type FILTERED-CHAIN-COMPLEX fltrcm) + (type fixnum p q)) + (when (eq (basis fltrcm) :locally-effective) (error "Bigrd-Basis cannot work with a LOCALLY-EFFECTIVE chain complex.")) - (the list - (let* ((degr (+ p q)) - (basis (basis fltrcm degr))) - (declare - (type list basis) - (fixnum degr)) - (mapcan + (the list + (let* ((degr (+ p q)) + (basis (basis fltrcm degr))) + (declare + (type list basis) + (fixnum degr)) + (mapcan #'(lambda (gnrt) (declare (type gnrt gnrt)) (if (= (flin fltrcm degr gnrt) p) - (list gnrt) - nil)) - basis)))) + (list gnrt) + nil)) + basis)))) ;; Function that returns the elements of the basis of degree "degr" that have ;; filtration index <= "fltr-index". (DEFUN FLTRD-BASIS (fltrcm degr fltr-index) - (declare (type FILTERED-CHAIN-COMPLEX fltrcm) - (type fixnum degr fltr-index)) - (when (eq (basis fltrcm) :locally-effective) + (declare (type FILTERED-CHAIN-COMPLEX fltrcm) + (type fixnum degr fltr-index)) + (when (eq (basis fltrcm) :locally-effective) (error "Fltrd-Basis cannot work with a LOCALLY-EFFECTIVE chain complex.")) - (let ((min (first (flin-min-max fltrcm degr)))) - (declare (type fixnum min)) - (the list - (mapcan + (let ((min (first (flin-min-max fltrcm degr)))) + (declare (type fixnum min)) + (the list + (mapcan #'(lambda (i) (bigrd-basis fltrcm i (- degr i))) - ( min fltr-index))))) + ( min fltr-index))))) ;; Function that returns the elements of the basis with degree "degr", ;; ordered by the filtration index. (DEFUN ORDERED-BASIS (fltrcm degr) - (declare - (type FILTERED-CHAIN-COMPLEX fltrcm) - (fixnum degr)) - (when (eq (basis fltrcm) :locally-effective) + (declare + (type FILTERED-CHAIN-COMPLEX fltrcm) + (fixnum degr)) + (when (eq (basis fltrcm) :locally-effective) (error "Ordered-Basis cannot work with a LOCALLY-EFFECTIVE chain complex.")) - (the list - (let ((max (second (flin-min-max fltrcm degr)))) - (declare (type fixnum max)) - (fltrd-basis fltrcm degr max)))) + (the list + (let ((max (second (flin-min-max fltrcm degr)))) + (declare (type fixnum max)) + (fltrd-basis fltrcm degr max)))) ;; Matrix of the differential application of degree "degr" of the subcomplex ;; F_pX, where p=fltr-index and X=fltrcm. -(defun FLCC-DFFR-MTRX (fltrcm degr fltr-index) +(DEFUN FLCC-DFFR-MTRX (fltrcm degr fltr-index) (declare - (type FILTERED-CHAIN-COMPLEX fltrcm) - (fixnum degr fltr-index)) - (when (eq (basis fltrcm) :locally-effective) + (type FILTERED-CHAIN-COMPLEX fltrcm) + (fixnum degr fltr-index)) + (when (eq (basis fltrcm) :locally-effective) (error "flcc-dffr-mtrx cannot work with a LOCALLY-EFFECTIVE chain complex.")) (the matrix (let* ((cmpr (cmpr1 fltrcm)) - (dffr (dffr fltrcm)) - (sbasis (fltrd-basis fltrcm degr fltr-index)) + (dffr (dffr fltrcm)) + (sbasis (fltrd-basis fltrcm degr fltr-index)) (tbasis (ordered-basis fltrcm (1- degr))) ;; If the differential application in the filtered complex respects the filtration, ;; i.e., d(F_pA_n) \in (F_pA)_{n-1}, the target basis is (fltrd-basis fltrcm (1- degr) fltr-index) (srank (length sbasis)) - (trank (length tbasis))) - (declare - (type cmprf cmpr) - (type morphism dffr) - (fixnum degr) - (list sbasis tbasis) - (fixnum srank trank)) - (let ((rslt - #-ACLPC - (make-array (list trank srank) - :element-type 'fixnum - :initial-element 0) - #+ACLPC - (if (or (zerop srank) (zerop trank)) - (make-array (list trank srank) - :element-type 'fixnum) - (make-array (list trank srank) - :element-type 'fixnum - :initial-element 0)) - )) - (declare (type matrix rslt)) - (do ((j 0 (1+ j)) - (mark sbasis (cdr mark))) - ((endp mark)) - (declare - (fixnum j) - (list mark)) - (let ((cmbn (gnrt-? dffr degr (car mark)))) - (declare (type cmbn cmbn)) - (do ((mark1 (cmbn-list cmbn) (cdr mark1))) - ((endp mark1)) - (declare (list mark1)) - (with--term (cffc gnrt) mark1 - (declare - (fixnum cffc) - (type gnrt gnrt)) - (do ((mark2 tbasis (cdr mark2)) - (i 0 (1+ i)) - (found nil)) - ((or (endp mark2) found)) - (declare - (list mark2) - (fixnum i)) - (if (eq :equal (funcall cmpr gnrt (car mark2))) - (progn - (setq found 1) - (setf (aref rslt i j) cffc)))))))) - rslt)))) + (trank (length tbasis))) + (declare + (type cmprf cmpr) + (type morphism dffr) + (fixnum degr) + (list sbasis tbasis) + (fixnum srank trank)) + (let ((rslt + #-ACLPC + (make-array (list trank srank) + :element-type 'fixnum + :initial-element 0) + #+ACLPC + (if (or (zerop srank) (zerop trank)) + (make-array (list trank srank) + :element-type 'fixnum) + (make-array (list trank srank) + :element-type 'fixnum + :initial-element 0)) + )) + (declare (type matrix rslt)) + (do ((j 0 (1+ j)) + (mark sbasis (cdr mark))) + ((endp mark)) + (declare + (fixnum j) + (list mark)) + (let ((cmbn (gnrt-? dffr degr (car mark)))) + (declare (type cmbn cmbn)) + (do ((mark1 (cmbn-list cmbn) (cdr mark1))) + ((endp mark1)) + (declare (list mark1)) + (with--term (cffc gnrt) mark1 + (declare + (fixnum cffc) + (type gnrt gnrt)) + (do ((mark2 tbasis (cdr mark2)) + (i 0 (1+ i)) + (found nil)) + ((or (endp mark2) found)) + (declare + (list mark2) + (fixnum i)) + (if (eq :equal (funcall cmpr gnrt (car mark2))) + (progn + (setq found 1) + (setf (aref rslt i j) cffc)))))))) + rslt)))) ;; OTHER CLASSES THAT INHERIT FROM FILTERED-CHAIN-COMPLEX (DEFCLASS FILTERED-COALGEBRA (filtered-chain-complex coalgebra) - ()) + ()) (DEFVAR *FLCLGB-LIST* "The variable *FLCLGB-LIST* is bound to a list of user created filtered coalgebras") @@ -304,65 +280,63 @@ #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((flclgb FILTERED-COALGEBRA) stream) -(the FILTERED-COALGEBRA - (progn + (the FILTERED-COALGEBRA + (progn (format stream "[K~D FILTERED-COALGEBRA]" (idnm flclgb)) - flclgb))) + flclgb))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN FltrClgb (idnm) - (declare (type fixnum idnm)) - (the (or FILTERED-COALGEBRA null) - (find idnm *flclgb-list* :key #'idnm))) + (declare (type fixnum idnm)) + (the (or FILTERED-COALGEBRA null) + (find idnm *flclgb-list* :key #'idnm))) ;; Function that builds a filtered coalgebra. (DEFUN BUILD-FltrClgb (&key cmpr basis bsgn intr-dffr dffr-strt intr-cprd cprd-strt flin orgn) - (declare - (type cmprf cmpr) - (type intr-mrph intr-dffr intr-cprd) - (type basis basis) - (type gnrt bsgn) - (type strt dffr-strt cprd-strt) - (type chcm-flin flin) - (list orgn)) - (the FILTERED-COALGEBRA - (progn - (let ((already (find orgn *flclgb-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-COALGEBRA) already)) - (when already - (return-from build-FltrClgb already))) - (let ((rslt (build-clgb :cmpr cmpr :basis basis :bsgn bsgn - :intr-dffr intr-dffr :dffr-strt dffr-strt - :intr-cprd intr-cprd :cprd-strt cprd-strt - :orgn orgn))) - (declare (type coalgebra rslt)) - (change-class rslt 'FILTERED-COALGEBRA) - (setf (slot-value rslt 'flin) flin) - (push rslt *flclgb-list*) - rslt)))) + (declare + (type cmprf cmpr) + (type intr-mrph intr-dffr intr-cprd) + (type basis basis) + (type gnrt bsgn) + (type strt dffr-strt cprd-strt) + (type chcm-flin flin) + (list orgn)) + (the FILTERED-COALGEBRA + (progn + (let ((already (find orgn *flclgb-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-COALGEBRA) already)) + (when already + (return-from build-FltrClgb already))) + (let ((rslt (build-clgb :cmpr cmpr :basis basis :bsgn bsgn + :intr-dffr intr-dffr :dffr-strt dffr-strt + :intr-cprd intr-cprd :cprd-strt cprd-strt + :orgn orgn))) + (declare (type coalgebra rslt)) + (change-class rslt 'FILTERED-COALGEBRA) + (setf (slot-value rslt 'flin) flin) + (push rslt *flclgb-list*) + rslt)))) -(defmethod change-chcm-to-flcc ((chcm coalgebra) flin flin-orgn ) - (declare - (type chcm-flin flin) - ;;(type list flin-orgn) -) - (the FILTERED-COALGEBRA - (progn - (change-class chcm 'FILTERED-COALGEBRA) - (let* ((orgn (orgn chcm)) - (already (find orgn *flclgb-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-COALGEBRA) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) - (push chcm *flCLGB-list*) - chcm)))) +(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm coalgebra) flin) + (declare + (type chcm-flin flin)) + (the FILTERED-COALGEBRA + (progn + (change-class chcm 'FILTERED-COALGEBRA) + (let* ((orgn (orgn chcm)) + (already (find orgn *flclgb-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-COALGEBRA) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) + (push chcm *flCLGB-list*) + chcm)))) (DEFCLASS FILTERED-ALGEBRA (filtered-chain-complex algebra) - ()) + ()) (DEFVAR *FLALGB-LIST* "The variable *FLALGB-LIST* is bound to a list of user created filtered algebras.") @@ -373,67 +347,63 @@ #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((flalgb FILTERED-ALGEBRA) stream) -(the FILTERED-ALGEBRA - (progn + (the FILTERED-ALGEBRA + (progn (format stream "[K~D FILTERED-ALGEBRA]" (idnm flalgb)) - flalgb))) + flalgb))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN FltrAlgb (idnm) - (declare (type fixnum idnm)) - (the (or FILTERED-ALGEBRA null) - (find idnm *flalgb-list* :key #'idnm))) + (declare (type fixnum idnm)) + (the (or FILTERED-ALGEBRA null) + (find idnm *flalgb-list* :key #'idnm))) ;; Function that builds a filtered algebra. (DEFUN BUILD-FltrAlgb (&key cmpr basis bsgn intr-dffr dffr-strt intr-aprd aprd-strt flin orgn) - (declare - (type cmprf cmpr) - (type intr-mrph intr-dffr intr-aprd) - (type basis basis) - (type gnrt bsgn) - (type strt dffr-strt aprd-strt) - (type chcm-flin flin) - (list orgn)) - (the FILTERED-ALGEBRA - (progn - (let ((already (find orgn *flalgb-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-ALGEBRA) already)) - (when already - (return-from build-FltrAlgb already))) - (let ((rslt (build-algb :cmpr cmpr :basis basis :bsgn bsgn - :intr-dffr intr-dffr :dffr-strt dffr-strt - :intr-aprd intr-aprd :aprd-strt aprd-strt - :orgn orgn))) - (declare (type algebra rslt)) - (change-class rslt 'FILTERED-ALGEBRA) - (setf (slot-value rslt 'flin) flin) - (push rslt *flalgb-list*) - rslt)))) + (declare + (type cmprf cmpr) + (type intr-mrph intr-dffr intr-aprd) + (type basis basis) + (type gnrt bsgn) + (type strt dffr-strt aprd-strt) + (type chcm-flin flin) + (list orgn)) + (the FILTERED-ALGEBRA + (progn + (let ((already (find orgn *flalgb-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-ALGEBRA) already)) + (when already + (return-from build-FltrAlgb already))) + (let ((rslt (build-algb :cmpr cmpr :basis basis :bsgn bsgn + :intr-dffr intr-dffr :dffr-strt dffr-strt + :intr-aprd intr-aprd :aprd-strt aprd-strt + :orgn orgn))) + (declare (type algebra rslt)) + (change-class rslt 'FILTERED-ALGEBRA) + (setf (slot-value rslt 'flin) flin) + (push rslt *flalgb-list*) + rslt)))) -(defmethod change-chcm-to-flcc ((chcm algebra) flin flin-orgn ) - (declare - (type chcm-flin flin) - ;;(list flin-orgn) -) - (the FILTERED-ALGEBRA - (progn - (change-class chcm 'FILTERED-ALGEBRA) - ;;(setf orgn (append (orgn chcm) (list 'FILTERED-WITH) (list flin-orgn))) - (let* ( - (orgn (orgn chcm)) - (already (find orgn *flalgb-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-ALGEBRA) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) - (push chcm *flaLGB-list*) - chcm)))) +(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm algebra) flin) + (declare + (type chcm-flin flin)) + (the FILTERED-ALGEBRA + (progn + (change-class chcm 'FILTERED-ALGEBRA) + (let* ((orgn (orgn chcm)) + (already (find orgn *flalgb-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-ALGEBRA) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) + (push chcm *flaLGB-list*) + chcm)))) (DEFCLASS FILTERED-HOPF-ALGEBRA (filtered-chain-complex hopf-algebra) - ()) + ()) (DEFVAR *FLHOPF-LIST* "The variable *FLHOPF-LIST* is bound to a list of user created filtered Hopf algebras.") @@ -444,40 +414,36 @@ #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((flhopf FILTERED-HOPF-ALGEBRA) stream) -(the FILTERED-HOPF-ALGEBRA - (progn + (the FILTERED-HOPF-ALGEBRA + (progn (format stream "[K~D FILTERED-HOPF-ALGEBRA]" (idnm flhopf)) - flhopf))) + flhopf))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN FltrHopf (idnm) - (declare (type fixnum idnm)) - (the (or FILTERED-HOPF-ALGEBRA null) - (find idnm *flhopf-list* :key #'idnm))) + (declare (type fixnum idnm)) + (the (or FILTERED-HOPF-ALGEBRA null) + (find idnm *flhopf-list* :key #'idnm))) -(defmethod change-chcm-to-flcc ((chcm hopf-algebra) flin flin-orgn ) - (declare - (type chcm-flin flin) - ;;(list flin-orgn) -) - (the FILTERED-hopf-algebra - (progn - (change-class chcm 'FILTERED-hopf-ALGEBRA) - ;;(setf orgn (append (orgn chcm) (list 'FILTERED-WITH) (list flin-orgn))) - (let* ( - (orgn (orgn chcm)) - (already (find orgn *flhopf-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-HOPF-ALGEBRA) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) - (push chcm *flhopf-list*) - chcm)))) +(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm hopf-algebra) flin) + (declare + (type chcm-flin flin)) + (the FILTERED-hopf-algebra + (progn + (change-class chcm 'FILTERED-hopf-ALGEBRA) + (let* ((orgn (orgn chcm)) + (already (find orgn *flhopf-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-HOPF-ALGEBRA) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) + (push chcm *flhopf-list*) + chcm)))) (DEFCLASS FILTERED-SIMPLICIAL-SET (FILTERED-CHAIN-COMPLEX simplicial-set ) - ()) + ()) (DEFVAR *FLSMST-LIST* "The variable *FLSMST-LIST* is bound to a list of user created filtered simplicial sets") @@ -488,71 +454,67 @@ #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((flsmst filtered-simplicial-set) stream) - (the filtered-simplicial-set - (progn + (the filtered-simplicial-set + (progn (format stream "[K~D Filtered-Simplicial-Set]" (idnm flsmst)) - flsmst))) + flsmst))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN FltrSmSet (idnm) - (declare (type fixnum idnm)) - (the (or filtered-simplicial-set null) - (find idnm *flsmst-list* :key #'idnm))) + (declare (type fixnum idnm)) + (the (or filtered-simplicial-set null) + (find idnm *flsmst-list* :key #'idnm))) ;; Function that builds a filtered simplicial set (DEFUN BUILD-FltrSmSt (&key cmpr basis bspn face face* intr-bndr bndr-strt intr-dgnl dgnl-strt flin 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) - (type chcm-flin flin) - (list orgn)) - (the FILTERED-SIMPLICIAL-SET - (progn - (let ((already (find orgn *flsmst-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-SIMPLICIAL-SET) already)) - (when already - (return-from build-FltrSmst already))) - (let ((rslt (build-smst :cmpr cmpr :basis basis :bspn bspn - :face face :face* face* :intr-bndr intr-bndr - :bndr-strt bndr-strt :intr-dgnl intr-dgnl - :dgnl-strt dgnl-strt :orgn orgn))) - (declare (type simplicial-set rslt)) - (change-class rslt 'FILTERED-SIMPLICIAL-SET) - (setf (slot-value rslt 'flin) flin) - (push rslt *flsmst-list*) - rslt)))) + (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) + (type chcm-flin flin) + (list orgn)) + (the FILTERED-SIMPLICIAL-SET + (progn + (let ((already (find orgn *flsmst-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-SIMPLICIAL-SET) already)) + (when already + (return-from build-FltrSmst already))) + (let ((rslt (build-smst :cmpr cmpr :basis basis :bspn bspn + :face face :face* face* :intr-bndr intr-bndr + :bndr-strt bndr-strt :intr-dgnl intr-dgnl + :dgnl-strt dgnl-strt :orgn orgn))) + (declare (type simplicial-set rslt)) + (change-class rslt 'FILTERED-SIMPLICIAL-SET) + (setf (slot-value rslt 'flin) flin) + (push rslt *flsmst-list*) + rslt)))) -(defmethod change-chcm-to-flcc ((chcm simplicial-set) flin flin-orgn ) - (declare - (type chcm-flin flin) - ;;(list flin-orgn) -) - (the FILTERED-SIMPLICIAL-SET - (progn - (change-class chcm 'FILTERED-SIMPLICIAL-SET) -;; (setf orgn (append (orgn chcm) (list 'FILTERED-WITH) (list flin-orgn))) - (let* ( - (orgn (orgn chcm)) - (already (find orgn *flsmst-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-SIMPLICIAL-SET) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) - (push chcm *flsmst-list*) - chcm)))) +(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm simplicial-set) flin) + (declare + (type chcm-flin flin)) + (the FILTERED-SIMPLICIAL-SET + (progn + (change-class chcm 'FILTERED-SIMPLICIAL-SET) + (let* ((orgn (orgn chcm)) + (already (find orgn *flsmst-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-SIMPLICIAL-SET) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) + (push chcm *flsmst-list*) + chcm)))) (DEFCLASS FILTERED-KAN (FILTERED-CHAIN-COMPLEX KAN ) - ()) + ()) (DEFVAR *FLKAN-LIST* "The variable *FLKAN-LIST* is bound to a list of user created filtered Kan complexes") @@ -563,47 +525,43 @@ #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((flkan filtered-kan) stream) - (the filtered-kan - (progn + (the filtered-kan + (progn (format stream "[K~D Filtered-Kan-Simplicial-Set]" (idnm flkan)) - flkan))) + flkan))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN FltrKan (idnm) - (declare (type fixnum idnm)) - (the (or filtered-kan null) - (find idnm *flkan-list* :key #'idnm))) + (declare (type fixnum idnm)) + (the (or filtered-kan null) + (find idnm *flkan-list* :key #'idnm))) -(defmethod change-chcm-to-flcc ((chcm kan) flin flin-orgn ) - (declare - (type chcm-flin flin) - ;;(list flin-orgn) -) - (the FILTERED-KAN - (progn - (change-class chcm 'FILTERED-KAN) - ;; (setf orgn (append (orgn chcm) (list 'FILTERED-WITH) (list flin-orgn))) - (let* ( - (orgn (orgn chcm)) - (already (find orgn *flkan-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-KAN) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) - (push chcm *flkan-list*) - chcm)))) +(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm kan) flin) + (declare + (type chcm-flin flin)) + (the FILTERED-KAN + (progn + (change-class chcm 'FILTERED-KAN) + (let* ((orgn (orgn chcm)) + (already (find orgn *flkan-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-KAN) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) + (push chcm *flkan-list*) + chcm)))) (DEFCLASS FILTERED-SIMPLICIAL-GROUP (FILTERED-CHAIN-COMPLEX SIMPLICIAL-GROUP ) - ()) + ()) (DEFCLASS FILTERED-AB-SIMPLICIAL-GROUP (FILTERED-CHAIN-COMPLEX AB-SIMPLICIAL-GROUP ) - ()) + ()) (DEFVAR *FLSMGR-LIST* "The variable *FLSMGR-LIST* is bound to a list of user created filtered simplicial groups") - + (SETF *FLSMGR-LIST* +empty-list+) (PUSHNEW '*FLSMGR-LIST* *list-list*) @@ -616,99 +574,90 @@ #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) nil)) (DEFMETHOD PRINT-OBJECT ((flsmgr filtered-simplicial-group) stream) - (the filtered-simplicial-group - (progn + (the filtered-simplicial-group + (progn (format stream "[K~D Filtered-Simplicial-Group]" (idnm flsmgr)) flsmgr))) (DEFMETHOD PRINT-OBJECT ((flsmgr filtered-ab-simplicial-group) stream) - (the filtered-simplicial-group - (progn + (the filtered-simplicial-group + (progn (format stream "[K~D Filtered-Abelian-Simplicial-Group]" (idnm flsmgr)) - flsmgr))) + flsmgr))) #+clisp(eval-when (:compile-toplevel :load-toplevel :execute) (setf (ext:package-lock :clos) t)) (DEFUN FltrSmgr (idnm) - (declare (type fixnum idnm)) - (the (or filtered-simplicial-group null) - (find idnm *flsmgr-list* :key #'idnm))) + (declare (type fixnum idnm)) + (the (or filtered-simplicial-group null) + (find idnm *flsmgr-list* :key #'idnm))) (DEFUN BUILD-FltrSmGr (&key cmpr basis bspn face face* intr-bndr bndr-strt intr-dgnl dgnl-strt - sintr-grml sintr-grin flin 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) - (type sintr sintr-grml sintr-grin) - (type chcm-flin flin) - (list orgn)) - (the FILTERED-SIMPLICIAL-GROUP - (progn - (let ((already (find orgn *flsmgr-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-SIMPLICIAL-GROUP) already)) - (when already - (return-from build-FltrSmgr already))) - (let ((rslt (build-smgr :cmpr cmpr :basis basis :bspn bspn - :face face :face* face* :intr-bndr intr-bndr - :bndr-strt bndr-strt :intr-dgnl intr-dgnl - :dgnl-strt dgnl-strt :sintr-grml sintr-grml - :sintr-grin sintr-grin :orgn orgn))) - (declare (type simplicial-group rslt)) - (change-class rslt 'FILTERED-SIMPLICIAL-GROUP) - (setf (slot-value rslt 'flin) flin) - (push rslt *flsmgr-list*) - rslt)))) + sintr-grml sintr-grin flin 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) + (type sintr sintr-grml sintr-grin) + (type chcm-flin flin) + (list orgn)) + (the FILTERED-SIMPLICIAL-GROUP + (progn + (let ((already (find orgn *flsmgr-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-SIMPLICIAL-GROUP) already)) + (when already + (return-from build-FltrSmgr already))) + (let ((rslt (build-smgr :cmpr cmpr :basis basis :bspn bspn + :face face :face* face* :intr-bndr intr-bndr + :bndr-strt bndr-strt :intr-dgnl intr-dgnl + :dgnl-strt dgnl-strt :sintr-grml sintr-grml + :sintr-grin sintr-grin :orgn orgn))) + (declare (type simplicial-group rslt)) + (change-class rslt 'FILTERED-SIMPLICIAL-GROUP) + (setf (slot-value rslt 'flin) flin) + (push rslt *flsmgr-list*) + rslt)))) (DEFMACRO BUILD-FlABSMGR (&rest rest) `(change-class (build-flsmgr ,@rest) 'filtered-ab-simplicial-group)) -(defmethod change-chcm-to-flcc ((chcm simplicial-group) flin flin-orgn ) - (declare - - (type chcm-flin flin) - ;;(list flin-orgn) -) - (the FILTERED-SIMPLICIAL-GROUP - (progn - (change-class chcm 'FILTERED-SIMPLICIAL-GROUP) - ;; (setf orgn (append (orgn chcm) (list 'FILTERED-WITH) flin-orgn)) - (let* ( - (orgn (orgn chcm)) - (already (find orgn *flsmgr-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-SIMPLICIAL-GROUP) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) - (push chcm *flsmgr-list*) - chcm)))) +(defmethod CHANGE-CHCM-TO-FLCC ((chcm simplicial-group) flin) + (declare + (type chcm-flin flin)) + (the FILTERED-SIMPLICIAL-GROUP + (progn + (change-class chcm 'FILTERED-SIMPLICIAL-GROUP) + (let* ((orgn (orgn chcm)) + (already (find orgn *flsmgr-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-SIMPLICIAL-GROUP) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) + (push chcm *flsmgr-list*) + chcm)))) -(defmethod change-chcm-to-flcc ((chcm ab-simplicial-group) flin flin-orgn ) - (declare - - (type chcm-flin flin) - ;;(list flin-orgn) -) - (the FILTERED-AB-SIMPLICIAL-GROUP - (progn - (change-class chcm 'AB-FILTERED-SIMPLICIAL-GROUP) - ;; (setf orgn (append (orgn chcm) (list 'FILTERED-WITH) flin-orgn)) - (let* ( - (orgn (orgn chcm)) - (already (find orgn *flabsmgr-list* :key #'orgn :test #'equal))) - (declare (type (or null FILTERED-AB-SIMPLICIAL-GROUP) already)) - (when already - (return-from change-chcm-to-flcc already)) - (setf (slot-value chcm 'flin) flin) +(DEFMETHOD CHANGE-CHCM-TO-FLCC ((chcm ab-simplicial-group) flin) + (declare + (type chcm-flin flin)) + (the FILTERED-AB-SIMPLICIAL-GROUP + (progn + (change-class chcm 'AB-FILTERED-SIMPLICIAL-GROUP) + (let* ( + (orgn (orgn chcm)) + (already (find orgn *flabsmgr-list* :key #'orgn :test #'equal))) + (declare (type (or null FILTERED-AB-SIMPLICIAL-GROUP) already)) + (when already + (return-from change-chcm-to-flcc already)) + (setf (slot-value chcm 'flin) flin) (push chcm *flabsmgr-list*) - chcm)))) + chcm)))) + - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EXAMPLES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -718,16 +667,16 @@ ;; Filtration index function of a Bicomplex (first degree of a generator). (setf BCflin - #'(lambda (degr gnrt) - (declare - (type fixnum degr) - (type gnrt gnrt)) - (let* ((degr1 (BcGnrt-Degr1 gnrt)) - (degr2 (BcGnrt-Degr2 gnrt))) - (declare (type fixnum degr1 degr2)) - (if (= degr (+ degr1 degr2)) - degr1 - 0)))) + #'(lambda (degr gnrt) + (declare + (type fixnum degr) + (type gnrt gnrt)) + (let* ((degr1 (BcGnrt-Degr1 gnrt)) + (degr2 (BcGnrt-Degr2 gnrt))) + (declare (type fixnum degr1 degr2)) + (if (= degr (+ degr1 degr2)) + degr1 + 0)))) #| (funcall BCflin 5 (build-bcgnrt 2 3 'a)) @@ -737,32 +686,32 @@ ;; Function that changes the bicomplex bc to a filtered complex, with filtration ;; index of a generator defined as its first degree. (defun CHANGE-BICM-TO-FLCC (bc) - (declare - (type bicomplex bc)) - (let* ((flin BCflin)) - (declare - (type chcm-flin flin)) - (the FILTERED-CHAIN-COMPLEX - (change-chcm-to-flcc bc flin 'Bicomplex-Flin)))) + (declare + (type bicomplex bc)) + (let* ((flin BCflin)) + (declare + (type chcm-flin flin)) + (the FILTERED-CHAIN-COMPLEX + (change-chcm-to-flcc bc flin)))) #| (defun bas (degr1 degr2) - (if (and (= degr1 0) (= degr2 1)) (return-from bas '(a))) - (if (and (= degr1 1) (= degr2 0)) (return-from bas '(b))) - (if (and (= degr1 1) (= degr2 1)) (return-from bas '(c))) - (if (and (= degr1 2) (= degr2 0)) (return-from bas '(d))) - (return-from bas nil)) - + (if (and (= degr1 0) (= degr2 1)) (return-from bas '(a))) + (if (and (= degr1 1) (= degr2 0)) (return-from bas '(b))) + (if (and (= degr1 1) (= degr2 1)) (return-from bas '(c))) + (if (and (= degr1 2) (= degr2 0)) (return-from bas '(d))) + (return-from bas nil)) + (defun dif1 (degr1 degr2 gnrt) - (if (and (= degr1 1) (= degr2 1) (eql gnrt 'c)) (return-from dif1 (list (cons 2 'a)))) - (if (and (= degr1 2) (= degr2 0) (eql gnrt 'd)) (return-from dif1 (list (cons 2 'b)))) - (return-from dif1 nil)) + (if (and (= degr1 1) (= degr2 1) (eql gnrt 'c)) (return-from dif1 (list (cons 2 'a)))) + (if (and (= degr1 2) (= degr2 0) (eql gnrt 'd)) (return-from dif1 (list (cons 2 'b)))) + (return-from dif1 nil)) (defun dif2 (degr1 degr2 gnrt) - (if (and (= degr1 1) (= degr2 1) (eql gnrt 'c)) (return-from dif2 (list (cons 1 'b)))) - (return-from dif2 nil)) + (if (and (= degr1 1) (= degr2 1) (eql gnrt 'c)) (return-from dif2 (list (cons 1 'b)))) + (return-from dif2 nil)) (setf bc (Build-Bicm :bcbasis #'bas :dffr1 #'dif1 :dffr2 #'dif2 :cmpr 's-cmpr - :orgn '(BC-test))) + :orgn '(BC-test))) (change-bicm-to-flcc bc) (flin bc 1 (build-bcgnrt 0 1 'a)) @@ -780,40 +729,40 @@ ;; BARS (defun abar-bidegree (abar) - (declare (type abar abar)) - (the list - (let ((p (1- (length abar))) - (q 0)) - (declare (type fixnum p q)) - (setf q (apply #'+ (mapcar #'car (rest abar)))) - (decf q p) - (return-from abar-bidegree (list p q))))) + (declare (type abar abar)) + (the list + (let ((p (1- (length abar))) + (q 0)) + (declare (type fixnum p q)) + (setf q (apply #'+ (mapcar #'car (rest abar)))) + (decf q p) + (return-from abar-bidegree (list p q))))) (DEFVAR abar-flin) (setf abar-flin - #'(lambda (degr abar) - (declare (type fixnum degr) - (type abar abar)) - (let* ((abar-bidgr (abar-bidegree abar)) - (degr1 (first abar-bidgr)) + #'(lambda (degr abar) + (declare (type fixnum degr) + (type abar abar)) + (let* ((abar-bidgr (abar-bidegree abar)) + (degr1 (first abar-bidgr)) (degr2 (second abar-bidgr))) - (if (= degr (+ degr1 degr2)) - degr1 + (if (= degr (+ degr1 degr2)) + degr1 0)))) #| (setq kz2 (k-z2-1)) (setq bar2 (bar kz2)) -(change-chcm-to-flcc bar2 abar-flin 'abar-flin) +(change-chcm-to-flcc bar2 abar-flin) (setf basis7 (basis bar2 7)) (mapcar - #'(lambda (gnrt) - (flin bar2 7 gnrt)) - basis7) + #'(lambda (gnrt) + (flin bar2 7 gnrt)) + basis7) (flin bar2 (cmbn 7 (first basis7) (second basis7))) @@ -828,18 +777,18 @@ ;; COBAR (defun allp-bidegree (allp) - (declare (type allp allp)) - (the list - (let ((p (1- (length allp))) - (q 0)) - (declare (type fixnum p q)) - (setf q (apply #'+ (mapcar #'car (rest allp)))) - (incf q p) - (return-from allp-bidegree (list (- p) q))))) + (declare (type allp allp)) + (the list + (let ((p (1- (length allp))) + (q 0)) + (declare (type fixnum p q)) + (setf q (apply #'+ (mapcar #'car (rest allp)))) + (incf q p) + (return-from allp-bidegree (list (- p) q))))) (DEFVAR cobar-flin) (setf cobar-flin - #'(lambda (degr allp) + #'(lambda (degr allp) (declare (ignore degr) (type allp allp)) (with-allp (l) allp @@ -852,28 +801,28 @@ (DEFVAR tnpr-flin) (setf tnpr-flin - #'(lambda (degr tnpr) - (declare - (ignore degr) - (type tnpr tnpr)) - (the fixnum - (degr1 tnpr)))) + #'(lambda (degr tnpr) + (declare + (ignore degr) + (type tnpr tnpr)) + (the fixnum + (degr1 tnpr)))) ;; FIBRATIONS (CARTESIAN PRODUCTS AND TWISTED PRODUCTS) (DEFVAR crpr-flin) (setf crpr-flin - #'(lambda (degr crpr) - (declare - (type fixnum degr) - (type crpr crpr)) - (let* ((b (cadr crpr)) - (dgop (car b))) - (declare - (type iabsm b) - (type fixnum dgop)) - (the fixnum - (- degr (length (dgop-int-ext dgop))))))) + #'(lambda (degr crpr) + (declare + (type fixnum degr) + (type crpr crpr)) + (let* ((b (cadr crpr)) + (dgop (car b))) + (declare + (type iabsm b) + (type fixnum dgop)) + (the fixnum + (- degr (length (dgop-int-ext dgop))))))) #| (funcall fbrt-flin 3 '(:crpr (1 . s2) 0 . 3)) @@ -884,17 +833,17 @@ ;; BICONES -(defun bicone-flin (flinb flinc flind) - (declare (type chcm-flin flinb flinc flind)) - (flet ((rslt (degr bicn) - (declare - (type bicn bicn) - (type degr degr)) - (let ((bcnx (bcnx bicn))) - (declare (type (member :bcnb :bcnc :bcnd) bcnx)) - (if (eql :bcnb bcnx) - (funcall flinb degr (ibicn bicn)) - (if (eql :bcnc bcnx) - (funcall flinc degr (ibicn bicn)) +(DEFUN BICONE-FLIN (flinb flinc flind) + (declare (type chcm-flin flinb flinc flind)) + (flet ((rslt (degr bicn) + (declare + (type bicn bicn) + (type degr degr)) + (let ((bcnx (bcnx bicn))) + (declare (type (member :bcnb :bcnc :bcnd) bcnx)) + (if (eql :bcnb bcnx) + (funcall flinb degr (ibicn bicn)) + (if (eql :bcnc bcnx) + (funcall flinc degr (ibicn bicn)) (funcall flind degr (ibicn bicn))))))) - (the chcm-flin #'rslt))) + (the chcm-flin #'rslt))) diff --git a/src/anromero/persistent-homology.lisp b/src/anromero/persistent-homology.lisp index 7296199..ad4f40b 100644 --- a/src/anromero/persistent-homology.lisp +++ b/src/anromero/persistent-homology.lisp @@ -479,7 +479,7 @@ rslt))) -(setf triangle (change-chcm-to-flcc triangle triangle-flin 'triangle-flin)) +(setf triangle (change-chcm-to-flcc triangle triangle-flin)) (dotimes (p 8) diff --git a/src/anromero/spectral-sequences.lisp b/src/anromero/spectral-sequences.lisp index 219bb65..f7ba8ec 100644 --- a/src/anromero/spectral-sequences.lisp +++ b/src/anromero/spectral-sequences.lisp @@ -396,7 +396,7 @@ (cat-init) (setq kz2 (k-z2-1)) (setq fcc (bar kz2)) -(Change-Chcm-TO-Flcc fcc abar-flin `(abar-flin)) +(Change-Chcm-TO-Flcc fcc abar-flin) (fltr-chcm-z-mtrx fcc 2 3 2) (fltr-chcm-z-mtrx fcc 1 2 4) |# @@ -1141,11 +1141,11 @@ (setq k3 (k-z2 3)) (Setq hmtp-eq3 (efhm k3)) (setq ek3 (rbcc hmtp-eq3)) -(change-chcm-to-flcc ek3 :flin abar-flin :orgn `(filtered-chain-complex ,ek3)) +(change-chcm-to-flcc ek3 abar-flin) (setf k3-flin #'(lambda (degr gnrt) (flin ek3 (rf hmtp-eq3 (lg hmtp-eq3 degr gnrt))))) -(change-chcm-to-flcc k3 :flin k3-flin :orgn `(filtered-chain-complex ,k3)) +(change-chcm-to-flcc k3 k3-flin) (hmtp-eq-fltr-order hmtp-eq3 3) (hmtp-eq-fltr-order hmtp-eq3 5) |# @@ -1162,7 +1162,7 @@ (Change-Chcm-TO-Flcc eff-chcm #'(lambda (degr gnrt) (flin fltrcm (lf hmtp-eq (rg hmtp-eq degr gnrt)))) - (orgn eff-chcm)))) + ))) @@ -1235,8 +1235,7 @@ (eff-chcm (rbcc hmtp-eq))) (declare (type homotopy-equivalence hmtp-eq) - (type chain-complex eff-chcm) - ) + (type chain-complex eff-chcm)) (progn (if (not (typep eff-chcm 'filtered-chain-complex)) (translate-filtration hmtp-eq)) @@ -1617,8 +1616,8 @@ (declare (type simplicial-set fltrcm) (type chain-complex ecc)) (progn - (change-chcm-to-flcc fltrcm crpr-flin 'crpr-flin) - (change-chcm-to-flcc ecc tnpr-flin 'tnpr-flin) + (change-chcm-to-flcc fltrcm crpr-flin) + (change-chcm-to-flcc ecc tnpr-flin) (the spectral-sequence (build-ss fltrcm `(Serre-Spectral-Sequence ,f)))))) @@ -1629,8 +1628,8 @@ (let ((ecc (rbcc (efhm x)))) (declare (type chain-complex ecc)) (progn - (change-chcm-to-flcc x crpr-flin 'crpr-flin) - (change-chcm-to-flcc ecc tnpr-flin 'tnpr-flin) + (change-chcm-to-flcc x crpr-flin) + (change-chcm-to-flcc ecc tnpr-flin) (the spectral-sequence (build-ss x `(Serre-Spectral-Sequence ,x)))))) @@ -1661,7 +1660,7 @@ (type simplicial-set ox) (type chain-complex ecc)) (progn - (change-chcm-to-flcc ecc cobar-flin 'cobar-flin) + (change-chcm-to-flcc ecc cobar-flin) (the spectral-sequence (build-ss ecc `(Eilenberg-Moore-Spectral-Sequence ,x)))))) From c8e2bb4c038a839aec8eab407428bb0ee9bcbda1 Mon Sep 17 00:00:00 2001 From: Miguel Marco Date: Wed, 18 Sep 2019 17:27:30 +0200 Subject: [PATCH 2/2] Remove src/kenzo.fas file from git repo --- src/kenzo.fas | Bin 63208 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 src/kenzo.fas diff --git a/src/kenzo.fas b/src/kenzo.fas deleted file mode 100755 index 749c853c1d80f2d4698967789f963800174a56e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63208 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