aboutsummaryrefslogtreecommitdiffstats
path: root/sphere.scm
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-02-13 19:16:46 -0500
committerGravatar Peter McGoron 2025-02-13 19:16:46 -0500
commit222fa889651d0c80164467d201652ed75486daf9 (patch)
treecd1fddcc88b0545e441d736544375f8d2dee57a3 /sphere.scm
parentuse CHICKEN SRFI-27 generators whenever possible (diff)
add types, fix vector-copy! shadowing
Diffstat (limited to '')
-rw-r--r--sphere.scm10
1 files changed, 10 insertions, 0 deletions
diff --git a/sphere.scm b/sphere.scm
index 186bab5..ca153c1 100644
--- a/sphere.scm
+++ b/sphere.scm
@@ -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