main
Matthew Butterick 6 years ago
parent 586d99ec07
commit 7d76fc1384

@ -1,7 +1,8 @@
#lang debug racket #lang debug racket
(require "hacs.rkt") (require "hacs.rkt" sugar/debug)
(module+ test (require rackunit)) (module+ test (require rackunit))
(define (map-coloring-csp colors neighbors) (define (map-coloring-csp colors neighbors)
(define variables (remove-duplicates (flatten neighbors) eq?)) (define variables (remove-duplicates (flatten neighbors) eq?))
(define vds (for/list ([var (in-list variables)]) (define vds (for/list ([var (in-list variables)])
@ -55,5 +56,4 @@
(module+ test (module+ test
(check-true (pair? (solve fr)))) (check-true (pair? (solve fr))))
(module+ main (module+ main)
(solve aus))

@ -118,6 +118,7 @@
(define current-inference (make-parameter #f)) (define current-inference (make-parameter #f))
(define current-solver (make-parameter #f)) (define current-solver (make-parameter #f))
(define current-random (make-parameter #t)) (define current-random (make-parameter #t))
(define current-decompose (make-parameter #t))
(define/contract (check-name-in-csp! caller csp name) (define/contract (check-name-in-csp! caller csp name)
(symbol? csp? name? . -> . void?) (symbol? csp? name? . -> . void?)
@ -490,12 +491,19 @@
(define/contract (make-cartesian-generator solgens) (define/contract (make-cartesian-generator solgens)
((listof generator?) . -> . generator?) ((listof generator?) . -> . generator?)
(generator () (generator ()
(let loop ([solgens solgens][sols empty]) (define solcache (make-hasheqv))
(cond (let loop ([solgens solgens][idx 0][sols empty])
[(empty? solgens) (yield (combine-csps (reverse sols)))] (match solgens
[else (match-define (cons solgen others) solgens) [(? empty?) (yield (combine-csps (reverse sols)))]
(for ([sol (in-producer solgen (void))]) [(cons solgen rest)
(loop others (cons sol sols)))])))) (cond
[(eq? (generator-state solgen) 'done)
(for ([sol (in-list (reverse (hash-ref solcache idx)))])
(loop rest (add1 idx) (cons sol sols)))]
[else
(for ([sol (in-producer solgen (void))])
(hash-update! solcache idx (λ (vals) (cons sol vals)) null)
(loop rest (add1 idx) (cons sol sols)))])]))))
(define/contract (extract-subcsp csp names) (define/contract (extract-subcsp csp names)
($csp? (listof name?) . -> . $csp?) ($csp? (listof name?) . -> . $csp?)
@ -516,10 +524,13 @@
. ->* . (listof any/c)) . ->* . (listof any/c))
(when-debug (reset-assns!) (reset-nfcs!) (reset-nchecks!)) (when-debug (reset-assns!) (reset-nfcs!) (reset-nchecks!))
(define subproblems (for/list ([nodeset (in-list (cc (csp->graph csp)))]) (define subcsps ; decompose into independent csps. `cc` determines "connected components"
(extract-subcsp csp nodeset))) (if (current-decompose)
(for/list ([nodeset (in-list (cc (csp->graph csp)))])
(extract-subcsp csp nodeset))
(list csp)))
(for/list ([solution (in-producer (make-cartesian-generator (map solver subproblems)) (void))] (for/list ([solution (in-producer (make-cartesian-generator (map solver subcsps)) (void))]
[idx (in-range max-solutions)]) [idx (in-range max-solutions)])
(finish-proc solution))) (finish-proc solution)))

Loading…
Cancel
Save