Skip to content

Commit

Permalink
Add type Sampler & redefine EigvalsSampler & EigvecsSampler
Browse files Browse the repository at this point in the history
  • Loading branch information
singularitti committed Oct 29, 2024
1 parent b0605ca commit b796ca5
Showing 1 changed file with 10 additions and 11 deletions.
21 changes: 10 additions & 11 deletions src/distributions.jl
Original file line number Diff line number Diff line change
@@ -1,36 +1,35 @@
using Distributions: Distribution
using LinearAlgebra: qr
using Random: AbstractRNG, Sampler, default_rng
using Random: AbstractRNG, default_rng

import Random: rand

export EigvalsSampler, EigvecsSampler

struct EigvalsSampler{R<:AbstractRNG,T,D<:Distribution} <: Sampler{T}
abstract type Sampler{R<:AbstractRNG,D<:Distribution} end

struct EigvalsSampler{R,D} <: Sampler{R,D}
rng::R
type::T
dist::D
function EigvalsSampler(dist, type=Float64, rng=default_rng())
return new{typeof(rng),typeof(type),typeof(dist)}(rng, type, dist)
function EigvalsSampler(dist, rng=default_rng())
return new{typeof(rng),typeof(dist)}(rng, dist)
end
end

struct EigvecsSampler{R<:AbstractRNG,T,D<:Distribution} <: Sampler{T}
struct EigvecsSampler{R,D} <: Sampler{R,D}
rng::R
type::T
dist::D
EigvecsSampler(dist, type=Float64, rng=default_rng()) =
new{typeof(rng),typeof(type),typeof(dist)}(rng, type, dist)
EigvecsSampler(dist, rng=default_rng()) = new{typeof(rng),typeof(dist)}(rng, dist)
end

function Hamiltonian(s₁::EigvalsSampler, s₂::EigvecsSampler, m::Integer)
evals, evecs = sort(rand(s₁, m)), collect(rand(s₂, m, m))
return Hamiltonian(Eigen(evals, evecs))
end

rand(s::EigvalsSampler, dims::Integer...) = rand(s.rng, s.dist, dims...) .* oneunit(s.type)
rand(s::EigvalsSampler, dims::Integer...) = rand(s.rng, s.dist, dims...)
function rand(s::EigvecsSampler, m::Integer, n::Integer)
matrix = rand(s.rng, s.dist, m, n) .* oneunit(s.type)
matrix = rand(s.rng, s.dist, m, n)
q, _ = qr(matrix)
return collect(q)
end

0 comments on commit b796ca5

Please sign in to comment.