Avoid sets in the hot path of dataflow repair; also remove (bad) cycle-detection code
This commit is contained in:
parent
9d5213ecf4
commit
c22f9f98f8
|
@ -17,7 +17,7 @@
|
|||
|
||||
(struct dataflow-graph (edges-forward ;; object-id -> (Setof subject-id)
|
||||
edges-reverse ;; subject-id -> (Setof object-id)
|
||||
damaged-nodes ;; Setof object-id
|
||||
damaged-nodes ;; Hashof object-id True
|
||||
)
|
||||
#:mutable)
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
|||
(define (make-dataflow-graph)
|
||||
(dataflow-graph (hash)
|
||||
(hash)
|
||||
(set)))
|
||||
(hash)))
|
||||
|
||||
(define (dataflow-record-observation! g object-id)
|
||||
(define subject-id (current-dataflow-subject-id))
|
||||
|
@ -37,7 +37,7 @@
|
|||
(set-dataflow-graph-edges-reverse! g (hashset-add rev subject-id object-id))))
|
||||
|
||||
(define (dataflow-record-damage! g object-id)
|
||||
(set-dataflow-graph-damaged-nodes! g (set-add (dataflow-graph-damaged-nodes g) object-id)))
|
||||
(set-dataflow-graph-damaged-nodes! g (hash-set (dataflow-graph-damaged-nodes g) object-id #t)))
|
||||
|
||||
(define (dataflow-forget-subject! g subject-id)
|
||||
(define rev (dataflow-graph-edges-reverse g))
|
||||
|
@ -48,25 +48,17 @@
|
|||
(set-dataflow-graph-edges-forward! g (hashset-remove fwd object-id subject-id))))
|
||||
|
||||
(define (dataflow-repair-damage! g repair-node!)
|
||||
(define repaired-this-round (set))
|
||||
(let loop ()
|
||||
(define workset (dataflow-graph-damaged-nodes g))
|
||||
(set-dataflow-graph-damaged-nodes! g (set))
|
||||
|
||||
(let ((already-damaged (set-intersect workset repaired-this-round)))
|
||||
(when (not (set-empty? already-damaged))
|
||||
(log-warning "Cyclic dependencies involving ids ~v\n" already-damaged)))
|
||||
|
||||
(set! workset (set-subtract workset repaired-this-round))
|
||||
(set! repaired-this-round (set-union repaired-this-round workset))
|
||||
|
||||
(when (not (set-empty? workset))
|
||||
(for [(object-id (in-set workset))]
|
||||
(define subjects (hash-ref (dataflow-graph-edges-forward g) object-id set))
|
||||
(for [(subject-id (in-set subjects))]
|
||||
(dataflow-forget-subject! g subject-id)
|
||||
(parameterize ((current-dataflow-subject-id subject-id))
|
||||
(repair-node! subject-id))))
|
||||
(when (not (hash-empty? workset))
|
||||
(set-dataflow-graph-damaged-nodes! g (hash))
|
||||
(hash-for-each workset
|
||||
(lambda (object-id _)
|
||||
(define subjects (hash-ref (dataflow-graph-edges-forward g) object-id set))
|
||||
(for [(subject-id (in-set subjects))]
|
||||
(dataflow-forget-subject! g subject-id)
|
||||
(parameterize ((current-dataflow-subject-id subject-id))
|
||||
(repair-node! subject-id)))))
|
||||
(loop))))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
Loading…
Reference in New Issue