;;;; -*- coding:utf-8 -*-
;;;;****************************************************************************
;;;;FILE: graph-dot.lisp
;;;;LANGUAGE: Common-Lisp
;;;;SYSTEM: Common-Lisp
;;;;USER-INTERFACE: NONE
;;;;DESCRIPTION
;;;;
;;;; Generate dot files from graphs (graph-class). incomplete
;;;;
;;;;BANNER
;;;;
;;;; // MEN AT WORK // MEN AT WORK // MEN AT WORK // MEN AT WORK
;;;; / MEN AT WORK // MEN AT WORK // MEN AT WORK // MEN AT WORK /
;;;; MEN AT WORK // MEN AT WORK // MEN AT WORK // MEN AT WORK //
;;;; MEN AT WORK // MEN AT WORK // MEN AT WORK // MEN AT WORK //
;;;;
;;;;AUTHORS
;;;; Pascal J. Bourguignon
;;;;MODIFICATIONS
;;;; 2004-08-06 Added defgeneric.
;;;; 2003-05-16 Converted from emacs lisp.
;;;; 2003-05-14 Extracted from pjb-cvs.
;;;; 2003-01-09 Added DEFPACKAGE.
;;;; 1996-10-25 Updated to CLISP.
;;;; 1994-04-09 Creation.
;;;;BUGS
;;;;LEGAL
;;;; GPL
;;;;
;;;; Copyright Pascal J. Bourguignon 2003 - 2003
;;;; mailto:pjb@informatimago.com
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version
;;;; 2 of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be
;;;; useful, but WITHOUT ANY WARRANTY; without even the implied
;;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
;;;; PURPOSE. See the GNU General Public License for more details.
;;;;
;;;; You should have received a COPY of the GNU General Public
;;;; License along with this program; if not, write to the Free
;;;; Software Foundation, Inc., 59 Temple Place, Suite 330,
;;;; Boston, MA 02111-1307 USA
;;;;****************************************************************************
(IN-PACKAGE "COMMON-LISP-USER")
(DEFPACKAGE "COM.INFORMATIMAGO.COMMON-LISP.GRAPH-DIAGRAM"
(:USE "COM.INFORMATIMAGO.COMMON-LISP.GRAPH"
"COM.INFORMATIMAGO.COMMON-LISP.LIST" "COMMON-LISP")
(:EXPORT "GENERATE-DOT")
(:DOCUMENTATION
"This package exports methods for GRAPH to generate dot(1) files.
Copyright Pascal J. Bourguignon 2003 - 2003
This package is provided under the GNU General Public License.
See the source file for details."))
(IN-PACKAGE "COM.INFORMATIMAGO.COMMON-LISP.GRAPH-DIAGRAM")
;; egrep -e '^[(]DEFUN|^[(]DEFMETHOD|^[(]DEFCLASS' pjb-graph.lisp | sed -e 's/\((DEFUN\|(DEFMETHOD\|(DEFCLASS\)/;;/' | sort
;; ADD-EDGE ((SELF GRAF) E)
;; ADD-EDGES ((SELF GRAF) LE)
;; ADD-NODE ((SELF GRAF) N)
;; ADD-NODES ((SELF GRAF) LN)
;; AND-L (L)
;; CONTAINS-EDGE? ((SELF GRAF) E)
;; CONTAINS-NODE? ((SELF GRAF) N)
;; DISPLAY-GAMMAS ((SELF GRAF))
;; DISPLAY-GAMMAS-INV ((SELF GRAF))
;; EDGES ((SELF GRAF))
;; EDGES-NEXT-NODES (LE N)
;; EDGES-PREV-NODES (LE N)
;; EDGES-REMOVE-NODE (LE N)
;; EDGES-REMOVE-NODES (LE LN)
;; EDGES-REVERSE (LE)
;; EMPTY ((SELF GRAF))
;; EQUAL? ((SELF GRAF) OTHER-GRAF)
;; FIND-ONLIFBE (LI E)
;; FOLLOW ((SELF GRAF) N)
;; GAMMA-INV-OF-NODE ((SELF GRAF) N)
;; GAMMA-OF-NODE ((SELF GRAF) N)
;; GAMMAS ((SELF GRAF))
;; GAMMAS-INV ((SELF GRAF))
;; GRAF ()
;; GRAF-ADD-EDGE (G E)
;; GRAF-ADD-EDGES (G LE)
;; GRAF-ADD-NODE (G N)
;; GRAF-ADD-NODES (G LN)
;; GRAF-BUILD-ORDERED-NODE-LIST (G)
;; GRAF-BUILD-ORDERED-NODE-LIST (G)
;; GRAF-BUILD-ORDERED-NODE-LIST-STEP (G L)
;; GRAF-BUILD-ORDERED-NODE-LIST-STEP (G L)
;; GRAF-CONNECTED-CLASSES (G)
;; GRAF-CONTAINS-EDGE? (G E)
;; GRAF-CONTAINS-NODE? (G N)
;; GRAF-DIAGRAM (G OUT NODE-NAME)
;; GRAF-DIAGRAM-GENERATE-EDGES (OUT LEIJ N)
;; GRAF-DIAGRAM-GENERATE-LINE (OUT N L FROM TO VERTICES)
;; GRAF-DIAGRAM-GENERATE-NODE (OUT N L X Y SX SY NODE)
;; GRAF-DIAGRAM-GENERATE-VERTEX (OUT N L X Y)
;; GRAF-DISPLAY-GAMMAS (G)
;; GRAF-DISPLAY-GAMMAS-INV (G)
;; GRAF-EDGES (G)
;; GRAF-EMPTY ()
;; GRAF-EQUAL? (G1 G2)
;; GRAF-FOLLOW (G N)
;; GRAF-FOLLOW-L (G LN)
;; GRAF-GAMMA (G N)
;; GRAF-GAMMA-CLOSURE (G N)
;; GRAF-GAMMA-INV (G N)
;; GRAF-GAMMA-INV-CLOSURE (G N)
;; GRAF-GAMMAS (G)
;; GRAF-GAMMAS-INV (G)
;; GRAF-INITIAL-NODES (G)
;; GRAF-INITIAL-TOKENS (G)
;; GRAF-INTERSECTION (G1 G2)
;; GRAF-MAKE-REFLEXIVE (G)
;; GRAF-MAKE-SYMETRIC (G)
;; GRAF-MAKE-TREE (G ROOT)
;; GRAF-MINIMIZE-CROSSES (G)
;; GRAF-MINIMIZE-CROSSES-COUNT-CROSSES (G NV) ; private
;; GRAF-MINIMIZE-CROSSES-SEARCH-SWAP (G NV NC CC SCC) ; private
;; GRAF-NODES (G)
;; GRAF-ONL-ADD-INDICES-IJ (LL I J N)
;; GRAF-ONLIF-BUILD-EDGES (G LI N)
;; GRAF-ONLIF-BUILD-EDGES-CURRENT (G LI CLI N)
;; GRAF-ONLIFBE-REPLACE (LI LE N)
;; GRAF-PARTIAL? (G1 G2)
;; GRAF-PRECEDE (G N)
;; GRAF-PRECEDE-L (G LN)
;; GRAF-REFLEXIVE? (G)
;; GRAF-REMOVE-EDGE (G E)
;; GRAF-REMOVE-EDGES (G LE)
;; GRAF-REMOVE-NODE (G N)
;; GRAF-REMOVE-NODES (G LN)
;; GRAF-REPLACE-NODE (G ON NN)
;; GRAF-REVERSE-EDGES (G)
;; GRAF-SUBSET? (G1 G2)
;; GRAF-SUMMARY ()
;; GRAF-SYMETRIC (G)
;; GRAF-SYMETRIC? (G)
;; GRAF-TERMINAL-NODES (G)
;; GRAF-TERMINAL-TOKENS (G)
;; GRAF-UNION (G1 G2)
;; INITIAL-NODES ((SELF GRAF))
;; INITIAL-TOKENS ((SELF GRAF))
;; IS-PARTIAL-OF? ((SELF GRAF) OTHER-GRAF)
;; IS-REFLEXIVE? ((SELF GRAF))
;; IS-SUBSET-OF? ((SELF GRAF) OTHER-GRAF)
;; IS-SYMETRIC? ((SELF GRAF))
;; LPRINT (L)
;; MAKE-INTERSECTION ((SELF GRAF) OTHER-GRAF)
;; MAKE-REFLEXIVE ((SELF GRAF))
;; MAKE-SYMETRIC ((SELF GRAF))
;; MAKE-TREE ((SELF GRAF) ROOT)
;; MAKE-UNION ((SELF GRAF) OTHER-GRAF)
;; MINIMIZE-CROSSES ((SELF GRAF))
;; NODE-POS-X (N)
;; NODE-POS-Y (N)
;; NODE-SIZE-X (N)
;; NODE-SIZE-Y (N)
;; NODES ((SELF GRAF))
;; PRECEDE ((SELF GRAF) N)
;; REMOVE-EDGE ((SELF GRAF) E)
;; REMOVE-EDGES ((SELF GRAF) LE)
;; REMOVE-NODE ((SELF GRAF) N)
;; REMOVE-NODES ((SELF GRAF) N)
;; REVERSE-EDGES ((SELF GRAF))
;; SET-CONTAINS? (S E)
;; SET-DIFF (S1 S2)
;; SET-EQUAL? (S1 S2)
;; SET-INTERSECTION (S1 S2)
;; SET-MEMBER (S LS)
;; SET-REMOVE (S E)
;; SET-SUBSET? (S1 S2)
;; SET-UNION (S1 S2)
;; SET-UNION-L (LS)
;; SET-UNIQUE-L (LS)
;; SYMETRIC ((SELF GRAF))
;; TERMINAL-NODES ((SELF GRAF))
;; TERMINAL-TOKENS ((SELF GRAF))
;; (insert-generics (get-generics-from-methods-of-file "graph.lisp" :all))
(DEFGENERIC MAKE-TREE (SELF ROOT))
(DEFGENERIC MAKE-UNION (SELF OTHER-GRAF))
(DEFGENERIC MAKE-INTERSECTION (SELF OTHER-GRAF))
(DEFGENERIC TERMINAL-TOKENS (SELF))
(DEFGENERIC INITIAL-TOKENS (SELF))
(DEFGENERIC TERMINAL-NODES (SELF))
(DEFGENERIC INITIAL-NODES (SELF))
(DEFGENERIC FOLLOW (SELF N))
(DEFGENERIC PRECEDE (SELF N))
(DEFGENERIC DISPLAY-GAMMAS-INV (SELF))
(DEFGENERIC DISPLAY-GAMMAS (SELF))
(DEFGENERIC GAMMAS-INV (SELF))
(DEFGENERIC GAMMAS (SELF))
(DEFGENERIC GAMMA-INV-OF-NODE (SELF N))
(DEFGENERIC GAMMA-OF-NODE (SELF N))
(DEFGENERIC MINIMIZE-CROSSES (SELF))
(DEFGENERIC IS-SUBSET-OF\? (SELF OTHER-GRAF))
(DEFGENERIC IS-PARTIAL-OF\? (SELF OTHER-GRAF))
(DEFGENERIC EQUAL\? (SELF OTHER-GRAF))
(DEFGENERIC MAKE-REFLEXIVE (SELF))
(DEFGENERIC IS-REFLEXIVE\? (SELF))
(DEFGENERIC MAKE-SYMETRIC (SELF))
(DEFGENERIC SYMETRIC (SELF))
(DEFGENERIC IS-SYMETRIC\? (SELF))
(DEFGENERIC REVERSE-EDGES (SELF))
(DEFGENERIC CONTAINS-EDGE\? (SELF E))
(DEFGENERIC ADD-EDGES (SELF LE))
(DEFGENERIC CONTAINS-NODE\? (SELF N))
(DEFGENERIC EMPTY (SELF))
;;----------------------------------------------------------------------
(DEFUN SET-CONTAINS? (S E)
(COND
((NULL S) NIL)
((EQUALP (CAR S) E) T)
(T (SET-CONTAINS? (CDR S) E)))) ;;SET-CONTAINS?
(DEFUN SET-SUBSET? (S1 S2)
(COND
((NULL S1) T)
((SET-CONTAINS? S2 (CAR S1)) (SET-SUBSET? (CDR S1) S2)))) ;;SET-SUBSET?
(DEFUN SET-EQUAL? (S1 S2)
(AND (SET-SUBSET? S1 S2) (SET-SUBSET? S2 S1))) ;;SET-EQUAL?
(DEFUN SET-REMOVE (S E)
(COND
((NULL S) S)
((EQUALP (CAR S) E) (CDR S)) ; e is unique in a set
(T (CONS (CAR S) (SET-REMOVE (CDR S) E))))) ;;SET-REMOVE
;; ls = list of set '((a b c) (c d e) (f i)) --> '(a b c d e f i)
(DEFUN SET-UNION-L (LS)
(COND
((NULL LS) LS)
((NULL (CDR LS)) (CAR LS))
(T (SET-UNION-L (CONS (SET-UNION (CAR LS) (CADR LS)) (CDDR LS)))))) ;;SET-UNION-L
(DEFUN SET-UNION (S1 S2)
(IF (NULL S2)
S1
(IF (SET-CONTAINS? S1 (CAR S2))
(SET-UNION S1 (CDR S2))
(SET-UNION (CONS (CAR S2) S1) (CDR S2))))) ;;SET-UNION
(DEFUN SET-DIFF (S1 S2)
(IF (NULL S1)
S1
(IF (SET-CONTAINS? S2 (CAR S1))
(SET-DIFF (CDR S1) S2)
(CONS (CAR S1) (SET-DIFF (CDR S1) S2))))) ;;SET-DIFF
(DEFUN SET-INTERSECTION (S1 S2)
(IF (NULL S1)
S1
(IF (SET-CONTAINS? S2 (CAR S1))
(CONS (CAR S1) (SET-INTERSECTION (CDR S1) S2))
(SET-INTERSECTION (CDR S1) S2)))) ;;SET-INTERSECTION
(DEFUN SET-MEMBER (S LS)
(IF (NULL LS)
NIL
(IF (SET-EQUAL? S (CAR LS))
T
(SET-MEMBER S (CDR LS))))) ;;SET-MEMBER
(DEFUN SET-UNIQUE-L (LS)
(IF (NULL LS)
NIL
(IF (SET-MEMBER (CAR LS) (CDR LS))
(SET-UNIQUE-L (CDR LS))
(CONS (CAR LS) (SET-UNIQUE-L (CDR LS)))))) ;;SET-UNIQUE-L
(DEFUN GRAF-EMPTY ()
'(())) ;;GRAF-EMPTY
(DEFUN GRAF-NODES (G)
(CAR G)) ;;GRAF-NODES
(DEFUN GRAF-CONTAINS-NODE? (G N)
(SET-CONTAINS? (GRAF-NODES G) N)) ;;GRAF-CONTAINS-NODE?
(DEFUN GRAF-ADD-NODE (G N)
(IF (SET-CONTAINS? (GRAF-NODES G) N)
G
(CONS (CONS N (GRAF-NODES G)) (GRAF-EDGES G)))) ;;GRAF-ADD-NODE
(DEFUN GRAF-ADD-NODES (G LN)
(IF (NULL LN) G (GRAF-ADD-NODES (GRAF-ADD-NODE G (CAR LN)) (CDR LN)))) ;;GRAF-ADD-NODES
(DEFUN GRAF-REMOVE-NODE (G N)
(CONS (SET-REMOVE (GRAF-NODES G) N) (EDGES-REMOVE-NODE (GRAF-EDGES G) N))) ;;GRAF-REMOVE-NODE
(DEFUN GRAF-REMOVE-NODES (G LN)
(CONS (SET-DIFF (GRAF-NODES G) LN)
(EDGES-REMOVE-NODES (GRAF-EDGES G) LN))) ;;GRAF-REMOVE-NODES
(DEFUN GRAF-EDGES (G)
(CDR G)) ;;GRAF-EDGES
(DEFUN GRAF-CONTAINS-EDGE? (G E)
(SET-CONTAINS? (GRAF-EDGES G) E)) ;;GRAF-CONTAINS-EDGE?
(DEFUN GRAF-ADD-EDGE (G E)
(IF (AND (CONSP E) (NULL (CDDR E))
(GRAF-CONTAINS-NODE? G (CAR E)) (GRAF-CONTAINS-NODE? G (CADR E))
(NOT (GRAF-CONTAINS-EDGE? G E)))
(CONS (GRAF-NODES G) (CONS E (GRAF-EDGES G)))
G)) ;;GRAF-ADD-EDGE
(DEFUN GRAF-ADD-EDGES (G LE)
(IF (NULL LE) G (GRAF-ADD-EDGES (GRAF-ADD-EDGE G (CAR LE)) (CDR LE)))) ;;GRAF-ADD-EDGES
(DEFUN GRAF-REMOVE-EDGES (G LE)
(CONS (GRAF-NODES G) (SET-DIFF (GRAF-EDGES G) LE))) ;;GRAF-REMOVE-EDGES
(DEFUN GRAF-REMOVE-EDGE (G E)
(GRAF-REMOVE-EDGES G (LIST E))) ;;GRAF-REMOVE-EDGE
(DEFUN EDGES-REMOVE-NODE (LE N)
(COND
((NULL LE) LE)
((OR (EQUALP (CAAR LE) N) (EQUALP (CADAR LE) N))
(EDGES-REMOVE-NODE (CDR LE) N))
(T (CONS (CAR LE) (EDGES-REMOVE-NODE (CDR LE) N))))) ;;EDGES-REMOVE-NODE
(DEFUN EDGES-REMOVE-NODES (LE LN)
(IF (NULL LN)
LE
(EDGES-REMOVE-NODES (EDGES-REMOVE-NODE LE (CAR LN)) (CDR LN)))) ;;EDGES-REMOVE-NODES
(DEFUN GRAF-EQUAL? (G1 G2)
(AND (SET-EQUAL? (GRAF-NODES G1) (GRAF-NODES G2))
(SET-EQUAL? (GRAF-EDGES G1) (GRAF-EDGES G2)))) ;;GRAF-EQUAL?
(DEFUN GRAF-PARTIAL? (G1 G2)
(AND (SET-EQUAL? (GRAF-NODES G1) (GRAF-NODES G2))
(SET-SUBSET? (GRAF-EDGES G1) (GRAF-EDGES G2)))) ;;GRAF-PARTIAL?
(DEFUN GRAF-SUBSET? (G1 G2)
(AND (SET-SUBSET? (GRAF-NODES G1) (GRAF-NODES G2))
(SET-SUBSET? (GRAF-EDGES G1) (GRAF-EDGES G2)))) ;;GRAF-SUBSET?
(DEFUN GRAF-UNION (G1 G2)
(CONS (SET-UNION (GRAF-NODES G1) (GRAF-NODES G2))
(SET-UNION (GRAF-EDGES G1) (GRAF-EDGES G2)))) ;;GRAF-UNION
(DEFUN GRAF-INTERSECTION (G1 G2)
(LET ((NODES (SET-INTERSECTION (GRAF-NODES G1) (GRAF-NODES G2))))
(CONS NODES
(EDGES-REMOVE-NODES
(SET-INTERSECTION (GRAF-EDGES G1) (GRAF-EDGES G2))
(SET-DIFF
(SET-UNION (GRAF-NODES G1) (GRAF-NODES G2)) NODES))))) ;;GRAF-INTERSECTION
(DEFUN EDGES-NEXT-NODES (LE N)
(COND
((NULL LE) LE)
((EQUALP (CAAR LE) N) (CONS (CAR LE) (EDGES-NEXT-NODES (CDR LE) N)))
(T (EDGES-NEXT-NODES (CDR LE) N)))) ;;EDGES-NEXT-NODES
(DEFUN EDGES-PREV-NODES (LE N)
(COND
((NULL LE) LE)
((EQUALP (CADAR LE) N) (CONS (CAR LE) (EDGES-PREV-NODES (CDR LE) N)))
(T (EDGES-PREV-NODES (CDR LE) N)))) ;;EDGES-PREV-NODES
(DEFUN GRAF-GAMMA (G N)
(EDGES-NEXT-NODES (GRAF-EDGES G) N)) ;;GRAF-GAMMA
(DEFUN GRAF-GAMMA-INV (G N)
(EDGES-PREV-NODES (GRAF-EDGES G) N)) ;;GRAF-GAMMA-INV
(DEFUN GRAF-GAMMA-CLOSURE (G N)
(LET* ( (PREV-CLOSURE '())
(NEW-CLOSURE (LIST N))
(NEXT (GRAF-FOLLOW-L G NEW-CLOSURE)))
(LOOP WHILE (NOT (SET-EQUAL? PREV-CLOSURE NEW-CLOSURE)) DO
(SETQ PREV-CLOSURE NEW-CLOSURE)
(SETQ NEW-CLOSURE (SET-UNION NEW-CLOSURE NEXT))
(SETQ NEXT (GRAF-FOLLOW-L G NEW-CLOSURE))
)
NEW-CLOSURE)) ;;GRAF-GAMMA-CLOSURE
(DEFUN GRAF-GAMMA-INV-CLOSURE (G N)
(LET* ( (PREV-CLOSURE '())
(NEW-CLOSURE (LIST N))
(NEXT (GRAF-PRECEDE-L G NEW-CLOSURE)))
(LOOP WHILE (NOT (SET-EQUAL? PREV-CLOSURE NEW-CLOSURE)) DO
(SETQ PREV-CLOSURE NEW-CLOSURE)
(SETQ NEW-CLOSURE (SET-UNION NEW-CLOSURE NEXT))
(SETQ NEXT (GRAF-PRECEDE-L G NEW-CLOSURE))
)
NEW-CLOSURE)) ;;GRAF-GAMMA-INV-CLOSURE
(DEFUN GRAF-CONNECTED-CLASSES (G)
(SET-UNIQUE-L
(MAPCAR (LAMBDA (X)
(SET-INTERSECTION
(GRAF-GAMMA-INV-CLOSURE G X)
(GRAF-GAMMA-CLOSURE G X)))
(GRAF-NODES G)))) ;;GRAF-CONNECTED-CLASSES
(DEFUN GRAF-GAMMAS (G)
(MAPCAR 'GRAF-GAMMA
(MAKE-LIST (LENGTH (GRAF-NODES G)) :INITIAL-ELEMENT G)
(GRAF-NODES G))) ;;GRAF-GAMMAS
(DEFUN GRAF-GAMMAS-INV (G)
(MAPCAR 'GRAF-GAMMA-INV
(MAKE-LIST (LENGTH (GRAF-NODES G)) :INITIAL-ELEMENT G)
(GRAF-NODES G))) ;;GRAF-GAMMAS-INV
(DEFUN GRAF-DISPLAY-GAMMAS (G)
(MAPCAR (LAMBDA (N)
(FORMAT T "~a -> ~a ~%" N (MAPCAR 'CADR (GRAF-GAMMA G N))))
(GRAF-NODES G))) ;;GRAF-DISPLAY-GAMMAS
(DEFUN GRAF-DISPLAY-GAMMAS-INV (G)
(MAPCAR (LAMBDA (N)
(FORMAT T "~a <- ~a ~%" N (MAPCAR 'CAR (GRAF-GAMMA-INV G N))))
(GRAF-NODES G))) ;;GRAF-DISPLAY-GAMMAS-INV
(DEFUN EDGES-REVERSE (LE)
(IF (NULL LE)
LE
(CONS (LIST (CADAR LE) (CAAR LE)) (EDGES-REVERSE (CDR LE))))) ;;EDGES-REVERSE
(DEFUN GRAF-REVERSE-EDGES (G)
(CONS (GRAF-NODES G) (EDGES-REVERSE (GRAF-EDGES G)))) ;;GRAF-REVERSE-EDGES
(DEFUN GRAF-SYMETRIC (G)
(GRAF-REVERSE-EDGES G)) ;;GRAF-SYMETRIC
(DEFUN GRAF-SYMETRIC? (G)
(SET-EQUAL? (GRAF-EDGES G) (EDGES-REVERSE (GRAF-EDGES G)))) ;;GRAF-SYMETRIC?
(DEFUN GRAF-MAKE-SYMETRIC (G)
(GRAF-UNION G (GRAF-REVERSE-EDGES G))) ;;GRAF-MAKE-SYMETRIC
(DEFUN LPRINT (L)
(PROGN (PRINT (LENGTH L))
(COND
((NULL L) (PRINT "---"))
((NOT (CONSP L)) (PRINT L))
(T (PROGN (PRINT (CAR L)) (LPRINT (CDR L))))))) ;;LPRINT
(DEFUN GRAF-MINIMIZE-CROSSES-COUNT-CROSSES (G NV) ; private
(LET (
(NC (ARRAY-DIMENSION NV 0))
(CC (MAKE-ARRAY (ARRAY-DIMENSION NV 0) :INITIAL-ELEMENT 0))
)
(DO ((I 0 (1+ I))) ((>= I NC))
(DO ((J (1+ I) (1+ J))) ((>= J NC))
(DO ((K (1+ J) (1+ K))) ((>= K NC))
(DO ((L (1+ K) (1+ L))) ((>= L NC))
;; (format t
;; "~s ~s ~s ~s ([~s]~s,[~s]~s)=~s ([~s]~s,[~s]~s)=~s ~s ~s~%"
;; i j k l
;; i (aref nv i)
;; k (aref nv k)
;; (graf-contains-edge? g
;; (list (aref nv i) (aref nv k)))
;; j (aref nv j)
;; l (aref nv l)
;; (graf-contains-edge? g
;; (list (aref nv j) (aref nv l)))
;; (and
;; (graf-contains-edge? g
;; (list (aref nv i) (aref nv k)))
;; (graf-contains-edge? g
;; (list (aref nv j) (aref nv l)))
;; )
;; cc)
(WHEN (AND (GRAF-CONTAINS-EDGE?
G (LIST (AREF NV I) (AREF NV K)))
(GRAF-CONTAINS-EDGE?
G (LIST (AREF NV J) (AREF NV L))))
(SETF (AREF CC I) (1+ (AREF CC I))
(AREF CC J) (1+ (AREF CC J))
(AREF CC K) (1+ (AREF CC K))
(AREF CC L) (1+ (AREF CC L)))
)
))))
CC) ;;LET
) ;;GRAF-MINIMIZE-CROSSES-COUNT-CROSSES
(DEFVAR GRAF-MINIMIZE-CROSSES-VERBOSELY NIL)
(DEFUN GRAF-MINIMIZE-CROSSES-SEARCH-SWAP (G NV NC CC SCC) ; private
(LET (
(BI 0) ; best swap index.
(BJ 0) ; best swap index.
(BSV NIL) ; best swapped array.
(BSC 0) ; best swapped count of crosses array.
(BSSC 0) ; best sum of swapped count of crosses array.
(SV NIL) ; swapped array.
(SC 0) ; swapped count of crosses array.
(SSC 0) ; sum of swapped count of crosses array.
(S NIL) ; swap temporary.
)
(SETQ BI NC)
(SETQ BJ NC)
(SETQ BSV (COPY-SEQ NV))
(SETQ BSC (COPY-SEQ CC))
(SETQ BSSC SCC)
(DO ((I 0 (1+ I))) ((>= I NC))
(DO ((J (1+ I) (1+ J))) ((>= J NC))
(SETQ SV (COPY-SEQ NV))
(SETQ S (AREF SV I))
(SETF (AREF SV I) (AREF SV J))
(SETF (AREF SV J) S)
(SETQ SC (GRAF-MINIMIZE-CROSSES-COUNT-CROSSES G SV))
(SETQ SSC (APPLY '+ (map 'list (function identity) SC)))
(IF (< SSC BSSC)
(PROGN
(IF GRAF-MINIMIZE-CROSSES-VERBOSELY
(FORMAT T "found less: ~s~%" (/ SSC 4)))
(SETQ BI I)
(SETQ BJ I)
(SETQ BSV (COPY-SEQ SV))
(SETQ BSC (COPY-SEQ SC))
(SETQ BSSC SSC)
))))
(IF (= BI NC)
NIL
(LIST BSV BSC BSSC)
))) ;;GRAF-MINIMIZE-CROSSES-SEARCH-SWAP
;;-----------------------
;;graf-minimize-crosses:
;;-----------------------
;;compute the new count of crosses
;;search for a better swap
;;while we can find a better swap do
;; swap the nodes
;; compute the new count of crosses
;; search for a better swap
;;end
(DEFUN GRAF-MINIMIZE-CROSSES (G)
(IF (NOT (GRAF-SYMETRIC? G))
(GRAF-MINIMIZE-CROSSES (GRAF-MAKE-SYMETRIC G))
(LET ( (NV (MAKE-ARRAY (LENGTH (GRAF-NODES G))
:INITIAL-CONTENTS (GRAF-NODES G)))
(NC (LENGTH (GRAF-NODES G)))
(CC 0) ; count of crosses array.
(SCC 0) ; sum of cc.
(SS NIL) ; search-swap result.
)
(SETQ CC (GRAF-MINIMIZE-CROSSES-COUNT-CROSSES G NV))
(SETQ SCC (APPLY '+ (map 'list (function identity) CC)))
(SETQ SS (GRAF-MINIMIZE-CROSSES-SEARCH-SWAP G NV NC CC SCC))
(LOOP WHILE (NOT (NULL SS)) DO
(SETQ NV (CAR SS))
(SETQ CC (CADR SS))
(SETQ SCC (CADDR SS))
(SETQ SS (GRAF-MINIMIZE-CROSSES-SEARCH-SWAP G NV NC CC SCC))
)
(IF GRAF-MINIMIZE-CROSSES-VERBOSELY
(FORMAT T "crosses: ~s ~%" CC))
NV
))) ;;GRAF-MINIMIZE-CROSSES
(DEFUN GRAF-REPLACE-NODE (G ON NN)
(GRAF-ADD-EDGES
(GRAF-ADD-NODES (GRAF-EMPTY)
(MAPCAR (LAMBDA (N) (IF (EQ N ON) NN N)) (GRAF-NODES G)))
(MAPCAR (LAMBDA (E)
(MAPCAR (LAMBDA (N) (IF (EQ N ON) NN N)) E))
(GRAF-EDGES G)))) ;;GRAF-REPLACE-NODE
;;TODO:(defun graf-collapse-links (g)
;;TODO: (if (not (graf-symetric? g))
;;TODO: (graf-collapse-links (graf-make-symetrical g))
;;TODO: (graf-collapse-links-remove-link-nodes
;;TODO: (graf-collapse-link-collapse-paths g))))
;;TODO:
;;TODO:
;;TODO:(defun graf-collapse-link-get-path-from (path links)
;;TODO: (if (null links)
;;TODO: (cons links
;;TODO:(defun graf-collapse-link-get-a-path (links)
;;TODO: (if (null links)
;;TODO: links
;;TODO: (graf-collapse-link-get-path-from (car links) (cdr links))))
;;TODO:
;;TODO:(defun graf-collapse-link-collapse-paths (g)
;;TODO: (let (
;;TODO: (links (flatten (mapcar (lambda (gam)
;;TODO: (if (= (length gam) 2) gam '()))
;;TODO: (graf-gammas g))))
;;TODO: (paths '())
;;TODO: (res)
;;TODO: )
;;TODO:
;;TODO: (setq res (graf-collapse-link-get-a-path links))
;;TODO: (loop while (not (null res)) do
;;TODO: (setq links (car res))
;;TODO: (append! paths (cdr res))
;;TODO: (setq res (graf-collapse-link-get-a-path links))
;;TODO: )
;;TODO:
;;TODO: (do ((curps paths (cdr curps))) ((null curps))
;;TODO: (mapcar (lambda (oldnode)
;;TODO: (setq g (graf-replace-node g oldnode (cdar curps))))
;;TODO: (caar curps)))
;;TODO: g))
;;TODO:
;;TODO:
;;TODO:(graf-collapse-link-collapse-paths cg)
;;TODO: (mapcar (lambda (link)
;;TODO: (let ((links '()))
;;TODO: ; find the links ie. nodes with two adjacent nodes.
;;TODO: (do ((nodes (graf-nodes g) (cdr nodes))) ((null nodes))
;;TODO: (let ((gamma (set-remove
;;TODO: (graf-gamma g (car nodes))
;;TODO: (list (car nodes) (car nodes)))))
;;TODO: (if (= 2 (length gamma))
;;TODO: (setq links (cons (cons (list (car nodes)) gamma)
;;TODO: links)))))
;;TODO:(format t "links=~s~%" links)
;;TODO: (let ((linkheads (mapcar 'car links)))
;;TODO: ; foreach linkhead
;;TODO: ; foreach edge from linkhead
;;TODO: ; if adjacent node from linkhead is in linkheads then
;;TODO: ; collapse them
;;TODO: (mapcar (lambda (link)
;;TODO: (mapcar (lambda (edges)
;;TODO: (if (set-contains? linkheads (cdr edges))
;;TODO: (graf-replace-node g (car link)
;;TODO: (list (car link) (cdr edges)))))
;;TODO: (cdr link)))
;;TODO: links)
;;TODO: (do ((nodes links (cdr nodes))) ((null nodes))
;;TODO: (let (
;;TODO: (node (caar nodes))
;;TODO: (next (set-remove (mapcar 'cadr (cdar nodes)) (caar nodes)))
;;TODO: )
;;TODO: (format t "linkheads=~s node=~s nexts=~s ~%" linkheads node next)
;;TODO: (do ((tails next (cdr tails))) ((null tails))
;;TODO: (if (set-contains? linkheads (car tails))
;;TODO: (progn
;;TODO:
;;TODO: ))
;;TODO: )
;;TODO: )
;;TODO: ))
;;TODO: )))
;;TODO:(graf-collapse-links cg)
;;TODO:
;;TODO:
(DEFUN GRAF-FOLLOW (G N)
(MAPCAR 'CADR (GRAF-GAMMA G N))) ;;GRAF-FOLLOW
(DEFUN GRAF-PRECEDE (G N)
(MAPCAR 'CAR (GRAF-GAMMA-INV G N))) ;;GRAF-PRECEDE
(DEFUN GRAF-FOLLOW-L (G LN)
(IF (NULL LN)
NIL
(SET-UNION (GRAF-FOLLOW G (CAR LN)) (GRAF-FOLLOW-L G (CDR LN))))) ;;GRAF-FOLLOW-L
(DEFUN GRAF-PRECEDE-L (G LN)
(IF (NULL LN)
NIL
(SET-UNION (GRAF-PRECEDE G (CAR LN)) (GRAF-PRECEDE-L G (CDR LN))))) ;;GRAF-PRECEDE-L
(DEFUN GRAF-INITIAL-NODES (G)
(LET ((TN '()) (NN (GRAF-NODES G)))
(LOOP WHILE (NOT (SET-EQUAL? TN NN)) DO
(SETQ TN NN)
(SETQ NN (SET-UNION-L
(MAPCAR (LAMBDA (X)
(LET ((F (GRAF-PRECEDE G X)))
(IF (NULL F)
(LIST X)
F))) TN))))
NN)) ;;GRAF-INITIAL-NODES
(DEFUN GRAF-TERMINAL-NODES (G)
(LET ((TN '()) (NN (GRAF-NODES G)))
(LOOP WHILE (NOT (SET-EQUAL? TN NN)) DO
(SETQ TN NN)
(SETQ NN (SET-UNION-L
(MAPCAR (LAMBDA (X)
(LET ((F (GRAF-FOLLOW G X)))
(IF (NULL F)
(LIST X)
F))) TN))))
NN)) ;;GRAF-TERMINAL-NODES
(DEFUN GRAF-INITIAL-TOKENS (G)
(REMOVE NIL (MAPCAR
(LAMBDA (X) (IF (GRAF-PRECEDE G X) NIL X)) (GRAF-NODES G)))) ;;GRAF-INITIAL-TOKENS
(DEFUN GRAF-TERMINAL-TOKENS (G)
(REMOVE NIL (MAPCAR
(LAMBDA (X) (IF (GRAF-FOLLOW G X) NIL X)) (GRAF-NODES G)))) ;;GRAF-TERMINAL-TOKENS
(DEFUN AND-L (L)
(COND
((NULL L) T)
((CAR L) (AND-L (CDR L)))
(T NIL))) ;;AND-L
(DEFUN GRAF-REFLEXIVE? (G)
(AND-L
(MAPCAR (LAMBDA (N) (GRAF-CONTAINS-EDGE? G (LIST N N))) (GRAF-NODES G)))) ;;GRAF-REFLEXIVE?
(DEFUN GRAF-MAKE-REFLEXIVE (G)
(GRAF-ADD-EDGES G (MAPCAR (LAMBDA (X) (LIST X X)) (GRAF-NODES G)))) ;;GRAF-MAKE-REFLEXIVE
(DEFUN GRAF-MAKE-TREE (G ROOT)
(CONS ROOT
(MAPCAR
(LAMBDA (X) (GRAF-MAKE-TREE (GRAF-REMOVE-NODE G ROOT) X))
(GRAF-FOLLOW G ROOT)))) ;;GRAF-MAKE-TREE
;; let s[0] be the set of terminal tokens of g
;; let s[i+1] be the set of precedent nodes of s[i] less the nodes already in
;; union(s[j],j in [0..i]).
;; k=MU i, s[k] equals the set of initial tokens of g
;; result=(s[k],...,s[0])
(DEFUN GRAF-BUILD-ORDERED-NODE-LIST-STEP (G L)
(IF (NULL (CAR L))
(CDR L)
(GRAF-BUILD-ORDERED-NODE-LIST-STEP
G (CONS (SET-DIFF (GRAF-PRECEDE-L G (CAR L)) (SET-UNION-L L)) L)))) ;;GRAF-BUILD-ORDERED-NODE-LIST-STEP
;;; (DEFUN GRAF-BUILD-ORDERED-NODE-LIST (G)
;;; (GRAF-BUILD-ORDERED-NODE-LIST-STEP G (LIST (GRAF-TERMINAL-TOKENS G))))
(DEFUN GRAF-BUILD-ORDERED-NODE-LIST (G)
(REVERSE (GRAF-BUILD-ORDERED-NODE-LIST-STEP
G (LIST (GRAF-INITIAL-TOKENS G))))) ;;GRAF-BUILD-ORDERED-NODE-LIST
;;; (let* ((first-layer (graf-initial-tokens g))
;;; (previous-layers first-layer)
;;; (next-layer (graf-follow-l g first-layer)))
;;; ;; si un noed dans next-layer a un precedant non dans previous-layers
;;; ;; alors on le laisse pour plus tard.
;;; (graf-build-ordered-node-list-step g (list (graf-terminal-tokens g))))
;;; layers_suite[0]=((graf-inital-tokens g))
;;; previous_layers[0]=union(i,layers_suite[0][i])
;;;
;;; new_layer[i]=(graf-follow-l g layers_suite[i][0])
;;; minus nodes who has a previous not in previous_layers[i].
(DEFUN GRAF-ONL-ADD-INDICES-IJ (LL I J N)
(COND
((NULL LL)
NIL)
((NULL (CAR LL))
(IF (NULL (CDR LL))
(LIST NIL)
(CONS NIL (GRAF-ONL-ADD-INDICES-IJ (CDR LL) (1+ I) 0 N))))
(T
(LET ((R (GRAF-ONL-ADD-INDICES-IJ
(CONS (CDAR LL) (CDR LL)) I (1+ J) (1+ N))))
(CONS (CONS (LIST (CAAR LL) I J N) (CAR R)) (CDR R)))))) ;;GRAF-ONL-ADD-INDICES-IJ
(DEFUN FIND-ONLIFBE (LI E)
(COND
((NULL LI) NIL)
((EQUAL (CAAR LI) E) (CAR LI))
(T (FIND-ONLIFBE (CDR LI) E)))) ;;FIND-ONLIFBE
(DEFUN GRAF-ONLIFBE-REPLACE (LI LE N)
(IF (NULL LE)
NIL
(CONS (LIST (FIND-ONLIFBE LI (CAAR LE)) (FIND-ONLIFBE LI (CADAR LE)) N)
(GRAF-ONLIFBE-REPLACE LI (CDR LE) (1+ N))))) ;;GRAF-ONLIFBE-REPLACE
(DEFUN GRAF-ONLIF-BUILD-EDGES-CURRENT (G LI CLI N)
(IF (NULL CLI)
NIL
(LET* ((NI (CAR CLI)) (LE (GRAF-GAMMA G (CAR NI)))
(LR (IF (NULL LE) NIL (GRAF-ONLIFBE-REPLACE LI LE N)))
(M (IF (NULL LE) N (1+ (APPLY 'MAX (MAPCAR #'THIRD LR))))))
(APPEND LR
(GRAF-ONLIF-BUILD-EDGES-CURRENT G LI (CDR CLI) M))))) ;;GRAF-ONLIF-BUILD-EDGES-CURRENT
(DEFUN GRAF-ONLIF-BUILD-EDGES (G LI N)
(GRAF-ONLIF-BUILD-EDGES-CURRENT G LI LI N)) ;;GRAF-ONLIF-BUILD-EDGES
(DEFUN GRAF-DIAGRAM-GENERATE-NODE (OUT N L X Y SX SY NODE)
(FORMAT OUT "symbol ~s~%" N)
(FORMAT OUT " layer ~s~%" L)
(FORMAT OUT " shape ~aRectangle~a~%"
(CODE-CHAR 34) (CODE-CHAR 34))
(FORMAT OUT " location ~s.00 ~s.00~%" X Y)
(FORMAT OUT " size ~s.00 ~s.00~%" SX SY)
(FORMAT OUT " framed~%")
(FORMAT OUT " fillColor colorIndex 0~%")
(FORMAT OUT " frameColor colorIndex 1~%")
(FORMAT OUT " shadowColor colorIndex 2~%")
(FORMAT OUT " lineWidth 1.00~%")
(FORMAT OUT " filled~%")
(FORMAT OUT " rtfText {\\rtf0\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\margl40\\margr40\\pard\\tx960\\tx1920\\tx2880\\tx3840\\tx4800\\tx5760\\tx6720\\tx7680\\tx8640\\tx9600\\f0\\b\\i0\\ulnone\\qc\\fs20\\fc0\\cf0 ~a}~%" NODE)
(FORMAT OUT " textPlacement middle~%")
(FORMAT OUT "end~%~%")
) ;;GRAF-DIAGRAM-GENERATE-NODE
(DEFUN GRAF-DIAGRAM-GENERATE-VERTEX (OUT N L X Y)
(FORMAT OUT "vertex ~s~%" N)
(FORMAT OUT " layer ~s~%" L)
(FORMAT OUT " location ~s.00 ~s.00~%" X Y)
(FORMAT OUT "end~%~%")
) ;;GRAF-DIAGRAM-GENERATE-VERTEX
(DEFUN GRAF-DIAGRAM-GENERATE-LINE (OUT N L FROM TO VERTICES)
(FORMAT OUT "line ~s~%" N)
(FORMAT OUT " from ~s~%" FROM)
(FORMAT OUT " to ~s~%" TO)
(DO ((V VERTICES (CDR V)))
((NULL V) NIL)
(FORMAT OUT " ~s~%" (CAAR V)))
(FORMAT OUT " layer ~s~%" L)
(FORMAT OUT " headType arrow~%")
(FORMAT OUT " lineWidth ~s~%" 1.00)
(FORMAT OUT " filled~%")
(FORMAT OUT " frameColor colorIndex ~s~%" 1)
(FORMAT OUT " fillColor colorIndex ~s~%" 0)
(FORMAT OUT "end~%~%")
) ;;GRAF-DIAGRAM-GENERATE-LINE
(DEFUN NODE-SIZE-X (N)
(DECLARE (IGNORE N))
100) ;;NODE-SIZE-X
(DEFUN NODE-SIZE-Y (N)
(DECLARE (IGNORE N))
20) ;;NODE-SIZE-Y
(DEFUN NODE-POS-X (N)
(+ 50 (* 180 (SECOND N)))) ;;NODE-POS-X
(DEFUN NODE-POS-Y (N)
(+ 50 (* 50 (THIRD N)))) ;;NODE-POS-Y
;;from-to
;; v[0]=(from.pos.x+from.size.x, from.pos.y+from.size.y/2)
;; v[1]=(from.pos.x+from.size.x+4, from.pos.y+from.size.y/2)
;; v[2]=(to.pos.x-4, to.pos.y+to.size.y/2)
;; v[3]=(to.pos.x, to.pos.y+to.size.y/2)
;;
;;from-+-+-to
;; v[0]=(from.pos.x+from.size.x, from.pos.y+from.size.y/2)
;; v[1]=(from.pos.x+from.size.x+4, from.pos.y+from.size.y/2)
;; v[2]=(from.pos.x+from.size.x+20,to.pos.y-4)
;; v[3]=(to.pos.x-20, to.pos.y-4)
;; v[4]=(to.pos.x-4, to.pos.y+to.size.y/2)
;; v[5]=(to.pos.x, to.pos.y+to.size.y/2)
(DEFUN GRAF-DIAGRAM-GENERATE-EDGES (OUT LEIJ N)
(IF (NULL LEIJ)
NIL
(LET ((NN N) (ALLV NIL) (ALLI NIL))
(DO ((CUR-EIJ LEIJ (CDR CUR-EIJ)) )
((NULL CUR-EIJ) NIL)
(LET* ((EIJ (CAR CUR-EIJ))
(FROM (FIRST EIJ))
(TO (SECOND EIJ))
(LINENUM (THIRD EIJ))
(LV NIL))
(SETQ LV (APPEND LV
(LIST
(CONS NN
(LIST
(+ (NODE-POS-X FROM)
(NODE-SIZE-X FROM))
(+ (NODE-POS-Y FROM)
(/ (NODE-SIZE-Y FROM) 2))))
(CONS (1+ NN)
(LIST
(+ (NODE-POS-X FROM)
(NODE-SIZE-X FROM) 16)
(+ (NODE-POS-Y FROM)
(/ (NODE-SIZE-Y FROM) 2)))))))
(SETQ NN (+ NN 2))
(WHEN (NOT (EQUAL (1+ (SECOND FROM)) (SECOND TO)))
(SETQ LV
(APPEND LV
(LIST
(CONS NN (LIST
(+ (NODE-POS-X FROM)
(NODE-SIZE-X FROM) 24)
(+ (NODE-POS-Y TO)
(NODE-SIZE-Y TO) 16
(* 2 (- (SECOND FROM)
(SECOND TO))))))
(CONS (1+ NN)
(LIST
(- (NODE-POS-X TO) 24)
(+ (NODE-POS-Y TO)
(NODE-SIZE-Y TO) 16
(* 2 (- (SECOND FROM)
(SECOND TO))))))
))
NN (+ NN 2)))
(SETQ LV (APPEND LV
(LIST
(CONS NN
(LIST
(- (NODE-POS-X TO) 16)
(+ (NODE-POS-Y TO)
(/ (NODE-SIZE-Y TO) 2))))
(CONS (1+ NN)
(LIST
(NODE-POS-X TO)
(+ (NODE-POS-Y TO)
(/ (NODE-SIZE-Y TO) 2)))))))
(SETQ NN (+ NN 2))
(SETQ ALLV (APPEND LV ALLV))
(SETQ ALLI (CONS (LIST OUT LINENUM LINENUM
(FOURTH FROM) (FOURTH TO) LV) ALLI))
) ;;LET*
) ;;DO
(MAPCAR (LAMBDA (X) (GRAF-DIAGRAM-GENERATE-VERTEX
OUT (FIRST X) (FIRST X) (SECOND X) (THIRD X)))
ALLV)
(MAPCAR (LAMBDA (X) (APPLY 'GRAF-DIAGRAM-GENERATE-LINE X))
ALLI)
))) ;;GRAF-DIAGRAM-GENERATE-EDGES
(DEFUN GRAF-DIAGRAM (G OUT NODE-NAME)
(FORMAT OUT "#!DG_TEXT-Version-2~%")
(FORMAT OUT "# D2 Version: Built by rob on Tue Sep 27 14:01:06 PDT 1994~%")
(FORMAT OUT "~%")
(FORMAT OUT "windowOrigin 222.00 2.00~%")
(FORMAT OUT "viewOrigin 1.00 9.00~%")
(FORMAT OUT "viewSize 825.00 617.00~%")
(FORMAT OUT "visibleOrigin 0.00 0.00~%")
(FORMAT OUT "showTools~%")
(FORMAT OUT "snapToGrid~%")
(FORMAT OUT "gridSize 4.000~%")
(FORMAT OUT "defaultFont \"helvetica\"~%")
(FORMAT OUT "defaultFontSize 10.00~%")
(FORMAT OUT "printInfoFile \"printinfo\"~%")
(FORMAT OUT "colorFile \"colors.clr\"~%")
(FORMAT OUT "~%")
(LET* ((LNIJ (FLATTEN (GRAF-ONL-ADD-INDICES-IJ
(GRAF-BUILD-ORDERED-NODE-LIST G) 0 0 1000)))
(LEIJ (GRAF-ONLIF-BUILD-EDGES
G LNIJ (1+ (APPLY 'MAX (MAPCAR #'FOURTH LNIJ))))))
(MAPCAR (LAMBDA (X) (GRAF-DIAGRAM-GENERATE-NODE
OUT (FOURTH X) (FOURTH X)
(NODE-POS-X X) (NODE-POS-Y X)
(NODE-SIZE-X X) (NODE-SIZE-Y X)
(APPLY NODE-NAME (LIST (CAR X)))))
LNIJ)
(GRAF-DIAGRAM-GENERATE-EDGES
OUT LEIJ (1+ (APPLY 'MAX (MAPCAR #'THIRD LEIJ))))
)) ;;GRAF-DIAGRAM
;;----------------------------------------------------------------------
;;; (graf-onlif-build-edges fam
;;; (flatten (graf-onl-add-indices-ij
;;; (graf-build-ordered-node-list fam) 0 0 1000)) 2000)
;;; (graf-Diagram fam
;;; (open "/users/pascal/src/common/lisp/graf.diagram2/DiagramText")
;;; #'string)
;;----------------------------------------------------------------------
(DEFUN GRAF-SUMMARY ()
(FORMAT T "~%")
;; use the following two lines to update the class summary, but skip the first
;; semicolon.
;; egrep 'DEFCLASS|DEFMETHOD' pjb-graph.lisp |sed -e 's/(DEFCLASS \(.*\)/ (FORMAT T "Class \1~%")/' -e 's/(DEFMETHOD\(.*\)/ (FORMAT T "\1~%")/'
(FORMAT T "Class GRAF ()~%")
(FORMAT T " EMPTY ((SELF GRAF))~%")
(FORMAT T " NODES ((SELF GRAF))~%")
(FORMAT T " ADD-NODE ((SELF GRAF) N)~%")
(FORMAT T " ADD-NODES ((SELF GRAF) LN)~%")
(FORMAT T " CONTAINS-NODE? ((SELF GRAF) N)~%")
(FORMAT T " REMOVE-NODE ((SELF GRAF) N)~%")
(FORMAT T " REMOVE-NODES ((SELF GRAF) N)~%")
(FORMAT T " EDGES ((SELF GRAF))~%")
(FORMAT T " ADD-EDGE ((SELF GRAF) E)~%")
(FORMAT T " ADD-EDGES ((SELF GRAF) LE)~%")
(FORMAT T " CONTAINS-EDGE? ((SELF GRAF) E)~%")
(FORMAT T " REMOVE-EDGE ((SELF GRAF) E)~%")
(FORMAT T " REMOVE-EDGES ((SELF GRAF) LE)~%")
(FORMAT T " REVERSE-EDGES ((SELF GRAF))~%")
(FORMAT T " IS-SYMETRIC? ((SELF GRAF))~%")
(FORMAT T " SYMETRIC ((SELF GRAF))~%")
(FORMAT T " MAKE-SYMETRIC ((SELF GRAF))~%")
(FORMAT T " IS-REFLEXIVE? ((SELF GRAF))~%")
(FORMAT T " MAKE-REFLEXIVE ((SELF GRAF))~%")
(FORMAT T " EQUAL? ((SELF GRAF) OTHER-GRAF)~%")
(FORMAT T " IS-PARTIAL-OF? ((SELF GRAF) OTHER-GRAF)~%")
(FORMAT T " IS-SUBSET-OF? ((SELF GRAF) OTHER-GRAF)~%")
(FORMAT T " MINIMIZE-CROSSES ((SELF GRAF))~%")
(FORMAT T " GAMMA-OF-NODE ((SELF GRAF) N)~%")
(FORMAT T " GAMMA-INV-OF-NODE ((SELF GRAF) N)~%")
(FORMAT T " GAMMAS ((SELF GRAF))~%")
(FORMAT T " GAMMAS-INV ((SELF GRAF))~%")
(FORMAT T " DISPLAY-GAMMAS ((SELF GRAF))~%")
(FORMAT T " DISPLAY-GAMMAS-INV ((SELF GRAF))~%")
(FORMAT T " PRECEDE ((SELF GRAF) N)~%")
(FORMAT T " FOLLOW ((SELF GRAF) N)~%")
(FORMAT T " INITIAL-NODES ((SELF GRAF))~%")
(FORMAT T " TERMINAL-NODES ((SELF GRAF))~%")
(FORMAT T " INITIAL-TOKENS ((SELF GRAF))~%")
(FORMAT T " TERMINAL-TOKENS ((SELF GRAF))~%")
(FORMAT T " MAKE-INTERSECTION ((SELF GRAF) OTHER-GRAF)~%")
(FORMAT T " MAKE-UNION ((SELF GRAF) OTHER-GRAF)~%")
(FORMAT T " MAKE-TREE ((SELF GRAF) ROOT)~%")
) ;;GRAF-SUMMARY
(DEFCLASS GRAF ()
((GRAF
:ACCESSOR GRAF
:INITFORM (GRAF-EMPTY))
)
) ;;GRAF
(DEFMETHOD EMPTY ((SELF GRAF))
(SETF (GRAF SELF) (GRAF-EMPTY))) ;;EMPTY
(DEFMETHOD NODES ((SELF GRAF))
(GRAF-NODES (GRAF SELF))) ;;NODES
(DEFMETHOD ADD-NODE ((SELF GRAF) N)
(SETF (GRAF SELF) (GRAF-ADD-NODE (GRAF SELF) N))) ;;ADD-NODE
(DEFMETHOD ADD-NODES ((SELF GRAF) LN)
(SETF (GRAF SELF) (GRAF-ADD-NODES (GRAF SELF) LN))) ;;ADD-NODES
(DEFMETHOD CONTAINS-NODE? ((SELF GRAF) N)
(GRAF-CONTAINS-NODE? (GRAF SELF) N)) ;;CONTAINS-NODE?
(DEFMETHOD REMOVE-NODE ((SELF GRAF) N)
(SETF (GRAF SELF) (GRAF-REMOVE-NODE (GRAF SELF) N))) ;;REMOVE-NODE
(DEFMETHOD REMOVE-NODES ((SELF GRAF) LN)
(SETF (GRAF SELF) (GRAF-REMOVE-NODES (GRAF SELF) LN))) ;;REMOVE-NODES
(DEFMETHOD EDGES ((SELF GRAF))
(GRAF-EDGES (GRAF SELF))) ;;EDGES
(DEFMETHOD ADD-EDGE ((SELF GRAF) E)
(SETF (GRAF SELF) (GRAF-ADD-EDGE (GRAF SELF) E))) ;;ADD-EDGE
(DEFMETHOD ADD-EDGES ((SELF GRAF) LE)
(SETF (GRAF SELF) (GRAF-ADD-EDGES (GRAF SELF) LE))) ;;ADD-EDGES
(DEFMETHOD CONTAINS-EDGE? ((SELF GRAF) E)
(GRAF-CONTAINS-EDGE? (GRAF SELF) E)) ;;CONTAINS-EDGE?
(DEFMETHOD REMOVE-EDGE ((SELF GRAF) E)
(SETF (GRAF SELF) (GRAF-REMOVE-EDGE (GRAF SELF) E))) ;;REMOVE-EDGE
(DEFMETHOD REMOVE-EDGES ((SELF GRAF) LE)
(SETF (GRAF SELF) (GRAF-REMOVE-EDGES (GRAF SELF) LE))) ;;REMOVE-EDGES
(DEFMETHOD REVERSE-EDGES ((SELF GRAF))
(SETF (GRAF SELF) (GRAF-REVERSE-EDGES (GRAF SELF)))) ;;REVERSE-EDGES
(DEFMETHOD IS-SYMETRIC? ((SELF GRAF))
(GRAF-SYMETRIC? (GRAF SELF) )) ;;IS-SYMETRIC?
(DEFMETHOD SYMETRIC ((SELF GRAF))
(LET ((G (MAKE-INSTANCE 'GRAF)))
(SETF (GRAF G) (GRAF-SYMETRIC (GRAF SELF)))
G)) ;;SYMETRIC
(DEFMETHOD MAKE-SYMETRIC ((SELF GRAF))
(SETF (GRAF SELF) (GRAF-MAKE-SYMETRIC (GRAF SELF)))) ;;MAKE-SYMETRIC
(DEFMETHOD IS-REFLEXIVE? ((SELF GRAF))
(GRAF-REFLEXIVE? (GRAF SELF))) ;;IS-REFLEXIVE?
(DEFMETHOD MAKE-REFLEXIVE ((SELF GRAF))
(GRAF-MAKE-REFLEXIVE (GRAF SELF))) ;;MAKE-REFLEXIVE
(DEFMETHOD EQUAL? ((SELF GRAF) OTHER-GRAF)
(GRAF-EQUAL? (GRAF SELF) (GRAF OTHER-GRAF))) ;;EQUAL?
(DEFMETHOD IS-PARTIAL-OF? ((SELF GRAF) OTHER-GRAF)
(GRAF-PARTIAL? (GRAF SELF) (GRAF OTHER-GRAF))) ;;IS-PARTIAL-OF?
(DEFMETHOD IS-SUBSET-OF? ((SELF GRAF) OTHER-GRAF)
(GRAF-SUBSET? (GRAF SELF) (GRAF OTHER-GRAF))) ;;IS-SUBSET-OF?
(DEFMETHOD MINIMIZE-CROSSES ((SELF GRAF))
(SETF (GRAF SELF) (GRAF-MINIMIZE-CROSSES (GRAF SELF)))) ;;MINIMIZE-CROSSES
(DEFMETHOD GAMMA-OF-NODE ((SELF GRAF) N)
(GRAF-GAMMA (GRAF SELF) N)) ;;GAMMA-OF-NODE
(DEFMETHOD GAMMA-INV-OF-NODE ((SELF GRAF) N)
(GRAF-GAMMA-INV (GRAF SELF) N)) ;;GAMMA-INV-OF-NODE
(DEFMETHOD GAMMAS ((SELF GRAF))
(GRAF-GAMMAS (GRAF SELF))) ;;GAMMAS
(DEFMETHOD GAMMAS-INV ((SELF GRAF))
(GRAF-GAMMAS-INV (GRAF SELF))) ;;GAMMAS-INV
(DEFMETHOD DISPLAY-GAMMAS ((SELF GRAF))
(GRAF-DISPLAY-GAMMAS (GRAF SELF))) ;;DISPLAY-GAMMAS
(DEFMETHOD DISPLAY-GAMMAS-INV ((SELF GRAF))
(GRAF-DISPLAY-GAMMAS-INV (GRAF SELF))) ;;DISPLAY-GAMMAS-INV
(DEFMETHOD PRECEDE ((SELF GRAF) N)
(GRAF-PRECEDE (GRAF SELF) N)) ;;PRECEDE
(DEFMETHOD FOLLOW ((SELF GRAF) N)
(GRAF-FOLLOW (GRAF SELF) N)) ;;FOLLOW
(DEFMETHOD INITIAL-NODES ((SELF GRAF))
(GRAF-INITIAL-NODES (GRAF SELF))) ;;INITIAL-NODES
(DEFMETHOD TERMINAL-NODES ((SELF GRAF))
(GRAF-TERMINAL-NODES (GRAF SELF))) ;;TERMINAL-NODES
(DEFMETHOD INITIAL-TOKENS ((SELF GRAF))
(GRAF-INITIAL-TOKENS (GRAF SELF))) ;;INITIAL-TOKENS
(DEFMETHOD TERMINAL-TOKENS ((SELF GRAF))
(GRAF-TERMINAL-TOKENS (GRAF SELF))) ;;TERMINAL-TOKENS
(DEFMETHOD MAKE-INTERSECTION ((SELF GRAF) OTHER-GRAF)
(LET ((G (MAKE-INSTANCE 'GRAF)))
(SETF (GRAF G) (GRAF-INTERSECTION (GRAF SELF) (GRAF OTHER-GRAF)))
G)) ;;MAKE-INTERSECTION
(DEFMETHOD MAKE-UNION ((SELF GRAF) OTHER-GRAF)
(LET ((G (MAKE-INSTANCE 'GRAF)))
(SETF (GRAF G) (GRAF-UNION (GRAF SELF) (GRAF OTHER-GRAF)))
G)) ;;MAKE-UNION
(DEFMETHOD MAKE-TREE ((SELF GRAF) ROOT)
(GRAF-MAKE-TREE (GRAF SELF) ROOT)) ;;MAKE-TREE
;;;; graph-diagram.lisp -- -- ;;;;