Avoid sets in the hot path of dataflow repair; also remove (bad) cycle-detection code

This commit is contained in:
Tony Garnock-Jones 2018-04-30 14:29:34 +01:00
parent 9d5213ecf4
commit c22f9f98f8
1 changed files with 12 additions and 20 deletions

View File

@ -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))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;