;;; 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 (IN-PACKAGE #:cat) (PROVIDE "special-smsts") ;;; GMSM-FACES-INFO = (gmsm (simple-vector absm) . bndr) ;;; faces (DEFUN FINITE-SS-PRE-TABLE (list) (declare (list list)) (the list (let ((pre-rslt +empty-list+) (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~@ 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)))) (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." (caar inter)))))) pre-rslt))) (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+))) (declare (fixnum maxdim) (simple-vector table)) (dolist (item pre-table) (declare (list item)) (setf (svref table (first item)) (sort (rest item) #'string< :key #'first))) table)) (DEFUN FINITE-SS-FIND-GMSM (table gmsm dmns &optional (max-dmns (1+ dmns))) (declare (type gmsm gmsm) (fixnum dmns max-dmns)) (do ((dmns dmns (1+ dmns))) ((>= dmns max-dmns) nil) (declare (fixnum dmns)) (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))))) (DEFUN FINITE-SS-FINISH-TABLE (table bspn) (declare (simple-vector table)) (dotimes (dmns (length table)) (declare (fixnum dmns)) (finite-ss-finish-line table dmns bspn)) table) (DEFUN FINITE-SS-FINISH-LINE (table dmns bspn) (declare (simple-vector table) (fixnum dmns)) (setf (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) (declare (simple-vector table) (list entry) (fixnum dmns) (symbol bspn)) (let ((simplex (first 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+))) (setf faces (nconc faces (make-list (1+ (- dmns (length faces))) :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))))) (DEFUN R-PROJ-SPACE-FACE (k) (declare (fixnum k)) (flet ((rslt (indx dmns gmsm) (declare (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))))))) (the face #'rslt))) (DEFUN R-PROJ-SPACE-INTR-BNDR (k) (declare (fixnum k)) (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))))))) (the intr-mrph #'rslt))) (DEFUN R-PROJ-SPACE (&optional (l :infinity) (k 1)) (declare (fixnum k) (type (or fixnum (eql :infinity)))) (assert (and (typep k 'fixnum) (plusp k) (or (eq l :infinity) (and (typep l 'fixnum) (<= 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)))) ;;; Constructing a small simplicial subset ;;; from a combination of simplices. (DEFUN CMBN-GMSMS (cmbn) (declare (type cmbn cmbn)) (the list ;; Returns a list made of: ;; the degree of the combination; ;; the list of simplex generators of the combinations. (cons (cmbn-degr cmbn) (mapcar #'cdr (cmbn-list cmbn))))) (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 (eq (cmpr smst gmsm1 gmsm2) :equal))))) (declare (type simplicial-set smst) (type (or cmbn list) gmsms) (fixnum dmns) (type (function (gmsm gmsm) boolean) cmpr=)) (when (typep gmsms 'cmbn) (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))))))))