|
1 | 1 | using Distributions: Distribution
|
2 | 2 | using LinearAlgebra: qr
|
3 |
| -using Random: AbstractRNG, Sampler, default_rng |
| 3 | +using Random: AbstractRNG, default_rng |
4 | 4 |
|
5 | 5 | import Random: rand
|
6 | 6 |
|
7 | 7 | export EigvalsSampler, EigvecsSampler
|
8 | 8 |
|
9 |
| -struct EigvalsSampler{R<:AbstractRNG,T,D<:Distribution} <: Sampler{T} |
| 9 | +abstract type Sampler{R<:AbstractRNG,D<:Distribution} end |
| 10 | + |
| 11 | +struct EigvalsSampler{R,D} <: Sampler{R,D} |
10 | 12 | rng::R
|
11 |
| - type::T |
12 | 13 | dist::D
|
13 |
| - function EigvalsSampler(dist, type=Float64, rng=default_rng()) |
14 |
| - return new{typeof(rng),typeof(type),typeof(dist)}(rng, type, dist) |
| 14 | + function EigvalsSampler(dist, rng=default_rng()) |
| 15 | + return new{typeof(rng),typeof(dist)}(rng, dist) |
15 | 16 | end
|
16 | 17 | end
|
17 | 18 |
|
18 |
| -struct EigvecsSampler{R<:AbstractRNG,T,D<:Distribution} <: Sampler{T} |
| 19 | +struct EigvecsSampler{R,D} <: Sampler{R,D} |
19 | 20 | rng::R
|
20 |
| - type::T |
21 | 21 | dist::D
|
22 |
| - EigvecsSampler(dist, type=Float64, rng=default_rng()) = |
23 |
| - new{typeof(rng),typeof(type),typeof(dist)}(rng, type, dist) |
| 22 | + EigvecsSampler(dist, rng=default_rng()) = new{typeof(rng),typeof(dist)}(rng, dist) |
24 | 23 | end
|
25 | 24 |
|
26 | 25 | function Hamiltonian(s₁::EigvalsSampler, s₂::EigvecsSampler, m::Integer)
|
27 | 26 | evals, evecs = sort(rand(s₁, m)), collect(rand(s₂, m, m))
|
28 | 27 | return Hamiltonian(Eigen(evals, evecs))
|
29 | 28 | end
|
30 | 29 |
|
31 |
| -rand(s::EigvalsSampler, dims::Integer...) = rand(s.rng, s.dist, dims...) .* oneunit(s.type) |
| 30 | +rand(s::EigvalsSampler, dims::Integer...) = rand(s.rng, s.dist, dims...) |
32 | 31 | function rand(s::EigvecsSampler, m::Integer, n::Integer)
|
33 |
| - matrix = rand(s.rng, s.dist, m, n) .* oneunit(s.type) |
| 32 | + matrix = rand(s.rng, s.dist, m, n) |
34 | 33 | q, _ = qr(matrix)
|
35 | 34 | return collect(q)
|
36 | 35 | end
|
0 commit comments