begin implementing input space partitioning

This commit is contained in:
xenia 2020-11-04 01:28:15 -05:00
parent 56d53b8a8f
commit 37a0c76455
2 changed files with 40 additions and 19 deletions

View File

@ -34,13 +34,18 @@ typedef struct {
int main() {
char buf [ @(* 20 (vector-length pattern)) ];
@(for/list ([num (in-naturals)] [cset (in-vector pattern)])
@list{size_t @(format "i~a" num) ;
vartype @(format "v~a" num) ;
})
@(for/list ([num (in-naturals)] [cset (in-vector pattern)])
(define iter (format "i~a" num))
(define viter (format "v~a" num))
(define iset (format "iset~a" num))
@list{
for (size_t @iter = 0; @iter < @iset @".length" ; @iter ++) @"{"
for (vartype @viter = @iset .values[ @iter ].start; @viter < @iset .values[ @iter ].end; @viter ++) @"{"
for (@iter = 0; @iter < @iset @".length" ; @iter ++) @"{"
for (@viter = @iset .values[ @iter ].start; @viter < @iset .values[ @iter ].end; @viter ++) @"{"
})
@ -48,9 +53,12 @@ int main() {
(string-join (for/list ([i (in-range (vector-length pattern))]) (format "v~a" i)) ","))
@(define fmt
(string-join (for/list ([i (in-range (vector-length pattern))]) c-type-fmt) " "))
l_inner:
ssize_t res = snprintf(buf, sizeof(buf), @(format "\"~a\\n\"" fmt), @vs );
fwrite(buf, res, 1, stdout);
@(for/list ([cset (in-vector pattern)]) "}}")
l_end:
return 0;
}

View File

@ -67,6 +67,23 @@
(iset-merge (iset-insert iset start end)))
(define (iset-count iset)
(for/sum ([ival (in-list iset)])
(- (cdr ival) (car ival))))
;; converts a position of [0, iset-count) to 2 values
;; - iset interval number
;; - actual value within the interval
(define (pos->iset-pos iset pos)
(when (empty? iset)
(error "iset-pos out of range"))
(match-define (cons (cons fs fe) r) iset)
(define delta (- fe fs))
(if (< pos delta)
(values 0 (+ fs pos))
(let-values ([(inum val) (pos->iset-pos r (- pos delta))])
(values (add1 inum) val))))
(define (char->iset ch)
(define cp (char->integer ch))
(iset-add (make-iset) cp (add1 cp)))
@ -128,10 +145,6 @@
;; pattern processing
(define (iset-count iset)
(for/sum ([ival (in-list iset)])
(- (cdr ival) (car ival))))
(define (pattern-count pattern)
(for/fold ([sum 1]) ([p (in-vector pattern)])
(* sum (iset-count p))))
@ -139,19 +152,19 @@
;; design recipe violations follow
;; (sorry)
;; (i wanted this to be fast so i try to avoid spamming the heap)
(define (pattern-generate pattern out-port)
(define len (vector-length pattern))
(define gen (make-bytes len))
(define (output gen)
(write-bytes gen out-port)
(printf "\n"))
(define (permute i gen)
(cond [(= i len) (output gen)]
[else
(for ([chr (in-set (vector-ref pattern i))])
(bytes-set! gen i chr)
(permute (add1 i) gen))]))
(permute 0 gen))
; (define (pattern-generate pattern out-port)
; (define len (vector-length pattern))
; (define gen (make-bytes len))
; (define (output gen)
; (write-bytes gen out-port)
; (printf "\n"))
; (define (permute i gen)
; (cond [(= i len) (output gen)]
; [else
; (for ([chr (in-set (vector-ref pattern i))])
; (bytes-set! gen i chr)
; (permute (add1 i) gen))]))
; (permute 0 gen))
;; ok gamer move time
(define-runtime-path codegen-template "codegen.template")