Skip to content

Commit 1182d12

Browse files
committed
added fibonacci-rank-1 to watson
1 parent 0a97ab8 commit 1182d12

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

model/distributions/sphere/watson/fibonachi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def __init__(self):
2222
]
2323

2424
def get_name(self):
25-
return "Fibonacci Lattice"
25+
return "Fibonacci-Kronecker Lattice"
2626

2727

2828
def sample(self, sample_options, distribution_options):
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from abc import ABC, abstractmethod
2+
from matplotlib.pyplot import grid
3+
import numpy as np
4+
import scipy
5+
import scipy.integrate
6+
import scipy.interpolate
7+
import sphstat
8+
from pyrecest.backend import array
9+
from pyrecest.distributions import WatsonDistribution as WatsonDistributionPyrecest
10+
from scipy.special import erf, erfi, erfinv
11+
12+
from model.distributions.cylinder.uniform.fibonacci_rank_1 import CylinderFibRank1UniformSampling
13+
from model.distributions.sphere.sphere_sampling_schema import SphereSamplingSchema
14+
from util.selectors.slider_fib import SliderFib
15+
from model.sphere.sphere import Sphere
16+
from util.selectors.silder_manual_input_wrapper import SliderManualInputWrapper as MI
17+
from model.distributions.sphere.watson.fibonachi import WatsonFibonachiSampling as wf
18+
19+
20+
21+
class WatsonFibonachiRank1Sampling(SphereSamplingSchema):
22+
def __init__(self):
23+
self.sample_options = [
24+
MI(SliderFib("Number of Samples", 3, 33, 21, 9, minus_1=True)),
25+
]
26+
self.sampler = CylinderFibRank1UniformSampling()
27+
28+
29+
def get_name(self):
30+
return "Fibonacci-Rank-1 Lattice"
31+
32+
33+
def sample(self, sample_options, distribution_options):
34+
35+
sample_count = sample_options[0].state + 1 # because minus_1 is true slider displays fib(n)-1
36+
k = distribution_options[0].state # kappa
37+
38+
x, y = self.sampler.get_rank_1(sample_count, sample_options[0].idx, without_first_point=True)
39+
40+
x = 2*x -1 # map x from [0,1] to [-1, 1]
41+
phi = 2 * np.pi * y # azimuthal angle, [0, 2pi] uniform
42+
43+
if k > 0:
44+
w = 1 / (np.sqrt(k)) * wf.erfi_inv( x * erfi(np.sqrt(k)) )
45+
elif k < 0:
46+
la = -k
47+
w = 1 / (np.sqrt(la)) * erfinv( x * erf(np.sqrt(la)) )
48+
elif k == 0:
49+
w = x
50+
51+
52+
w = np.clip(w, -1.0, 1.0) # clamp to avoid sqrt warnings due to numerical issues
53+
54+
x_i_f_0 = w
55+
x_i_f_1 = np.sqrt(1-w**2) * np.cos( phi)
56+
x_i_f_2 = np.sqrt(1-w**2) * np.sin( phi)
57+
x_i_f = np.column_stack((x_i_f_1, x_i_f_2, x_i_f_0)) # order so that mu=[0, 0, 1]
58+
return x_i_f

model/distributions/sphere/watson/watson.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from model.distributions.sphere.watson.random_sampling import WatsonRandomSampling
1111
from model.distributions.sphere.watson.fibonachi import WatsonFibonachiSampling
1212
from model.distributions.sphere.watson.cartesian import WatsonCartesianSampling
13+
from model.distributions.sphere.watson.fibonachi_rank1 import WatsonFibonachiRank1Sampling
1314

1415

1516
class WatsonDistribution(SphereDistribution):
@@ -22,6 +23,7 @@ def __init__(self):
2223
WatsonRandomSampling(),
2324
WatsonFibonachiSampling(),
2425
WatsonCartesianSampling(),
26+
WatsonFibonachiRank1Sampling(),
2527
]
2628

2729
def get_name(self):

0 commit comments

Comments
 (0)