Term generator now less aggressive about producing weird variables and
strings. svn: r15860
This commit is contained in:
parent
e6b536edba
commit
1d4da3df4c
|
@ -96,22 +96,20 @@
|
||||||
(test (pick-integer 900 (make-random 0 0 1/5)) -7)
|
(test (pick-integer 900 (make-random 0 0 1/5)) -7)
|
||||||
(test (pick-real 9000 (make-random 0 0 0 .5 1 1/8)) 11.0)
|
(test (pick-real 9000 (make-random 0 0 0 .5 1 1/8)) 11.0)
|
||||||
|
|
||||||
(let* ([lits '("bcd" "cbd")]
|
(let* ([lits '("bcd" "cbd")])
|
||||||
[chars (sort (unique-chars lits) char<=?)])
|
(test (pick-char 0 (make-random 0 0)) #\A)
|
||||||
(test (pick-char 0 chars (make-random 1)) #\c)
|
(test (pick-char 0 (make-random 2 1)) #\c)
|
||||||
(test (pick-char 50 chars (make-random 1 1)) #\c)
|
(test (pick-char 1000 (make-random 1 25 0)) #\Z)
|
||||||
(test (pick-char 50 chars (make-random 0 65)) #\a)
|
(test (pick-char 1000 (make-random 0 65)) #\a)
|
||||||
(test (pick-char 500 chars (make-random 0 1 65)) #\a)
|
(test (pick-char 1500 (make-random 0 1 65)) #\a)
|
||||||
(test (pick-char 500 chars (make-random 0 0 3)) #\⇒)
|
(test (pick-char 1500 (make-random 0 0 3)) #\⇒)
|
||||||
(test (pick-char 2000 chars (make-random 0 0 1 3)) #\⇒)
|
(test (pick-char 2500 (make-random 0 0 1 3)) #\⇒)
|
||||||
(test (pick-char 2000 chars (make-random 0 0 0 1)) (integer->char #x4E01))
|
(test (pick-char 2500 (make-random 0 0 0 1)) (integer->char #x4E01))
|
||||||
(test (pick-char 50 chars (make-random 0 (- (char->integer #\_) #x20))) #\`)
|
(test (pick-char 1000 (make-random 0 (- (char->integer #\_) #x20))) #\`)
|
||||||
(test (random-string chars lits 3 0 (make-random 0 1)) "cbd")
|
(test (random-string lits 3 0 (make-random 0 1)) "cbd")
|
||||||
(test (random-string chars lits 3 0 (make-random 1 2 1 0)) "dcb")
|
(test (random-string lits 3 0 (make-random 1 0 1 1 1 2 1)) "abc")
|
||||||
(test (pick-string chars lits 0 (make-random .5 1 2 1 0)) "dcb")
|
(test (pick-string lits 0 (make-random .5 1 0 1 1 1 2 1)) "abc")
|
||||||
(test (pick-var chars lits 0 (make-random .01 1 2 1 0)) 'dcb)
|
(test (pick-var lits 0 (make-random .01 1 0 1 1 1 2 1)) 'abc))
|
||||||
(test (pick-char 0 null (make-random 65)) #\a)
|
|
||||||
(test (random-string null null 1 0 (make-random 65)) "a"))
|
|
||||||
|
|
||||||
(let ()
|
(let ()
|
||||||
(define-language L
|
(define-language L
|
||||||
|
@ -332,9 +330,8 @@
|
||||||
(let/ec k
|
(let/ec k
|
||||||
(generate-term/decisions
|
(generate-term/decisions
|
||||||
lang e 5 0
|
lang e 5 0
|
||||||
(decisions #:str (list (λ (c l a) (k (cons (sort c char<=?) (sort l string<=?))))))))
|
(decisions #:str (list (λ (l a) (k (sort l string<=?)))))))
|
||||||
(cons '(#\a #\b #\f #\o #\r)
|
'("bar" "foo")))
|
||||||
'("bar" "foo"))))
|
|
||||||
|
|
||||||
(let ()
|
(let ()
|
||||||
(define-language lang
|
(define-language lang
|
||||||
|
@ -518,7 +515,7 @@
|
||||||
(test
|
(test
|
||||||
(generate-term/decisions
|
(generate-term/decisions
|
||||||
L (side-condition x (number? (term x))) 0 0
|
L (side-condition x (number? (term x))) 0 0
|
||||||
(decisions #:var (λ (lang-chars lang-lits attempt)
|
(decisions #:var (λ (lang-lits attempt)
|
||||||
(if (>= attempt retry-threshold) 0 'x))))
|
(if (>= attempt retry-threshold) 0 'x))))
|
||||||
0)
|
0)
|
||||||
|
|
||||||
|
@ -527,7 +524,7 @@
|
||||||
[finish (+ retry-threshold post-threshold-incr)])
|
[finish (+ retry-threshold post-threshold-incr)])
|
||||||
(generate-term/decisions
|
(generate-term/decisions
|
||||||
L (side-condition x (number? (term x))) 0 start
|
L (side-condition x (number? (term x))) 0 start
|
||||||
(decisions #:var (λ (lang-chars lang-lits attempt)
|
(decisions #:var (λ (lang-lits attempt)
|
||||||
(set! attempts (cons attempt attempts))
|
(set! attempts (cons attempt attempts))
|
||||||
(if (= attempt finish) 0 'x))))
|
(if (= attempt finish) 0 'x))))
|
||||||
(test attempts (list finish retry-threshold start))))
|
(test attempts (list finish retry-threshold start))))
|
||||||
|
|
|
@ -18,41 +18,34 @@
|
||||||
(and (>= attempt preferred-production-threshold)
|
(and (>= attempt preferred-production-threshold)
|
||||||
(zero? (random 2))))
|
(zero? (random 2))))
|
||||||
|
|
||||||
;; unique-chars : (listof string) -> (listof char)
|
|
||||||
(define (unique-chars strings)
|
|
||||||
(let ([uniq (make-hasheq)])
|
|
||||||
(for ([lit strings])
|
|
||||||
(for ([char lit])
|
|
||||||
(hash-set! uniq char #t)))
|
|
||||||
(hash-map uniq (λ (k v) k))))
|
|
||||||
|
|
||||||
(define default-check-attempts 1000)
|
(define default-check-attempts 1000)
|
||||||
|
|
||||||
(define ascii-chars-threshold 50)
|
(define ascii-chars-threshold 1000)
|
||||||
(define tex-chars-threshold 500)
|
(define tex-chars-threshold 1500)
|
||||||
(define chinese-chars-threshold 2000)
|
(define chinese-chars-threshold 2500)
|
||||||
|
|
||||||
(define (pick-var lang-chars lang-lits attempt [random random])
|
(define (pick-var lang-lits attempt [random random])
|
||||||
(let ([length (add1 (random-natural 4/5 random))])
|
(let ([length (add1 (random-natural 4/5 random))])
|
||||||
(string->symbol (random-string lang-chars lang-lits length attempt random))))
|
(string->symbol (random-string lang-lits length attempt random))))
|
||||||
|
|
||||||
(define (pick-char attempt lang-chars [random random])
|
(define (pick-char attempt [random random])
|
||||||
(if (and (not (null? lang-chars))
|
(cond [(or (< attempt ascii-chars-threshold) (not (exotic-choice? random)))
|
||||||
(or (< attempt ascii-chars-threshold)
|
(let ([i (random (add1 (- (char->integer #\z) (char->integer #\a))))]
|
||||||
(not (exotic-choice? random))))
|
[cap? (zero? (random 2))])
|
||||||
(pick-from-list lang-chars random)
|
(integer->char (+ i (char->integer (if cap? #\A #\a)))))]
|
||||||
(if (or (< attempt tex-chars-threshold) (not (exotic-choice? random)))
|
[(or (< attempt tex-chars-threshold) (not (exotic-choice? random)))
|
||||||
(let ([i (random (- #x7E #x20 1))]
|
(let ([i (random (- #x7E #x20 1))]
|
||||||
[_ (- (char->integer #\_) #x20)])
|
[_ (- (char->integer #\_) #x20)])
|
||||||
(integer->char (+ #x20 (if (= i _) (add1 i) i))))
|
(integer->char (+ #x20 (if (= i _) (add1 i) i))))]
|
||||||
(if (or (< attempt chinese-chars-threshold) (not (exotic-choice? random)))
|
[(or (< attempt chinese-chars-threshold) (not (exotic-choice? random)))
|
||||||
(car (string->list (pick-from-list (map cadr tex-shortcut-table) random)))
|
(car (string->list (pick-from-list (map cadr tex-shortcut-table) random)))]
|
||||||
(integer->char (+ #x4E00 (random (- #x9FCF #x4E00))))))))
|
[else
|
||||||
|
(integer->char (+ #x4E00 (random (- #x9FCF #x4E00))))]))
|
||||||
|
|
||||||
(define (random-string lang-chars lang-lits length attempt [random random])
|
(define (random-string lang-lits length attempt [random random])
|
||||||
(if (and (not (null? lang-lits)) (use-lang-literal? random))
|
(if (and (not (null? lang-lits)) (use-lang-literal? random))
|
||||||
(pick-from-list lang-lits random)
|
(pick-from-list lang-lits random)
|
||||||
(list->string (build-list length (λ (_) (pick-char attempt lang-chars random))))))
|
(list->string (build-list length (λ (_) (pick-char attempt random))))))
|
||||||
|
|
||||||
(define (pick-any lang sexp [random random])
|
(define (pick-any lang sexp [random random])
|
||||||
(let ([c-lang (rg-lang-clang lang)]
|
(let ([c-lang (rg-lang-clang lang)]
|
||||||
|
@ -61,8 +54,8 @@
|
||||||
(values lang (pick-from-list (map nt-name (compiled-lang-lang c-lang)) random))
|
(values lang (pick-from-list (map nt-name (compiled-lang-lang c-lang)) random))
|
||||||
(values sexp (nt-name (car (compiled-lang-lang c-sexp)))))))
|
(values sexp (nt-name (car (compiled-lang-lang c-sexp)))))))
|
||||||
|
|
||||||
(define (pick-string lang-chars lang-lits attempt [random random])
|
(define (pick-string lang-lits attempt [random random])
|
||||||
(random-string lang-chars lang-lits (random-natural 1/5 random) attempt random))
|
(random-string lang-lits (random-natural 1/5 random) attempt random))
|
||||||
|
|
||||||
(define (pick-nt name cross? lang attempt pref-prods
|
(define (pick-nt name cross? lang attempt pref-prods
|
||||||
[random random]
|
[random random]
|
||||||
|
@ -172,11 +165,11 @@
|
||||||
[min-size (apply min/f sizes)])
|
[min-size (apply min/f sizes)])
|
||||||
(map cadr (filter (λ (x) (equal? min-size (car x))) (zip sizes (nt-rhs nt))))))
|
(map cadr (filter (λ (x) (equal? min-size (car x))) (zip sizes (nt-rhs nt))))))
|
||||||
|
|
||||||
(define-struct rg-lang (clang lits chars base-cases))
|
(define-struct rg-lang (clang lits base-cases))
|
||||||
(define (prepare-lang lang)
|
(define (prepare-lang lang)
|
||||||
(let ([lits (map symbol->string (compiled-lang-literals lang))]
|
(let ([lits (map symbol->string (compiled-lang-literals lang))]
|
||||||
[parsed (parse-language lang)])
|
[parsed (parse-language lang)])
|
||||||
(make-rg-lang parsed lits (unique-chars lits) (find-base-cases parsed))))
|
(make-rg-lang parsed lits (find-base-cases parsed))))
|
||||||
|
|
||||||
(define (generate lang decisions@ user-gen retries what)
|
(define (generate lang decisions@ user-gen retries what)
|
||||||
(define-values/invoke-unit decisions@
|
(define-values/invoke-unit decisions@
|
||||||
|
@ -309,8 +302,7 @@
|
||||||
(λ (var _) (not (memq var vars)))
|
(λ (var _) (not (memq var vars)))
|
||||||
size attempt)]
|
size attempt)]
|
||||||
[`variable
|
[`variable
|
||||||
(values ((next-variable-decision)
|
(values ((next-variable-decision) (rg-lang-lits lang) attempt)
|
||||||
(rg-lang-chars lang) (rg-lang-lits lang) attempt)
|
|
||||||
env)]
|
env)]
|
||||||
[`variable-not-otherwise-mentioned
|
[`variable-not-otherwise-mentioned
|
||||||
(generate/pred 'variable
|
(generate/pred 'variable
|
||||||
|
@ -323,7 +315,7 @@
|
||||||
(let-values ([(term env) (recur/pat 'variable)])
|
(let-values ([(term env) (recur/pat 'variable)])
|
||||||
(values (symbol-append prefix term) env))]
|
(values (symbol-append prefix term) env))]
|
||||||
[`string
|
[`string
|
||||||
(values ((next-string-decision) (rg-lang-chars lang) (rg-lang-lits lang) attempt)
|
(values ((next-string-decision) (rg-lang-lits lang) attempt)
|
||||||
env)]
|
env)]
|
||||||
[`(side-condition ,pat ,(? procedure? condition))
|
[`(side-condition ,pat ,(? procedure? condition))
|
||||||
(generate/pred (unparse-pattern pat)
|
(generate/pred (unparse-pattern pat)
|
||||||
|
@ -998,5 +990,5 @@
|
||||||
proportion-before-threshold post-threshold-incr
|
proportion-before-threshold post-threshold-incr
|
||||||
is-nt? nt-by-name min-prods
|
is-nt? nt-by-name min-prods
|
||||||
generation-decisions decisions^
|
generation-decisions decisions^
|
||||||
random-string unique-chars
|
random-string
|
||||||
sexp find-base-cases)
|
sexp find-base-cases)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user