Skip to content

Commit 61cff27

Browse files
authored
Merge pull request #1 from Provisdom/kwill/docs
add docs
2 parents e6b3b25 + 11b54e9 commit 61cff27

File tree

6 files changed

+412
-72
lines changed

6 files changed

+412
-72
lines changed

bin/kaocha

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env bash
2+
3+
clojure -M:test:test-clj-runner "$@"

deps.edn

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@
44
:sha "401e177f3a4d806dffe54379f07ad0a02632eb9a"}
55
provisdom/utility-belt {:git/url "https://github.com/Provisdom/utility-belt.git"
66
:sha "a85f733d736727c458a6cd7909f8de482883b9fe"}}
7-
:aliases {:dev {:extra-paths ["siderail"]}
7+
:aliases {:dev {:extra-paths ["siderail"]}
88
:local {:override-deps {provisdom/math {:local/root "../math"}
99
provisdom/utility-belt {:local/root "../utility-belt"}}}
10-
:test {:extra-paths ["test" "siderail"]
11-
:extra-deps {com.cognitect/transcriptor {:mvn/version "0.1.5"}
12-
criterium/criterium {:mvn/version "0.4.6"}
13-
orchestra/orchestra {:mvn/version "2021.01.01-1"}
14-
org.clojure/test.check {:mvn/version "1.1.1"}
15-
provisdom/test {:git/url "https://github.com/Provisdom/test.git"
16-
:sha "f62afc093223dff1830a0142bd076ab89cbdef6c"}}}
17-
:test-runner {:extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"}
18-
lambdaisland/kaocha-junit-xml {:mvn/version "1.17.101"}}
19-
:main-opts ["-m" "kaocha.runner"]}}}
10+
:test {:extra-paths ["test" "siderail"]
11+
:extra-deps {criterium/criterium {:mvn/version "0.4.6"}
12+
orchestra/orchestra {:mvn/version "2021.01.01-1"}
13+
org.clojure/test.check {:mvn/version "1.1.1"}
14+
provisdom/test {:git/url "https://github.com/Provisdom/test.git"
15+
:sha "f62afc093223dff1830a0142bd076ab89cbdef6c"}}}
16+
:test-clj-runner {:extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"}
17+
lambdaisland/kaocha-junit-xml {:mvn/version "1.17.101"}}
18+
:main-opts ["-m" "kaocha.runner"]}}}

src/data_readers.clj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{apache-math/vector provisdom.apache-math.apache-vector/apache-vector
2+
apache-math/matrix provisdom.apache-math.apache-matrix/->apache-matrix}

src/provisdom/apache_math/alternative_random.clj

Lines changed: 94 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
(ns provisdom.apache-math.alternative-random
2+
"Alternative random number generators from Apache Commons Math.
3+
4+
Provides specialized random number generators beyond basic uniform random:
5+
- Quasi-random sequences with better coverage (Sobol sequences)
6+
- Cryptographically secure random numbers (ISAAC)
7+
- Fast, high-quality pseudorandom numbers (Mersenne Twister)
8+
9+
Example usage:
10+
(def quasi-seq (quasi-rnd-vector-lazy 2))
11+
(take 3 quasi-seq) ;=> [[0.0 0.0] [0.5 0.5] [0.75 0.25]]"
212
(:require
313
[clojure.spec.alpha :as s]
414
[clojure.spec.gen.alpha :as gen]
@@ -27,9 +37,20 @@
2737

2838
;;;APACHE RANDOM NUMBER GENERATORS
2939
(defn quasi-rng
30-
"Creates an Apache RNG with better coverage but more predictable through a
31-
lazy sequence of vectors of size `dimensions`. Because of predictability, can
32-
be better for a single use simulation."
40+
"Creates a Sobol quasi-random number generator for improved uniform coverage.
41+
42+
Quasi-random sequences provide better distribution coverage than pseudorandom
43+
sequences, making them ideal for Monte Carlo simulations and numerical integration.
44+
However, they are more predictable and should not be used for cryptographic purposes.
45+
46+
Parameters:
47+
dimensions - number of dimensions for each generated vector (1-1000)
48+
49+
Returns Apache Commons SobolSequenceGenerator instance.
50+
51+
Example:
52+
(def qrng (quasi-rng 2))
53+
(.nextVector qrng) ;=> [0.0 0.0]"
3354
[dimensions]
3455
(SobolSequenceGenerator. ^long dimensions))
3556

@@ -38,9 +59,20 @@
3859
:ret ::apache-rng)
3960

4061
(defn quasi-rnd-vector-lazy
41-
"Better coverage but more predictable through a lazy sequence of vectors of
42-
size `dimensions`. Because of predictability, can be better for a single use
43-
simulation."
62+
"Returns lazy sequence of quasi-random vectors with improved coverage.
63+
64+
Generates an infinite lazy sequence of vectors using Sobol quasi-random sequences.
65+
Each vector contains `dimensions` numbers in [0,1). Provides better uniform
66+
coverage than pseudorandom sequences, making it superior for Monte Carlo methods.
67+
68+
Parameters:
69+
dimensions - size of each vector (1-1000)
70+
71+
Returns lazy sequence of vectors with quasi-random numbers.
72+
73+
Example:
74+
(take 3 (quasi-rnd-vector-lazy 2))
75+
;=> [[0.0 0.0] [0.5 0.5] [0.75 0.25]]"
4476
[dimensions]
4577
(let [qr (quasi-rng dimensions)]
4678
(repeatedly #(vec (.nextVector ^SobolSequenceGenerator qr)))))
@@ -50,8 +82,20 @@
5082
:ret (s/every ::rnd-vector))
5183

5284
(defn secure-rng
53-
"Creates an Apache RNG that is less predictable but slower RNG than Mersenne
54-
Twister."
85+
"Creates cryptographically secure random number generator using ISAAC algorithm.
86+
87+
ISAAC (Indirection, Shift, Accumulate, Add, and Count) provides cryptographically
88+
secure random numbers suitable for security applications. Slower than Mersenne
89+
Twister but much less predictable.
90+
91+
Parameters:
92+
seed - long integer seed for reproducible sequences
93+
94+
Returns Apache Commons ISAACRandom instance.
95+
96+
Example:
97+
(def secure-gen (secure-rng 12345))
98+
(.nextDouble secure-gen) ;=> 0.26673862796330083"
5599
[seed]
56100
(ISAACRandom. ^long seed))
57101

@@ -60,7 +104,20 @@
60104
:ret ::apache-rng)
61105

62106
(defn secure-rnd-lazy
63-
"A less predictable but slower rnd-lazy than Mersenne Twister."
107+
"Returns lazy sequence of cryptographically secure random numbers.
108+
109+
Generates an infinite lazy sequence of random doubles in [0,1) using the ISAAC
110+
algorithm. Provides cryptographic security but at the cost of performance.
111+
Each call creates a new generator instance.
112+
113+
Parameters:
114+
seed - long integer seed for reproducible sequences
115+
116+
Returns lazy sequence of secure random doubles.
117+
118+
Example:
119+
(take 5 (secure-rnd-lazy 42))
120+
;=> (0.123... 0.456... 0.789...)"
64121
[seed]
65122
(repeatedly #(.nextDouble ^ISAACRandom (secure-rng seed))))
66123

@@ -69,7 +126,20 @@
69126
:ret ::rnd-lazy)
70127

71128
(defn mersenne-rng
72-
"Creates an Apache RNG using `seed`."
129+
"Creates Mersenne Twister random number generator.
130+
131+
Mersenne Twister is a fast, high-quality pseudorandom number generator with
132+
excellent statistical properties and a very long period (2^19937-1). Suitable
133+
for most simulation work but not cryptographically secure.
134+
135+
Parameters:
136+
seed - long integer seed for reproducible sequences
137+
138+
Returns Apache Commons MersenneTwister instance.
139+
140+
Example:
141+
(def mt-gen (mersenne-rng 12345))
142+
(.nextDouble mt-gen) ;=> 0.8335762378570932"
73143
[seed]
74144
(MersenneTwister. ^long seed))
75145

@@ -78,7 +148,20 @@
78148
:ret ::apache-rng)
79149

80150
(defn mersenne-rnd-lazy
81-
"Returns rnd-lazy using `seed`."
151+
"Returns lazy sequence of high-quality pseudorandom numbers.
152+
153+
Generates an infinite lazy sequence of random doubles in [0,1) using the
154+
Mersenne Twister algorithm. Provides excellent statistical properties and
155+
performance for most simulation needs. Each call creates a new generator instance.
156+
157+
Parameters:
158+
seed - long integer seed for reproducible sequences
159+
160+
Returns lazy sequence of pseudorandom doubles.
161+
162+
Example:
163+
(take 5 (mersenne-rnd-lazy 42))
164+
;=> (0.833... 0.150... 0.271...)"
82165
[seed]
83166
(repeatedly #(.nextDouble ^MersenneTwister (mersenne-rng seed))))
84167

0 commit comments

Comments
 (0)