graph.lsp Version 1.00 31 October 2004 Author Steven Jones Contact jones57@swbell.net include the word "nyquist" in subject line The contents of this file are released under the terms of the GNU General Public License. See the file LICENSE.txt Defines a function to display nodes on a graph. A graph consist of two sets; nodes and edges. See node.lsp
function
(graph:print start [echo]) Print graph representation where "A --(n)--> B" indicates that node A links to node B with frequency n start - Object. An instance of node echo - Boolean. If true dump results to standard out. Default true return - String | nil
example
;; @doc example Building a 5 node graph ;; ;; [C]-- ;; / \ ;; [A]---[B]--< >--[E] ;; \ / ;; [D]-- ;; ;; ;; Define the nodes ;; (setf A (send node :new 'APE :bidir nil) B (send node :new 'BAT :bidir nil) C (send node :new 'CAT :bidir nil) D (send node :new 'DOG :bidir nil) E (send node :new 'ELK :bidir nil)) ;; Now interconnect them ;; (send A :link B) (send B :link C) (send B :link D) (send C :link E) (send D :link E) ;; Print it, ;; (graph:print A)
;; graph.lsp ;; Version 1.00 31 October 2004 ;; Author Steven Jones ;; ;; Contact jones57@swbell.net include the word "nyquist" in subject line ;; ;; The contents of this file are released under the terms of the GNU General ;; Public License. See the file LICENSE.txt ;; ;; Defines a function to display nodes on a graph. A graph consist of two ;; sets; nodes and edges. See node.lsp ;; (require 'node) (provide 'graph) (current-file "graph") ;; @doc function graph:print ;; (graph:print start [echo]) ;; Print graph representation where "A --(n)--> B" ;; indicates that node A links to node B with frequency n ;; ;; start - Object. An instance of node ;; ;; echo - Boolean. If true dump results to standard out. Default true ;; ;; return - String | nil ;; (defun graph:print (start-node &optional (echo t)) (let (visited stack node acc local-visited) (setf visited '()) (setf stack '()) (setf acc "") (push start-node stack) (push start-node visited) (while (not (null stack)) (setf node (car stack)) (pop stack) (setf local-visited '()) ;(setf acc (format nil "~a~%~a" acc (send node :label))) (dolist (other (send node :get-output-edges)) (if (not (member other visited)) (progn (push other visited) (push other stack) (setf acc (format nil "~a ~%~a --(~a)--> ~a" acc (send node :label) (send node :frequency other) (send other :label))) (push other local-visited)) (if (not (member other local-visited)) (setf acc (format nil "~a ~%~a --(~a)--> ~a" acc (send node :label) (send node :frequency other) (send other :label))))))) (format echo "~%~a~%" acc))) ; *************************************************************************** ; Example use ; *************************************************************************** #| ;; @doc example Building a 5 node graph ;; ;; [C]-- ;; / \ ;; [A]---[B]--< >--[E] ;; \ / ;; [D]-- ;; ;; ;; Define the nodes ;; (setf A (send node :new 'APE :bidir nil) B (send node :new 'BAT :bidir nil) C (send node :new 'CAT :bidir nil) D (send node :new 'DOG :bidir nil) E (send node :new 'ELK :bidir nil)) ;; Now interconnect them ;; (send A :link B) (send B :link C) (send B :link D) (send C :link E) (send D :link E) ;; Print it, ;; (graph:print A)