From 1c204d765ea5f5f29a6ff3c48fda8f65a5e5485e Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Wed, 29 May 2024 09:48:54 -0500 Subject: [PATCH] Add gmi test; update H5 --- src/Cuts/Cuts.jl | 1 - src/Cuts/tableau/gmi.jl | 2 +- test/Project.toml | 1 + test/fixtures/bell5.h5 | Bin 95805 -> 37123 bytes test/fixtures/vpm2.h5 | Bin 50063 -> 34284 bytes test/src/BB/test_bb.jl | 8 ++------ test/src/Cuts/tableau/test_gmi.jl | 23 +++++++++++++++++++++++ test/src/MIPLearnT.jl | 1 + test/src/test_io.jl | 11 +++++++++++ 9 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 test/src/Cuts/tableau/test_gmi.jl diff --git a/src/Cuts/Cuts.jl b/src/Cuts/Cuts.jl index b2a4254..afa60c7 100644 --- a/src/Cuts/Cuts.jl +++ b/src/Cuts/Cuts.jl @@ -10,7 +10,6 @@ include("tableau/structs.jl") # include("blackbox/cplex.jl") include("tableau/numerics.jl") -include("tableau/collect.jl") include("tableau/gmi.jl") include("tableau/moi.jl") include("tableau/tableau.jl") diff --git a/src/Cuts/tableau/gmi.jl b/src/Cuts/tableau/gmi.jl index fd04b36..14febbb 100644 --- a/src/Cuts/tableau/gmi.jl +++ b/src/Cuts/tableau/gmi.jl @@ -154,7 +154,7 @@ function collect_gmi( else all_cuts.lhs = [all_cuts.lhs; cuts.lhs[keep, :]] all_cuts.lb = [all_cuts.lb; cuts.lb[keep]] - all_cuts.lb = [all_cuts.lb; cuts.lb[keep]] + all_cuts.ub = [all_cuts.ub; cuts.ub[keep]] end push!(stats_ncuts, length(all_cuts.lb)) diff --git a/test/Project.toml b/test/Project.toml index e5abcbf..ce8384e 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -17,6 +17,7 @@ MIPLearn = "2b1277c3-b477-4c49-a15e-7ba350325c68" PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" SCIP = "82193955-e24f-5292-bf16-6f2c5261a85f" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [compat] diff --git a/test/fixtures/bell5.h5 b/test/fixtures/bell5.h5 index afff1ab29a3dfcea40cfeb412477c6ea0b12d688..541b0a6ae5b6f970bc5b62c058a2d6e9ad010af5 100644 GIT binary patch delta 11740 zcmd6Nc|26#|Notd>_lW|C?VU7Z4BAh>}97+cCs7$HldVk)ory_go=s4>)?ZpU&>0 zbB+_s$Eah6fE@>?hv1x81}M$K%`MqpT4KS{%~D57Mw7)1ju{ zqriYGmno-JjJ4DNQUKCI1$B?TK!M)@ReWCoIP;TE!wBL6F6|@xCIL98#mYYh82Nh#o4S;lt={o>0L1cCyiF^kRbVCXdK<;E83!qK{0Bpd9@hf(~3DUy> z6i2c10#Q(t6Sy?2bpi;27#M(>M!A!~btt&l0T#QBQ-Cg{fdj}t*C+eD`jj2{$jD#GAW z&X(wY+7E^>7IyFfxhPo0LIcimQp4w{!EMeo%77Lxi-Rykio$hhz!BtUd{c93ou;aR zE>Yu=J*5ZQA@juI?&3kLAfo zT`5@v28HnP48RE^P)JFHou`|hy9ab5E-j7l@bn0F@bSb^8aeoaoER2ze;YSH2LuKQ z8Y-~kQIIlG352bmi<>>dfA7x64v7$ObMf#Cl$I2vq*OID*>h4Bp{%EdI2RP`;DNv( z&=@JCIRYguqU!16fH3s&v~$4WJbi=_E*>~vA3r-^7f%n!OJ9T)w5*ATDw~=Ue#C|p zO8f$)v9phZ4QMK>NF^bT@Fmv>K0z9X{`hU`Sdz6i&y^IY86j$7!Mu{RN#nC7k2O%UHlu?p{Nr1jeCX^U) z88k{1`pJNuN@$Q=iH`~`^AAR$tnoiRwSjUa>j4)+1|x++V=$r^2?Rn$R0;{6RTTw| zRP@OmUo1#b3JJ^c zr&xjJFGPZ%2L+jthRjN!k^dneLGT30juw}cgrudA|EW+M35Kb03yVuhh>FYn%Yy?E zfW_dl#Pu(M13FP)&jWF^lqeE~A$ElHzvy9VT*5L)w74iV zYoJ2x1Sz6Mq6|^u4;|77q96}skTNo&GDP10kH9{CPk;>^QDZ{?x7L4{r1=QO5h8>O z5=W^8RVZSYpu|C14HodGIxQ(04Mh+*tIk3$PBe;=f=GNvp)e3dK?4ZQ3<-i3XyiZ* zjgttyGv}bCfRa)@(8~>)mG%f3aSXHo*gN150^&$%6qv5T21Vq-;z68RsK2My-mJ8T zRuDfAUqpZn4j~~9c4>%8ppddqoMEJ;B~ef?L)}kkqoohpXmN2ukV_*(MMV)9Q8XdK zL1|3~0kk+$LP}f$jUiBl5l%K<1gDW`G#};uN=c|L!isJMn8Nm#ZysM!xD^d}*7q|> ziN!~f{S*oVw}aMdD6Nvc6p%znpJ?Cyr6GcbkS&m$sw6*2r1k$r!_X3G=Y-M4M4I}+ z;tlb%qlmQ2Ey5QFG|)nq8qP>Z#A@3aQ;C?o4mF%_4||5nR0bdOw0;hNHsA`R7?#C?8$A zStDsiE)P3FTT7EbP5Miza6(C9`2q_IE%0&RJR<07JT9Yc>4LCp1fYxhG4T%)-TkcYGSofR()9WG}*lq=|CJt8CN%pvIuQ6*W8*O{9#9 zn?&qW2!TIIM+kgM{0AWFFLZ7X4XmP*`wLy&Lu-qVV*f&aqlr_;!#UBO*ej3!@^Nj? zrn4yDnSBW;-KO>Vi{qgT(W@nW+wQ+~QbDUeJ!ZkE5$qkAZwI9}i{l%0t3VU|YO z_fP-^I{|H@;4s+1oOj+gND029RAA!-01`O-5RB591oq<~fr2=4biq*GM10kb--|%& zulEXF8I>99(mQ11dG86T{nR}kd1Lllvv4=LWnZdSe3C6a{psWmH3nPUBdr}kJ-Jp$ z_$Mz3kNRsv!y{@nMQ5p+oR1FmKP>$gCRbEWacZrm-eWM-^TukE6|GWw^lfFQw!*wq z60Q0bTwXh^)28dEr^ttu`cLEWl$Wt<3RkzOrlO4Nn{StT;>@T!u}n&~5<%b0zGEKA zT9zOl*7qH+SiDXWm{4rarg*F_Q?TO4O(0C=X*A7gtTI+L@k*fq{mO-#F1tlzh0}V- zavoi=#$_MrnqDgt$CT7S`Qg-s$6T$~Hkv}YekNa+V~%O#=<>Tv_bk@w1KxCUqoT}P zY^=!NSX=y^s*SE~=o2%BCk_-F&nv>#ix5t$-_6i~>A%eI5Qd;?5Zlu#5-_;V< zcrS9~{`bwrv148O4x1VLCYJ(5;?J0D77g`fpWGY^#v~8_+unavZB6+3#<$D0xn&Zatcw``@N>6dgIZ&fZEF>^8%KSy;Zwi#e$5JyreA(+9OCittP-`{*`;8xsAJ93NwXLsQGp<&&5KAxjT-mC)Ir8~q05-aNA>iKH zxcJrbnl0{)wdQe_pDx*zjaiZ7cB%@J8C7}o={HqEXC!ZiD=hWD*A{YFxz|>S3`woT zU31(OTW{FC)Ap?{H2hFQt8nsP6S5?i1NNB&JVGf$So;`Z&}@Q^2%yRIXEsrSH^~*~ zDM?@lM;Zj_;~3&RCVew+wm&xup&gA8hPb2oltHSfp{4fMrW)F3DV{I+1p{c@UA(ZK zwwJKPZ9<^do+p3dwoqzdf91>pPUq$6=>{?T>Kd~sMeXB-yV#=JZK-!QbNX@*Wh2nBNH4>w`A)MI^slkMTQJeG_MUd0IA5%v*8|)E{g|!of0FGz13WT)L1ZEeydVhFPGrYa1Rt=|L+m&^ zDA~d~I@tL7`8ePjLJnw0{?L4Fe4HG7abH5AcbJ{Vzq=k<@#=!v;$Q%Sn-|eC&W1Pu z1gn7PfiAj#h<>(^!_;CRZ6q6<1qoI}u)y0f;G+mOwgK4#cA9;5;wa*#*oCMU4Xj zJwf8YVK*B)SDc&X0gV__P=0w+dk^_{Cqr1xIsRc7aP$by*T&byj@Z*4Htr6%4*-aY zVuiQCK;0+=ydMsJiA2DeNI?21F1Q0J=n=&MFFFkVieiHUN1!`qGMs}4&Ow_VjDr~N zF@U*Hm3s_qj^Z|Y%Y5Js^}ZD%Z!OCKOur8kI?U725!xQN3m(u2gF$#`TN|7U4ohJ4 z!wsAQBO*9Cr-Tlej_fn-$B3WTk}wofM+r*<(_c%&;r-*P!{p#C7OA6$$w>g1_g}Bp zclLx65w7fJ0R873y}zpbPoi^s=80F76H#<3c9Qvj6D5~|4p+$cEGHhk_aOxcXTnJf z=PM}&zW)^84?IATxSlDJ!07%mo9{zd&o~z?nD?`#f7ZeOlI#0Ru8Jr}f@151mCPT5 z)xz4+E-80QEb~6;qcPulyp3%&(7N2oH+y4bOBT}qWnZ1%@H*<9P>W2Du){dbL z3yXpsbv-7d^_k8LCFv^ra_WZicI|7r?Y^Z~cmvLNL9%Ki)9}`AO~%2OBU@n~-4a)C zPA>9|T2C0w&5^WbpU&E7nqP?wrkV64^G^Jp_cH&b{KIrcF(K#KNhZgTPwNR(0--OT zJT%yi6QoPXp(CH1q;Z_g2^Bfl2i3 z&=}rB{LTy6p$kPDqvmw<2E}J}UnGt`mwxk+cDe7lLcg?PowQ?ju0=|gyy3Q3txj0B z`?B;87yt0Qooh4Ur2&G28`nSH+td^u48A>TWQ(hsV;=~gHK%!1thbv!R`jx-L*rBV z11EhmDNHT<@lY|wk{Pb2*aYSw&DNC1y}9QX@!Q)f%g<&9F>O67)EQ;p>Zxu0e3(BD z`mc(n)4vEZ+3XFo-jphBs$b!>3D(f+E&Alyx=K4?mhNX~jgjr-Fc!wW3az-Ge_tQ(2*XE)>%T)z`=&6M5wzY@! zehb;@Z1&8WOyNI*%%|(2-0mI4@QFZ5 zS@-$4iK1bQ^T5KDkBb+qr$%{w8z*12oj{Uah6FQ!*~CeEz8AL=)sDxq-G2Qh*EysOC!^`=p!4h7&ywA_06)das{F~a*~zN8-DP}h z%*PF8JdGRAVnFSb(3kD!=NrmX&%B9d{qT+Jbokk%L(?3#SNWeDZb*MlW!l>l;gf8I z&(v{XXOXfwA#+zk-FNOHj}9WSwi_ilV_!> z4g%Shf~PXoqjJeR`EBmXKHhlu&N8S|?*;RqSlYZ^O|D*0^f7eRjz9p;4B7pxCq9|) zx@x_mnczvE*@c%K(G^SO8(VI7`_Gp)?chU;_}nYn-UxcH!L)u(!xPtatsB+HaxuDoqjP^?NxZBU2z)pIUo?iQs;={H$3 zv9}{OUa3B6&%FL*40SidSyQxgE|d2gWlloRDxXtx_*5Y}&B=gKBd{jQC{b$^GynPe zi8d7(yd|t{MuW%CC0RV^wIj(Xty`LS6H%rv^nzV3=}>FY=c;s-Ct&G4vDsHw&-#bo zX3-NDTSFGhB&@wJjPhjlVpf~3Qk7P?59^m_iy&RQ>6=S^IqA~iRL?`?_upJN9N zx|)Wr$d0)VFE7#C+drc8@>)W?8I&NKeMoB@knoJ|oAyQvtGaaK#U4~w?3bHwc=1K& zvLCU%j_&hJA(J*`dsNUOcqhw@hYd{E*;)wXY3#&MEhVKJcKpy9kg;ZNvr|92*ymug z^_wbF$AsYv-RYH*)8MYH*D%JOisB2u(N)V{`?BxyRr7SDYEvE$VPAh$Q^r{%Wj{GP z_r~O3r`L&IY?*oan@&uG<8|5Z-Dq=sVo0a0MpXKm$H{z`6#fg`PSBGoh!*96h(r&38dIe3hL zZ?`Dw-Kd0dJtNLKr$c47M#GGkr|)WkaB$t?=&6OVj2}6`qWz9d*YQ(sFvf2}T_-dW zM`ztg@2c;N)A%#uIk8c0qWv(gpi4#(!4d-2>~!|-Df${Y_aa^Wiw^}Wf>lrTUW&va zn*G*lP3)qEPJie>9FlyL(Qfk6cmsZi?QNEtN6$*JmxyqK!Aa7aurdGT#?BHcgT;|= zx8(=D8gHB{*T4O#sch{Mj8845^b|)*XsGRi#)Vh@>gMTf6WIk56Cp!F0vv7<-A%Et z))K$x4#jOh9G2pqmcqW==F<7PoODcnbMsJg+1vX=bKx|_GtW#*nA$Jft}+|&tW%>vU}v=GR&tnwrOE$8KsjizQVqTr8~P4KlK-*6n0byl~4C3&h5|J@D_iefNnI zP22SXnV!I}pV77NPbz4Bu>4taex?-vb>ljDa{7lh%MFrb^Ib`wJAQo$wl`4u(`@$m z_?YPr{wMBq3dLM6J9?!pt4E>xmwUqp=Qh>E!!~K8nJOLruRN?@3rP4=tBh*tM`*D$k$wkc?YhOzt>o1dHe%Fs}zR;)043H;hIFEnh zq_Yt`nmEo$y~PytV41-xAU)k~8Pyqn|AE*gRv9;nBb6aP@jl=wOQGWzo4x1i&E0Gj zQ4dbbkNK1JdkDf)-{fqJxiyAzOt7hS<1#UCaQZ^+i&VYbzs){{A-Dq2=ZZvHMC#*W zHV;S67JlrW;5=JYwt7Exi09$Z@%$P5Q0U~`Y`-J(Rq=% zu8B5p7LrQFV=0;M%|$w;V20mxdi!<>z&2Bt>iXl29_xewr_L_YSHuTB@Jsqq!RZ|t z+cBPQIbv4dyB3otI3U2ESZ2&M8ZmBbD@JE2-0a607t?a|*U%3i)YwQKm7}&a-s>__ zoIO^jJ25hy@x-X}a~8#WQZ+gm`om2ndh`;Bxl`(y{o_KJtAj_!;fwN_KTld|dn`M@ z4bDU>`Ea!tR2&|7b^a<{N>^modD=B$JM_yE?)dCpw~w9IT*hirUa%CMJ6+(bOie2V z*0l1}^w@K=KV?c&i*Fl>I;^d#^cb&wqGz{-7wNaLIeg1QB8M*V+F*-ZyH;iVu=Yc0 z58huLG&Pu<&!1|B4u7)k8v$OLKF~@mk&hgmeRVcs0q%RzPd0eiBBH{Q?H$FS6o-ER zqX+uiwacNref`sv0Vc;Dm11@5>|5^sK65orrK-X}xxoN6&J-ZxwO}i(js6ma7s7NI zewsc~+0(|UU)A{dY0+_%YfpLLg=dUaQ!;dO-ja+1&jQKtY<468x!lq0xh*8A)_LYs zS{->OIh4Q8js$vJy%{#&u}JDjC=3SMZ}?kD)*fdsHn8g9C)*g?oT289+Aiixuu!QY zQ5j)9w%{NmJC;kjdnV{XWf&(v8UA)`Oy%jRq@1p}7^$sqmLKBiPG;*527C+;q8iD) zW66_kKW$hfz>^(*#OKt8*%sC`_%+>5d5yP+;rrdY5=p(Ztxe# zc|@p2?aSqLBfpMQ>~c$j+cfPl&Un?NUPW;y#zXoXw+*zEO+2d9Mk_V%4E-+sJ$*Vv zrX@g1<^#>4PZ>{h?40Gu^Aa3)x+BsZOgl<9*`|5cgTCbb&}cY;rmqj?c-JO9p3%2_ zV!``WREbzv3|n6-)mZ;$X`9%o(c%t=W8fX_R{_uO+4p}tynd~sAcZqik3p~xKlGTk zWYDu_*4-w@sG3TSzwoyztJQ`e|J$DfBoA+En@!wy85$yy(nuecbJYq~rARm3s5;hE zrttp8_s0T(>SUsR(<&cf#W_!Gs6<0wUeCT;3Q9@S7rr8})E5BlF^sH{)i}ObI zYw2HV>+F#aN^Odr$Upj;pVQmS8vcxbB6U$Wgt7Uw)8%Bw+scvI$5V5BZ#2t2SI;xN z9`)fVSCk|7ZT-ukNoLFREKcS$W-}aFj`-=ww>~3J0<)jqb?)w+AMOpXn%aoXe!N*H zzN9}R9h|r#KNTDy!ZP|EPMdrPrd54K|0CP+xmtR@Msy-&?$YN+wh7XvY3oOF!tr2& z#OkdnJXf4jHSxR5S{qUY1ql4GRtdD;+`@10H1&7VhVSfd-W=TBCQI91Rq(a-Uxgic zSupTs=!vtpZ9Kwq5dN>h6B~J7vu30JW+Se5(Qe0DKogqEY?WJ=4+4AOT&G>;Y2~+F&GBfO@%jAGv?_Jt|_S#_MRYQ>GDmDDe6~d01 zeP*Fo1_XmT>^N`~ON}DG1oxTeCW>m`N9* z8hW9Rc0q^n%FGSdfJo?ofdg&kF;GHwbeB|34m*nAeygv59N3FO5EAPrK+0&w)0t^uVG z$_-SExUT^%kQfKB&Faax4H!a-nSmU`xNX1<@{I#{k}0JN{VQec;F}fgeTe&@Fhmo3 ze=w%M6ReKs0oSf!;LoCoA2{tONaw+#xBz(8HNpoFk{YS*M-Y!AoFb7RgZIw)v_^i^oZJ!2yzL+(csC0#Vd z;(+~Ht^B8=7ye$Zk>=+u<*+?@IzzgXw3EY) z1)hYPEJaq9MVc5Gyt>{LOVcXq4Xc}#`Z<)El&SqqnD!+8?O@uaA9Y^aF*-{qvyz`C zBdrs?IMkBW-4w5m{%4~LJBbf;lDy)Dw1n5i6PupLQ;3dIbwzxwX6p7O=>UwgqBRMg zu~;K`T<_sWY7mOc&Q#TDyJ1!7X_V{VO@6NS%4L7DKkJ)BQ5GCJd~)|}zB)awvi+kn zqWMl+@-kke+(5G<%yVc*$ogFU*U+@-ob}K$=MkY?TvL76ab-b6Y?hswQ&PS)W!2sT1r&Sh7qFU3_zck*9sMTpxWrT&6NtK zBxA9lBgz-vjPcl$Q*QGGN#tzb$POyors%58>i5j+eZfPH_inj;iy02gTWQ}+m)maI!!9SJ$m))Ks$Q4Ceh&_vZZ?jPOU;wiJYt0zb@7az`wN>ekru>9bA=Cv2-qreDS{WK56kFo$;ClTO8Q zF?90Jh7LT`T^|vw&$6?=ZTEG|sy^6yXKsu6oMF&~PCb}amp|EeH+jm6f^0{9tjvp} zq;(=aqFzJ&4#7LQcTPtXEejM3=ZML(q$d@a4>t$kNqN&_XxN6@S5DC2teRAxA77IW z>)_uBNQ*U0d-FnTIG2`5MjEL*Y~duad|HtE-qV$<+?L|{Z8%$evv4!bH{KVr)*n;8 z7QvTQ@ys$mm`R@}iBY61=fhVQs+pkE1Vk8?lhXyB&KMrq1xry}=n{HRRQgzH`VI{4 zwEgljUaAtQJ{%l&Y567tpO>@~qxryB+0OC!ib24-kM-(IOAh{WXE}GGYo zPGh>dP=KX9=;*pboq-;CD|??QWy(73?Ya1hG?=vSH(0ZkS7nh8 z1b9`X;l1Tox*uFath+Wl-Q0SL3rtSqf8lnU5sydQ^68KAAGbT6kH1_yFGiX2mFL~6 z_x1_>FtWygF%DSIz*5>f3wa=gHTuWnTdU0P-shie52oHN|bZbsxj6c4q zipHdahMZLtUsdN)+T;Zk72sdbb7%w~pcadPXGwXo)d@ zaVFlOS1H&-rLH%Tw6#r)d~WvI%#|uLMee7;IZ~~z&$uoH$-lL6nYk1pG4$>BoTRnl z5Z{pec|6l?aFusk-hMKHUKSgYLpePl=T!D=_^ikAFx{6eK@k%2CT9#JtdkeD&~)7v zcYRm9QcW5P@F%^piYR}eukfV0gg-AjHT`o0FZ<$lE7!{+%5Eo-qcWWkYu3E6Q}MOd z+(hFwks|74s`%`%Z0)egk?p7N%YX4egZ5N=djh(PY@9OE)K8av`m39&|Gt>!PM0@# zWr0Ar{6b+sYv}y@lRhl#4hwm9S-Ew;JMmU2^XD3ygVgZ7Cc?%z$ z=I**dHPH3>QN7rWpIuv@=RW%1OW&Bi8=5~>6~Z^(y^mowrJVcnoysy_RKyB@vs?8B{@w&bfjwi}xvOZ1&B vbS3=#Mta}k6c$t`8=S5v*lsSU_PpLath~`Ml#zH}2@88#QgjJ+gX;eQNyVzn literal 95805 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 O|3IFnJpN5a@qYozA>ID~ diff --git a/test/fixtures/vpm2.h5 b/test/fixtures/vpm2.h5 index 94816799a49a46bb20bc9f187b58687d1ac4e99f..fc4a159e66486731a467ddee9a011794e9562882 100644 GIT binary patch delta 10231 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 0 + @test n_cuts == length(cuts_ub) + @test cuts_lhs.shape[1] == n_cuts + finally + h5.close() + end +end diff --git a/test/src/MIPLearnT.jl b/test/src/MIPLearnT.jl index c783574..f91d315 100644 --- a/test/src/MIPLearnT.jl +++ b/test/src/MIPLearnT.jl @@ -19,6 +19,7 @@ include("BB/test_bb.jl") include("components/test_cuts.jl") include("components/test_lazy.jl") include("Cuts/BlackBox/test_cplex.jl") +include("Cuts/tableau/test_gmi.jl") include("problems/test_setcover.jl") include("problems/test_stab.jl") include("problems/test_tsp.jl") diff --git a/test/src/test_io.jl b/test/src/test_io.jl index 95c0087..88745f9 100644 --- a/test/src/test_io.jl +++ b/test/src/test_io.jl @@ -4,6 +4,7 @@ using MIPLearn using JLD2 +using SparseArrays struct _TestStruct n::Int @@ -35,6 +36,8 @@ function test_h5() _test_roundtrip_array(h5, [1, 2, 3]) _test_roundtrip_array(h5, [1.0, 2.0, 3.0]) _test_roundtrip_str_array(h5, ["A", "BB", "CCC"]) + _test_roundtrip_sparse(h5, sparse([1; 2; 3], [1; 2; 3], [1; 2; 3])) + # _test_roundtrip_sparse(h5, sparse([1; 2; 3], [1; 2; 3], [1; 2; 3], 4, 4)) @test h5.get_array("unknown-key") === nothing h5.close() end @@ -79,3 +82,11 @@ function _test_roundtrip_str_array(h5, original) @test recovered !== nothing @test all(original .== recovered) end + +function _test_roundtrip_sparse(h5, original) + h5.put_sparse("key", original) + recovered = MIPLearn.convert(SparseMatrixCSC, h5.get_sparse("key")) + @test recovered !== nothing + @test size(original) == size(recovered) + @test all(original .== recovered) +end