|
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