(use srfi-27) (use srfi-1) (define-syntax while (syntax-rules () ((while condition things ... ) (do () ((not condition)) things ...)))) (define (uniform min max) (+ min (* (- max min) (random-real)))) (define (dag-compute list-distributions list-dependencies) (define samples (map (lambda (node-distribution) (cons (car node-distribution) ((cdr node-distribution)))) list-distributions)) (define global-counter (map (lambda (node-distribution) (cons (car node-distribution) -1)) list-distributions)) (define (dependencies node) (cdr (assq node list-dependencies))) (define (dependencies-solved node) (every (lambda (dependent-node) (not (= -1 (cdr (assq dependent-node global-counter))))) (dependencies node))) (define (dependency-times node) (cons 0 (map (lambda (dependent-node) (cdr (assq dependent-node samples))) (dependencies node)))) (define abc (begin (define ready-list (filter (lambda (node-times) (and (= -1 (cdr node-times)) (dependencies-solved (car node-times)))) global-counter)) (define nodesleft? (any (lambda (node-times) (= -1 (cdr node-times))) global-counter)) (define compute-next-times (for-each (lambda (node-times) (set-cdr! node-times (+ (cdr (assq (car node-times) samples)) (apply max (dependency-times (car node-times)))))) ready-list)) (while (nodesleft?) (compute-next-times)) global-counter))) (define ob1 `( ;; nodes and distributions (T1 . ,(lambda () (uniform 32 48))) (T2 . ,(lambda () (uniform 40 60))) (T3 . ,(lambda () (uniform 15 25))) (T4 . ,(lambda () (uniform 10 15))) (T5 . ,(lambda () (uniform 10 15))) (T6 . ,(lambda () (uniform 6 10))) (T7 . ,(lambda () (uniform 18 24))) (T8 . ,(lambda () (uniform 4 8))))) (define ob2 '( ;; dependencies (T1) (T2 . (T1)) (T3 . (T1 T2)) (T4 . (T2)) (T5 . (T2 T3)) (T6 . (T2)) (T7 . (T2 T4 T5)) (T8 . (T4 T5 T6 T7)))) (define obra (dag-compute ob1 ob2))