From 90cd747fd0ee2175e5815ede2c3ac49b56faedeb Mon Sep 17 00:00:00 2001 From: Filippo Airaldi Date: Wed, 31 Jul 2024 13:51:18 +0200 Subject: [PATCH] improved tests --- .github/workflows/ci.yml | 1 + src/globopt/regression.py | 9 ++++ tests/data_test_core.mat | Bin 70424 -> 0 bytes tests/data_test_myopic.pkl | Bin 74196 -> 3701 bytes tests/data_test_regression.pkl | Bin 0 -> 2761 bytes tests/test_myopic.py | 62 +++++++++++++++++------ tests/test_nonmyopic.py | 55 +++++++++++++++++++++ tests/test_problems.py | 8 ++- tests/test_regression.py | 88 ++++++++++++++++++++++++++------- tests/test_sampling.py | 51 +++++++++++++++++++ 10 files changed, 235 insertions(+), 39 deletions(-) delete mode 100644 tests/data_test_core.mat create mode 100644 tests/data_test_regression.pkl create mode 100644 tests/test_nonmyopic.py create mode 100644 tests/test_sampling.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 490a868..c71157f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,7 @@ jobs: fail-fast: false matrix: python-version: ["3.9", "3.10", "3.11"] + RUNNING_TESTS: [0, 1] steps: - uses: actions/checkout@v4 diff --git a/src/globopt/regression.py b/src/globopt/regression.py index 39df558..0b3e624 100644 --- a/src/globopt/regression.py +++ b/src/globopt/regression.py @@ -9,6 +9,7 @@ """ +import os from typing import Any, Optional, Union import torch @@ -19,6 +20,8 @@ from torch import Tensor from torch.nn import Module +RUNNING_TESTS = int(os.environ.get("RUNNING_TESTS", "0")) + DELTA = 1e-12 """Small value to avoid division by zero.""" @@ -27,6 +30,8 @@ def trace(*args: Any, **kwargs: Any): """Applies `torch.jit.trace` to the decorated function.""" def _inner_decorator(func): + if RUNNING_TESTS: + return func return torch.jit.trace(func, *args, **kwargs) return _inner_decorator @@ -36,6 +41,8 @@ def script(*args: Any, **kwargs: Any): """Applies `torch.jit.script` to the decorated function.""" def _inner_decorator(func): + if RUNNING_TESTS: + return func return torch.jit.script(func, *args, **kwargs) return _inner_decorator @@ -141,6 +148,7 @@ def _rbf_partial_fit( Minv_new_shape = X.shape[:-2] + (X.shape[-2], X.shape[-2]) Minv_new = torch.empty(Minv_new_shape, device=Minv.device, dtype=Minv.dtype) + # block inversion Cinv = torch.linalg.inv(C[mask, :, :]) L = L[mask, :, :] B = -L @ Cinv @@ -151,6 +159,7 @@ def _rbf_partial_fit( (torch.cat((A, B), -1), torch.cat((B.mT, Cinv), -1)), -2 ) + # full inversion not_mask = ~mask X_old_nm = X[..., :n, :][not_mask, :, :] _, M = _cdist_and_inverse_quadratic_kernel(X_old_nm, X_old_nm, eps) diff --git a/tests/data_test_core.mat b/tests/data_test_core.mat deleted file mode 100644 index d38cedcb140cf89b4874bfaadb429fb9f79279ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70424 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 diff --git a/tests/data_test_myopic.pkl b/tests/data_test_myopic.pkl index 63894f6663eeaa65434ec0b596eeab4a75c419f4..d5c58aa29d2595959734f29c7457b06beefd9b7e 100644 GIT binary patch literal 3701 zcmZA3YgAO%8OCv~NwsK{7UBhs9#^~|8XF^^G1fV14KB^{hRb-Vco2|c@K(?m6LcF5 ziVheQZCWoJP(hMlRX{)#HW#@FI3rF3LG%a=h`_+iXllf0x6eEIQog*u^?&ysW`LOm zd*kT({yp#&5$CS&xgc(SpuVqvz?Q8cVIkomn>NO+j&t|Pv;Mb^i9N8yHYDJ)3aV zcP}BW*hy@};Z#!r;fF&92^SWn5H2f^nUGIjUhX+6#r?eql`%$+)$M_g6rj4cmT>Rc z4uECC(uD>%^QJXZs(6U-7|n|YaF|Jd=Xw6_H+SlJIu5L3Kl`=~?-uw6B) zgr!9qVC~R2A*xg+c>F;Ex{O{5A>uwGct*)UXWJBous22}csFuFuW1BJ>*?PxNXE+Y zDv;1QZn}ihxz=Ay@eDi9{>%v$3ze>6Q)QGc-8-D%7pf4pS2IHNSDY{{QUyADxKioZ zb(>1t(*qh-kJlcg@~G5HMrj%QiKTo z@bAxh5f1u}QBlG|x68ovr@>;1!*l(UsBA0qRZ;ZUGzIuBy`KcAxdRxGm>EJy*gjiB zIqo`J0lvMzn6PtY4;5ua%&!b^Y5YJ2)-T#Z_@*+PaBRvzu@O%ran#!?kkY-0%7s?} z5=wf0k_Kd2!#HqdPBbAW(uJYq95$-JmEbR_WW6(71o6n}kLD@BMVC$$NU>cMQ>+p? zJgFRwJFlSZjeV*C!SB1W*O<}Wr&vYt+a1mUmK`9bxPCadh5_;B$%JH=eIkfeYTkAU zxVW{i23)EsV}!C6F~ymSa~;=HC!OUeNq$i(aLVtY2E?wK&47s2cO_t%`idZV<#UwK zoNrZN-^5A<_~-ZT5^(zH7!~+2X(I#D=6Ps9)}}oQaE-ZeAb*&<3>1zp6jMCIqFd1t zaQ#UI2a3NgQV5%W$AIhENgOCz_m!C9R>8hB2Jop@Bp~ObV;YcAFhopo=ECZsGLXbQ zHQ>bj1S-*=-Q_4-Hw>aOdvpwy*`ssBMqJUckzp6`@J^wCw_4t~A$(HUp$5L4jBfl3u9%#NUv<(ou`;Yrt zRs|b#RiMo9t^^o8-qL`oC#R|Wr2CJ8QvK#?8K{{VN2SI#RztZvXa)yr(sE>=x>BKX zCp3?W=|ru9Rn_`P6)=<>;=qlGyA_~l?7tY0lTfY!siU&Q6hDM*ZhKWA+1F17vg7~` z6uj}FnBq*y0$B#iOZ+v!F!du9FlJujz^zdY8kPD5Vv1V^;}jXFNEG(M1_6xQ`t zfNP%?5-uhDp7(ftE56|e27Dc7P=RyKZW@r$bFG--%(XEKIZ)vFg$!KxUnBvggD)t+ zja4JW6o)Iub!k9lWV;O940l!t_82OL-j78Phi|68$AQWhvt*#cJVXM@!yO-GWoiBl zr6lE#Vv1YW*L+7P(ApRZ_kO{FD|a>%GWvxoDChrTV?d(Ueh%zkoaumXB|}O4Fi`@| zFKp3(4EJ$jitm-bp>OQ9wfgpXqE&ug@jT&rBenp&%cQ&&NK%9C;`pq z<~T5Xmxf}V;H>~nizll<<0-RD@R-I3POhA=)SF7v;BFbk?Dq?m7RgIOX`MGo2HNt6 zDu5+0m(X>fL`JdR8?FKNp;sBcGu?jk%Rje#ohZ)e}^9}C@gNi^VW&~11fo&3jhEB literal 74196 zcma&Oc{r5e`~Qt7EkbFfMG7gjAfnzwLXnb0C|e}5RFoDHie!mYl0s1`l@?_!ZT6iQ z``8&X%$Tun&-M9!kKc1V&vE>I&-0x>T*ozY%{`8L?)$vX^ZkCEw>{2>CTJ+8Rh|L1*t4ysXig8qBS zoDg1(C__WTgR|uEUw`y@JfdvxXvGWj@LWA&eZPlq0Mg^j!sCelSQhxFdkoAc;ru(lkHM_!Leh%|V~}4m z@A-03(I_^Wu0FPU^C$!cUp;ukGm7?a+>d*yBk=q6BDMCz2#WS;gkK08LF{?f-X&He znAS>4NK+X>{?^7@mWxLq(O4Bfw|f|lK{>ZR=L{plDdLgsgJE2)m>gWV z1?Sos8!9hZcY=L6vYvzc-Lt`FA2}F4vweKa9S+0}$_g#E;h;)nnwLk7gLhXh&7C94 zfphc)tn3>?Pvy@-%FiMA3O>#9emsN`!>Uac=ZCPaDpO4D;1JHNm=}?;VF-=9&hbYl z*-#4ErXx_p#*E`v|Ed%=I#vS7kHwf6jF7W`RJXUvUQIAecrm*W-|IycmWKM`O->c@gE z`j0`Zd19Z(^cchv=ZR8Hxk3D{^Pb<=I)H1Lr-Qp544|=2(Lv2%0DGQ({o2hpfVnsy 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≫xXe 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

f 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 P{2Uw*%s-TLlwx%*BPFia diff --git a/tests/data_test_regression.pkl b/tests/data_test_regression.pkl new file mode 100644 index 0000000000000000000000000000000000000000..9026cc0b762ca843f90e3b802928ef4c81ab2f9c GIT binary patch literal 2761 zcmXxldpuNm9|v%BkF8eHJ+mveQdsxm)tO38iL~ujtjZ+PbbpF&svRVyu^yK}p@wWO zdE6%QcvhyOo1&uhxQrv0aW^w2q1%4uoN4~~y zZQz#M2a~xfq>Jv^^z8%=J}kPdbsv|vQ_5}g-;#vlv&pfu1Di=getSlxr%@+K$V|Rd z7EBl+i9Y*FncngXB+(shSAe&1)u;Y;2BhYa^K{Tf}Z`=SDKvqcY>nO`;QZHk~1f z{`fs*;Z~{|I()w5U%n4jHGVF)v`Ys@T|IV*XQ1HO;rUtvC(#1inoB<4KLHX?2gwcG zfO>x8m-<*>)ar3c;4bt_V@tqPmM0QLBB%ZBDd6?zYyb9Aos$#wIRCsq@JCdV=CX;v zhLf%DGfej-GR>m|-ih=*w4g{~=3)~Q84E>Y|Bpb9@**yaidI~)J=Kyh$ar^fC3J79m zRXMh(5E(zvheFBX%&DwK)yeTz%gvT10ttK0wR%SaS5oTgSrNe1%FPi1FCg(nw#9(z zoTQtcrsaEp$ zqk+Un!$y{>d9Jn`GZm!z^2Z$Y-oyMGKg55oPrE#oBtE#;H`mJofpM?-5s%N3#L%@* zPSsk+frSOZJ@*Ys;(dJKroIX2lX7JKZVzX)Q0csr@VVQLK1HndV+G; zr21Qq8oc1Tmf%l#rgMAW7F&{NpQmkN8J0&9tqp6Zc=>0O#JkeG9Ji$xNus5qthp-v zDoIf9R~#@KMx`j%RgVI`V)M;O1zJf}7f3=PqpXh|M4u#r)&hMaE^z6l=U@e1HK#GUe< z>#B!)zm`dr+{BBlw|1ugqYHQ@`o~xKz5nwLNeozdq^_z)4Q0zroiE?{3jEJyihCjt zRb6wU^Tz?aQ{?4$D(#mJq4Fyi-OxUSnH9O36U&~jK~wZ&N`kELa18qYlIQy53-G8i zyUoJ@jhiMiU6rN*Y^=`+e={Bkw))D|K{b?FwGOjNvw+9ai}Hv2fyUy{*&gVZvLi$L zdfih%x+Jo-=mQ`rw_ZQ@HBdG7=@>61P#99#vDzIFG$s-+3xLB}AIFz>0&BuP+}6P@ zD|IK3hgmwU_%r za1OS1bq&M4e~IpUT4@I4y~=;_J@zc$6*xIioC-`6d(D)nDt5QVXnXMnU_Ujy-8KN2 zH6uLB`5np|W>a_C6R(N>rsZ~H^y~nO(57*wC-K1uJK}Fq_XdRzJ&$GQqQPXel=&&C{2!xiNNw4_^mgNUx*5M|^kr`}(LqmA-{+d_h&!X%#Y{ zd>AMVerC~$^7nL#0sk)^gIgqAwUV8Xb~u76Wkuo58?E9u29BE{lQK8KdfQhXf9TLW)JB%dm%H zzzbkAc$mv!FlZ#C(LJV`MWbuj3M1y}dKs!tqSZU>BJwHvP^W~WM!;MilW0#D(vW6+ z!*8cpOfuV%VxVCtWH5azMl2!Sv7XI9TEL;vS)#+BtL_3tCp``icrcCRFTvBW5taSV%)oad`|fwAc&+9K{UQCG!~kxJaF7 zmNJlae4^+>vX>ko1F;K-foPr@nWhwzr1T0IBvr8)T-l*UytSA~;>M~IK`4(&1R<0f zwPFTw+k|Qis+0IQb&_C-Be+3XLYex|6&p5_T#4qX@#s=|7Q^##I0S literal 0 HcmV?d00001 diff --git a/tests/test_myopic.py b/tests/test_myopic.py index 5bc09ab..b756958 100644 --- a/tests/test_myopic.py +++ b/tests/test_myopic.py @@ -3,39 +3,69 @@ import torch -from globopt.myopic_acquisitions import ( +from globopt import ( + GaussHermiteSampler, IdwAcquisitionFunction, - _idw_distance, - idw_acquisition_function, + Rbf, + qIdwAcquisitionFunction, ) +from globopt.myopic_acquisitions import _idw_distance, idw_acquisition_function from globopt.problems import SimpleProblem -from globopt.regression import Rbf with open(r"tests/data_test_myopic.pkl", "rb") as f: RESULTS = pickle.load(f) class TestAcquisitionFunction(unittest.TestCase): - def test__methods__returns_correct_values(self): + def test_IdwAcquisitionFunction__returns_correct_values(self): problem = SimpleProblem() X = torch.as_tensor([-2.61, -1.92, -0.63, 0.38, 2], device="cpu").unsqueeze(-1) Y = problem(X) mdl = Rbf(X, Y, 0.5) - x = torch.linspace(-3, 3, 1000, dtype=X.dtype).view(1, -1, 1) + x = torch.linspace(-3, 3, RESULTS["N"], dtype=X.dtype).view(1, -1, 1) MAF = IdwAcquisitionFunction(mdl, 1.0, 0.5) - a1 = MAF(x.transpose(1, 0)).squeeze().neg() - y_hat, s, W_sum_recipr, _ = mdl(x) + # compute the acquisition function with N-batches 1x1 input + acqfun1 = MAF(x.transpose(1, 0)) + + # compute the same acquisition function with a single Nx1 input + y_hat, scale, W_sum_recipr, _ = mdl(x) dym = Y.amax(-2) - Y.amin(-2) - z = _idw_distance(W_sum_recipr) - a2 = idw_acquisition_function(y_hat, s, dym, W_sum_recipr, MAF.c1, MAF.c2).neg() - - out = torch.stack((s.squeeze(), z.squeeze(), a2.squeeze())) - out_expected = torch.as_tensor(RESULTS["acquisitions"], dtype=a1.dtype) - torch.testing.assert_close(a1, a2.squeeze(), rtol=1e-5, atol=1e-3) - torch.testing.assert_close(a1, out_expected[-1], rtol=1e-5, atol=1e-3) - torch.testing.assert_close(out, out_expected, rtol=1e-5, atol=1e-3) + dist = _idw_distance(W_sum_recipr) + acqfun2 = idw_acquisition_function( + y_hat, scale, dym, W_sum_recipr, MAF.c1, MAF.c2 + ) + + torch.testing.assert_close( + acqfun1.flatten(), acqfun2.flatten(), rtol=1e-4, atol=1e-4 + ) + torch.testing.assert_close( + acqfun1.flatten(), + torch.as_tensor(RESULTS["acquisition"], dtype=acqfun1.dtype), + ) + torch.testing.assert_close( + scale.flatten(), torch.as_tensor(RESULTS["scale"], dtype=scale.dtype) + ) + torch.testing.assert_close( + dist.flatten(), torch.as_tensor(RESULTS["distance"], dtype=dist.dtype) + ) + + def test_qIdwAcquisitionFunction__returns_correct_values(self): + problem = SimpleProblem() + X = torch.as_tensor([-2.61, -1.92, -0.63, 0.38, 2], device="cpu").unsqueeze(-1) + Y = problem(X) + + mdl = Rbf(X, Y, 0.5) + x = torch.linspace(-3, 3, RESULTS["N"], dtype=X.dtype).view(1, -1, 1) + sampler = GaussHermiteSampler(torch.Size([RESULTS["gh_samples"]])) + MAF = qIdwAcquisitionFunction(mdl, 1.0, 0.5, sampler) + acqfun = MAF(x.transpose(1, 0)).squeeze().neg() + + torch.testing.assert_close( + acqfun.flatten(), + torch.as_tensor(RESULTS["qacquisition"], dtype=acqfun.dtype), + ) if __name__ == "__main__": diff --git a/tests/test_nonmyopic.py b/tests/test_nonmyopic.py new file mode 100644 index 0000000..7f207a0 --- /dev/null +++ b/tests/test_nonmyopic.py @@ -0,0 +1,55 @@ +import unittest + +import torch +from botorch.acquisition import ExpectedImprovement, qExpectedImprovement + +from globopt import GaussHermiteSampler, Ms, Rbf, make_idw_acq_factory +from globopt.problems import SimpleProblem + + +class TestNonMyopicAcquisitionFunction(unittest.TestCase): + def test_make_idw_acq_factory(self): + c1, c2, span_Y_min = 1.0, 0.5, 1e-3 + factory = make_idw_acq_factory(c1, c2, span_Y_min) + self.assertTrue(callable(factory)) + self.assertDictEqual(factory(), {"c1": c1, "c2": c2, "span_Y_min": span_Y_min}) + + def test_init__overrides_default_samplers__with_base_MC_acq_func(self): + problem = SimpleProblem() + X = torch.as_tensor([-2.61, -1.92, -0.63, 0.38, 2], device="cpu").unsqueeze(-1) + Y = problem(X) + mdl = Rbf(X, Y, 0.5) + fantasies_samplers = [GaussHermiteSampler(torch.Size([1]))] + valfunc_sampler = GaussHermiteSampler(torch.Size([16])) + + acqfun = Ms( + mdl, + fantasies_samplers, + qExpectedImprovement, + valfunc_sampler=valfunc_sampler, + ) + + self.assertTrue(all(s is valfunc_sampler for s in acqfun.inner_samplers)) + + def test_init__does_not_override_default_samplers__with_base_analytical_acq_func( + self, + ): + problem = SimpleProblem() + X = torch.as_tensor([-2.61, -1.92, -0.63, 0.38, 2], device="cpu").unsqueeze(-1) + Y = problem(X) + mdl = Rbf(X, Y, 0.5) + fantasies_samplers = [GaussHermiteSampler(torch.Size([1]))] + valfunc_sampler = GaussHermiteSampler(torch.Size([16])) + + acqfun = Ms( + mdl, + fantasies_samplers, + ExpectedImprovement, + valfunc_sampler=valfunc_sampler, + ) + + self.assertTrue(all(s is None for s in acqfun.inner_samplers)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_problems.py b/tests/test_problems.py index 4b793ba..5c6d494 100644 --- a/tests/test_problems.py +++ b/tests/test_problems.py @@ -95,15 +95,13 @@ def test_optimal_value_and_point(self, cls: type): actual, expected, rtol=1e-4, atol=1e-6, msg=f"{name} f_opt" ) - if ( - not isinstance(problem, HyperTuningGridTestFunction) - and problem._optimizers is not None - ): + if problem._optimizers is not None: + tol = 1e0 if isinstance(problem, HyperTuningGridTestFunction) else 1e-4 for i, x_opt in enumerate(problem._optimizers): f_computed = problem(torch.as_tensor(x_opt)) expected_ = torch.as_tensor(expected).view_as(f_computed).to(f_computed) torch.testing.assert_close( - f_computed, expected_, rtol=1e-4, atol=1e-6, msg=f"{name} x_opt {i}" + f_computed, expected_, rtol=tol, atol=tol, msg=f"{name} x_opt {i}" ) diff --git a/tests/test_regression.py b/tests/test_regression.py index 0eca2c9..217cd56 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1,33 +1,85 @@ +import pickle import unittest import torch -from scipy.io import loadmat +from parameterized import parameterized +from globopt import Idw, Rbf from globopt.problems import SimpleProblem -from globopt.regression import Idw, Rbf -RESULTS = loadmat("tests/data_test_core.mat") +with open(r"tests/data_test_regression.pkl", "rb") as f: + RESULTS = pickle.load(f) class TestRegression(unittest.TestCase): - def test_fit_and_partial_fit(self) -> None: + def test_fit__and__partial_fit(self) -> None: problem = SimpleProblem() - X = torch.as_tensor([-2.61, -1.92, -0.63, 0.38, 2], device="cpu").unsqueeze(-1) + X = torch.as_tensor([-2.61, -1.92, -0.63, 0.38, 2], device="cpu").view(-1, 1) Y = problem(X) n = 3 - mdls = [Idw(X[:n], Y[:n]), Rbf(X[:n], Y[:n], eps=0.5, svd_tol=0.0)] - for i in range(len(mdls)): - mdl = mdls[i] - if isinstance(mdl, Idw): - mdls[i] = Idw(X, Y) - else: - mdls[i] = Rbf(X, Y, mdl.eps, mdl.svd_tol, mdl.state) - x_hat = torch.linspace(-3, 3, 100, dtype=X.dtype).view(1, -1, 1) - y_hat = torch.stack([mdl.posterior(x_hat).mean.squeeze() for mdl in mdls]) - y_hat_expected = torch.as_tensor(RESULTS["y_hat"][:2], dtype=y_hat.dtype) - # NOTE: we only take the first 2 rows of y_hat because the third was computed - # with a kernel that was later removed. - torch.testing.assert_close(y_hat, y_hat_expected) + + # fit + idw_mdl = Idw(X[..., :n, :], Y[..., :n, :]) + rbf_mdl = Rbf(X[..., :n, :], Y[..., :n, :], eps=0.5, svd_tol=0.0) + + # partial fit + idw_mdl = Idw(X, Y) + rbf_mdl = Rbf(X, Y, rbf_mdl.eps, rbf_mdl.svd_tol, rbf_mdl.state) + + x_hat = torch.linspace(-3, 3, RESULTS["N"], dtype=X.dtype).view(1, -1, 1) + y_hat_idw = idw_mdl.posterior(x_hat).mean.squeeze() + y_hat_rbf = rbf_mdl.posterior(x_hat).mean.squeeze() + torch.testing.assert_close( + y_hat_idw, torch.as_tensor(RESULTS["idw"], dtype=y_hat_idw.dtype), msg="idw" + ) + torch.testing.assert_close( + y_hat_rbf, torch.as_tensor(RESULTS["rbf"], dtype=y_hat_rbf.dtype), msg="rbf" + ) + + def test_fit__and__partial_fit__with_repeated_datapoint(self) -> None: + # when a datapoint is repeated, IDW is expected not to be bothered by it, but + # its output will change. For RBF not to fail instead we have to set svd_tol, + # and it will ignore the new point and the output will be the same + problem = SimpleProblem() + X = torch.as_tensor([-2.61, -1.92, -0.63, 0.38, 2, 2], device="cpu") + X = X.view(1, -1, 1) # to avoid issues with torch.script in rbf + Y = problem(X) + n = 3 + + # fit + idw_mdl = Idw(X[..., :n, :], Y[..., :n, :]) + rbf_mdl = Rbf(X[..., :n, :], Y[..., :n, :], eps=0.5, svd_tol=1e-8) + + # partial fit + idw_mdl = Idw(X, Y) + rbf_mdl = Rbf(X, Y, rbf_mdl.eps, rbf_mdl.svd_tol, rbf_mdl.state) + + x_hat = torch.linspace(-3, 3, RESULTS["N"], dtype=X.dtype).view(1, -1, 1) + y_hat_idw = idw_mdl.posterior(x_hat).mean.squeeze() + y_hat_rbf = rbf_mdl.posterior(x_hat).mean.squeeze() + torch.testing.assert_close( + y_hat_idw, + torch.as_tensor(RESULTS["idw_repeated"], dtype=y_hat_idw.dtype), + msg="idw", + ) + torch.testing.assert_close( + y_hat_rbf, torch.as_tensor(RESULTS["rbf"], dtype=y_hat_rbf.dtype), msg="rbf" + ) + + @parameterized.expand([(Rbf,), (Idw,)]) + def test_condition_on_observations__works_as_intended(self, cls: type): + dim, N, M, fantasies = torch.randint(2, 10, (4,)) + X_train = torch.randn((N, dim)) + Y_train = torch.randn((N, 1)) + mdl = cls(X_train, Y_train) + + X = torch.randn((fantasies, M, dim)) + Y = torch.randn((fantasies, M, 1)) + mdl_new = mdl.condition_on_observations(X, Y) + + self.assertIsInstance(mdl_new, cls) + self.assertEqual(mdl_new.train_X.shape, (fantasies, N + M, dim)) + self.assertEqual(mdl_new.train_Y.shape, (fantasies, N + M, 1)) if __name__ == "__main__": diff --git a/tests/test_sampling.py b/tests/test_sampling.py new file mode 100644 index 0000000..220adf3 --- /dev/null +++ b/tests/test_sampling.py @@ -0,0 +1,51 @@ +import unittest +from math import pi, sqrt + +import torch +from botorch.posteriors import GPyTorchPosterior +from gpytorch.distributions import MultivariateNormal + +from globopt import GaussHermiteSampler + + +class TestSampling(unittest.TestCase): + def test_GH__supports_only_single_dim(self) -> None: + with self.assertRaisesRegex( + AssertionError, "Only a single dimension is supported." + ): + GaussHermiteSampler(torch.Size([1000, 100])) + + def test_GH__returns_correct_base_samples(self) -> None: + # with such posterior, the base samples are returned as they are, i.e., 1*s + 0 + distribution = MultivariateNormal(torch.zeros((1,)), torch.eye(1)) + posterior = GPyTorchPosterior(distribution) + SQRT2 = sqrt(2.0) + SQRTPI = sqrt(pi) + EXPECTED = { + 2: ([-0.707107, 0.707107], [0.886227, 0.886227]), + 3: ([-1.22474, 0, 1.22474], [0.295409, 1.18164, 0.295409]), + 4: ( + [-1.65068, -0.524648, 0.524648, 1.65068], + [0.0813128, 0.804914, 0.804914, 0.0813128], + ), + 5: ( + [-2.02018, -0.958572, 0, 0.958572, 2.02018], + [0.0199532, 0.393619, 0.945309, 0.393619, 0.0199532], + ), + } + + for n, (samples, weights) in EXPECTED.items(): + sampler = GaussHermiteSampler(torch.Size([n])) + actual_samples = sampler(posterior) + torch.testing.assert_close( + actual_samples.flatten(), torch.tensor(samples) * SQRT2, msg=f"{n}" + ) + torch.testing.assert_close( + sampler.base_weights.flatten(), + torch.tensor(weights) / SQRTPI, + msg=f"{n}", + ) + + +if __name__ == "__main__": + unittest.main()