From e54067aa73f5c6390a3b7b9cad563bee1a1c6d51 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Mon, 24 Nov 2025 10:06:21 +0100 Subject: [PATCH] Fix regeneration of expected results hdf5 * Restore deleted data file * Update to changed locations and names --- tests/cpp/generate_expected_results.py | 52 ++++++++++-------- .../example_jakstat_adjoint.py | 7 +-- ...ple_jakstat_adjoint_pnas_data_original.xls | Bin 0 -> 21504 bytes .../generateTestConfig/example_steadystate.py | 2 +- 4 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 tests/generateTestConfig/example_jakstat_adjoint_pnas_data_original.xls diff --git a/tests/cpp/generate_expected_results.py b/tests/cpp/generate_expected_results.py index a155a455c5..e5cef3a1a3 100755 --- a/tests/cpp/generate_expected_results.py +++ b/tests/cpp/generate_expected_results.py @@ -1,17 +1,23 @@ #!/usr/bin/env python3 -"""Generate HDF5 file with expected results for the C++ tests.""" +""" +Generate HDF5 file with expected results for the C++ tests. + +Delete `tests/cpp/expected_results_py.h5` and re-run this script to +regenerate the expected results. +Check the diff carefully before committing! +""" import subprocess from pathlib import Path import amici import h5py -from amici import ( - readModelDataFromHDF5, - readSimulationExpData, - readSolverSettingsFromHDF5, - runAmiciSimulation, - writeReturnData, +from amici.sim.sundials import ( + read_exp_data_from_hdf5, + read_model_data_from_hdf5, + read_solver_settings_from_hdf5, + run_simulation, + write_return_data_to_hdf5, ) from amici.testing.models import ( import_model_calvetti, @@ -28,7 +34,7 @@ outfile = Path(__file__).parent / "expected_results_py.h5" -def handle_model(id_: str, model: amici.Model): +def handle_model(id_: str, model: amici.sim.sundials.Model): # write model settings to h5 script = repo_root / "tests" / "generateTestConfig" / f"example_{id_}.py" subprocess.run([script, str(outfile)]) @@ -42,36 +48,36 @@ def handle_model(id_: str, model: amici.Model): for case in cases: # create a new model instance for each case, to ensure no interference model = model.module.get_model() - readModelDataFromHDF5( - str(outfile), model.get(), f"/model_{id_}/{case}/options" - ) - solver = model.getSolver() - readSolverSettingsFromHDF5( - str(outfile), solver, f"/model_{id_}/{case}/options" - ) + options_path = f"/model_{id_}/{case}/options" + data_path = f"/model_{id_}/{case}/data" + result_path = f"/model_{id_}/{case}/results" + + read_model_data_from_hdf5(str(outfile), model.get(), options_path) + solver = model.create_solver() + read_solver_settings_from_hdf5(str(outfile), solver, options_path) # read ExpData if data/ exists try: - edata = readSimulationExpData( - str(outfile), f"/model_{id_}/{case}/data", model.get() + edata = read_exp_data_from_hdf5( + str(outfile), data_path, model.get() ) except RuntimeError: edata = None - rdata = runAmiciSimulation(model, solver, edata) - writeReturnData( - rdata._swigptr.get(), str(outfile), f"/model_{id_}/{case}/results" + rdata = run_simulation(model, solver, edata) + write_return_data_to_hdf5( + rdata._swigptr.get(), str(outfile), result_path ) def main(): """Generate expected results for the C++ tests.""" + handle_model("calvetti", import_model_calvetti()) handle_model("dirac", import_model_dirac()) handle_model("events", import_model_events()) - handle_model("neuron", import_model_neuron()) - handle_model("calvetti", import_model_calvetti()) - handle_model("robertson", import_model_robertson()) handle_model("jakstat_adjoint", import_model_jakstat()) handle_model("nested_events", import_model_nested_events()) + handle_model("neuron", import_model_neuron()) + handle_model("robertson", import_model_robertson()) handle_model("steadystate", import_model_steadystate()) diff --git a/tests/generateTestConfig/example_jakstat_adjoint.py b/tests/generateTestConfig/example_jakstat_adjoint.py index 75ce991a14..01bdb4722f 100755 --- a/tests/generateTestConfig/example_jakstat_adjoint.py +++ b/tests/generateTestConfig/example_jakstat_adjoint.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 -import os import sys +from pathlib import Path import numpy as np import pandas as pd @@ -16,10 +16,9 @@ def __init__(self): self.numP = 17 self.numK = 2 - curPath = os.path.dirname(os.path.realpath(__file__)) dataPath = ( - curPath - + "/../../matlab/examples/example_jakstat_adjoint/pnas_data_original.xls" + Path(__file__).parent + / "example_jakstat_adjoint_pnas_data_original.xls" ) xls = pd.ExcelFile(dataPath).parse() self.modelOptions["ts"] = xls.time diff --git a/tests/generateTestConfig/example_jakstat_adjoint_pnas_data_original.xls b/tests/generateTestConfig/example_jakstat_adjoint_pnas_data_original.xls new file mode 100644 index 0000000000000000000000000000000000000000..012e624cd199c9900402711d95c474551d780da9 GIT binary patch literal 21504 zcmeHv2UHZ<^7ow~4aq^03W@_F269k9MMOk#MMcDjN*sbB-~fhQ5zKJ~!33g$Syaqf zS23-w=pu@!h+_G>L_vjZ)DDYJ5__g&i|W(4G|-*G#do*ICv)HG(D5P%nx%u zGDrAz<>fM#4czu(*vJTyNCad8iGbfk`2AN8L&9cZ+=_K*N_m8K^kXCcV%XO5(n1_Dui|feCz|U{h$siSf#R#i0(84D{{Q7#khh=?hlsV( zV);^y;-JN#cFxe7B8T=5I9SA+oIs;NQY?c-+Kj2`2 z_m%n9LfsX5=oW<4j@ZE<+m1LvbLJ5%vXf^;y2G_S(ByM0)V*LD&{|os5E4ZAB#Mkx zA;25v5N#v{H~_XPblH3h_5Kj}R;ooP(?nj_B+{95C9F`Wac8iAqFQ4fV-wXJVi{Jz zZzW+*raYc|5jF@-VV5M+|bVeU}I-`#~U77rURi7Llwj+7@%IJrb z@GH~jAmzt(Cv8W|n>Rnz_EcLUiXU8yis`F#SLurBEa-439S2K#h}(N7g>+ocO3PvF zfNNYzzX4M$vKN-Gj2v9|Qo2mPfoow(Z;10Esz0uwDLub=b5mVY(36R0TsKSeGk(PJ zo6=?U$2GPz|1K)uKunj>2iM}1{{{&pB%?upT%R}6aVgK#3)k!-I!}_nfi5H8xRE~$ zE@4?OwzC~0M@D}Zj9FB^3?26fC|yQA?i*10^5|&B?}vHQImTo<21LWrlYH^~bTEzM zL(-(^XcaZspD?CtG3@JM45kBYGnfIf)oBJl8W)Q=3&LSWUI?172}01r%7vi4n;-woc_j(6>JnQW~JzJGiOT1R<)u1I?l-LR5PP zx3!v}iE8iQzE~54sP+zStTjQ1YVY9AT%!=UQPg%^TvdAqxAvMKM74KtZ?FkMRC@kNwRd<;6QbHXmQ53)+B;TF5yEWWDsO^^-dQFy?sNnpT6EmOb%D3Hw@_}}!HoCs-wVZt)q=4|%#15eT)uE5Xw3R5 z6s84@e9Y>q7iI57bpe@5I6qYs!5eMDAefxxB zA>yE;G^`?2M;vsNhH8W3#X;9V1INo(z!?NIRv@3Rqyoa1`B(vpEic4XS_si>s6fLs z4y_>komxR8MAr6hz`@ua{e(%<_AGhSE|g6?d6X@{mh`xC)w?!Dh|pUUN=oYQ-V`AX zL$Q+jGguO?leKz}22|=HV3)Kypvv}AUQmGPI;q9s zPO5-7iZ^fG+<+>MV(e$d!7A1cY2siNM={bMSn2kZIEs-b?xk|rM(`XHR%R|vy!JeM zp3j7z`3Wh`*_^>78wU^3!BV#nHX|;uX5hhNZyt!_5g&M5^)qaP;zJuI^jYwTR7;&7 zefP;bp$1;FXmMeCT!0`_b2%gzc_b^9NG>2!4YsmCx&}Y`{oN|XNQQDquJTAWDv_9$ zNRc%8(J$ZKQ;cLJhvX)Y)LA7GHdj%dwD{4F@4r%vWGsi&MIOmPB@)xlX`MLy=sSPc zDn>GqL+UDzFGO)k<8?f z6vUpRN+ikHD-Ae&@0nsGb2%ghvFEB1Niz0I1HM)qP>j?Xk-GjM_IQBQwMnt(;<{pg zC4&U*86QSB^m}dOkQBt8wMrz(*mH5cvvRp&Bnvqt1+mvrC6Z+9xwxLIT%#DNtsIhq z*t1iKBpG`yu6ql9SB%7yLsAfXPAZWkW6#Ak`^sI#NS1O)3S!SqC6Z+9xww8lm8l3x z51wSf`mSNH^^qBD+X%Ik4zGj^o_SKS&~}YNA--gVTFMBOj40U33>>IfsCA=I2qjse z?PY{Y1`i=?j*n6-w0)ych#Fa;on(Yc#tCfHMr}|m)TU7=1c;9PMN@A#lY67BEZRais3FrS5XrTzEnY4+MJi1^md^gw%wXY)-n2 zKBht)(i^l8K#C->FyTvu6r)rtoIXowg{!DWt(ZHpR?MAPE9Nc-cB?yQs0p(<*3znI zsDWwvfEqu;s|fglQamU@2=d!zXac{T48NvOSB9TQLZCMvD=Mc44~(H9`o$$Ec7-wE z`2iMISKbx4Qg3v{{@27jp3jL>n!Xk7{iP2G{IOVu=x*93;YBV;vWn62~m6jFPJ|yC7aVv8jsyYXh88M zfSn&x_b0$h4;TnM5)8jnVdjquEwK&Id!jLqLmYA4*)J8udP<9BnF-ZMKZqeL%uIVR zba7oT7KDp`ksv+r7I?@%E@28EZ4xUjjI9G6@~0k}0va(E(P(HaxB(z;8@PCHj6&v4 z9EHrCI0~7&9JU^;YXEx?KQ%=V9xvDWS*-zk5TIgJ1fpnctPrmA#TCkj%>Yq_)QL-m zhJw)60AYb3Cb3~rg)y4L)`u4;U?ny*GBzGsD45e%+5#+dh>D@KVa9_l*g&NXi(3T^ zdcb}{gB~PnU6hB9OZ*ko=5G%}@mp zGh`|OVkVVr3gjURBtLYj8L0rmVN~8LurN0vp4cG_=L;qzd`*f@;qylGwT?5RXW>fr4F-I_Z|7uAmX9Ln9ag zeGPhCJjgKpd-n`21^v4g^zYLA(*3&;=>dU3MuZCzBs)5pCdAf-DcuMf>j_W;)twx4 zRpKUOLcGv!)L6W)5YtJ5uhIO3Y|dgCyR`tjHCl)Vmcvn90QM8Wbu`749OH4vhXw># zvtc12?#Jl%jno*g2^~b^h_4Cz=8|_yIU~tZiM^aG5ZWC6f}z3@&{X-*d!)dtzj!qe zQWUf`d?nZux}!KU89F3O-j(I7rLm#kd5 zk^lp7%>@E9MOR3gm`eldZpl(>m};7A%8 z>=PUso~qY)8Je6D1vx2=IpRxEPLf|zVi1%O!mN)&_S-R^HLT>AHCrix2{0sZfSS57 zAR^h4ta+9+_$yqs26c?!H^etFAqBPyLxZO!@sr0oOr03NbJ^wbXPpfE>gIl*U3Tb} z;8@4ax2|r;9NTvB2Q|%U@r!S@vmDs_eO;UG4$BSMa}(6dOHbC7ZX46~g3oJbo2T2$ zcbq8Gx%BzMkP*-SyfR?&?qLxHnwo=0K5u7pvUvCIKdv~31#Q?8{Cu5fkCr*{ne8^+ z)w14xpy$%lf?wBahaD~}JZitFd!(1MVN8!{&yGz$V>(%F$J5z8*8BG^W9$kiv?r&w0oX}{T*_slG~twFth-v>^1z7PMb zHSzDexSs#S_1bR}*Pg#nRo(IB#h6FuUkxTZgbTl4b*sI9GZaiAg!zoLu{Ph_`t&s9 zbOo2wjcMdT$Mje$^D6U~ zRfB)m)H%+Xv*}IUcCYWni|ZdOf66n>E7Cms(AWEN?1RZ(r_yI#n!9OhdrrvIqXBJkSA9#@>rH~SxQT4BgtaC`8HpyJ+9*De{9|KwNY7Ga&fb=joQ%C@W5wW{eF zaQ&lcP^EiVapty5!u@BRO4ki8N#AYvm!Eoq`|^Oe#}S3w93KrmnYE2ybi<9 z-=He;6`e3`rRi*_;37!)5IrT9KauY!aUK|+5FW!9V0h@24%9izGwAgot#C@#ZTHCI z9sMHqT`oTUiTLK5`TSl`zP_sRuSc`puiiJVSTjI>lwH1-{v!SrhXse+^Q;4}Ld!@_cH`O9y^6y5Ij|@{qK46wa|CZc)1w^-}4fD;8gxX9MoKfvpqX#EeT{Jn>;@OmzZ~q>7;QL6! z4R&^;ekwm_ezttetw#%5FEiqLzAC+VD9~=tMGIZyj>qhO?o<}S^{XPsdpSPe+W)xU zagFyTpQGn(@-Q7{yZ!L%L!U~l<|p10)~#{(y(g^c9R6$;r~kBWZ@>Pc&t2wLV>xi+ z%(`pw`zk+X1$*c_KkC$Ks;$*YuEq4a?sbzw&s$q^o^0KhsWonA@Xh=8SF!XWr)9=i z&yCS_Fx*))yw8`y)2mLqhkw!fwQr1fiQC7(MMhy?;`bJ?Zg;oI?z_FNpr&Uu&uUl@ zS3Mx0OX9--=K~Lp?(X#Xr=_cVwOFm+!@&6c1=}GBr>uUQ4 zOw0|*b$3p$KQX=c)EQw>i(<#=eC)96-h)Y(?i)BA?C)-o*)Q_c;}}koLB{6ct2+OA zbJI(%?m82zUyfe-B+uN?ud^0w8^rdWXEJcvXnxd8HUCG=2R)e;VNdF`i+k+#oq4xq`MxYY z^(!|{e;GHg(E8@rd%t~uT~!%caCmp<$!Ya}tyz^mwf1&Q;<)ek-V1Dco{0-y`_ISS z>F?`8XDs^u>HO~BzJHDR_+j5q!l(DYJsX_P?ICWh6_1EV3f3Q5-C#DChYDwgnE0@Ncs9G{=$#z$@-%lT(_i^O;W)J4umcDp4 z?_BD=WLC|Pe*YxZpShN5ws`Y~F4^nPE%cpw#?xFd7s?gWv}XHubUmwq(6gP-OM*%e&3+Dx6u9?P&aY z^#;o=2OV;+9nJB7**`OuJ!w?MZN0+D)05w~*7w}8|MTiGN0tW~tgh(j-L7=fBi|Fj z9@`^5&uZ`J_O;XSNo%vOuizA=L~iGmHxF<9tFINmIzNW}YM1&qZOs!!`d_p|+B<9x z{BUCF)1jr)R=i)mJ~JXeD)qq7ybHtb{QkamknzT$#V;-nJ`!U2+2Ucw^<58U3|eUP z_nMhC?aVwo?=tG+J!($ll4hqgvMAywu*;(>1G>uoFVGr|j{1yELr% z4%>D8Do_7xUVYeLL*_ddul9i^YX;nC)BC>VfjaNZva0d*pC(PyKc7*4%yRF^L(fm- z?E1BCmP^-Rwtd(Abp4kBBQwru>%Ev3UD^MSUq_mr-CP`HP*di|UgPPX^f9gIVcZhe zXH{u~T^B}O?Uvo~k>RJs(MMJu-ZKAQ=xli1TB}xVDG7T%@L9aU2j7~% zn!WmRF!t7)u)e)tPch$UWoM&vKVX4i$1Y3fW()O~xsG|aB{5>erm}fycY3U8_vXo! z@(DEu)~s-f+v}A+IYm$s_Bv|y)RTE5NAI#=7vt?2hX4Uyz~8ow-EzMJox$A+n4TLGEwi!#vZ|T71=w#YrS4M z=unk&fo8zu>l<#*HLlN$V--&J9bl?!xNZC%+je)ReCpb-_iw>{0v^3JymC7zKb+(J zPjHn{khYfTmV%G^`NeUGYx+4Hdg4FS>$*$ImKJm&Zi!D3D+iklVJ4b!)UwzKc${L!{J}1rHskV0W@B5-W z+vN-~N##dZtjp0o6K$r}-E6j(v2T&N+okZ+Wn=&JuIstGVA`f%mXAN_=|9|I?IF$Y z)xR#bk9K-7+Oe?q@Z0q55l4^h9^u{net_f6i$#{7OO6c~Z!+wG-Hemt9A0=0yTxY} z?>uO_x2s*x*cN~I7`xlgE7`aHQcY{l^YlI6hctJJC?Dy#&2@(6twl8-XMb!vYv;Y| z+caBkVwI1(Qut=??5??PwlD9TsJ%AM*7RjaLhyj2mHE56RJFhN=Gm)#3kByr4^CZk z^{Usaf9@=unA)Y!r=J&|Dcf*s{_4}K-N#l;88ZDlo1Lb&_4|P6`-3j&{Tp+5(eVg*Y}38i)au&c`iPmudgpctGG=#q^;03yOp7%PJMe7b;!Y(&ojsnpTz{ug zu;@~CN4w&rF=I4F#7*k-zQ>$%`!DJ^%$(rwWyHT***|7s$(ORx3%W=Ree@h#aN#y8K0*;%eR%$hQ9fe-g)S2dmJ6%*0N&h$IuB=cJ%B# zx*+jjX1874I!t^%c~aPqvklb#f5d_e2omxln)Avs~j;eDEyDf zg>xPsXp?sPQ||LXm#h=V3R2$LX|$Q@-6QXS`TSkcQ{KGYQ+;S+Jyv`(q-a9HsbsCRTQ5Ey^LsUULigR>&(^f@IQUN&O&??H(|KK!ubwp_t*1K| ztSdRC@yMVin8{@OOLnx*eK$9{O#Vr$Z@hf}!6-fGNraSv;^ywG!mPwm5qTp!mK zYW}V6&Q2O|+;gUf`CiYR`#v-aozQdpk+YR+yt~)$uD#agx4d=So`!cOjXHIiD>D6N8q`QnyCOXz9+J8+BdJ`ybeiQZNhCzm~QB5agJ{9Ib=QER30Y(y5Ka zTud|-9jJ50$#_oPtSOwt#Ouclmf2JIZO-E^`dz)PhrD{NUu?&5m>>RIZrt%z zYcCl^y4-V)Ei&VDd%j{)UdhBGua@=-G99$=cK4_~VY8Mdy1zDwSvH{KKpX3zjtyr@%zf_P`D+BX{`@eaZ zEsSw&YdZG(5TE4Rb2U0{xKLWtZcR~u`X3?3j-9*TP<0mD9^UU!wlD!Ui9^9MC2)YW z0NKfUV`+P^r^M7~*UjOKAIx*e*X{4h2Sx;Xhf;cHO1GuwS(K7N*PD#Y_OMSx;PcLzkW&I{QEOO- z5*uF|t6*6FCi4dIr|^OjCx$231@U82B%5Lp_!N0tUV#Bwx@DOo=3%4BJ{ z)gVj5w@+nh_yvnB4cFPSG_<)a4Zm8ErJ=24X=q1T8d^|8!dBn#(HR`bO9*qvf;+S+ zbH}C)KzyeLcW6f@PaW>ig3O%;+@bAez&<;cM?Z`2upHV@4ZO;NGF)QrSZ%F2^Po3F z!Ll8?wym7EXqh*b$C6yC8|GsJ1Cxuc(pD2P*4KV$rfl#L<^;I7S42Ua1#?GVKk?|9h=Mpwhf^S;AWni?#^GMGo>3gMI2YP6Qy+YA z#3k-KdX5O$`&yLGSjwyy>Y)MN0sFB}o5K$20Ejo1JONxrE zi3>02F*x|Nm`lo{E1r(GWo)5EanLJeRy(K+En1fq`~{I??>-b!5XW}D>Fuj^j9;{< z|8u&r2F}rcPI0h>a!EH44u|4=Mn~o_I2^h9aHMe1CLC%r7BQeUYz(85)Egc{-cm-1G*H0LET1W=u#Y;RCXT6{E0}0WIc2#MpnT;&QFRN4D8*w zuvN}r=ur$$zkY&xE`xysF!<`gMbL|hEj=j=jA%Vtmyw>7iRuAw7CzFU%zyL^#;fLCfiueL3C#z9^sZiz)RhZpm}W_Ab~Mnb^dBqS0^ITDfGf?zj&o zn{sJ+?4`Nn50QN2DYqaLr<8sNd{(5ZN`CCLK5QFxRU@PpcrTa(hvAHCv zpNIX_Yx8Ld93i;my$AzGS1wt9rRdL!;bj!VfMP6fsXn}!{XP)|F`&y`m0k_nHLnE%7#xP+9%