diff options
| author | 2025-02-13 19:16:46 -0500 | |
|---|---|---|
| committer | 2025-02-13 19:16:46 -0500 | |
| commit | 222fa889651d0c80164467d201652ed75486daf9 (patch) | |
| tree | cd1fddcc88b0545e441d736544375f8d2dee57a3 /sphere.scm | |
| parent | use CHICKEN SRFI-27 generators whenever possible (diff) | |
add types, fix vector-copy! shadowing
Diffstat (limited to '')
| -rw-r--r-- | sphere.scm | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -14,7 +14,13 @@ ;;; distributed on an N-dimensional sphere. ;;; This implements the BoxMeuller algorithm, that is, of normalizing ;;; N+1 Gaussian random variables. +;;; +;;; NOTE: These would be better as f64vectors, but the SRFI uses standard +;;; Scheme vectors. +(define-type real (or integer float ratnum)) + +(: make-sphere-generator (fixnum -> (-> (vector-of float)))) (define (make-sphere-generator arg) (cond ((and (integer? arg) @@ -24,6 +30,7 @@ (else (error "make-sphere-generator: The argument must be a positive exact integer: " arg)))) +(: make-ellipsoid-generator ((vector-of real) -> (-> (vector-of float)))) (define (make-ellipsoid-generator arg) (define (return-error) @@ -54,6 +61,7 @@ ;;; and `B`, `C`, `D`, ... are the other axes. Maximum performance ;;; is achieved on spheres, which is the case used in make-ball-generator +(: make-ellipsoid-generator* ((vector-of float) -> (-> (vector-of float)))) (define (make-ellipsoid-generator* axes) (let ((gauss (make-normal-generator)) (uniform (make-random-real-generator 0. 1.)) ;; should really be from a separate stream @@ -101,6 +109,7 @@ ;;; which in turn is based on the Harman-Lacko-Voelker Dropped Coordinate method for ;;; generating points uniformly inside the unit ball in N dimensions. +(: make-ball-generator ((or fixnum (vector-of real)) -> (-> (vector-of float)))) (define (make-ball-generator arg) (define (return-error) @@ -121,6 +130,7 @@ (return-error))) (return-error)))) +(: make-ball-generator* ((vector-of float) -> (-> (vector-of float)))) (define (make-ball-generator* axes) (let* ((sphere-generator ;; returns vectors with (vector-length axes) + 2 elements |
