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
0 commit comments