File testcases/gaussian_2D.py changed (mode: 100644) (index 248a233..16490c9) |
... |
... |
of different Gaussian 2D problems |
9 |
9 |
import numpy as np |
import numpy as np |
10 |
10 |
from .. import g_models as gm |
from .. import g_models as gm |
11 |
11 |
from .. import f_models |
from .. import f_models |
12 |
|
from ..whitebox import WhiteBox |
|
|
12 |
|
from .. import samplebox #č pro proxy_prod |
|
13 |
|
from ..whitebox import WhiteBox, Gaussian_Z_prod_2D, Gaussian_ProdFourBetas_2D |
13 |
14 |
|
|
14 |
15 |
__all__ = [] |
__all__ = [] |
15 |
16 |
|
|
|
... |
... |
def min_logistic(): |
91 |
92 |
add('prod_1') |
add('prod_1') |
92 |
93 |
add('prod_5') |
add('prod_5') |
93 |
94 |
def prod_1(): |
def prod_1(): |
94 |
|
return WhiteBox(f, gm.Z_prod(const=1)) |
|
|
95 |
|
return Gaussian_Z_prod_2D(const=1) |
95 |
96 |
def prod_5(): |
def prod_5(): |
96 |
|
return WhiteBox(f, gm.Z_prod(const=5)) |
|
|
97 |
|
return Gaussian_Z_prod_2D(const=-5) |
97 |
98 |
|
|
98 |
|
gm_z_prod = gm.Z_prod(const=5) |
|
99 |
99 |
|
|
100 |
|
def proxy_prod(input_sample): |
|
101 |
|
# očekávam, že get_R_coordinates mně vrátí 2D pole |
|
102 |
|
sample = gm.get_R_coordinates(input_sample, 2) |
|
103 |
|
x, y = sample.T |
|
|
100 |
|
|
|
101 |
|
class ProxyProd: |
|
102 |
|
def __init__(self, const=0): |
|
103 |
|
self.const = const |
|
104 |
|
#assert (const * sign) > 0 |
|
105 |
|
#self.sign = sign |
|
106 |
|
self.true_gm = gm.Z_prod(const=const, sign=np.sign(self.const)) |
|
107 |
|
# wrap |
|
108 |
|
self.get_2D_R_boundary = self.true_gm.get_2D_R_boundary |
104 |
109 |
|
|
105 |
|
# osudná podmínka |
|
106 |
|
mask = np.atleast_1d(np.sign(x)==np.sign(y)).astype(bool) |
|
107 |
|
#č mrdáme na kontrolu. současný startup candybox vytvoří vždycky |
|
108 |
|
input_sample.candybox.proxy = mask |
|
109 |
|
sweet_sample = input_sample |
|
110 |
|
#sweet_sample = CandyBox(input_sample, proxy=mask) |
|
111 |
|
|
|
112 |
|
# zatím, pro jednoduchost, předpokladáme, |
|
113 |
|
# že dostaváme vzorky po jednom |
|
114 |
|
if np.all(mask): |
|
115 |
|
# nevíme vůbec, co to je za funkci |
|
116 |
|
# ale veříme, že víme co tam bude |
|
117 |
|
g = np.full(len(sweet_sample), 1) |
|
118 |
|
# s praznejm podpísem odmítá |
|
119 |
|
return samplebox.SampleBox(sweet_sample, g, 'proxy_prod') |
|
|
110 |
|
# sign |
|
111 |
|
def __repr__(self): |
|
112 |
|
return 'ProxyProd(const=%s)' % repr(self.const) |
|
113 |
|
|
|
114 |
|
def __call__(self, input_sample): |
|
115 |
|
#č očekávam, že get_R_coordinates mně vrátí 2D pole |
|
116 |
|
sample = gm.get_R_coordinates(input_sample, 2) |
|
117 |
|
x, y = sample.T |
120 |
118 |
|
|
121 |
|
else: # deme počítat, bez b |
|
122 |
|
true_sample = gm_z_prod(sweet_sample) |
|
123 |
|
# padelame pospís |
|
124 |
|
true_sample.gm_signature = 'proxy_prod' |
|
125 |
|
return true_sample |
|
|
119 |
|
#č osudná podmínka |
|
120 |
|
mask = np.atleast_1d(np.sign(x)==(np.sign(y)*np.sign(self.const))) |
|
121 |
|
#č mrdáme na kontrolu. současný startup candybox vytvoří vždycky |
|
122 |
|
input_sample.candybox.proxy = mask |
|
123 |
|
sweet_sample = input_sample |
|
124 |
|
#sweet_sample = CandyBox(input_sample, proxy=mask) |
|
125 |
|
|
|
126 |
|
#č zatím, pro jednoduchost, předpokladáme, |
|
127 |
|
#č že dostaváme vzorky po jednom |
|
128 |
|
if np.all(mask): |
|
129 |
|
#č nevíme vůbec, co to je za funkci |
|
130 |
|
#č ale veříme, že víme co tam bude |
|
131 |
|
g = np.full(len(sweet_sample), 1) |
|
132 |
|
#č s praznejm podpísem odmítá |
|
133 |
|
return samplebox.SampleBox(sweet_sample, g, repr(self)) |
|
134 |
|
|
|
135 |
|
else: #č deme počítat, bez b |
|
136 |
|
true_sample = self.true_gm(sweet_sample) |
|
137 |
|
#č padelame pospís |
|
138 |
|
true_sample.gm_signature = repr(self) |
|
139 |
|
return true_sample |
|
140 |
|
|
|
141 |
|
|
|
142 |
|
def _proxy_prod(const): |
|
143 |
|
wt = Gaussian_Z_prod_2D(const=const) |
|
144 |
|
wt.gm = ProxyProd(const) |
|
145 |
|
#č padelame pospís |
|
146 |
|
wt.samplebox.gm_signature = repr(wt.gm) |
|
147 |
|
return wt |
126 |
148 |
|
|
127 |
|
# wrap |
|
128 |
|
proxy_prod.get_2D_R_boundary = gm_z_prod.get_2D_R_boundary |
|
|
149 |
|
add('proxy_prod_1') |
|
150 |
|
def proxy_prod_1(): |
|
151 |
|
return _proxy_prod(1) |
129 |
152 |
|
|
130 |
153 |
add('proxy_prod_5') |
add('proxy_prod_5') |
131 |
154 |
def proxy_prod_5(): |
def proxy_prod_5(): |
132 |
|
return WhiteBox(f, proxy_prod) |
|
|
155 |
|
return _proxy_prod(-5) |
133 |
156 |
|
|
134 |
157 |
|
|
135 |
158 |
""" |
""" |
|
... |
... |
def sin_shields(): |
170 |
193 |
# beta == sqrt(30) |
# beta == sqrt(30) |
171 |
194 |
add('prod_four_betas') |
add('prod_four_betas') |
172 |
195 |
def prod_four_betas(): |
def prod_four_betas(): |
173 |
|
return WhiteBox(f, gm.Prod_FourBetas(beta=np.sqrt(30))) |
|
|
196 |
|
return Gaussian_ProdFourBetas_2D(beta=np.sqrt(30)) |
174 |
197 |
|
|
175 |
198 |
|
|
176 |
199 |
|
|
File whitebox.py changed (mode: 100644) (index a7f4909..05cfad7) |
... |
... |
class Gaussian_Z_prod_2D(WhiteBox): |
352 |
352 |
return 'Gaussian_Z_prod_2D' |
return 'Gaussian_Z_prod_2D' |
353 |
353 |
|
|
354 |
354 |
def __repr__(wt): |
def __repr__(wt): |
355 |
|
return 'Gaussian_Z_prod_2D(sign=%s, const=%s)' % (wt.sign, wt.const) |
|
|
355 |
|
return 'Gaussian_Z_prod_2D(const=%s)' % wt.const |
|
356 |
|
|
|
357 |
|
#č já jsem si najednou uvědomil, že v tomto modulu |
|
358 |
|
#č mám náprosto hrozný mix Camel- a snailcas'u. |
|
359 |
|
#č Výmluvím z toho tak, podtržitko odděluje rozdělení a nazev g-modelu |
|
360 |
|
class Gaussian_ProdFourBetas_2D(WhiteBox): |
|
361 |
|
def __init__(self, beta=2): |
|
362 |
|
""" |
|
363 |
|
Breitung RESS 182 (2019) p. 99 |
|
364 |
|
""" |
|
365 |
|
assert beta > 0 |
|
366 |
|
self.beta = beta |
|
367 |
|
self.const = self.beta**2/2 |
|
368 |
|
|
|
369 |
|
self.gm = g_models.Prod_FourBetas(self.beta) |
|
370 |
|
self.f = f_models.SNorm(2) |
|
371 |
|
#č na začatku nemáme vzorky - pouze rozdělení a podpís |
|
372 |
|
self.sample_box = SampleBox(self.f(), gm_signature=self.gm_signature) |
|
373 |
|
#č Rozdělení transformovaného náhodného čísla je zadano jako |
|
374 |
|
# special.kn(0, np.abs(x)) / np.pi # Breitung RESS 182 (2019) p. 99 |
|
375 |
|
# kn(n, x) Modified Bessel function of the second kind of integer order n |
|
376 |
|
# modstruve(v, x) Modified Struve function of order v at x |
|
377 |
|
#č Odvození pf_exact z Maple |
|
378 |
|
const = np.abs(self.const) |
|
379 |
|
StruveL0 = special.modstruve(0, const) |
|
380 |
|
StruveL1 = special.modstruve(1, const) |
|
381 |
|
BesselK0 = special.kn(0, const) |
|
382 |
|
BesselK1 = special.kn(1, const) |
|
383 |
|
self.pf_exact = const * (1/const - (StruveL1 * BesselK0 + StruveL0 * BesselK1 + 2/np.pi * BesselK0)) |
|
384 |
|
self.pf_exact_method = 'exact (Bessel) solution' |
|
385 |
|
|
|
386 |
|
|
|
387 |
|
def __str__(wt): |
|
388 |
|
return 'Gaussian_ProdFourBetas_2D' |
|
389 |
|
|
|
390 |
|
def __repr__(wt): |
|
391 |
|
return 'Gaussian_ProdFourBetas_2D(beta=%s)' % wt.beta |
356 |
392 |
|
|
357 |
393 |
|
|
358 |
394 |
class Lognormal_Z_prod(WhiteBox): #č ověřím to moje odvození... |
class Lognormal_Z_prod(WhiteBox): #č ověřím to moje odvození... |