/drbayes/private/set/tree-value.rkt

http://github.com/ntoronto/plt-stuff · Racket · 146 lines · 62 code · 24 blank · 60 comment · 7 complexity · bd8a36da7e1dcda820bf2464eddf94b7 MD5 · raw file

  1. #lang typed/racket/base
  2. (require racket/promise
  3. racket/list
  4. racket/match
  5. "types.rkt"
  6. "../untyped-utils.rkt")
  7. (provide (all-defined-out))
  8. (define-type Tree-Index (Listof (U 0 1)))
  9. (define-type Nonempty-Tree-Index (Pair (U 0 1) Tree-Index))
  10. (: left (Tree-Index -> Tree-Index))
  11. (define (left j) (cons 0 j))
  12. (: right (Tree-Index -> Tree-Index))
  13. (define (right j) (cons 1 j))
  14. ;; ===================================================================================================
  15. (struct: (A) Node ([value : (Promise A)] [children : (Children A)]) #:transparent)
  16. (struct: (A) Children ([fst : (Tree A)] [snd : (Tree A)]) #:transparent)
  17. (define-type (Tree A) (U (Node A) (Promise (Node A))))
  18. (: random-tree (All (A) ((-> A) -> (Tree A))))
  19. (define (random-tree rand)
  20. (delay (Node (delay (rand)) (Children (random-tree rand) (random-tree rand)))))
  21. (: tree-value (All (A) ((Tree A) -> (Promise A))))
  22. (define (tree-value t) (Node-value (maybe-force t)))
  23. (: tree-fst (All (A) ((Tree A) -> (Tree A))))
  24. (define (tree-fst t) (Children-fst (Node-children (maybe-force t))))
  25. (: tree-snd (All (A) ((Tree A) -> (Tree A))))
  26. (define (tree-snd t) (Children-snd (Node-children (maybe-force t))))
  27. (: tree-ref (All (A) ((Tree A) Tree-Index -> A)))
  28. (define (tree-ref t j)
  29. (let ([t (maybe-force t)])
  30. (cond [(empty? j) (force (Node-value t))]
  31. [(zero? (first j)) (tree-ref (Children-fst (Node-children t)) (rest j))]
  32. [else (tree-ref (Children-snd (Node-children t)) (rest j))])))
  33. (: tree->list (All (A) ((Tree A) -> (Listof A))))
  34. (define (tree->list t)
  35. (reverse
  36. (let: loop ([t t] [vs : (Listof A) null])
  37. (cond [(or (not (promise? t)) (promise-forced? t))
  38. (match-define (Node v (Children c1 c2)) (maybe-force t))
  39. (let ([vs (loop c1 vs)])
  40. (if (promise-forced? v)
  41. (loop c2 (cons (force v) vs))
  42. (loop c2 vs)))]
  43. [else vs]))))
  44. ;; ===================================================================================================
  45. (struct: Omega Base-Value ([tree : (Tree Flonum)]) #:transparent)
  46. (define omega? Omega?)
  47. (: random-omega (-> Omega))
  48. (define (random-omega) (Omega (random-tree random)))
  49. (: make-omega (Flonum (Children Flonum) -> Omega))
  50. (define (make-omega v c)
  51. (Omega (Node (delay v) c)))
  52. (: omega-value (Omega -> Flonum))
  53. (define (omega-value t) (maybe-force (tree-value (Omega-tree t))))
  54. (: omega-children (Omega -> (Children Flonum)))
  55. (define (omega-children t) (Node-children (maybe-force (Omega-tree t))))
  56. #|
  57. (: omega-fst (Omega -> Omega))
  58. (define (omega-fst t) (Omega (tree-fst (Omega-tree t))))
  59. (: omega-snd (Omega -> Omega))
  60. (define (omega-snd t) (Omega (tree-snd (Omega-tree t))))
  61. |#
  62. (: make-omega-children (Omega Omega -> (Children Flonum)))
  63. (define (make-omega-children t1 t2)
  64. (Children (Omega-tree t1) (Omega-tree t2)))
  65. (: omega-children-fst ((Children Flonum) -> Omega))
  66. (define (omega-children-fst t) (Omega (Children-fst t)))
  67. (: omega-children-snd ((Children Flonum) -> Omega))
  68. (define (omega-children-snd t) (Omega (Children-snd t)))
  69. (: omega-ref (Omega Tree-Index -> Flonum))
  70. (define (omega-ref t j) (tree-ref (Omega-tree t) j))
  71. (: omega->list (Omega -> (Listof Flonum)))
  72. (define (omega->list t) (tree->list (Omega-tree t)))
  73. ;; ===================================================================================================
  74. (struct: Trace Base-Value ([tree : (Tree Boolean)]) #:transparent)
  75. (define trace? Trace?)
  76. (: random-trace (-> Trace))
  77. (define (random-trace) (Trace (random-tree (Îť () ((random) . < . 0.5)))))
  78. (: make-trace (Boolean (Children Boolean) -> Trace))
  79. (define (make-trace v c)
  80. (Trace (Node (delay v) c)))
  81. (: trace-value (Trace -> Boolean))
  82. (define (trace-value t) (maybe-force (tree-value (Trace-tree t))))
  83. (: trace-children (Trace -> (Children Boolean)))
  84. (define (trace-children t) (Node-children (maybe-force (Trace-tree t))))
  85. #|
  86. (: trace-fst (Trace -> Trace))
  87. (define (trace-fst t) (Trace (tree-fst (Trace-tree t))))
  88. (: trace-snd (Trace -> Trace))
  89. (define (trace-snd t) (Trace (tree-snd (Trace-tree t))))
  90. |#
  91. (: make-trace-children (Trace Trace -> (Children Boolean)))
  92. (define (make-trace-children t1 t2)
  93. (Children (Trace-tree t1) (Trace-tree t2)))
  94. (: trace-children-fst ((Children Boolean) -> Trace))
  95. (define (trace-children-fst t) (Trace (Children-fst t)))
  96. (: trace-children-snd ((Children Boolean) -> Trace))
  97. (define (trace-children-snd t) (Trace (Children-snd t)))
  98. (: trace-ref (Trace Tree-Index -> Boolean))
  99. (define (trace-ref t j) (tree-ref (Trace-tree t) j))
  100. (: trace->list (Trace -> (Listof Boolean)))
  101. (define (trace->list t) (tree->list (Trace-tree t)))