dfs uses the create-leaf function to insert an unresolveable adjacency
as a leaf (= new node) now. this function can be specified as an argument to dfs.
This commit is contained in:
parent
30d8807382
commit
915cde7891
55
dfs.scm
55
dfs.scm
|
@ -80,28 +80,44 @@
|
||||||
;;; ===================
|
;;; ===================
|
||||||
;;;
|
;;;
|
||||||
;;; (dfs dag) ---> sorted-dag
|
;;; (dfs dag) ---> sorted-dag
|
||||||
;;; (dfs dag auto-leafs?) ---> sorted-dag
|
;;; (dfs dag pred auto-leafs? create-leaf) ---> sorted-dag
|
||||||
;;;
|
;;;
|
||||||
;;; where
|
;;; where
|
||||||
;;;
|
;;;
|
||||||
;;; dag : '(#{:dfs} ...) ; representation of a given
|
;;; dag : '(#{:dfs} ...) ; representation of a given
|
||||||
;;; directed acyclic graph)
|
;;; directed acyclic graph)
|
||||||
|
;;; pred : (pred adj-id node-id) ---> #t (if adj-identifier
|
||||||
|
;;; and node-identifier are equal) or #f
|
||||||
|
;;;
|
||||||
;;; auto-leafs? : #t (by default) or #f
|
;;; auto-leafs? : #t (by default) or #f
|
||||||
|
;;; if auto-leafs? is set to #f then it is an error
|
||||||
|
;;; that an adjacency is unresolveable in the list of
|
||||||
|
;;; all node-names. if auto-leafs? is enabled then
|
||||||
|
;;; every adjacency which is unresolveable in the list
|
||||||
|
;;; of all node-names is assumed to point to a leaf.
|
||||||
|
;;; this leaf is then created automatically by
|
||||||
|
;;; executing the function create-leaf.
|
||||||
|
;;;
|
||||||
|
;;; create-leaf : (create-leaf unresolved-adjacency-identifier) ---> #{:dfs}
|
||||||
|
;;; create-leaf is a function which is called with the
|
||||||
|
;;; unresolved adjacency identifier. By default, this
|
||||||
|
;;; argument is function returning a leaf named with
|
||||||
|
;;; the unresolved adjacency identifier, with no
|
||||||
|
;;; adjacencies, and ignored-data set to #f. This
|
||||||
|
;;; leaf, created by create-leaf, doesn't really have
|
||||||
|
;;; to be a leaf; it can be a node as well. Maybe this
|
||||||
|
;;; introduces new cyclic dependency problems; not sure.
|
||||||
|
;;;
|
||||||
;;; sorted-dag : the sorted dag
|
;;; sorted-dag : the sorted dag
|
||||||
;;;
|
;;;
|
||||||
;;; auto-leafs?:
|
(define (dfs dag . maybe-args)
|
||||||
;;;
|
(let-optionals maybe-args ((pred string=?)
|
||||||
;;; if auto-leafs? is enabled then every adjacency which is unresolveable
|
(auto-leafs? #t)
|
||||||
;;; in the set of all node-names is assumed to point to a leaf.
|
(create-leaf (lambda (unresolved-adj-id)
|
||||||
;;; this leaf is then created automatically: it consists of the node-name
|
;; (display "unresolved adjecency: ")
|
||||||
;;; which was given by the initiating adjencency, the empty adjacencies
|
;; (display unresolved-adj-id)
|
||||||
;;; list, and the ignored-data-field set to #f.
|
;; (newline)
|
||||||
;;; if auto-leafs? is set to #f then it is an error that an adjacency is
|
(make-dfs unresolved-adj-id '() #f))))
|
||||||
;;; unresolveable in the list of all node-names.
|
|
||||||
;;;
|
|
||||||
(define (dfs dag . maybe-arg)
|
|
||||||
(let-optionals maybe-arg ((pred string=?)
|
|
||||||
(auto-leafs? #t))
|
|
||||||
(set! time 0)
|
(set! time 0)
|
||||||
(let ((node-names (map dfs-name dag)))
|
(let ((node-names (map dfs-name dag)))
|
||||||
(if (not (null? node-names))
|
(if (not (null? node-names))
|
||||||
|
@ -118,7 +134,7 @@
|
||||||
(cond
|
(cond
|
||||||
((eq? (dfs-color current-node) (color white))
|
((eq? (dfs-color current-node) (color white))
|
||||||
(let ((new-dag (dfs-visit current-dag current-node
|
(let ((new-dag (dfs-visit current-dag current-node
|
||||||
pred auto-leafs?)))
|
pred auto-leafs? create-leaf)))
|
||||||
(if (not (null? nodes-to-do))
|
(if (not (null? nodes-to-do))
|
||||||
(for-all-nodes (car nodes-to-do)
|
(for-all-nodes (car nodes-to-do)
|
||||||
(cdr nodes-to-do)
|
(cdr nodes-to-do)
|
||||||
|
@ -132,7 +148,7 @@
|
||||||
'())
|
'())
|
||||||
node-names))))
|
node-names))))
|
||||||
|
|
||||||
(define (dfs-visit dag node pred auto-leafs?)
|
(define (dfs-visit dag node pred auto-leafs? create-leaf)
|
||||||
;; (dfs-dag-show dag node)
|
;; (dfs-dag-show dag node)
|
||||||
(let ((name (dfs-name node))
|
(let ((name (dfs-name node))
|
||||||
(adjs (dfs-adjacencies node))
|
(adjs (dfs-adjacencies node))
|
||||||
|
@ -148,16 +164,15 @@
|
||||||
(begin
|
(begin
|
||||||
(if (eq? (dfs-color maybe-node) (color white))
|
(if (eq? (dfs-color maybe-node) (color white))
|
||||||
(let ((next-dag (dfs-visit current-dag maybe-node
|
(let ((next-dag (dfs-visit current-dag maybe-node
|
||||||
pred auto-leafs?)))
|
pred auto-leafs? create-leaf)))
|
||||||
(set! current-dag next-dag))
|
(set! current-dag next-dag))
|
||||||
(if (eq? (dfs-color maybe-node) (color grey))
|
(if (eq? (dfs-color maybe-node) (color grey))
|
||||||
(error "dfs-visit: cycle detected; node-name: "
|
(error "dfs-visit: cycle detected; node-name: "
|
||||||
(dfs-name node)))))
|
(dfs-name node)))))
|
||||||
(if auto-leafs?
|
(if auto-leafs?
|
||||||
(let ((leaf (really-make-dfs current-adj '()
|
(let ((leaf (create-leaf current-adj)))
|
||||||
(color white) 0 #f)))
|
|
||||||
(set! current-dag (dfs-visit (cons leaf current-dag) leaf
|
(set! current-dag (dfs-visit (cons leaf current-dag) leaf
|
||||||
pred auto-leafs?)))
|
pred auto-leafs? create-leaf)))
|
||||||
(error "dfs-visit: unresolveable adjacency: "
|
(error "dfs-visit: unresolveable adjacency: "
|
||||||
current-adj))))
|
current-adj))))
|
||||||
(if (not (null? todo-adjs))
|
(if (not (null? todo-adjs))
|
||||||
|
|
Loading…
Reference in New Issue