From 2ebdd357349fbee93169a03072563905e4629e4f Mon Sep 17 00:00:00 2001
From: Yannick DAYER <yannick.dayer@idiap.ch>
Date: Thu, 17 Feb 2022 22:17:46 +0100
Subject: [PATCH] Multi-scores tests, references regen on latest ver

---
 bob/bio/gmm/algorithm/GMM.py             |  29 ++++++---------
 bob/bio/gmm/test/data/gmm_enrolled.hdf5  | Bin 12920 -> 12920 bytes
 bob/bio/gmm/test/data/gmm_projected.hdf5 | Bin 10608 -> 10608 bytes
 bob/bio/gmm/test/data/gmm_ubm.hdf5       | Bin 12920 -> 12920 bytes
 bob/bio/gmm/test/test_gmm.py             |  45 ++++++++++++++++-------
 5 files changed, 44 insertions(+), 30 deletions(-)

diff --git a/bob/bio/gmm/algorithm/GMM.py b/bob/bio/gmm/algorithm/GMM.py
index 672ed23..3d9d23e 100644
--- a/bob/bio/gmm/algorithm/GMM.py
+++ b/bob/bio/gmm/algorithm/GMM.py
@@ -230,9 +230,8 @@ class GMM(BioAlgorithm, BaseEstimator):
 
         logger.debug(f"scoring {biometric_reference}, {probe}")
         if not isinstance(probe, GMMStats):
-            probe = self.project(
-                probe
-            )  # Projection is done here instead of transform (or it would be applied to enrollment data too...)
+            # Projection is done here instead of in transform (or it would be applied to enrollment data too...)
+            probe = self.project(probe)
         return self.scoring_function(
             models_means=[biometric_reference],
             ubm=self.ubm,
@@ -265,26 +264,22 @@ class GMM(BioAlgorithm, BaseEstimator):
             ubm=self.ubm,
             test_stats=stats,
             frame_length_normalization=True,
-        )
+        ).reshape((-1,))
 
-    def score_for_multiple_probes(self, model, probes):
+    def score_for_multiple_probes(self, biometric_reference, probes):
         """This function computes the score between the given model and several given probe files."""
-        logger.debug(f"scoring {model}, {probes}")
-        assert isinstance(model, GMMMachine)
+        logger.debug(f"scoring {biometric_reference}, {probes}")
+        assert isinstance(biometric_reference, GMMMachine)
         stats = [
             self.project(probe) if not isinstance(probe, GMMStats) else probe
             for probe in probes
         ]
-        return (
-            self.scoring_function(
-                models_means=model.means,
-                ubm=self.ubm,
-                test_stats=stats,
-                frame_length_normalization=True,
-            )
-            .mean()
-            .reshape((-1,))
-        )
+        return self.scoring_function(
+            models_means=biometric_reference.means,
+            ubm=self.ubm,
+            test_stats=stats,
+            frame_length_normalization=True,
+        ).reshape((-1,))
 
     def fit(self, X, y=None, **kwargs):
         """Trains the UBM."""
diff --git a/bob/bio/gmm/test/data/gmm_enrolled.hdf5 b/bob/bio/gmm/test/data/gmm_enrolled.hdf5
index 2e6e337f592e53f56806bce07dd5556c3176e6ae..6466ed0a3fc524a6ab698f09540aa908f5108c22 100644
GIT binary patch
delta 1680
zcmey7@*`!#9A>7FU7P1IhcPjQ?3z4}dD3JBW~Iri*n&X9|Ja-u8FeQ+a>z*JW>%Dx
z7NzQ?=jQ6U`}+DOCTC>krK;Oa&gD>MY}h=Jqnw{nce0?wWT-KlEhKdqp=_{`Qqo`}
z^Q6_l!v8dzCKqUCO>UA^0;z&=C&@v%T@x?7n8d*|*+fC4Ufx)f@sQUu`+YOl{;kfs
zY|qHZ(Bd+o)|&mUJ;T}Tn!M!u_H#UJKB%i7v=5QW^FEb&fB(eS5)UJ$T;AVuL`<^d
z=864(%sc!}2OPF%dnx}e@Xkj2gNHw?+4B90y|46P-CwgV+j|D?5xDntxBUxoq4vGo
z&+b3I#pY#R#FPC|FQ@X>2Zukk&p*Fi>ICPO{aw$xr~8?lwhvnU+9LB%zx`yz(=!(P
z-rZkq%g!Uob!~t0?v5t!ZAb0*G}}G7>i*F_)4r2Odd;o<FIrONc28YnpUt~zgXxla
z`%~;*#NJ9dwSV>Q3O`Hp4fahO{A%l7AF$t$;IGUUblbivqL=@a^-lY;<&)|&)*L9^
zA9Zr~>XNr-_fHb9>7BB1iGBMsPtz4_r}iHz4c^i6{NjGLs&kCXFI4VtZs2*Ds(Z<P
z-*f3G36-<<4PBb2zrB5Hf9v*dx&G?&`#s8b`Mo*uW`FKvk%^@im-efNe7E0w`py1t
zT2lI#{Lk2b(3$)3&*@9{n*xGY?7M%&{*+98@#6r|i~Iku%JzKTy>0)5kc<huuNwD%
zU3zE(>%s%}4;EcD_6~iwKdU(6-}Zzn`)5r`QeEu+WWT@W7N%&A&-Qb+^R=X|y}19t
z=H5?VpFG%K&Ri*(pz?OVZJ6sNqrg}83y%IuNR4{5pUL|~Ps;6=`#&)3{rc?f#r^8*
z6(gpfyubf!J?qK0hn*Micd31HRkh>z{s~1_L!Ita?Z0qA)KQlIrTshgiTgKBcxpfI
z5g!+i(RF(laff%Z+aBz{x@Do{dd_3^BERok6pMdmzk=gR2hW}R_Fs1TTO?d~x1aCf
zJE>mrhx^s1UUr(_{@C7>QJ*tM=gI!y+~9-Wen;&aRy>e={OF8*eL%rfCjYPt_B#qH
zcK!YNaDT((a`m{9Rr_Z>G|j%xx!ay?j#rPY%pv=mk2+3&Uw+&E#)+FBGhSb|H{59Y
z?8^U-`%h<b-&y_h#Qu9z1D>v_II_QSt8KQ*#fSSt=H5S2#&FHPbLmAL`?VMLGo7oF
z{eNBAVaN9aLat6q4l@tF+B!>JvEE_j+UHTc`ce)xU-V}j&sTETe6*#h@ScK$qY8KP
zl|C7V(4QAC2skP^?ALm|ui%TKgWLZ<dqX@F92SesNOpIUcM$4#V|4u~>u_Z*e}V2)
z1&1PrPwygy6&=>!I>1p|qv-HNi>F<2xspTpsoxQiDGCl#-?<-Hc2nM={iVz^1N(Y;
zhmf@)O%;n}9h44;3wSgrIIQxvve-LQ(Sh+w?9cZrlpI#QzS(N?U*2It%Oi>3`xP9X
z3NG7KbX3~mb9&Y5j$g_S9d8RZ%6(LDI3==0!eyR<gVfgD6BwEl9HJ)7di~x@!NGEC
z2UEy31&4F8C({pT%R6i`Uh;NUhJr&x&CZ+c^}31<OIc!=pH7o@m{@URfj)<v!>2y~
zlzqW+4z)`w*WHR!boi8hTdm-wghSs{;nHwJS%;lwa=TYNk$1TLZ)UN<L`8>fK3c!N
zRVg@}a+f>nXRPS3a$#Gn_k1M>u1ck2QSX%;?#|!HpHeR4Fhy`C<F0;Lhl|~r`Nv8X
z9r%N9xYUbeDmbtgCrx?fuHX>2Jp5JgaRrAO(R+ulDk?avbeqP<$R_XbdAZ|^SBY{C
zUym1j_mGux;4?DweWa%75U^L4)tFtz!PovoC|9<E!!_4XrMnO09EwX7AFI8PacBxj
zdH7vG)ghMS)f@j}8HcH{%OccHh&q(ckNRL>sN}G?fV)0<_a7ODZ=SyL->%Cz@F*x6
zi7_fU<UHp+!SG+kK_N+9RA`f&LmKOr8K;xv9VP@VjAZ(w=rFUXL_O+`oP+D1VyDXo
z6&xzBNlsh0OU^-ni)-yeBYB5Dht4DJ>tr0fMMDf8zEyPStNdSaCtTS<b;`zzS<dnf
z?*(60B-bc7^rqPqo;r6y-l6HX{02iSMTd3SnOi;YOE`2s`D3CnSHWTbt+~SOnKBMC
zxm$wv`6@VwJ`BDuv|ZL=omJ;=gWa2dsxq^H>k`d*V0xY&w5ri7nykRAF?oVv2&e*>
H$2<uD7lsae

delta 1676
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
E0Fpxq*8l(j

diff --git a/bob/bio/gmm/test/data/gmm_projected.hdf5 b/bob/bio/gmm/test/data/gmm_projected.hdf5
index 84437324be483253b54aff3fc2d0f1c2e1e620de..fc5e0a7c0b8f41d3b7d9a03d07c8e277f8bb5386 100644
GIT binary patch
delta 1679
zcmewm^dV@&9A+lg9h>JdhcPj+?wCA}dD3JBW~Iri*n&X9|Ja-u8MP-na>%IUW>%Dx
z7NzQ?=jQ6U`}zi#B$gDb+c6-68Ji0^`uQ2PCksk+gLKc65MzWII`IO><^U-f5O;H)
zv>GEj>khso28N1>2WuxQFbhrAlI?;DWlTJn3l_4Hg9~ju7|U3%3$<#7w&ToI-U|<i
zK>5>7t$t>xrsZ%TYlYFA&C(8^K7L#HK}G(+zDe)77DnkE*swy!b4~7H`%G1bEmku*
z4zO{`o-#0%a|l@%!_dA#+Tjlq@A93y-`blPim>-~sUEoZmhbUf&DZ-MDDUdnaa;C4
z_sY5Fs|!@?9kd(H<u=<YI&69Awn3vu++nY^>DN+Qg#%5;Cm63NdSk!*aMO-Tb`6Iv
zf77L1nP2QB^c4(yf3P|jFx+*q$WV32dhK!2<1e#=;&ss}PFs}^%-vY<=&tJD{mK9R
zw(7BbwvVvWoW4=e*uf)7ZvHZ1We1LXr`G&uXE>l+w$9D0qh8oyul$39U!HS1{JijF
z$0A8V2d6m#qCXV59YS)XmQJ+0W`8E|tLL65?gQ74wOr&|_G5pg!@r-V-<1y3Bvi1K
zS_nDl-dVo1c(RJay%5f{ygao7%_r<aJ0>a|*u40ehut2v16v(zGTz)bIPgO&KZ)s<
zsDss{dbz%&SN1N`*JoX?R}pZS$8aY-F^l&=V*j>nb{X;x*H$iA^6;D7fo;lnibEvT
z4!o%j`q=gH!hVmNMyJA7?by%SUK96fhk`>zMt({)zw&`w8ME%%bE_WMbBgCqdJn^a
zdy?fJDiov+yx8#VwYawYffW|s>)d@=9rip85avB3;}FlgcCV3_yaU_L$sYBxb)WVZ
z9gCFyqQZJ$$NAge>ly_P#BVUq_;BN${o4N3kDAx~wGX&C{m8BRY7SNAyMm<Czu4O@
z7TtGXuk?ZbFY6}9s)-#CmI_`Ioy>IL-LL5fGMfb*GW&g(v)>nWsC_YUwc-~A2L=y^
z`k33(_Xn8u_#EK4V!!2-U13rNw}WQotollM9@zs$Hxf^tC}leEv@&_(u>;Bn=Df?T
zmOI3MKw!Zl-5bhR_uCzGm7T6B;_!%}`|hpFvJOjUOm0+X6F=bf`$mB8={NR8<|k?j
ze(^bMedFuhm!o;W=U~P1jY5hCcn%3&{*$2TkepbTn_$3yU`OGNC$r^w4t#LE%W}8)
z{r;c#>lfKb%!zjR|25j5>rI5i{*`e%9a=&h4Br~4KaUS}sAWh9PE8DPU^h3vz_}^O
z!7qQ>R3D2lhn%$A>t|`kIz-edwbZ5fIJ|xRA&!+b!l58+s!vC5kc01(A52a55f1aN
zDK2oFnBb86|CxZPL!3j*p%aIVIKv&*SK1nzdPh1a)a!0i@bV3I$Xj!-g26K0Vex*8
zPM)F|hsLtUr#CUiIUH0!dZyGS%0Y0w;L*JfF%IfJ`RmgrBs<LPUgVKjALsDCOGfz>
zM~uUE=CpII`(qpo4;Z~z+Y{<w8TvS+e0P$=*Md9GU2CHq%#Sd;2yTpUVBvSO?EV(y
za5ZanQyg2kL;cpqR|`Gm{2acxoRh3zj(2#o<gU&G=ST;OE&O`~1A`q-^;hi-b%=6U
zdeP=?oK~=d_$EG$!%u=7u9tVSoL!UPkP{{HMeIm|!^CH5ja%6h9NxZc3YChEboi*p
zsmJ6M?!cOza$GAv+`&g$!sORQHwTVC&(EAm_HsCKKz!Y#;J|tZ*T<8W%}@$(Xup5s
zda{0?!!6y<YrD1vIc(bU$KphsuY(-(^pif<T^xQ`EjTVb(bB=**7)npslg6jiOkP_
zoN{;I@mclyA(O4cpA^oR!y-Nox!;ZDL$A0wbi1##3vqFB;JbUuaj%4@!{HrkXDuxB
zao8dH%w_%uFNcPt(=&f?)`vSNpINPYR?y8MDMoFhP=vR``v)CC+toZARtB@ThJ=SW
z-1}HJWo@62!~DdBhrb5|IJ7<WpI)`g%b~rv&)ax`lfxCmD@pviAr6<9sb9Nt-OJ(C
zi-oQ+>;Vp*e;VrUo7*_V&5MxUUE|{LX!n8b2C422TRDDhtTyp*C|S#~m_K-3fJ3D0
z9F8|)jt+;PPAWY2&&%P&za-Y>><$hOttu4C^Sm4;to!$ElYN-O8>TsVAHD}UIOMhF
wzRL-5SnP5qw<Fxg;jD>%(3Z2_4(SEDW}cCr4x1Y}ESM%6u&`~`({N%008LWbX#fBK

delta 1666
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

diff --git a/bob/bio/gmm/test/data/gmm_ubm.hdf5 b/bob/bio/gmm/test/data/gmm_ubm.hdf5
index 99df686343ee83dc8332c56561675cb91fd98ad8..6a8abe718f958351135e5992621a733016127ccc 100644
GIT binary patch
delta 1678
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
E0O#oo+W-In

delta 1674
zcmey7@*`!#9A+klDVygphcPiROqo27dD3JBW~Iri*n&X9|Ja-u85Jixa>xj{`}+DO
zCTC>krK;O8FfcGoF6B^W>fqnJkRzXe;st(2#mRyalc7dzwvg0egtEcLNlAl^%ac|E
z3;)w>np~inHMvPv38V_fog@e4c1^tSVzP#ULj5|=w}Fh0@7rrdbB5RRJ+NnFWVG2=
zGP!E)&HYd0%hOKh-?5MPT6byR(L4L|mgVs$OD?ug{`)RjT5gBE_POc;X4R+rw_Z~h
zc{1bf{x6e_xA*66-k(27QZT7xp}p@m$AG7SkN3x{I3>krKGpuL@)tkrlS}M>Ub?wx
zb?Zs{kj0P9>+fthv_I};RoC`M_w6?qix*x`dv2d9zx2?ugmv~k6=jxET-WSH57)33
z7+<zmUU+;F@2?s5o<Ub0xg{UoAGE5o!P;xL{WN!D&-eQd+i%?6VqO!m&pz<hR`J+*
zckCHAo}9s;@y`C5V&#ACNvG^Dw^W?-OuAwp@aA4;dif3e-S6+!NBs=nu>Ty##;uF`
zF73bmYMyobw1xJbPabNl+jGo*Np9V|9?$FhZ+Olu`+9Q8{sr0V_h$&Lx7WHY$-3|5
zZF^Doc#Fjwj@Tc*Je`|!&gK2HObcI4U9rzT!A<DMFV%bYYDOx`irHK2AM(vRS$*-#
zez6bs#w{Lq_n%DkkrC-Tw*TOd`h~)a`JdXS-&{CXvhmseBI&!KYV*(AbJjjHx-#ja
z{R)>k;pb~l>=%rG6E@BKn*GKd?vL{_w%e;ahhE)YvC#fW^a<94jBWdW_g8HE^Y^iR
zbY4?v<o?V1{}?~o@%i_f{f66|JZ9{>zQ5q~QadH@6ZR65-3ml3Uhc2{emS5=<@x>%
z^?&nZTJ9a)zriq0VqV~_{cSD}D`$pmu@~acVT}x`+uw6SEaj`j7W*q-PWdFoF5Z7X
zGqcBpz0h7GRk(So^O^l&Z)Pa>tKZ!(`z1j@+vm-G&Eo!M8MRCMPX;kAvpsdf{w3?Y
z?XP!iwSSv_aV6*LJ^L3Ly^C&H|J<IrM`X@V#gqH%OF!NcJ~?Nr{p@3l69Uwp+sE;j
z*OsnWZvU;~yW!OGll!fIU0;>h{a}CB)V6toWt;6|c>k>3{`<bYZpgWSaQof%tbcgg
zDuOQUpA@dYw<hS2eV=r4Tvgm_`(+<~o|`-Wo_+bw`PcF<&9q-IuY;4LUEZN&J@ZV}
z_lge37OH%yNmQtJP-hPO&T>S-p?2ntj+c3g4qlSJXI<<R9VV5}>|z#?cSw4>(_gJz
z$-zlXQg>#8qQgWL1IttS3J#zDK3&J2D(7(Z_^p-l8x$Ni>4!~aSuf-8C~eUUsZx1|
zwi}-mG<oD5t}PV3R6Ik@;l;TKHnCd@4v{Ze4}NJ<a9DJmJ!$L8dU=OcQICBh6673C
zF8ZmXZKmjOqd23aM_bWhQsT5*yc$XlTAo5XC*D$U_%dnJ^`g0Q4s$v+PFkE&aA-Ol
zZlJJ4$wAqnN$He~f<yB2`D@Zm6&#jx_Ab2JujsHq;?FI2bp?lu3zzjZ+bB9r|8Vq_
z?k5F@a1FKxch)I57;P<P`dvR)!9mT9`^hdJ1&5tm48F&^C_2mwtGz6=OwmF1KF3LS
zF&PJ?$PH`6FUdQI*!V>4ohR>bwML%R{Dp$U7S0Vv8$U`rG@X_3G+HU|P;PUWv7t}V
z;b!)>t)<K49O47M*X|WoaL6*NxzBJ$!9hpxSK2~f1&6PSQ~zF{sNlfHZBtgCt}pMf
z{L~A{7%e%6N8K#^oe_!-LM=aLsh7$+*qQH`*uy02Af|Rp-*|zXLt)-~jaXMD2d91K
zmG@3na4=kL8d)PJ@9=T^H;?4GvJRoU;x?A5$~)ZEmHu#9MZrOBo~)FasiMQ-S{Bd$
z8Hx^b;~v)q#>hJ`^=woY_^#ma<oWaZ+w+gfJ4|qrnK7qO!C~4RIi{~Eat`A5cQ!n-
zQgBG^Uw%aRzq~{7#yH`x{&Eh6O#50~p2|5S)&?!j2~l$B|2BEomjWe+%g+;io~kH0
zh@a%2ob_D6;o!#%wrejG9NzriaZmS;oCDM3C(nClD>xL#PRTv9R?$IN^32QqCh`uy
zJZ(=|9-XD=@U^IP-NwZ-4w0!(7WuA_clfy|GO>P<yn~ZjxX_$DMF$;~p6zjJ@(wvC
zeKssVsOZr7Z{JF>>++j_sWP#EYZ1+PV0xY&w35*)nykRAF?oVv2&nj<$2<uD1o!pp

diff --git a/bob/bio/gmm/test/test_gmm.py b/bob/bio/gmm/test/test_gmm.py
index 404becc..e2434f0 100644
--- a/bob/bio/gmm/test/test_gmm.py
+++ b/bob/bio/gmm/test/test_gmm.py
@@ -18,8 +18,10 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import logging
+import os
 import tempfile
 
+import numpy
 import pkg_resources
 
 import bob.bio.gmm
@@ -46,6 +48,8 @@ def test_class():
         gmm1, bob.bio.base.pipelines.vanilla_biometrics.abstract_classes.BioAlgorithm
     )
     assert gmm1.number_of_gaussians == 512
+    assert "bob_fit_supports_dask_array" in gmm1._get_tags()
+    assert gmm1.transform(None) is None
 
 
 def test_training():
@@ -125,11 +129,17 @@ def test_enroll():
         "bob.bio.gmm.test", "data/gmm_enrolled.hdf5"
     )
     if regenerate_refs:
-        biometric_reference.save(reference_file)
+        gmm1.write_biometric_reference(biometric_reference, reference_file)
 
+    # Compare to pre-generated file
     gmm2 = gmm1.read_biometric_reference(reference_file)
     assert biometric_reference.is_similar_to(gmm2)
 
+    with tempfile.NamedTemporaryFile(prefix="bob_", suffix="_bioref.hdf5") as fd:
+        temp_file = fd.name
+        gmm1.write_biometric_reference(biometric_reference, reference_file)
+        assert os.path.exists(temp_file)
+
 
 def test_score():
     gmm1 = GMM(number_of_gaussians=2)
@@ -143,18 +153,27 @@ def test_score():
     probe = GMMStats.from_hdf5(
         pkg_resources.resource_filename("bob.bio.gmm.test", "data/gmm_projected.hdf5")
     )
+    probe_data = utils.random_array((20, 45), -5.0, 5.0, seed=84)
+
+    reference_score = -0.098980
 
-    reference_score = 0.045073
-    assert (
-        abs(gmm1.score(biometric_reference, probe) - reference_score) < 1e-5
-    ), "The scores differ: %3.8f, %3.8f" % (
-        gmm1.score(biometric_reference, probe),
-        reference_score,
+    numpy.testing.assert_almost_equal(
+        gmm1.score(biometric_reference, probe), reference_score, decimal=5
     )
-    assert (
-        abs(
-            gmm1.score_for_multiple_probes(biometric_reference, [probe, probe])
-            - reference_score
-        )
-        < 1e-5
+
+    multi_probes = gmm1.score_for_multiple_probes(
+        biometric_reference, [probe, probe, probe]
+    )
+    assert multi_probes.shape == (3,), multi_probes.shape
+    numpy.testing.assert_almost_equal(multi_probes, reference_score, decimal=5)
+
+    multi_refs = gmm1.score_multiple_biometric_references(
+        [biometric_reference, biometric_reference, biometric_reference], probe
+    )
+    assert multi_refs.shape == (3,), multi_refs.shape
+    numpy.testing.assert_almost_equal(multi_refs, reference_score, decimal=5)
+
+    # With not projected data
+    numpy.testing.assert_almost_equal(
+        gmm1.score(biometric_reference, probe_data), reference_score, decimal=5
     )
-- 
GitLab