From 9f50ad8706f9fa19e87beca12a8f9f3fea02566f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 16 Apr 2025 16:46:50 +0100 Subject: [PATCH 001/343] HDVF: new package --- Documentation/doc/Documentation/packages.txt | 4 ++ HDVF/doc/HDVF/Concepts/Concept.h | 2 + HDVF/doc/HDVF/Doxyfile.in | 3 ++ HDVF/doc/HDVF/HDVF.txt | 29 +++++++++++++++ HDVF/doc/HDVF/PackageDescription.txt | 37 +++++++++++++++++++ HDVF/doc/HDVF/dependencies | 6 +++ HDVF/doc/HDVF/examples.txt | 0 HDVF/doc/HDVF/fig/pkg-small.png | Bin 0 -> 9467 bytes HDVF/include/CGAL/Class.h | 2 + HDVF/package_info/HDVF/copyright | 0 HDVF/package_info/HDVF/description.txt | 0 HDVF/package_info/HDVF/license.txt | 0 HDVF/package_info/HDVF/long_description.txt | 0 HDVF/package_info/HDVF/maintainer | 0 14 files changed, 83 insertions(+) create mode 100644 HDVF/doc/HDVF/Concepts/Concept.h create mode 100644 HDVF/doc/HDVF/Doxyfile.in create mode 100644 HDVF/doc/HDVF/HDVF.txt create mode 100644 HDVF/doc/HDVF/PackageDescription.txt create mode 100644 HDVF/doc/HDVF/dependencies create mode 100644 HDVF/doc/HDVF/examples.txt create mode 100644 HDVF/doc/HDVF/fig/pkg-small.png create mode 100644 HDVF/include/CGAL/Class.h create mode 100644 HDVF/package_info/HDVF/copyright create mode 100644 HDVF/package_info/HDVF/description.txt create mode 100644 HDVF/package_info/HDVF/license.txt create mode 100644 HDVF/package_info/HDVF/long_description.txt create mode 100644 HDVF/package_info/HDVF/maintainer diff --git a/Documentation/doc/Documentation/packages.txt b/Documentation/doc/Documentation/packages.txt index 24513e000baa..6424425d5cc9 100644 --- a/Documentation/doc/Documentation/packages.txt +++ b/Documentation/doc/Documentation/packages.txt @@ -129,7 +129,11 @@ \package_listing{Stream_lines_2} \package_listing{Classification} \package_listing{Heat_method_3} + +\cgalPackageSection{PartTopology,Topology} + \package_listing{Surface_mesh_topology} +\package_listing{HDVF} \cgalPackageSection{PartSearchStructures,Spatial Searching and Sorting} diff --git a/HDVF/doc/HDVF/Concepts/Concept.h b/HDVF/doc/HDVF/Concepts/Concept.h new file mode 100644 index 000000000000..74b90108e478 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/Concept.h @@ -0,0 +1,2 @@ + +class Concept{}; diff --git a/HDVF/doc/HDVF/Doxyfile.in b/HDVF/doc/HDVF/Doxyfile.in new file mode 100644 index 000000000000..2a35a9e90980 --- /dev/null +++ b/HDVF/doc/HDVF/Doxyfile.in @@ -0,0 +1,3 @@ +@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} + +PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Homological Discrete Vector Fields" diff --git a/HDVF/doc/HDVF/HDVF.txt b/HDVF/doc/HDVF/HDVF.txt new file mode 100644 index 000000000000..edda03525f3e --- /dev/null +++ b/HDVF/doc/HDVF/HDVF.txt @@ -0,0 +1,29 @@ +namespace CGAL { +/*! + +\mainpage User Manual +\anchor Chapter_PACKAGE_NAME +\anchor chaptermine +\cgalAutoToc +\author AUTHOR1, AUTHOR2, and AUTHOR3 + +This chapter describes the ... + +\section secmydefinitions Definitions + +Section on definitions here ... + +\section secmyexamples Examples + +\subsection myFirstExample First Example + +The following example shows ... + +\cgalExample{ } + +\cgalFigureBegin{figPck,bench.png} +Left: ... +\cgalFigureEnd + +*/ +} /* namespace CGAL */ diff --git a/HDVF/doc/HDVF/PackageDescription.txt b/HDVF/doc/HDVF/PackageDescription.txt new file mode 100644 index 000000000000..2bd812c23c95 --- /dev/null +++ b/HDVF/doc/HDVF/PackageDescription.txt @@ -0,0 +1,37 @@ +// PRETTY HDVF should equal the project title in Doxyfile.in + +/// \defgroup PkgHDVFRef Homological Discrete Vector Fields Reference +/// \defgroup PkgHDVFConcepts Concepts +/// \ingroup PkgHDVFRef + +/// \defgroup PkgHDVFAlgorithmClasses Algorithm Classes +/// \ingroup PkgHDVFRef + +/// \defgroup PkgHDVFTraitsClasses Traits Classes +/// \ingroup PkgHDVFRef + +/// \defgroup PkgHDVFMiscellaneous Miscellaneous +/// \ingroup PkgHDVFRef + +/*! +\cgalPkgDescriptionBegin{HDVF,PkgHDVF} +\cgalPkgPicture{pkg-small.png} + +\cgalPkgSummaryBegin +\cgalPkgAuthors{Alexa Bac} +\cgalPkgDesc{ +The package provides ... } +\cgalPkgManuals{Chapter_HDVS,PkgHDVFRef} +\cgalPkgSummaryEnd + +\cgalPkgShortInfoBegin +\cgalPkgSince{X.X} +\cgalPkgDependsOn{\ref PkgDEPENDENCY} +\cgalPkgBib{cgal:b-hdvf} +\cgalPkgLicense{\ref licensesGPL "GPL"} + +\cgalPkgShortInfoEnd + +\cgalPkgDescriptionEnd + +*/ diff --git a/HDVF/doc/HDVF/dependencies b/HDVF/doc/HDVF/dependencies new file mode 100644 index 000000000000..a4d5f76715e3 --- /dev/null +++ b/HDVF/doc/HDVF/dependencies @@ -0,0 +1,6 @@ +Manual +Kernel_23 +STL_Extension +Algebraic_foundations +Circulator +Stream_support diff --git a/HDVF/doc/HDVF/examples.txt b/HDVF/doc/HDVF/examples.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/HDVF/doc/HDVF/fig/pkg-small.png b/HDVF/doc/HDVF/fig/pkg-small.png new file mode 100644 index 0000000000000000000000000000000000000000..5609b037587a48c46b483d2c0768c7ae88b40c72 GIT binary patch literal 9467 zcmZ`QsjDeqppv3OAP@}2H?o@G)$`?vj0nC9ne$JA7erHK1zGS4zV2k21HcQ4 z zCJl=cDv8?+kDJMb7&3R*r#9Iwrub+2I7!eriC^t2XLk3%^j*@x3U5uey|6ovm})lf z&^Np>>jQqLNi~D}ZZdw@T2ypcdP!s$*r4&YrJMVZH%Onc|0Fp5-Ocg|?%HmtpEd-On~O*pAO8iP^87-XI%SYLZHOjC2|PNsojDhu^5nYAv&DP} zF(b_6d;@1}^;|7JW-|J7Vc!lf%A3v)lU#BE3YfXGRU3@_ch4=&M@Jl{MedF~P!QE_oPp-z~06lE>Y`l8(x0P}}hJe+oczo-?$g zO>tIq=g(d8IdONsJvA|{UySNnZ-6~DI3*<|MV8aJc#@FQ*xH*Y+!__BPx|?j-g!)H zU@L}Ga_P7`q-mN@5ZQSR5^J}TB|SMgztu}Nmni0QZ2&XRsj8~l4dsG=@&l_n&%B?J zrB!6CYU!kBoEn64s~IxQFr4%f<*>H0qSmWOowxg?JURACJ|=Z&+v?M&hz@A`X1oM) zVGY`t_(Ave5q?q<2j@siAKYvO+^sJqJ}QC=Bc7g~Ui-RZLUuMr;v0BjvDbuuqhaQ4 z>NaL{a%Fsc#Eg7KqU;xut$q&88BAGO^^dT(hoKRvYib5>Y?!L3sI)`5^6Kk}XcLiz zgoNIxsy^<(wFEp@ot_Uphu{hxsK{Ud9e`bkrV&$IHuClvkG$KB`9M*c4H;)+=506kqRfqX%elFRzJVD5kTEOJYt=TvLKd>db%X2IAogsv9SnUHbnL~(fa23d6e#^~`(#;F87;@;i?egYF`RFf2k6DJRgYUP7|%P9s1l;0qS99u zj@*;;^JymM=ijJh3(N76VmJws!|;qa)Z@j<%lJRvuO=f=`34&J*c0F&Cq=#KW)yL! zPv-ocRTsnQuhS@+(sHxngZ8J8Ir{SYI%%rpEmGa1DkGkd$1%CJgG1ZHPpg=o;1mBF z{ZnuK@%cSj!H_T5Yn%Zv*Tq}9~a)^4QpvBAU4%#15@#LC(_NIG9qNojB}r{nSQ z@mo1t{KFQLq6r>>cdvKr_5b#`ZQa)odFp$gy{vmO8=Zh2I zA^o`~E)LVc?L8l*cYmPAic?4rs^9Y^?`b<6`I0*smcY^}PpMY+e5;Rur>K#sodP2d zv@BYd79A7Q)YFr=V9XE=FYT!j>I zlT1wsY-|n4FL@tmS1%lfz6xq>Z3V4ST3RZps*2Iu*EcagkDNI|c=^;v=|lehz0PJ) zny!_#qO|JB`=E}=m6f>SVn*Uvd3F3cXv}G*noXT|$H`-e)y#kI6Na|c%Vzfe{tfQi zY`j!0rFN|kQTrz;UyU2Ye*TpS7a zE&aS-=-pZxZ<04A#ya{?b!D3?OAE96nny!PwfXc zK_1s~#e7mrXKXgEymuc*0f5%oDkEpB(G?aJN-h4>tN2!1%Try|w0!JE>TYZMN~3H> zxvh3+yUEq3dceGMwqnj~jFRlvC#+UB4-Ysp0cWSpScxtoV_$^CH@pE@cYngCt$5#P zrN(xx>uTAm0uVGbq=4i#Hj+5h`>bf{>FUBZ8nmp5>^%8-c?tdf`*-ck)A4vo2%y%j zuQ(ufEp6@2ZRh;oza_Rr7{e6D`zWCCeIbhui=XWmiyco|^E-|X;eXk!Z#3>+gDbjb z8(fR*G36pgCywn6g#Z?8NA57>CPvrN(vqZ21daAOPjJ z>J^&G&iU69MMcF6iyhOXv@|5r*znm|ZGikieVgk~_f&zB)X2>hTU+J;EITY}^Q)?` z5JO;kdV2bYheJm!LV8SLBoLj&D|v3)gC4Ey#e(A{+^N3^3|qlFwDKWTwO*^~uE9cb z$08)D+t=3CevGaC{K>1LrWWq@$-#j`Nl9sZb{4U01~qLc?BU@da#01G@cZ`!q0%&< z5V(YeNx5Ekk=PAkR?8Q5T#QLXy%l$&{(>~T4*BJQq0w9kEa7a*6tr=$dC*FPF$lJ^*Ld0Qc(FT3~>y|7LuVqgH~)!^5M@YB+>?`l_l0oI zffA)ctM!qe0uIj0b2AoBqyD|RdSFHdiHfQ!`>X!DySuyztG&ZRbS3d&f|9AIU%&Xd zGE|V^VO`za!nz~?%S#q%1`U{-9{s74;yVG?{)QeG9Rs5S%0*8Jjg=1xc)szwT?-k% zckmE6-G~{uJ$ZgY9~c;zIAKBI&U|1*gOqBqg4#fk^l3E$Z$!w#gQ#n0z<{C*3JSv3 zI^_NO^(&M+L*392BSYm^>8u*~&42;~wEcR;M|)2^0!3G&BUl1Od>@(01^Mg^avB zqK%CWxMb8QSyI6N$CVZpfMAOH}!#fUR0DJkLW zS5#2C(#Y}(3L5X<^NsZ$?d>5C^S2sdwHn0-2g80zO_e8iRVbWL*VBszO|Z4IQ}F#e z3IPFu@>g?>8+01@x1whdBfpt2_3t9?BB#SVq&`~Bm`4+w;a!=Qb57#-AujjgSjbJn-wVp`C3;<;E#MY!cfOU^Zi9Vfq^#eLgM z4(Dx(p&6{5(B6NXu!9r zeLzX$Hg!&hji95$BO*4j9ACVNh)9iD-(YX3z2Xj>sva~4H8(X`(5qz7SDPO+e(=#z~?&Iex{4>c7@Fx~=51orrRTZC}on?ey zll97EBSZrr5r1~(RBqHNOpoSv#+H+wjx3SNik|p}Ub#{a2gdhuPosK)LraI#uWA5( zcvu~6IAZ(DHg6`VucoG^@r8w`&Q9rUt~?XcWbdf*b-v(fMu#ecWgvl_kG3i8w^ z5eL1$K25bO#OWUxP;HPWds}O5V}lwS8=IbyA!TpRj*5zEI(RVB-yhhu9yqiey?A5s z@nabJ2}MXQ)y35~U=^MDq6W>DW9|*Vaaa&ZaN{!OP7Z?6Nz`p1$o*_#fyb5)u-iZtR!Z zvqfS?EL@gy`b=xU6+>%ugE331VYI)iL8ppOQ;3qIVuy#zLqiVcoL!uqVbvhN?Exl5 zA0FCi>F6N+fPWau954@7Dhi%E=xK60fQ4~8OZ9|nndk8nH#S#xwY8JzYKIgzPN*x!Zv|fT3w9~hQ&20)RMO9YGlO79W!2ozsXc>w`0iN z*|GQ>7iW6)cLs1DVoZ;;ySqCzrVtK5I$WK=$B^FNni}{7B<G<`|z5u4zB(sgaFR-n^@)SYYz9e5M9hfJ2k+1rwhp(p~H@$ zv*i*Xa%?9`7swNs|3U(zrzyo)mnot z5JGTe;|9Oj%NhPyWJWazesJK(n~SHn+W|z(3(rZD%NIu(HYEDkh(woS!-NL3OQc$f{4i1?6e5TwPPIGT}#Cc2uNzf5#-$%y8 z1l7ED>6Eqx)($*?RG*xj4E~|sG0a%IfSx;6Z-tn<>=2<{CI^&^Ao*z0$$FL3%3@sK1PT%yb+s)B?~a@F9)b9&lUvhLit zp^Z9V#VcJlL(9X1cQ9Ll_U8^aiat-h?&nYV>*AO?%?j<9)rTF(^|2pZROm9_pO<$XHlN`E>e3qv(;2^?B?PiSja_k6)f^J z3V3w;@ln}EYy0Tts4zKO2=NH5anA%aj;F`A?!7_mOA##Cet;#B?ruE>Ab&UIZx{|9&i zzM^^GQLul1sss*B2siM`+i&fDhwuZM@=LnKMJyW0=+OKPo|(Pqv_#^Ortu-881n?c9WBf?qe!N9X7%|V3JHB>BxOO#ngOsW&-Cxk+ zRezZ;vis_w0JnC#_|S>g!+2{4Yu$b+@FM zX+lF)ruEp~oIKs1ASJVOCelsR`>jEUfL41DwHVlU4el{z7lwjpC-Li7(i)GUZD)k{ zf?cqJ3=9Zm+7$|Zey%uSt9O{=tE;hbadC1Ax!Pr6N=2~oeKEFdUwTYYzISk@F3J{8 zRNF7M-sV0>aoAZ}AX?cQrh8iQXQqkf0<{;49)`i_LMOY!`oUyuZE%n@OPFBU&XhYS zg38@&wT+1IV?KzIfH~ZtMB8>0Ol7nEsp~KmE8rj}BjXz4?MaLsb&Hm2TD#D)wT3~M zkAvCnl05Yo!dG6u>)cpcR@Rll;}8m6lO7!N-|3ksG=^VtBdS$DQ%blKpL_i z932hUR+bYBXuN%S*`>A12+$GD27(SX*WS>8B}R zAE$R&UK0n7DU57($I8=nn+VP_F)<~krV_gA`z!I4#^D^xfN0Tah`oMoh?7P30NJEA zNMO}_3?yIk>V@Khpfd^LFvC+VIZmpmP-ce2tVcLcd5eX?Rs}%@wi&_!} z1_qjJc9*iTKX$(o?!D(BE{z82_+jk&zXAt_+b0SqJUq1tPY;Ym9On!@x+_lI1Ocsu zfTRXEHFo3-fToV8i1B?gN=m5ch%zcX>DaJAl8_9Q@cn)3`J?MR)Ky@VK$6VG#}@{q zNnU7J-zG}dsBqdgYMm$?4x#jgW$&_6pP1*}w()u|Sz-Lq)1U%o5cQqj`GOpPhMgS)_~_@`J_*yD4u9-#nk>xG zs9(q}Y8ODZ3q&N)R9;?QF~`jygxNbfk^{N%Ifw8YC(zzo{uDUi;E4gBWeR-iHGVqB zdAd~~J8t3mhxxqCDR$d|H9g;WK?%Z2DqQXuA#%*Y!9hvnAi$@KN0{b&BXwzazT%qi z-kGh09Jz}W7ZWk#`rMPg%8#oXk&*pR!yZ-80~_06ECQ!h($qAEa9u!vILq zf?W^DVF`(Vl?$*RP^KXkrnf!6-6r;3%RkgImQL~kX*WDPoS?XW`9`FtikUe@2|3L9 zVK<;xJ28C>sqJAhJOs(O!?vn5IECI-Sge;srQ^tbY$y#i;-{6py&TB0A$ct=z7q*F zg%b_mHV9t}KOq4CHG6*YINOL(jI5)VSHpCCXrTCgzdYpmcx7Bk9B64hI)A?RS;7Z(MFkmUzW<2;7+^FsG`L+{5Rk3S{r1ONtarhV z$9=ED=(rY$_Ez+D04`wR9EG!kU^5qg*>};!KS6BN_!t8vBcSdV9e# zx2ssyV@-c`gW71(QVQnu=C_FB&GJ#hzrU=a*Yh$?>_`n+K3p{LU0q$+QL^(tt?@u7 z6bS#fY&`P|C@`P~G-_ky3)vw;jC9&;gmf${)SgwCl)Qx<%1H17Oj%271YHTSF?=rIBqwcvj zL83;XT&L?1xp}2~j9?=6IV$Sbtw9oUxVS52RtN_NheVyc4c#5}8UORgd%=1_IchbS zn4J9O;z6*(933r+!!fJ2<|t^~$6>w8tf=Dqa7LA{wG!uckmR&3?JLq&jeWZYht$-R z)jxC(*YNz-*Rj=;#pfX7x~&?f}cB(2NO!dk|E$wvz6-8a6nt!&WwrrX`RZ zItu1Z?E^O)1tuN<0N2Z^+F*e)mM;vFq>g0%%mfjRGEGM)6I++4&nqsrkcyxb_azqb zSc&bUbTPYez)HO!e^o^!=!JW``uuTyOOZoQ?=WG2KCkrd$vABYE^`E>YzCuhF5>Xe zd~0i5L-$RHfrE@<6c#Fi`Ue!*gnKb0E=g)A7{+maC&2PmvLyqJ zL3}r!vAeqg3`{3xery>FA+@?})6>%+k7d_uYy0*M zKG)wH{ke+`b7OthN?zBM<1QH`V%8B3VeKg6oDc> z^KQl2M&e`~LgbJ@>D4j!_ zT*3SiAklx*)<^&01DmEEE49SKy4%)>fH4yYgMd1f&1zRgrUBXix3;#N27}7dC-HQ) zgN|n4VwqW3q?DD>SYN%8Y3jD(B?UUv@pLVsdci+rO#B`_H{i+gVMjm#M$qx`insiO znT#q%wKrcvWvQ$v95RR6^?>-=@~Vh4j%0XR|pe3`)e0MYZqQ?7gOzlD2b&I zFmMJ02EvtaT{ffCFWSG=@e%6uFro|8!BF?+&j%EQ`7!spx;iOfa!X5@^CK)Oc%2#z zKz0ugepSuy2851ynAN#(Z2(35m-f$LjFIP1uQ!*u$ zuP*zA)k_FXP6G^$(zCJvjvCB%-zZ~pab;f5FD#${o!4lP!?nGw2}UpIP0h`qbu=_I zaCB6?dSDNC4UmwKKAJ z)6aD!;4J~|jnB;?<*TQwU)adO9-iO_@O_|+kLc{|3_W}|1asKl4goR8mh&CMV>kiA zsR0OnRH&jE%5 zL6X?SvQa-wsvzXD1{^vN>gHw2(yrG;vH`)V68ZKVw;(YB3CGLBQBZ?w&@c#fjbm>h1 literal 0 HcmV?d00001 diff --git a/HDVF/include/CGAL/Class.h b/HDVF/include/CGAL/Class.h new file mode 100644 index 000000000000..c8735e63b46b --- /dev/null +++ b/HDVF/include/CGAL/Class.h @@ -0,0 +1,2 @@ + +class Class {}; diff --git a/HDVF/package_info/HDVF/copyright b/HDVF/package_info/HDVF/copyright new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/HDVF/package_info/HDVF/description.txt b/HDVF/package_info/HDVF/description.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/HDVF/package_info/HDVF/license.txt b/HDVF/package_info/HDVF/license.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/HDVF/package_info/HDVF/long_description.txt b/HDVF/package_info/HDVF/long_description.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/HDVF/package_info/HDVF/maintainer b/HDVF/package_info/HDVF/maintainer new file mode 100644 index 000000000000..e69de29bb2d1 From 0a81b3e41fbe8b56ba22fd044bc688d8ec6b2504 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 16 Apr 2025 17:49:36 +0200 Subject: [PATCH 002/343] Typo --- HDVF/doc/HDVF/PackageDescription.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HDVF/doc/HDVF/PackageDescription.txt b/HDVF/doc/HDVF/PackageDescription.txt index 2bd812c23c95..9f0a5dfcad7a 100644 --- a/HDVF/doc/HDVF/PackageDescription.txt +++ b/HDVF/doc/HDVF/PackageDescription.txt @@ -21,7 +21,7 @@ \cgalPkgAuthors{Alexa Bac} \cgalPkgDesc{ The package provides ... } -\cgalPkgManuals{Chapter_HDVS,PkgHDVFRef} +\cgalPkgManuals{Chapter_HDVF,PkgHDVFRef} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin From caf30cf1fdc36f1ad673d55d9ae8ec7555fb65bc Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 16 Apr 2025 17:59:04 +0200 Subject: [PATCH 003/343] Example of concept and class --- HDVF/doc/HDVF/Concepts/Concept.h | 14 +++++++++++++- HDVF/include/CGAL/Class.h | 18 +++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/HDVF/doc/HDVF/Concepts/Concept.h b/HDVF/doc/HDVF/Concepts/Concept.h index 74b90108e478..e8832f906611 100644 --- a/HDVF/doc/HDVF/Concepts/Concept.h +++ b/HDVF/doc/HDVF/Concepts/Concept.h @@ -1,2 +1,14 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept -class Concept{}; +The concept `Concept` represents ... + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Class`} +\cgalHasModelsEnd + +*/ +class Concept +{ +}; diff --git a/HDVF/include/CGAL/Class.h b/HDVF/include/CGAL/Class.h index c8735e63b46b..91eb4530348e 100644 --- a/HDVF/include/CGAL/Class.h +++ b/HDVF/include/CGAL/Class.h @@ -1,2 +1,18 @@ -class Class {}; +namespace CGAL { + +/*! +\ingroup PkgHDVFAlgorithmClasses + +The class `Class` represents something... + +\cgalModels{Concept} + +\tparam XXX a model of the `Something` concept. +*/ + +template< typename XXX> +class Class { +}; + +} /* end namespace CGAL */ From c487c1ef792ce5af44eb49a93107ceaea9264f5c Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 17 Apr 2025 12:37:45 +0100 Subject: [PATCH 004/343] Add package_info --- HDVF/doc/HDVF/HDVF.txt | 12 ++++++------ HDVF/include/CGAL/Class.h | 16 ++++++++++++++++ HDVF/package_info/HDVF/copyright | 1 + HDVF/package_info/HDVF/license.txt | 1 + HDVF/package_info/HDVF/long_description.txt | 1 + HDVF/package_info/HDVF/maintainer | 1 + 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/HDVF/doc/HDVF/HDVF.txt b/HDVF/doc/HDVF/HDVF.txt index edda03525f3e..43a104f0aa79 100644 --- a/HDVF/doc/HDVF/HDVF.txt +++ b/HDVF/doc/HDVF/HDVF.txt @@ -2,20 +2,20 @@ namespace CGAL { /*! \mainpage User Manual -\anchor Chapter_PACKAGE_NAME -\anchor chaptermine +\anchor Chapter_HDVF + \cgalAutoToc -\author AUTHOR1, AUTHOR2, and AUTHOR3 +\author Alexandra Bac This chapter describes the ... -\section secmydefinitions Definitions +\section secHDVFdefinitions Definitions Section on definitions here ... -\section secmyexamples Examples +\section secHDVFexamples Examples -\subsection myFirstExample First Example +\subsection HDVFFirstExample First Example The following example shows ... diff --git a/HDVF/include/CGAL/Class.h b/HDVF/include/CGAL/Class.h index 91eb4530348e..8701fcb44271 100644 --- a/HDVF/include/CGAL/Class.h +++ b/HDVF/include/CGAL/Class.h @@ -1,3 +1,19 @@ +// Copyright (c) 2025 Marseille University (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_CLASSIFICATION_H +#define CGAL_CLASSIFICATION_H + +#include + namespace CGAL { diff --git a/HDVF/package_info/HDVF/copyright b/HDVF/package_info/HDVF/copyright index e69de29bb2d1..22062b19aa9b 100644 --- a/HDVF/package_info/HDVF/copyright +++ b/HDVF/package_info/HDVF/copyright @@ -0,0 +1 @@ +University of Marseille diff --git a/HDVF/package_info/HDVF/license.txt b/HDVF/package_info/HDVF/license.txt index e69de29bb2d1..8bb8efcb72b0 100644 --- a/HDVF/package_info/HDVF/license.txt +++ b/HDVF/package_info/HDVF/license.txt @@ -0,0 +1 @@ +GPL (v3 or later) diff --git a/HDVF/package_info/HDVF/long_description.txt b/HDVF/package_info/HDVF/long_description.txt index e69de29bb2d1..6527bfe696bf 100644 --- a/HDVF/package_info/HDVF/long_description.txt +++ b/HDVF/package_info/HDVF/long_description.txt @@ -0,0 +1 @@ +Homological Discrete Vector Fields diff --git a/HDVF/package_info/HDVF/maintainer b/HDVF/package_info/HDVF/maintainer index e69de29bb2d1..5cc6bd025a7b 100644 --- a/HDVF/package_info/HDVF/maintainer +++ b/HDVF/package_info/HDVF/maintainer @@ -0,0 +1 @@ +Alexandra Bac From ef8700900601f016c668ad3108a0c0514defb31b Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Mon, 28 Apr 2025 09:10:15 +0200 Subject: [PATCH 005/343] Preliminary version, compiling hdvf, per_hdvf and dual_hdvf compile. Documentation started --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 75 + HDVF/doc/HDVF/HDVF.txt | 14 +- HDVF/examples/HDVF/CMakeLists.txt | 25 + HDVF/examples/HDVF/arguments.cpp | 343 +++ HDVF/examples/HDVF/arguments.h | 48 + HDVF/examples/HDVF/main_dual_hdvf.cpp | 307 ++ HDVF/examples/HDVF/main_hdvf.cpp | 244 ++ HDVF/examples/HDVF/main_per_hdvf.cpp | 309 ++ .../Abstract_simplicial_chain_complex.hpp | 728 +++++ HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 213 ++ HDVF/include/CGAL/HDVF/Cubical_complex.hpp | 1007 +++++++ HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 223 ++ HDVF/include/CGAL/HDVF/Simplex.hpp | 97 + HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 128 + HDVF/include/CGAL/HDVF/Z2.hpp | 115 + HDVF/include/CGAL/HDVF/Zp.hpp | 147 + HDVF/include/CGAL/HDVF/hdvf.hpp | 2043 +++++++++++++ HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 664 +++++ HDVF/include/CGAL/HDVF/hdvf_tools.hpp | 114 + HDVF/include/CGAL/HDVF/per_hdvf.hpp | 1003 +++++++ HDVF/include/CGAL/HDVF/sub_chain_complex.hpp | 201 ++ HDVF/include/CGAL/HDVF/tools_io.hpp | 1154 ++++++++ HDVF/include/CGAL/OSM/Bitboard.hpp | 858 ++++++ HDVF/include/CGAL/OSM/Chain.hpp | 980 ++++++ HDVF/include/CGAL/OSM/OSM.hpp | 20 + HDVF/include/CGAL/OSM/SparseMatrix.hpp | 2625 +++++++++++++++++ HDVF/include/CGAL/OSM/__base.hpp | 71 + main_hdvf.cpp | 244 ++ 28 files changed, 13998 insertions(+), 2 deletions(-) create mode 100644 HDVF/doc/HDVF/Concepts/AbstractChainComplex.h create mode 100644 HDVF/examples/HDVF/CMakeLists.txt create mode 100644 HDVF/examples/HDVF/arguments.cpp create mode 100644 HDVF/examples/HDVF/arguments.h create mode 100644 HDVF/examples/HDVF/main_dual_hdvf.cpp create mode 100644 HDVF/examples/HDVF/main_hdvf.cpp create mode 100644 HDVF/examples/HDVF/main_per_hdvf.cpp create mode 100644 HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp create mode 100644 HDVF/include/CGAL/HDVF/CubComplexTools.hpp create mode 100644 HDVF/include/CGAL/HDVF/Cubical_complex.hpp create mode 100644 HDVF/include/CGAL/HDVF/SimpComplexTools.hpp create mode 100644 HDVF/include/CGAL/HDVF/Simplex.hpp create mode 100644 HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp create mode 100644 HDVF/include/CGAL/HDVF/Z2.hpp create mode 100644 HDVF/include/CGAL/HDVF/Zp.hpp create mode 100644 HDVF/include/CGAL/HDVF/hdvf.hpp create mode 100644 HDVF/include/CGAL/HDVF/hdvf_duality.hpp create mode 100644 HDVF/include/CGAL/HDVF/hdvf_tools.hpp create mode 100644 HDVF/include/CGAL/HDVF/per_hdvf.hpp create mode 100644 HDVF/include/CGAL/HDVF/sub_chain_complex.hpp create mode 100644 HDVF/include/CGAL/HDVF/tools_io.hpp create mode 100644 HDVF/include/CGAL/OSM/Bitboard.hpp create mode 100644 HDVF/include/CGAL/OSM/Chain.hpp create mode 100644 HDVF/include/CGAL/OSM/OSM.hpp create mode 100644 HDVF/include/CGAL/OSM/SparseMatrix.hpp create mode 100644 HDVF/include/CGAL/OSM/__base.hpp create mode 100644 main_hdvf.cpp diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h new file mode 100644 index 000000000000..cdb09f212d73 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -0,0 +1,75 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `AbstractChainComplex` describes the requirements for (topological) chain complexes associated to abstract complexes used in the concept `CGAL::HDVF`. + It provides methods to: + + - get the dimension of the complex, the number of cells in each dimension + - get the boundary and co-boundary of cell(s) + - get the vertices of a given cell + - output the complex in text format + + Cells are indexed along each dimension and thus identified by their index together with their dimension. + + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} +\cgalHasModelsEnd + +*/ + +class AbstractChainComplex +{ + /// \name Types + /// @{ + + /*! + Type of column-major chains (returned by the boundary operator) + */ + typedef OSM::Chain CChain; + + /*! + Type of row-major chains (returned by the co-boundary operator) + */ + typedef OSM::Chain RChain ; + + /*! + Type of column-major sparse matrices (used to store the boundary operator) + */ + typedef OSM::SparseMatrix CMatrix; + + /// @} + + /// \name Operations + /// @{ + + /*! + Returns the dimension of the complex (ie. largest dimension of cells) + */ + int dim() ; + + /*! + Returns the number of cells of dimension `dim`. + + If `dim` is negative of larger than the dimension of the complex, returns 0. + */ + int nb_cells(int dim) ; + + /*! + Returns all boundary matrices. + + The function returns a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial d_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). + */ + const vector & get_bnd_matrices() const ; + + /*! + Returns the boundary of the cell of index `id_cell` in dimension `dim`. + + This boundary is a finite linear combination of cells of dimension `dim`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). The boundary of the this cell is thus the `id_cell`-th column of the boundary matrix in dimension `dim`. + */ + CChain d(int id_cell, int dim) ; + + /// @} + +}; diff --git a/HDVF/doc/HDVF/HDVF.txt b/HDVF/doc/HDVF/HDVF.txt index 43a104f0aa79..d649c67e4870 100644 --- a/HDVF/doc/HDVF/HDVF.txt +++ b/HDVF/doc/HDVF/HDVF.txt @@ -7,9 +7,19 @@ namespace CGAL { \cgalAutoToc \author Alexandra Bac -This chapter describes the ... +This chapter describes the Homological Discrete Vector Field (HDVF) package: a framework for "geometric" homology computation. HDVFs provide tools to compute basic homological information (such as Betti numbers, ie. number of holes per dimension), but also higher level information (homology and cohomology generators, homology/cohomology annotation...). Moreover HDVFs provide persistent homology computation tools as well as Alexander duality and relative homology tools. -\section secHDVFdefinitions Definitions +A chain complex is an algebraic structure, associated to a given geometric complex (such as a simplicial, a cubical or a cellular complex) encoding cells in each dimension (through groups) and adjacency between such cells (through morphisms called boundary maps). + +\section secHDVFdefinitions Overview + +Section on definitions here ... + +\section secHDVFdefinitions Computational homology reminders + +Section on definitions here ... + +\section secHDVFdefinitions HDVF definitions Section on definitions here ... diff --git a/HDVF/examples/HDVF/CMakeLists.txt b/HDVF/examples/HDVF/CMakeLists.txt new file mode 100644 index 000000000000..0fde223b42f8 --- /dev/null +++ b/HDVF/examples/HDVF/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.12...3.31) +project(Kernel_23_Tests) + +# CGAL + +find_package(CGAL REQUIRED COMPONENTS Core) +IF ( CGAL_FOUND ) + message("${CGAL_LIBRARY_DIRS}") +ENDIF() + +include_directories(BEFORE "include") + +# For Tetgen +#set(CMAKE_TETGEN_PATH "/Users/umenohana/Dropbox/G-Mod/TopAlg/code/tetgen1.6.0/build/" ) +#configure_file( ${CGAL_LIBRARY_DIRS}/include/CGAL/HDVF/config.h.in ${PROJECT_SOURCE_DIR}/generated/config.h ) +#include_directories( ${PROJECT_SOURCE_DIR}/include/CGAL/HDVF/generated/ ) + +add_executable(hdvf main_hdvf.cpp arguments.cpp) +target_link_libraries(hdvf CGAL::CGAL CGAL::CGAL_Core) + +add_executable(per_hdvf main_per_hdvf.cpp arguments.cpp) +target_link_libraries(per_hdvf CGAL::CGAL CGAL::CGAL_Core) + +add_executable(dual_hdvf main_dual_hdvf.cpp arguments.cpp) +target_link_libraries(dual_hdvf CGAL::CGAL CGAL::CGAL_Core) diff --git a/HDVF/examples/HDVF/arguments.cpp b/HDVF/examples/HDVF/arguments.cpp new file mode 100644 index 000000000000..19e493438f03 --- /dev/null +++ b/HDVF/examples/HDVF/arguments.cpp @@ -0,0 +1,343 @@ +#include +#include +#include "arguments.h" + +using namespace std ; + +void usage() +{ + cout << "usage:" << endl ; + cout << "\talgorithm [options] in_file" << endl ; + cout << "with:" << endl ; + cout << "algorithm = hdvf (for hdvf (co)homology compuation)" << endl ; + cout << "\t dual_hdvf (for hdvf Alexander duality)" << endl ; + cout << "\t per_hdvf (for hdvf persistent (co)homology)" << endl ; + cout << "and options:" << endl ; + cout << "\t-outfile_root = xxx : sets the outfile root for outfiles names to xxx (default: res)" << endl ; + cout << "\t-opt (bnd|f|g|full) : HDVF option (default: full)" << endl ; + cout << "\t-s n : ring used to compute homology, 0: Z, n: Z/nZ (default: 0)" << endl ; + cout << "\t-rand : compute a random perfect HDVF (default: false, computing a random HDVF is slower)" << endl ; + cout << "\t-verbose : verbose HDVF computation, output reduction matrices after each A (default: false)" << endl ; + cout << "\t-with_output / -no_output : output / do not output the HDVF and reduction to the console (default: with_output)" << endl ; + cout << "\t-with_export / -no_export : export / do not export the HDVF and reduction to a file (default: with_export)" << endl ; + cout << "\t-with_vtk_export / -no_vtk_export : export / do not export the HDVF and reduction to vtk (default: no_export)" << endl ; + cout << "For CubComplex only:" << endl ; + cout << "\t-primal / -dual: build the primal / dual complex associated to data (default: primal)" << endl ; + cout << "For Alexander duality only:" << endl ; + cout << "\tFor SimpComplex:" << endl ; + cout << "\t\t-BB_ratio x : ratio for the closing bounding sphere (default: 1.5)" << endl ; + cout << "\tFor CubComplex:" << endl ; + cout << "\t\t-with_frame / -no_frame : enclose / do not inclose the complex in a larger bounding box (default: with_frame, adds 1 pixel around)" << endl ; + cout << "For persistent HDVF only:" << endl ; + cout << "\t-lower (x|y|z) : compute lower star filtration with degree x, y or z" << endl ; + cout << "\tFor other filtrations, define the filtration into the main and set #define OwnFiltration" << endl; +} + +Options read_arguments_hdvf(int argc, char** argv) +{ + Options opt_res ; + + // Minumum number of arguments: 2 + // HDVF_algorithm file + + if (argc <= 2) + { + cout << "HDVF wrong number of arguments. HDVF -h for help" << endl ; + throw "HDVF wrong number of arguments" ; + } + // Read algorithm from argv[0] (last word of the path - separated by /) + const string algo(argv[0]) ; + string word1 ; + { + std::stringstream string_parse(algo); + std::string tmp_word; + + std::getline(string_parse, tmp_word, '/') ; + word1 = tmp_word ; + while(std::getline(string_parse, tmp_word, '/')) + { + word1 = tmp_word ; + } + } + + if (word1.compare("hdvf") == 0) + opt_res.algorithm = Algorithm::HDVF ; + else if (word1.compare("dual_hdvf") == 0) + opt_res.algorithm = Algorithm::DualHDVF ; + else if (word1.compare("per_hdvf") == 0) + opt_res.algorithm = Algorithm::PerHDVF ; + else + { + cerr << "HDVF algorithm unknown. HDVF -h for help" << endl ; + throw "HDVF algorithm unknown" ; + } + + // Read in_file from argv[argc-1] ; + opt_res.in_file = argv[argc-1] ; + // Deduce the file type from the file name + string word ; + { + // Get the file name (last word of the path - separated by /) + std::stringstream string_parse(opt_res.in_file); + std::string tmp_word; + + std::getline(string_parse, tmp_word, '/') ; + word = tmp_word ; + while(std::getline(string_parse, tmp_word, '/')) + { + word = tmp_word ; + } + } + { + // Get the extension (last word of the word - separated by .) + string filename = word ; + std::stringstream string_parse(filename); + std::string tmp_word; + + std::getline(string_parse, tmp_word, '.') ; + word = tmp_word ; + while(std::getline(string_parse, tmp_word, '.')) + { + word = tmp_word ; + } + } + // Assign in_format accordingly + if (word.compare("simp")==0) + opt_res.in_format = InputFormat::SIMP ; + else if (word.compare("off")==0) + opt_res.in_format = InputFormat::OFF ; + else if (word.compare("cub")==0) + opt_res.in_format = InputFormat::CUB ; + else if (word.compare("pgm")==0) + opt_res.in_format = InputFormat::PGM ; + else + { + cerr << "HDVF input format unkown. HDVF -h for help" << endl ; + throw "HDVF input format unknown" ; + } + + + // Read next options + for(int i = 1; i +#include "CGAL/HDVF/Simplex.hpp" +#include "CGAL/HDVF/tools_io.hpp" +#include "CGAL/HDVF/Abstract_Simplicial_chain_complex.hpp" +#include "CGAL/HDVF/SimpComplexTools.hpp" +#include "CGAL/HDVF/Cubical_complex.hpp" +#include "CGAL/HDVF/CubComplexTools.hpp" +#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/HDVF/hdvf_tools.hpp" +#include "CGAL/HDVF/hdvf_duality.hpp" +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/HDVF/SubSparseMatrix.hpp" +#include "CGAL/HDVF/hdvf_tools.hpp" +#include "arguments.h" +#include "CGAL/HDVF/Zp.hpp" + +// ------- A ring +// For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly + +//#define SCALAR 5 + + +template +void mesh_complex_output(const MeshType& mesh, const ComplexType& L, const SubChainComplex& K, const Options& options) +{ + if (options.with_output) + { + // Mesh + cout << "----> mesh informations" << endl ; + mesh.print_infos() ; + + // Complex + cout << "----> complex informations" << endl ; + cout << "------> complex L" << endl ; + L.print_complex(); + cout << "------> subcomplex K" << endl ; + cout << K << endl ; + } +} + +inline ostream& dual_pairs_output(const std::vector& pairs, ostream& out=cout) +{ + out << "Pairs found by computeDualPerfectHDVF:" << std::endl; + for (const auto& pair : pairs) { + out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; + } + return out ; +} + +template +void dual_HDVF_pair (Dual_HDVF& dual_hdvf, const Options &options) +{ + // Compute pairing + std::vector pairs = dual_hdvf.computePairingHDVF() ; + + if (options.with_output) + { + dual_pairs_output(pairs) ; + } + if (options.with_export) + { + string file(options.outfile_root+"_pairs.txt") ; + std::ofstream out ( file, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "hdvf: with_export. Fatal Error:\n " << file << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + + dual_pairs_output(pairs, out) ; + out.close() ; + } +} + +template +Dual_HDVF& dual_HDVF_comput (const ComplexType& L, SubChainComplex& K, const Options &options) +{ + using HDVFType = Dual_HDVF ; + using SubCCType = SubChainComplex ; + + HDVFType& hdvf(*(new HDVFType(L, K, options.HDVF_opt))); + + cout << "----> START computing dual HDVF" << endl ; + hdvf.computeDualPerfectHDVF() ; + cout << "------> END computing dual HDVF" << endl ; + + if (options.with_output) + { + cout << "----> reduction" << endl ; + hdvf.print_reduction() ; + } + if (options.with_export) + { + cout << "----> exporting..." << endl ; + string file(options.outfile_root+"_reduction.txt") ; + std::ofstream out ( file, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "hdvf: with_export. Fatal Error:\n " << file << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + out << "----> reduction" << endl ; + hdvf.print_reduction(out) ; + + out.close() ; + } + return hdvf ; +} + + +template +void main_code (const Options &options) +{ +#ifndef CUST_FILTRATION + // Standard lower star filtration along x,y or z + using DegType = double ; +#else + // TODO +#endif + + /// SIMP format + if (options.in_format == InputFormat::SIMP) + { +// using ComplexType = AbstractSimpComplex ; +// using HDVFType = HDVF ; +// +// // MeshObject +// MeshObject mesh ; +// mesh.read_simp(options.in_file) ; +// +// // Complex +// ComplexType complex(mesh); +// +// mesh_complex_output(mesh, complex, options) ; +// +// // HDVF computation, export, output +// HDVFType hdvf(HDVF_comput(complex, options)) ; +// +// // Export to vtk +// // None for SIMP format + cout << "not yet..." << endl ; + throw("not yet") ; + } + /// OFF format + else if (options.in_format == InputFormat::OFF) + { + using ComplexType = Simplicial_chain_complex ; + using HDVFType = Dual_HDVF ; + using ToolsType = Duality_SimpComplexTools ; + using SubCCType = SubChainComplex ; + + // MeshObject + Mesh_object mesh ; + mesh.read_off(options.in_file) ; + + // Complex + ComplexType* complex = new ComplexType(mesh, mesh.nodes); + + // Build L (bounding sphere meshed with tetgen), K and L-K + + typename ToolsType::TripleRes t(ToolsType::SimpComplexBB(*complex)) ; + delete complex ; + ComplexType& L(t.L) ; + SubCCType& K(t.K) ; + + // Output/export mesh and complex + + mesh_complex_output(mesh, L, K, options) ; + + // HDVF computation, export, output + HDVFType& hdvf(dual_HDVF_comput(L, K, options)) ; + + // Export to vtk + if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + // K + { + hdvf.set_mask_K() ; + Simp_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; + } + // L-K + { + hdvf.set_mask_L_K() ; + Simp_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; + } + } + + // Compute pairing + dual_HDVF_pair(hdvf, options) ; + } + // CubComplex + else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) + { + using ComplexType = Cubical_complex ; + using HDVFType = Dual_HDVF ; + using SubCCType = SubChainComplex ; + using ToolsType = CubComplexTools ; + + CubObject mesh ; + typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; + if (options.primal) + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + else + mesh.read_cub(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + } + else // dual + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, false) ; // Read with pixel coordinates (for dual) + else + mesh.read_cub(options.in_file, false) ; // Read with pixel coordinates (for dual) + primal_dual = ComplexType::DUAL ; + } + + // Frame (add 1 voxel around data) + if (options.with_frame) + { + mesh.frame() ; + } + + // Complex + ComplexType* complex = new ComplexType(mesh, primal_dual); + + // Build L, K and L-K + + std::pair p(ToolsType::CubComplexBB(*complex)) ; + delete complex ; + ComplexType &L(p.first) ; + SubCCType &K(p.second) ; + + // Output/export mesh and complex + + mesh_complex_output(mesh, L, K, options) ; + + // HDVF computation, export, output + HDVFType& hdvf(dual_HDVF_comput(L, K, options)) ; + + // Export to vtk + if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + // K + { + hdvf.set_mask_K() ; + Cub_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; + } + // L-K + { + hdvf.set_mask_L_K() ; + Cub_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; + } + } + + // Compute pairing + dual_HDVF_pair(hdvf, options) ; + } +} + +// Main + +int main(int argc, char **argv) +{ + if (argc <= 2) + usage() ; + else + { + for (int i=0;i(options) ; + } + else if (options.scalar == 2) + { + using CoefficientType = Zp<2,int8_t> ; + main_code(options) ; + } + else + { + cout << "Z" << options.scalar << " not instantiated, use the #define at line 27" << endl ; + } +#else + typedef Zp CoefficientType; +#endif + } + + return 0 ; +} + diff --git a/HDVF/examples/HDVF/main_hdvf.cpp b/HDVF/examples/HDVF/main_hdvf.cpp new file mode 100644 index 000000000000..246657b6a438 --- /dev/null +++ b/HDVF/examples/HDVF/main_hdvf.cpp @@ -0,0 +1,244 @@ +// HDVF off files +// -------- +// Computes a "perfect" HDVF and provides a batch mode to specify arguments +// For help: hdvf -h +// -------- +// A. Bac +// -------- + +#include +#include +#include +#include +#include "CGAL/HDVF/Zp.hpp" +#include "CGAL/HDVF/Simplex.hpp" +#include "CGAL/HDVF/tools_io.hpp" +#include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" +#include "CGAL/HDVF/SimpComplexTools.hpp" +#include "CGAL/HDVF/Cubical_complex.hpp" +#include "CGAL/HDVF/CubComplexTools.hpp" +#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/HDVF/hdvf_tools.hpp" +#include "arguments.h" + +// ------- A ring +// For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly + +//#define SCALAR 5 + +// HDVF computation, output and export + +template +void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const Options& options) +{ + if (options.with_output) + { + // Mesh + cout << "----> mesh informations" << endl ; + mesh.print_infos() ; + + // Complex + cout << "----> complex informations" << endl ; + complex.print_complex(); + } +} + +template +HDVF& HDVF_comput (const ComplexType& complex, const Options &options) +{ + HDVF& hdvf(*(new HDVF(complex, options.HDVF_opt))); + std::vector pairs ; + if (!options.random) + pairs = hdvf.computePerfectHDVF(options.verbose); + else + pairs = hdvf.computeRandPerfectHDVF(options.verbose); + + if (options.with_output) + { + cout << "----> pairs found by computePerfectHDVF" << endl ; + hdvf.print_pairs(pairs) ; + cout << "----> reduction" << endl ; + hdvf.print_reduction() ; + } + if (options.with_export) + { + string file(options.outfile_root+"_reduction.txt") ; + std::ofstream out ( file, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "hdvf: with_export. Fatal Error:\n " << file << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + out << "----> pairs found by computePerfectHDVF" << endl ; + hdvf.print_pairs(pairs, out) ; + out << "----> reduction" << endl ; + hdvf.print_reduction(out) ; + + out.close() ; + } + return hdvf ; +} + +template +void main_code (const Options &options) +{ + /// SIMP format + if (options.in_format == InputFormat::SIMP) + { + using ComplexType = Abstract_simplicial_chain_complex ; + using HDVFType = HDVF ; + + // MeshObject + Mesh_object mesh ; + mesh.read_simp(options.in_file) ; + + // Complex + ComplexType complex(mesh); + + mesh_complex_output(mesh, complex, options) ; + + // HDVF computation, export, output + HDVFType hdvf(HDVF_comput(complex, options)) ; + + // Export to vtk + // None for SIMP format + } + /// OFF format + else if (options.in_format == InputFormat::OFF) + { + using ComplexType = Simplicial_chain_complex ; + using HDVFType = HDVF ; + + // MeshObject + Mesh_object mesh ; + mesh.read_off(options.in_file) ; + + // Complex + ComplexType complex(mesh, mesh.nodes); + + mesh_complex_output(mesh, complex, options) ; + + // HDVF computation, export, output + HDVFType hdvf(HDVF_comput(complex, options)) ; + + // Loop on operations with vtk export + if (options.loop) + { + auto output_vtk_simp = [options](HDVFType &hdvf, ComplexType& complex) + { + Simp_output_vtk(hdvf, complex, options.outfile_root) ; + } ; + + interaction_loop(hdvf, complex, output_vtk_simp) ; + } + // Export to vtk + else if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + Simp_output_vtk(hdvf, complex, options.outfile_root) ; + } + } + // CubComplex + else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) + { + using ComplexType = Cubical_complex ; + using HDVFType = HDVF ; + + CubObject mesh ; + typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; + if (options.primal) + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + else + mesh.read_cub(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + } + else // dual + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, false) ; // Read with pixel coordinates (for dual) + else + mesh.read_cub(options.in_file, false) ; // Read with pixel coordinates (for dual) + primal_dual = ComplexType::DUAL ; + } + + // Complex + ComplexType complex(mesh, primal_dual); + + mesh_complex_output(mesh, complex, options) ; + + // HDVF computation, export, output + HDVFType hdvf(HDVF_comput(complex, options)) ; + + // Loop on operations with vtk export + if (options.loop) + { + auto output_vtk_cub = [options](HDVFType &hdvf, ComplexType& complex) + { + Cub_output_vtk(hdvf, complex, options.outfile_root) ; + } ; + + interaction_loop(hdvf, complex, output_vtk_cub) ; + } + // Export to vtk + else if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + Cub_output_vtk(hdvf, complex, options.outfile_root) ; + } + } +} + +// Main + +int main(int argc, char **argv) +{ + if (argc <= 2) + usage() ; + else + { + for (int i=0;i(options) ; + } + else if (options.scalar == 2) + { + using CoefficientType = Zp<2,int8_t> ; + main_code(options) ; + } + else + { + cout << "Z" << options.scalar << " not instantiated, use the #define at line 27" << endl ; + } +#else + typedef Zp CoefficientType; +#endif + } + + return 0 ; +} + + + + + + + + + + + + + + + diff --git a/HDVF/examples/HDVF/main_per_hdvf.cpp b/HDVF/examples/HDVF/main_per_hdvf.cpp new file mode 100644 index 000000000000..e7f238cb417d --- /dev/null +++ b/HDVF/examples/HDVF/main_per_hdvf.cpp @@ -0,0 +1,309 @@ +// HDVF off files +// -------- +// Computes a "perfect" persistent HDVF from a given filtration +// and provides a batch mode to specify arguments +// For help: hdvf -h +// -------- +// A. Bac +// -------- + +#include +#include +#include +#include +#include "CGAL/HDVF/Zp.hpp" +#include "CGAL/HDVF/Simplex.hpp" +#include "CGAL/HDVF/tools_io.hpp" +#include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" +#include "CGAL/HDVF/SimpComplexTools.hpp" +#include "CGAL/HDVF/Cubical_complex.hpp" +#include "CGAL/HDVF/CubComplexTools.hpp" +#include "CGAL/HDVF/per_hdvf.hpp" +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/HDVF/hdvf_tools.hpp" +#include "arguments.h" + +// ------- A ring +// For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly + +//#define SCALAR 5 + +// ------- Filtration + +// For a "custom" filtration, please use the following filtration function and set the +//#define CUST_FILTRATION + +// Degree type definition +#ifndef CUST_FILTRATION +using DegType = double ; +#else // Custom filtration +/// Define proper DegType below +using DegType = double ; +#endif + +// Custom filtration +#ifdef CUST_FILTRATION + +// Example returning x+z value for each vertex +template +std::function deg_fun (const ComplexType& complex) +{ + std::function deg_fun_f = [&complex](int i) + { + const std::vector Xi(complex.get_vertex_coords(i)) ; + /// Define proper filtration value below + return Xi.at(0)+Xi.at(2) ; + } ; + return deg_fun_f ; +} + +#endif + +template +void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const Options& options) +{ + if (options.with_output) + { + // Mesh + cout << "----> mesh informations" << endl ; + mesh.print_infos() ; + + // Complex + cout << "----> complex informations" << endl ; + complex.print_complex(); + } +} + +template +PersistentHDVF& per_HDVF_comput (const ComplexType& complex, const Filtration& f, const Options &options) +{ + typedef PersistentHDVF HDVFType ; + HDVFType& hdvf(*(new HDVFType(complex, f, options.HDVF_opt, options.with_vtk_export))); + + cout << "----> START computing persistent homology" << endl ; + hdvf.computePersistentHomology() ; + cout << "------> END computing persistent homology" << endl ; + + if (options.with_output) + { + cout << "----> perHDVF" << endl ; + hdvf.print_perHDVFInfo(cout); + cout << "----> reduction" << endl ; + hdvf.print_reduction() ; + cout << "----> persistent diagram" << endl ; + cout << hdvf ; + } + if (options.with_export) + { + cout << "----> exporting..." << endl ; + string file(options.outfile_root+"_reduction.txt") ; + std::ofstream out ( file, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "hdvf: with_export. Fatal Error:\n " << file << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + out << "----> perHDVF" << endl ; + hdvf.print_perHDVFInfo(out); + out << "----> reduction" << endl ; + hdvf.print_reduction(out) ; + + out.close() ; + + string file_per(options.outfile_root+"_per.txt") ; + std::ofstream out_per ( file_per, std::ios::out | std::ios::trunc); + + if ( not out_per . good () ) { + std::cerr << "hdvf: with_export. Fatal Error:\n " << file << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + out_per << "----> persistent diagram" << endl ; + out_per << hdvf ; + + out_per.close() ; + } + return hdvf ; +} + +template +Filtration& build_filtration(const ComplexType& complex, const Options& options) +{ + + std::function deg_function ; +#ifndef CUST_FILTRATION + // Standard lower star filtration along x,y or z + if (options.star_filtr == StarFiltrStd::FiltrX) + deg_function = (deg_fun(complex, f_x)) ; + else if (options.star_filtr == StarFiltrStd::FiltrY) + deg_function = (deg_fun(complex, f_y)) ; + else if (options.star_filtr == StarFiltrStd::FiltrZ) + deg_function = (deg_fun(complex, f_z)) ; + else + { + cout << "Unknown lower start filtration" << endl ; + throw("Unknown lower start filtration") ; + } +#else + // Use deg_fun defined above + deg_function = (deg_fun(complex)) ; +#endif + + Filtration& f = *(new Filtration(complex)) ; + cout << "----> START building filtration" << endl ; + f.star_filtration(deg_function) ; + cout << "------> END building filtration" << endl ; + return f ; +} + + +template +void main_code (const Options &options) +{ + /// SIMP format + if (options.in_format == InputFormat::SIMP) + { +// using ComplexType = AbstractSimpComplex ; +// using HDVFType = HDVF ; +// +// // MeshObject +// MeshObject mesh ; +// mesh.read_simp(options.in_file) ; +// +// // Complex +// ComplexType complex(mesh); +// +// mesh_complex_output(mesh, complex, options) ; +// +// // HDVF computation, export, output +// HDVFType hdvf(HDVF_comput(complex, options)) ; +// +// // Export to vtk +// // None for SIMP format + cout << "not yet..." << endl ; + throw("not yet") ; + } + /// OFF format + else if (options.in_format == InputFormat::OFF) + { + using ComplexType = Simplicial_chain_complex ; + using HDVFType = PersistentHDVF ; + + // MeshObject + Mesh_object mesh ; + mesh.read_off(options.in_file) ; + + // Complex + ComplexType complex(mesh, mesh.nodes); + + // Build filtration + Filtration& f(build_filtration(complex, options)) ; + + mesh_complex_output(mesh, complex, options) ; + + // HDVF computation, export, output + HDVFType& hdvf(per_HDVF_comput(complex,f, options)) ; + + // Export to vtk + if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + Per_Simp_output_vtk(hdvf, complex, options.outfile_root) ; + } + } + // CubComplex + else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) + { + using ComplexType = Cubical_complex ; + using HDVFType = PersistentHDVF ; + + CubObject mesh ; + typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; + if (options.primal) + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + else + mesh.read_cub(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + } + else // dual + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, false) ; // Read with pixel coordinates (for dual) + else + mesh.read_cub(options.in_file, false) ; // Read with pixel coordinates (for dual) + primal_dual = ComplexType::DUAL ; + } + + // Complex + ComplexType complex(mesh, primal_dual); + + mesh_complex_output(mesh, complex, options) ; + + // Build filtration + Filtration& f(build_filtration(complex, options)) ; + + // HDVF computation, export, output + HDVFType& hdvf(per_HDVF_comput(complex,f, options)) ; + + // Export to vtk + if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + Per_Cub_output_vtk(hdvf, complex, options.outfile_root) ; +// Cub_output_vtk(hdvf, complex, options.outfile_root) ; + } + } +} + +// Main + +int main(int argc, char **argv) +{ + if (argc <= 2) + usage() ; + else + { + for (int i=0;i(options) ; + } + else if (options.scalar == 2) + { + using CoefficientType = Zp<2,int8_t> ; + main_code(options) ; + } + else + { + cout << "Z" << options.scalar << " not instantiated, use the #define at line 27" << endl ; + } +#else + typedef Zp CoefficientType; +#endif + } + + return 0 ; +} + + + + + + + + + + + + + + + diff --git a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp new file mode 100644 index 000000000000..9e730c2f7b13 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp @@ -0,0 +1,728 @@ +#ifndef SIMPCOMPLEX_HPP +#define SIMPCOMPLEX_HPP + +#include +#include +//#include "hdvf_common.hpp" +#include "tools_io.hpp" +#include "Simplex.hpp" +#include "CGAL/OSM/OSM.hpp" + +// Forward declaration of SimpComplexTools +template class Duality_SimpComplexTools ; + +/** + * \class Abstract_simplicial_chain_complex + * \brief Implementation of abstract simplicial complexes. + * + * The Abstract_simplicial_chain_complex class contains constructors and functions associated to abstract simplicial complexes for HDVFs. It implements the Complex concept. + * + * \tparam CoefficientType The coefficient types used for boundary matrix computation (default is int) + * \tparam VertexIdType Type used to store vertices indices (default is int) + * + * \author Alexandra Bac + */ +template +class Abstract_simplicial_chain_complex { +public: + /** + * \brief Default constructor. + * + * Builds an empty abstract simplicial complex. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + Abstract_simplicial_chain_complex() ; + + /** + * \brief Constructor from a Mesh_object. + * + * Builds the abstract simplicial complex associated to a triangular mesh (ie. performs the down closure of cells and set the boundary matrices in any dimension). + * + * \param[in] mesh A Mesh_object containing a triangular mesh. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + Abstract_simplicial_chain_complex(const Mesh_object& mesh); + + /** \brief Type of column-major chains */ + typedef OSM::Chain CChain; + /** \brief Type of row-major chains */ + typedef OSM::Chain RChain ; + /** \brief Type of column-major sparse matrices */ + typedef OSM::SparseMatrix CMatrix; + + + /** + * \brief Affectation operator for abstract simplicial complexes. + * + * Stores a copy of an abstract simplicial complex in *this. + * + * \param[in] complex The abstract simplicial complex which will be copied. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + Abstract_simplicial_chain_complex& operator= (const Abstract_simplicial_chain_complex& complex) + { + _dim = complex._dim; + _ind2simp = complex._ind2simp; + _simp2ind = complex._simp2ind; + _nb_cells = complex._nb_cells; + _d = complex._d; + return *this ; + } + + /// Methods of the SimpComplex concept + + /** + * \brief Method returning the boundary of the cell id_cell in dimension dim. + * + * Returns a copy of the column-major chain stored in the boundary matrix of dimension dim: boundary of the cell id_cell in dimension dim.. + * + * \param[in] id_cell Index of the cell. + * \param[in] dim Dimension of the cell. + * + * \return The column-major chain containing the boundary of the cell id_cell in dimension dim. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + CChain d(int id_cell, int dim) const + { + if (dim > 0) + return OSM::getColumn(_d[dim], id_cell); + else + return CChain(0) ; + } + + /** + * \brief Method returning the co-boundary of the cell id_cell in dimension dim. + * + * Returns a row-major chain containing the co-boundary of the cell id_cell in dimension dim (so actually a row of the boundary matrix). + * + * \warning As the boundary matrix is stored column-major, this entails crossing the full matrix to extract the row coefficients (O(number of non empty columns)) + * + * \param[in] id_cell Index of the cell. + * \param[in] dim Dimension of the cell. + * + * \return The row-major chain containing the co-boundary of the cell id_cell in dimension dim. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + RChain cod(int id_cell, int dim) const + { + if (dim < _dim) + return OSM::getRow(_d[dim+1], id_cell); + else + return RChain(0) ; + } + + /** + * \brief Method returning the dimension of the complex. + * + * Returns the dimension of the simplicial complex (ie. largest dimension of cells). + * + * \return The dimension of the complex.. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + int dim() const { return _dim ;} + + /** + * \brief Method returning the number of cells in a given dimension. + * + * \param[in] dim Dimension along which the number of cells is returned. + * + * \return Number of cells in dimension dim. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + int nb_cells(int dim) const + { + if ((dim >=0) && (dim<=_dim)) + return _nb_cells[dim] ; + else + return 0 ; + } + + /** + * \brief Method returning a constant reference to the vector of boundary matrices (along each dimension). + * + * Returns a constant reference to the vector of boundary matrices along each dimension. The q-th element of this vector is a column-major sparse matrix containing the boundaries of q-cells (ie. rows encode q-1 cells and columns q cells). + * + * \return Returns a constant reference to the vector of column-major boundary matrices along each dimension. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + const vector & get_bnd_matrices() const + { + return _d ; + } + + /** + * \brief Method returning a copy of the dim-th boundary matrix (ie. column-major matrix of d_dim). + * + * It is a column-major sparse matrix containing the boundaries of dim-cells (ie. rows encode dim-1 cells and columns dim cells). + * + * \param[in] dim Dimension of the boundary matrix (ie. columns will contain the boundary of dimension dim cells). + * + * \return A column-major sparse matrix containing the matrix of the boundary operator of dimension dim. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + const CMatrix & get_bnd_matrix(int dim) const + { + return _d.at(dim) ; + } + + /** + * \brief Method returning dimension 0 simplicies indexes included in the cell with index id_cell of dimension dim. + * + * Returns the dimension 0 simplicies indexes included in the cell with index id_cell of dimension dim. + * + * \warning This does not come to return vertices indices, as dimension 0 simplices enumerate vertices in any order. For instance, if an abstract simplicial complex is build from 3 vertices {1,2,3} such that the enumeration of dimension 0 simplicies is: + * id0: 3, id1 : 2, id2: 1 + * then the bottom_faces of the 1-simplex {1,2} are two 0-simplices with id 2 and 1. + * + * \param[in] id_cell Index of the cell. + * \param[in] dim Dimension of the cell. + * + * \return A vector of 0-simplices indices. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + std::vector bottom_faces(int id_cell, int dim) const + { + std::set verts(_ind2simp.at(dim).at(id_cell).getVertices()) ; + std::vector res ; + // For each vertex in verts, compute the corresponding dimension 0 cell + for (int vert_id : verts) + { + const int i(_simp2ind.at(0).at(Simplex(std::set({vert_id})))) ; + res.push_back(i) ; + } + return res ; + } + + /** + * \brief Method printing informations of the complex. + * + * Displays the number of cells in each dimension and the boundary matrix in each dimension. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + /** \brief */ + void print_complex() const; + + +protected: + /** \brief Dimension of the complex */ + int _dim; + /** \brief Vector of simplices along each dimension: _ind2simp.at(q) contains the vector of all simplices of dimension q */ + std::vector > > _ind2simp ; + /** \brief Vector of maps associating indices to simplices in each dimension: _simp2ind.at(q) maps q-simplices to their index in _ind2simp */ + std::vector, int> > _simp2ind ; + /** \brief Vector of number of cells in each dimension */ + std::vector _nb_cells ; + /** \brief Vector of column-major boundary matrices: _d.at(q) is the matrix of the boundary operator in dimension q. */ + mutable std::vector _d; // Boundary matrices + + // Protected methods + + /** + * \brief Method filling the matrix _d.at(dim), ie. computing the boundaries of cells of dimension dim. + * + * Compute the boundary with the standard simplicial complex definition: + * \f[\partial (\{v_0,\ldots,v_q\}) = \sum_{i=0}^q (-1)^q \{v_0,\ldots, \hat{v_i},\ldots,v_q\}\f] + * + * \param[in] dim Dimension considered for computation. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + void calculate_d(int dim) const; + + /** + * \brief Method inserting a simplex (and its faces if necessary) into the abstract simplicial complex. + * + * The method (recursively) inserts the simplex into _ind2simp and _simp2ind and its faces. If the simplex is already presend, the method does nothing. + * + * \warning insert_simplex does not update the boundary matrix. + * + * \param[in] tau The simplex inserted. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + void insert_simplex(const Simplex& tau); +}; + +//constructor +template +Abstract_simplicial_chain_complex::Abstract_simplicial_chain_complex(const Mesh_object& mesh) { + // Initialize attributes + + _dim = abs(mesh.dim); + + // Initialize vectors of Simplices and cell counts + _ind2simp.resize(_dim + 1); + _simp2ind.resize(_dim + 1); + _nb_cells.resize(_dim + 1, 0); + + // Iterate through the mesh cells and add them to the complex + for (const auto& cell : mesh.cells) { +// Simplex simplex(std::set(cell.begin(), cell.end())); +// insert_simplex(simplex); + insert_simplex(cell) ; + } + + _d.resize(_dim+1); + for (int dim = 0; dim <= _dim; ++dim) { + calculate_d(dim); + } +} + +// Recursive insertion method +template +void Abstract_simplicial_chain_complex::insert_simplex(const Simplex& tau) { + int q = tau.dimension(); + if (q == -1) return; + + if (_simp2ind[q].find(tau) == _simp2ind[q].end()) { + int i = _ind2simp[q].size(); + _ind2simp[q].push_back(tau); + _simp2ind[q][tau] = i; + _nb_cells[q]++; + + std::vector > bord = tau.boundary(); + for (const auto& sigma : bord) { + insert_simplex(sigma); + } + } +} + +// calculate _d boundary matrix +template +void Abstract_simplicial_chain_complex::calculate_d(int dim) const { + int nb_lignes = (dim == 0) ? 0 : _nb_cells[dim - 1]; + _d[dim] = CMatrix(nb_lignes, _nb_cells[dim]); + + // Iterate through the cells of dimension dim + if (dim>0) + { + for (int i = 0; i < _nb_cells[dim]; ++i) { + // Boundary of the i-th simplex of dimension dim + const Simplex& s = _ind2simp[dim][i]; + std::vector > bord = s.boundary(); + + // Create a chain with the correct size + CChain chain(nb_lignes); + + // For each element of the boundary + for (int j = 0; j < bord.size(); ++j) { + auto it = _simp2ind[dim - 1].find(bord[j]); // Find the index of Simplex j + if (it != _simp2ind[dim - 1].end()) { // If Simplex j is found + int ind_j = it->second; // Retrieve the index of Simplex j + chain[ind_j] = (j % 2 == 0) ? 1 : -1; + } + else + throw "calculate_d boundary simplex not found!"; + } + + // Insert the chain into the corresponding column of the delta matrix + OSM::setColumn(_d[dim], i, chain); + } + } +} + +// Method to display the complex's information +template +void Abstract_simplicial_chain_complex::print_complex() const { + std::cout << "Complex dimension: " << _dim << std::endl; + + // Total number of cells + int nb_total_cells = 0; + for (int i = 0; i <= _dim; ++i) { + nb_total_cells += _nb_cells[i]; + } + std::cout << "Total number of cells: " << nb_total_cells << std::endl; + + // Cells per dimension + for (int q = 0; q <= _dim; ++q) { + std::cout << "--- dimension " << q << std::endl; + cout << nb_cells(q) << " cells" << endl ; +// for (int j = 0; j < _nb_cells.at(q); ++j) { +// Simplex s(_ind2Simp.at(q).at(j)); +// std::cout << j << " -> " << s << " -> " << _Simp2ind.at(q).at(s) << std::endl; +// } + } + + // Boundary matrices + std::cout << "---------------------------" << std::endl << "Boundary matrices" << std::endl; + for (int q = 1; q <= _dim; ++q) + std::cout << "_d[" << q << "] : " << _d[q].dimensions().first << "x" << _d[q].dimensions().second << std::endl << _d[q] << std::endl; +} + +/** + * \class Simplicial_chain_complex + * \brief Implementation of simplicial complexes. + * + * The Simplicial_chain_complex class contains constructors and functions associated to simplicial complexes for HDVFs. It implements the GeometricComplex concept. Hence, vtk output is available. + * + * \tparam _CoefficientType The coefficient types used for boundary matrix computation (default is int) + * + * \author Alexandra Bac + */ + +template +class Simplicial_chain_complex : public Abstract_simplicial_chain_complex { +protected: + std::vector > _coords ; + +private: + /// Associated to any dimension the type number of associated VTK cells + /// {1, 3, 5, 10} + static const std::vector VTK_simptypes ; + +public: + + /** + * \brief Default constructor: builds an empty simplicial complex + * + * \see \link Simplicial_chain_complex \endlink + * + * \author Alexandra Bac + */ + Simplicial_chain_complex() {} ; + // Constructor from a simplicial complex stored in a .simp file and read into a MeshObject + /** + * \brief Constructor from a Mesh_object. + * + * Builds a simplicial complex from a Mesh_object and a vector of vertices coordinates ( + * + * \see \link Simplicial_chain_complex \endlink + * + * \author Alexandra Bac + */ + Simplicial_chain_complex(const Mesh_object& mesh, std::vector > coords) : Abstract_simplicial_chain_complex(mesh), _coords(coords) {} ; + + /// Operator= + Simplicial_chain_complex& operator= (const Simplicial_chain_complex& complex) + { + this->Abstract_simplicial_chain_complex::operator=(complex) ; + _coords = complex._coords ; + return *this ; + } + + // Friend class : SimpObjectTools + friend Duality_SimpComplexTools ; + + /** \brief Get the vector of vertices coordinates */ + const std::vector >& get_nodes_coords() const + { + return _coords ; + } + + /** \brief Get the coordinates of the ith dimension 0 simplex */ + std::vector get_vertex_coords (int i) const + { + const Simplex simpl(this->_ind2simp.at(0).at(i)) ; + const std::set verts(simpl.getVertices()) ; + const int id(*(verts.cbegin())) ; + return _coords.at(id); +// return _coords.at(i); + } + + // VTK export + + /** + * \brief Method exporting a simplicial complex (plus, optionally, labels) to a VTK file. + * + * The method generates legacy text VTK files. Labels are exported as such in a VTK property, together with CellID property, containing the index of each cell. + * + * \param[in] K Simplicial complex exported. + * \param[in] filename Output file root (output filenames will be built from this root). + * \param[in] labels Pointer to a vector of labels in each dimension. (*labels).at(q) is the set of integer labels of cells of dimension q. If labels is NULL, only CellID property is exported. + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + static void Simplicial_chain_complex_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const std::vector > *labels=NULL) ; + + /** + * \brief Method exporting a chain over a simplicial complex to a VTK file. + * + * The method generates legacy text VTK files. All the cells of the chain with non zero coefficient are exported. If a cellId is provided, labels are exported in a VTK property (2 for all cells, 0 for cell of index cellId). The index of each cell is exported in a CellID property. + * + * \param[in] K Simplicial complex exported. + * \param[in] filename Output file root (output filenames will be built from this root). + * \param[in] chain Chain exported (all the cells with non-zero coefficients in the chain are exported to vtk). + * \param[in] q Dimension of the cells of the chain. + * \param[in] cellId If a cellID is provided, labels are exported to distinguish cells of the chain (label 2) from cellId cell (label 0). + * + * \see \link Abstract_simplicial_chain_complex \endlink + * + * \author Alexandra Bac + * */ + static void Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId = -1) ; +}; + +// Initialization of static VTK_simptypes +template const +std::vector Simplicial_chain_complex::VTK_simptypes({1, 3, 5, 10}); + +template +void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const std::vector > *labels) +{ + typedef Simplicial_chain_complex ComplexType; + if (K._coords.size() != K.nb_cells(0)) + { + std::cerr << "SimpComplex_to_vtk. Error, wrong number of points provided.\n"; + throw std::runtime_error("Geometry of points invalid."); + } + + bool with_scalars = (labels != NULL) ; + + // Load out file... + std::ofstream out ( filename, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "SimpComplex_to_vtk. Fatal Error:\n " << filename << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + + // Header + out << "# vtk DataFile Version 2.0" << endl ; + out << "generators" << endl ; + out << "ASCII" << endl ; + out << "DATASET UNSTRUCTURED_GRID" << endl ; + + // Points + size_t nnodes = K._coords.size() ; + out << "POINTS " << nnodes << " double" << endl ; + const std::vector >& coords(K.get_nodes_coords()) ; + for (int n = 0; n < nnodes; ++n) + { + vector p(coords.at(n)) ; + for (double x : p) + out << x << " " ; + for (int i = p.size(); i<3; ++i) // points must be 3D -> add zeros + out << "0 " ; + out << endl ; + } + + int ncells_tot = 0, size_cells_tot = 0 ; + std::vector types ; + std::vector scalars ; + std::vector ids ; + // all cells must be printed + { + // Cells up to dimension 3 + // Size : size of a cell of dimension q : q+1 + for (int q=0; q<=K._dim; ++q) + { + ncells_tot += K.nb_cells(q) ; + const int size_cell = q+1 ; + size_cells_tot += (size_cell+1)*K.nb_cells(q) ; + } + out << "CELLS " << ncells_tot << " " << size_cells_tot << endl ; + // Output cells by increasing dimension + +// // Vertices +// for (int i = 0; i::const_iterator it = verts.cbegin(); it != verts.cend(); ++it) + out << *it << " " ; + out << endl ; + types.push_back(ComplexType::VTK_simptypes.at(q)) ; + if (with_scalars) + { + scalars.push_back((*labels).at(q).at(id)) ; + ids.push_back(id) ; + } + } + } + + // CELL_TYPES + out << "CELL_TYPES " << ncells_tot << endl ; + for (int t : types) + out << t << " " ; + out << endl ; + } + + if (with_scalars) + { + // CELL_LABEL + out << "CELL_DATA " << ncells_tot << endl ; + out << "SCALARS Label " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int s : scalars) + out << s << " " ; + out << endl ; + // CELL_IDs + out << "SCALARS CellId " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int i : ids) + out << i << " " ; + out << endl ; + } + out.close() ; +} + +/** \brief Export chain of dimension q to vtk. +* -> Only cells of the chain are exported +* -> If a cell Id is provided scalars are exported (0 for the given cellId / 2 for other cells) +*/ + +template +void Simplicial_chain_complex::Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) +{ + typedef Simplicial_chain_complex ComplexType ; + if (K._coords.size() != K.nb_cells(0)) + { + std::cerr << "SimpComplex_chain_to_vtk. Error, wrong number of points provided.\n"; + throw std::runtime_error("Geometry of points invalid."); + } + + bool with_scalars = (cellId != -1) ; + + // Load out file... + std::ofstream out ( filename, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "SimpComplex_chain_to_vtk. Fatal Error:\n " << filename << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + + // Header + out << "# vtk DataFile Version 2.0" << endl ; + out << "generators" << endl ; + out << "ASCII" << endl ; + out << "DATASET UNSTRUCTURED_GRID" << endl ; + + // Points + int nnodes = K._coords.size() ; + out << "POINTS " << nnodes << " double" << endl ; + const std::vector >& coords(K.get_nodes_coords()) ; + for (int n = 0; n < nnodes; ++n) + { + vector p(coords.at(n)) ; + for (double x : p) + out << x << " " ; + for (int i = p.size(); i<3; ++i) // points must be 3D -> add zeros + out << "0 " ; + out << endl ; + } + + int ncells_tot = 0, size_cells_tot = 0 ; + std::vector types ; + std::vector scalars ; + std::vector ids ; + + // output only cells of the chain (dimension q) + { + // 1 - Compute the number of cells / size of encoding + { + const int size_cell = q+1 ; + for (int id =0; id < K.nb_cells(q); ++id) + { + if (!chain.isNull(id)) + { + ++ncells_tot; + size_cells_tot += (size_cell+1) ; + } + } + } + // 2 - Output cells + out << "CELLS " << ncells_tot << " " << size_cells_tot << endl ; + + { + const int size_cell = q+1 ; + for (int id =0; id < K.nb_cells(q); ++id) + { + if (!chain.isNull(id)) + { + Simplex verts(K._ind2simp.at(q).at(id)) ; + out << size_cell << " " ; + for (typename Simplex::const_iterator it = verts.cbegin(); it != verts.cend(); ++it) + out << *it << " " ; + out << endl ; + types.push_back(ComplexType::VTK_simptypes.at(q)) ; + if (with_scalars) + { + ids.push_back(id) ; + if (id != cellId) + scalars.push_back(2) ; + else + scalars.push_back(0) ; + } + } + } + } + // CELL_TYPES + out << "CELL_TYPES " << ncells_tot << endl ; + for (int t : types) + out << t << " " ; + out << endl ; + } + + if (with_scalars) + { + // CELL_TYPES + out << "CELL_DATA " << ncells_tot << endl ; + out << "SCALARS Label " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int s : scalars) + out << s << " " ; + out << endl ; + // CELL_IDs + out << "SCALARS CellId " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int i : ids) + out << i << " " ; + out << endl ; + } + out.close() ; +} + +#endif // SIMPCOMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp new file mode 100644 index 000000000000..2994459f3326 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -0,0 +1,213 @@ +#ifndef CUBCOMPLEXTOOLS_HPP +#define CUBCOMPLEXTOOLS_HPP + +#include +#include +#include +#include +#include "Cubical_complex.hpp" +#include "hdvf.hpp" +#include "per_hdvf.hpp" +#include "sub_chain_complex.hpp" +#include "tools_io.hpp" +#include "CGAL/OSM/OSM.hpp" + +/** + * \class CubComplexTools + * \brief Provides tools for CubComplexes ((co)homology, duality, persistent homology). + * \brief Friend class of CubComplex + * + * \author Bac A. + * \version 0.2.0 + * \date 06/11/2024 + */ + +// CubComplex + +template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> +void Cub_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Cubical_complex &complex, string filename = "test") +{ + typedef Cubical_complex ComplexType; + // Export PSC labelling + vector > labels = hdvf.export_label(PSC) ; + string outfilePSC(filename+"_PSC.vtk") ; + ComplexType::cubical_complex_to_vtk(complex, outfilePSC, &labels) ; + + // Export generators of all critical cells if available + if (hdvf.get_hdvf_opts() != OPT_BND) + { + // Export generators of all critical cells + vector > criticals(hdvf.get_flag(CRITICAL)) ; + for (int q = 0; q <= complex.dim(); ++q) + { + for (int c : criticals.at(q)) + { + if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) + { + string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; +// vector > labels = hdvf.export_label(G,c,q) ; + OSM::Chain chain(hdvf.export_GChain(c,q)) ; + ComplexType::cubical_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; + } + if (q < complex.dim()) + { + if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_F)) + { + string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; + OSM::Chain chain(hdvf.export_FSTARChain(c,q)) ; + ComplexType::cubical_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; + } + } + } + } + } +} +// vector > criticals(hdvf.get_flag(CRITICAL)) ; +// for (int q = 0; q <= complex.dim(); ++q) +// { +// for (int c : criticals.at(q)) +// { +// if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) +// { +// string outfile(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; +// vector > labels = hdvf.export_label(G,c,q) ; +// cubical_complex_write_to_vtk(complex, outfile, &labels, BOOLEAN_LABELS, "bool") ; +// } +// if (q < complex.dim()) +// { +// if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_F)) +// { +// string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; +// vector > labels_fstar = hdvf.export_label(FSTAR,c,q) ; +// cubical_complex_write_to_vtk(complex, outfile_f, &labels_fstar, BOOLEAN_LABELS, "bool") ; +// } +// } +// } +// } +// } +//} + +// Duality + +template +class CubComplexTools { +public: + typedef Cubical_complex _ComplexType ; + typedef SubChainComplex _SubCCType ; + // Constructor + CubComplexTools() {} + + + /** \brief Build a CubComplex L and SubChainComplex K from a CubComplex. + * L : full bounding box + * K (SubChainComplex) : CubComplex + */ + + // Tools + + /** \brief Build the bounding box CubComplex of _CC */ + static std::pair<_ComplexType&, _SubCCType&> CubComplexBB (const _ComplexType& _CC) + { + CubObject tmp ; + tmp.dim = _CC.dim() ; + tmp.N = _CC._size_bb ; + tmp.ncubs.resize(tmp.dim+1) ; +// tmp.ncubs = tmp.N ; + // Visit all boolean indices in the BB of _CC and insert corresponding Cells + for (int i=0; i<_CC._P.at(_CC.dim()); ++i) + { + const std::vector tmpkhal(_CC.ind2khal(i)) ; + const int dtmp(_CC.calculate_dimension(tmpkhal)) ; + (tmp.ncubs)[dtmp] += 1 ; + tmp.cubs.push_back(tmpkhal) ; + } + _ComplexType& L(*new _ComplexType(tmp, _ComplexType::PRIMAL)) ; + + // Build the SubChainComplex corresponding to _CC + _SubCCType& K(*new _SubCCType(L, false)) ; + // Visit all cells of _CC and activate the corresponding bit in K + for (int q=0; q<=_CC.dim(); ++q) + { + for (int i=0; i<_CC.nb_cells(q); ++i) + { + const std::vector khal(_CC.ind2khal(_CC._base2bool.at(q).at(i))) ; + const int j = L._bool2base.at(q).at(L.khal2ind(khal)) ; + K.set_BitOn(q,j) ; + } + } + return std::pair<_ComplexType&, _SubCCType&>(L,K) ; + } +} ; + +// Persistent homology + +/** \brief Export persistent information to vtk files */ +template +void Per_Cub_output_vtk (PersistentHDVF, DegType> &per_hdvf, Cubical_complex &complex, string filename = "per") +{ + if (!per_hdvf.with_export()) + throw("Cannot export persistent generators to vtk: with_export is off!") ; + + using perHDVFType = PersistentHDVF, DegType> ; + using ComplexType = Cubical_complex ; + using PerHole = PerHoleT ; + // Iterate over persistence diagram (iterator over non zero intervals) + // Batch informations are stored in file filename_infos.txt + std::ofstream info_file(filename+"_infos.txt") ; + int i = 0 ; + for (typename perHDVFType::iterator it = per_hdvf.begin(); it != per_hdvf.end(); ++it) + { + typename perHDVFType::Exp_infos hole_data(*it) ; + const PerHole hole(hole_data.hole) ; + // Export informations of this hole + info_file << i << " -> " << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << std::endl ; + + if (per_hdvf.hole_duration(hole)) + { + // Build name associated to the ith hole : filename_i + string out_file = filename+"_"+to_string(i) ; + // Export PSC labels to vtk + ComplexType::cubical_complex_to_vtk(complex, out_file+"_PSC.vtk", &hole_data.labelsPSC) ; + const PerIntervalCells per_int_cells(std::get<1>(hole_data.hole)) ; + // Export homology generators (g) + if (per_hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) + { + // First generator : filename_i_g_sigma_q.vtk + { + const int id(per_int_cells.first.first), dim(per_int_cells.first.second) ; + string tmp(out_file+"_g_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_sigma, dim); + } + // Second generator : filename_i_g_tau_q+1.vtk + { + const int id(per_int_cells.second.first), dim(per_int_cells.second.second) ; + string tmp(out_file+"_g_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_tau, dim); + } + } + // Export cohomology generators (fstar) + if ((per_hdvf.get_hdvf_opts() == OPT_FULL) || (per_hdvf.get_hdvf_opts() == OPT_F)) + { + // First generator : filename_i_fstar_sigma_q.vtk + { + const int id(per_int_cells.first.first), dim(per_int_cells.first.second) ; + string tmp(out_file+"_fstar_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_sigma, dim); + } + // Second generator : filename_i_fstar_tau_q+1.vtk + { + const int id(per_int_cells.second.first), dim(per_int_cells.second.second) ; + string tmp(out_file+"_fstar_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_tau, dim); + } + } + } + ++i ; + } + info_file.close() ; + Cub_output_vtk(per_hdvf, complex, filename+"_inf") ; +} + + + +#endif // CUBCOMPLEXTOOLS_HPP diff --git a/HDVF/include/CGAL/HDVF/Cubical_complex.hpp b/HDVF/include/CGAL/HDVF/Cubical_complex.hpp new file mode 100644 index 000000000000..81b23c02ab2f --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Cubical_complex.hpp @@ -0,0 +1,1007 @@ +#ifndef CUBCOMPLEX_HPP +#define CUBCOMPLEX_HPP + +#include +#include +#include +#include +//#include "hdvf_common.hpp" +#include "tools_io.hpp" +#include "CGAL/OSM/OSM.hpp" + +// Forward declaration of CubComplexTools +template class CubComplexTools ; + +// TOOLS + +ostream & operator<<(ostream & out, std::vector c) +{ + for (int i:c) + out << i << " " ; + out << endl ; + return out ; +} + +/** + * \class Cubical_complex + * \brief Implementation of cubical complexes. + * + * The Cubical_complex class contains constructors and functions associated to cubical complexes for HDVFs. It implements the GeometricComplex concept. Hence, vtk output is available. + * + * \tparam _CoefficientType The coefficient types used for boundary matrix computation (default is int) + * + * \author Alexandra Bac + */ + +template // !!!! Substitute! -> coefficienttype everywhere... +class Cubical_complex { +private: + /// Associate to any dimension the corresponding VTK type + /// {1, 3, 8, 11} + static const std::vector VTK_cubtypes ; + +public: + /// Type of construction applied by the constructor + enum typeComplexCube {PRIMAL, DUAL}; + + /// Constructors of CubObject + Cubical_complex() {} ; + Cubical_complex(const CubObject& cub,typeComplexCube type); + + /// Friend class : CubObjectTools + friend CubComplexTools ; + + ///typedef related to boundary matrices + typedef OSM::Chain CChain; + typedef OSM::Chain RChain ; + typedef OSM::SparseMatrix CMatrix; + + /// operator= + Cubical_complex& operator=(const Cubical_complex& complex) + { + _dim = complex._dim; + _size_bb = complex._size_bb; + _P = complex._P; + _cells = complex._cells; + _base2bool = complex._base2bool; + _bool2base = complex._bool2base; + visited_cells = complex.visited_cells; + return *this; + } + + /// Methods of the CubComplex concept + + CChain d(int id_cell, int dim) const //border of the cell of index id_cell of dimension dim + { + if (dim > 0) + return OSM::cgetColumn(_d[dim], id_cell); + else + return CChain(0) ; + } + + RChain cod(int id_cell, int dim) const // cobord of the cell of index id_cell of dimension dim + { + if (dim < _dim) + return OSM::getRow(_d[dim+1], id_cell); + else + return RChain(0) ; + } + + const vector & get_bnd_matrices() const + { + return _d ; + } + + const CMatrix & get_bnd_matrix(int q) const + { + return _d.at(q) ; + } + + int dim() const + { + return _dim ; + } + + int nb_cells(int dim) const + { + if ((dim >=0) && (dim <= _dim)) + return _base2bool.at(dim).size() ; + else + return 0 ; + } + + void print_complex() const { + for (int q = 0; q <= _dim; ++q) { + std::cout << "-------- dimension " << q << std::endl; + std::cout << "cellules de dimension " << q << " : " << _base2bool.at(q).size() << std::endl; + for (size_t id_base = 0; id_base < _base2bool.at(q).size(); ++id_base) { + int id_bool = _base2bool.at(q).at(id_base); + std::vector khal = ind2khal(id_bool); + std::cout << id_base << " -> " << id_bool << " -> " << _bool2base.at(q).at(id_bool) << " -> "; + for (int k : khal) std::cout << k << " "; + std::cout << std::endl; + } + + if (_base2bool[q].size() > 0 && q <= _dim) { + std::cout << "matrice de bord de dimension " << q << std::endl; + std::cout << _d[q] << std::endl; + } + } + } + + std::vector bottom_faces(int id_cell, int dim) const // Vertices included in the cell with index id_cell of dimension dim + { + // Khalimsky coordinates of the cell + const vector coords(ind2khal(_base2bool.at(dim).at(id_cell))) ; + return khal_to_verts(coords) ; + } + + /// END Methods of the SimpComplex concept + + // Methods to access data + std::vector get_size_bb() const { + return _size_bb; + } + + std::vector get_P() const { + return _P; + } + + std::vector get_cells() const { + return _cells; + } + + std::vector > get_base2bool() const { + return _base2bool; + } + + std::vector > get_bool2base() const { + return _bool2base; + } + + // Method to get number of cells for a given dimension + int get_N(int dim) const { + if (dim >= 0 && dim <= _dim) { + return _base2bool[dim].size(); + } else { + throw std::out_of_range("Invalid dimension"); + } + } + + std::vector get_vertex_coords(int i) const + { + const vector coords(ind2khal(_base2bool.at(0).at(i))) ; + vector res ; + for (int c : coords) + res.push_back(c/2.) ; + for (int i = coords.size(); i<3; ++i) // points must be 3D + res.push_back(0) ; + return res ; + } + + CChain boundary_cell(int index_base, int dim) const { + // Ensure dim is within valid range + if (dim < 0 || dim >= _base2bool.size()) { + throw std::out_of_range("Invalid dimension: " + std::to_string(dim)); + } + + // Check if index_base is within bounds of _base2bool[dim] + if (index_base < 0 || index_base >= _base2bool[dim].size()) { + throw std::out_of_range("index_base " + std::to_string(index_base) + " not found in _base2bool[" + std::to_string(dim) + "]"); + } + + int nb_lignes = (dim == 0) ? 0 : get_N(dim - 1); + CChain boundary(nb_lignes); + + int index_bool = _base2bool[dim][index_base]; + std::vector c = ind2khal(index_bool); + + CoefficientType sign = 1; + for (int i = 0; i < _dim; ++i) { + if (c[i] % 2 == 1) { + // Calculate the coefficient based on the number of odd entries in c from 0 to i-1 + sign *= -1; + + int cell1 = index_bool + _P[i]; + int cell2 = index_bool - _P[i]; + + // Insert the coefficient in the corresponding row of the boundary matrix + if (cell1 >= 0 && cell1 < _cells.size()) { + int index = _bool2base[dim - 1].at(cell1); + boundary[index] = sign; + } + if (cell2 >= 0 && cell2 < _cells.size()) { + int index = _bool2base[dim - 1].at(cell2); + boundary[index] = -sign; + } + } + } + + return boundary; + } + + /// Check if a cell (given in Khalimsky coordinates) is valid + bool is_valid_cell(const std::vector& cell) const ; + + /// Check if a cell (given by its boolean index) is valid + bool is_valid_cell(int id_cell) const ; + + vector khal_to_verts(vector c) const + { + vector > vertices, vertices_tmp ; + // Vertices are obtained by cartesian products + for (int i=0; i<_dim; ++i) + { + if ((c[i]%2) == 1) + { + if (vertices.size()==0) + { + vertices.push_back(vector(1,c[i]-1)) ; + vertices.push_back(vector(1,c[i]+1)) ; + } + else + { + vertices_tmp.clear() ; + for (vector vert : vertices) + { + vector tmp(vert) ; + tmp.push_back(c[i]-1) ; + vertices_tmp.push_back(tmp) ; + } + for (vector vert : vertices) + { + vector tmp(vert) ; + tmp.push_back(c[i]+1) ; + vertices_tmp.push_back(tmp) ; + } + vertices = vertices_tmp ; + } + } + else + { + if (vertices.size() == 0) + vertices.push_back(vector(1,c[i])) ; + else + { + vertices_tmp.clear() ; + for (vector vert : vertices) + { + vector tmp(vert) ; + tmp.push_back(c[i]) ; + vertices_tmp.push_back(tmp) ; + } + vertices = vertices_tmp ; + } + } + } + vector vertices_id ; + for (vector vert : vertices) + { + vertices_id.push_back(_bool2base[0].at(khal2ind(vert))) ; + } + return vertices_id ; + } + +// template +// friend void cubical_complex_write_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels, TDataLabels tdata, const std::string scalar_type) ; + +// template + static void cubical_complex_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels=NULL) ; + +// template + static void cubical_complex_chain_to_vtk(const Cubical_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId = -1) ; + +protected: + // Protected data + int _dim; // Complex dimension + std::vector _size_bb; // Size of the bounding box Ni + std::vector _P; // P vector + std::vector _cells; // Cells of the complex (true if the cell is present, false otherwise) + std::vector> _base2bool; // Maps from base indices to indices in _cells + std::vector> _bool2base; // Maps from indices in _cells to base indices + + std::set visited_cells; + + // Protected methods + void initialize_cells(const CubObject& cub,typeComplexCube type); // Initialize _cells and _base2bool and _bool2base + + // khal coordinates + std::vector ind2khal(int index) const { + if (index > _P[_dim]) + throw std::invalid_argument("Index exceeds the size of boolean vector"); + std::vector khal(_dim); + for (int k = 0; k < _dim; ++k) { + khal[k] = index % _size_bb[k]; + index /= _size_bb[k]; + } + return khal; + } + + + int khal2ind(const std::vector& base_indices) const { + if (base_indices.size() != _dim) { + throw std::invalid_argument("Dimension of base_indices does not match _dim"); + } + + int cell_index = 0; + for (int i = 0; i < _dim; ++i) { + cell_index += base_indices[i] * _P[i]; + } + + // verify if cell_index is within bounds of _cells + if ((cell_index >= 0) && (cell_index < _P.at(_dim))) { + return cell_index; + } else { + std::cerr << "Invalid cell index in _cells: " << cell_index << std::endl; + throw std::out_of_range("Cell index out of bounds in _cells"); + } + } + + // vox coordinates (for DUAL construction) + std::vector ind2vox(int index, vector N, int max_size) const + { + if (index > max_size) + throw std::invalid_argument("ind2vox : index exceeding size of boolean vector"); + std::vector coords(_dim); + for (int k = 0; k < _dim; ++k) { + coords[k] = index % N[k]; + index /= N[k]; + } + return coords; + } + + int vox2ind(const std::vector& base_indices, vector N, int max_size) const { + if (base_indices.size() != _dim) { + throw std::invalid_argument("Dimension of base_indices does not match _dim"); + } + + int cell_index = 0; + for (int i = 0; i < _dim; ++i) { + cell_index += base_indices[i] * N[i]; + } + + // Verfiy if cell_index is within bounds of _cells + if (cell_index >= 0 && cell_index < max_size) + return cell_index; + else { + std::cerr << "Invalid cell index in _cells: " << cell_index << std::endl; + throw std::out_of_range("Invalid cell index in _cells"); + } + } + + mutable std::vector _d; // Boundary matrix + + void Calculate_d(int dim) const; // Calculate the boundary matrix of dimension dim + + void insert_cell(int cell); // Insert a cell into the complex + + int calculate_dimension(const std::vector& cell) const; // Calculate the dimension of a cell + int calculate_dimension(int cell_index) const { return calculate_dimension(ind2khal(cell_index)) ; } + + std::vector calculate_boundaries(int cell) const; // Calculate the boundaries of a cell + +}; + +// Initialization of static VTK_cubtypes +template const +std::vector Cubical_complex::VTK_cubtypes({1, 3, 8, 11}) ; + +// Constructor implementation +template +Cubical_complex::Cubical_complex(const CubObject& cub,typeComplexCube type) : _dim(cub.dim), _size_bb(_dim+1), _P(_dim+1,1), _base2bool(_dim+1), _bool2base(_dim+1) + +{ + // Initialize _size_bb and _P + if (type==PRIMAL) + _size_bb = cub.N; + else + { + for (int q=0; q<_dim; ++q) + _size_bb.at(q) = 2*cub.N.at(q)+1 ; + } + + for (int i = 1; i <= _dim; ++i) { + _P[i] = _P[i - 1] * _size_bb[i - 1]; + } + + _cells.resize(_P[_dim], false) ; + + // Initialize _cells, _base2bool, and _bool2base + initialize_cells(cub,type); + + // Initialize _d + _d.resize(_dim+1); + for (int q = 0; q <= _dim; ++q) { + Calculate_d(q); + } + +} + +template +void Cubical_complex::initialize_cells(const CubObject& cub, typeComplexCube type) +{ + + if (type == PRIMAL) + { + + for (int i=0; i coords(cub.cubs.at(i)) ; + // Calculate the coordinates of the voxel in the dual complex + for (int i=0; i<_dim; ++i) + coords.at(i)*=2 ; + const int cell_index(khal2ind(coords)) ; + + _cells.at(cell_index) = true ; + // Add the cell in _base2bool and _bool2base + const int dim(calculate_dimension(coords)) ; + const int n(_base2bool.at(dim).size()) ; + _base2bool.at(dim).push_back(cell_index) ; + _bool2base.at(dim)[cell_index] = n ; + } + + // for the cells with dim>0 + for (int q = 1; q <= _dim; ++q) { + + for (int i = 0; i < _P[_dim]; ++i) { + + if (calculate_dimension(ind2khal(i)) == q) { + std::vector boundaries = calculate_boundaries(i); + bool all_boundaries_present = true; + for (const auto& boundary_cell : boundaries) { + if (!_cells[boundary_cell]) { + all_boundaries_present = false; + break; + } + } + if (all_boundaries_present) { + + + _cells.at(i)= true ; + // Add the cell in _base2bool and _bool2base + const int dim(calculate_dimension(i)) ; + const int n(_base2bool.at(dim).size()) ; + _base2bool.at(dim).push_back(i) ; + _bool2base.at(dim)[i] = n ; + } + } + } + } + } + else + { + throw std::invalid_argument("Invalid typeComplexCube"); + } +} + + +template +bool Cubical_complex::is_valid_cell(const std::vector& cell) const { + for (int i=0; i<_dim; ++i) { + if (cell[i] < 0 || cell[i] >= _size_bb[i]) { + return false; + } + } + return true; +} + +template +bool Cubical_complex::is_valid_cell(int id_cell) const +{ + if ((id_cell < 0) || (id_cell > _P[_dim])) + return false; + else + return true; +} + + + +template +void Cubical_complex::insert_cell(int cell) { + if (!is_valid_cell(cell)) + throw std::out_of_range("insert_cell: trying to insert cell with invalid index"); + + // verify if the cell has already been visited + if (visited_cells.find(cell) != visited_cells.end()) { + return; // cell has already been visited + } + + std::vector cell_coords(ind2khal(cell)); + int dim = calculate_dimension(cell_coords); + + _cells[cell] = true; + int cell_base_index = _base2bool[dim].size(); + _base2bool[dim].push_back(cell); + _bool2base[dim][cell] = cell_base_index; + + std::vector boundaries(calculate_boundaries(cell)); + for (const auto& boundary : boundaries) { + if (!_cells[boundary]) { + insert_cell(boundary); + } + } + + // mark cell as visited + visited_cells.insert(cell); +} + + + +template +void Cubical_complex::Calculate_d(int dim) const { + int nb_lignes = (dim == 0) ? 0 : get_N(dim - 1); + + _d[dim] = CMatrix(nb_lignes, get_N(dim)); + + // Iterate through the cells of dimension dim + for (int i = 0; i < get_N(dim); ++i) { + // Boundary of the i-th cell of dimension dim + CChain boundary = boundary_cell(i, dim); + + // Insert the chain into the corresponding column of the boundary matrix + OSM::setColumn(_d[dim], i, boundary); + } + + + +} + +template +int Cubical_complex::calculate_dimension(const std::vector& cell) const { + int dimension = 0; + for (int index : cell) { + if (index % 2 == 1) { // Un index impair indique une dimension plus élevée + dimension++; + } + } + return dimension; +} + +template +std::vector Cubical_complex::calculate_boundaries(int idcell) const { + std::vector boundaries; + std::vector c = ind2khal(idcell); + + + + for (int i = 0; i < _dim; ++i) { + if (c[i] % 2 == 1) + { + // Calculate the coefficient based on the number of odd entries in c from 0 to i-1 + int cell1 = idcell + _P[i]; + if (is_valid_cell(cell1)) + boundaries.push_back(cell1) ; + + + int cell2 = idcell - _P[i]; + if (is_valid_cell(cell2)) + boundaries.push_back(cell2) ; + + } + } + + return boundaries; +} + +// tdata: labels encode boolean (for FSTAR and G) or int data (for PSC) +// labels: data to mark cells (e.g. (co)homology generators labels +// -> for P,S,C labelling, the type is int => export all cells with their label +// -> for generator, the type is bool => export only cells with label true +// scalar_type: type of labels (e.g. T) + + +//template +//void cubical_complex_write_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels=NULL, TDataLabels tdata=INT_LABELS, const std::string scalar_type="none") +//{ +// bool with_scalars = (labels != NULL) ; +// int type_data(0) ; // 1 for int (ie. P,S,C labelling), 2 for bool (generators), 0 when no labels +// if (with_scalars) +// { +// if (tdata == INT_LABELS) +// type_data = 1 ; +// else +// type_data = 2 ; +// } +// // Load out file... +// std::ofstream out ( filename, std::ios::out | std::ios::trunc); +// +// if ( not out . good () ) { +// std::cerr << "SimplicialComplex::loadFromFile. Fatal Error:\n " << filename << " not found.\n"; +// throw std::runtime_error("File Parsing Error: File not found"); +// } +// +// // Header +// out << "# vtk DataFile Version 2.0" << endl ; +// out << "generators" << endl ; +// out << "ASCII" << endl ; +// out << "DATASET UNSTRUCTURED_GRID" << endl ; +// +// // Points +// int nnodes = K.nb_cells(0) ; +// out << "POINTS " << nnodes << " double" << endl ; +// for (int i=0; i coords(K.ind2khal(K._base2bool[0].at(i))) ; +// for (int c : coords) +// out << c/2 << " " ; +// for (int i = coords.size(); i<3; ++i) // points must be 3D +// out << "0 " ; +// out << endl ; +// } +// +// int ncells_tot = 0, size_cells_tot = 0 ; +// std::vector types ; +// std::vector scalars ; +// std::vector ids ; +// if ((type_data==0) || (type_data==1)) // all cells must be printed +// { +// // Cells up to dimension 3 +// // Number of cells : for each chain, each number of vertices for each cell +// // Size : size of a cell of dimension q : 2^q +// for (int q=0; q<=K._dim; ++q) +// { +// ncells_tot += K.nb_cells(q) ; +// const int size_cell = 1<::VTK_cubtypes.at(0)) ; +// if (with_scalars) +// { +// scalars.push_back((*labels).at(0).at(i)) ; +// ids.push_back(i) ; +// } +// } +// // Cells of higher dimension +// for (int q=1; q<=K._dim; ++q) +// { +// const int size_cell = 1< verts(K.khal_to_verts(K.ind2khal(K._base2bool.at(q).at(id)))) ; +// out << size_cell << " " ; +// for (int i : verts) +// out << i << " " ; +// out << endl ; +// types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; +// if (with_scalars) +// { +// scalars.push_back((*labels).at(q).at(id)) ; +// ids.push_back(id) ; +// } +// } +// } +// +// +// // CELL_TYPES +// out << "CELL_TYPES " << ncells_tot << endl ; +// for (int t : types) +// out << t << " " ; +// out << endl ; +// } +// else // output only cells labelled true +// { +// // 1 - Compute the number of cells / size of encoding +// // Vertices +// for (int i = 0; i::VTK_cubtypes.at(0)) ; +// } +// } +// // Cells of higher dimension +// for (int q=1; q<=K._dim; ++q) +// { +// const int size_cell = 1< khal(K.ind2khal(K._base2bool.at(q).at(id))) ; +// vector verts(K.khal_to_verts(K.ind2khal(K._base2bool.at(q).at(id)))) ; +// out << size_cell << " " ; +// for (int i : verts) +// out << i << " " ; +// out << endl ; +// types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; +// } +// } +// } +// // CELL_TYPES +// out << "CELL_TYPES " << ncells_tot << endl ; +// for (int t : types) +// out << t << " " ; +// out << endl ; +// } +// +// if (with_scalars && (type_data==1)) +// { +// // CELL_TYPES +// out << "CELL_DATA " << ncells_tot << endl ; +// out << "SCALARS Label " << scalar_type << " 1" << endl ; +// out << "LOOKUP_TABLE default" << endl ; +// for (int s : scalars) +// out << s << " " ; +// out << endl ; +// // CELL_IDs +// out << "SCALARS CellId " << scalar_type << " 1" << endl ; +// out << "LOOKUP_TABLE default" << endl ; +// for (int i : ids) +// out << i << " " ; +// out << endl ; +// } +// out.close() ; +//} + +/** \brief Export complex to vtk (with int labels if provided). +* -> All cells are exported */ + +template +void Cubical_complex::cubical_complex_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels) +{ + bool with_scalars = (labels != NULL) ; + + // Load out file... + std::ofstream out ( filename, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "CubComplex_to_vtk. Fatal Error:\n " << filename << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + + // Header + out << "# vtk DataFile Version 2.0" << endl ; + out << "generators" << endl ; + out << "ASCII" << endl ; + out << "DATASET UNSTRUCTURED_GRID" << endl ; + + // Points + size_t nnodes = K.nb_cells(0) ; + out << "POINTS " << nnodes << " double" << endl ; + for (int n = 0; n < nnodes; ++n) + { + vector p(K.get_vertex_coords(n)) ; + for (double x : p) + out << x << " " ; + for (int i = p.size(); i<3; ++i) // points must be 3D -> add zeros + out << "0 " ; + out << endl ; + } + + int ncells_tot = 0, size_cells_tot = 0 ; + std::vector types ; + std::vector scalars ; + std::vector ids ; + // all cells must be printed + { + // Cells up to dimension 3 + // Size : size of a cell of dimension q : 2^q + for (int q=0; q<=K.dim(); ++q) + { + ncells_tot += K.nb_cells(q) ; + const int size_cell = 1<::VTK_cubtypes.at(0)) ; + if (with_scalars) + { + scalars.push_back((*labels).at(0).at(i)) ; + ids.push_back(i) ; + } + } + // Cells of higher dimension + for (int q=1; q<=K.dim(); ++q) + { + const int size_cell = 1< verts(K.khal_to_verts(K.ind2khal(K._base2bool.at(q).at(id)))) ; + out << size_cell << " " ; + for (int i : verts) + out << i << " " ; + out << endl ; + types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; + if (with_scalars) + { + scalars.push_back((*labels).at(q).at(id)) ; + ids.push_back(id) ; + } + } + } + + // CELL_TYPES + out << "CELL_TYPES " << ncells_tot << endl ; + for (int t : types) + out << t << " " ; + out << endl ; + } + + if (with_scalars) + { + // CELL_LABEL + out << "CELL_DATA " << ncells_tot << endl ; + out << "SCALARS Label " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int s : scalars) + out << s << " " ; + out << endl ; + // CELL_IDs + out << "SCALARS CellId " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int i : ids) + out << i << " " ; + out << endl ; + } + out.close() ; +} + +/** \brief Export chain of dimension q to vtk. +* -> Only cells of the chain are exported +* -> If a cell Id is provided scalars are exported (0 for the given cellId / 2 for other cells) +*/ + +template +void Cubical_complex::cubical_complex_chain_to_vtk(const Cubical_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) +{ + bool with_scalars = (cellId != -1) ; + + // Load out file... + std::ofstream out ( filename, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "SimpComplex_chain_to_vtk. Fatal Error:\n " << filename << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + + // Header + out << "# vtk DataFile Version 2.0" << endl ; + out << "generators" << endl ; + out << "ASCII" << endl ; + out << "DATASET UNSTRUCTURED_GRID" << endl ; + + // Points + int nnodes = K.nb_cells(0) ; + out << "POINTS " << nnodes << " double" << endl ; + for (int n = 0; n < nnodes; ++n) + { + vector p(K.get_vertex_coords(n)) ; + for (double x : p) + out << x << " " ; + for (int i = p.size(); i<3; ++i) // points must be 3D -> add zeros + out << "0 " ; + out << endl ; + } + + int ncells_tot = 0, size_cells_tot = 0 ; + std::vector types ; + std::vector scalars ; + std::vector ids ; + + // output only cells of the chain (dimension q) + { + // 1 - Compute the number of cells / size of encoding + { + const int size_cell = 1< khal(K.ind2khal(K._base2bool.at(q).at(id))) ; + vector verts(K.khal_to_verts(K.ind2khal(K._base2bool.at(q).at(id)))) ; + out << size_cell << " " ; + for (int i : verts) + out << i << " " ; + out << endl ; + types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; + + if (with_scalars) + { + ids.push_back(id) ; + if (id != cellId) + scalars.push_back(2) ; + else + scalars.push_back(0) ; + } + } + } + } + // CELL_TYPES + out << "CELL_TYPES " << ncells_tot << endl ; + for (int t : types) + out << t << " " ; + out << endl ; + } + + if (with_scalars) + { + // CELL_TYPES + out << "CELL_DATA " << ncells_tot << endl ; + out << "SCALARS Label " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int s : scalars) + out << s << " " ; + out << endl ; + // CELL_IDs + out << "SCALARS CellId " << "int" << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int i : ids) + out << i << " " ; + out << endl ; + } + out.close() ; +} + + +#endif // CUBCOMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp new file mode 100644 index 000000000000..f1a42ebc706e --- /dev/null +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -0,0 +1,223 @@ +#ifndef SIMPCOMPLEXTOOLS_HPP +#define SIMPCOMPLEXTOOLS_HPP + +#include +#include +#include +#include +//#include "config.h" +#include "Simplex.hpp" +#include "Abstract_simplicial_chain_complex.hpp" +#include "hdvf.hpp" +#include "per_hdvf.hpp" +#include "sub_chain_complex.hpp" +#include "tools_io.hpp" +#include "CGAL/OSM/OSM.hpp" + +/** + * \class SimpComplexTools + * \brief Provides tools for SimpComplexes ((co)homology, duality, persistent homology). + * \brief Friend class of SimpComplex + * + * \author Bac A. + * \version 0.2.0 + * \date 06/11/2024 + */ + +// SimpComplex + +/** \brief vtk export for SimpComplex */ + +template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix, typename VertexIdType = int> +void Simp_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") +{ + typedef Simplicial_chain_complex ComplexType; + // Export PSC labelling + string outfile(filename+"_PSC.vtk") ; + vector > labels = hdvf.export_label(PSC) ; + ComplexType::Simplicial_chain_complex_to_vtk(complex, outfile, &labels) ; + + if (hdvf.get_hdvf_opts() != OPT_BND) + { + // Export generators of all critical cells + vector > criticals(hdvf.get_flag(CRITICAL)) ; + for (int q = 0; q <= complex.dim(); ++q) + { + for (int c : criticals.at(q)) + { + if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) + { + string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; +// vector > labels = hdvf.export_label(G,c,q) ; + OSM::Chain chain(hdvf.export_GChain(c,q)) ; + ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; + } + if (q < complex.dim()) + { + if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_F)) + { + string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; + OSM::Chain chain(hdvf.export_FSTARChain(c,q)) ; + ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; + } + } + } + } + } +} + +// Duality + +template +class Duality_SimpComplexTools { +public: + typedef Simplicial_chain_complex _ComplexType ; + typedef SubChainComplex _SubCCType ; + // Constructor + Duality_SimpComplexTools() {} + + /** \brief Build a SimpComplex L and SubChainComplex K from a SimpComplex _K. + * L : complex built out of _K and a closing icosphere meshed by tetgen + * K (SubChainComplex) : SubChainComplex identifying _K inside L + */ + + /** \brief Build the bounding box CubComplex of _CC */ + typedef struct ztriple { + _ComplexType& L ; + _SubCCType& K ; + std::vector nodes ; + } TripleRes ; + + static TripleRes SimpComplexBB (const _ComplexType& _K, double BB_ratio=1.5, const string& out_file_prefix = "file_K_closed.off") + { + // Export _CC to a MeshObject to add the icosphere and mesh with tetGen + Mesh_object mesh_L = Duality_SimpComplexTools::export_meshObject(_K) ; + + // Closing K by adding the icosphere + // Compute a bounding icosphere + IONodeType bary = mesh_L.barycenter() ; + double r = mesh_L.radius(bary) ; + IcosphereObject ico(2,bary, BB_ratio*r) ; + ico.print_infos() ; + + // Add it to the mesh + mesh_L.push_back(ico) ; + mesh_L.print_infos() ; + + // Write this mesh to an off file for Tetgen + mesh_L.write_off(out_file_prefix) ; +// const std::string tetgen_path(CMAKE_TETGEN_PATH) ; + // WARNING: use CGAL 3D triangulation to get rid of tetgen... + const std::string tetgen_path("/Users/umenohana/Dropbox/G-Mod/TopAlg/code/tetgen1.6.0/build/") ; + std::string tetgen_command = tetgen_path+"tetgen -pqkcYfe "+out_file_prefix+".off" ; + system(tetgen_command.c_str()) ; + + // Read the mesh built by tetgen for L + TetObject tetL(out_file_prefix) ; + + // Build the associated SimpComplex + _ComplexType& L = *new _ComplexType(tetL, tetL.nodes) ; + + // Build the SubChainComplex encoding _K inside L + _SubCCType& K(*new _SubCCType(L, false)) ; + // Visit all cells of _K and activate the corresponding bit in K + for (int q=0; q<=_K.dim(); ++q) + { + for (int i=0; i<_K.nb_cells(q); ++i) + { + const std::set& simplex(_K._ind2simp.at(q).at(i).getVertices()) ; + const int id(L._simp2ind.at(q)[simplex]) ; + K.set_BitOn(q, id) ; + } + } + TripleRes t = {L,K,tetL.nodes} ; + return t ; + } + + /** \brief Export a SimpComplex to a MeshObject */ + static Mesh_object& export_meshObject(const _ComplexType& _CC) + { + std::vector vcells ; + for (int q = 0; q <= _CC.dim(); ++q) + for (int i = 0; i<_CC.nb_cells(q); ++i) + { + const Simplex& s(_CC._ind2simp.at(q).at(i)) ; + vcells.push_back(s.getVertices()) ; + } + + Mesh_object &m = *(new Mesh_object(-3, _CC.get_nodes_coords(), vcells)) ; + return m ; + } +} ; + +// Persistent homology + + +/** \brief Export persistent information to vtk files */ +template +void Per_Simp_output_vtk (PersistentHDVF, DegType> &per_hdvf, Simplicial_chain_complex &complex, string filename = "per") +{ + if (!per_hdvf.with_export()) + throw("Cannot export persistent generators to vtk: with_export is off!") ; + + using perHDVFType = PersistentHDVF, DegType> ; + using ComplexType = Simplicial_chain_complex ; + using PerHole = PerHoleT ; + // Iterate over persistence diagram (iterator over non zero intervals) + // Batch informations are stored in file filename_infos.txt + std::ofstream info_file(filename+"_infos.txt") ; + int i = 0 ; + for (typename perHDVFType::iterator it = per_hdvf.begin(); it != per_hdvf.end(); ++it) + { + typename perHDVFType::Exp_infos hole_data(*it) ; + const PerHole hole(hole_data.hole) ; + // Export informations of this hole + info_file << i << " -> " << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << std::endl ; + + if (per_hdvf.hole_duration(hole)>0) // Export vtk of "finite" holes + { + // Build name associated to the ith hole : filename_i + string out_file = filename+"_"+to_string(i) ; + // Export PSC labels to vtk + ComplexType::Simplicial_chain_complex_to_vtk(complex, out_file+"_PSC.vtk", &hole_data.labelsPSC) ; + const PerIntervalCells per_int_cells(std::get<1>(hole_data.hole)) ; + // Export homology generators (g) + if (per_hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) + { + // First generator : filename_i_g_sigma_q.vtk + { + const int id(per_int_cells.first.first), dim(per_int_cells.first.second) ; + string tmp(out_file+"_g_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_sigma, dim); + } + // Second generator : filename_i_g_tau_q+1.vtk + { + const int id(per_int_cells.second.first), dim(per_int_cells.second.second) ; + string tmp(out_file+"_g_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_tau, dim); + } + } + // Export cohomology generators (fstar) + if ((per_hdvf.get_hdvf_opts() == OPT_FULL) || (per_hdvf.get_hdvf_opts() == OPT_F)) + { + // First generator : filename_i_fstar_sigma_q.vtk + { + const int id(per_int_cells.first.first), dim(per_int_cells.first.second) ; + string tmp(out_file+"_fstar_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_sigma, dim+1); + } + // Second generator : filename_i_fstar_tau_q+1.vtk + { + const int id(per_int_cells.second.first), dim(per_int_cells.second.second) ; + string tmp(out_file+"_fstar_"+to_string(id)+"_"+to_string(dim)+".vtk") ; + ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_tau, dim+1); + } + } + } + ++i ; + } + info_file.close() ; + Simp_output_vtk(per_hdvf, complex, filename+"_inf") ; +} + +#endif // SimpComplexTools_HPP diff --git a/HDVF/include/CGAL/HDVF/Simplex.hpp b/HDVF/include/CGAL/HDVF/Simplex.hpp new file mode 100644 index 000000000000..0d4280beb2c0 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Simplex.hpp @@ -0,0 +1,97 @@ +#ifndef SIMPLEX_HPP +#define SIMPLEX_HPP + +#include +#include +#include +#include +#include + +template +class Simplex { + template + friend class Abstract_simplicial_complex ; +private: + std::set vertices; + bool inside; + +public: + typedef std::set::const_iterator const_iterator ; + const_iterator cbegin () { return vertices.cbegin() ; } + const_iterator cend () { return vertices.cend() ; } + + // Constructor + Simplex(const std::set& vertices, bool inside = true); + + int dimension() const; + + // Boundary operator + std::vector boundary() const; + + // Method to get the vertices of the simplex (for testing) + const std::set& getVertices() const; + + // Comparison operator used for sorting simplices (especially in the Complex class) + bool operator<(const Simplex& other) const { + return vertices < other.vertices; + } + + // Operator << + friend std::ostream& operator<<(std::ostream& out, const Simplex& simplex); + + + +}; + +// Implementations + +template +Simplex::Simplex(const std::set& vertices, bool inside) + : vertices(vertices), inside(inside) {} + +template +int Simplex::dimension() const { + return vertices.size() - 1; +} + +template +std::vector > Simplex::boundary() const { + std::vector result; + result.reserve(vertices.size()); + + auto it = vertices.begin(); + for (size_t i = 0; i < vertices.size(); ++i) { + std::set simplex_vertices; + std::copy_if(vertices.begin(), vertices.end(), std::inserter(simplex_vertices, simplex_vertices.begin()), + [it](const int& vertex) { return vertex != *it; }); + result.emplace_back(simplex_vertices, inside); + ++it; + } + + return result; +} + +template +const std::set& Simplex::getVertices() const { +// return std::vector(vertices.begin(), vertices.end()); + return vertices ; +} + +template +std::ostream& operator<<(std::ostream& out, const Simplex& simplex) +{ + out << "<"; + bool first = true; + for (int vertex : simplex.vertices) { + if (!first) { + + out << " "; + } + out << vertex; + first = false; + } + out << ">"; + return out; +} + +#endif // SIMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp new file mode 100644 index 000000000000..b10155f1f0b6 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -0,0 +1,128 @@ +/** + * \file SubSparseMatrix.hpp + * \brief Namespace file for describing library. + * \author Bac A. + * \version 0.1.0 + * \date 02/10/2024 + * + * Define everything for the SubSparseMatrix class + */ + +#ifndef __SUB_SPARSE_MATRIX__ +#define __SUB_SPARSE_MATRIX__ + + +#include "CGAL/OSM/SparseMatrix.hpp" +#include "CGAL/OSM/Bitboard.hpp" + + +namespace OSM { + +/** + * \class SubSparseMatrix + * \brief Vector implementation of sparse matrices with a bitboard submatrix mask. + * + * The SubSparseMatrix class contains functions related to OSM matrix restriction. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Bac A. + * \version 0.1.0 + * \date 02/10/2024 + */ +template +class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { + +protected: + /** \brief A bitboard describing subchains along. */ + Bitboard _subChains; + + /** \brief A bitboard containing state of each chain (restricted to subchains). */ + Bitboard _subChainsStates; + +public: + /** \brief Constructor with sizes and Bitboard describing subchains. */ + SubSparseMatrix(const int _rowCount, const int _columnCount, Bitboard subChain) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->chainsStates & subChain) + { + } + + /** \brief Constructor with sizes (Bitboard describing subchains set to full Bitboard). */ + SubSparseMatrix(const int _rowCount=0, const int _columnCount=0) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount) + { + if (_ChainTypeFlag == OSM::COLUMN) + _subChains = OSM::Bitboard(_columnCount,false) ; + else + _subChains = OSM::Bitboard(_rowCount,false) ; + _subChainsStates = this->chainsStates & _subChains ; + } + + /** \brief Copy constructor. */ + SubSparseMatrix(const SubSparseMatrix& otherToCopy) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(otherToCopy), _subChains(otherToCopy._subChains), _subChainsStates(otherToCopy._subChainsStates) {} + + /** \brief Copy constructor from SparseMatrix. */ + SubSparseMatrix(const SparseMatrix<_CoefficientType,_ChainTypeFlag>& otherToCopy) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(otherToCopy) + { + if (_ChainTypeFlag == OSM::COLUMN) + _subChains = OSM::Bitboard(otherToCopy.dimensions().second,false) ; + else + _subChains = OSM::Bitboard(otherToCopy.dimensions().first,false) ; + _subChainsStates = this->chainsStates & _subChains ; + } + + + /** \brief Iterator to the beginning of the subchains indices. */ + inline Bitboard::iterator begin() noexcept + { + _subChainsStates = this->chainsStates & _subChains ; + return _subChainsStates.begin(); + } + + /** \brief Iterator to the end of the subchains indices. */ + inline Bitboard::iterator end() noexcept { return _subChainsStates.end(); } + + /** \brief Change subchains. */ + inline void set_sub (const Bitboard& new_subChains) + { + _subChains = new_subChains ; + _subChainsStates = this->chainsStates & _subChains ; + } + + /** \brief Set a bit on in subchains and update chainsStates accordingly. */ + inline void set_bitOn (int index) + { + _subChains.setOn(index) ; + if (this->chainsStates.isOn(index)) + _subChainsStates.setOn(index) ; + } + + /** \brief Set a bit off in subchains and update chainsStates accordingly. */ + inline void set_bitOff (int index) + { + _subChains.setOff(index) ; + _subChainsStates.setOff(index) ; + } + + /** \brief Change subchains to their complement. */ + inline void complement() { _subChains.bit_not() ; } + + /** \brief Operator=. */ + inline SubSparseMatrix& operator=(const SubSparseMatrix &other) + { + (dynamic_cast&>(*this)).operator=(other) ; + _subChains = other._subChains ; + _subChainsStates = other._subChainsStates ; + return *this ; + } + + /** \brief Operator<<. */ + friend std::ostream& operator<<(std::ostream &_stream, const SubSparseMatrix &_matrix) { + _stream << static_cast&>(_matrix) ; + _stream << _matrix._subChains << endl ; + return _stream ; + } +}; + +} + +#endif diff --git a/HDVF/include/CGAL/HDVF/Z2.hpp b/HDVF/include/CGAL/HDVF/Z2.hpp new file mode 100644 index 000000000000..87c7a5bbbc93 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Z2.hpp @@ -0,0 +1,115 @@ +/** + * \file Z2.hpp + * \brief Z/2Z class. + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + * + * Z/2Z class + */ + +#ifndef Z2_HPP +#define Z2_HPP + +#include + +class Z2 { + char _i ; +public: + + /// Constructor (default) + Z2(_TSlot i=0) : _i(i % p) {} + + /// Copy constructor + Z2(const Z2& a) : _i(a._i) {} + + /// unary operator+ + friend Z2 operator+ (const Z2& a) + { + return a ; + } + + /// unary operator- + friend Z2 operator- (const Z2& a) + { + return a ; + } + + /// operator+ + friend Z2 operator+ (const Z2& a, const Z2& b) + { + return Z2(a._i ^ b._i) ; // + is XOR on bits + } + + /// operator- + friend Z2 operator- (const Z2& a, const Z2& b) + { + return Z2(a._i ^ b._i) ; // - is similar to + + } + + /// operator* + friend Z2 operator* (const Z2& a, const Z2& b) + { + return Z2(a._i & b._i) ; // * is AND on bits + } + + /// operator/ + friend Z2 operator/ (const Z2& a, const Z2& b) + { + return Z2(a._i / b._i) ; + } + + /// operator+= + Z2 & operator+= (const Z2& a) + { + _i ^= a._i ; + return *this ; + } + + /// operator-= + Z2 & operator-= (const Z2& a) + { + _i ^= a._i ; + return *this ; + } + + /// operator*= + Z2 & operator*= (const Z2& a) + { + _i &= a._i ; + return *this ; + } + + /// operator/= + Z2 & operator/= (const Z2& a) + { + _i /= a._i ; + return *this ; + } + + /// operator== + friend bool operator== (const Z2& a, const Z2& b) + { + return (a._i == b._i) ; + } + + /// operator!= + friend bool operator!= (const Z2& a, const Z2& b) + { + return (a._i != b._i); + } + + /// abs + friend Z2 abs(const Z2& a) + { + return a ; + } + + /// operator<< + friend ostream& operator<<(ostream& out, const Z2& a) + { + return (out << a._i) ; + } +}; + +#endif diff --git a/HDVF/include/CGAL/HDVF/Zp.hpp b/HDVF/include/CGAL/HDVF/Zp.hpp new file mode 100644 index 000000000000..d3cfeff63b39 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Zp.hpp @@ -0,0 +1,147 @@ +/** + * \file Zp.hpp + * \brief Z/pZ class. + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + * + * Z/pZ class + */ + +#ifndef ZP_HPP +#define ZP_HPP + +#include +#include + +// Chose _TSlot according to the size of p +template +class Zp { + _TSlot _i ; +public: + + /// Constructor (default) + Zp(_TSlot i=0) : _i( (i>=0)?(i % p):((i % p) + p) ) { } + + + /// Copy constructor + Zp(const Zp& a) : _i(a._i) {} + + /// unary operator+ + friend Zp operator+ (const Zp& a) + { + return Zp(a) ; + } + + /// unary operator- + friend Zp operator- (const Zp& a) + { + return Zp(- a._i) ; + } + + /// operator+ + friend Zp operator+ (const Zp& a, const Zp& b) + { + return Zp((a._i + b._i)) ; + } + + /// operator- + friend Zp operator- (const Zp& a, const Zp& b) + { + return Zp((a._i - b._i)) ; + } + + /// operator* + friend Zp operator* (const Zp& a, const Zp& b) + { + return Zp((a._i * b._i)) ; + } + + /// operator/ + friend Zp operator/ (const Zp& a, const Zp& b) + { + return Zp(a._i / b._i) ; + } + + /// operator+= + Zp & operator+= (const Zp& a) + { + _i += a._i ; + if (_i >= 0) + _i %= p ; + else + { + _i %= p ; + _i += p ; + } + return *this ; + } + + /// operator-= + Zp & operator-= (const Zp& a) + { + _i -= a._i ; + if (_i >= 0) + _i %= p ; + else + { + _i %= p ; + _i += p ; + } + return *this ; + } + + /// operator*= + Zp & operator*= (const Zp& a) + { + _i *= a._i ; + if (_i >= 0) + _i %= p ; + else + { + _i %= p ; + _i += p ; + } + return *this ; + } + + /// operator/= + Zp & operator/= (const Zp& a) + { + _i /= a._i ; + if (_i >= 0) + _i %= p ; + else + { + _i %= p ; + _i += p ; + } + return *this ; + } + + /// operator== + friend bool operator== (const Zp& a, const Zp& b) + { + return (a._i == b._i) ; + } + + /// operator!= + friend bool operator!= (const Zp& a, const Zp& b) + { + return (a._i != b._i); + } + + /// abs + friend Zp abs(const Zp& a) + { + return Zp(abs(a._i)) ; + } + + /// operator<< + friend std::ostream& operator<<(std::ostream& out, const Zp& a) + { + return (out << int(a._i)) ; + } +}; + +#endif diff --git a/HDVF/include/CGAL/HDVF/hdvf.hpp b/HDVF/include/CGAL/HDVF/hdvf.hpp new file mode 100644 index 000000000000..45ef3e735cb5 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/hdvf.hpp @@ -0,0 +1,2043 @@ +/** + * \file hdvf.hpp + * \brief HDVF code library. + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + * + * HDVF code library (constructors, operations, finders). + */ + +#ifndef HDVF_H +#define HDVF_H + +#include +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/OSM/Bitboard.hpp" +//#include "Abstract_simplicial_complex.hpp" +//#include "Simplex.hpp" +//#include "CubComplex.hpp" +#include "CGAL/HDVF/sub_chain_complex.hpp" + +/** \brief Enum for the HDVF label of cells. */ +enum FlagType { + PRIMARY, + SECONDARY, + CRITICAL, + NONE // For duality and persistence +}; + +/** \brief HDVF options (partial computation of the reduction). */ +// Compute only reduced boundary +const int OPT_BND = 0b0001; +// Compute reduced boundary and f +const int OPT_F = 0b0010; +// Compute reduced boundary and g +const int OPT_G = 0b0100; +// Compute full reduction +const int OPT_FULL = 0b1000; + +/** \brief Enum for export: lets chose the type of export. + * + * \tparam PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) + * \tparam FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) + * \tparam G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) + */ +enum ExportType { + PSC, + FSTAR, + G +}; + + +/** \brief PairCell: Structure to represent a pair of cells (for HDVF operations). + * The PairCell follows the following conventions depending on the operation type: + * - A: sigma is of dim q and tau is of dim q+1 ; + * - R: sigma is of dim q and tau is of dim q+1 ; + * - M: sigma is primary and tau is critical of dim q ; + * - W: sigma is secondary and tau is critical of dim q ; + * - MW: sigma is primary and tau is secondary of dim q. + */ +struct PairCell { + int sigma; // Index of the first cell + int tau; // Index of the second cell + int dim; // Dimension of cells: q/q+1 for A and R, q for other operations +}; + + +/** + * \class HDVF + * \brief Implementation of HDVF and associate operations. + * + * The HDVF class contains all functions to build HDVF, create perfect HDVF (A and associate finders) and delineated generators through HDVF operations (R, M, W, MW and associate finders). + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ComplexType The type of complex (default is SimpComplex) + * + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + */ + + +template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> +class HDVF { +public: + /** \brief Typedefs for coefficient type and different chain and matrix types. */ + typedef _ChainType<_CoefficientType, OSM::COLUMN> CChain; + typedef _ChainType<_CoefficientType, OSM::ROW> RChain; + typedef _SparseMatrixType<_CoefficientType, OSM::COLUMN> CMatrix; + typedef _SparseMatrixType<_CoefficientType, OSM::ROW> RMatrix; + +protected: + // Properties + /** \brief Flags for the cells. */ + std::vector> _flag; + /** \brief Number of PRIMARY cells. */ + std::vector _nb_P; + /** \brief Number of SECONDARY cells. */ + std::vector _nb_S; + /** \brief Number of CRITICAL cells. */ + std::vector _nb_C; + /** \brief Row matrices for f. */ + std::vector _F_row; + /** \brief Column matrices for g. */ + std::vector _G_col; + /** \brief Column matrices for h. */ + std::vector _H_col; + /** \brief Column matrices for reduced boundary. */ + std::vector _DD_col; + + /** \brief Reference to the underlying complex. */ + const _ComplexType& _K; + + /** \brief HDVF options for computation (computation of partial reduction). */ + int _hdvf_opt; + +public: + // Constructor - default : full reduction computed, no sub-complex + HDVF(const _ComplexType& K, int hdvf_opt = OPT_FULL) ; + // Copy constructor + HDVF(const HDVF& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } + // Destructor + ~HDVF() { } + + // findPair functions + + /** \brief find a valid PairCell for A in dimension q */ + virtual PairCell findPairA(int q, bool &found); // const; + /** \brief find a valid PairCell containing tau for A in dimension q */ + virtual PairCell findPairA(int q, bool &found, int tau); // const; + /** \brief find all the valid PairCell for A in dimension q */ + virtual std::vector findPairsA(int q, bool &found); // const; + /** \brief find all the valid PairCell containing tau for A in dimension q */ + virtual std::vector findPairsA(int q, bool &found, int tau); // const; + + /** \brief find a valid PairCell for M in dimension q */ + PairCell findPairM(int q, bool &found); // const; + /** \brief find a valid PairCell containing tau for M in dimension q */ + PairCell findPairM(int q, bool &found, int tau); // const; + /** \brief find all the valid PairCell for M in dimension q */ + std::vector findPairsM(int q, bool &found); // const; + /** \brief find all the valid PairCell containing tau for M in dimension q */ + std::vector findPairsM(int q, bool &found, int tau); // const; + + /** \brief find a valid PairCell for W in dimension q */ + PairCell findPairW(int q, bool &found); // const; + /** \brief find a valid PairCell containing tau for W in dimension q */ + PairCell findPairW(int q, bool &found, int tau); // const; + /** \brief find all the valid PairCell for W in dimension q */ + std::vector findPairsW(int q, bool &found); // const; + /** \brief find all the valid PairCell containing tau for W in dimension q */ + std::vector findPairsW(int q, bool &found, int tau); // const; + + /** \brief find a valid PairCell for MW in dimension q */ + PairCell findPairMW(int q, bool &found); // const; + /** \brief find a valid PairCell containing tau for MW in dimension q */ + PairCell findPairMW(int q, bool &found, int tau); // const; + /** \brief find all the valid PairCell for MW in dimension q */ + std::vector findPairsMW(int q, bool &found); // const; + /** \brief find all the valid PairCell containing tau for MW in dimension q */ + std::vector findPairsMW(int q, bool &found, int tau); // const; + + // HDVF methods + /** \brief HDVF operation A(gamma1, gamma2) */ + void A(int gamma1, int gamma2, int dim); + void R(int pi, int sigma, int dim); + void M(int pi, int gamma, int dim); + void W(int sigma, int gamma, int dim); + void MW(int pi, int sigma, int dim); + + /** \brief Compute a perfect HDVF + From dimension q-1 to dimension 0 + As long as findPairA(q) returns a pair + -> Perform operation A + -> Add the pair to the output vector + */ + std::vector computePerfectHDVF(bool verbose = false); + + /** \brief Compute a perfect HDVF + From dimension q-1 to dimension 0 + As long as findPairsA(q) returns pairs + -> Choose one randomly + -> Perform operation A + -> Add the pair to the output vector + Slower than computePerfectHDVF + */ + std::vector computeRandPerfectHDVF(bool verbose = false); + + // HDVF getters + // Method to get cells if with a given flag (P,S,C) for each dimension + virtual std::vector > get_flag (FlagType flag) const ; + // Method to get cells with a given flag (P,S,C) for a given dimension + virtual std::vector get_flag_dim (FlagType flag, int q) const ; + // Method to get the flag (P,S,C) of a cell tau of dimension q + FlagType get_cell_flag (int q, int tau) const { return _flag.at(q).at(tau); } + + // Method to get options + int get_hdvf_opts () const { return _hdvf_opt ; } + + // Method to print the matrices _F_row, _G_col, _H_col + virtual std::ostream& print_matrices(std::ostream &out = std::cout) const; + + // Method to print the reduction + virtual std::ostream& print_reduction(std::ostream &out = std::cout); // const; + + // Method to print A-pairs + virtual std::ostream& print_pairs(const std::vector& pairs, std::ostream &out = std::cout); + + // Method to project a chain onto P, S, or C cells + template + _ChainType<_CoefficientType, ChainTypeFlag> projection(const _ChainType<_CoefficientType, ChainTypeFlag>& chain, FlagType flag, int dim) const { + // Create a new chain to store the result + // Better to initialize 'result' directly with the correct size and iterate over it + _ChainType<_CoefficientType, ChainTypeFlag> result(chain); + + // Iterate over each element of the chain + std::vector tmp ; + for (typename _ChainType<_CoefficientType, ChainTypeFlag>::const_iterator it = result.cbegin(); it != result.cend(); ++it) + { + int cell_index = it->first; + _CoefficientType value = it->second; + + // Check the flag of the corresponding cell + if (_flag[dim][cell_index] != flag) { + // Set to 0 + tmp.push_back(cell_index) ; + + } + } + result /= tmp ; + return result; + } + + // [OLD] Method to generate labels for visualisation + // Kept for compatibility + // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned + virtual std::vector > export_label (ExportType type, int cell=0, int dim=0) const + { + std::vector > labels(_K.dim()+1) ; + if (type == PSC) + { + for (int q=0; q<=_K.dim(); ++q) + { + for (int i = 0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else + labels.at(q).push_back(0) ; + } + } + } + else + { + if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) + { + for (int q=0; q<=_K.dim(); ++q) + { + labels.at(q).resize(_K.nb_cells(q)) ; + } + + if (dim < _K.dim()) + { + labels.at(dim).at(cell) = 1 ; + const RChain& fstar_cell = OSM::cgetRow(_F_row.at(dim), cell) ; + for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + { + // Set the cofaces of it->first in dimension dim+1 + RChain cofaces(_K.cod(it->first,dim)) ; + for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells + } + } + else + throw "Error: cannot export f* for a cell of maximal dimension" ; + } + else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G + { + for (int q=0; q<=_K.dim(); ++q) + { + labels.at(q).resize(_K.nb_cells(q)) ; + } + + labels.at(dim).at(cell) = 1 ; + const CChain& g_cell = OSM::cgetColumn(_G_col.at(dim), cell) ; + for (typename CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) + labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells + } + } + return labels ; + } + + // Method to generate PSC labels for visualisation + virtual std::vector > export_labelsPSC () const + { + std::vector > labels(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + { + for (int i = 0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else if (_flag.at(q).at(i) == CRITICAL) + labels.at(q).push_back(0) ; + else // NONE + labels.at(q).push_back(2) ; + } + } + return labels ; + } + + // Method to export G chains for visualisation + virtual CChain export_GChain (int cell, int dim) const + { + if ((dim<0) || (dim>_K.dim())) + throw "Error : export_GChain with dim out of range" ; + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + CChain g_cell(OSM::getColumn(_G_col.at(dim), cell)) ; + // Add 1 to the cell + g_cell[cell] = 1 ; + return g_cell ; + } + else + throw "Error : trying to export g_chain without proper HDVF option" ; + } + + // Method to export FSTAR chains for visualisation + virtual CChain export_FSTARChain (int cell, int dim) const + { + if ((dim<0) || (dim>_K.dim())) + throw "Error : export_GChain with dim out of range" ; + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + RChain fstar_cell(OSM::getRow(_F_row.at(dim), cell)) ; + // Add 1 to the cell + fstar_cell[cell] = 1 ; + // Compute the cofaces + if (dim < _K.dim()) + { + CChain fstar_cofaces(_K.nb_cells(dim+1)) ; + for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + { + // Set the cofaces of it->first in dimension dim+1 + RChain cofaces(_K.cod(it->first,dim)) ; + for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + fstar_cofaces[it2->first] = 1 ; + } + return fstar_cofaces ; + } + else + return CChain(0) ; + } + else + throw "Error : trying to export g_chain without proper HDVF option" ; + } +protected: + void progress_bar(int i, int n) + { + const int step(n/20) ; + if ((i%step)==0) + { + const float percentage(float(i)/(n-1)) ; + const char PBSTR[] = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" ; + const int PBWIDTH(60) ; + int val = (int) (percentage * 100); + int lpad = (int) (percentage * PBWIDTH); + int rpad = PBWIDTH - lpad; + printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); + fflush(stdout); + } + if (i==(n-1)) + std::cout << std::endl ; + } + +}; + +// Constructor for the HDVF class +template typename _ChainType, template typename _SparseMatrixType> +HDVF::HDVF(const ComplexType& K, int hdvf_opt) : _K(K) { + // Get the dimension of the simplicial complex + int dim = _K.dim(); + std::cout << "----> Starting HDVF creation / dim " << dim << std::endl ; + // HDVF options + _hdvf_opt = hdvf_opt ; + + // Resize the _DD_col vector to hold dim+1 elements + _DD_col.resize(dim + 1); + + // Resize the _F_row vector to hold dim+1 elements + if (_hdvf_opt & (OPT_FULL | OPT_F)) + _F_row.resize(dim + 1); + + // Resize the _G_col vector to hold dim+1 elements + if (_hdvf_opt & (OPT_FULL | OPT_G)) + _G_col.resize(dim + 1); + + // Resize the _H_col vector to hold dim+1 elements + if (_hdvf_opt & OPT_FULL) + _H_col.resize(dim + 1); + + // Resize flag and count vectors to hold dim+1 elements + _flag.resize(dim + 1); + _nb_P.resize(dim + 1); + _nb_S.resize(dim + 1); + _nb_C.resize(dim + 1); + + // Initialize matrices and counters + + for (int q = 0; q <= dim; q++) { + // Initialize _F_row[q] as a row matrix with dimensions (dim(q) x dim(q)) + if (_hdvf_opt & (OPT_FULL | OPT_F)) + _F_row[q] = RMatrix(_K.nb_cells(q), _K.nb_cells(q)); + + // Initialize _G_col[q] as a column matrix with dimensions (dim(q) x dim(q)) + if (_hdvf_opt & (OPT_FULL | OPT_G)) + _G_col[q] = CMatrix(_K.nb_cells(q), _K.nb_cells(q)); + + // Initialize _H_col[q] as a column matrix with dimensions (dim(q+1) x dim(q)) + if (_hdvf_opt & OPT_FULL) + _H_col[q] = CMatrix(_K.nb_cells(q + 1), _K.nb_cells(q)); + + // Initialize the counters for PRIMARY, SECONDARY, and CRITICAL cells + _nb_P[q] = 0; + _nb_S[q] = 0; + _nb_C[q] = _K.nb_cells(q); + } + + // Initialize the flags for each dimension to CRITICAL + for (int q = 0; q <= dim; q++) { + _flag[q] = std::vector(_K.nb_cells(q), CRITICAL); + } + + // Populate the DD matrices + _DD_col.resize(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + _DD_col.at(q) = _K.get_bnd_matrix(q) ; + std::cout << "------> End HDVF creation" << std::endl ; +} + +// Method to print the matrices +template typename _ChainType, template typename _SparseMatrixType> +std::ostream& HDVF::print_matrices(std::ostream& out) const { + // Iterate through each dimension and print the corresponding matrices + for (int q = 0; q <= _K.dim(); ++q) { + out << "------- Dimension " << q << std::endl; + + out << "Matrices _DD_col:" << std::endl; + out << _DD_col[q] << std::endl; + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + out << "Matrices _F_row:" << std::endl; + out << _F_row[q] << std::endl; + } + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + out << "Matrices _G_col:" << std::endl; + out << _G_col[q] << std::endl; + } + + if (_hdvf_opt & OPT_FULL) + { + out << "Matrices _H_col:" << std::endl; + out << _H_col[q] << std::endl; + } + } + return out ; +} + + +// Methods to find a pair of cells for A in dimension q +// -> = +- 1 with cell1, cell2 critical +// First version: returns a pair of dimensions q / q+1 +// Second version: returns all the pairs containing sigma + +/** \brief find a valid PairCell for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairA(int q, bool &found) // const +{ + found = false; + PairCell p; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = _DD_col[q+1].begin(); (it_col != _DD_col[q+1].end() && !found); ++it_col) + { + const CChain& col(OSM::cgetColumn(_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + found = true; + } + } + } + return p; +} + + /** \brief find a valid PairCell containing tau for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairA(int q, bool &found, int tau) // const +{ + found = false; + PairCell p ; + + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; + for (typename CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + p.sigma = it->first ; + p.tau = tau ; + p.dim = q-1 ; + } + } + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; + for (typename RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + p.sigma = tau ; + p.tau = it->first ; + p.dim = q ; + } + } + return p; +} + +/** \brief find all the valid PairCell for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsA(int q, bool &found) // const +{ + std::vector pairs; + found = false ; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) + { + const CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + PairCell p; + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + pairs.push_back(p) ; + found = true; + } + } + } + return pairs; +} + +/** \brief find all the valid PairCell containing tau for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsA(int q, bool &found, int tau) // const +{ + found = false; + std::vector pairs; + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; + for (typename RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = tau ; + p.tau = it->first ; + p.dim = q ; + pairs.push_back(p) ; + } + } + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; + for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = it->first ; + p.tau = tau ; + p.dim = q-1 ; + pairs.push_back(p) ; + } + } + return pairs; +} + +// Methods to find a pair of cells for M in dimension q +// -> = +- 1 with cell1 primary, cell2 critical +// First version: returns a pair of dimensions q +// Second version: returns all the pairs containing sigma + +/** \brief find a valid PairCell for M in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairM(int q, bool &found) // const +{ + found = false; + PairCell p; + + if (_hdvf_opt & OPT_F) + { + // Search for +-1 in _F - iterate over rows + for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); (it_row != _F_row[q].end() && !found); ++it_row) + { + const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); + + // Iterate through the entries of the row + for (typename RChain::const_iterator it = row.begin(); (it != row.end() && !found); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + p.sigma = it->first; // primary cell + p.tau = *it_row; // critical cell + p.dim = q; + found = true; + } + } + } + } + return p; +} + +/** \brief find a valid PairCell containing tau for M in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairM(int q, bool &found, int tau) // const +{ + found = false; + PairCell p; + if (_flag.at(q).at(tau) == SECONDARY) + return p ; // Empty / found false + + if (_hdvf_opt & OPT_F) + { + // If tau is primary, search for gamma such that =+-1 + if (_flag.at(q).at(tau) == PRIMARY) + { + for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); (it_row != _F_row.at(q).end() && !found); ++it_row) + { + if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) + { + p.sigma = tau ; // primary cell + p.tau = *it_row ; // critical cell + p.dim = q ; + found = true; + } + } + } + // If tau is critical, search for pi such that =+-1 + if (_flag.at(q).at(tau) == CRITICAL) + { + const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; + for (typename RChain::const_iterator it = row.cbegin(); (it != row.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + p.sigma = it->first ; // primary cell + p.tau = tau ; // critical cell + p.dim = q ; + found = true; + } + } + } + } + return p; +} + +/** \brief find all the valid PairCell for M in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsM(int q, bool &found) // const +{ + found = false; + std::vector pairs; + if (_hdvf_opt & OPT_F) + { + // Search for +-1 in _F - iterate over rows + for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); it_row != _F_row[q].end() ; ++it_row) + { + const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); + + // Iterate through the entries of the row + for (typename RChain::const_iterator it = row.begin(); it != row.end(); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and add it + PairCell p ; + p.sigma = it->first; // primary cell + p.tau = *it_row; // critical cell + p.dim = q; + pairs.push_back(p) ; + } + } + } + } + found = !pairs.empty() ; + return pairs; +} + +/** \brief find all the valid PairCell containing tau for M in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsM(int q, bool &found, int tau) // const +{ + found = false; + std::vector pairs; + if (_flag.at(q).at(tau) == SECONDARY) + return pairs ; // Empty / found false + + if (_hdvf_opt & OPT_F) + { + // If tau is primary, search for gamma such that =+-1 + if (_flag.at(q).at(tau) == PRIMARY) + { + for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); it_row != _F_row.at(q).end(); ++it_row) + { + if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) + { + PairCell p ; + p.sigma = tau ; // primary cell + p.tau = *it_row ; // critical cell + p.dim = q ; + pairs.push_back(p) ; + } + } + } + // If tau is critical, search for pi such that =+-1 + if (_flag.at(q).at(tau) == CRITICAL) + { + const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; + for (typename RChain::const_iterator it = row.cbegin(); it != row.cend(); ++it) + { + if (abs(it->second) == 1) + { + PairCell p ; + p.sigma = it->first ; // primary cell + p.tau = tau ; // critical cell + p.dim = q ; + pairs.push_back(p) ; + } + } + } + } + found = !pairs.empty() ; + return pairs; +} + +// Methods to find a pair of cells for W in dimension q +// -> = +- 1 with cell1 secondary, cell2 critical +// First version: returns a pair of dimensions q +// Second version: returns all the pairs containing sigma + +/** \brief find a valid PairCell for W in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairW(int q, bool &found) // const +{ + found = false; + PairCell p; + + if (_hdvf_opt & OPT_G) + { + // Search for +-1 in _G - iterate over cols + for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); (it_col != _F_row[q].end() && !found); ++it_col) + { + CChain &col = _G_col[q][*it_col]; + + // Iterate through the entries of the col + for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + p.sigma = it->first; // secondary cell + p.tau = *it_col; // critical cell + p.dim = q; + found = true; + } + } + } + } + return p; +} + +/** \brief find a valid PairCell containing tau for W in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairW(int q, bool &found, int tau) // const +{ + found = false; + PairCell p; + if (_flag.at(q).at(tau) == PRIMARY) + return p ; // Empty / found false + + if (_hdvf_opt & OPT_G) + { + // If tau is primary, search for gamma such that =+-1 + if (_flag.at(q).at(tau) == SECONDARY) + { + for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); (it_col != _G_col.at(q).end() && !found); ++it_col) + { + if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) + { + p.sigma = tau ; // secondary cell + p.tau = *it_col ; // critical cell + p.dim = q ; + found = true; + } + } + } + // If tau is critical, search for sigma such that =+-1 + if (_flag.at(q).at(tau) == CRITICAL) + { + CChain col(OSM::getColumn(_G_col.at(q), tau)) ; + for (typename CChain::const_iterator it = col.cbegin(); (it != col.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + p.sigma = it->first ; // secondary cell + p.tau = tau ; // critical cell + p.dim = q ; + found = true; + } + } + } + } + return p; +} + +/** \brief find all the valid PairCell for W in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsW(int q, bool &found) // const +{ + found = false; + std::vector pairs; + + if (_hdvf_opt & OPT_FULL) + { + // Search for +-1 in _G - iterate over cols + for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); it_col != _F_row[q].end(); ++it_col) + { + CChain &col = _G_col[q][*it_col]; + + // Iterate through the entries of the col + for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + PairCell p ; + p.sigma = it->first; // secondary cell + p.tau = *it_col; // critical cell + p.dim = q; + pairs.push_back(p) ; + } + } + } + } + found = !pairs.empty() ; + return pairs; +} + +/** \brief find all the valid PairCell containing tau for W in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsW(int q, bool &found, int tau) // const +{ + found = false; + std::vector pairs; + if (_flag.at(q).at(tau) == PRIMARY) + return pairs ; // Empty / found false + + if (_hdvf_opt & OPT_FULL) + { + // If tau is primary, search for gamma such that =+-1 + if (_flag.at(q).at(tau) == SECONDARY) + { + for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); it_col != _G_col.at(q).end(); ++it_col) + { + if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) + { + PairCell p ; + p.sigma = tau ; // secondary cell + p.tau = *it_col ; // critical cell + p.dim = q ; + pairs.push_back(p) ; + } + } + } + // If tau is critical, search for sigma such that =+-1 + if (_flag.at(q).at(tau) == CRITICAL) + { + CChain col(OSM::getColumn(_G_col.at(q), tau)) ; + for (typename CChain::const_iterator it = col.cbegin(); it != col.cend(); ++it) + { + if (abs(it->second) == 1) + { + PairCell p ; + p.sigma = it->first ; // secondary cell + p.tau = tau ; // critical cell + p.dim = q ; + pairs.push_back(p) ; + } + } + } + } + found = !pairs.empty() ; + return pairs; +} + +// Method to find a pair of cells for MW in dimension q +// -> = +- 1 and = +- 1 with cell1 primary, cell2 secondary +// First version: returns a pair of dimensions q +// Second version: returns all the pairs containing sigma + +/** \brief find a valid PairCell for MW in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairMW(int q, bool &found) // const +{ + found = false; + PairCell p; + + if (_hdvf_opt & OPT_FULL) + { + // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero + // iterate on H_q and H_q-1 accordingly + for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) + { + const int pi = *it_pi ; + CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + CChain d_pi = _K.d(pi, q) ; + CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) + { + RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + if (!H11q1.isNull()) + { + RChain cod_sigma = _K.cod(sigma, q) ; + RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + + // Compute xi and xi' to test the validity of MW + + const int xi = projS_cod_sigma * H11 ; + const int xip = H11q1 * projP_d_pi ; + found = ((abs(xi) == 1) && (abs(xip) == 1)) ; + if (found) + { + p.sigma = pi ; // primary cell + p.tau = sigma ; // secondary cell + p.dim = q ; + } + } + } + } + } + return p; +} + +/** \brief find a valid PairCell containing tau for MW in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF::findPairMW(int q, bool &found, int tau) // const +{ + found = false; + PairCell p; + + if (_flag.at(q).at(tau) == CRITICAL) + return p ; // Empty / found false + + if (_hdvf_opt & OPT_FULL) + { + // If tau is primary (rename pi), search for a valid sigma + if (_flag.at(q).at(tau) == PRIMARY) + { + const int pi(tau) ; + // Col pi of H_q and proj_P(d(pi)) must at least be non empty + CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + CChain d_pi = _K.d(pi, q) ; + CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + + if (H11.isNull() || projP_d_pi.isNull()) + return p ; + + // Search for sigma with col_sigma(H_q-1) non empty + for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) + { + RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + if (!H11q1.isNull()) + { + // and proj_S(cod(sigma)) non empty + RChain cod_sigma = _K.cod(sigma, q) ; + RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + if (!projS_cod_sigma.isNull()) + { + // test xi and xip + const int xi = projS_cod_sigma * H11 ; + const int xip = H11q1 * projP_d_pi ; + found = ((abs(xi) == 1) && (abs(xip) == 1)) ; + if (found) + { + p.sigma = pi ; // primary cell + p.tau = sigma ; // critical cell + p.dim = q ; + } + } + } + } + } + else // cell is secondary + { + // cout << "secondary" << endl ; + const int sigma(tau) ; + // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty + RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + RChain cod_sigma = _K.cod(sigma, q) ; + RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + if (H11q1.isNull() || projS_cod_sigma.isNull()) + return p ; + + // Search for pi with col pi of H_q non empty + for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) + { + const int pi(*it_pi) ; + + CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + CChain d_pi = _K.d(pi, q) ; + CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + // proj_P of d(pi) must also be non empty + if (!projP_d_pi.isNull()) + { + // test xi and xip + const int xi = projS_cod_sigma * H11 ; + const int xip = H11q1 * projP_d_pi ; + found = ((abs(xi) == 1) && (abs(xip) == 1)) ; + if (found) + { + p.sigma = pi ; // primary cell + p.tau = sigma ; // secondary cell + p.dim = q ; + } + } + } + } + } + return p; +} + +/** \brief find all the valid PairCell for MW in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsMW(int q, bool &found) // const +{ + found = false; + std::vector pairs; + + if (_hdvf_opt & OPT_FULL) + { + // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero + // iterate on H_q and H_q-1 accordingly + for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) + { + const int pi = *it_pi ; + CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + CChain d_pi = _K.d(pi, q) ; + CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) + { + RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + if (!H11q1.isNull()) + { + RChain cod_sigma = _K.cod(sigma, q) ; + RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + + // Compute xi and xi' to test the validity of MW + + const int xi = projS_cod_sigma * H11 ; + const int xip = H11q1 * projP_d_pi ; + found = ((abs(xi) == 1) && (abs(xip) == 1)) ; + if (found) + { + PairCell p; + p.sigma = pi ; // primary cell + p.tau = sigma ; // secondary cell + p.dim = q ; + pairs.push_back(p) ; + } + } + } + } + } + found = !pairs.empty() ; + return pairs; +} + +/** \brief find all the valid PairCell containing tau for MW in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::findPairsMW(int q, bool &found, int tau) // const +{ + found = false; + std::vector pairs; + if (_flag.at(q).at(tau) == CRITICAL) + return pairs ; // Empty / found false + + if (_hdvf_opt & OPT_FULL) + { + // If tau is primary (rename pi), search for a valid sigma + if (_flag.at(q).at(tau) == PRIMARY) + { + const int pi(tau) ; + // Col pi of H_q and proj_P(d(pi)) must at least be non empty + CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + CChain d_pi = _K.d(pi, q) ; + CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + + if (H11.isNull() || projP_d_pi.isNull()) + return pairs ; + + // Search for sigma with col_sigma(H_q-1) non empty + for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) + { + RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + if (!H11q1.isNull()) + { + // and proj_S(cod(sigma)) non empty + RChain cod_sigma = _K.cod(sigma, q) ; + RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + if (!projS_cod_sigma.isNull()) + { + // test xi and xip + const CoefficientType xi = projS_cod_sigma * H11 ; + const CoefficientType xip = H11q1 * projP_d_pi ; + found = ((abs(xi) == 1) && (abs(xip) == 1)) ; + if (found) + { + PairCell p ; + p.sigma = pi ; // primary cell + p.tau = sigma ; // critical cell + p.dim = q ; + pairs.push_back(p) ; + } + } + } + } + } + else // cell is secondary + { + // cout << "secondary" << endl ; + const int sigma(tau) ; + // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty + RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + RChain cod_sigma = _K.cod(sigma, q) ; + RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + if (H11q1.isNull() || projS_cod_sigma.isNull()) + return pairs ; + + // Search for pi with col pi of H_q non empty + for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) + { + const int pi(*it_pi) ; + + CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + CChain d_pi = _K.d(pi, q) ; + CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + // proj_P of d(pi) must also be non empty + if (!projP_d_pi.isNull()) + { + // test xi and xip + const CoefficientType xi = projS_cod_sigma * H11 ; + const CoefficientType xip = H11q1 * projP_d_pi ; + found = ((abs(xi) == 1) && (abs(xip) == 1)) ; + if (found) + { + PairCell p ; + p.sigma = pi ; // primary cell + p.tau = sigma ; // secondary cell + p.dim = q ; + pairs.push_back(p) ; + } + } + } + } + } + found = !pairs.empty() ; + return pairs; +} + + +// Method to perform operation A +// tau1 is in dimension q, tau2 is in dimension q+1 +//template +template typename _ChainType, template typename _SparseMatrixType> +void HDVF::A(int tau1, int tau2, int q) { + //----------------------------------------------- Submatrices of D ---------------------------------------------------- + + // Output operation details to the console +// cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; + + // Extract submatrices from _DD_col + RChain D12(OSM::getRow(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 + CChain D21(OSM::getColumn(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 + CoefficientType D11(D12[tau2]); // D11 is the coefficient at the intersection of tau2 in D12 + + // Assert that D11 is either 1 or -1 (check invertibility) + assert((D11 == 1) || (D11 == -1)); // !!!!! Test invertibility + + // Compute the inverse of D11 (which is itself, since D11 is 1 or -1) + CoefficientType D11_inv = D11; + + // Perform operations to remove the row and column contributions + D12 /= std::vector({tau2}); // Remove tau2 column from D12 + D21 /= std::vector({tau1}); // Remove tau1 row from D21 + + // Delete rows and columns from _DD_col + _DD_col[q + 1].delRow(tau1); // Remove row tau1 from _DD_col[q+1] + _DD_col[q + 1].delColumn(tau2); // Remove column tau2 from _DD_col[q+1] + + //---------------------------------------------- Submatrices of F ----------------------------------------------------- + + RChain F11 ; + CChain G11 ; + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Extract the relevant submatrix from _F_row + F11 = OSM::getRow(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 + + // Delete the row tau1 from _F_row + _F_row[q].delRow(tau1); + } + + //--------------------------------------------- Submatrices of G ------------------------------------------------------ + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Extract the relevant submatrix from _G_col + G11 = OSM::getColumn(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 + + // Delete the column tau2 from _G_col + _G_col[q + 1].delColumn(tau2); + } + + //--------------------------------------------- Update matrices ------------------------------------------------------- + + // ---- Update _F_row + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Update _F_row[q] + // Subtract the product of (D21 * D11_inv) and F11 from _F_row[q] + // Note: % operator returns a row matrix, so be careful with operations + _F_row[q] -= (D21 * D11_inv) % F11; + + // Set the column tau1 of _F_row[q] to (D21 * (-D11_inv)) + OSM::setColumn(_F_row[q], tau1, D21 * (-D11_inv)); + + // Remove the row tau2 from _F_row[q+1] + _F_row[q + 1].delRow(tau2); + } + + // ---- Update _G_col + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Update _G_col[q + 1] + // Subtract the product of (G11 * D11_inv) and D12 from _G_col[q+1] + _G_col[q + 1] -= (G11 * D11_inv) * D12; + + // Set the row tau2 of _G_col[q + 1] to (D12 * (-D11_inv)) + OSM::setRow(_G_col[q + 1], tau2, D12 * (-D11_inv)); + + // Remove the column tau1 from _G_col[q] + _G_col[q].delColumn(tau1); + } + + // ---- Update _H_col + + if (_hdvf_opt & OPT_FULL) + { + // Update _H_col[q] + // Compute the temporary matrix product G11 * F11 + CMatrix tmp = G11 * F11; + + // Add the product of tmp and D11_inv to _H_col[q] + _H_col[q] += (tmp) * D11_inv; + + // Set the row tau2 of _H_col[q] to (F11 * D11_inv) + OSM::setRow(_H_col[q], tau2, F11 * D11_inv); + + // Set the column tau1 of _H_col[q] to (G11 * D11_inv) + OSM::setColumn(_H_col[q], tau1, G11 * D11_inv); + + // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv + _H_col[q].set_coef(tau2, tau1, D11_inv); + } + + // ---- Update _DD_col + + // Update _DD_col + _DD_col[q + 1] -= (D21 * D12) * D11_inv; + + // Remove columns and rows from _DD_col as necessary + if (q > 0) { + _DD_col[q].delColumn(tau1); // Remove column tau1 from _DD_col[q] + } + if (q + 2 <= _K.dim()) { + _DD_col[q + 2].delRow(tau2); // Remove row tau2 from _DD_col[q+2] + } + + // Update flags + _flag[q][tau1] = PRIMARY; // Set the flag of tau1 in dimension q to PRIMARY + --_nb_C.at(q) ; + ++_nb_P.at(q) ; + _flag[q + 1][tau2] = SECONDARY; // Set the flag of tau2 in dimension q+1 to SECONDARY + --_nb_C.at(q+1) ; + ++_nb_S.at(q+1) ; + + // ----------------------------------------------------------------------------------------------------------------------- +} + +// Method to perform operation R +// pi is in dimension q, sigma is in dimension q+1 +//template +template typename _ChainType, template typename _SparseMatrixType> +void HDVF::R(int pi, int sigma, int q) { + //----------------------------------------------- Submatrices of H ---------------------------------------------------- + + if (_hdvf_opt & OPT_FULL) + { + // Output operation details to the console + std::cout << "R of " << pi << "(dim " << q << ") / " << sigma << "(dim " << q + 1 << ")" << std::endl; + + // Extract the relevant row and column chains from _H_col + RChain H12 = OSM::getRow(_H_col[q], sigma); // H12 is the row chain from _H_col[q] at index sigma + CChain H21 = OSM::getColumn(_H_col[q], pi); // H21 is the column chain from _H_col[q] at index pi + + // Get the coefficient at the intersection of H12 and H21 + CoefficientType H11(H12[pi]); // H11 is the coefficient at row sigma and column pi + + // Assert that H11 is either 1 or -1 (check invertibility) + assert((H11 == 1) || (H11 == -1)); // !!!!! Test invertibility + CoefficientType H11_inv = H11; // Inverse of H11 (which is itself for 1 or -1) + + // Remove the contributions of pi from H12 and sigma from H21 + H12 /= std::vector({pi}); // Remove column pi from H12 + H21 /= std::vector({sigma}); // Remove row sigma from H21 + + // Remove the corresponding row and column from _H_col + _H_col[q].delRow(sigma); // Remove row sigma from _H_col[q] + _H_col[q].delColumn(pi); // Remove column pi from _H_col[q] + + //---------------------------------------------- Submatrices of F ----------------------------------------------------- + + // Extract the relevant column chain from _F_row + CChain F11 = OSM::getColumn(_F_row[q], pi); // F11 is the column chain from _F_row[q] at index pi + + // Remove the column pi from _F_row + _F_row[q].delColumn(pi); + + //--------------------------------------------- Submatrices of G ------------------------------------------------------ + + // Extract the relevant row chain from _G_col + RChain G11 = OSM::getRow(_G_col[q + 1], sigma); // G11 is the row chain from _G_col[q+1] at index sigma + + // Remove the row sigma from _G_col + _G_col[q + 1].delRow(sigma); + + //--------------------------------------------- Update matrices ------------------------------------------------------- + + // Update _F_row[q] + // Subtract the product of (H12 * F11) and H11 from _F_row[q] + // Note: % operator returns a row matrix, so be careful with operations + _F_row[q] -= (F11 % H12) * H11_inv; + + // Set the row pi of _F_row[q] to (H12 * (-H11_inv)) + OSM::setRow(_F_row[q], pi, H12 * (-H11_inv)); + + // Update _G_col[q + 1] + // Subtract the product of (H21 * G11) and H11_inv from _G_col[q + 1] + _G_col[q + 1] -= (H21 * G11) * H11_inv; + + // Set the column sigma of _G_col[q + 1] to (H21 * (-H11_inv)) + OSM::setColumn(_G_col[q + 1], sigma, H21 * (-H11_inv)); + + // Update _DD_col + // Compute the temporary matrix product F11 * G11 + _DD_col[q + 1] += (F11 * G11) * H11_inv; + + // Set the row pi in _DD_col[q + 1] to (G11 * H11_inv) + OSM::setRow(_DD_col[q + 1], pi, G11 * H11_inv); + + // Set the column sigma in _DD_col[q + 1] to (F11 * H11_inv) + OSM::setColumn(_DD_col[q + 1], sigma, F11 * H11_inv); + + // Set the coefficient at (pi, sigma) in _DD_col to H11_inv + _DD_col[q + 1].set_coef(pi, sigma, H11_inv); + + // Update _H_col[q] + // Subtract the product of (H21 * H12) and H11_inv from _H_col[q] + _H_col[q] -= (H21 * H12) * H11_inv; + + // Perform additional updates + + // Extract boundary and coboundary chains + CChain bnd_pi(_K.d(pi, q)); // Boundary of pi in dimension q + RChain cobnd_sigma(_K.cod(sigma, q + 1)); // Coboundary of sigma in dimension q+1 + + // Project the boundary and coboundary chains onto PRIMARY and SECONDARY flags + CChain proj_P_pi(projection(bnd_pi, PRIMARY, q)); + RChain proj_S_sigma(projection(cobnd_sigma, SECONDARY, q + 1)); + + if (q > 0) { + // Update _DD_col[q] with projections and _F_row[q-1] + CChain c1(_F_row[q - 1] * proj_P_pi + projection(bnd_pi, CRITICAL, q)); + OSM::setColumn(_DD_col[q], pi, c1); + OSM::setColumn(_G_col[q], pi, _H_col[q - 1] * proj_P_pi); + } + + // Update _F_row[q+1] with projection and _H_col[q+1] + OSM::setRow(_F_row[q + 1], sigma, proj_S_sigma * _H_col[q + 1]); + + if (q + 2 <= _K.dim()) { + // Update _DD_col[q+2] with projections + RChain c4(projection(cobnd_sigma, CRITICAL, q + 1) + proj_S_sigma * _G_col[q + 2]); + OSM::setRow(_DD_col[q + 2], sigma, c4); + } + + // Update flags + _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to CRITICAL + ++_nb_C.at(q) ; + --_nb_P.at(q) ; + _flag[q + 1][sigma] = CRITICAL; // Set the flag of sigma in dimension q+1 to CRITICAL + ++_nb_C.at(q+1) ; + --_nb_S.at(q+1) ; + } + else + std::cout << "!!! R impossible with partial reduction options" << std::endl; +} + +// Method to perform operation M +// pi is in dimension q, gamma is in dimension q +//template +template typename _ChainType, template typename _SparseMatrixType> +void HDVF::M(int pi, int gamma, int q) { + //----------------------------------------------- Submatrices of F ---------------------------------------------------- + + if (_hdvf_opt & OPT_FULL) + { + // Output the operation details to the console + std::cout << "M_" << q << "(" << pi << "," << gamma << ")" << std::endl; + + if (q == _K.dim()) + throw("M operation in max dimension !!!") ; + + // Extract row and column chains from _F_row + RChain F12(OSM::getRow(_F_row[q], gamma)); // F12 is the row chain from _F_row[q] at index gamma + CChain F21(OSM::getColumn(_F_row[q], pi)); // F21 is the column chain from _F_row[q] at index pi + + // Get the coefficient at the intersection of F12 and F21 + CoefficientType F11(F12[pi]); // F11 is the coefficient at row gamma and column pi + + // Assert that F11 is either 1 or -1 (for invertibility) + assert((F11 == 1) || (F11 == -1)); // !!!!! Test invertibility + CoefficientType F11_inv = F11; // Inverse of F11 (which is itself for 1 or -1) + + // Remove the contributions of pi from F12 and gamma from F21 + F12 /= std::vector({pi}); // Remove column pi from F12 + F21 /= std::vector({gamma}); // Remove row gamma from F21 + + // Remove the corresponding row and column from _F_row + _F_row[q].delRow(gamma); // Remove row gamma from _F_row[q] + _F_row[q].delColumn(pi); // Remove column pi from _F_row[q] + + //--------------------------------------------- Submatrices of G ------------------------------------------------------ + + // Extract the relevant column chain from _G_col + // G11_q is the column chain from _G_col[q] at index gamma + // CChain G11_q(OSM::getColumn(_G_col[q], gamma)); + _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] + + //---------------------------------------------- Submatrices of H ----------------------------------------------------- + + // Extract the relevant column chain from _H_col + CChain H11(OSM::getColumn(_H_col[q], pi)); // H11 is the column chain from _H_col[q] at index pi + + // Remove the column pi from _H_col + _H_col[q].delColumn(pi); + + //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ + + // For DD_q+1 and DD_q: + // Extract the relevant row chains from _DD_col + + // DD_q+1 (corresponds to the row matrix of _DD_col) + RChain D11(OSM::getRow(_DD_col[q+1], gamma)); // D11 is the row chain from _DD_col[q+1] at index gamma + _DD_col[q + 1].delRow(gamma); // Remove row gamma from _DD_col[q + 1] + + //--------------------------------------------- Submatrices of DD ------------------------------------------------------ + + // DD_q (corresponds to the column matrix of _DD_col) + // CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); + // D11_q is the column chain from _DD_col[q] at index gamma + if (q > 0) + _DD_col[q].delColumn(gamma); // Remove column gamma from _DD_col[q] + + //--------------------------------------------- Update matrices ------------------------------------------------------- + + // Update _H_col + // Subtract the product of (H11 * F11_inv) and F12 from _H_col[q] + // Note: * operator is used for matrix column results + _H_col[q] -= (H11 * F11_inv) * F12; + + // Set the column gamma of _H_col[q] to (-1 * H11) * F11_inv + OSM::setColumn(_H_col[q], gamma, (-1 * H11) * (F11_inv)); + + // Update _F_row + // Add the product of (F21 * F11_inv) and F12 to _F_row[q] + _F_row[q] -= (F21 * F11_inv) * F12; + + // Set the row pi of _F_row[q] to F11_inv * F12 + OSM::setRow(_F_row[q], pi, F11_inv * F12); + + // Set the column gamma of _F_row[q] to F21 * (-F11_inv) + OSM::setColumn(_F_row[q], gamma, F21 * (-F11_inv)); + + // Set the coefficient at (pi, gamma) in _F_row[q] to F11_inv + _F_row[q].set_coef(pi, gamma, F11_inv); + + // Update _G_col + // Add the product of (H11 * F11_inv) and D11 to _G_col[q+1] + _G_col[q + 1] += (H11 * F11_inv) * D11; + + // Update _DD_col[q + 1] + _DD_col[q + 1] -= (F21 * F11_inv) * D11; // Subtract the product from _DD_col[q + 1] + OSM::setRow(_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in _DD_col[q + 1] + + // Update _G_col (for dimension q) and _DD_col (for dimension q) + if (q>0) + { + // Extract boundary chain and project it + CChain c = _K.d(pi, q); // Boundary of pi in dimension q + CChain projection_p(projection(c, PRIMARY, q-1)); // Project boundary chain to PRIMARY + CChain projection_c = projection(c, CRITICAL, q-1); // Project boundary chain to CRITICAL + + // Set the column pi of _G_col[q] to (-1 * _H_col[q-1]) * projection_p + OSM::setColumn(_G_col[q], pi, (CoefficientType(-1) * _H_col[q - 1]) * projection_p); + + // Update _DD_col + // Extract projections and perform updates + CChain tmp(_F_row[q - 1] * projection_p + projection_c); // Compute the product of _F_row[q - 1] and projection_p + // Set the column pi of _DD_col[q] to cc + OSM::setColumn(_DD_col[q], pi, tmp); + } + // else: if the dimension is 0, no change for _G_col[q] and _DD_col[q] + + // Update flags + _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to PRIMARY + _flag[q][gamma] = PRIMARY; // Set the flag of gamma in dimension q to CRITICAL + } + else + std::cout << "!!! M impossible with partial reduction options" << std::endl; +} + +// Method to perform operation W +// gamma is in dimension q, sigma is in dimension q + +template typename _ChainType, template typename _SparseMatrixType> +void HDVF::W(int sigma, int gamma, int q) { + + //----------------------------------------------- Submatrices of G ---------------------------------------------------- + + if (_hdvf_opt & OPT_FULL) + { + // Output the operation details to the console + std::cout << "W_" << q << "(" << sigma << "," << gamma << ")" << std::endl; + + if (q == 0) + throw("W operation in dimension 0 !!!") ; + + // Extract row and column chains from _G_col + RChain G12(OSM::getRow(_G_col[q], sigma)); // G12 is the row chain from _G_col[q] at index sigma + CChain G21(OSM::getColumn(_G_col[q], gamma)); // G21 is the column chain from _G_col[q] at index gamma + + // Get the coefficient at the intersection of G12 and G21 + CoefficientType G11(G12[gamma]); // G11 is the coefficient at row sigma and column gamma + + // Assert that G11 is either 1 or -1 (for invertibility) + assert((G11 == 1) || (G11 == -1)); // !!!!! Test invertibility + CoefficientType G11_inv = G11; // Inverse of G11 (which is itself for 1 or -1) + + // Remove the contributions of gamma from G12 and sigma from G21 + G12 /= std::vector({gamma}); // Remove column gamma from G12 + G21 /= std::vector({sigma}); // Remove row sigma from G21 + + // Remove the corresponding row and column from _G_col + _G_col[q].delRow(sigma); // Remove row sigma from _G_col[q] + _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] + + //---------------------------------------------- Submatrices of F ----------------------------------------------------- + + // Extract the row chain from _F_row +// RChain F11(OSM::getRow(_F_row[q], gamma)); // F11 is the row chain from _F_row[q] at index gamma + + // Remove the row gamma from _F_row + _F_row[q].delRow(gamma); + + //--------------------------------------------- Submatrices of H ------------------------------------------------------ + + // Extract the row chain from _H_col + RChain H11(OSM::getRow(_H_col[q-1], sigma)); // H11 is the row chain from _H_col[q] at index sigma + + // Remove the row sigma from _H_col + _H_col[q-1].delRow(sigma); + + //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ + + // Extract the row chain from _DD_col[q+1] + // RChain D11_q_plus1(OSM::getRow(_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from _DD_col[q + 1] at index gamma + + // Remove the row gamma from _DD_col + if (q < _K.dim()) + _DD_col[q + 1].delRow(gamma); + + //--------------------------------------------- Submatrices of DD_q ------------------------------------------------------ + + // Extract the column chain from _DD_col[q] + CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); // D11_q is the column chain from _DD_col[q] at index gamma + + // Remove the column gamma from _DD_col + _DD_col[q].delColumn(gamma); + + //--------------------------------------------- Update matrices ------------------------------------------------------- + + // Update _H_col + // Subtract the product of (G21 * G11_inv) and H11 from _H_col[q] + // Note: % operator is used for matrix row results + _H_col[q-1] -= (G21 * G11_inv) * H11; + + // Set the row gamma of _H_col[q] to (-1 * H11) * G11_inv + OSM::setRow(_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); + + // Update _G_col + // Subtract the product of G11_inv and (G21 * G12) from _G_col[q] + _G_col[q] -= (G21 * G11_inv) * G12; + + // Set the row gamma of _G_col[q] to G11_inv * G12 + OSM::setRow(_G_col[q], gamma, -G11_inv * G12); + + // Set the column sigma of _G_col[q] to G11_inv * G21 + OSM::setColumn(_G_col[q], sigma, G21 * G11_inv); + + // Set the coefficient at (gamma, sigma) in _G_col[q] to G11_inv + _G_col[q].set_coef(gamma, sigma, G11_inv); + + // Update _F_row (for dimension q-1) + // Add the product of (D11_q * G11_inv) and H11 to _F_row[q - 1] + _F_row[q - 1] += (D11_q * G11_inv) * H11; + + // Update _DD_col (for dimension q) + _DD_col[q] -= (D11_q * G11_inv) * G12;// Subtract the product of (D11_q * G11_inv) and G12 + OSM::setColumn(_DD_col[q], sigma, D11_q * G11_inv) ; + + // Update _F_row (for dimension q) and _DD_col (for dimension q+1) + if (q < _K.dim()) + { + // Extract boundary chain and project it + RChain c = _K.cod(sigma, q); // Boundary of sigma in dimension q + RChain projection_s(projection(c, SECONDARY, q+1)); // Project boundary chain to SECONDARY + RChain projection_c(projection(c, CRITICAL, q+1)); // Project boundary chain to SECONDARY + + // Set the row sigma of _F_row[q] to (-1 * projection_s * _H_col[q]) + OSM::setRow(_F_row[q], sigma, (-1 * projection_s) * _H_col[q]); + + // Set the row sigma of _DD_col[q + 1] to projection_s * _G_col[q + 1] + projection_c + + RChain tmp(projection_s * _G_col[q + 1] + projection_c) ; + OSM::setRow(_DD_col[q + 1], sigma, tmp); + } + // else : if the dimension is maximal, no update of _DD_col[q+1] and _F_row[q] + + // Update flags + _flag[q][gamma] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY + _flag[q][sigma] = CRITICAL; // Set the flag of sigma in dimension q to CRITICAL + } + else + std::cout << "!!! W impossible with partial reduction options" << std::endl; +} + +// Method to perform operation MW +// gamma is in dimension q, sigma is in dimension q + +template typename _ChainType, template typename _SparseMatrixType> +void HDVF::MW(int pi, int sigma, int q) { + + //----------------------------------------------- Submatrices of G ---------------------------------------------------- + + if (_hdvf_opt & OPT_FULL) + { + // Output the operation details to the console + std::cout << "MW_" << q << "(" << pi << "," << sigma << ")" << std::endl; + + if (q <= 0) + throw("MW operation in dimension 0 !!!") ; + if (q >= _K.dim()) + throw("MW operation in maximal dimension !!!") ; + + // In order to compute xi and xi', extract sub-matrices of H_q, H_q-1 and compute d(pi) and cod(sigma) + + // H_q extractions + + CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + // H21 -> delete H11 + _H_col.at(q) /= std::vector({pi}) ; + + // H_q-1 extractions + + RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + // H21_q-1 -> delete H11q1 + _H_col.at(q-1).delRow(sigma) ; + + // d(pi) + + CChain d_pi = _K.d(pi, q) ; + CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + CChain projC_d_pi = projection(d_pi, CRITICAL, q-1) ; + + // cod(sigma) + + RChain cod_sigma = _K.cod(sigma, q) ; + RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + RChain projC_cod_sigma = projection(cod_sigma, CRITICAL, q+1) ; + + // Compute xi and xi' to test the validity of MW + + CoefficientType xi = projS_cod_sigma * H11 ; + CoefficientType xip = H11q1 * projP_d_pi ; + + if (abs(xi) != 1) + throw "MW impossible, xi non invertible" ; + if (abs(xip) != 1) + throw "MW impossible, xi' non invertible" ; + + // F_q extraction + + CChain F11(OSM::getColumn(_F_row.at(q), pi)) ; + // F12 -> delete col F11 + _F_row.at(q).delColumn(pi) ; + + // G_q extractions + + RChain G11(OSM::getRow(_G_col.at(q), sigma)) ; + // G21 -> dele row G11 + _G_col.at(q).delRow(sigma) ; + + // ----------- Update of the reduction + + // H_q + + RChain tmp1 = projS_cod_sigma * _H_col.at(q) ; + + _H_col.at(q) -= (H11 * xi) * tmp1 ; + OSM::setColumn(_H_col.at(q), sigma, H11 * xi) ; + + // F_q + + _F_row.at(q) += (F11 * xi) * tmp1 ; + OSM::setColumn(_F_row.at(q), sigma, F11 * (-xi)) ; + + // G_q+1 // note: G_q+1 is not be modified if the HDVF is perfect + + RChain tmp2(projS_cod_sigma * _G_col.at(q+1)) ; + tmp2 += projC_cod_sigma ; + _G_col.at(q+1) -= (H11 * xi) * tmp2 ; + + // DD_col_q+1 / DD_row_q + + _DD_col.at(q+1) -= (F11 * xi) * tmp2 ; + + // H_q-1 + + CChain tmp3(_H_col.at(q-1) * projP_d_pi) ; + + _H_col.at(q-1) -= (tmp3 * xip) * H11q1 ; + OSM::setRow(_H_col.at(q-1), pi, xip * H11q1) ; + + // G_q + + _G_col.at(q) -= (tmp3 * xip) * G11 ; + OSM::setRow(_G_col.at(q), pi, xip * G11) ; + + // F_q-1 // note: F_q-1 is not be modified if the HDVF is perfect + + CChain tmp4(_F_row.at(q-1) * projP_d_pi) ; + tmp4 += projC_d_pi ; + _F_row.at(q-1) -= (tmp4 * xip) * H11q1 ; + + // DD_col_q + + _DD_col.at(q) += (tmp4 * xip) * G11 ; + + // Update flags + _flag[q][pi] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY + _flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to CRITICAL + } + else + std::cout << "!!! MW impossible with partial reduction options" << std::endl; +} + + +// Method to compute a perfect HDVF (Higher Dimensional Vector Field) +// Returns a vector of PairCell objects representing the pairs found + +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::computePerfectHDVF(bool verbose) { + std::vector pair_list; // Vector to store the list of pairs + bool trouve = false; // Flag to indicate whether a pair was found + int dim = _K.dim(); // Get the dimension of the complex K + + // Loop through dimensions from q-1 to 0 + for (int q = dim - 1; q >= 0; --q) { + std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; +// cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; + // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) + + // Find a pair of cells in dimension q + PairCell pair = findPairA(q, trouve); + + // While a pair is found + while (trouve) { + progress_bar(_K.nb_cells(q)-_nb_C.at(q), _K.nb_cells(q)) ; + // Add the found pair to the list + pair_list.push_back(pair); + + // Perform operation A with the found pair + A(pair.sigma, pair.tau, q); + if (verbose) + { + std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; + print_matrices(std::cout) ; + } + + // Find another pair of cells in dimension q + pair = findPairA(q, trouve); + } + } + + // Return the list of pairs found + return pair_list; +} + +// Method to compute a random perfect HDVF (Higher Dimensional Vector Field) +// Returns a vector of PairCell objects representing the pairs found + +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::computeRandPerfectHDVF(bool verbose) { + std::vector pair_list; // Vector to store the list of pairs + bool trouve = false; // Flag to indicate whether a pair was found + int dim = _K.dim(); // Get the dimension of the complex K + + // Init random generator + std::random_device dev; + std::mt19937 rng(dev()); // Random + + // Loop through dimensions from q-1 to 0 + for (int q = dim - 1; q >= 0; --q) { + std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; + // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) + + std::vector pairs = findPairsA(q, trouve); + + PairCell pair ; + + // While a pair is found + while (trouve) + { + // Add one of the pairs (randomly) to the list + { + // Pickup a random cell sigma + std::uniform_int_distribution rand_dist(0,pairs.size()-1); + int i(rand_dist(rng)) ; + pair = pairs.at(i) ; + } + pair_list.push_back(pair); + + // Perform operation A with the chosen pair + A(pair.sigma, pair.tau, pair.dim); + if (verbose) + { + std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; + print_matrices(std::cout) ; + } + + // Compute possible pairings + pairs = findPairsA(q, trouve); + } + } + // Return the list of pairs found + return pair_list; + } + +// Method to get cells if with a given flag (P,S,C) for each dimension +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector > HDVF::get_flag (FlagType flag) const +{ + std::vector > res(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + { + for (int i=0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == flag) + res.at(q).push_back(i) ; + } + } + return res ; +} + +// Method to get cells with a given flag (P,S,C) for a given dimension +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF::get_flag_dim (FlagType flag, int q) const +{ + std::vector res ; + for (int i=0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == flag) + res.push_back(i) ; + } + return res ; +} + +// Method to print the current state of the reduction +//template +template typename _ChainType, template typename _SparseMatrixType> +std::ostream& HDVF::print_reduction(std::ostream& out) // const +{ + // Print PSC + out << "----- flags of cells:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < _K.nb_cells(q); ++i) + { + const int flag(_flag.at(q).at(i)) ; + if (flag == PRIMARY) + out << i << " -> P" << std::endl ; + else if (flag == SECONDARY) + out << i << " -> S" << std::endl ; + else + out << i << " -> C" << std::endl ; + } + out << std::endl; + } + + // Print critical cells + out << "----- critical cells:" << std::endl; + std::vector > critical(get_flag(CRITICAL)) ; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + out << critical.at(q).at(i) << " "; + } + out << std::endl; + } + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Print matrices g + out << "----- g:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + const int id(critical.at(q).at(i)) ; + out << "g(" << id << ") = (" << id << ")"; + // Iterate over the ith column of _G_col + CChain col(OSM::getColumn(_G_col.at(q), id)) ; // TODO cget + for (typename CChain::const_iterator it_col = col.cbegin(); it_col != col.cend(); ++it_col) { + out << " + " << it_col->second << ".(" << it_col->first << ") + "; + } + out << std::endl; + } + } + } + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Print matrices f* + out << "----- f*:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + const int id(critical.at(q).at(i)) ; + out << "f*(" << id << ") = (" << id << ")"; + // Iterate over the ith row of _F_row + RChain row(OSM::getRow(_F_row.at(q), id)) ; // TODO cget + for (typename RChain::const_iterator it_row = row.cbegin(); it_row != row.cend(); ++it_row) { + out << " + " << it_row->second << ".(" << it_row->first << ") + "; + } + out << std::endl; + } + } + } + return out ; +} + +// Method to print A-pairs +//template +template typename _ChainType, template typename _SparseMatrixType> +std::ostream& HDVF::print_pairs(const std::vector& pairs, std::ostream& out) // const +{ + for (const auto& pair : pairs) { + out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; + } + return out ; +} + +#endif // HDVF_H diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp new file mode 100644 index 000000000000..21449609390d --- /dev/null +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -0,0 +1,664 @@ +// +// hdvf_duality.hpp +// HDVF +// +// Created by umenohana on 27/08/2024. +// + +#ifndef HDVF_DUALITY_H +#define HDVF_DUALITY_H + +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" +#include "CGAL/HDVF/Simplex.hpp" +#include "CGAL/HDVF/Cubical_complex.hpp" +#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/HDVF/sub_chain_complex.hpp" +#include "CGAL/HDVF/SubSparseMatrix.hpp" + + +/** + * \class Dual_HDVF + * \brief Implementation of HDVF duality and associate operations. + * + * The Dual_HDVF class contains all functions to build HDVF for Alexander duality. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ComplexType The type of complex (default is SimpComplex) + * + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + */ + +template +class Dual_HDVF : public HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> { +private: + // Matrices types + typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; + typedef OSM::Chain<_CoefficientType, OSM::ROW> RChain; + + // HDVF Type + typedef HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; + + // Complex L + const _ComplexType& _L ; + const int _hdvf_opt ; + // Subcomplex K + SubChainComplex<_CoefficientType,_ComplexType> _KCC, _subCC ; +public: + // Critical cells of perfect HDVFs + std::vector > critical_K, critical_L_K ; + + /** + * \brief Build Dual_HDVF from a complex and a sub chain complex + * + * \warning The Dual_HDVF will check that the sub chain complex is compatible. TODO !!! + * + * \param[in] L The (full) complex. + * \param[in] K The sub chain complex. + * + * \see \link OSM::Dual_HDVF \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 28/08/2024 + */ + Dual_HDVF(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt = OPT_FULL) ; + + /** \brief find a valid PairCell for A in dimension q */ + virtual PairCell findPairA(int q, bool &found); // const; + /** \brief find a valid PairCell containing tau for A in dimension q */ + virtual PairCell findPairA(int q, bool &found, int tau); // const; + /** \brief find all the valid PairCell for A in dimension q */ + virtual std::vector findPairsA(int q, bool &found); // const; + /** \brief find all the valid PairCell containing tau for A in dimension q */ + virtual std::vector findPairsA(int q, bool &found, int tau); // const; + + /** \brief Set _DD_col to _subCC */ + inline void screen_DD_col () + { + for (int q=0; q<=_L.dim(); ++q) + { + this->_DD_col.at(q).set_sub(_subCC.get_BitBoard(q)) ; + } + } + + /** \brief Set _subCC to complex K and screen _DD_col accordingly */ + inline void set_mask_K () + { + _subCC = _KCC ; + screen_DD_col() ; + } + + /** \brief Set _subCC to cocomplex L-K and screen _DD_col accordingly */ + inline void set_mask_L_K () + { + _subCC = _KCC.complement() ; + screen_DD_col() ; + } + + /** + * \brief Compute "perfect" HDVF (if they exist) over both sub complexes + pairing matrix + * + * \see \link OSM::Dual_HDVF \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 28/08/2024 + */ + void computeDualPerfectHDVF() ; + + /** + * \brief Compute "pairing" HDVF between K and L-K + * + * \see \link OSM::Dual_HDVF \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 28/08/2024 + */ + std::vector computePairingHDVF() ; + + // Dual_HDVF getters + // Method to get cells if with a given flag (P,S,C) for each dimension + vector > get_flag (FlagType flag) const ; + // Method to get cells with a given flag (P,S,C) for a given dimension + vector get_flag_dim (FlagType flag, int q) const ; + // Method to get the flag (P,S,C) of a cell tau of dimension q + + // Dual_HDVF I/O + + virtual ostream& print_reduction(ostream& out = cout) + { + // Print K + out << "----> K" << endl ; + _subCC = _KCC ; + screen_DD_col() ; + print_reduction_sub(out) ; + + // Print L-K + _subCC = _KCC.complement() ; + screen_DD_col() ; + print_reduction_sub(out) ; + + // Set back _subCC to K + _subCC = _KCC ; + + return out ; + } + + virtual ostream& print_reduction_sub(ostream& out = cout) // const; + { + // Print critical cells + out << "----- critical cells:" << endl; + for (int q = 0; q <= _L.dim(); ++q) { + out << "--- dim " << q << endl; + for (int i = 0; i < _L.nb_cells(q); ++i) + { + if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { + out << i << " "; + } + } + out << endl; + } + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Print matrices g + out << "----- g:" << endl; + for (int q = 0; q <= _L.dim(); ++q) { + out << "--- dim " << q << endl; + for (int i = 0; i < _L.nb_cells(q); ++i) { + if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { + out << "g(" << i << ") = (" << i << ")"; + // Iterate over the ith column of _G_col + typename HDVF_type::CChain col(OSM::getColumn(this->_G_col.at(q), i)) ; // TODO cget + for (typename HDVF_type::CChain::const_iterator it_col = col.cbegin(); it_col != col.cend(); ++it_col) { + out << " + " << it_col->second << ".(" << it_col->first << ") + "; + } + out << endl; + } + } + } + } + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Print matrices f* + out << "----- f*:" << endl; + for (int q = 0; q <= _L.dim(); ++q) { + out << "--- dim " << q << endl; + for (int i = 0; i < _L.nb_cells(q); ++i) { + if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { + out << "f*(" << i << ") = (" << i << ")"; + // Iterate over the ith row of _F_row + typename HDVF_type::RChain row(OSM::getRow(this->_F_row.at(q), i)) ; // TODO cget + for (typename HDVF_type::RChain::const_iterator it_row = row.cbegin(); it_row != row.cend(); ++it_row) { + out << " + " << it_row->second << ".(" << it_row->first << ") + "; + } + out << endl; + } + } + } + } + return out ; + } + + // Method to print reduced boundary over the pairing + + ostream& print_bnd_pairing(ostream& out = cout) + { + SubChainComplex<_CoefficientType, _ComplexType> subPair(_L, false) ; + for (int q=0; q<=_L.dim(); ++q) + { + for (int i=0; i dim " << q << " : q / q-1 cells" << endl ; + out << "id " << q << " : " ; + for (typename OSM::Bitboard::iterator it = subPair.get_BitBoard(q).begin(); it != subPair.get_BitBoard(q).end(); ++it) + out << *it << " " ; + out << endl ; + out << "id " << q-1 << " : " ; + for (typename OSM::Bitboard::iterator it = subPair.get_BitBoard(q-1).begin(); it != subPair.get_BitBoard(q-1).end(); ++it) + out << *it << " " ; + out << endl ; + for (typename OSM::Bitboard::iterator it = subPair.get_BitBoard(q).begin(); it != subPair.get_BitBoard(q).end(); ++it) + { + for (typename OSM::Bitboard::iterator it2 = subPair.get_BitBoard(q-1).begin(); it2 != subPair.get_BitBoard(q-1).end(); ++it2) + { + if (this->_DD_col.at(q).get_coef(*it2, *it) == 0) + out << ".\t" ; + else + out << this->_DD_col.at(q).get_coef(*it2, *it) << "\t" ; + } + out << endl ; + } + } + return out ; + } + + // Method to generate labels for visualisation + // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned + vector > export_label (ExportType type, int cell=0, int dim=0) const + { + vector > labels(this->_K.dim()+1) ; + if (type == PSC) + { + for (int q=0; q<=this->_K.dim(); ++q) + { + for (int i = 0; i_K.nb_cells(q); ++i) + { + if (_subCC.get_Bit(q, i)) // i belongs to _subCC + { + if (this->_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (this->_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else + labels.at(q).push_back(0) ; + } + else // i does not belongs to _subCC + labels.at(q).push_back(2) ; + } + } + } + else + { + if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) + { + for (int q=0; q<=this->_K.dim(); ++q) + { + labels.at(q).resize(this->_K.nb_cells(q)) ; + } + + if (dim < this->_K.dim()) + { + labels.at(dim).at(cell) = 1 ; + const typename HDVF_type::RChain& fstar_cell = OSM::cgetRow(this->_F_row.at(dim), cell) ; + for (typename HDVF_type::RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + { + // Keep cells of the chain belonging to _subCC + if (_subCC.get_Bit(dim, it->first)) + { + // Set the cofaces belonging to _subCC of it->first in dimension dim+1 + typename HDVF_type::RChain cofaces(this->_K.cod(it->first,dim)) ; + for (typename HDVF_type::RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + { + if (_subCC.get_Bit(dim+1, it2->first)) + labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells + } + } + } + } + else + throw "Error: cannot export f* for a cell of maximal dimension" ; + } + else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G + { + // cout << "Export : _subCC : " << _subCC << endl ; + for (int q=0; q<=this->_K.dim(); ++q) + { + labels.at(q).resize(this->_K.nb_cells(q)) ; + } + + labels.at(dim).at(cell) = 1 ; + const typename HDVF_type::CChain& g_cell = OSM::cgetColumn(this->_G_col.at(dim), cell) ; + for (typename HDVF_type::CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) + { + // Keep cells of the chain belonging to _subCC + if (_subCC.get_Bit(dim, it->first)) + { + // cout << "g(" << cell << ", " << dim << ") : " << it->first << endl ; + labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for G(cell) cells + } + + } + + } + } + return labels ; + } + + + // Method to generate PSC labels for visualisation + virtual vector > export_labelsPSC () const + { + vector > labels(this->_K.dim()+1) ; + for (int q=0; q<=this->_K.dim(); ++q) + { + for (int i = 0; i_K.nb_cells(q); ++i) + { + if (_subCC.get_Bit(q, i)) // i belongs to _subCC + { + if (this->_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (this->_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else + labels.at(q).push_back(0) ; + } + else // i does not belongs to _subCC + labels.at(q).push_back(2) ; + } + } + return labels ; + } + + // Method to export a G chain for visualisation + // with cell indices in initial _K + virtual CChain export_GChain (int cell, int dim) const + { + if ((dim<0) || (dim>this->_K.dim())) + throw "Error : export_GChain with dim out of range" ; + // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) + // throw "Error : export_GChain with 'future' cell wrt persistence" ; + + if (this->_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Get g(cell, dim) with per indices + CChain g_cell(OSM::getColumn(this->_G_col.at(dim), cell)) ; + // Add 1 to the cell + g_cell[cell] = 1 ; + // Keep cells of the chain belonging to _subCC + CChain g_cell_sub(g_cell.dimension()) ; + for (typename CChain::const_iterator it = g_cell.begin(); it != g_cell.end(); ++it) + { + + if (_subCC.get_Bit(dim, it->first)) + { + g_cell_sub[it->first] = it->second ; + } + } + return g_cell_sub ; + } + else + throw "Error : trying to export g_chain without proper HDVF option" ; + } + + // Method to export a FSTAR chain for visualisation + // with cell indices in initial _K + virtual CChain export_FSTARChain (int cell, int dim) const + { + if ((dim<0) || (dim>this->_K.dim())) + throw "Error : export_FSTARChain with dim out of range" ; + // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) + // throw "Error : export_GChain with 'future' cell wrt persistence" ; + + if (this->_hdvf_opt & (OPT_FULL | OPT_F)) + { + RChain fstar_cell(OSM::getRow(this->_F_row.at(dim), cell)) ; + // Add 1 to the cell + fstar_cell[cell] = 1 ; + // Compute the cofaces + if (dim < this->_K.dim()) + { + CChain fstar_cofaces(this->_K.nb_cells(dim+1)) ; + for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + { + // Set the cofaces of it->first belonging to _subCC in dimension dim+1 + RChain cofaces(this->_K.cod(it->first,dim)) ; + for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + { + if (_subCC.get_Bit(dim+1, it2->first)) + fstar_cofaces[it2->first] = 1 ; + } + } + return fstar_cofaces ; + } + else + return CChain(0) ; + } + } + +// // Get fstar(cell, dim) with per indices +// RChain fstar_cell(OSM::cgetRow(this->_F_row.at(dim), cell)) ; +// // Add 1 to the cell +// fstar_cell[cell] = 1 ; +// // Keep cells of the chain belonging to _subCC +// // Compute the chain (transpose of F_STAR column) +// CChain fstar_cell_sub(fstar_cell.dimension()) ; +// for (typename RChain::const_iterator it = fstar_cell.begin(); it != fstar_cell.end(); ++it) +// { +// // Keep cells of the chain belonging to _subCC +// if (_subCC.get_Bit(dim, it->first)) +// { +// fstar_cell_sub[it->first] = it->second ; +// } +// } +// return fstar_cell_sub ; +// } +// else +// throw "Error : trying to export g_chain without proper HDVF option" ; + +} ; + +template +Dual_HDVF<_CoefficientType,_ComplexType>::Dual_HDVF(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt) : +HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} + +/** \brief find a valid PairCell for A in dimension q */ +template +PairCell Dual_HDVF<_CoefficientType,_ComplexType>::findPairA(int q, bool &found) // const +{ + found = false; + PairCell p; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); (it_col != this->_DD_col[q+1].end() && !found); ++it_col) + { + const typename HDVF_type::CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + // Check that the row belongs to the subchaincomplex + for (typename HDVF_type::CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { + if (_subCC.get_Bit(q, it->first) && (abs(it->second) == 1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + found = true; + } + } + } + return p; +} + +/** \brief find a valid PairCell containing tau for A in dimension q */ +template +PairCell Dual_HDVF<_CoefficientType,_ComplexType>::findPairA(int q, bool &found, int tau) // const +{ + found = false; + PairCell p ; + // Check tau belongs to _subCC + if (!_subCC.get_Bit(q, tau)) + throw("Dual_HDVF: searching for a cell tau outside _subCC") ; + + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + // and tau' belongs to _subCC + const typename HDVF_type::CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), tau)) ; + for (typename HDVF_type::CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) + { + if (_subCC.get_Bit(q-1, it->first) && abs(it->second) == 1) + { + found = true ; + p.sigma = it->first ; + p.tau = tau ; + p.dim = q-1 ; + } + } + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + // and tau' belongs to _subCC + typename HDVF_type::RChain tmp(OSM::getRow(this->_DD_col.at(q+1), tau)) ; + for (typename HDVF_type::RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) + { + if (_subCC.get_Bit(q+1, it->first) && (abs(it->second) == 1)) + { + found = true ; + PairCell p ; + p.sigma = tau ; + p.tau = it->first ; + p.dim = q ; + } + } + return p; +} + +/** \brief find all the valid PairCell for A in dimension q */ +template +std::vector Dual_HDVF<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found) // const +{ + vector pairs; + found = false ; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) + { + const typename HDVF_type::CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + for (typename HDVF_type::CChain::const_iterator it = col.begin(); it != col.end(); ++it) { + if (_subCC.get_Bit(q, it->first) && ((it->second == 1) || (it->second == -1))) { + // If an entry of _subCC with coefficient 1 or -1 is found, set the pair and mark as found + PairCell p; + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + pairs.push_back(p) ; + found = true; + } + } + } + return pairs; +} + +/** \brief find all the valid PairCell containing tau for A in dimension q */ +template +std::vector Dual_HDVF<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found, int tau) // const +{ + found = false; + std::vector pairs; + // Check if tau belongs to _subCC + if (!_subCC.get_Bit(q, tau)) + throw("Dual_HDVF: searching for a cell tau outside _subCC") ; + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + // and tau' belongs to _subCC + typename HDVF_type::RChain tmp(OSM::getRow(this->_DD_col.at(q+1), tau)) ; + for (typename HDVF_type::RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + if (_subCC.get_Bit(q+1, it->first) && (abs(it->second) == 1)) + { + found = true ; + PairCell p ; + p.sigma = tau ; + p.tau = it->first ; + p.dim = q ; + pairs.push_back(p) ; + } + } + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + // and tau' belongs to _subCC + const typename HDVF_type::CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), tau)) ; + for (typename HDVF_type::CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) + { + if (_subCC.get_Bit(q-1, it->first) && (abs(it->second) == 1)) + { + found = true ; + PairCell p ; + p.sigma = it->first ; + p.tau = tau ; + p.dim = q-1 ; + pairs.push_back(p) ; + } + } + return pairs; +} + +template +void Dual_HDVF<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() +{ + std::cout << "==== Compute perfect HDVF over K" << endl ; + // Set _subCC to K + _subCC = _KCC ; + // Restrict _DD_col accordingly + screen_DD_col() ; + // Compute perfect HDVF over K + this->computePerfectHDVF() ; + critical_K = this->get_flag(CRITICAL) ; +// this->print_matrices() ; +// this->print_reduction() ; + + std::cout << "==== Compute perfect HDVF over L-K" << endl ; + // set _subCC to L-K + _subCC = _KCC.complement() ; + // Restrict _DD_col accordingly + screen_DD_col() ; + // Compute perfect HDVF over L-K + this->computePerfectHDVF() ; + critical_L_K = this->get_flag(CRITICAL) ; +// this->print_matrices() ; +// this->print_reduction() ; + +// std::cout << "==== Pairing matrix" << endl ; +// +// print_bnd_pairing() ; +} + +template +std::vector Dual_HDVF<_CoefficientType,_ComplexType>::computePairingHDVF() +{ + // TODO : check both HDVFs are perfect + + std::cout << "==== Compute pairing" << endl ; + + // Create a full SubChainComplex + _subCC = SubChainComplex<_CoefficientType, _ComplexType>(_L) ; + screen_DD_col() ; + // Copy the HDVF before computing the pairing -> otherwise we loose it... + std::vector pairing = this->computePerfectHDVF() ; + return pairing ; +} + + +// Method to get cells if with a given flag (P,S,C) for each dimension +template +vector > Dual_HDVF::get_flag (FlagType flag) const +{ + vector > res(_L.dim()+1) ; + for (int q=0; q<=_L.dim(); ++q) + { + for (int i=0; i<_L.nb_cells(q); ++i) + { + if (_subCC.get_Bit(q, i) && (this->_flag.at(q).at(i) == flag)) + res.at(q).push_back(i) ; + } + } + return res ; +} + +// Method to get cells with a given flag (P,S,C) for a given dimension +template +vector Dual_HDVF::get_flag_dim (FlagType flag, int q) const +{ + vector res ; + for (int i=0; i_K.nb_cells(q); ++i) + { + if (_subCC.get_Bit(q, i) && (this->_flag.at(q).at(i) == flag)) + res.push_back(i) ; + } + return res ; +} + +#endif /* HDVF_DUALITY_H */ diff --git a/HDVF/include/CGAL/HDVF/hdvf_tools.hpp b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp new file mode 100644 index 000000000000..93b90cd1dbdc --- /dev/null +++ b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp @@ -0,0 +1,114 @@ +#ifndef HDVF_TOOLS_HPP +#define HDVF_TOOLS_HPP + +#include + +//#include "hdvf_common.hpp" +//#include "Simplex.hpp" +#include "tools_io.hpp" +//#include "AbstractSimpComplex.hpp" +//#include "CubComplex.hpp" +#include "hdvf.hpp" +#include "CGAL/OSM/OSM.hpp" + + +// IO tools + +inline ostream & operator<< (ostream &out, const PairCell &p) +{ + out << "(" << p.sigma << "/" << p.tau << " - dim " << p.dim << ")" ; + return out ; +} + + +template +void interaction_loop(HDVF &hdvf, + ComplexType &complex, + const std::function &hdvf, ComplexType &complex)> &output_vtk) +{ + bool over = false ; + output_vtk(hdvf, complex) ; + while (!over) + { + string instr ; + int ipair ; + cout << "Next instruction : M, W, MW or Q (to quit)" << endl ; + cin >> instr ; + if (instr == string("M")) + { + int sigma, q ; + cout << "Provide sigma / q (separate with space):" << endl ; + cin >> sigma >> q ; + bool found = false ; + vector possM(hdvf.findPairsM(q, found, sigma)) ; + cout << "-> possible pairings for M:" << endl ; + for (int i = 0; i 0) + { + cout << "chose indice of pairing (out the range = quit): " ; + cin >> ipair ; + if ((ipair >= 0) && (ipair < possM.size())) + { + PairCell p(possM.at(ipair)) ; + cout << "M(" << p << ")" << endl ; + hdvf.M(p.sigma, p.tau, p.dim) ; +// hdvf.print_matrices() ; + output_vtk(hdvf, complex) ; + } + } + } + else if (instr == string("W")) + { + int sigma, q ; + cout << "Provide sigma / q (separate with space):" << endl ; + cin >> sigma >> q ; + bool found = false ; + vector possW(hdvf.findPairsW(q, found, sigma)) ; + cout << "-> possible pairings for W:" << endl ; + for (int i = 0; i 0) + { + cout << "chose indice of pairing (out the range = quit): " ; + cin >> ipair ; + if ((ipair >= 0) && (ipair < possW.size())) + { + PairCell p(possW.at(ipair)) ; + cout << "W(" << p << ")" << endl ; + hdvf.W(p.sigma, p.tau, p.dim) ; +// hdvf.print_matrices() ; + output_vtk(hdvf, complex) ; + } + } + } + else if (instr == string("MW")) + { + int sigma, q ; + cout << "Provide sigma / q (separate with space):" << endl ; + cin >> sigma >> q ; + bool found = false ; + vector possMW(hdvf.findPairsMW(q, found, sigma)) ; + cout << "-> possible pairings for MW:" << endl ; + for (int i = 0; i 0) + { + cout << "chose indice of pairing (out the range = quit): " ; + cin >> ipair ; + if ((ipair >= 0) && (ipair < possMW.size())) + { + PairCell p(possMW.at(ipair)) ; + cout << "MW(" << p << ")" << endl ; + hdvf.MW(p.sigma, p.tau, p.dim) ; +// hdvf.print_matrices() ; + output_vtk(hdvf, complex) ; + } + } + } + else if (instr == string("Q")) + over = true ; + } +} + +#endif // HDVF_TOOLS_HPP diff --git a/HDVF/include/CGAL/HDVF/per_hdvf.hpp b/HDVF/include/CGAL/HDVF/per_hdvf.hpp new file mode 100644 index 000000000000..9e18a4035795 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/per_hdvf.hpp @@ -0,0 +1,1003 @@ +/** + * \file per_hom.hpp + * \brief Persistent homology with HDVF. + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + * + * Persistent homology with HDVF. + */ + +#ifndef PER_HOM_HPP +#define PER_HOM_HPP + +#include +#include +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/HDVF/SubSparseMatrix.hpp" +#include "CGAL/HDVF/hdvf.hpp" + +/** + * \class Filtration class + * \brief Implementation of the filtration. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ComplexType The type of complex (default is SimpComplex) + * + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + */ + +template +class Filtration +{ +public: + typedef std::pair CellDim ; + typedef struct zFiltration_iter_type { + CellDim cell_dim ; + _DegType degree ; + } Filtration_iter_type ; + +protected: + const _ComplexType& _K ; + std::vector _filtration ; + std::vector<_DegType> _deg ; + + // Cell -> (filtration index, basis index according to the filtration) + std::map _cell_to_t ; + + typedef OSM::SparseMatrix<_CoefType,OSM::COLUMN> CMatrix ; + typedef OSM::SparseMatrix<_CoefType,OSM::ROW> RMatrix ; + typedef OSM::Chain<_CoefType,OSM::COLUMN> CChain ; + typedef OSM::Chain<_CoefType,OSM::ROW> RChain ; +public: + // Constructor from a filtration on all cells + Filtration(const _ComplexType& K, const std::vector& filtration, const std::vector<_DegType>& deg) : + _K(K), _filtration(filtration), _deg(deg) + { + check_filtration() ; + build_filtration_structure() ; + } + + // Constructor of an empty filtration + Filtration(const _ComplexType& K) : _K(K) + { + } + + // Copy constructor + Filtration(const Filtration& f) : _K(f._K), _filtration(f._filtration), _cell_to_t(f._cell_to_t) {} + + // Build lower (resp. upper)-star filtration + // From the degrees of vertices + void star_filtration(const std::vector<_DegType>& deg, bool lower = true) ; + // From a function over vertices + void star_filtration(std::function<_DegType(int)>& deg_fun, bool lower = true) ; + + // iterator (iterate a filtration) + struct iterator + { + // Iterator tags + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = Filtration_iter_type; + + // Iterator constructors + iterator(const Filtration& f, int i=0) : _i(i), _f(f) {} + + // Operators + value_type operator*() const + { + Filtration_iter_type res ; + res.cell_dim = _f._filtration.at(_i) ; + res.degree = _f._deg.at(_i) ; + return res ; + } + + int time () { return _i ; } + CellDim cell_dim () { return _f._filtration.at(_i); } + _DegType degree () { return _f._deg.at(_i); } + + // Prefix increment + // Find next hole of positive duration + iterator& operator++() + { + ++_i; + return *this; + } + + // Postfix increment + iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } + + friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; + friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; + + private: + int _i ; // Index along _persist + const Filtration& _f ; // Filtration iterated + }; + iterator begin() { return iterator(*this, 0) ; } + iterator end() { return iterator(*this, _filtration.size()) ; } + + // getters + CellDim get_cell_dim (int i) { return _filtration.at(i); } + _DegType get_degree (int i) { return _deg.at(i); } + + // Output filtration + friend ostream & operator<<(ostream & out, const Filtration &f) + { + const int N(f._filtration.size()) ; + for (int i=0; i (" << f._filtration.at(i).first << "- dim " << f._filtration.at(i).second << " , " << f._deg.at(i) << ") " << std::endl ; + } + return out ; + } + +protected: + void build_filtration_structure() ; + bool check_filtration() ; + + template + friend class PersistentHDVF ; +}; + +template +void Filtration<_CoefType, _ComplexType, _DegType>::build_filtration_structure() +{ + for (int i = 0; i<_filtration.size(); ++i) + { + const CellDim c(_filtration.at(i)) ; + // c : filtration index i, index in the basis reordered by filtration : j + _cell_to_t[c] = i ; + } +} + +template +bool Filtration<_CoefType, _ComplexType, _DegType>::check_filtration() +{ + bool valid = true ; + for (int i=0; i<_filtration.size() && valid; ++i) + { + if (i>0) + valid = valid & (_deg.at(i) >= _deg.at(i-1)) ; + CellDim c(_filtration.at(i)) ; + cout << i << " -> " << c.first << " dim "<< c.second << endl ; + const int q = c.second ; + if (q>0) + { + CChain dc = _K.d(c.first, q) ; + cout << "bnd : " << dc << endl ; + for (typename CChain::iterator it = dc.begin(); it != dc.end() && valid; ++it) + { + // Faces of c + const CellDim face(it->first,q-1) ; + // Check if the face c belongs to the filtration + auto it_face(_cell_to_t.find(face)) ; + valid = valid & (it_face != _cell_to_t.end()) ; + if (!valid) + cout << "face not found" << endl ; + if (it_face != _cell_to_t.end()) + valid = valid & (_cell_to_t[face] < i) ; + if (!valid) + cout << "face " << it->first << " at time : " << _cell_to_t[face] << " with i : " << i << endl ; + } + } + if (!valid) + cout << "check failed : " << i << endl ; + } + return valid ; +} + +template +void Filtration<_CoefType, _ComplexType, _DegType>::star_filtration(const std::vector<_DegType> °, bool lower) +{ + if (deg.size() != _K.nb_cells(0)) + throw "Star filtration error : deg should provide one value by vertex" ; + + // Create filtration and degrees for all cells according to deg + // -> lower star: maximum degree of vertices + // -> upper star: minimum degree of vertices + std::vector tmp_filtration ; + std::vector<_DegType> tmp_deg ; + std::vector tmp_perm ; + // Init tmp_perm (for vertices) +// cout << "vertices degrees : " << endl ; + for (int i=0; i " << deg.at(i) << endl ; + } + // For all other cells + for (int q=1; q<=_K.dim(); ++q) + { + for (int i=0; i<_K.nb_cells(q); ++i) + { + tmp_filtration.push_back(CellDim(i,q)) ; + + // Compute corresponding degree + // Vertices of the cell + // TODO : bottom_faces should produce a set + std::vector verts(_K.bottom_faces(i,q)) ; +// cout << "cell " << i << " dim " << q << " : " << verts ; + // Compute the degree of the cell + _DegType d = deg.at(verts.at(0)) ; + for (int j=1; j d) + d = tmp_d ; + } + else // upper + { + if (tmp_d < d) + d = tmp_d ; + } + } + tmp_deg.push_back(d) ; + tmp_perm.push_back(tmp_perm.size()) ; +// cout << " -> " << d << endl ; + } + } + // Sort filtration + + // Create sorting function : lexicographic order over (deg, dim) + // Test if cell i < cell j + auto f_sort = [&tmp_filtration, &tmp_deg] (int i, int j) + { + // degree of i is lower than degree of j or (they are equal and the dimension of i is lower than the dimension of j) + return ((tmp_deg[i] < tmp_deg[j]) || ((tmp_deg[i] == tmp_deg[j]) && (tmp_filtration[i].second < tmp_filtration[j].second))) ; + } ; + // Sort -> create the right permutation + std::sort(tmp_perm.begin(), tmp_perm.end(), f_sort) ; + // Insert cells in the filtration and degrees accordingly + for (int i=0; i +void Filtration<_CoefType, _ComplexType, _DegType>::star_filtration(std::function<_DegType(int)>& deg_fun, bool lower) +{ + std::vector<_DegType> deg ; + for (int i=0; i<_K.nb_cells(0); ++i) + { + deg.push_back(deg_fun(i)) ; + } + star_filtration(deg) ; +} + +/* Standard functions for lower star filtration */ +/* DegType = double */ + +//std::function deg_fun_x = [&complex](int i) +//{ +// std::vector Xi(complex.get_vertex_coords(i)) ; +// return (Xi.at(0)) ; +//} ; +// +//std::function deg_fun_z = [&complex](int i) +//{ +// std::vector Xi(complex.get_vertex_coords(i)) ; +// return (Xi.at(2)) ; +//} ; + +std::function&)> f_x = [](const std::vector& v) +{ + return (v.at(0)) ; +} ; + +std::function&)> f_y = [](const std::vector& v) +{ + return (v.at(1)) ; +} ; + +std::function&)> f_z = [](const std::vector& v) +{ + return (v.at(2)) ; +} ; + +template +std::function deg_fun (const ComplexType& complex, std::function&)>& f) +{ + std::function deg_fun_f = [&complex, &f](int i) + { + const std::vector Xi(complex.get_vertex_coords(i)) ; +// cout << "deg_fun_f, i: " << i ; +// cout << " Xi : " ; +// for (double c : Xi) +// cout << c << " " ; +// cout << " - degree: " << f(Xi) << endl ; + return f(Xi) ; + } ; + return deg_fun_f ; +} + + +/* ************************************************************************ */ + +/** + * \class Persistent HDVF + * \brief Implementation of persistent HDVF (inherits HDVF). + * + * The PersistentHDVF class contains all functions to build persistent HDVF and create perfect persistent HDVF. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ComplexType The type of complex (default is SimpComplex) + * + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + */ + +// Persistent interval types +typedef std::pair PerInterval ; +typedef std::pair CellDim ; +typedef std::pair PerIntervalCells ; + +template +using PerDegIntervalT = std::pair<_DegType,_DegType> ; + +template +using PerHoleT = std::tuple > ; + +template +ostream& operator<< (ostream& out, const PerHoleT<_DegType>& hole) +{ + // time (cell, dim) -> time (cell, dim) / time to live + const PerInterval per_int(std::get<0>(hole)) ; + const PerIntervalCells per_int_cells(std::get<1>(hole)) ; + const PerDegIntervalT<_DegType> per_int_deg(std::get<2>(hole)) ; + +// const _DegType duration((per_int_deg.second>=0)?per_int_deg.second-per_int_deg.first:per_int_deg.second) ; + const _DegType duration(per_int_deg.second-per_int_deg.first) ; + if (duration >= 0) // finite interval + { + out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; + out << per_int.second << " (" << per_int_cells.second.first << ", " << per_int_cells.second.second << ") / duration: " << duration << "]" << endl ; + } + else + { + out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; + out << "inf]" << endl ; + } + return out ; +} + + +template +class PersistentHDVF : public HDVF<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix> +{ + // Matrices types + typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; + typedef OSM::Chain<_CoefficientType, OSM::ROW> RChain; + typedef OSM::SubSparseMatrix<_CoefficientType, OSM::COLUMN> CMatrix; + typedef OSM::SubSparseMatrix<_CoefficientType, OSM::ROW> RMatrix; + + // HDVF type + typedef HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; + + // Persistence diagram types + typedef PerDegIntervalT<_DegType> PerDegInterval; + typedef PerHoleT<_DegType> PerHole; + +public: + // Export types + typedef std::vector > ExpLabels ; + typedef CChain ExpChain ; + + // For persistent diagram iterator + typedef struct zexp_infos { + PerHole hole ; + ExpLabels labelsPSC ; + ExpChain g_chain_sigma, g_chain_tau, fstar_chain_sigma, fstar_chain_tau ; + } Exp_infos ; + +protected: + const Filtration<_CoefficientType, _ComplexType, _DegType> &_f ; + // Permutation between K indices and persistent indices (order given by the filtration) + std::vector > _K_to_per, _per_to_K ; + // Persistent pairs + std::vector _persist ; + // Export data + bool _with_export ; + std::vector _export_labels ; + std::vector > _export_g, _export_fstar ; + + // Current "time" in the filtration + int _t ; + // Current "times" along each dimension + std::vector _t_dim ; + // Corresponding masks (for SubSparseMatrices) + std::vector _masks ; + // Persistence computed + bool _computation_over ; + +public: + /** \brief PersistentHDVF Constructor */ + PersistentHDVF(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt = OPT_BND, bool with_export = false) ; + + // Persistence step + PairCell findNextPair(bool &found) ; + + void stepPersist() ; + + void computePersistentHomology() + { + for (int i=0; i < _f._filtration.size(); ++i) + { + this->progress_bar(i, _f._filtration.size()) ; + stepPersist() ; + } + + // Compute "infinite" holes + vector > criticals(this->get_flag(CRITICAL)) ; + for (int q=0; q < criticals.size(); ++q) + { + for (int i : criticals.at(q)) + { + // i : persistence index + const PairCell p = {i, -1, q} ; + const int ki(_per_to_K.at(q).at(i)) ; // K index + const CellDim c(ki,q) ; + const int ti(_f._cell_to_t.at(c)) ; + const _DegType di(_f._deg.at(i)) ; + PerInterval per_int(ti,ti-1) ; + CellDim inf(-1,q+1) ; + PerIntervalCells per_int_cell(c,inf) ; + PerDegInterval per_deg_int(di,di-1) ; + PerHole hole(per_int, per_int_cell, per_deg_int) ; + _persist.push_back(hole) ; + + // If export is on, store export data + if (_with_export) + export_perHDVF(p) ; + } + } + _computation_over = true ; + } + + bool with_export () { return _with_export ; } + + /* ********** */ + + _DegType hole_duration (const PerHole hole) const + { + const PerDegInterval per_int_deg(std::get<2>(hole)) ; + return per_int_deg.second - per_int_deg.first ; + } + + friend ostream& operator<< (ostream& out, const PersistentHDVF& per_hdvf) + { + int i = 0 ; + for (PerHole hole : per_hdvf._persist) + { + if (abs(per_hdvf.hole_duration(hole)) > 0) + out << i << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << endl ; + ++i ; + // // time (cell, dim) -> time (cell, dim) / time to live + // const PerInterval per_int(std::get<0>(hole)) ; + // const PerIntervalCells per_int_cells(std::get<1>(hole)) ; + // const PerDegInterval per_int_deg(std::get<2>(hole)) ; + // + // const _DegType duration((per_int_deg.second>=0)?per_int_deg.second-per_int_deg.first:-per_int_deg.second) ; + // if (duration >= 0) // finite interval + // { + // out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; + // out << per_int.second << " (" << per_int_cells.second.first << ", " << per_int_cells.second.second << ") / duration: " << duration << "]" << endl ; + // } + // else + // { + // out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; + // out << "inf]" << endl ; + // } + } + return out ; + } + + ostream& print_perHDVFInfo (ostream& out) + { + out << "Filtration: " << _f << endl ; + out << "_K_to_per and _per_to_K" << endl ; + for (int q=0; q<=this->_K.dim(); ++q) + { + out << "-> dim " << q << endl ; + out << "index_per -(_per_to_K)-> index_K -(_K_to_per)-> index_per" << endl ; + for (int i=0; i_K.nb_cells(q); ++i) + { + const int id_K(_per_to_K.at(q).at(i)) ; + out << i << " -> " << id_K << " -> " << _K_to_per.at(q).at(id_K) << endl ; + } + } + return out ; + } + + // Method to generate labels for visualisation + // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned (with persistent index) + vector > export_label (ExportType type, int cell=0, int dim=0) const + { + cout << "per export label" << endl ; + vector > labels(this->_K.dim()+1) ; + if (type == PSC) + { + for (int q=0; q<=this->_K.dim(); ++q) + { + for (int i = 0; i_K.nb_cells(q); ++i) // _K indices + { + // if index of i in the filtration is lower than time in dimension q -> display + if (_K_to_per.at(q).at(i) <= _t_dim.at(q)) + { + if (this->_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (this->_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else + labels.at(q).push_back(0) ; + } + else // i has not yet been reached + labels.at(q).push_back(2) ; + } + } + } + else + { + if ((type == FSTAR) && (this->_hdvf_opt & (OPT_FULL | OPT_F))) + { + for (int q=0; q<=this->_K.dim(); ++q) + { + labels.at(q).resize(this->_K.nb_cells(q)) ; + } + + if (dim < this->_K.dim()) + { + int cellK = _per_to_K.at(dim).at(cell) ; // index of the cell in K + + labels.at(dim).at(cellK) = 1 ; + // Cross f* + const typename HDVF_type::RChain& fstar_cell = OSM::cgetRow(this->_F_row.at(dim), cell) ; + for (typename HDVF_type::RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + { + int fstarcellK = _per_to_K.at(dim).at(it->first) ; // index of the cell of f* in K + // Set the cofaces of idcellK in dimension dim+1 + typename HDVF_type::RChain cofaces(this->_K.cod(fstarcellK,dim)) ; + for (typename HDVF_type::RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + { + labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells + } + } + } + else + throw "Error: cannot export f* for a cell of maximal dimension" ; + } + else if (this->_hdvf_opt & (OPT_FULL | OPT_G)) // G + { + // cout << "Export : _subCC : " << _subCC << endl ; + for (int q=0; q<=this->_K.dim(); ++q) + { + labels.at(q).resize(this->_K.nb_cells(q)) ; + } + + int cellK = _per_to_K.at(dim).at(cell) ; // index of the cell in K + labels.at(dim).at(cellK) = 1 ; + // Cross g + const typename HDVF_type::CChain& g_cell = OSM::cgetColumn(this->_G_col.at(dim), cell) ; + for (typename HDVF_type::CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) + { + // Index of the cell in K + int gcellK = _per_to_K.at(dim).at(it->first) ; + labels.at(dim).at(gcellK) = 1 ; // set the flag to 1 only for G(cell) cells + } + } + } + return labels ; + } + + // Method to generate PSC labels for visualisation + virtual vector > export_labelsPSC () const + { + vector > labels(this->_K.dim()+1) ; + for (int q=0; q<=this->_K.dim(); ++q) + { + for (int i = 0; i_K.nb_cells(q); ++i) + { + const int id_per(_K_to_per.at(q).at(i)) ; + if (id_per <=_t_dim.at(q)) + { + if (this->_flag.at(q).at(id_per) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (this->_flag.at(q).at(id_per) == SECONDARY) + labels.at(q).push_back(1) ; + else if (this->_flag.at(q).at(id_per) == CRITICAL) + labels.at(q).push_back(0) ; + else // NONE + labels.at(q).push_back(2) ; + } + else + labels.at(q).push_back(2) ; + } + } + return labels ; + } + + // Method to export a G chain for visualisation + // with cell indices in initial _K + virtual CChain export_GChain (int cell, int dim) const + { + if ((dim<0) || (dim>this->_K.dim())) + throw "Error : export_GChain with dim out of range" ; + // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) + // throw "Error : export_GChain with 'future' cell wrt persistence" ; + + if (this->_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Get g(cell, dim) with per indices + CChain g_cell(OSM::getColumn(this->_G_col.at(dim), cell)) ; + // Add 1 to the cell + g_cell[cell] = 1 ; + // Compute the chain with _K indices + CChain g_cell_K(g_cell.dimension()) ; + for (typename CChain::const_iterator it = g_cell.begin(); it != g_cell.end(); ++it) + { + const int i(_per_to_K.at(dim).at(it->first)) ; + g_cell_K[i] = it->second ; + } + return g_cell_K ; + } + else + throw "Error : trying to export g_chain without proper HDVF option" ; + } + + // Method to export a FSTAR chain for visualisation + // with cell indices in initial _K + virtual CChain export_FSTARChain (int cell, int dim) const + { + if ((dim<0) || (dim>this->_K.dim())) + throw "Error : export_GChain with dim out of range" ; + // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) + // throw "Error : export_GChain with 'future' cell wrt persistence" ; + + if (this->_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Get fstar(cell, dim) with per indices + RChain fstar_cell(OSM::getRow(this->_F_row.at(dim), cell)) ; + // Add 1 to the cell + fstar_cell[cell] = 1 ; + // Compute the cofaces of the chain with _K indices + // Compute the cofaces + if (dim < this->_K.dim()) + { + CChain fstar_cofaces(this->_K.nb_cells(dim+1)) ; + for (typename RChain::const_iterator it = fstar_cell.begin(); it != fstar_cell.end(); ++it) + { + // Set the cofaces of indices_K(it->first) in dimension dim+1 + // belonging to _K(_t) + const int i(_per_to_K.at(dim).at(it->first)) ; + RChain cofaces(this->_K.cod(i,dim)) ; + for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + { + const int id(it2->first) ; + if (_K_to_per.at(dim+1).at(id) <=_t_dim.at(dim+1)) + fstar_cofaces[id] = 1 ; + } + } + return fstar_cofaces ; + } + else + return CChain(0) ; + } + else + throw "Error : trying to export g_chain without proper HDVF option" ; + } + + // Export method (at a given time, for a pair of critical cells - before pairing) + void export_perHDVF(PairCell p) + { + // Export labels + ExpLabels labels(this->export_labelsPSC()) ; + _export_labels.push_back(labels) ; + // Export g (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_G)) + { + CChain chain_sigma(export_GChain(p.sigma, p.dim)) ; + CChain chain_tau ; + if (p.tau >= 0) + chain_tau = export_GChain(p.tau, p.dim+1) ; + _export_g.push_back(std::pair(chain_sigma, chain_tau)) ; + } + // Export fstar (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_F)) + { + CChain chain_sigma(export_FSTARChain(p.sigma, p.dim)) ; + CChain chain_tau ; + if (p.tau >= 0) + chain_tau = export_FSTARChain(p.tau, p.dim+1) ; + _export_fstar.push_back(std::pair(chain_sigma, chain_tau)) ; + } + } + // Empty export method (for persistent intervals below the threshold) + void export_perHDVF() + { + // Export labels + ExpLabels labels ; + _export_labels.push_back(labels) ; + // Export g (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_G)) + { + CChain chain_sigma, chain_tau ; + _export_g.push_back(std::pair(chain_sigma, chain_tau)) ; + } + // Export fstar (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_F)) + { + CChain chain_sigma, chain_tau ; + _export_fstar.push_back(std::pair(chain_sigma, chain_tau)) ; + } + } + + struct iterator + { + // Iterator tags + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = Exp_infos; + using pointer = Exp_infos*; // or also value_type* + + // Iterator constructors + iterator(const PersistentHDVF& per_hdvf, int i=0) : _i(i), _per_hdvf(per_hdvf) + { + if (_i == 0) + { + // Iterate over holes of duration > 0 + while ((_i<_per_hdvf._persist.size()) && (_per_hdvf.hole_duration(_per_hdvf._persist.at(_i)) == 0)) + { + ++_i ; + } + } + } ; + + // Operators + value_type operator*() const + { + Exp_infos res ; + res.hole = _per_hdvf._persist.at(_i) ; + res.labelsPSC = _per_hdvf._export_labels.at(_i) ; + if (_per_hdvf._hdvf_opt & (OPT_G | OPT_FULL)) + { + res.g_chain_sigma = _per_hdvf._export_g.at(_i).first ; + res.g_chain_tau = _per_hdvf._export_g.at(_i).second ; + } + if (_per_hdvf._hdvf_opt & (OPT_F | OPT_FULL)) + { + res.fstar_chain_sigma = _per_hdvf._export_fstar.at(_i).first ; + res.fstar_chain_tau = _per_hdvf._export_fstar.at(_i).second ; + } + return res ; + } + pointer operator->() + { + Exp_infos res ; + res.hole = _per_hdvf._persist.at(_i) ; + res.labelsPSC = _per_hdvf._export_labels.at(_i) ; + if (_per_hdvf._hdvf_opt & (OPT_G | OPT_FULL)) + { + res.g_chain_sigma = _per_hdvf._export_g.at(_i).first ; + res.g_chain_tau = _per_hdvf._export_g.at(_i).second ; + } + if (_per_hdvf._hdvf_opt & (OPT_F | OPT_FULL)) + { + res.fstar_chain_sigma = _per_hdvf._export_fstar.at(_i).first ; + res.fstar_chain_tau = _per_hdvf._export_fstar.at(_i).second ; + } + return res ; + } + + // Prefix increment + // Find next hole of positive duration + iterator& operator++() + { + ++_i; + while ((_i<_per_hdvf._persist.size()) && (_per_hdvf.hole_duration(_per_hdvf._persist.at(_i)) == 0)) + { + ++_i ; + } + return *this; + } + + // Postfix increment + iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } + + friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; + friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; + + private: + int _i ; // Index along _persist + const PersistentHDVF& _per_hdvf ; // per_hdvf iterated + }; + iterator begin() { return iterator(*this, 0) ; } + iterator end() { return iterator(*this, _persist.size()) ; } +} ; + + +template +PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::PersistentHDVF(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt, bool with_export) : HDVF<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix>(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1), _computation_over(false) +{ + // Initialisation of _t_dim, _K_to_per and _per_to_K + _t_dim.resize(this->_K.dim()+1, 0) ; + _K_to_per.resize(this->_K.dim()+1) ; + _per_to_K.resize(this->_K.dim()+1) ; + for (int q=0; q<=this->_K.dim(); ++q) + { + _K_to_per.at(q).resize(this->_K.nb_cells(q)) ; + _t_dim.at(q) = -1 ; + } + + for (int i = 0; i<_f._filtration.size(); ++i) + { + const CellDim c(_f._filtration.at(i)); + const int q(c.second) ; + const int ind_K_i(c.first) ; + const int ind_per_i(_per_to_K.at(q).size()) ; + _per_to_K.at(q).push_back(ind_K_i) ; + _K_to_per.at(q).at(ind_K_i) = ind_per_i ; + } + + // Init _masks + _masks.resize(this->_K.dim()+1) ; + for (int q=0; q_K.dim()+1; ++q) + { + _masks.at(q) = OSM::Bitboard(this->_K.nb_cells(q)) ; + } + + // Init boundary matrices + vector _DD_per(this->_K.dim()+1) ; + + // Copy _DD_col with filtration order (for dimensions q>0) + for (int q = 0 ; q <= this->_K.dim(); ++q) + { + const std::pair s(this->_DD_col.at(q).dimensions()) ; + _DD_per.at(q) = CMatrix(s.first, s.second) ; + } + // Set empty mask for _DD_per[0] + _DD_per.at(0).complement(); + + for (int q = 1 ; q <= this->_K.dim(); ++q) + { + // Cross _DD_col.at(q) and set _DD_per.at(q) coefficients on the fly + for (OSM::Bitboard::iterator it_col = this->_DD_col.at(q).begin(); it_col != this->_DD_col.at(q).end(); ++it_col) + { + const int j(*it_col) ; + const CChain& col(OSM::cgetColumn(this->_DD_col.at(q), j)) ; + for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) + { + const int i(it->first) ; + const _CoefficientType v(it->second) ; + // Cells in the _K basis : i(dim q-1) / j(dim q) + // Convert to indices in the persistent order + const int pi(_K_to_per.at(q-1).at(i)), pj(_K_to_per.at(q).at(j)) ; + _DD_per.at(q).set_coef(pi, pj, v) ; + } + } + } + this->_DD_col = _DD_per ; + + // Init _DD_col mask (empty for all cells) + for (int q = 1 ; q <= this->_K.dim(); ++q) + this->_DD_col.at(q).set_sub(_masks.at(q)) ; +} + +template +PairCell PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::findNextPair(bool &found) +{ + PairCell p ; + // Get current cell (in the basis K) + CellDim c(_f._filtration.at(_t)) ; + const int q(c.second), sigma(_K_to_per.at(q).at(c.first)) ; + // Search for pairing + found = false; + + if (q >= 1) + { + // Compute bounded max while iterating over the Chain + const CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), sigma)) ; + std::size_t tmax = _t_dim.at(q-1) ; + std::size_t i ; + for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) + { + if ((it->first <= tmax) && (abs(it->second) == 1)) // possible pairing + { + if (!found) // for first cell met + { + found = true ; + i = it->first ; + } + else // update the i with the maximum cell index (persistance) + { + if (it->first > i) + i = it->first ; + } + } + } + if (found) + { + p.sigma = i ; + p.tau = sigma ; + p.dim = q-1 ; + } + } + return p; +} + +template +void PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::stepPersist() +{ + // Compute next persistent pair + + ++_t ; // Step forward in the filtration + const int q_current(_f._filtration.at(_t).second) ; // Get the dimension of the new current cell + ++_t_dim.at(q_current) ; // Update time in the dimension of the current cell + _masks.at(q_current).setOn(_t_dim.at(q_current)) ; // Update mask accordingly + this->_DD_col.at(q_current).set_bitOn(_t_dim.at(q_current)) ; // Update _DD_col mask + + // Search for pairing + bool found ; + PairCell p(findNextPair(found)) ; + if (found) + { + // Corresponding persistent interval + const int q(p.dim) ; + // indices of both cells in the _K basis + const int ki(_per_to_K.at(q).at(p.sigma)), kj(_per_to_K.at(q+1).at(p.tau)) ; + CellDim ci(ki, q), cj(kj, q+1) ; // cells of the interval - in the K basis + int ti(_f._cell_to_t.at(ci)), tj(_f._cell_to_t.at(cj)) ; // times of the interval + PerInterval interval(ti, tj) ; + PerIntervalCells interval_cells(ci, cj) ; + PerDegInterval interval_deg(_f._deg.at(ti), _f._deg.at(tj)) ; + PerHole hole(interval, interval_cells, interval_deg) ; + // Add this interval + _persist.push_back(hole) ; + + // If export is on, store export data for significant persistant intervals + if (_with_export) + { + if ((interval_deg.second-interval_deg.first)>0) + export_perHDVF(p) ; + else + export_perHDVF() ; + } + +// if (interval_deg.second-interval_deg.first>0) +// { +// cout << "========> time : " << _t << endl ; +// cout << "pair found : " << p.sigma << ", " << p.tau << " - dim " << p.dim << endl ; +// this->print_reduction() ; +// +// } + + // Prepare for next step + this->A(p.sigma, p.tau, p.dim) ; // Update the reduction +// if (interval_deg.second-interval_deg.first>0) +// { +// cout << "====> after A : " << endl ; +// this->print_reduction() ; +// +// } + } +} + + + +#endif // PER_HOM_HPP diff --git a/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp b/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp new file mode 100644 index 000000000000..b60702c7e7ea --- /dev/null +++ b/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp @@ -0,0 +1,201 @@ +// +// hdvf_duality.hpp +// HDVF +// +// Created by umenohana on 27/08/2024. +// + +#ifndef SUB_CHAIN_COMPLEX_H +#define SUB_CHAIN_COMPLEX_H + +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/OSM/Bitboard.hpp" + +/** + * \class SubChainComplex + * \brief Implementation of the sub chain complex relation (for duality) - subcomplex and cocomplex + * + * The SubChainComplex class contains all functions to build sub chain complex (for HDVF). + * + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + */ + +template // !!! change everywhere -> CoefficientType +class SubChainComplex +{ +public: + int _dim ; + std::vector _sub ; + std::vector _nb_cells ; + bool _full ; +private: + // Load a set of cells and close the enumeration down (faces) + void down_closure (const std::vector > &cells, const ComplexType& K) + { + std::vector > faces(cells.size()) ; + bool rec_needed = false ; + for (int q = 0; q < cells.size(); ++q) + { + for (int i : cells.at(q)) + { + if (!_sub.at(q).isOn(i)) + { + _sub.at(q).setOn(i) ; + ++_nb_cells.at(q) ; + if (q>0) // Then faces must be considered + { + // Add all its faces to faces.at(q-1) + OSM::Chain bnd(K.d(i,q)) ; + for (typename OSM::Chain::const_iterator it = bnd.cbegin(); it != bnd.cend(); ++it) + { + const int c(it->first) ; + if (!_sub.at(q-1).isOn(c)) + { + faces.at(q-1).push_back(c) ; + rec_needed = true ; + } + } + } + } + } + } + // Call recursively + if (rec_needed) + down_closure(faces, K); + } + + // Load a set of cells (without closure) + void set_cells (const std::vector > &cells, const ComplexType& K) + { + for (int q = 0; q < cells.size(); ++q) + { + for (int i : cells.at(q)) + { + _sub.at(q).setOn(i) ; + ++_nb_cells.at(q) ; + } + } + } + +public: + /** \brief Constructor of a full sub CC from a complex. */ + SubChainComplex(const ComplexType& K, bool full=true) + { + _dim = K.dim() ; + _sub.resize(_dim+1) ; + _nb_cells.resize(_dim+1) ; + // Create Bitboards + for (int q=0; q<=K.dim(); ++q) + { + if (full) + { + _sub.at(q) = OSM::Bitboard(K.nb_cells(q),false) ; // all cells to 1 + _full = true ; + } + else + _sub.at(q) = OSM::Bitboard(K.nb_cells(q),true) ; // all cells to 0 + _nb_cells.at(q) = K.nb_cells(q) ; + } + } + + + /** \brief Constructor from an enumeration of cellId of the sub chain complex (close the complex down if necessary). */ + SubChainComplex(const ComplexType& K, const std::vector > &cells, bool close = true) + { + _dim = K.dim() ; + _sub.resize(_dim+1) ; + _nb_cells.resize(_dim+1) ; + _full = true ; + // Create Bitboards + for (int q=0; q<=K.dim(); ++q) + { + _sub.at(q) = OSM::Bitboard(K.nb_cells(q)) ; + } + + // Set bits + if (close) + down_closure(cells, K) ; + else + set_cells(cells, K) ; + + for (int q=0; q<=K.dim(); ++q) + { + _full = (_full && (_nb_cells.at(q) == _sub.at(q).size())) ; + } + } + + /** \brief Copy constructor. */ + SubChainComplex(const SubChainComplex& _otherToCopy) + { + _dim = _otherToCopy._dim ; + _nb_cells = _otherToCopy._nb_cells ; + _full = _otherToCopy._full ; + _sub = _otherToCopy._sub ; + } + + /** \brief Complement of a sub chain complex. */ + SubChainComplex complement() + { + SubChainComplex cSub(*this) ; + // Complement bitboards + for (int q=0; q<=_dim; ++q) + { + cSub._sub.at(q).bit_not() ; + cSub._nb_cells.at(q) = _sub.at(q).size() - _nb_cells.at(q) ; + cSub._full = ~_full ; + } + return cSub ; + } + + /** \brief Check for a bit (bit i in dimension q). */ + inline bool get_Bit(int q, int i) const + { + return _sub.at(q).isOn(i) ; + } + + /** \brief Check for a bit (bit i in dimension q). */ + inline void set_BitOn(int q, int i) + { + return _sub.at(q).setOn(i) ; + } + + /** \brief Check for a bit (bit i in dimension q). */ + inline void set_BitOff(int q, int i) + { + return _sub.at(q).setOff(i) ; + } + + /** \brief Getter for the bitboards of the sub chain complex. */ + inline const std::vector& get_BitBoard() const + { + return _sub ; + } + + /** \brief Getter for the bitboard of the sub chain complex in dimension q. */ + inline const OSM::Bitboard& get_BitBoard(int q) const + { + return _sub.at(q) ; + } + +// template +// friend ostream & operator << (ostream & out, const SubChainComplex<_CoefficientType,_ComplexType> & sub) +// { +// for (int q = 0; q <= sub._dim; ++q) +// out << "dim " << q << " : " << sub._sub.at(q) << endl ; +// return out ; +// } + + friend std::ostream & operator << (std::ostream & out, const SubChainComplex & sub) + { + for (int q = 0; q <= sub._dim; ++q) + out << "dim " << q << " : " << sub._sub.at(q) << std::endl ; + return out ; + } +}; + +#endif /* SUB_CHAIN_COMPLEX_H */ diff --git a/HDVF/include/CGAL/HDVF/tools_io.hpp b/HDVF/include/CGAL/HDVF/tools_io.hpp new file mode 100644 index 000000000000..d88e3433d129 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/tools_io.hpp @@ -0,0 +1,1154 @@ +// +// tools_io.hpp +// duality +// +// Created by umenohana on 09/03/2023. +// + +#ifndef tools_io_hpp +#define tools_io_hpp + +#include +#include +#include +#include +#include +#include +#include + +using namespace std ; + +typedef std::vector IONodeType ; +// For simplicial complexes +typedef std::set IOCellType ; +typedef std::vector IOChainType ; +// For cubical complexes +typedef std::vector IOCubCellType ; +typedef std::vector IOCubChainType ; + + +inline IONodeType & operator+(const IONodeType &v1, const IONodeType &v2) +{ + assert(v1.size() == v2.size()) ; + IONodeType &tmp = *new(IONodeType)(3,0) ; + for (int i =0; i<3; ++i) + tmp[i] = (v1.at(i) + v2.at(i)) ; + return tmp ; +} + +inline IONodeType & operator-(const IONodeType &v1, const IONodeType &v2) +{ + assert(v1.size() == v2.size()) ; + IONodeType &tmp = *new(IONodeType)(3,0) ; + for (int i =0; i<3; ++i) + tmp[i] = (v1.at(i) - v2.at(i)) ; + return tmp ; +} + +inline IONodeType & operator+= (IONodeType &v1, const IONodeType &v2) +{ + assert(v1.size() == v2.size()) ; + for (int i =0; i<3; ++i) + v1.at(i) += v2.at(i) ; + return v1 ; +} + +inline IONodeType operator/(const IONodeType &v1, double d) +{ + IONodeType &tmp = *new(IONodeType)(3,0) ; + for (int i =0; i<3; ++i) + tmp[i] = v1.at(i)/d ; + return tmp ; +} + +inline IONodeType & operator/=(IONodeType &v1, double d) +{ + for (int i =0; i<3; ++i) + v1.at(i) /= d ; + return v1 ; +} + +inline IONodeType & operator*=(IONodeType &v, double d) +{ + for (int i =0; i<3; ++i) + v.at(i) *= d ; + return v ; +} + +inline IONodeType & operator*=(IONodeType &v, IONodeType &lambda) +{ + for (int i =0; i<3; ++i) + v.at(i) *= lambda.at(i) ; + return v ; +} + +inline IONodeType & bary(const std::vector &verts) +{ + IONodeType &tmp = *new(IONodeType)(3,0) ; + if (verts.size()>0) + { + for (int i = 0; i VTK_types_IO = {1, 3, 5, 10} ; + +// Write vtk file +template +void write_vtk(const std::string &filename, const std::vector &nodes, const std::vector &chains, const std::vector *labels=NULL, const std::string scalar_type="none") +{ + bool with_scalars = (labels != NULL) ; + // Load ... + std::ofstream out ( filename, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "SimplicialComplex::loadFromFile. Fatal Error:\n " << filename << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + + // Header + out << "# vtk DataFile Version 2.0" << endl ; + out << "generators" << endl ; + out << "ASCII" << endl ; + out << "DATASET UNSTRUCTURED_GRID" << endl ; + + // Points + int nnodes = nodes.size() ; + out << "POINTS " << nnodes << " double" << endl ; + for (IONodeType n : nodes) + out << n.at(0) << " " << n.at(1) << " " << n.at(2) << endl ; + + // Cells + // Number of cells : for each chain, each number of vertices for each cell + // Size : size of a cell defined by d vertices : d+1 + int ncells_tot = 0, size_cells_tot = 0 ; + for (int i = 0; i types ; + std::vector scalars ; + for (int i = 0; iat(i)) ; + } + } + + // CELL_TYPES + out << "CELL_TYPES " << ncells_tot << endl ; + for (int t : types) + out << t << " " ; + out << endl ; + + if (with_scalars) + { + // CELL_TYPES + out << "CELL_DATA " << ncells_tot << endl ; + out << "SCALARS CriticalCellsId " << scalar_type << " 1" << endl ; + out << "LOOKUP_TABLE default" << endl ; + for (int s : scalars) + out << s << " " ; + out << endl ; + } + out.close() ; +} +//} + + +// /////////////////// + +// ----- Generic ----- + +inline bool check_sanity_line(const std::string &line, const std::string &file) +{ + // Check that line is sanitized. If not, throw. + for ( int i = 0; i < line.size(); ++ i ) { + if ( ! ( std::isspace(line[i]) || std::isdigit(line[i]) || (line[i] == '-') || (line[i] == '.') || (line[i] == 'e')) ) { + std::cerr << "Error:\n Cannot parse file " << file << std::endl ; + std::cerr << "--- " << line[i] << std::endl ; + return false; + } + } + return true ; +} + +inline bool get_next_uncommented_line(std::ifstream &infile, std::string &result) { + while(getline(infile,result)) { + if(result.length() > 1 && result[0] != '#') { + return true; + } + } + return false; +} + +// Generic Mesh_object class - for 3D triangular meshes +class Mesh_object +{ +public: + // Dimension : + // - if dim > 0 : Mesh_object encodes a mesh and all cells have dimension d + // - if dim < 0 : Mesh_object encodes a complex of dimension d + int dim = 0 ; + int nvertices, ncells, nedges ; + std::vector nodes ; // Coordinates of vertices (optional) + std::vector cells ; + + Mesh_object() : dim(0), nvertices(0), ncells(0), nedges(0) {} + Mesh_object(int d, const std::vector &vnodes, const std::vector &vcells) : dim(d), nvertices(vnodes.size()), ncells(vcells.size()), nedges(0), nodes(vnodes), cells(vcells) { check_dimension() ;} + Mesh_object(const Mesh_object &m) : dim(m.dim), nvertices(m.nvertices), ncells(m.ncells), nedges(m.nedges), nodes(m.nodes), cells(m.cells) {} + + // Mesh operations + void push_back(const Mesh_object &mesh) + { + int off = nvertices ; // The index of all the cells of mesh has to be incremented by off + nvertices += mesh.nvertices ; + ncells += mesh.ncells ; + // Append all the vertices + for (int i=0; i> nvertices >> ncells >> nedges; + + nodes.resize(nvertices) ; + for(auto i=0; i < nvertices; ++i) { + if (!get_next_uncommented_line(infile,info)) { + return false; + } + std::istringstream info_stream(info); + IONodeType p(3) ; + info_stream >> p[0] >> p[1] >> p[2] ; + nodes[i] = p ; + } + + // 4 - the actual faces + cells.resize(ncells); + for(auto i=0; i < ncells; ++i) { + if (!get_next_uncommented_line(infile,info)) { + return false; + } + std::istringstream info_stream(info); + unsigned long n; + unsigned long index; + info_stream >> n; + IOCellType c ; + for (auto j = 0; j < n; ++j) { + info_stream >> index; + c.insert(index) ; + } + cells[i] = c ; + dim = (c.size()-1>dim)?c.size()-1:dim ; + } + + infile.close(); + return true; + } + + bool write_off(const std::string &filename) + { + // 0 - open input file + std::ofstream outfile(filename); + if(!outfile.is_open()) { + cerr << "Warning: cannot open file " << filename << endl ; + // failed to open the file + return false; + } + // 1 - header + outfile << "OFF" << endl ; + outfile << nvertices << " " << cells_of_dim(2) << " " << nedges << endl ; + // 2 - nodes + for (int i=0; i chains{cells} ; + write_vtk(filename, nodes, chains) ; + } + + // SIMP + bool write_simp(const std::string &filename) + { + // 0 - open input file + std::ofstream outfile(filename); + if(!outfile.is_open()) { + cerr << "Warning: cannot open file " << filename << endl ; + // failed to open the file + return false; + } + // 1 - write cells + for (int i=0; i " << line << "\n"; + throw std::runtime_error("File Parsing Error: Invalid file"); + } + } + IOCellType cell ; + std::istringstream is( line ); + int v; + while ( is >> v ) + cell.insert(v); + // Add this simplex to cells + if (!(cell.empty())) + { + ++ncells ; + cells.push_back(cell) ; + const int dcell = cell.size()-1 ; + if (dcell > d) + d = dcell ; + } + } + dim = d ; + infile.close() ; + return true ; + } + + bool read_nodes_file(const std::string &filename) ; + + void print_infos () const + { + cout << "Mesh_object infos - dim : "<< dim << ", nodes : " << nodes.size() << ", cells : " << cells.size() << endl ; + for (int q = 0; q <= dim; ++q) + cout << "cells of dim " << q << " : " << cells_of_dim(q) << endl ; + } + + // Mesh computations + IONodeType barycenter() + { + // Init the barycenter + IONodeType bary(3,0) ; + // Compute the barycenter + for (IONodeType v : nodes) + { + bary += v ; + } + bary /= nodes.size() ; + return bary; + } + + double radius(const IONodeType &bary) + { + double r = 0 ; + for (IONodeType v : nodes) + { + r = max (r, dist(v,bary)) ; + } + return r ; + } + pair BB(double ratio=1.) + { + IONodeType minBB(nodes.at(0)), maxBB(nodes.at(0)) ; + for (int i=1; i(c-rad, c+rad) ; + } +private: + void check_dimension() + { + if (dim > 0) // exact dimension + { + for (IOCellType cell : cells) + { + if (cell.size() != (dim+1)) + throw "Mesh has a cell of inconsistent dimension" ; + } + } + else // max dim + { + for (IOCellType cell : cells) + { + if ((cell.size() > (-dim+1))) + throw "Mesh has a cell of inconsistent dimension" ; + } + } + } +} ; + +inline Mesh_object mesh_BB(const IONodeType &BBmin, const IONodeType &BBmax) +{ + Mesh_object m ; + IONodeType delta = BBmax-BBmin ; + m.nvertices = 8 ; + m.ncells = 12 ; + m.nodes.resize(8) ; + m.nodes[0] = IONodeType({0, 0, 0}) ; + m.nodes[1] = IONodeType({1, 0, 0}) ; + m.nodes[2] = IONodeType({1, 1, 0}) ; + m.nodes[3] = IONodeType({0, 1, 0}) ; + m.nodes[4] = IONodeType({0, 0, 1}) ; + m.nodes[5] = IONodeType({1, 0, 1}) ; + m.nodes[6] = IONodeType({1, 1, 1}) ; + m.nodes[7] = IONodeType({0, 1, 1}) ; + for (int i=0; i<8; ++i) + { + m.nodes[i] *= delta ; + m.nodes[i] += BBmin ; + } + + m.cells.resize(12) ; + m.cells[0] = IOCellType({0, 1, 4}) ; + m.cells[1] = IOCellType({1, 5, 4}) ; + m.cells[2] = IOCellType({1, 2, 6}) ; + m.cells[3] = IOCellType({1, 6, 5}) ; + m.cells[4] = IOCellType({3, 1, 0}) ; + m.cells[5] = IOCellType({2, 1, 3}) ; + m.cells[6] = IOCellType({2, 3, 6}) ; + m.cells[7] = IOCellType({6, 3, 7}) ; + m.cells[8] = IOCellType({3, 0, 4}) ; + m.cells[9] = IOCellType({7, 3, 4}) ; + m.cells[10] = IOCellType({6, 4, 5}) ; + m.cells[11] = IOCellType({6, 7, 4}) ; + return m; +} + +// TODO : check that de dimensions of nodes are consistent... + + + +// Tetgen related + +inline int read_nodes(const std::string &node_file, bool load_nodes, std::vector *nodes) +{ + std::ifstream in_file (node_file) ; + if ( not in_file . good () ) { + std::cerr << "SimplicialComplex::loadFromFile. Fatal Error:\n " << node_file << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + + // First line is the number of nodes + int nnodes, nnodes_tmp ; + if (not in_file.eof()) + { + std::string line; + getline( in_file, line ); + check_sanity_line(line, node_file) ; + // First number is the number of nodes + std::istringstream is (line); + is >> nnodes ; + } + nnodes_tmp = nnodes ; + while ( !(in_file.eof()) && (nnodes_tmp>0)) + { + int trash ; + double x ; + IONodeType node ; + --nnodes_tmp ; + std::string line; + getline( in_file, line ); + check_sanity_line(line, node_file) ; + std::istringstream is (line); + is >> trash ; + for (int i = 0; i<3; ++i) + { + is >> x ; + node.push_back(x) ; + } + if (load_nodes) + nodes->push_back(node) ; + } + in_file.close() ; + return nnodes; +} + +inline bool Mesh_object::read_nodes_file(const std::string &filename) +{ + nvertices = read_nodes(filename, true, &nodes) ; +} + +// Tetgen + +class TetObject : public Mesh_object +{ +public: + TetObject(const std::string & prefix) : Mesh_object(), _prefix(prefix) + { + dim = -3 ; + add_nodes() ; + create_nodes() ; + add_edges() ; + add_faces() ; + add_tets() ; + ncells = cells.size() ; + } + + void add_nodes() + { + const std::string file_node = fnodes_from_prefix(_prefix) ; + cout << "file_node : " << file_node << endl ; + read_nodes_file(file_node) ; + } + + void create_nodes() + { + for (int i=0; i> f_nedges ; + } + while ( !(input_file.eof()) && (f_nedges>0)) + { + int trash, i, j ; + ++ line_number; + --f_nedges ; + std::string line; + getline( input_file, line ); + check_sanity_line(line, file_edge) ; + std::istringstream is (line); + is >> trash ; + is >> i ; + is >> j ; + IOCellType cell({i,j}) ; + add_cell(cell) ; + } + input_file.close() ; + cout << "--- " << f_nedges << " edges" << endl ; + } + + void add_faces() + { + const std::string file_face = ffaces_from_prefix(_prefix) ; + std::ifstream input_file ( file_face ); + int f_nfaces ; + // Open the input file + if ( not input_file . good () ) + { + std::cerr << "File " << file_face << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + // First line is the number of edges + std::size_t line_number = 0; + if (not input_file.eof()) + { + ++line_number ; + std::string line; + getline( input_file, line ); + check_sanity_line(line, file_face) ; + // First number is the number of nodes + std::istringstream is (line); + is >> f_nfaces ; + } + while ( !(input_file.eof()) && (f_nfaces>0)) + { + int trash, i, j, k ; + ++ line_number; + --f_nfaces ; + std::string line; + getline( input_file, line ); + check_sanity_line(line, file_face) ; + std::istringstream is (line); + is >> trash ; + is >> i ; + is >> j ; + is >> k ; + IOCellType cell({i, j, k}) ; + add_cell(cell) ; + } + input_file.close() ; + cout << "--- " << f_nfaces << " faces" << endl ; + } + + void add_tets() + { + const std::string file_ele = ftets_from_prefix(_prefix) ; + std::ifstream input_file ( file_ele ); + int f_ntets ; + // Open the input file + if ( not input_file . good () ) + { + std::cerr << "File " << file_ele << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + // First line is the number of edges + std::size_t line_number = 0; + if (not input_file.eof()) + { + ++line_number ; + std::string line; + getline( input_file, line ); + check_sanity_line(line, file_ele) ; + // First number is the number of nodes + std::istringstream is (line); + is >> f_ntets ; + } + while ( !(input_file.eof()) && (f_ntets>0)) + { + int trash, i, j, k, l ; + ++ line_number; + --f_ntets ; + std::string line; + getline( input_file, line ); + check_sanity_line(line, file_ele) ; + std::istringstream is (line); + is >> trash ; + is >> i ; + is >> j ; + is >> k ; + is >> l ; + IOCellType cell({i, j, k, l}) ; + add_cell(cell) ; + } + input_file.close() ; + cout << "--- " << f_ntets << " tets" << endl ; + } +private: + std::string _prefix ; + std::string fnodes_from_prefix(const std::string &prefix) {return prefix+".1.node"; } + std::string fedges_from_prefix(const std::string &prefix) {return prefix+".1.edge"; } + std::string ffaces_from_prefix(const std::string &prefix) {return prefix+".1.face"; } + std::string ftets_from_prefix(const std::string &prefix) {return prefix+".1.ele"; } +} ; + + + +// ----- mesh BB + +//Mesh_object mesh_BB(const IONodeType &BBmin, const IONodeType &BBmax) ; + +class IcosphereObject : public Mesh_object +{ +public: + using Index=int ; + using Lookup=std::map, Index>; + + IcosphereObject(int subdivisions, const IONodeType &c = IONodeType({0, 0, 0}), double r=1.) : Mesh_object(2, vertices_ico, triangles_ico) + { + for (int i=0; i vertices_ico = + { + {-X,N,Z}, {X,N,Z}, {-X,N,-Z}, {X,N,-Z}, + {N,Z,X}, {N,Z,-X}, {N,-Z,X}, {N,-Z,-X}, + {Z,X,N}, {-Z,X, N}, {Z,-X,N}, {-Z,-X, N} + }; + + inline static const std::vector triangles_ico = + { + {0,4,1},{0,9,4},{9,5,4},{4,5,8},{4,8,1}, + {8,10,1},{8,3,10},{5,3,8},{5,2,3},{2,7,3}, + {7,10,3},{7,6,10},{7,11,6},{11,0,6},{0,1,6}, + {6,1,10},{9,0,11},{9,11,2},{9,2,5},{7,2,11} + }; + + // Methods + Index vertex_for_edge(Lookup& lookup, Index first, Index second) + { + Lookup::key_type key(first, second); + if (key.first>key.second) + std::swap(key.first, key.second); + + auto inserted=lookup.insert({key, nodes.size()}); + if (inserted.second) + { + IONodeType& edge0(nodes[first]); + IONodeType& edge1(nodes[second]); + IONodeType& point(edge0+edge1); + normalize(point) ; + add_node(point); + } + + return inserted.first->second; + } + + void subdivide() + { + Lookup lookup; + std::vector result ; + + for (IOCellType & each:cells) + { + std::array mid; + std::vector each_vertex ; + for (int c : each) + each_vertex.push_back(c) ; + for (int edge=0; edge<3; ++edge) + { + mid[edge]=vertex_for_edge(lookup, + each_vertex[edge], each_vertex[(edge+1)%3]); + } + result.push_back({each_vertex[0], mid[0], mid[2]}); + result.push_back({each_vertex[1], mid[1], mid[0]}); + result.push_back({each_vertex[2], mid[2], mid[1]}); + result.push_back({mid[0], mid[1], mid[2]}); + } + clear_cells() ; + for (IOCellType c : result) + add_cell(c) ; + } + + void rigid_transformation(const IONodeType &c, double r) + { + for (int i=0; i ncubs ; // Number of cubs in each dimension + vector N ; // Size of BB along each dimension + std::vector cubs ; + bool khalimsky ; + + CubObject() : dim(0), ncubs(vector(4)), N(vector(3)), khalimsky(false) {} + CubObject(int d, const std::vector &vcubs, bool khal = false) : dim(d), ncubs(vector(4)), N(vector(3)), cubs(vcubs), khalimsky(khal) + { check_dimension() ;} + CubObject(const CubObject &m) : dim(m.dim), ncubs(m.ncubs), N(m.N), cubs(m.cubs), khalimsky(m.khalimsky) {} + + // Mesh operations + void clear_cubs() { cubs.clear() ; for (int i=0; i<4; ++i) ncubs[i] = 0 ; } + void add_cub(const IOCubCellType &c) {cubs.push_back(c); ++ncubs[cub_dim(c)] ;} + void frame() // Enlarge the bouding box to add 1 voxel around + { + // Enlarge the BB along each dimension + for (int i=0; i sizes ; + + int tmp ; + stringstream sseizes (inputLine); + while (sseizes >> tmp) + sizes.push_back(tmp) ; + + cout << "dimensions : " ; + for (int i=0; i(dim) ; + for (int i=0; i> tmp ; + if (tmp) // pixel on + { + cubs.push_back(index_to_coords(i, khal)) ; + ++ncubs[dim] ; + } + } + + if (khal) + { + // Change N to Khalimsky maxima + for(int i=0; i " << line << "\n"; + throw std::runtime_error("File Parsing Error: Invalid file"); + } + } + std::istringstream is( line ); + + if (line_number == 1) // Header 1 + is >> dim ; + else if (line_number == 2) // Header 2 + { + for (int i=0; i> N[i] ; + } + else // Cub line + { + IOCubCellType cub ; + + int v; + while ( is >> v ) + cub.push_back(v); + if (cub.size() != dim) + cout << "Discard line " << line_number << " cub of invalid dimension" << endl ; + else + { + // Add this cub to cubs + ++ncubs[cub_dim(cub)] ; + + if (khalimsky) + cubs.push_back(cub) ; + else + { + int ind(khal_to_index(cub)) ; + cubs.push_back(index_to_coords(ind, false)) ; + } + } + } + } + infile.close() ; + return true ; + } + + bool write_cub(const std::string &filename) ; + + void print_infos (int level = 0) const + { + cout << "CubObject infos - dim : " << dim << ", cubs : " << cubs.size() << endl ; + for (int q=0; q < dim; ++q) + cout << "\tSize along dim " << q << " : " << N[q] << endl ; + for (int q = 0; q <= dim; ++q) + cout << "Cubs of dim " << q << " : " << ncubs[q] << endl ; + if (level == 1) // Print coordinates of cubes + { + for (int i=0; i +#include +#include +#include +#include +#include +#include +const size_t size_t_maxvalue = std::numeric_limits::max() ; + + +#define BITBOARD_INT_SIZE 64 +#define VECTOR_SIZE(size) size / BITBOARD_INT_SIZE + (size % BITBOARD_INT_SIZE != 0) + + + + +/** \brief Table used for fast 64bit log2. */ +const int tab64[64] = { + 63, 0, 58, 1, 59, 47, 53, 2, + 60, 39, 48, 27, 54, 33, 42, 3, + 61, 51, 37, 40, 49, 18, 28, 20, + 55, 30, 34, 11, 43, 14, 22, 4, + 62, 57, 46, 52, 38, 26, 32, 41, + 50, 36, 17, 19, 29, 10, 13, 21, + 56, 45, 25, 31, 35, 16, 9, 12, + 44, 24, 15, 8, 23, 7, 6, 5 +}; + +/** \brief Table used for De Bruijn multiplication. */ +const int index64[64] = { + 0, 47, 1, 56, 48, 27, 2, 60, + 57, 49, 41, 37, 28, 16, 3, 61, + 54, 58, 35, 52, 50, 42, 21, 44, + 38, 32, 29, 23, 17, 11, 4, 62, + 46, 55, 26, 59, 40, 36, 15, 53, + 34, 51, 20, 43, 31, 22, 10, 45, + 25, 39, 14, 33, 19, 30, 9, 24, + 13, 18, 8, 12, 7, 6, 5, 63 +}; + + +namespace OSM { + +/** + * \class Bitboard + * \brief Bitboards are long bitset with specific operations. + * + * Bitboards are used with SparseMatrix to quickly find and set non empty columns. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ +class Bitboard { +private: + /** \brief The inner data storage (a contiguous array of 64 unsigned bit integers). */ + std::vector boards; + + /** \brief The number of bits we want to store. */ + std::size_t _size; + +public: + /** + * \brief Compute fast 64bit int log2. + * \pre The value must have a population count of 1. + * + * \param[in] _value The value we want to get the bit index (i.e. log2). + * \returns The bit position. + */ + static std::size_t bitIndex(std::uint64_t _value) { + if (_value == 1) return 0; + return tab64[((std::uint64_t)((_value - (_value >> 1)) * 0x07EDD5E59A4E28C2)) >> 58] + 1; + } + + /** + * \struct Bitboard::iterator + * \brief The iterator over bitboards. + * + * Return all indexes with a bit set to 1. + * + * \note The iterator is constant. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + struct iterator { + /** C++ mandatory type definitions. */ + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = std::uint64_t; + using pointer = value_type*; + using reference = value_type&; + + /** + * \brief Iterator constructor. + * \param[in] _index The initial index. + * \param[in] _size The bitboard size. + * \param[in] _boards The reference to the bitboards. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + iterator(const std::size_t _index, const std::size_t _size, const std::vector &_boards): + index(_index), + size(_size), + iteratedBoards(_boards), + arrayIndex(0) + { + if (index == 0) ++(*this); + } + + /** + * \brief Iterator dereference. + * \returns A no-null index on the billboard or past-the-end index. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + const std::size_t operator*() const { return index; } + + /** + * \brief Prefix incrementation. Finds the next not-null index. + * \returns The reference to the current iterator. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + iterator& operator++() { + // The iterator rely on bit manipulation that are quite fast on the CPU. + // + // The main ideas come from the chess programming community that deals with 8x8 sparse matrices. + // The LSB1 (Less Significant Bit On) is given by X & -X. + // This same bit can be "reset" using X & (X - 1), which means that all ones remain except the LSB1. + // + // We can use this to iterate through all ones in order. + // The following code scales up this principle for multiple contiguous 64bit bitboards. + std::size_t innerIndex ; //= bitIndex(iteratedBoards[arrayIndex] & -iteratedBoards[arrayIndex]); + if (arrayIndex < iteratedBoards.size()) + { + do { + innerIndex = bitIndex(iteratedBoards[arrayIndex] & -iteratedBoards[arrayIndex]); + index = arrayIndex * BITBOARD_INT_SIZE + innerIndex; + iteratedBoards[arrayIndex] &= iteratedBoards[arrayIndex] - 1; + + arrayIndex += innerIndex / 64; + } while (innerIndex == 64 && arrayIndex < iteratedBoards.size()); + } + + index = index > size ? size : index; + + return *this; + } + + /** + * \brief Postfix incrementation. Finds the next not-null index. + * \returns The pre-incremented iterator. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } + + /** + * \brief Equality check. + * \returns True if the indices are equal. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend bool operator==(const iterator &a, const iterator &b) { return a.index == b.index; } + + /** + * \brief Inequality check. + * \returns True if the indices are different. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend bool operator!=(const iterator &a, const iterator &b) { return a.index != b.index; } + + private: + std::size_t index; + std::size_t arrayIndex; + std::size_t size; + std::vector iteratedBoards; + }; + + /** + * \struct Bitboard::reverse_iterator + * \brief The reverse iterator over bitboards. + * + * Return all indexes with a bit set to 1 in reverse order. + * + * \note The reverse iterator is constant. + * + * \author Bac A. + * \version 0.2.0 + * \date 19/09/2024 + */ + struct reverse_iterator { + /** C++ mandatory type definitions. */ + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = std::uint64_t; + using pointer = value_type*; + using reference = value_type&; + + /** + * \brief Reverse iterator constructor. + * \param[in] _index The initial index. + * \param[in] _size The bitboard size. + * \param[in] _boards The reference to the bitboards. + * + * \author Bac A. + * \version 0.2.0 + * \date 23/05/2024 + */ + reverse_iterator(const std::size_t _index, const std::size_t _size, const std::vector &_boards): + index(_index), + size(_size), + iteratedBoards(_boards), + arrayIndex(index/64) + { + // set 0 for all bits larger than index + if (index < size_t_maxvalue) + { + do { + ++(*this); + } while (index >_index); + } + + } + + /** + * \brief Iterator dereference. + * \returns A no-null index on the billboard or past-the-end index. + * + * \author Bac A. + * \version 0.2.0 + * \date 23/05/2024 + */ + const std::size_t operator*() const { return index; } + + /** + * \brief Prefix incrementation. Finds the next not-null index. + * \returns The reference to the current iterator. + * + * \author Bac A. + * \version 0.2.0 + * \date 23/05/2024 + */ + reverse_iterator& operator++() { + // The reverse iterator rely on bit manipulation that are quite fast on the CPU. + // + // The main ideas come from the chess programming community that deals with 8x8 sparse matrices. + // The MSB1 (Most Significant Bit On) is computed using De Bruijn Multiplication. + // See https://www.chessprogramming.org/BitScan#Index_of_LS1B_by_Popcount + // + // int bitScanReverse(U64 bb) { + // const U64 debruijn64 = C64(0x03f79d71b4cb0a89); + // assert (bb != 0); + // bb |= bb >> 1; + // bb |= bb >> 2; + // bb |= bb >> 4; + // bb |= bb >> 8; + // bb |= bb >> 16; + // bb |= bb >> 32; + // return tab64[(bb * debruijn64) >> 58]; + // } + + // We can use this to iterate through all ones in reverse order. + // The following code scales up this principle for multiple contiguous 64bit bitboards. + // MSB are stored in the rightmost 64bits bitboard. + + std::size_t innerIndex ; //= bitIndex(iteratedBoards[arrayIndex] & -iteratedBoards[arrayIndex]); + if (arrayIndex != size_t_maxvalue) + { + do { + std::size_t bb(iteratedBoards[arrayIndex]) ; + if (bb == 0) + innerIndex == 64 ; + else + { + // Compute MSB1 + const std::size_t debruijn64 = std::size_t(0x03f79d71b4cb0a89); + bb |= bb >> 1; + bb |= bb >> 2; + bb |= bb >> 4; + bb |= bb >> 8; + bb |= bb >> 16; + bb |= bb >> 32; + innerIndex = index64[(bb * debruijn64) >> 58] ; + // Compute corresponding index + index = arrayIndex * BITBOARD_INT_SIZE + innerIndex; + // Reset bit + iteratedBoards[arrayIndex] ^= 1< iteratedBoards; + }; + + /** + * \brief Bitboard default constructor. Initialize bitboard with all zeros and size 64. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard(): boards({0UL}), _size(64) {} + + /** + * \brief Bitboard value intializer. Initialize bitboard with given vector of bitboards. + * + * \param[in] _bitboards The vector of 64bit ints. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard(const std::vector &_bitboard): + boards(_bitboard), + _size(_bitboard.size() * 64) + {} + + /** + * \brief Bitboard size initializer. Initialize bitboard with given size. + * + * \param[in] _size The size of the bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard(const std::size_t _size, bool empty = true): + boards(std::vector(_size / BITBOARD_INT_SIZE + (_size % BITBOARD_INT_SIZE != 0))), + _size(_size) + { if (!empty) bit_not() ; } + + /** + * \brief Bitboard copy constructor. Initialize bitboard with given bitboard. + * + * \param[in] _bitboards The bitboard to copy. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard(const Bitboard &_bitboard): + boards(_bitboard.boards), + _size(_bitboard._size) + {} + + + /** + * \brief Bitboard assign operator. Initialize bitboard with given bitboard. + * + * \param[in] _bitboard The bitboard to copy. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& operator=(const Bitboard &_bitboard) { + this->boards = _bitboard.boards; + this->_size = _bitboard._size; + + return *this; + } + + /** + * \brief Bitwise NOT on a bitboard. + * + * \returns The reference to the NOTed bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& bit_not() { + for (std::size_t i = 0 ; i < boards.size() ; ++i) + { + boards[i] = ~boards[i]; + } + + return *this; + } + + /** + * \brief Bitwise NOT of a bitboard. + * + * \param[in] _bitboard The argument bitboard. + * \returns A new bitboard which is the result of the NOT. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator~(const Bitboard& _bitboard) { + Bitboard res(_bitboard); + return res.bit_not(); + } + + /** + * \brief Bitboard begin iterator that allows to loop through all non-null indices. + * \returns The begin iterator. + * + * \note The iterator is constant. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + iterator begin() const { return iterator(0, _size, boards); } + + /** + * \brief Bitboard past-the-end iterator. + * \returns The past-the-end iterator. + * + * \note The iterator is constant. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + iterator end() const { return iterator(_size, _size, boards); } + + /** + * \brief Bitboard reverse_begin reverse_iterator that allows to loop through all non-null indices in decreasing order. + * \returns The reverse_begin iterator. + * + * \note The reverse_iterator is constant. + * + * \author Bac A. + * \version 0.2.0 + * \date 23/05/2024 + */ + reverse_iterator reverse_begin() const { return reverse_iterator(_size-1, _size, boards); } + reverse_iterator reverse_begin(size_t index) const { std::cout << "reverse with index " << index << std::endl ; return reverse_iterator(index, _size, boards); } + + /** + * \brief Bitboard past-the-end reverse_iterator. + * \returns The past-the-end reverse_iterator. + * + * \note The reverse_iterator is constant. + * + * \author Bac A. + * \version 0.2.0 + * \date 23/05/2024 + */ + reverse_iterator reverse_end() const { return reverse_iterator(size_t_maxvalue, _size, boards); } + + /** + * \brief Stream operator that displays all bits. + * + * \param[in,out] _stream The stream to edit. + * \param[in] _bitboard The bitboard to display. + * \returns The edited stream. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend std::ostream& operator<<(std::ostream &_stream, const Bitboard &_bitboard) { + // Cheat for speed, iterate through all non-null indices and fill the in-between with zeros. + std::size_t last = -1; + for (auto index: _bitboard) { + _stream << std::string(index - last - 1, '0') << "1"; + last = index; + } + // Add the leading zeros. + _stream << std::string(_bitboard._size - last - 1, '0'); + + return _stream; + } + + /** + * \brief Bitwise OR between two bitboards. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the OR. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator|(const Bitboard &_left, const Bitboard &_right) { + Bitboard res = _left; + res |= _right; + return res; + } + + /** + * \brief Bitwise OR between a bitboard and a single bit at given position. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the OR. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator|(const Bitboard &_left, const std::size_t &_right) { + Bitboard res = _left; + res |= _right; + return res; + } + + /** + * \brief Bitwise OR between a bitboard and a single bit at given position. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the OR. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator|(const std::size_t &_left, const Bitboard &_right) { + Bitboard res = _right; + res |= _left; + return res; + } + + /** + * \brief Bitwise AND between two bitboards. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the AND. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator&(const Bitboard &_left, const Bitboard &_right) { + Bitboard res = _left; + res &= _right; + return res; + } + + /** + * \brief Bitwise AND between a bitboard and a single bit at given position. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the AND. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator&(const Bitboard &_left, const std::size_t &_right) { + Bitboard res = _left; + res &= _right; + return res; + } + + /** + * \brief Bitwise AND between a bitboard and a single bit at given position. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the AND. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator&(const std::size_t &_left, const Bitboard &_right) { + Bitboard res = _right; + res &= _left; + return res; + } + + /** + * \brief Bitwise XOR between two bitboards. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the XOR. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator^(const Bitboard &_left, const Bitboard &_right) { + Bitboard res = _left; + res ^= _right; + return res; + } + + /** + * \brief Bitwise XOR between a bitboard and a single bit at given position. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the XOR. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator^(const Bitboard &_left, const std::size_t &_right) { + Bitboard res = _left; + res ^= _right; + return res; + } + + /** + * \brief Bitwise XOR between a bitboard and a single bit at given position. + * + * \param[in] _left The left hand side. + * \param[in] _right The right hand side. + * \returns A new bitboard which is the result of the XOR. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + friend Bitboard operator^(const std::size_t &_left, const Bitboard &_right) { + Bitboard res = _right; + res ^= _left; + return res; + } + + /** + * \brief Bitwise OR between two bitboards. + * + * \param[in] _other The other bitboard. + * \returns The reference to the ORed bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& operator|=(const Bitboard &_other) { + for (std::size_t i = 0 ; i < boards.size() ; i++) { + boards[i] |= _other.boards[i]; + } + + return *this; + } + + /** + * \brief Bitwise OR between a bitboard and a single bit at given position. + * + * \param[in] _other The bit position. + * \returns The reference to the ORed bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& operator|=(const std::size_t &_other) { + std::size_t boardIndex = _other / BITBOARD_INT_SIZE; + std::uint64_t bit = 1ULL << (_other % BITBOARD_INT_SIZE); + + boards[boardIndex] |= bit; + return *this; + } + + /** + * \brief Bitwise AND between two bitboards. + * + * \param[in] _other The other bitboard. + * \returns The reference to the ANDed bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& operator&=(const Bitboard &_other) { + for (std::size_t i = 0 ; i < boards.size() ; i++) { + boards[i] &= _other.boards[i]; + } + + return *this; + } + + /** + * \brief Bitwise AND between a bitboard and a single bit at given position. + * + * \param[in] _other The bit position. + * \returns The reference to the ANDed bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& operator&=(const std::size_t &_other) { + std::size_t boardIndex = _other / BITBOARD_INT_SIZE; + std::uint64_t bit = 1ULL << (_other % BITBOARD_INT_SIZE); + + boards[boardIndex] &= bit; + return *this; + } + + /** + * \brief Bitwise XOR between two bitboards. + * + * \param[in] _other The other bitboard. + * \returns The reference to the XORed bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& operator^=(const Bitboard &_other) { + for (std::size_t i = 0 ; i < boards.size() ; i++) { + boards[i] ^= _other.boards[i]; + } + + return *this; + } + + /** + * \brief Bitwise XOR between a bitboard and a single bit at given position. + * + * \param[in] _other The bit position. + * \returns The reference to the XORed bitboard. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + Bitboard& operator^=(const std::size_t &_other) { + std::size_t boardIndex = _other / BITBOARD_INT_SIZE; + std::uint64_t bit = 1ULL << (_other % BITBOARD_INT_SIZE); + + boards[boardIndex] ^= bit; + return *this; + } + + /** + * \brief Toggle on and off a given bit. + * + * \param[in] _index The bit position. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + void toggle(const std::size_t &_index) { + *this ^= _index; + } + + /** + * \brief Toggle on a given bit. + * + * \param[in] _index The bit position. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + void setOn(const std::size_t &_index) { + *this |= _index; + } + + /** + * \brief Toggle off a given bit. + * + * \param[in] _index The bit position. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + void setOff(const std::size_t &_index) { + std::size_t boardIndex = _index / BITBOARD_INT_SIZE; + std::uint64_t bit = 1ULL << (_index % BITBOARD_INT_SIZE); + + boards[boardIndex] &= ~bit; + } + + bool isOn(const std::size_t &_index) const { + std::size_t boardIndex = _index / BITBOARD_INT_SIZE; + std::uint64_t bit = 1ULL << (_index % BITBOARD_INT_SIZE); + + return (boards[boardIndex] & bit) != 0; + } + + size_t size() const { return _size ; } +}; + +} + +#endif diff --git a/HDVF/include/CGAL/OSM/Chain.hpp b/HDVF/include/CGAL/OSM/Chain.hpp new file mode 100644 index 000000000000..b594cce5fc08 --- /dev/null +++ b/HDVF/include/CGAL/OSM/Chain.hpp @@ -0,0 +1,980 @@ +/** + * \file Chain.hpp + * \brief Namespace file for describing library. + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + * + * Define everything for the Chain class + */ + +#ifndef __OSM_CHAIN__ +#define __OSM_CHAIN__ + + +#include "__base.hpp" +#include "SparseMatrix.hpp" +#include +#include +#include +#include + + +namespace OSM { + +/** + * \class Chain + * \brief Allow to create row/column sparse vectors. + * + * The Chain class contains all algebraic functions that are related to vectors. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +class Chain { + +public: + typedef std::pair pair; + typedef typename std::unordered_map::iterator iterator; + typedef typename std::unordered_map::const_iterator const_iterator; + + // Add these lines to allow the SparseMatrix class to access other templated + // SparsedMatrix private members. + template + friend class Chain; + template + friend class SparseMatrix; +protected: + /** \brief The chain inner representation and storage of data. */ + std::unordered_map chainData; + + /** \brief The chain coefficient type. */ + typedef _CoefficientType coefficientType; + + /** \brief The chain type flag. */ + int chainTypeFlag = _ChainTypeFlag; + + /** \brief The chain boundary. */ + int upperBound; + +public: + /** + * \brief Create new Chain for SparseMatrix object. + * + * Default constructor, initialize an empty Chain as a Z integers column chain. + * The default chain size is 128. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain() { + upperBound = 0; + chainData = std::unordered_map(); + } + + /** + * \brief Create new Chain for SparseMatrix object. + * + * Constructor with size, initialize an empty Chain as a Z integers column chain with boundary check. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _chainSize The upper bound of the Chain. + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain(const int _chainSize) { + upperBound = _chainSize; + chainData = std::unordered_map(); + } + + /** + * \brief Size of the chain + * + * \return Size of the chain (upperBound) + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + size_t dimension() const { return upperBound ; } + + /** + * \brief Create new Chain for SparseMatrix object. + * + * Copy constructor, initialize a Chain based on the same type of chain. + * The resulting chain will be a copy of the passed chain. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the other chain is not the same coefficient type. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _otherToCopy The chain we want to copy. + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain(const Chain &_otherToCopy) { + upperBound = _otherToCopy.upperBound; + chainData = _otherToCopy.chainData; +// *this = _otherToCopy; + } + + /** + * \brief Assign to other chain. + * + * Assign to other chain coefficient-wise, equivalent to copying it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the other chain is not the same coefficient type. + * + * \param[in] _otherToCopy The chain we want to copy. + * + * \return The reference to the modified chain. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator=(const Chain &_otherToCopy) { + upperBound = _otherToCopy.upperBound; + chainData = _otherToCopy.chainData; + + return *this; + } + + /** + * \brief Displays a Chain in the output stream. + * + * \param[in] _stream The output stream. + * \param[in] _chain The chain to display. + * + * \return A reference to the modified stream. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend std::ostream& operator<<(std::ostream &_stream, const Chain &_chain) { + _stream << "["; + for (const_iterator i = _chain.chainData.begin() ; i != _chain.chainData.end() ; ++i) { + _stream << i->first << ": " << i->second << ", "; + } + + if (_chain.chainData.size() > 0) { + _stream << "\b\b"; + } + _stream << "]"; + + return _stream; + } + + /** + * \brief Adds two chains together. + * + * Adds each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _first The first chain. + * \param[in] _second The second chain. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator+(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { + Chain newChain = _first; + newChain += _second; + + return newChain; + } + + /** + * \brief Substract two chains together. + * + * Substract each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _first The first chain. + * \param[in] _second The second chain. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator-(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { + Chain newChain = _first; + newChain -= _second; + + return newChain; + } + + /** + * \brief Apply factor on each coefficients. + * + * \param[in] _lambda The factor to apply. + * \param[in] _chain The second chain. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator*(const _CoefficientType& _lambda, const Chain<_CoefficientType, _CTF> &_chain) { + Chain newChain = _chain; + newChain *= _lambda; + + return newChain; + } + + /** + * \brief Apply factor on each coefficients. + * + * \param[in] _chain The second chain. + * \param[in] _lambda The factor to apply. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator*(const Chain<_CoefficientType, _CTF> &_chain, const _CoefficientType& _lambda) { + Chain newChain = _chain; + newChain *= _lambda; + + return newChain; + } + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + + /** + * \brief Perform dot product between two chains. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _row The row chain. + * \param[in] _column The column chain. + * + * \return The result of type _CoefficientType. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend _CT operator*(const Chain<_CT, ROW> &_row, const Chain<_CT, COLUMN> &_column); + + /** + * \brief Add a chain and assign. + * + * Adds each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _other The other chain. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator+=(const Chain &_other) { + if (this->upperBound != _other.upperBound) { + throw std::runtime_error("Chains must be the same size."); + } + + for (pair pair: _other.chainData) { + this->chainData[pair.first] += pair.second; + + if (this->chainData[pair.first] == 0) { + this->chainData.erase(pair.first); + } + } + + return *this; + } + + /** + * \brief Substract a chain and assign. + * + * Substract each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _other The other chain. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator-=(const Chain &_other) { + if (this->upperBound != _other.upperBound) { + throw std::runtime_error("Chains must be the same size."); + } + + for (pair pair: _other.chainData) { + this->chainData[pair.first] -= pair.second; + + if (this->chainData[pair.first] == 0) { + this->chainData.erase(pair.first); + } + } + + return *this; + } + + /** + * \brief Apply factor on each coefficients and assign. + * + * \param[in] _lambda The factor to apply. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator*=(const _CoefficientType& _lambda) { + if (_lambda == 0) { + this->chainData.clear(); + return *this; + } + + for (pair pair: this->chainData) { + this->chainData[pair.first] = pair.second * _lambda; + } + + return *this; + } + + /** + * \brief Get a coefficient from the chain. + * + * \warning The chain will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The coefficient stored in the chain. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + _CoefficientType operator[](const int _index) const { + if (_index >= upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); + } + + return chainData.at(_index); + } + + /** + * \brief Set a coefficient in the chain. + * + * \warning The chain will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The reference to the assigned coefficient. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + _CoefficientType& operator[](const int _index) { + if (_index >= upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); + } + + return chainData[_index]; + } + + /** + * \brief Checks if a coefficient is null. Should be used instead of operator[] for that case. + * + * \param[in] _index The index to check. + * \return True if the data is null at given index. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 29/05/2024 + */ + const bool isNull(const int _index) const { + return chainData.find(_index) == chainData.end(); + } + + /** + * \brief Checks if the chain is null. + * + * \return True if the chain is null. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 29/05/2024 + */ + const bool isNull() const { + return chainData.size() == 0; + } + + /** + * \brief Get a subchain from the chain. + * + * Removes all indexes provided in the vector from the chain and returns it. + * + * \note Will return a copy of the chain if given vector is empty. + * + * \param[in] _chain The chain to process. + * \param[in] _indexes The indexes to remove. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes); + + /** + * \brief Get a subchain from the chain. + * + * Removes the index provided from the chain and returns it. + * + * \note Will return a copy of the chain if given vector is empty. + * + * \param[in] _chain The chain to process. + * \param[in] _index The index to remove. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _indexes); + + /** + * \brief Get a subchain from the chain and assign. + * + * Removes all indexes provided in the vector from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator/=(const std::vector &_indexes) { + for (int index : _indexes) { + this->chainData.erase(index); + } + + return *this; + } + + /** + * \brief Get a subchain from the chain and assign. + * + * Removes the index provided from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _index The index to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator/=(const int _index) { + this->chainData.erase(_index); + + return *this; + } + + /** + * \brief Set all coefficients to zero. + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + void nullify() { + this->chainData.clear(); + } + + /** + * \brief Iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The iterator to the beginning of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::iterator \endlink + * \see \link std::unordered_map::begin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + iterator begin() noexcept { + return chainData.begin(); + } + + /** + * \brief Constant iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the beginning of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::begin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator begin() const noexcept { + return chainData.begin(); + } + + /** + * \brief Constant iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the beginning of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::cbegin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator cbegin() const noexcept { + return chainData.cbegin(); + } + + /** + * \brief Iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The iterator to the end of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::iterator \endlink + * \see \link std::unordered_map::end \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + iterator end() noexcept { + return chainData.end(); + } + + /** + * \brief Constant iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the end of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::end \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator end() const noexcept { + return chainData.end(); + } + + /** + * \brief Constant iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the end of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::cend \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator cend() const noexcept { + return chainData.cend(); + } + + /** + * \brief Transpose a Chain. + * + * \return A new chain where the chain type flag is changed. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { + Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> chain; + + chain.upperBound = this->upperBound; + for (pair pair: this->chainData) { + chain.chainData[pair.first] = pair.second; + } + + return chain; + } + + /** + * \brief Checks if chain is a column. + * + * \return true if chain is represented as a column, false otherwise. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + bool isColumn() const { + return _ChainTypeFlag == COLUMN; + } + + /** + * \brief Checks if chain is a row. + * + * \return true if chain is represented as a row, false otherwise. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + bool isRow() const { + return _ChainTypeFlag == ROW; + } +}; + + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + SparseMatrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); + + for (std::pair pair : _row.chainData) { + OSM::setColumn(matrix,pair.first,_column * pair.second) ; + } + + return matrix; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + SparseMatrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); + + for (std::pair pair : _column.chainData) { + OSM::setRow(matrix,pair.first,_row * pair.second); + } + + return matrix; +} + +/** + * \brief Perform dot product between two chains. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _row The row chain. + * \param[in] _column The column chain. + * + * \return The result of type _CoefficientType. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +_CoefficientType operator*(const Chain<_CoefficientType, ROW> &_row, const Chain<_CoefficientType, COLUMN> &_column) { + // Get indexes (avoid adding double indexes). + std::unordered_map indexes; + for (std::pair pair: _row.chainData) { + indexes[pair.first] = 1; + } + for (std::pair pair: _column.chainData) { + indexes[pair.first] += 1; + } + + // Perform dot product + _CoefficientType result = _CoefficientType(); + for (std::pair index: indexes) { + if (index.second == 2) { + result += _row.chainData.at(index.first) * _column.chainData.at(index.first); + } + } + + return result; +} + +/** + * \brief Get a subchain from the chain and assign. + * + * Removes all indexes provided in the vector from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes) { + Chain newChain = _chain; + newChain /= _indexes; + return newChain; +} + +/** + * \brief Get a subchain from the chain and assign. + * + * Removes the index provided from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _index The index to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _index) { + Chain newChain = _chain; + newChain /= _index; + return newChain; +} + +} + +#endif diff --git a/HDVF/include/CGAL/OSM/OSM.hpp b/HDVF/include/CGAL/OSM/OSM.hpp new file mode 100644 index 000000000000..64aade86e820 --- /dev/null +++ b/HDVF/include/CGAL/OSM/OSM.hpp @@ -0,0 +1,20 @@ +/** + * \file OSM.hpp + * \brief Namespace file for describing library. + * \author Fedyna K. + * \version 0.1.0 + * \date 02/04/2024 + * + * Include all the Optimised Sparsed Matrix (OSM) library. + * Should be included directly. + */ + +#ifndef __OPTIMISED_SPARSED_MATRIX__ +#define __OPTIMISED_SPARSED_MATRIX__ + +//#define DEBUG +#include "__base.hpp" +#include "Chain.hpp" +#include "SparseMatrix.hpp" + +#endif diff --git a/HDVF/include/CGAL/OSM/SparseMatrix.hpp b/HDVF/include/CGAL/OSM/SparseMatrix.hpp new file mode 100644 index 000000000000..f6967ba6c844 --- /dev/null +++ b/HDVF/include/CGAL/OSM/SparseMatrix.hpp @@ -0,0 +1,2625 @@ +/** + * \file SparseMatrix.hpp + * \brief Namespace file for describing library. + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + * + * Define everything for the SparseMatrix class + */ + +#ifndef __OSM_SPARSE_MATRIX__ +#define __OSM_SPARSE_MATRIX__ + + +#include "Chain.hpp" +#include "Bitboard.hpp" +#include +#include +#include + +// DEBUG : matrix output for SparseMatrices / no DEBUG : chain output for SparseMatrices +//#define DEBUG + +namespace OSM { + +/** + * \class SparseMatrix + * \brief Vector implementation of sparse matrices. + * + * The SparseMatrix class contains all algebraic functions that are related to OSM matrices (optimized sparse matrices). + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +class SparseMatrix { + +public: + typedef Chain<_CoefficientType, _ChainTypeFlag> MatrixChain; + + // Add these lines to allow the SparseMatrix class to access other templated + // SparsedMatrix private members. + template + friend class SparseMatrix; + +protected: + /** \brief The inner chain storage. */ + std::vector> chains; + + /** \brief A bitboard containing state of each columns. */ + Bitboard chainsStates; + + /** \brief The matrix size as a (row, column) pair. */ + std::pair size; + + /** + * \brief Get a chain from a matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The reference to the chain stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + MatrixChain& operator[](const int _index) { + if (_ChainTypeFlag == COLUMN && _index >= size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); + } + if (_ChainTypeFlag == ROW && _index >= size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); + } + + chainsStates |= _index; + return chains[_index]; + } + +public: + /** + * \brief Create new SparseMatrix object. + * + * Default constructor, initialize an empty Matrix as Z integers column chains. + * The default matrix size is 128x128. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix() { + chains = std::vector(0); + chainsStates = Bitboard(0); + size = {0, 0}; + } + + /** + * \brief Create new SparseMatrix object. + * + * Constructor with size, initialize an empty Matrix as Z integers column chains. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _rowCount The number of rows to preallocate. + * \param[in] _columnCount The number of columns to preallocate. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix(const int _rowCount, const int _columnCount) { + int mainSize = _ChainTypeFlag == COLUMN ? _columnCount : _rowCount; + int secondarySize = _ChainTypeFlag == COLUMN ? _rowCount : _columnCount; + + chains = std::vector>(mainSize); + for (int i = 0 ; i < mainSize ; i++) { + chains[i] = Chain<_CoefficientType, _ChainTypeFlag>(secondarySize); + } + + chainsStates = Bitboard(mainSize); + size = {_rowCount, _columnCount}; + } + + /** + * \brief Create new SparseMatrix from other SparseMatrix object. + * + * Copy constructor, initialize a SparseMatrix (not necessarly based on the same type of matrix). + * If types are different, the constructor performs conversion. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _otherToCopy The matrix we want to copy. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + SparseMatrix(const SparseMatrix<_CoefficientType,CTF> &_otherToCopy) { +// *this = _otherToCopy; + if (_ChainTypeFlag == CTF) + { + chainsStates = _otherToCopy.chainsStates; + size = _otherToCopy.size; + // Copy of chains as such + chains.resize(_otherToCopy.chains.size()) ; + for (int i = 0; i<_otherToCopy.chains.size(); ++i) + { + const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; + Chain<_CoefficientType,_ChainTypeFlag> res(tmp.dimension()) ; + for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + res[it->first] = it->second ; + } + chains[i] = res ; + } + } + else // Copy coefficient by coefficient + { + size = _otherToCopy.size; + int vec_size = (_ChainTypeFlag == OSM::COLUMN)?size.second:size.first ; + int chain_size = (_ChainTypeFlag == OSM::COLUMN)?size.first:size.second ; + chains.resize(vec_size) ; + chainsStates = OSM::Bitboard(vec_size) ; + for (int i=0; i(chain_size) ; + } + + for (int i = 0; i<_otherToCopy.chains.size(); ++i) + { + const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; + for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + chains[it->first][i] = it->second ; + chainsStates.setOn(it->first) ; + } + } + } + } + + /** + * \brief Assign to other matrix. + * + * Assign to other matrix coefficient-wise, equivalent to copying it. + * + * \pre The matrices must have the same type. + * + * \param[in] _otherToCopy The matrix we want to copy. + * + * \return The reference to the modified matrix. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator=(const SparseMatrix& _otherToCopy) + { + chainsStates = _otherToCopy.chainsStates; + size = _otherToCopy.size; + chains = _otherToCopy.chains; + + return *this; + } + + + /** + * \brief Clean a SparseMatrix (set everything to zero) + * + * Empty all structures of the sparse matrix. + * + * \warning Will raise an error if the other matrix is not the same chain type. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + void nullify() { + std::vector coefs ; + for (OSM::Bitboard::iterator it = begin(); it != end(); ++it) + { + coefs.push_back(*it) ; + } + *this /= coefs ; + } + + /** + * \brief Displays a SparseMatrix in the output stream. + * + * \param[in] _stream The output stream. + * \param[in] _matrix The matrix to display. + * + * \return A reference to the modified stream. + * + * \see \link OSM::Matrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend std::ostream& operator<<(std::ostream &_stream, const SparseMatrix &_matrix) { +#ifndef DEBUG + bool empty = true; + + _stream << "["; + for (int index : _matrix.chainsStates) { + empty = false; + _stream << index << ": " << _matrix.chains[index] << ", "; + } + + if (!empty) { + _stream << "\b\b"; + } + _stream << "]" << std::endl ; +#else + for (int i=0; i<_matrix.size.first; ++i) + { + for (int j=0; j<_matrix.size.second; ++j) + { + + //_CoefficientType tmp = _matrix[j][i] ; // get_coef(i,j) ; + _CoefficientType tmp = _matrix.get_coef(i,j) ; + + if (tmp == 0) + _stream << ".\t" ; + else + _stream << tmp << "\t" ; + } + _stream << std::endl ; + } +#endif + + return _stream; + } + + + /** + * \brief Adds two matrices together. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrixs have the same chain type. + * + * \warning Will raise an error if the other matrix is not the same chain type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator+(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { + SparseMatrix newMatrix(_first); + newMatrix += _second; + + return newMatrix; + } + + /** + * \brief Substracts two matrices together. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrixs have the same chain type. + * + * \warning Will raise an error if the other matrix is not the same chain type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator-(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { + SparseMatrix newMatrix = _first; + newMatrix -= _second; + + return newMatrix; + } + + /** + * \brief Apply factor on each coefficients. + * + * \warning Will raise an error if _lambda is 0. + * + * \param[in] _lambda The factor to apply. + * \param[in] _matrix The matrix. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator*(const _CT& _lambda, const SparseMatrix<_CT, _CTF> &_matrix) { + SparseMatrix newMatrix = _matrix; + newMatrix *= _lambda; + + return newMatrix; + } + + /** + * \brief Apply factor on each coefficients. + * + * \warning Will raise an error if _lambda is 0. + * + * \param[in] _matrix The matrix. + * \param[in] _lambda The factor to apply. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator*(const SparseMatrix<_CT, _CTF> &_matrix, const _CT& _lambda) { + SparseMatrix newMatrix = _matrix; + newMatrix *= _lambda; + + return newMatrix; + } + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Perform multiplication between a column-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second); + + /** + * \brief Perform multiplication between a row-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second); + + /** + * \brief Perform multiplication between a row-based chain and a row-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) ; + + /** + * \brief Perform multiplication between a row-based chain and a column-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) ; + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator+=(const SparseMatrix &_other) { + if (this->size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index: _other.chainsStates) { + this->chainsStates |= index; + this->chains[index] += _other.chains[index]; + + if (this->chains[index].isNull()) { + this->chainsStates.setOff(index); + } + } + + return *this; + } + + /** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator-=(const SparseMatrix &_other) { + if (this->size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index: _other.chainsStates) { + this->chainsStates |= index; + this->chains[index] -= _other.chains[index]; + + if (this->chains[index].isNull()) { + this->chainsStates.setOff(index); + } + } + + return *this; + } + + + /** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Apply factor on each coefficients and assign. + * + * \warning Will raise an error if _lambda is 0. + * + * \param[in] _lambda The factor to apply. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator*=(const _CoefficientType& _lambda) { + if (_lambda == 0) { + *this = SparseMatrix(); + return *this; + } + + for (int index: this->chainsStates) { + this->chains[index] *= _lambda; + } + + return *this; + } + + /** + * \brief Compute the negative of a matrix (unary operator). + * + * \return The resulting matrix. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 07/09/2024 + */ + friend SparseMatrix operator-(const SparseMatrix& _matrix) { + SparseMatrix res(_matrix.size.first, _matrix.size.second) ; + + for (int index: _matrix.chainsStates) + { + const MatrixChain& tmp_chain(_matrix.chains[index]) ; + for (typename MatrixChain::const_iterator it = tmp_chain.cbegin(); it != tmp_chain.cend(); ++it) + res[index][it->first] = -it->second ; + } + return res ; + } + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Get a chain from a const matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The chain stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + MatrixChain operator[](const int _index) const { + if (_ChainTypeFlag == COLUMN && _index >= size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); + } + if (_ChainTypeFlag == ROW && _index >= size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); + } + + return chains[_index]; + } + + /** + * \brief Set a given coefficient. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _i The row index. + * \param[in] _j The column index. + * \param[in] _d The value. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + void set_coef(const int _i, const int _j, const _CoefficientType _d) { + if (_i >= size.first) { + throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); + } + if (_j >= size.second) { + throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); + } + + + if (_ChainTypeFlag == COLUMN) + { + (*this)[_j][_i] = _d ; + } + else + (*this)[_i][_j] = _d ; + } + +/** + * \brief Get a given coefficient. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _i The row index. + * \param[in] _j The column index. + * + * \return The value of the given coefficient. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + + _CoefficientType get_coef(const int _i, const int _j) const { + if (_i >= size.first) { + //std::cout << "Provided _i index should be less than " << size.first << "." << std::endl; + throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); + } + if (_j >= size.second) { + //std::cout << "Provided _j index should be less than " << size.second << "." << std::endl; + throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); + } + + + if (_ChainTypeFlag == COLUMN) + return (*this)[_j][_i] ; + else // ROW + return (*this)[_i][_j] ; + } + + /** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + + /** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + + /** + * \brief Get a const reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a const reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + + /** + * \brief Get a reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index); + + + /** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + + /** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + + /** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + + /** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + + /** + * \brief Get a submatrix from the matrix. + * + * Removes all indexes provided in the vector from the matrix and returns it. + * + * \note Will return a copy of the matrix if given vector is empty. + * \note The submatrix will be rectangular. + * + * \param[in] _matrix The matrix to process. + * \param[in] _indexes The indexes to remove. + * + * \return A new matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend SparseMatrix operator/(const SparseMatrix &_matrix, const std::vector &_indexes) { + SparseMatrix res(_matrix); + res /= _indexes; + return res; + } + + /** + * \brief Get a submatrix from the matrix. + * + * Removes index from the matrix and returns it. + * + * \note Will return a copy of the matrix if given vector is empty. + * \note The submatrix will be rectangular. + * + * \param[in] _matrix The matrix to process. + * \param[in] _index The index to remove. + * + * \return A new matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend SparseMatrix operator/(const SparseMatrix &_matrix, const int _index) { + SparseMatrix res(_matrix); + res /= _index; + return res; + } + + /** + * \brief Get a submatrix from the matrix and assign. + * + * Removes all indexes provided in the vector from the matrix and returns it. + * + * \note Will not alter the matrix if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator/=(const std::vector &_indexes) { + for (int index : _indexes) { + *this /= index; + } + + return *this; + } + + /** + * \brief Get a submatrix from the matrix and assign. + * + * Removes index from the matrix and returns it. + * + * \note Will return a copy of the matrix if given vector is empty. + * \note The submatrix will be rectangular. + * + * \param[in] _index The index to remove. + * + * \return A new matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator/=(const int _index) { + chains[_index].nullify(); + chainsStates.setOff(_index); + + return *this; + } + + /** + * \brief Get a submatrix from the matrix and assign. + * + * Removes all indexes provided in the vector from the matrix and returns it. + * + * \note Will not alter the matrix if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& delColumn(int _index) { + std::vector tmp_id{_index} ; + if (_ChainTypeFlag == OSM::COLUMN) + { + (*this)/=tmp_id ; + } + else // OSM::ROW + { + for (int index : chainsStates) + { + MatrixChain &tmp(chains[index]) ; + tmp/=tmp_id ; + // If the row index has become empty: update + if (tmp.isNull()) + *this /= std::vector({index}) ; + } + } + + return *this; + } + + SparseMatrix& delRow(int _index) + { + std::vector tmp_id{_index}; + if (_ChainTypeFlag == OSM::ROW) { + (*this) /= tmp_id; + } else // OSM::COLUMN + { + for (int index : chainsStates) { + MatrixChain &tmp(chains[index]); + tmp /= tmp_id; + // If the column index has become empty: update + if (tmp.isNull()) + *this /= std::vector({index}) ; + } + } + + return *this; + } + + SparseMatrix& delCoef(int _index1, int _index2) + { + + if (_ChainTypeFlag == OSM::COLUMN) { + std::vector tmp_id({_index1}) ; + MatrixChain &tmp(chains[_index2]); + tmp /= tmp_id; + if (tmp.isNull()) + chainsStates.setOff(_index2) ; + } else // OSM::ROW + { + std::vector tmp_id({_index2}) ; + MatrixChain &tmp(chains[_index1]); + tmp /= tmp_id; + if (tmp.isNull()) + chainsStates.setOff(_index1) ; + } + + return *this; + } + + /** + * \brief Iterator to the beginning of the chains indices. + * + * \return The iterator to the beginning of the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::begin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::iterator begin() noexcept { return chainsStates.begin(); } + + /** + * \brief Iterator to the ending of the chains indices. + * + * \return The iterator to the ending of the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::end \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::iterator end() noexcept { return chainsStates.end(); } + + /** + * \brief Reverse iterator to the chains indices. + * + * \return The reverse iterator to the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::begin \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::reverse_iterator reverse_begin() noexcept { return chainsStates.reverse_begin(); } + inline Bitboard::reverse_iterator reverse_begin(size_t index) noexcept { return chainsStates.reverse_begin(index); } + + /** + * \brief Reverse iterator to the ending of the chains indices. + * + * \return The reverse iterator to the ending of the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::end \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::reverse_iterator reverse_end() noexcept { return chainsStates.reverse_end(); } + + + /** + * \brief Transpose a matrix. + * + * \return A new matrix where the chain type flag is changed. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { + SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transposed(this->size.second, this->size.first); + + for (int index : this->chainsStates) { + transposed.chains[index] = this->chains[index].transpose(); + } + + transposed.chainsStates = this->chainsStates; + + return transposed; + } + + /** + * \brief Gets the matrix size. + * + * \return The matrix size as a Row/Column pair. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 06/05/2024 + */ + std::pair dimensions() const { + return this->size; + } +}; + + + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform col-col matrix multiplication with linear combination of columns. + for (int index: _second.chainsStates) { + Chain<_CT, COLUMN> column(_first.size.first); + + for (std::pair colRight: _second.chains[index]) { + if (_first.chainsStates.isOn(colRight.first)) { + column += colRight.second * _first.chains[colRight.first]; + } + } + + res[index] = column; + } + + return res; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int colRight: _second.chainsStates) { + Chain<_CT, COLUMN> column(_first.size.first); + + for (int rowLeft: _first.chainsStates) { + _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; + if (coef != 0) { + column[rowLeft] = coef; + } + } + + res[colRight] = column; + } + + return res; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int colLeft: _first.chainsStates) { + res += _first.chains[colLeft] * _second.chains[colLeft]; + } + + return res; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int i = 0 ; i < _second.size.second ; i++) { + Chain<_CT, COLUMN> column(_first.size.first); + + for (int rowLeft: _first.chainsStates) { + _CT coef = _first.chains[rowLeft] * getColumn(_second, i); + if (coef != 0) { + column[rowLeft] = coef; + } + } + + if (!column.isNull()) { + res[i] = column; + } + } + + return res; +} + +/** + * \brief Perform multiplication between a column-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second) +{ + // Perform col-col matrix multiplication with linear combination of columns. + Chain<_CT, COLUMN> column(_first.size.first); + + for (typename Chain<_CT, COLUMN>::const_iterator it = _second.begin(); it != _second.end(); ++it) + { + column += it->second * _first.chains[it->first]; + } + + return column; +} + +/** + * \brief Perform multiplication between a row-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second) +{ + // Perform row-col matrix multiplication with dots + Chain<_CT, COLUMN> column(_first.size.first); + + for (int index : _first.chainsStates) + { + _CT tmp(_first[index] * _second) ; + if (tmp != 0) + column[index] = tmp ; + } + return column; +} + +/** + * \brief Perform multiplication between a row-based chain and a row-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) +{ + // Perform row-row matrix multiplication with linear combination of rows. + Chain<_CT, ROW> row(_second.size.second); + + for (typename Chain<_CT, ROW>::const_iterator it = _first.begin(); it != _first.end(); ++it) + { + row += it->second * _second.chains[it->first]; + } + + return row; +} + +/** + * \brief Perform multiplication between a row-based chain and a column-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) +{ + // Perform row-col matrix multiplication with dots + Chain<_CT, ROW> row(_second.size.second); + + for (int index : _second.chainsStates) + { + _CT tmp(_first * _second[index]) ; + if (tmp != 0) + row[index] = tmp ; + } + return row; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + for (int i = 0 ; i < _first.size.first ; i++) { + Chain<_CT, ROW> row(_second.size.second); + + for (int colRight: _second.chainsStates) { + _CT coef = getRow(_first, i) * _second.chains[colRight]; + if (coef != 0) { + row[colRight] = coef; + } + } + + if (!row.isNull()) { + res[i] = row; + } + } + + return res; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int rowLeft: _first.chainsStates) { + Chain<_CT, ROW> row(_second.size.second); + + for (int colRight: _second.chainsStates) { + _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; + if (coef != 0) { + row[colRight] = coef; + } + } + + res[rowLeft] = row; + } + + return res; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int colLeft: _first.chainsStates) { + res += _first.chains[colLeft] % _second.chains[colLeft]; + } + + return res; +} + +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + // Perform row-row matrix multiplication with linear combination of rows. + for (int index: _first.chainsStates) { + Chain<_CT, ROW> row(_second.size.second); + + for (std::pair colRight: _first.chains[index]) { + if (_first.chainsStates.isOn(colRight.first)) { + row += colRight.second * _second.chains[colRight.first]; + } + } + + res[index] = row; + } + + return res; +} + +/** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index = 0 ; index < _other.size.second ; index++) { + Chain column = getColumn(_other, index); + if (!column.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] += getColumn(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} + +/** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index = 0 ; index < _other.size.first ; index++) { + Chain row = getRow(_other, index); + if (!row.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] += getRow(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} + +/** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index = 0 ; index < _other.size.second ; index++) { + Chain column = getColumn(_other, index); + if (!column.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] -= getColumn(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} + +/** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index = 0 ; index < _other.size.second ; index++) { + Chain row = getRow(_other, index); + if (!row.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] -= getRow(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} + +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + _matrix = _matrix * _other; + return _matrix; +} + +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + _matrix = _matrix % _other; + return _matrix; +} + +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + _matrix = _matrix * _other; + return _matrix; +} + +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + _matrix = _matrix % _other; + return _matrix; +} + +/** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { + return _matrix.chains[_index]; +} + +/** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { + Chain<_CT, COLUMN> column(_matrix.size.first); + if (_matrix.size.first > 0) + { + for (int i : _matrix.chainsStates) { + if (!_matrix.chains[i].isNull(_index)) { + column[i] = _matrix.chains[i][_index]; + } + } + } + + return column; +} + +/** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { + Chain<_CT, ROW> row(_matrix.size.second); + if (_matrix.size.second > 0) + { + for (int i : _matrix.chainsStates) { + if (!_matrix.chains[i].isNull(_index)) { + row[i] = _matrix.chains[i][_index]; + } + } + } + + return row; +} + +/** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { + return _matrix.chains[_index]; +} + +/** + * \brief Get a const reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) +{ + if (_index >= _matrix.size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Get a const reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) +{ + if (_index >= _matrix.size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Get a reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index) +{ + if (_index >= _matrix.size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Get a reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index) +{ + if (_index >= _matrix.size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { + if(_matrix.dimensions().first != _chain.dimension()) + throw std::runtime_error("setColumn dimension error") ; + _matrix[_index] = _chain; + if (_chain.isNull()) + _matrix.chainsStates.setOff(_index) ; +} + +/** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { + if(_matrix.dimensions().first != _chain.dimension()) + throw std::runtime_error("setColumn dimension error") ; + for (int i = 0 ; i < _matrix.size.first ; i++) { + if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { + _matrix.chains[i] /= _index; + + if (_matrix.chains[i].isNull()) { + _matrix.chainsStates.setOff(i); + } + } + + if (!_chain.isNull(i)) { + _matrix.chainsStates |= i; + _matrix.chains[i][_index] = _chain[i]; + } + } +} + +/** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { + if(_matrix.dimensions().second != _chain.dimension()) + throw("setColumn dimension error") ; + for (int i = 0 ; i < _matrix.size.second ; i++) { + if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { + _matrix.chains[i] /= _index; + + if (_matrix.chains[i].isNull()) { + _matrix.chainsStates.setOff(i); + } + } + + if (!_chain.isNull(i)) { + _matrix.chainsStates |= i; + _matrix.chains[i][_index] = _chain[i]; + } + } +} + +/** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { + if(_matrix.dimensions().second != _chain.dimension()) + throw("setColumn dimension error") ; + _matrix[_index] = _chain; + if (_chain.isNull()) + _matrix.chainsStates.setOff(_index) ; +} + +} + +#endif diff --git a/HDVF/include/CGAL/OSM/__base.hpp b/HDVF/include/CGAL/OSM/__base.hpp new file mode 100644 index 000000000000..586f16ff2b6c --- /dev/null +++ b/HDVF/include/CGAL/OSM/__base.hpp @@ -0,0 +1,71 @@ +/** + * \file __base.hpp + * \brief Defines all constants used by objects. + * \author Fedyna K. + * \version 0.1.0 + * \date 24/04/2024 + * + * Should not be included. + */ + +#ifndef __OPTIMISED_SPARSED_MATRIX_BASE__ +#define __OPTIMISED_SPARSED_MATRIX_BASE__ + +#include + + +namespace OSM { + /** \brief Chain type flag for column chain. */ + const int COLUMN = 0b01; + /** \brief Chain type flag for row chain. */ + const int ROW = 0b10; + + /** \brief The default type for signed integers. */ + typedef int ZCoefficient; + + /** + * \class SparseMatrix + * \brief Vector implementation of sparse matrices. + * + * The SparseMatrix class contains all algebraic functions that are related to matrix. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + class SparseMatrix; + + /** + * \class Chain + * \brief Allow to create row/column sparse vectors. + * + * The Chain class contains all algebraic functions that are related to vectors. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + class Chain; + + /** + * \class Bitboard + * \brief Bitboards are long bitset with specific operations. + * + * Bitboards are used with SparseMatrix to quickly find and set non empty columns. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ + class Bitboard; +} + +#endif \ No newline at end of file diff --git a/main_hdvf.cpp b/main_hdvf.cpp new file mode 100644 index 000000000000..81ad2661fff4 --- /dev/null +++ b/main_hdvf.cpp @@ -0,0 +1,244 @@ +// HDVF off files +// -------- +// Computes a "perfect" HDVF and provides a batch mode to specify arguments +// For help: hdvf -h +// -------- +// A. Bac +// -------- + +#include +#include +#include +#include +#include "CGAL/HDVF/Zp.hpp" +#include "CGAL/HDVF/Simplex.hpp" +#include "CGAL/HDVF/tools_io.hpp" +#include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" +#include "CGAL/HDVF/SimpComplexTools.hpp" +#include "CGAL/HDVF/Cubical_complex.hpp" +#include "CGAL/HDVF/CubComplexTools.hpp" +#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/HDVF/hdvf_tools.hpp" +#include "arguments.h" + +// ------- A ring +// For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly + +//#define SCALAR 5 + +// HDVF computation, output and export + +template +void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const Options& options) +{ + if (options.with_output) + { + // Mesh + cout << "----> mesh informations" << endl ; + mesh.print_infos() ; + + // Complex + cout << "----> complex informations" << endl ; + complex.print_complex(); + } +} + +template +HDVF& HDVF_comput (const ComplexType& complex, const Options &options) +{ + HDVF& hdvf(*(new HDVF(complex, options.HDVF_opt))); + std::vector pairs ; + if (!options.random) + pairs = hdvf.computePerfectHDVF(options.verbose); + else + pairs = hdvf.computeRandPerfectHDVF(options.verbose); + + if (options.with_output) + { + cout << "----> pairs found by computePerfectHDVF" << endl ; + hdvf.print_pairs(pairs) ; + cout << "----> reduction" << endl ; + hdvf.print_reduction() ; + } + if (options.with_export) + { + string file(options.outfile_root+"_reduction.txt") ; + std::ofstream out ( file, std::ios::out | std::ios::trunc); + + if ( not out . good () ) { + std::cerr << "hdvf: with_export. Fatal Error:\n " << file << " not found.\n"; + throw std::runtime_error("File Parsing Error: File not found"); + } + out << "----> pairs found by computePerfectHDVF" << endl ; + hdvf.print_pairs(pairs, out) ; + out << "----> reduction" << endl ; + hdvf.print_reduction(out) ; + + out.close() ; + } + return hdvf ; +} + +template +void main_code (const Options &options) +{ + /// SIMP format + if (options.in_format == InputFormat::SIMP) + { + using ComplexType = Abstract_Simplicial_chain_complex ; + using HDVFType = HDVF ; + + // MeshObject + Mesh_object mesh ; + mesh.read_simp(options.in_file) ; + + // Complex + ComplexType complex(mesh); + + mesh_complex_output(mesh, complex, options) ; + + // HDVF computation, export, output + HDVFType hdvf(HDVF_comput(complex, options)) ; + + // Export to vtk + // None for SIMP format + } + /// OFF format + else if (options.in_format == InputFormat::OFF) + { + using ComplexType = Simplicial_chain_complex ; + using HDVFType = HDVF ; + + // MeshObject + Mesh_object mesh ; + mesh.read_off(options.in_file) ; + + // Complex + ComplexType complex(mesh, mesh.nodes); + + mesh_complex_output(mesh, complex, options) ; + + // HDVF computation, export, output + HDVFType hdvf(HDVF_comput(complex, options)) ; + + // Loop on operations with vtk export + if (options.loop) + { + auto output_vtk_simp = [options](HDVFType &hdvf, ComplexType& complex) + { + Simp_output_vtk(hdvf, complex, options.outfile_root) ; + } ; + + interaction_loop(hdvf, complex, output_vtk_simp) ; + } + // Export to vtk + else if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + Simp_output_vtk(hdvf, complex, options.outfile_root) ; + } + } + // CubComplex + else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) + { + using ComplexType = Cubical_complex ; + using HDVFType = HDVF ; + + CubObject mesh ; + typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; + if (options.primal) + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + else + mesh.read_cub(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) + } + else // dual + { + if (options.in_format == InputFormat::PGM) + mesh.read_pgm(options.in_file, false) ; // Read with pixel coordinates (for dual) + else + mesh.read_cub(options.in_file, false) ; // Read with pixel coordinates (for dual) + primal_dual = ComplexType::DUAL ; + } + + // Complex + ComplexType complex(mesh, primal_dual); + + mesh_complex_output(mesh, complex, options) ; + + // HDVF computation, export, output + HDVFType hdvf(HDVF_comput(complex, options)) ; + + // Loop on operations with vtk export + if (options.loop) + { + auto output_vtk_cub = [options](HDVFType &hdvf, ComplexType& complex) + { + Cub_output_vtk(hdvf, complex, options.outfile_root) ; + } ; + + interaction_loop(hdvf, complex, output_vtk_cub) ; + } + // Export to vtk + else if (options.with_vtk_export) + { + cout << "----> exporting to vtk" << endl ; + Cub_output_vtk(hdvf, complex, options.outfile_root) ; + } + } +} + +// Main + +int main(int argc, char **argv) +{ + if (argc <= 2) + usage() ; + else + { + for (int i=0;i(options) ; + } + else if (options.scalar == 2) + { + using CoefficientType = Zp<2,int8_t> ; + main_code(options) ; + } + else + { + cout << "Z" << options.scalar << " not instantiated, use the #define at line 27" << endl ; + } +#else + typedef Zp CoefficientType; +#endif + } + + return 0 ; +} + + + + + + + + + + + + + + + From 9f6b9aab09cbcf5c27380a12c3b6e0d56268eacf Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Mon, 28 Apr 2025 09:53:28 +0200 Subject: [PATCH 006/343] Concept AbstractChainComplex --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 133 +++++++++++------- .../Abstract_simplicial_chain_complex.hpp | 17 +-- 2 files changed, 93 insertions(+), 57 deletions(-) diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h index cdb09f212d73..731f2fe63a70 100644 --- a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -21,55 +21,90 @@ The concept `AbstractChainComplex` describes the requirements for (topological) class AbstractChainComplex { - /// \name Types - /// @{ - - /*! - Type of column-major chains (returned by the boundary operator) - */ - typedef OSM::Chain CChain; - - /*! - Type of row-major chains (returned by the co-boundary operator) - */ - typedef OSM::Chain RChain ; - - /*! - Type of column-major sparse matrices (used to store the boundary operator) - */ - typedef OSM::SparseMatrix CMatrix; - - /// @} - - /// \name Operations - /// @{ - - /*! - Returns the dimension of the complex (ie. largest dimension of cells) - */ - int dim() ; - - /*! - Returns the number of cells of dimension `dim`. - - If `dim` is negative of larger than the dimension of the complex, returns 0. - */ - int nb_cells(int dim) ; - - /*! - Returns all boundary matrices. - - The function returns a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial d_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). - */ - const vector & get_bnd_matrices() const ; - - /*! - Returns the boundary of the cell of index `id_cell` in dimension `dim`. - - This boundary is a finite linear combination of cells of dimension `dim`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). The boundary of the this cell is thus the `id_cell`-th column of the boundary matrix in dimension `dim`. - */ - CChain d(int id_cell, int dim) ; +public: +/// \name Types +/// @{ + +/*! + Type of column-major chains (returned by the boundary operator) + */ +typedef OSM::Chain CChain; + +/*! + Type of row-major chains (returned by the co-boundary operator) + */ +typedef OSM::Chain RChain ; + +/*! + Type of column-major sparse matrices (used to store the boundary operator) + */ +typedef OSM::SparseMatrix CMatrix; + +/// @} + +/// \name Access functions +/// @{ + +/*! +Returns the dimension of the complex, that is, the largest dimension of cells. + */ +int dim(); + +/*! +Returns the number of cells of dimension `q`. +If `q` is negative of larger than the dimension of the complex, returns 0. + */ +int nb_cells(int q); + +/*! +Returns all boundary matrices. + +The function returns constant reference to a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). + + */ +const vector & get_bnd_matrices() const; + +/*! +Returns the boundary matrix of dimension `q` (ie. the matrix of \f$\partial_q}\f$). + +The function returns a column-major sparse matrices. + */ +const CMatrix & get_bnd_matrix(int q) const; + +/*! +Returns the boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). This boundary is thus the `id_cell`-th column of the boundary matrix in dimension `q`. + +*/ +CChain d(int id_cell, int q); + - /// @} +/*! +Returns the co-boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`+1. It is encoded as a row-major chain (which maps each cell with a non-zero coefficient to this coefficient). This co-boundary is thus the `id_cell`-th row of the boundary matrix in dimension `q`+1. +*/ +CChain cod(int id_cell, int q); + +/*! +Returns the vertices of a given cell (that is, the indices of its faces of dimension 0). + +*/ + std::vector bottom_faces(int id_cell, int q) const; + +/// @} + +/// \name Output functions +/// @{ + +/*! +Outputs the chain complex in text mode. + +By default, outputs the complex to `std::cout`. +*/ +std::ostream& print_complex(std::ostream& out = std::cout) const; +/// @} + }; diff --git a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp index 9e730c2f7b13..110c12b744a4 100644 --- a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp @@ -233,7 +233,7 @@ class Abstract_simplicial_chain_complex { * \author Alexandra Bac * */ /** \brief */ - void print_complex() const; + std::ostream& print_complex(std::ostream& out = std::cout) const; protected: @@ -360,20 +360,20 @@ void Abstract_simplicial_chain_complex::calculate_ // Method to display the complex's information template -void Abstract_simplicial_chain_complex::print_complex() const { - std::cout << "Complex dimension: " << _dim << std::endl; +std::ostream& Abstract_simplicial_chain_complex::print_complex(std::ostream& out) const { + out << "Complex dimension: " << _dim << std::endl; // Total number of cells int nb_total_cells = 0; for (int i = 0; i <= _dim; ++i) { nb_total_cells += _nb_cells[i]; } - std::cout << "Total number of cells: " << nb_total_cells << std::endl; + out << "Total number of cells: " << nb_total_cells << std::endl; // Cells per dimension for (int q = 0; q <= _dim; ++q) { - std::cout << "--- dimension " << q << std::endl; - cout << nb_cells(q) << " cells" << endl ; + out << "--- dimension " << q << std::endl; + out << nb_cells(q) << " cells" << endl ; // for (int j = 0; j < _nb_cells.at(q); ++j) { // Simplex s(_ind2Simp.at(q).at(j)); // std::cout << j << " -> " << s << " -> " << _Simp2ind.at(q).at(s) << std::endl; @@ -381,9 +381,10 @@ void Abstract_simplicial_chain_complex::print_com } // Boundary matrices - std::cout << "---------------------------" << std::endl << "Boundary matrices" << std::endl; + out << "---------------------------" << std::endl << "Boundary matrices" << std::endl; for (int q = 1; q <= _dim; ++q) - std::cout << "_d[" << q << "] : " << _d[q].dimensions().first << "x" << _d[q].dimensions().second << std::endl << _d[q] << std::endl; + out << "_d[" << q << "] : " << _d[q].dimensions().first << "x" << _d[q].dimensions().second << std::endl << _d[q] << std::endl; + return out ; } /** From 3304108631843b94cc68bc7645b03d24926af4b8 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Mon, 28 Apr 2025 11:55:17 +0200 Subject: [PATCH 007/343] Abstract_simplicial_chain_complex, Simplicial_chain_complex Documentation, code cleaning --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 12 ++ .../doc/HDVF/Concepts/GeometricChainComplex.h | 45 +++++++ .../Abstract_simplicial_chain_complex.hpp | 72 ++++++------ HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 18 +-- HDVF/include/CGAL/HDVF/Simplex.hpp | 110 +++++++----------- 5 files changed, 149 insertions(+), 108 deletions(-) create mode 100644 HDVF/doc/HDVF/Concepts/GeometricChainComplex.h diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h index 731f2fe63a70..0ac1c3ab53dc 100644 --- a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -42,6 +42,18 @@ typedef OSM::SparseMatrix CMatrix; /// @} +/// \name Operators +/// @{ + +/*! +Affectation operator. + +The operator creates a "fresh" copy of `complex`. + */ + Abstract_simplicial_chain_complex& operator= (const Abstract_simplicial_chain_complex& complex); + +/// @} + /// \name Access functions /// @{ diff --git a/HDVF/doc/HDVF/Concepts/GeometricChainComplex.h b/HDVF/doc/HDVF/Concepts/GeometricChainComplex.h new file mode 100644 index 000000000000..ed2555041253 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/GeometricChainComplex.h @@ -0,0 +1,45 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `GeometricChainComplex` refines the concept `AbstractChainComplex` and describes the requirements for (topological) chain complexes associated to geometric complexes used in the concept `CGAL::HDVF`. + It adds to `AbstractChainComplex` methods to get vertices coordinates. + + \cgalRefines{`AbstractChainComplex`} + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Simplicial_chain_complex`} +\cgalHasModelsBare{`CGAL::Cubical_chain_complex`} +\cgalHasModelsEnd + +*/ + +class GeometricChainComplex +{ +public: +/// \name Types +/// @{ + +/*! + Type of coordinates (the vector size is free, hence coordinates can be any dimension). + */ +typedef std::vector Point ; +/// @} + + +/// \name Access functions +/// @{ + +/*! +Returns the vector of vertices coordinates. + */ +const std::vector& get_nodes_coords() const; + +/*! + Returns the coordinates of the cell of index `i` and dimension 0. + */ +Point get_vertex_coords (int i) const; + +/// @} + +}; diff --git a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp index 110c12b744a4..1dc4bcceb825 100644 --- a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp @@ -7,9 +7,10 @@ #include "tools_io.hpp" #include "Simplex.hpp" #include "CGAL/OSM/OSM.hpp" +#include "CGAL/Simple_cartesian.h" // Forward declaration of SimpComplexTools -template class Duality_SimpComplexTools ; +template class Duality_SimpComplexTools ; /** * \class Abstract_simplicial_chain_complex @@ -18,11 +19,10 @@ template class Duality_SimpComp * The Abstract_simplicial_chain_complex class contains constructors and functions associated to abstract simplicial complexes for HDVFs. It implements the Complex concept. * * \tparam CoefficientType The coefficient types used for boundary matrix computation (default is int) - * \tparam VertexIdType Type used to store vertices indices (default is int) * * \author Alexandra Bac */ -template +template class Abstract_simplicial_chain_complex { public: /** @@ -240,9 +240,9 @@ class Abstract_simplicial_chain_complex { /** \brief Dimension of the complex */ int _dim; /** \brief Vector of simplices along each dimension: _ind2simp.at(q) contains the vector of all simplices of dimension q */ - std::vector > > _ind2simp ; + std::vector > _ind2simp ; /** \brief Vector of maps associating indices to simplices in each dimension: _simp2ind.at(q) maps q-simplices to their index in _ind2simp */ - std::vector, int> > _simp2ind ; + std::vector > _simp2ind ; /** \brief Vector of number of cells in each dimension */ std::vector _nb_cells ; /** \brief Vector of column-major boundary matrices: _d.at(q) is the matrix of the boundary operator in dimension q. */ @@ -277,12 +277,12 @@ class Abstract_simplicial_chain_complex { * * \author Alexandra Bac * */ - void insert_simplex(const Simplex& tau); + void insert_simplex(const Simplex& tau); }; //constructor -template -Abstract_simplicial_chain_complex::Abstract_simplicial_chain_complex(const Mesh_object& mesh) { +template +Abstract_simplicial_chain_complex::Abstract_simplicial_chain_complex(const Mesh_object& mesh) { // Initialize attributes _dim = abs(mesh.dim); @@ -306,8 +306,8 @@ Abstract_simplicial_chain_complex::Abstract_simpl } // Recursive insertion method -template -void Abstract_simplicial_chain_complex::insert_simplex(const Simplex& tau) { +template +void Abstract_simplicial_chain_complex::insert_simplex(const Simplex& tau) { int q = tau.dimension(); if (q == -1) return; @@ -317,7 +317,7 @@ void Abstract_simplicial_chain_complex::insert_si _simp2ind[q][tau] = i; _nb_cells[q]++; - std::vector > bord = tau.boundary(); + std::vector bord = tau.boundary(); for (const auto& sigma : bord) { insert_simplex(sigma); } @@ -325,8 +325,8 @@ void Abstract_simplicial_chain_complex::insert_si } // calculate _d boundary matrix -template -void Abstract_simplicial_chain_complex::calculate_d(int dim) const { +template +void Abstract_simplicial_chain_complex::calculate_d(int dim) const { int nb_lignes = (dim == 0) ? 0 : _nb_cells[dim - 1]; _d[dim] = CMatrix(nb_lignes, _nb_cells[dim]); @@ -335,8 +335,8 @@ void Abstract_simplicial_chain_complex::calculate_ { for (int i = 0; i < _nb_cells[dim]; ++i) { // Boundary of the i-th simplex of dimension dim - const Simplex& s = _ind2simp[dim][i]; - std::vector > bord = s.boundary(); + const Simplex& s = _ind2simp[dim][i]; + std::vector bord = s.boundary(); // Create a chain with the correct size CChain chain(nb_lignes); @@ -359,8 +359,8 @@ void Abstract_simplicial_chain_complex::calculate_ } // Method to display the complex's information -template -std::ostream& Abstract_simplicial_chain_complex::print_complex(std::ostream& out) const { +template +std::ostream& Abstract_simplicial_chain_complex::print_complex(std::ostream& out) const { out << "Complex dimension: " << _dim << std::endl; // Total number of cells @@ -398,10 +398,14 @@ std::ostream& Abstract_simplicial_chain_complex:: * \author Alexandra Bac */ -template -class Simplicial_chain_complex : public Abstract_simplicial_chain_complex { +template +class Simplicial_chain_complex : public Abstract_simplicial_chain_complex { +public: + /// Public types + typedef std::vector Point ; + protected: - std::vector > _coords ; + std::vector _coords ; private: /// Associated to any dimension the type number of associated VTK cells @@ -428,7 +432,7 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex > coords) : Abstract_simplicial_chain_complex(mesh), _coords(coords) {} ; + Simplicial_chain_complex(const Mesh_object& mesh, std::vector coords) : Abstract_simplicial_chain_complex(mesh), _coords(coords) {} ; /// Operator= Simplicial_chain_complex& operator= (const Simplicial_chain_complex& complex) @@ -439,16 +443,16 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex ; + friend Duality_SimpComplexTools ; /** \brief Get the vector of vertices coordinates */ - const std::vector >& get_nodes_coords() const + const std::vector& get_nodes_coords() const { return _coords ; } /** \brief Get the coordinates of the ith dimension 0 simplex */ - std::vector get_vertex_coords (int i) const + Point get_vertex_coords (int i) const { const Simplex simpl(this->_ind2simp.at(0).at(i)) ; const std::set verts(simpl.getVertices()) ; @@ -493,13 +497,13 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex const -std::vector Simplicial_chain_complex::VTK_simptypes({1, 3, 5, 10}); +template const +std::vector Simplicial_chain_complex::VTK_simptypes({1, 3, 5, 10}); -template -void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const std::vector > *labels) +template +void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const std::vector > *labels) { - typedef Simplicial_chain_complex ComplexType; + typedef Simplicial_chain_complex ComplexType; if (K._coords.size() != K.nb_cells(0)) { std::cerr << "SimpComplex_to_vtk. Error, wrong number of points provided.\n"; @@ -572,7 +576,7 @@ void Simplicial_chain_complex::Simplicial_chain_c { Simplex verts(K._ind2simp.at(q).at(id)) ; out << size_cell << " " ; - for (typename Simplex::const_iterator it = verts.cbegin(); it != verts.cend(); ++it) + for (typename Simplex::const_iterator it = verts.cbegin(); it != verts.cend(); ++it) out << *it << " " ; out << endl ; types.push_back(ComplexType::VTK_simptypes.at(q)) ; @@ -615,10 +619,10 @@ void Simplicial_chain_complex::Simplicial_chain_c * -> If a cell Id is provided scalars are exported (0 for the given cellId / 2 for other cells) */ -template -void Simplicial_chain_complex::Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) +template +void Simplicial_chain_complex::Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) { - typedef Simplicial_chain_complex ComplexType ; + typedef Simplicial_chain_complex ComplexType ; if (K._coords.size() != K.nb_cells(0)) { std::cerr << "SimpComplex_chain_to_vtk. Error, wrong number of points provided.\n"; @@ -685,7 +689,7 @@ void Simplicial_chain_complex::Simplicial_chain_c { Simplex verts(K._ind2simp.at(q).at(id)) ; out << size_cell << " " ; - for (typename Simplex::const_iterator it = verts.cbegin(); it != verts.cend(); ++it) + for (typename Simplex::const_iterator it = verts.cbegin(); it != verts.cend(); ++it) out << *it << " " ; out << endl ; types.push_back(ComplexType::VTK_simptypes.at(q)) ; diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index f1a42ebc706e..4bfca2f83291 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -29,9 +29,9 @@ /** \brief vtk export for SimpComplex */ template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix, typename VertexIdType = int> -void Simp_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") +void Simp_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") { - typedef Simplicial_chain_complex ComplexType; + typedef Simplicial_chain_complex ComplexType; // Export PSC labelling string outfile(filename+"_PSC.vtk") ; vector > labels = hdvf.export_label(PSC) ; @@ -68,10 +68,10 @@ void Simp_output_vtk (HDVF +template class Duality_SimpComplexTools { public: - typedef Simplicial_chain_complex _ComplexType ; + typedef Simplicial_chain_complex _ComplexType ; typedef SubChainComplex _SubCCType ; // Constructor Duality_SimpComplexTools() {} @@ -141,7 +141,7 @@ class Duality_SimpComplexTools { for (int q = 0; q <= _CC.dim(); ++q) for (int i = 0; i<_CC.nb_cells(q); ++i) { - const Simplex& s(_CC._ind2simp.at(q).at(i)) ; + const Simplex& s(_CC._ind2simp.at(q).at(i)) ; vcells.push_back(s.getVertices()) ; } @@ -154,14 +154,14 @@ class Duality_SimpComplexTools { /** \brief Export persistent information to vtk files */ -template -void Per_Simp_output_vtk (PersistentHDVF, DegType> &per_hdvf, Simplicial_chain_complex &complex, string filename = "per") +template +void Per_Simp_output_vtk (PersistentHDVF, DegType> &per_hdvf, Simplicial_chain_complex &complex, string filename = "per") { if (!per_hdvf.with_export()) throw("Cannot export persistent generators to vtk: with_export is off!") ; - using perHDVFType = PersistentHDVF, DegType> ; - using ComplexType = Simplicial_chain_complex ; + using perHDVFType = PersistentHDVF, DegType> ; + using ComplexType = Simplicial_chain_complex ; using PerHole = PerHoleT ; // Iterate over persistence diagram (iterator over non zero intervals) // Batch informations are stored in file filename_infos.txt diff --git a/HDVF/include/CGAL/HDVF/Simplex.hpp b/HDVF/include/CGAL/HDVF/Simplex.hpp index 0d4280beb2c0..1cef13d25361 100644 --- a/HDVF/include/CGAL/HDVF/Simplex.hpp +++ b/HDVF/include/CGAL/HDVF/Simplex.hpp @@ -7,91 +7,71 @@ #include #include -template class Simplex { - template + template friend class Abstract_simplicial_complex ; private: - std::set vertices; - bool inside; + std::set _vertices; public: typedef std::set::const_iterator const_iterator ; - const_iterator cbegin () { return vertices.cbegin() ; } - const_iterator cend () { return vertices.cend() ; } + const_iterator cbegin () { return _vertices.cbegin() ; } + const_iterator cend () { return _vertices.cend() ; } // Constructor - Simplex(const std::set& vertices, bool inside = true); + Simplex(const std::set& vertices) : _vertices(vertices) {} - int dimension() const; + int dimension() const + { + return _vertices.size() - 1; + } // Boundary operator - std::vector boundary() const; + std::vector boundary() const + { + std::vector result; + result.reserve(_vertices.size()); + + auto it = _vertices.begin(); + for (size_t i = 0; i < _vertices.size(); ++i) { + std::set simplex_vertices; + std::copy_if(_vertices.begin(), _vertices.end(), std::inserter(simplex_vertices, simplex_vertices.begin()), + [it](const int& vertex) { return vertex != *it; }); + result.emplace_back(simplex_vertices); + ++it; + } + + return result; + } // Method to get the vertices of the simplex (for testing) - const std::set& getVertices() const; + const std::set& getVertices() const + { + return _vertices ; + } // Comparison operator used for sorting simplices (especially in the Complex class) bool operator<(const Simplex& other) const { - return vertices < other.vertices; + return _vertices < other._vertices; } // Operator << - friend std::ostream& operator<<(std::ostream& out, const Simplex& simplex); - - - -}; - -// Implementations - -template -Simplex::Simplex(const std::set& vertices, bool inside) - : vertices(vertices), inside(inside) {} - -template -int Simplex::dimension() const { - return vertices.size() - 1; -} - -template -std::vector > Simplex::boundary() const { - std::vector result; - result.reserve(vertices.size()); - - auto it = vertices.begin(); - for (size_t i = 0; i < vertices.size(); ++i) { - std::set simplex_vertices; - std::copy_if(vertices.begin(), vertices.end(), std::inserter(simplex_vertices, simplex_vertices.begin()), - [it](const int& vertex) { return vertex != *it; }); - result.emplace_back(simplex_vertices, inside); - ++it; + friend std::ostream& operator<<(std::ostream& out, const Simplex& simplex) + { + out << "<"; + bool first = true; + for (int vertex : simplex._vertices) { + if (!first) { + + out << " "; + } + out << vertex; + first = false; + } + out << ">"; + return out; } +}; - return result; -} - -template -const std::set& Simplex::getVertices() const { -// return std::vector(vertices.begin(), vertices.end()); - return vertices ; -} - -template -std::ostream& operator<<(std::ostream& out, const Simplex& simplex) -{ - out << "<"; - bool first = true; - for (int vertex : simplex.vertices) { - if (!first) { - - out << " "; - } - out << vertex; - first = false; - } - out << ">"; - return out; -} #endif // SIMPLEX_HPP From 39cb91944851930693cc9ae6df241d775e2a661c Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Wed, 30 Apr 2025 10:43:21 +0200 Subject: [PATCH 008/343] Abstract and geometric complexes --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 2 +- .../doc/HDVF/Concepts/GeometricChainComplex.h | 2 +- HDVF/doc/HDVF/Concepts/HDVF.h | 122 +++ HDVF/doc/HDVF/Concepts/Ring.h | 42 + HDVF/doc/HDVF/Concepts/SparseChain.h | 122 +++ HDVF/doc/HDVF/Concepts/SparseMatrix.h | 122 +++ HDVF/doc/HDVF/fig/cubical_complex.png | Bin 0 -> 99878 bytes HDVF/doc/HDVF/fig/cubical_implementation.png | Bin 0 -> 393376 bytes HDVF/doc/HDVF/fig/primal_dual.png | Bin 0 -> 476749 bytes HDVF/doc/HDVF/fig/simplicial_complex.png | Bin 0 -> 177090 bytes HDVF/examples/HDVF/arguments.cpp | 1 + HDVF/examples/HDVF/arguments.h | 2 +- HDVF/examples/HDVF/main_dual_hdvf.cpp | 13 +- HDVF/examples/HDVF/main_hdvf.cpp | 10 +- HDVF/examples/HDVF/main_per_hdvf.cpp | 12 +- HDVF/include/CGAL/Class.h | 4 +- .../Abstract_simplicial_chain_complex.hpp | 369 ++++----- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 69 +- ..._complex.hpp => Cubical_chain_complex.hpp} | 715 +++++++++--------- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 20 +- HDVF/include/CGAL/HDVF/Simplex.hpp | 45 +- HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 2 +- HDVF/include/CGAL/HDVF/Zp.hpp | 38 +- HDVF/include/CGAL/HDVF/hdvf.hpp | 301 ++++---- HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 64 +- HDVF/include/CGAL/HDVF/hdvf_tools.hpp | 9 +- HDVF/include/CGAL/HDVF/per_hdvf.hpp | 64 +- HDVF/include/CGAL/HDVF/sub_chain_complex.hpp | 22 +- HDVF/include/CGAL/HDVF/tools_io.hpp | 38 +- 29 files changed, 1313 insertions(+), 897 deletions(-) create mode 100644 HDVF/doc/HDVF/Concepts/HDVF.h create mode 100644 HDVF/doc/HDVF/Concepts/Ring.h create mode 100644 HDVF/doc/HDVF/Concepts/SparseChain.h create mode 100644 HDVF/doc/HDVF/Concepts/SparseMatrix.h create mode 100644 HDVF/doc/HDVF/fig/cubical_complex.png create mode 100644 HDVF/doc/HDVF/fig/cubical_implementation.png create mode 100644 HDVF/doc/HDVF/fig/primal_dual.png create mode 100644 HDVF/doc/HDVF/fig/simplicial_complex.png rename HDVF/include/CGAL/HDVF/{Cubical_complex.hpp => Cubical_chain_complex.hpp} (52%) diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h index 0ac1c3ab53dc..f79f8d478b30 100644 --- a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -50,7 +50,7 @@ Affectation operator. The operator creates a "fresh" copy of `complex`. */ - Abstract_simplicial_chain_complex& operator= (const Abstract_simplicial_chain_complex& complex); + AbstractChainComplex& operator= (const AbstractChainComplex& complex); /// @} diff --git a/HDVF/doc/HDVF/Concepts/GeometricChainComplex.h b/HDVF/doc/HDVF/Concepts/GeometricChainComplex.h index ed2555041253..d03af834cc6b 100644 --- a/HDVF/doc/HDVF/Concepts/GeometricChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/GeometricChainComplex.h @@ -33,7 +33,7 @@ typedef std::vector Point ; /*! Returns the vector of vertices coordinates. */ -const std::vector& get_nodes_coords() const; +const std::vector& get_vertices_coords() const; /*! Returns the coordinates of the cell of index `i` and dimension 0. diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h new file mode 100644 index 000000000000..cd830952e8e2 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -0,0 +1,122 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `HDVF` describes the requirements for (topological) chain complexes associated to abstract complexes used in the concept `CGAL::HDVF`. + It provides methods to: + + - get the dimension of the complex, the number of cells in each dimension + - get the boundary and co-boundary of cell(s) + - get the vertices of a given cell + - output the complex in text format + + Cells are indexed along each dimension and thus identified by their index together with their dimension. + + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} +\cgalHasModelsEnd + +*/ + +class AbstractChainComplex +{ +public: +/// \name Types +/// @{ + +/*! + Type of column-major chains (returned by the boundary operator) + */ +typedef OSM::Chain CChain; + +/*! + Type of row-major chains (returned by the co-boundary operator) + */ +typedef OSM::Chain RChain ; + +/*! + Type of column-major sparse matrices (used to store the boundary operator) + */ +typedef OSM::SparseMatrix CMatrix; + +/// @} + +/// \name Operators +/// @{ + +/*! +Affectation operator. + +The operator creates a "fresh" copy of `complex`. + */ + AbstractChainComplex& operator= (const AbstractChainComplex& complex); + +/// @} + +/// \name Access functions +/// @{ + +/*! +Returns the dimension of the complex, that is, the largest dimension of cells. + */ +int dim(); + +/*! +Returns the number of cells of dimension `q`. +If `q` is negative of larger than the dimension of the complex, returns 0. + */ +int nb_cells(int q); + +/*! +Returns all boundary matrices. + +The function returns constant reference to a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). + + */ +const vector & get_bnd_matrices() const; + +/*! +Returns the boundary matrix of dimension `q` (ie. the matrix of \f$\partial_q}\f$). + +The function returns a column-major sparse matrices. + */ +const CMatrix & get_bnd_matrix(int q) const; + +/*! +Returns the boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). This boundary is thus the `id_cell`-th column of the boundary matrix in dimension `q`. + +*/ +CChain d(int id_cell, int q); + + +/*! +Returns the co-boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`+1. It is encoded as a row-major chain (which maps each cell with a non-zero coefficient to this coefficient). This co-boundary is thus the `id_cell`-th row of the boundary matrix in dimension `q`+1. +*/ +CChain cod(int id_cell, int q); + +/*! +Returns the vertices of a given cell (that is, the indices of its faces of dimension 0). + +*/ + std::vector bottom_faces(int id_cell, int q) const; + +/// @} + +/// \name Output functions +/// @{ + +/*! +Outputs the chain complex in text mode. + +By default, outputs the complex to `std::cout`. +*/ +std::ostream& print_complex(std::ostream& out = std::cout) const; + +/// @} + +}; diff --git a/HDVF/doc/HDVF/Concepts/Ring.h b/HDVF/doc/HDVF/Concepts/Ring.h new file mode 100644 index 000000000000..246c52bd42f2 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/Ring.h @@ -0,0 +1,42 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `Ring` describes the requirements for the ring of coefficients used to compute homology in the `CGAL::HDVF` concept. Besides ring operators, it also specifies the functions needed to test invertibility in the ring. + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Z`} +\cgalHasModelsBare{`CGAL::Zp`} +\cgalHasModelsEnd + +*/ + +class Ring +{ +public: +/// \name Types +/// @{ + +/*! + Type of scalars of the ring. + */ +typedef unspecified_type Scalar ; +/// @} + + +/// \name Operators +/// @{ + +/*! +Returns the vector of vertices coordinates. + */ +const std::vector& get_vertices_coords() const; + +/*! + Returns the coordinates of the cell of index `i` and dimension 0. + */ +Point get_vertex_coords (int i) const; + +/// @} + +}; diff --git a/HDVF/doc/HDVF/Concepts/SparseChain.h b/HDVF/doc/HDVF/Concepts/SparseChain.h new file mode 100644 index 000000000000..f79f8d478b30 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/SparseChain.h @@ -0,0 +1,122 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `AbstractChainComplex` describes the requirements for (topological) chain complexes associated to abstract complexes used in the concept `CGAL::HDVF`. + It provides methods to: + + - get the dimension of the complex, the number of cells in each dimension + - get the boundary and co-boundary of cell(s) + - get the vertices of a given cell + - output the complex in text format + + Cells are indexed along each dimension and thus identified by their index together with their dimension. + + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} +\cgalHasModelsEnd + +*/ + +class AbstractChainComplex +{ +public: +/// \name Types +/// @{ + +/*! + Type of column-major chains (returned by the boundary operator) + */ +typedef OSM::Chain CChain; + +/*! + Type of row-major chains (returned by the co-boundary operator) + */ +typedef OSM::Chain RChain ; + +/*! + Type of column-major sparse matrices (used to store the boundary operator) + */ +typedef OSM::SparseMatrix CMatrix; + +/// @} + +/// \name Operators +/// @{ + +/*! +Affectation operator. + +The operator creates a "fresh" copy of `complex`. + */ + AbstractChainComplex& operator= (const AbstractChainComplex& complex); + +/// @} + +/// \name Access functions +/// @{ + +/*! +Returns the dimension of the complex, that is, the largest dimension of cells. + */ +int dim(); + +/*! +Returns the number of cells of dimension `q`. +If `q` is negative of larger than the dimension of the complex, returns 0. + */ +int nb_cells(int q); + +/*! +Returns all boundary matrices. + +The function returns constant reference to a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). + + */ +const vector & get_bnd_matrices() const; + +/*! +Returns the boundary matrix of dimension `q` (ie. the matrix of \f$\partial_q}\f$). + +The function returns a column-major sparse matrices. + */ +const CMatrix & get_bnd_matrix(int q) const; + +/*! +Returns the boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). This boundary is thus the `id_cell`-th column of the boundary matrix in dimension `q`. + +*/ +CChain d(int id_cell, int q); + + +/*! +Returns the co-boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`+1. It is encoded as a row-major chain (which maps each cell with a non-zero coefficient to this coefficient). This co-boundary is thus the `id_cell`-th row of the boundary matrix in dimension `q`+1. +*/ +CChain cod(int id_cell, int q); + +/*! +Returns the vertices of a given cell (that is, the indices of its faces of dimension 0). + +*/ + std::vector bottom_faces(int id_cell, int q) const; + +/// @} + +/// \name Output functions +/// @{ + +/*! +Outputs the chain complex in text mode. + +By default, outputs the complex to `std::cout`. +*/ +std::ostream& print_complex(std::ostream& out = std::cout) const; + +/// @} + +}; diff --git a/HDVF/doc/HDVF/Concepts/SparseMatrix.h b/HDVF/doc/HDVF/Concepts/SparseMatrix.h new file mode 100644 index 000000000000..f79f8d478b30 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/SparseMatrix.h @@ -0,0 +1,122 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `AbstractChainComplex` describes the requirements for (topological) chain complexes associated to abstract complexes used in the concept `CGAL::HDVF`. + It provides methods to: + + - get the dimension of the complex, the number of cells in each dimension + - get the boundary and co-boundary of cell(s) + - get the vertices of a given cell + - output the complex in text format + + Cells are indexed along each dimension and thus identified by their index together with their dimension. + + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} +\cgalHasModelsEnd + +*/ + +class AbstractChainComplex +{ +public: +/// \name Types +/// @{ + +/*! + Type of column-major chains (returned by the boundary operator) + */ +typedef OSM::Chain CChain; + +/*! + Type of row-major chains (returned by the co-boundary operator) + */ +typedef OSM::Chain RChain ; + +/*! + Type of column-major sparse matrices (used to store the boundary operator) + */ +typedef OSM::SparseMatrix CMatrix; + +/// @} + +/// \name Operators +/// @{ + +/*! +Affectation operator. + +The operator creates a "fresh" copy of `complex`. + */ + AbstractChainComplex& operator= (const AbstractChainComplex& complex); + +/// @} + +/// \name Access functions +/// @{ + +/*! +Returns the dimension of the complex, that is, the largest dimension of cells. + */ +int dim(); + +/*! +Returns the number of cells of dimension `q`. +If `q` is negative of larger than the dimension of the complex, returns 0. + */ +int nb_cells(int q); + +/*! +Returns all boundary matrices. + +The function returns constant reference to a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). + + */ +const vector & get_bnd_matrices() const; + +/*! +Returns the boundary matrix of dimension `q` (ie. the matrix of \f$\partial_q}\f$). + +The function returns a column-major sparse matrices. + */ +const CMatrix & get_bnd_matrix(int q) const; + +/*! +Returns the boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). This boundary is thus the `id_cell`-th column of the boundary matrix in dimension `q`. + +*/ +CChain d(int id_cell, int q); + + +/*! +Returns the co-boundary of the cell of index `id_cell` in dimension `q`. + +This boundary is a finite linear combination of cells of dimension `q`+1. It is encoded as a row-major chain (which maps each cell with a non-zero coefficient to this coefficient). This co-boundary is thus the `id_cell`-th row of the boundary matrix in dimension `q`+1. +*/ +CChain cod(int id_cell, int q); + +/*! +Returns the vertices of a given cell (that is, the indices of its faces of dimension 0). + +*/ + std::vector bottom_faces(int id_cell, int q) const; + +/// @} + +/// \name Output functions +/// @{ + +/*! +Outputs the chain complex in text mode. + +By default, outputs the complex to `std::cout`. +*/ +std::ostream& print_complex(std::ostream& out = std::cout) const; + +/// @} + +}; diff --git a/HDVF/doc/HDVF/fig/cubical_complex.png b/HDVF/doc/HDVF/fig/cubical_complex.png new file mode 100644 index 0000000000000000000000000000000000000000..ef2dfb327a9a3a1d29776401efe6085525fab932 GIT binary patch literal 99878 zcmZ^K1yo$ivNkS*yTjlR+}+(ZxVr>*cL@;OgF7K;aCdhP?(Ps=esb=)H|O2={#k3L zdv{lLRedGB_e{@cMR^GX04@Lo1O!1!QdAiP1Z)Qc1T+f<>V0J87rOrYg^Q(#h@!QK zgoxcIJ4Y3JLt|4>ODFqJh8~J6ARtt6F0pMgJ&Ndk3T4WZ+~J4>_{^V0W~TwJ4i+@% zVvMSgWh&{uur}Ug)XENM>eTl{8eN+9RpF}k4)(~R&?u`J+|-R0?rSNkOC)OpyDyv> zPE9(Uc#1eQw_sF<$#Js11$DE{J6=IySt{SmYD)5G0k1DD$JbN8))c}u-XMu8ons1yJJx#{;j6D<%;=csO= zNFM`6J1i=Nf>zUeJ(+8W%Ip9mbQIg@bnJ^%{xoD`bB>W}V?WNYv?L79nVFj~x4h&I zfsG4ddnC)IDshy1yXV;X1k0ET7J5$g!*H*g*v-oi{=jSV*%TK=J<5*8`>cLmy@d0`WJE*?ar@75n~v=l;6|%K`g01=vmw z_`mz0S-(kVz|vCR8(4cuO(zf#O!D7vP$^}y3lI=+TuW6AXAL=7Zeu$edP5UCBU5^J z8~fi}AiVC}?_C>HXG5U7%_mzYZg)PCzbLrh`@e@7NPvHlI9v0PXvir7MeH0+f$a2* z^o%6@03Z;^>u6%ett=}3H~ae)ABlytvpqKhgPWThy&DU?oufGe6Bid310yp7Gc(;g z1)Y$%BD_spIm-h@zK`OnVGlw{P$W4j+UnHZv2az>2GcSIrb0w-`H|1 zTDqHl(h#+@F}3{*Ne)&{KLu0^p4IS&VS7O&B@E~J9_>RP5%njzee9< zl^?*%@SnKn2OzRcVS|7Of=G!9sk(!nv_bn5NF>qg%w6_3B}iB%em8)m(Wo)yTCM>N zl4Bf%_`z<5^%bFtmiEcLdV}rO0j$oJ=u+(TB;9hW>RN z2M|u`1GU9w&N(p@1wz^h!wB~8rn5@ezjpg8vXqP*fhy`C1A8hJa8=^F#8NTx9jQ3( z4asdOsXYb>^j~uR7Wdv5ED~QRwK7=_ND0153bgaV9ukSJgddPjzv%R4la33|qHz6@ z@h^!zP@vPn39ip_qNveQRFrfcelY#2du`#z$b6#BL^j#N88M4QccRt!f291j4LhLg z3y5Ve>8X1y`4=uo)J2An2LSBLxu{MEHte=@AJ=P*j|!%Ca4pY zG}u)Tv0wj3|Vb^?McbskEwnE$ma3YV}qco_a&igO@gz&>Sx8SP*hyM#o z;+W2+ccTcnV0W>MWPI5wo(M^FiNvldra!x%&|dm&;Qud2OOgue$<-690aoKCb(+Y_ zx%vi^Gfu`QIAlfoiGXU!ZWTVw3muu~2%JQJ8~{%TL2ov_G$|aoZpI0$!e-!tj628* z-eC!m1fjIK3q#4@X4&0${%26pV}oL{(qnVCUjT%Fc@8zu#UHt(27P$~YIkaD`7Em^ zD0(GK<1zU^V@INnJAIYlXSUw_UszH@Mt+be?|tD zyA^;6XvZbSu&%a2o?i2<1zJzs>6v>W@(=tYHGV^_a|sg*vX+8OXxaVbDRlKF*X?HF z>ewFWzRRWx_1{?eqkw?L3DR?{aF$*EbX&h4T;Q)NIfEaJHT%lCf<+Rg4mkU&2=z1U ze+17)JV_^5KY2(393BXSB(}PO2(p63m4b8WTip3jVtJXEq+f2#lYoD1sZT-2YQbTn zKX1kJ#i`!l1J1va|E~b#!~>&^%|;;L=g>fg39;vm(h)HCra&9(VwmLiyI2N4xe6MO0qN`&yu^ebTEQ;IZ@s6>7H>7VI`{0;{fT6d1Pft}6vw&skt zd4r`*%x-hL?yhG-na|zYhvM*kHE9wm>{^Hvc@h4S%Z)JOe-}dRfZQ+;xE+y7`LJ2M z(;v9}en88$CWtFL}^G8^g$QCt5)HkYx11SEu@pu zzCJ62h2=l$gOJ)+!&HSn8=>qRL*s(pe+-D=ogC^KE^Op*lV*U7(1H4s89I#bTIe%6 zdvBVG04EJOY+*(ZMg2t_`3mcg|%{ezPAHzjMZPUo(WKkxV0(C7H^gVur&T|%Av zia&!T^}zxQBDLqi-4ia*go9cBQa#~A#OBY#|5oA zXvCzj!^p|%;56Om=?utjbFSLXav#s0^@5;(3s%s*NYEjK_z>byFWJHC(&=XU+xm?f z;Kc#1sVj!#f}yyw6bpTD%#hSq;wXU_D8mK{lSs4U7W$E%OSv$N-?3D7w3osM4fdTt z09w#H{jVJ~H(1cT-X*w*l42`Ux$sU|qL88^qsCa^dC&V0vCwVT4QBT5%nuE4W1 zco2wnKQxqiJKSGR4+4Pd7EMn^Q+^<{!W$iMt76m(fH_Bm`7H@%)H^{a3dFMSkSB-E zdJx({>@uI}cl_B8p-i@sQP}o-4kwYo4K#;j8Lt^aK*9Vr5yqk&;ZHch(?ft2{&Xi{ z@%&&h04}GyM4pph<1qr0fdE=hEP%)D9sMV*Leaq@)k_*LnpNs2;oa3sRffY9^>Be9 z#Yw4?b&oL&6VU}J$!Vhdcjl4!w~Mt7l1g10UO4X}^)oNf{?hBOP!JR#Mou`R)#o_- zCB`U?CWKbIh4uj+vl8>ey^lT?-R3FJ4;ec@riYap9%1$Hmm5(XT2g=VQfvrugH+N^ z-@!00(2L{u;O)E+1}eUOWRz~w2iS0zwpC**l7kpm3r=cS49i$HuS_e_=#`9iK1B)o zy;oHazno!HL@F?VcS6At9Q;YxGg!d($X~U)5fudnY%D=|cT<-7hQYW2I^oqhrZoz|ZGWP-sZp_KB;_KMmn-q+okKK@@gZ8(x{ zJUk^4XM^^vLm+sN5}G64N+c2;Bg<;6bvg{0kYB8G`+k?;>{wA4za#4YoiV{QZYAyM zr%!y9;=)Z3m8`vD9;E;YIxoO3!N2zB0OH8b7(0dUy(3EKL_S=8EbM+k*nl1Tsv5ly zzZL|V$(xeL-?uaJ?ABE&WWsd)P38P2?dy-gz)lpL z)bCNWJN;80qSLM_z$XFBDiNytf0SM*7O?$%A^g#ai3#=_6d)*1hK@-0{e9ybL;aQY ziy#$IsIT;$SobMre(Os1^Hv*2VQfn91(kUB!=%LL_1HhbR-pl*A>!MowtC@yQQ77- zmFT(Ls_%A{khHh%wm35PkTqLiD|CV=xe+?>L90q=%sIIFeEF{9iE_2N_l%u9`ej|< z_0TO8TKYNpA61c@^u10b>3H>Q{Ipq4O`famP&dJ)v9D|auv zkXukC%sylyS^weu>V1`6iZB0HDgEo7`n{$EBEN5Lfd<==P{;uZ{D?C3n{9Th+Trck zPnVKa=RQdMX8+k#LB(^{kvUWLs@H8tA>RT1ELa#T+wFEPxu0KKBAE^$ZJD$nzAwLS zr9qW;v$LP_baTuV@(0TCP{G-5aqVH5r=$V%7T>{aV}ys;$}O5#NU17*?E|0ot47B+ zS<}g8;ZJ3b6waJ4%EZWQytxB8j=4z)O629rp1YTYo>27W?j*=lgj2I=2N9~MaU{m> zdA)Y4>oCZtzxHg*^9EjhlZ7<--^-9`-G#_|x_2Ur9zp=@QT)h(xCoC|lGPw$U(XkX8vopcrGG+XNZ_Y3>abP(1| zJ?Yv{F@pV{H(lJ;@}8f;n`v9oRLs)h7g!1zlZs@=u*8Xx&FbkYUW$5ZI^OzH{H~SL z&O+<#ogwGW4SZD}1kA>y3s65FJD09U5N_z`!Nw!_uf!CG1AANqsm zLZIcK#ym|UBX@^jB+3mW6-kkoIn$+L3<%ef!iAK(*Ha>YrXQ*O`Qr;A59(~b@ftH& z8;T+h%d23!Mn*B7CtvLru9^}WC?*G@fjE6gF1jyyfzx7zs?69|bE)m1NURBsYG>-} z_BDg6OD>df_xO5~u0Yi#b);SVeZ5k=F%6|ULG`!K(3@XKuPl)by)zQJ|&h zUg;IVU@iHUk5bxx>qAmjfF}$7`(1aGAlc|7&oE?Zx+bgwFRk45i~$5uj7({s9yPPD z8h~G8pED-<_<}G)Y1N)iR|Sf4DH+M52POjx%yFpI<8v@MznSG4gl-AvSaA@$@<9N# z>_l?99kg&7KN)!;BzH3jAaaM1XPVbN?49;_< ziLf#Q6I5c53+5o=UI^4(*rIUTOD@0aLx9c7E5loD z9cn@j_+j&h4A97h`6Nb11KqP{!B9sD_>jd&VZ2xE#2YRMs3%(PraatChwmtUIxk)} zNn%nPcjAc~43Yp-R(xA*TueF&tgYhC%Va<10{ig{;4Q*Z;@d1Tg%QiZg5Ma$wu*tDkl-CFtISnD>l~0#!v;1|u(HaED(RJe zh4vw*rVe2h%vfztII8KDgB{BbJCQ)KL=MBH!m4(LboD$p(15OScA6+60g^p7e4L$QdiSn#lX(i^q+uHoYz(iY#~MGhxcKp-iwI^4gG z3200&`B<1%1GA|h2+rL5A{cI9)w=*JfF6@B{c3I9tAkIUPu6RQr2!;z{mAdF-${wvGcv?;G4i#5561W%?2W7xOg7}St)$dw3@AkV%=)2AK9V-_KC*@R3xmky}eTIC_I3Mz9=2DAj&NoMYx2_7Y` zBP|oduL_d^eu;}JmtZ05$4-k97m4o$-=Pu)Fsn{$?|NmNqp9h!aNhN#;Ah0R{>=K; zo3inozk|kdBeU4j|I|+>`-{z<3ooC+<)ETuKFcwSl0PRVv zfY9LwDX)SD>E776PzZ%48sYQp2$fbIG8DltXhVq)a)%%TqAZ>K7mBSO+dhE zUthC!Zk2(Af|=Cjp;KY7LTQ1Mck6^ekUrDcb1;g_GW5^#a1`uK^T{g{)TS4&UhMpw zk$33E_yR(asgfhjaGJE-%#0vvV@MuDb_$BFaYW!`8(RcA7qpKemx(Hk8>);Dd5v)gBn)pMfUz2`YB?T>@%F)Z} zewH#9P{=J%ZZtBBnF(I)-#B{NJlTJb91cXv^pw(MjFB$xhoeUh*@eYgDtwWobTcpo z6cLzk)m#kF z8w;^g%pz|Xrt-<+d~PtL^mi8RZV9EaPoHLGne-pD%>))HTY0wb5RRIa?mjx?dGgc1xnwkQ}gD`mYmQ&!2sE! zK@^PgL*Lz1d-j)zlR7!oa0QIpbiSq!BS%s@nO)H!Y~sF%0&T}_D_N7FTj9>MYEg&T z=aYTK@cMn9^4JOz)TjUjOn^Gk9P#N~wF$wF%# zKU-k4Q-mlj1(Q9hC_>5h(@^L)64k74l6$Mf{{E#wW`c~W1B4b62vMJG$}C>aNM#JR z2mthC@?kgOHlkhy?5XovSbp~_&2$a&ji<>bgrrQdjyV*Rnqkb{wJE_4I?`A@D;fAi z-IPrh=j?OCf%@Je&Tv}g@jZ-!21BTYHZA34n70&i0_|LFr7`LiJ2pu-YH9K*O$7F z3T?EnzL4Lxr|Ym__j77vg%V+#phWetGFpa2AzSc1@U|CJEyuWA=7C^ErcSH>WD6g^ zaGfOaf9#p%6g#7G*55%`Uyd{<2au%aO6C$eaBJmyWeT?5ex_dAI62bD|EonwS zzUF$kT9nuFa=V_IZPd-DmOp%EJN_oI5H-?Q+qmD;1h8nJ3?BO^86X^#-Fppe%aZZf z2Z(fDvwbfr-4dG#yYSX<3ID$NB`Q@?)DA@sB@!pnonXsn!{gjS{hPzD+c6S;GovsY zZ0_e9G9l~KF~Jvs_#Wcmuc@N&@{MKmt4(gtz1#IJ-oJu9SO#7%x5V;jPF^xku6`ZC zb_m!6w!z!fe+c>fY+43 zYS9ui6njWzpW^!vA9_oFeU+=*(Q|ovKuY+T6I><1wo9}qtP8#$|V z9d@S|KAifdDp=2AS1#_jqFSxN+;N*%rlt7+{TNKa5-NGpe}KZBwo_ryV2yB{>fwo8 z+mNvkHR#C2oFAVSMm4;PFJ=eYca8Zw{rcT9Jf#;tWjIK9Jk^tXuck%)S=Vikq!c>% zuFWxLdjt2(WI(M}FH@`^6~hkk$)+@F6d>8&ac=(dtmvNNI{lKThT10(`itixRMssp zmp7yxSQmpIN&hp2N8eW7vYp+2kF5zWib2Fg6rV&%vKDa<+S?*! z73Nm5g%_snDsPQlZ6o?oH!0bz@|JZfJd)OkZzrgg4#kOMqLH}4Zz`xctD<6Tq{4dH z#DNzFJPfpkNA8}i&(x$&u$M6805s2dO%DeKc^O5Em%MhVtT4G1aD1y8K#~FEo3l-+ z^p)}CQaCWHpJzlgWEa9)i#UkJRybD-2_6b}>k52cjow?=3C4XcCxvdNC_G*UCUR^r z%IlyW6)VzGvY{U&WXQ!y4~wnrSzZ;Mza7od?RI~DJkaZjXw?8REb!ZfLV%g@3fn3Q zMBEGJ1VS2c0YZu8g+AAd{H(~1YCt<@@n%}Oh5U8UBdE{&Yi9^K0OBTE1IT04y{ewi zt@5M7lf_QBN&<1U-xYl(f2_Ttp}!gWQUs2W;Xp=yM@u8t$Pu*ZU);B7&-4 zQb0j!ggv3rWVh>T;5sgxYvfcNp3zKyYh0!L5WcwH zq^}_+;Th3~Wc#oz#de#@fpe}g9(8Om3aT$FqbXqU(gw<4M$T{#!RGjb_zUw44=1Sc zVWfaB2hsE;;v)Q5)6@H%=a^fKpsbOF7=iRKbIV%1zZTxid-_xOUG7#BwnBZ7)Fiw+ zDj^s4Y)osT2^W?eSHq$f?;kvA)sjHk$gBOgpbM@PKC~0#W`2>%JjLh34-<;;@0I4O zG7=81RxZ^Q(d`dW<6Bl%*Vj#0ZdSOi&3tleZ#uP>Nk(;0o7TBeW&_S?3$|uUbbEjA zN`s%<#6Iyd9LQoz*k9;~l_Fb<^Z=-ffMP80iP<&Jx0G3oPyrou^Dp z`H*lAoL#^^(;;Lx6MnG6o%&?ACm2~VD)j8tdyJg0Y0h8>TiPq$D>YQ)?J&i3}1;u6gggGNCJu;>n-I=~>~&O#cZwKW~|pxVu0)$VX*q zW$1RYih#_nC49j3AlM$Q)_FYXMtpl|twM9)2u3LR1P`pMMhKa`1g9dHGuMGloL~Vu zItSDz;aEjyZ-&#Q^0|sjPZz_LIPw@?VfI!Ox_FP-7W0rbqh{MJU&I5mOL7(VDa(p`N!S5i@vB^6hCv|J zdEq`E+iS1D?*?UDptGJErU-uSzdgsiX3U31V3U~^L{h~YtimY2pnVd69T(Sf9F~Z5 z=vJ0~W+}ON>vOn_Icv5SZ?j}TmA{}@8CuQ_uNs7;)L2oPJb62tUm>dZT01+Z*B0lk zbIbA4?PssK+rBw>&}WG>V690)N)KcX%_&8vZ(wi27c?delZ?34p3zJ0N}Oeq4yXi?QW zXeIZbL=+dnq~cpgk2v{>bguIdWQGQ{Lpf4z;*s>=-rF0|L1g*M$%5aV~6ja=o3w z^TMjetMgXf4Tn}a7@CFH#E-7mrMdR&x1#q)y-Hc&Cu#JK z1}dn|x7Pf*y=Fms$v}}Mrv|?3mk-CdX?ZwIVm8(3`)-Vo6(FyQ&WS#uO9GoQ&D*2P zD!Y6wK*MY}rqu$6lMS*d2E~XA+Mu(oO06tc9~>IWPW7!R$56$2!Kc66qc@FoLJJCG zKw&BnC4G+AI>q=bD9JT@WO48^72&GXhNhAi3im~G!}Z(NX64J%>dY(P9J@}T?E$N< z!42q(;DDbb=3&_7fquFkY2fdNLLA*-SKZ}1bR~6d3$GIiu*MOav{ z-U@uqUmvJv#~;uA5#Wxi`ofZWz!#I>6Fybvcu8TZb$WIJwD;@a<~k)Hi!hvxsQ_aE z>rj@Dyoj;G6k>w@;gWu25F^XvH6(fGDlrqvxl$;q`rYt zbR)!34J7*H+kivlK)1=mmZh@=HNXsO+}L%_DzL@5S^dF7zKJ0|Og&r>ThDIHjt3n% z^-GF7)|Lb^B}sRS;l0uu?y{c*nb0!`$xmHzc*qvMFNxs`;nfa&O?QvWw#aEkS|9m- zJTN>zx<}eUGRNc^%aOi{Y!-Bi2aRyoZn8&2b@j8r@)-2Ys&J30NvBs#W8BEF+)AdN z6G&2H77B5x4c+JMfG)*f|JcMCjL0sM5f8w0i1x7MtOn+`0x>vsVJB?L6)c}l7sE4- zd+{yjp9pN2t8cI-#@$U<=ke-ombj4?6aqnPRR>IcU!!)))MF-iIlLYV8qDPJeQN7% z(LF!aI|nJY#_2jFn2GmkIeDJO&2L57v>?)7+7F;rcWYN){#s9TD5qgn>2gZDzb-L{ zHu{`ZeQwhybCVgM0?hJe;_o&WGo>)&J zWlP`D)T=Urf!BpDE8mdq)o_CFT*eLv^xEU3Zfxf>e$b|;9s{XuVwzv6#htV?l@DR{ zCK)bYt%H2%EYC#)WDf^(X?W?SVJyve6bcXfW&Jum6`{W2DD-~m*^5#-t%h_0SK<-3 zVi%7cp%ue$D*9o54B<9bllGd-MmkoJ%(>Uv3kH`EZrof(iP85xVOs6`8qd*whqvch zKV1u!S<7;99weS+ATvc2YqW*K@p`n&o^O%>v8(X4SgpDg3km|7xH0jlUl&~9#58Dk zTlfSCYPp(TP|qfgh6q3J@r$(Q@i0>Q?NH&0&8|C3y$Odr5epNTRcw}^PQYTIWSboz z$yAi69pCL~jL8EVvESNSG?#*|nJ)EJcnp?~oSqor8 zY+h_1S`bxHWwCP`bXGHT-m$B!t>EP_{$}0enx& zcv7svvpjS>TPeiH_%M0h7JRKs z2DW1!d$OboLTS%P7#onV;PNI&e6U0refacxSZxwI;Ac2xpW!J2tX zKw^C6Ya6w+rgmP}SdU3&@GU9lYc~-WVP}wbPq;2gwOdZq{t4r4dw2{qAb`G&xO$@5 z)UkohCU5#1b1MDE*(mW8_o6V3;b}sJ$nf=0T9baB9uOtxedF?9dBW#OkDNhJ(3A%sn8!Z^{BSY9BxfFVW9P zVg5)siVX(m%JjLGZiY$MnprjWA_>nEMr0YCkH*$1Sy7L^4e9cQ7VFnU>9zOPYmZaxlDu@rgo%}_*m2uTt+ zwU>P<^9uS69?Ru)bWQyv-WszxmF(ZNcpQ$Oo5zsa&y)8DqDO0mZ~9pk)5Ll5b!aGR zm`j^Cn<{!fezq-4kFbq(<~!(?v(!#51Q0&(1?xb84l*84%j7dr4w#H1kzrO$AQg{f z!Ub99-sHlr|A-Lhr~4M&r0KVPNAw7gYbCoy3kgp#*qLaRhB!O#?7#DMCYA^lEmNh0 zF~{p)Xb*$)1vAXp8w>_}rqo*@ph+j)%dZ{C!RWv^%m?ZjBgg|j_%DplcPAGgpQ4TQ zC8mAW0k|Gxs$CUifgxNg@h3o?4N}u;7G;wIuYa;+>}v7P3BYi6Pb1+h%o0>#%KwTg z5_iXs3iI(=LENM63;yAA&K834wbH@ugwW3UT&9n#6+HqQGc&#-%wldZPue1E$>sV% zeI5U8>2ZvswaN7O6XiJtvCNYkHo~XDgC_y+g~X)umhFCZxa#zvOi~KYt?aDBNX!p2 zgG;=#Zb~gGgimD!53is*fDcKKS2QIxp_lo>P?)SbPnzCs*_{m;UHokP_CIKl1altP zZ#U&Yjx{otN;VlkF-jA?Z1p)_ZiT9LVWOc0@R8_R>nyi*h%_oP7=c36Y9bGbXhU^; z&kC%8-8YJ+L93`x7DBFMH<25iJeJ!n299?hN_Bxm~4AO+|}8)IDTwT zR+%6Q0H_hU@*ZH9gOmg1aZL%j8Cdy94!LW_=`fFIJxcnkqN(8ENb>Y}6x+g@zufnq zLgV>9oGjf{Xf&BMA5($LvRFu3j`wnJUyz;?JUzFax7(B#0VcU!@?~|Mq)J@n(pcym zcoi{+OYNLi%~mi}L|wEXsl1t~WTaj}`|`Mg0ks9_eELcm6`Svekw5|{F1!ylLswB~ z!omB_`hTr^pHxfI=sj?Yl1^G2!-d?u0-#wKWgu11qImBSXu+T7HaPvh@LK0bVhTh* z?79$a!xcS9DGoe!ed!NqH25e1s-x_&+Rf9-|FhYwc=2UfVbLo48-T(HK2}5jGqTjN z&?s#y*x@3z6OHsCX$C{ntphcst|tVysjj#AR`O-$UKFhKh-&6+M9=)Roh4DGm&KL?YVRRbL>7>kR*F+E5`pbl(&8gRA_6u0y;V112aceK>aBBk@;>@Sap~!8|*`J!+Ce z9$zh}OgSm*2E%?QNTQL15v`wkvr#?+a33e0U4O9&_-yqdxtJzlh=kFExSDiRy&ODq z)h+YCzAk5d<)v6Xf)Zo3YA3{I(kYW#V2?#z;Bh8(fYa3NjS3dTaPa$7C z-6U-YB}>%5{~G_$6QVDNq;!O@Ba74XpfwFp1X}KV2Tf>r{~__tgkI^w?Q7QJuU`_$ z_=heCbL4S!eH8XMHFYmwC8^Disi((Sipym=#QFgKUp^V6kPwhf?qU*OPB7zoatLi-12y@{3 z%s^wvYFdti>vnBkk!*x$U6$58oqo;1AX+V{6>Tkk{W$emgodB=sk^Aj>Rj9S*Yj&F zq?u^DreXZf2S)-#Asw}$ZLXfB)@}D5rxEq_hwKjDT?&#A2n#ae0v7YUmwB&sF2lLD z^H!ISvJ?5%hcc4${A!D{8E5mc_~T!|%=!&@AK;S}Q8Y7KQi;=pAg_qEs?{g0f4#!w z8()Fi(`@y`wiDe7mm68c%9Zy`OqsnPYvt`%t?T+O95h?V3>g|<9&ohh?k8BA@d$qn zO46cr9@9k=b}d0cVhCN(opx?4iQV8KZAI45Hg~DS*_tW{ZiMTq0efhXB*gN|M{f2NKPOhsMDopUb&4 zjbyepFGL`tx)WQLvoO5<@U2%Nd(HmzsLqa7=V9q9+Gi<}Z=TwiYi`=xBMqyZrej~O z)9;XTVJd@yKQ;Q)2j`gTssJ%*_E%K`i zqF{$FNpVb*ksbqi)Xs>TS}TcN*^1{l_;n#L z-%qAej!W_gL>l~e2_^h;U1MN-V0-ZW&F2Y?(d zwqT;YQYr6V7jik(#C`{=)>KXDM+Y z|MhIg;sB4uyU{{v&q0Gpk8svFJKny zth+Ya$K<`^To*vFUAnJCdJv;%xBJ6I#1gVq3YTKfS~jRieF=v+Y%=uJvH_c-ZE^+K1(Z_4McR^S9%cTS6Nml@m3Gs~_N(nyX9?I+NO+aOqvm%C3 z)zwIy5iy443T;)N+>jQPB(Jj&oqYKWo8nUqlW1{kGN$C=48bp~W%^D3Q*}R?ET^t73#SVp-pN z3Y&UQ4%PSd&i=BkaZcmYcJA<3`hXPR?uowc_V+bj=~LOcaJ8=xY|P{Xy^04U8`DXM zr7TiN(vj(;!2*k@1fhg^!?3yJ`nz!8fs?H<^jr3t$QOmB1dK)VXLWX2M~C_8iNR{E zD{bn-4yfbWPy0Jr>#W)Y8eU019lF7O%*l#i=Azn*j^5qi{)8NJ*H&xDex8eLXsa?> z9i{U^jQLo>JTyK8b?URT7HWQ`UAxhMCcaRs-j_Sv4OXSdxbZ0sJ13C}B6LZKJ8Dqk zxocY{zT(RE0<5lFJKM+N5F9B{Q~Pik6cUUDy=N00LIWrOiOAmw4>Osf`6w+SR&cM2 z?+4{T+X`Or9B<5Dips4hl2*m$!LIA?*n?nMAQL%^ zDFTj|Yy4|43_Chujmd6u6$hBBfXWfgMSKSjMC#;2e1LEFjH6+*)7m3A+x7tdrBDLJkWDSQv6| ztpn+MLtGZ8gTZ2BR=`P9-uB@3J@6Ck%$xP-_15MLtRBOvpMZcguw*qnCh|!$B@Y|z z)93V$+d*S``F^yyL$u8yid0mxa?o{6@tE!1sVF6>o{@Z?5^GZ^^}!psWx_enHES+P zUqy0c%A!x}?QoZEN1H!Peq+g1!*38#fOn-jCCI-jtJlfa|MkdQ?d0{v5DQ+x;IX;8 zKu(rDh58_wxrPthlHTvSH}(9*{SdnTbcJKsCBk9iqvsd$pr7h}w>}#cr3!0Y<~PwO z2!|QsFM{8P0!%q9j3}szMM1=5!|jcQk8Kg<)Na;29u=5&rDYEkf8uD!5ufoat)(Zk z56gmaS^kg?fMI_G8Wp%j< z80|uo99)Y#VjIxBLJu{nv1z9E!%W;+5nC2d=BhU%eg(Y`D#E1n4>LD{qKD_!g#*x} z&csRSG7m;t(XmsM9?vD8^=+~wjfSE~1_WQ_Zs9xT3WRKpfMUXKm1uu5Fxyg6{g_+s z9vjAyM2bT*Z>3r7&CVF46N^a@ZCatxVm$3eK2h2%Jx&O1IP0tScV- zne;RO-TpI$F{@jQC?NI9@*;m|F-#(f@l!X$-oSxCFk?I6Q?A|qJLr45 z4n$@-G!k1`9RQl1>RGJbN^{M)rjLDM{et{AZ}?RkxIjKNzkmSFv|N#w(pvmhZ&zU~ z&<`OI!YFbQuk12+`|Cmx@5j$$uoJ9qmm1_9>ZV8yXb{otY87ClIipWcmIU~omN_ag zc!x6e_#QqtPwY?NHyL@&u%fMzeGm>J2{-zO?e&^6rOg1Ecwci)Tk zP1{j}bC5kfr)juxqqpMbnVK!EXTOJZntiEQVs8>IV5Efb_!pTsrw&R{83~3u7k2pD2UGQra18q#g=j98Dm~q>ka+FK7dC>-K}OV{uI(RU;VkCDRQ(%e z^I$*7rpKz#f~HXU3e5vLj0*@eBsDI#Q{@kv#igB_ldE6+Rep7+pU&vNe^nSI=e1mH z^wWaWQpWBI#_25swv?b@45#U(f@^zSdV%c9L=!HbqPOv+Tej%C;c;d=cG928cI*q9y8d*bf11tjz?9_l&?ld{!jFbZ)GOUP64}%z@Iz3qJAbr}jQLsqR zy2rHK`~MuBMNoc%CI47oP7t{H#qdH3JJTkDf!a^J21#-cQtyQF8J`pOJ&*-%^Q=67uNJ3mUE*O&LH3@ltf4D)Qc@syUrzQasOjvK9dSp>TRAS zraLzLuM0`2cDR!s4WXHr?!l=cg!BNU05G_1V)&pJ=ri@x%=vByn|b_ujLOhrrl1Vb zT(zmyD;^$+J#`x`5Vz1DW7}TVVCN8{abN^4aFKjBryJvnrn6m`EY+R^uaD+xwoPU; z^O-*oiR_5vOj&2Kb+?(9;;bo)8dh5@miCU#zpNHhLxV>(E0kFojeByUgr=LxLL|`_ z1@3)MJz_U@OrgZPg}MxF%_r@!eMXF{!AIq4BB; zUnm!BmWinVaqPc=mM%W+$WN{wN|rKEWewqL0Nr;|!Zg=WI!0Cuot03B0QsfaxDy>) zU8s?CZz?+gN2Ro%0drfD22qzNgP#g7!C`wCHvWP>_9D|;izQ~M)HxEG=khyN$^ds= zueCPfT)Cg|-TgwtNt4a-yzW>Pi8>oo8qvA|q4z+!oHf>XR-@_s4s4jpW*(n3O<;P2 zMJiw#e#2?}0N&)=*vB~nVZ2Orrd1|*mVM}I;f-SAhu+-sz@s?KcxFboZ#U_&F~VR- zrEf;-X_Xx(FtJkTt)4P?E22G1@($}33f%pmyDd*0&y(u}U=1X`m_EBxzN8v6tg$mB z89p%P1IhZqdjsEvmfWg*5H8=Je7Dfb`ob%WUWLM+h`Kt5P0*o)zT=~}R@~F!m3J?F z{4&0mjB=&%fkG9kthtv}7Qe_)uu|45_WNX7@1rm)79Xb5fI{h-#c^KOrQ?mxKK#oV zVB!I!hZCH3qc*?)YuU7R0%xrXUY#^{x zVDjD01D|eqB4L}3C9AFGzIvtW>)!Rx9kbi&#oD>eTts4b(pH|P4}D%;7_;@eU%3?Hz=LxpDDq6r15tnm ze2N*>>ee$hT~)H&7jsC$Ldf=cKe(fyiK=CNQ)lq#aVLY7#S$z85fy^)CiGZrFr)lva3ky@?6{@< zf@ljX6t{R_FD1R9TLm;w*eO9TmT*C7ZC=Re!L%=oog85KG! znN2p&9@w;rn%$065-M;VSZ##!=36GIgYZQ1h*`-lib=G09-N+fH%@WDJgxz^a=vIHw@lwO^A9=g{Wou*$G70rEZSE8Vo{ zLfD>;>reF`L6Y12ICr$2J0zb$bc1g$p(E2Ko z|4O-b;}P}&klf&B3=}xyE|4k%7$x{x^xf*|E5|EVf8w7k9EU8xhm-_>;^6qt%b-mR zbpqf~7GfQR^5cXDrIBZ0_Rtr^(ixJ>)9QN+D^UIj}?Mb=GhAS-qea@t^4HtNy>NHbTnX*GQKR_=sE zw8$5V8DPa)s9iSH9dwRc_ndz>rmOc+B|!oU?FRR#!(xd`Np=y{h`4N0EpZ;{b}aR% zQ%jk01LHntlES%>RbTHM0*_WWFsu#pyENM*!O2GVK91f;S0%dS{O zK%c*4C;9t`e~1V{Je9D2lW3W` zOO|-i9R_H7iGWD%v658JWJ+S9qm{%^Jo$@{!;^q5ydxPy z9!|wFMGtn4j;vL!IZHdxR;>Qv6Tf-i^YA9n+Nlz-6_*(}rk~iPw|@M+Q=h;0&g*9B zk23%OKmbWZK~!F;h2weHAV8=I6l@Q)AZEiAVjLpACOVZ_bKDbSyMrK+g;ltVS;uI4 zQjYJ`LIAR8Wkc!;;*mhFWU~v33fx(UoG}zDeq4QMARqr19KAwm z_dNBMRg)eyQ;EW3m~pTOBuXX)HsuCi1B-K7g|l}>vbc7Ajk7g3!YGW!$X*64FC;xE zC(#|OG*>SP(qxrFLOQ(zWOndMj3HtJ0SaYu7*GVx1~{<_1gMO(V|sIDkA2$|$7mj@ zWD<@~$}N;~UDMrt=$h;cTW5=%8?KJE?M|VWMwTm3O=C7x3O3#eG^o|;7*;1+v3C2E z?>+wXd-v`;G}?8QkwLDEDf9ELPVD>KBk%m_lqvOxY&{PKMQjUlG_{pzPSJFR)7Nt# z9+yT3HB5kq!Xt~3z^oD@T3t1^fR(H<@&ZN-f8tx)t&~|yn3-4*wO`jDlE8f}ngt761X;w%%{cjaG$YF?p&X+!XiH_%Cmyo0 z2cP;(I_JkG>ApT0?MXG*P`J(j_ySrNv@(!{$U7k#oiKk4t(5J$B7xzzgz&6P!W@g9 zdlg1+?k7-()%I4O5<)i{EuTrw61~Xz#YQ=-j?xy^jZ8sKQdULvVaC4*Xb(+41DeB-|W?Df50q%&&Q9*;Y z?Ql@_qvzgu*V3g+Z$)+MF-+$rcZOq9TFWOFH$VH}``@`NA&Qvhn}=U6L%2DL zG|EfYR)#1oEbsSz_Gec+zL?=@Dh1a8CN2C6n@N(ZA%MfL1>|e6q)-?)A-tKs3(ctq zSB6C`p=k}7m^BKrTntk+VbcP30(~g?zrcQ}sSNMTT%)oAF57-c37`zBd0Hk4f(0Zb z$Pd1Nu_8KHd1YY{!W5?eHyGkzT_SbJ(hRR7NWgJFN4Vn+*Tr5(Ra($2#R`{Vu1pPrTUvj~N)~N@sirt zYdQN4Uz1gYc@>&;eR~)zU_P3 zMrgi|aY7-djxtW%Jga8SUAN6zJ!9&aqhOVR>tQ_w48!Oi>RTtn6qx8i49ApsnKewB zw28$NY_kn4wl&w?03keq))h{Kpk{zQUul9&s2u@`38%_xE4DWh}upkXy{TZlb5FD!eL5LQ&oc;)$TRYek~4c72nx!>=*2jY(Zgp(AKueHK~|6k14p9R1)#o{Yglp`6}^!=*(a z;`}ZSAqHAAQ1@Gbzw(YoN0VN06!OB>c{7V{zT4g~ipc-t6q%pE8|pj1;02 z6o7Tl3R;!QX&G@e8;>tvd-$qludSK0Y}LAJotztogbjl`A?~}QZpAwmUiH$#DYb`c z8X#BGni}vx6h9~J8(IJ3ju1Fh}GPHcn{*Oh|>^B7^kofXR-Wq@ErC@81JOSGlhGe z`i$M+SJk`9nFMAr0tzY%!Z*Ck{*=1U^k#!4{oF$Fpm%UpPVde`fx6IhF_wdB-j?PBuz&9ZlyO`2!ZMl7J^_vT3 zj@mJGa$|=jb%^P3;YG@ABd$86uC?Me9f7LuQdU*Y&@x%ykNLW37L|ZzNWx6rrv>jo z;RdG1f%?Lw4ofX8Xp87R3`i*@MhU#V;t(LNK(emoSt{o0Ezkn&GdhBO`wnl)EnTwI zDZfxu&y>9uqRPEUm=DF}LL4_is-?bLJJNoMwEsZb#uf0C9eEqYxMluH8t*Aha0_vcFNT2W7154=|NzJp)jnqK)Ph-i;IYdU7A2b zI0@q%1_l9IANsgHwraO|8?@pRM!|b(D$Q?!`m@DmFCZDc?6!dQerZ>kXzst0iJNMfCp3G6iG2Jxn9oiJG9ErY%aS ze5!uf4~_Ktq1-E>$dmT2XLwpv2KAY+#2~s`a0%f#UK~qk)=IBfqdCW_O{*;~>|9{j zqQg&!eJ70M^DDNFUA1o89UC_88lQI@Ods%rrkKo5X*3Ug=-m@n+;z*8H>%S~a+*S| zkcQaG))sVw+8UDj%eL!lM!bA$J zC}8j8L6pebD-Hp4xHQ{>Q&h)OdZ76b#@iEKa$j)FdgFhVwBmieQ!^6p0CoHk$aVrK zqXyzKrUI+|NM8>jissI&|HO+bUNo`~!Xfy>;6u}qRu3K&vLP@hcrx#LOZppMF$^=u#yo@bvdRd)xsi9RGrkcb!Y1e>)yIPyL`)B{owBLvUmWZIBZF1rBze&0S_y2sb+?YGRxZ2Q>#v!0tdZsZY|q<{?3gu=_1387qr zZMX}I@c`4_$ti+wz(GA0;Al5&`Xl#pybz2bEA^sgA*-gSZMf6#R*U@L* zBMZ;_#-m0unW@7(m9bbHYyt*o$@ealH)w@IVF*VQAQM5*hNmw-&^=d}n2?u*n3RxO zA|BK0lEP|?OY*!#*Wo8LYr!vv5P@?F#Fr2!s^BQ}RCJVZhAo*RqV*8A2j_xb(NAFd zQ8g@5s_po`w3g~tMk>g{n|w>b)(;#lWR|U1H|s|~edgZouArJ)5U3p8nuM0U^M;x& zk9_PMzi1wjYSZ*AWEsfen6Om9sIaTY;9f_QP+=yI6`ipiO3yd}Ow&PHuA!Ml*RO^z zU-%VAQ-t;g)I&z>Bn@%6ViBmMz)H#llR=-I2Hc8{qtag7O=PVTnjftH^22|65U*RA znS>9b0#ZQ0-q-kJOoaP1N)Am8KqpvhT3&kQ<*(@Fw-p&ritTC-lT7U{} z2_OW=;UPR3WMx8Y$y)Y?jr$v3dF{RiZhj zY{{8Q)H0&ajv3~d4ueT`aZF69kLe?mF?|Gb#SM(F;S%B%B!$xtj!xw)bYt?-OBpDX zG}fihqPP37QV#yTvBoG@qgRMKzNMq~cyd)WLs1m2Mnrj9CXjCgf>LcDga+ zM0ZTzu%or%=TEJ=|F^ejzm#AP_x5Xzhuc0;$=hxA-lkqxCId|tulNwILqHc7=gAMP7ui{h45P; z^sK-I|M>pL{q<&3aUyd6E;QWlLos7<4K3_K@(XyA->!l~>-56wtCPj8N9(=AZbA#{ z61r@NX=Vn4G!W8!aw>!gbY(t?0ytb=1WN71sn5`tf}_OOC?CiLRFjuUbB{T9)Cp_e zWM8YVk>VHrT&ogzX$L$zB^HzMw5sz9~E`dw;@B8rzNs zRjbx*p7O-cU-;nBLq{`Yb^_&-H?CH1oja{+`^O)c^URD%6ONiHZ{WUYAu-a3Ml=$} zX|Rtxqqy*a(1m#t9m1f+&T3CM+6YYagrz4ftVjP5@1v*W(BBA@TEqUn3zt8X5va$@ z-Hx~fk!;0F->?e3ru;2<&{Ig+he(ZB6e_>+QaU)s`+xpdnKskARabt4Wn=sd!VzRL zv`643;8)~goTPD@3r@D3CPwf~Sk#d)p0b3Uu+2$voxBgga|$w&V_pd3Bt;Qh!5v7v zJLNf|=eca#zL@xBdzedoHiVYj=B4-FbKBHkE}T1gS5uV% zZ-rPc+%jYiuDyz;rC=Wk(Oj2V%}$(v2bGS%uPx{%TqtU$tuc2WL5wd0P3_5lKE+=oNy9>2(^<)MSCR9z;sD3fU^|c zR4%q*WKg~9A3yRXQXo+M5+z6V9Bpqx+Czw+z-gQhOQ)S5BkdQU=oc10bvUM16+Z<* z{C6OLlNle4AVvXh4BNK^#W!EI^Ka~{D(>#8(*1O`ZA`XxBMor~ybJc?pbuKg3>=X3 zk2oTNIoWZI3ghj-B0zkbgzbnhdiXdcP>86cOky;&(W*D4ciOj4f>yj)Xesib5}w7H z8J_7LIyR;Ig-zFrt?Q=SEeEQ6MN8a~l?dE!X0T0*oK~$`@`>b2tKYn8*{iQFT)zAb z(uz~>4#U7w+;da)n)lpw&8s&on7%bG@?c@E?z^6^8CW(G)2_&JoaPF<7l{3& zbi)|1+m)GC*PGPs1u+`b4wsTbR_cYKxeZ?@`suMsIhh>2G4(EK|KyqIqCU6b_tNK? z;he|<`EaiNxA*QnA094?KDv)%|09UEAktzNrHO7*d>c8wjN_e%q?+s<=xZcq6qd7O z(-LdPFaKhuW2$S=0Ab}{aw33$TyUj=p*6Rp5{D>GRw{;vmWmh=^idgbo1_(tOzZk6 zsKc?I0i4p2@DA>P8=y@)<<`-2pOVN21BU=9lc^bss)gzbwTj*o4a9rU2f>w>=V1_4 z_Zob^Ym^xrO~+!#4L|TYJVW|cZE&zXmi+F|URktq&AM4Tb{>RVFF|UiU{tl{eE1zB zpMCe8b5=|mo$j!qP!d5gobv0S)Id*|9lojBbUl5-H%8<C%gGs4quq&58hGx;T33(X5xyz=Y8fI6df8+${WDDvx>pd=Q{c9t^pALTHi# zl7lcspzH9h6VNOt%2J)$| z!k!4~u8U*6bIj#~qj0zjf@>ji@C+N&WS+UCp=?fHt?%K{8*%##tlJr2q95Z-;YT4B16j& zn8%mC5i0AV%e%d3C?Ug$Jvjcq&_um} zEgV+#smh@;sH_01Z6?I1n)aRc0iCn<$cT%MnhVo(>TaboacAdZhv zQoO*C91M|gNSa0X3@8RMFE6Wv){&6zk#yYZG%Y>frP9jL)1Zlr|JxN?r+@9cKe=yz zOLi1yC&XfKoQoBnf*Y?*?Y#G{ng4n1%;rP&X)9+!mMMm2w1~0o+5%&I zyQiu<1CekbB*Beg43bv{J%R)X7#30>HIUFrQV$<@5d1_4R!EnF;Hd`tBUB3GgdD8{ zh7Bq6V9RFum@l9buF++8s`av99Qfv=U(KIE2%+mfjdP#Dwi(+5A{7ZOdhk6E`2SZu z=k|l|`Io0hVIJtGQ0%*LK{GgAoX82E0vMX#s=Pxh_2T-qac^r|vUto(nkrponBy(1 zeh7mX*b%@i4<_Q2A7v8*!)@r9VP;-ph+#7STt)dBpb~z-uod?W|M0P?g;(B~<859$OYA=s$2w-Z2L+TeG3_!fih8x| z^5g1Ar%3$l>EGV`vnQXuslCIm^Re0{wBj0E`Q|_L?vcyyS#;g9sm;}0aT}}F!yCCz zT?7)o5onebRuslWP^_z97_tDG@74mV(-Tb{fo#kQEPGEAYKYwMWF>AL(%(rMtbDJx zx$j|tp`vXQ^P=aWcQ2#YQ&5S{ONW*FJsF164h!VNskSffUFk!j2}>VCd;|wG@b%DS zOA@h;;WPUcKDqB>|8>N6#NHnslEOgg@}VdHVkCs{u?4>{2EI`sS1Z$lg&drD!On#8 z;oHSOtcB5<(aLh7v?5F3YhXt3o}$%4JCKPBl~e&#r!dBZiHiX?gpVI<>Twtp2$0}i zs?Sp&C)AXK{p(OjL*T&N02pq=jX-zDcT*O0uNVF3XaI!3%8x1_N%G9-5&s z&DdvXVCbf&hgQ#=={XH^4s>&1I88Gw4Q*pJwvZ5blO=1hwab!KC6!85s(pF;cGukI z`yy}Nci;YAy?5WcOGH(^%$pe*%a?!r@y8#3{E-LUKz&ZnU`cG#YC#_kSJUXmuxJj7 zAu+!KvTM-5evN_soD9n&P#FPMB2ggcz#VH#FcqVL4D^c`&w97VFN{6>*@uhJX-9!y zpL~P~90V`=7x;BQuJ_`=pbdK`Xv%SXf8x5##tnS{yM6Y+6%hRV&=$qR7H4$C3i7MGN?}|I;t`My zb_Rve4qF6%u-T6Wi4{Wn8+<*JP zGavil{*%}2=@>Ur4#$HhPWG3Ou30X4B7ZUObv%D*G=~@bU3W1%%dYL#? zS6Jd6x;_N4ff+~D32PJ8iFYf{!WgUji|IyfTj!9{{%bTpjeS z$E@s(r^SMt-ldGg70OHBJ2&veH($H?#Hlm4jgE}=g7DPAE^Tsuk9Fb3U8%P|_P|Xi z?znmPMNSUWcYtFi^hr37n}O5JY1ltaxO&HMN$n{p(2Q%oS#;b4N)hvQc1YM~h%_W7 zc4^4~LJ|~+d0t9F7%OZIcuVCPb!L%J9>t69N55Blo}bQY-)oL|FhPNQ5(e&Sh-(F?hFM~w55A<|^~-oni^YREBql?V(s? z3!IzwxoGO5q}dY{T800!Z=;sAu1RJ3ju!^ z=#i41tE8bIPa9?ij-LjgLrPo0VI$Qn@ELZ zAroyHa5AF}Lx6mQHn_Au(m5Ls<9riKOKdO~)p3iu3oj_H`?h+eJoMZD^0%o}s15w) zaUA4%9{>gX6Ho>BQ()kFm{Yj-7)a#t`~LkGPVBtzlOG4;`7IF64!j8R1ViFD4sPu+ zBz(qq-@c$ZLnUmmnJg*$J5{5U)>XGt3!GFDB9Io@JAe`c%25ar4-0>-_b(GAFN}g< zu=t^=F-=Vs4fqtL621~}K& zD5}kM<_M&SLZPE{^u!(0&%JS*e)^s5%H#y(<#2VbA7Bl;@8<1GmS zLk#gukDL4yG(#VP^5L?l_2#jK1NQf^J?PIdDiv;oApr6#FVu{Sas_|$8bfv$v?;S zDID}QzE}{F4L14Fryj{<6Iu6Q(a{eROoI^A+2cVN=TMu{I8&k)3A_#05YlNk2S&x!;)FvD=$q91Oes*Ul3y}mFP_D2b6E)ALPZMVp*SQ8OL1HfEC14r90wlP z2cU*ZwYBPqO;420q8@Z&IbZu%llw8{=`?i72!tvpUCdVgU{+0jug(1>tW`n8k0pM2)UJCC2d zaMSeIbSe#^NnumYo3Brt`plJu$>9 z8L(+l;#v;EcrH-WBc{-Te! zlydD#j;l$fecl19kfFs9V6);8e2M29Zm{;nV!^3m+CD$|o;P*=ymJ)K9+_36uybPP zatmVrU+7$J!!ZOH#i2npSE3#} zuwyaDNU5j02RmN1ZXCE6+nrVmW{+{s$(m0-_r~GB{PH(GI&}HUwsO(e@g;*4ycYi8 zJsl^1?#J%dYDiER?NL0XFs@PA4*J;|p`0|mny}h5Xt{NxSJXI_{&3gThJWgpve69w@H7VzG1V#F-C{y>RR{<=pFC ziK#Iy?s#xT2$cZFiHfCpR?HhK_F5-S>zS`T^UD2?fAu?ejgAjznF54yw;KyLfAME_ zf9oece&icn9VtgC7XshOt8j|q3->?}!r_@pR0Aszlsr5{!Kb)7rdk$+@$KW~U>i0h zMu#g_CVB2Y!3`uaidc+ zyJCjYhec1A-i3h+WhO*})x#Xt0rnT>&u$amG&li=Xka_gnS-lEGs1YfF!+ccz-}G! z12MM1yD-M9I)`DJ3`k3cWe{NR5e2N$g#SP{KBH*aaW`@9wNp1toxQlvD!7J)9akU= zvAe>W0pBXkc-Ksxy14hm*!Yp%w;uXib;rQy|NH18pLyaNFWy-60u9^5VP{S?*xjR# z{p_c1_~wuQ@O@7uv>C|Ln5Kp2Iu{NwOKMCl8J3oVc52MmJFeuMeb~Y?RQ8;v3G={=Wc(w?sE2`bv&Ul#y$F)or z+dyJQCsd|ZazK_EW`)o+u%Ou!^tZNbu0D3N5_Z%uYiq74U3o|8%DMiI@v?3lyKsNu z%GmAR*vwwd^)V9T0ylgQ!?+cua=#ciV&54{T7U8z_ul)+Z$JM$Oi_&6L6yIQD7PS0 znyldSXwYNg1x%O{qzoH`06#qiU#vwLJyYEN;(zxB-+b=6{M3a5ZzZhT;#u?P^|u}T zc6wL;)U>U*C96Z3@sq}Lubtfghky1rKYixR&>-kfg@bax%T~*`-HP2*!k-RE!|W;^xu-33LMj``$9F0u!ZFls?sGqQj1EY(O?Gl|*e{(NYzY zm6=804{yEorgsAMlkngD*|=iU427Hn60Qrk-fB5h)ZYJ(_kZ}AZ=5~-)hFJ6|6ien z9zk2>8WKbeIJJvTN%;>rp2I(t-?3_?6uNW@WaMw6yIALWYv z1bK4iHEQY5Y~mVj6GfEDDT%y6_hg67mI=r^__GkazwA7NYfnl!T z9%1^`*B4x9LPNjccJ+p+a`jj1UPKHQ_KAL?psCv?RO9q3@80U4FZ3n~I*du+As%RY z^!f!dpzSQy>8g(7Y58eu&$G{*{iWljQ_kZrzM6Gl%))59`t|V-9?l;7iI3m%jl;Y9 zM&iMUWUDIl_Kc<#L0@~j#jime^8#nvda#UO{{+7AYbQUMIW=*cTP$?q zzQB*3l`Ed$zyUxBfq$p%_ybC*_#@b@=h&F8{?8zW1jv`eGcHzm`?ofqjZJwIQ{yUJPTMN< zA6_1r=?*5x><@nJzgc}F@55ZLfTtLMPX~j!;nKj%@4s1+51hAq7nX_ROOLM08`K!{e7nDJzh(R~5XljzCdJh;$uM zHl#onfdtnQUq7nY2A!oqzCl1XXfo;_-+Jo@sf{Vq%0}nr7960>I^<~33 zLrRhkB~ zJHdaHgwizrMtS1`>?``U_*rCD^GFCdv|2z_9H{NF-3Hb+At7u=qjT3!G5^Pu!!ZZd zsT2-HSWNgv@3vgv3_xoJ>V7K${W<){3y~ALUNs5mM&CQXvphW6Y2<=9(AFr73vmQr zP)z0HWeQPo*gBRAuAaoI&mGyg9>WYrH$ zouFt~@GGEeQ<`RtlyjY9p1yrXv#r32!-22c;dC}cj1&lxtHQjn za9A=`?P3=`^o1ATQ3V7UD3>9a|2~laI)0zPX6Kv@i~>0UTeS91zx113Mbq1x zQN06};wJQ&r_UyxuRqeItAjDi$Ru?=0f`AqA1D$r*;&37CB~Mp*!}4FhM%#F8XEi{ zKNU}Z@0IgEs@o&Mkvn&O$FvNLfjKr6ivw{L@-)&`yU@>?u|}(6FT#~D-7{LSEpPc3 zo_YJ8;)zMU6c}o@><~wAGq!91%Vr4fgXWz*dF<4WUOss;_vY}F^3^wvcY{PMxbRhO z+#4IZ_qM*LK6vBa<2N4|7|CX=q7sy$ZfCDWV}H!x8kz<-hDcFUX0UjDTC@e(stSNa{`Yd$ztFPJ`qOLws>hEM&Edo*?UoBEi81Hv(`k_QpoA^1{$bJ+( zLI*g6==H%HMAPG*^ju>EyA(8SC6)60)Ln-U1s9)sb_lY=??Su%I9@q}gWd&}l02DK zaKpo&w)$_n;o6d>4i+2-tN4^j13PYNSUwI_bVYE`;TsiMg1J!Oh+zbugtI3Y_a=H2 zV@FEEhINPmZj%S6Lll%4ohph6Q5Ld`%K~pw5OYDo!MSStY6%0)Lc-LFz%7{ZF+Bi-8(7~cQ-w({TkM#$ti%+jWoXkL zisWdo7!fXA+LhTi$JI-}-|SDqL331#Oc8wM_}Sgr64#q>ZiEEK7CZ+6iYjC#s*R@K zVQBGg+ls^eCcTaP0|cnQ0O~K`7)8AKi`D&y{^U2(9X<8|S91pq*YCmt^myDWYMn6o z&D#2Qtb4)cFRCqA1r;CoA5y$1L$x4bGeF5|X8WRgY}A>?QZ(NKOGT1ZA)9;@2w-Z3 z;x=0`{0u>`Vw#d_6H>s8C;} z5c1UE2&~M}8@vLtcuOLHeJsm^MoHNVR?y9Eo&O_YoZJ@e8Vw!mv(aJso}(lnAnnP- z+>EMx*Y%ZegM~vwB#f)0OvqkBjvd_*$tueA*DKzhsThn;u*~Nd{#_!W!MU6u~@3GZPTGeeF=*3hYt_h~$3;|jNbQiD(LB}TEo6TC61ZHtY(Xpi?wibr1TY3uqfhTA*AdK6QHOB)rTy;SvVaK}QcJ;>E zOIUrifiFNa;>%Wu0YfOLd+AMAsCBdObaiRcOJLQK!QC%`=3HSMH4~o|@4(ndgD`~M zc`zcxcR8@H@7SI9JaF>BV8?_Jv%ET1dy$q5BSZ zAOFamhfa2)bG#HBnTL82 zWW@o)EP<^8m01d1MPwPJo(Rmgi+biF)7}aMV7%@Bh~)&kAd_GtI3W~a#-B#D=v{b& z(xPC!5FId!n}m9?yX5A7{*w>=yFYsDvG=jvCZ=)4fIBLG#NDIcJPSVa$WK0kXOCdI zSGj~EQeE*GbBY45wRAeIeei=fYoC1J)~?-s@uX#`*yIPAX?StLvOmgFSQaD34lvGJ zS~$UCPjq**gQ;|SxQ;U7dH%?O_h1JD`wEOQ%C2gcv~u}M0Smn_2}psmS094A#4+2@ zAwq>dH$+##S|CJP%kWqDS8P*Udt?6fVuhF=r^$W`qa#jWK=UT5hf4-3;^59uvkUm> z;~s2COr2UHD%(PZ8_6vqhwxJYKP;=o_d~~~!5i4m{_Ll|W@$!wbVjkL6n8b~meIj! z9=wSmi0_9l;RXga4)U;pPylNyC+j%AsfnC%0}iNZUI~pov%^qNxIUjl8%(R-AyhWf z1t)eN((K7Nw#d-SWy~^L!F16t=Z5pjl~cpYQ(ygh-ucqk-^I`un;VJVn?>97^41%V zdZ&LgGWfS2_~13J?wMSBf+Z-J1mj?C9+cs@3{>GmI6|uq#LmM12Cu(?gPx7bucAAlyZ zTeM3yR$)RLu5uD{kr2Ye-UHcySx~GkV@s91r~g_hW}Sz)%6*&{1h)0C#fvjU*(erR zPL0tT9&oT;8^|gYTZc-f;PgH7^3inC@?m34;Tv&TH1P&XEn-$)C0|-1fE|V%X06s~ ziMYJYNdYKRp`qt5J3c-It2+amXk$Bt)0ao@gYbuGY7PEZ5R;<>5X6B0Uf#)Y$7o%{OiYF z_$c1+AW&0^$1DkEZ;&oKGIUh9N3y0df@(q07sCWGmhdA1ELDJ}lhOldki>utgkb`E zM-*#If&pO<4is6*l83!RbJv#3xsnR!2N-`Or?7|hrORVb=PTP$#?PVc&|aAeLw2T7 znQ;zpTxAuOC*Gx-)>US=hS%mXhc&!8H);i*JaEbxL7xdSz^oi;F_cguBx~Lh3%c#A6=7i!4oevk;4mDadLt+nu~PseJiA{gtm_1#Z`1kA2O)J(>RQu7S9L zl`=m3_~2D`sL?`OLc5qn3Nomc2-8Q^Yee7Rz!LD_G#_TQfD;+|=tMsL^=~{69W692 ziOk`69D039mfR*Q3Kh1BpUcxv6n~B9FsGXQ*7*KLMX$)#Yf6qhi2?I5U^PK-&4g#{ zFMHQv<`HTPkuoDq<+npqb9{RPtG9mW7=vJ0sWu2;qn=nG!Kppjp$!+-HQT z0XhpvKnu#k)S|W@asbA`9ZJ-=gknJW80U+XoU4f#;1r`1IpteV!%UMULj+MKMn+&n zzOzwGgXLT#K5cVyt>32&3BvMiXFcA zY5-&#ApHE@cPiUsaoDV2`9TE)Ks`%MyoLf1qaL+@S4$8E3R+tK<1c;l2bms3aC{@! z9^mCLeG24w5cP3knjl(O{D-arDcVpeMH&n- z@S1;j;P_=IbU98I?LoYYn;~|LT%QmXr#`7KpXxH>?B!pKp0e;fD)7(@st7NpU_+Rd zAow5yHedwu7z#wSfdfJ@C{+Cn?*9f3#sFKSM8y~J5~L)Bt}Q4b!IHp66c77Qjh-4) zMoz)91p`5{Jq*3@Dos7`4}6z{RhD2CVU^KVk<$Dqs6kb(uGAkjV>86$L0FGRAARmY zY-GyeFJ_%86d4wsSkyI$?@_XDn_#GYdsQULnV zNEJm@d9{utR1gb{TCkv4O>6leqmQ{UF9sPOld`IdIX!$Aehd;2+!(^$fjVJY`W0X4 zm?%2?a$-wrcrnN5DoR!iD)6{2IjR_Ta~Qu!pz<*6 zfA}!$(KxLMmVj4GIDmkxgHY+u7Niiqfp#w>cKo5ucO^kg0SiydWLP{9s_cQ5;^_7ka(G2a0`PV8z0^lPz+YXMqdouF<8UHlRCbxLIngM?v~pe2@tGEPXL zvn6u?`3y#U*x?XTHNHa#KSfngtk5Yd@Er%6Cs3IqmPab^hQalkuo33x1BHQ6A!!UN zAz(nGUD9dwa?aj9kFN22W*MNB<3J+g*-wI2u_G^ z0Sj|X@`0|jps-`-_AB(cM75a@(-f?j35xjPU>DD#5eud~(;h84J14wyZwc!^$xBHz zl-H|a5h9D8&8PY3{zjffORJWFZHKu=B}C(y-AhYk8#c3zEJ5p}B?a=<`IZZ6f_D2P zZXUtWMW$TCaBJhTDe(ZCrjHD3^tIPs`(H3$2It(6ov^V$ZR9!EY-1k^#~keU=)CEN!RivJ2^a| z{*(n5(N1w%85oFvA!#~!+EYSW7Z&R59LdbNa%B`qHbfz3rA+nJTz@F;`A=w5cQ_Ws9sy-T+nA!GP_pPXq1r%Z>L6YHYhlp@ZO=*r~5Fvl7#Lsmi zi4|om!ZY*fL&oR)_C9Wx#;<8xMRAWD5{^{h9WBAOyb64l(I?AEhmbah?_SO zL4k`O(UT=PpplEFgM+}B(*0j90LK+y5mTb6Zs8c}vNX7(spibDMTxvmstu)&+0TQl zZ<2(-N6-;eMzLc_kjH?5?6d&_FEa72TsO>A`>o}!39y0975%UCF!3H$T~~#7bBTCf zPCcAIL7gt~gpTBaAM&Sg);;u3a)a3fzF%IX>I1xXPIo9^4%)dU{EBq@N7yVFvK|i7 zT8i)Fy1qb>u$_1gpsVGD?ctGpy=M=8bk#~-r^~}LE$G^puZ_=R{)&Fb5nTi06Sv^k zHAomCI(eeR)QWb*MHctEW|}CGe?@?zgmQ-5yAVsw2rDS`|P}&4zDO|@pEZ+bsu_RF9K*_G*2$5 zkH7Y)s;dX5YxU{1bJkz&R{r^U@0RwrJyE#t`sq#w8JaI?+K#MrO!h?CWi2_*(XbbY zs0Y5!qKi;Duo~yDTK2DwI893D9d~b3L8>JAt@m;oJ$1QV>c-P#>Gt!6Nc+Mb#j)r2 zmsq+zY>bjLw@w_dh3{5Z$--Xn#ps}RSeLTV!LLw#;|U-AhLKf8L~Yk%f{4N8Ah$c{ zJmH>V(2bb((Hf`ZioSt+StusyAFPyrOwCgMEATeP7Svg{=3ib_^-ddI-Y$hR7DvFA zAv}bJk!seW*7?SvF+;p`R-{LSI&Zsc2Clvw`tV&`L)aTX|HTPN}pv7Y<>VigY}p!iwaZ7==_y4`ZQGJ`D{))StTyi*6*7romf}nHn zuLKuCnEDHU^e~Bw$*1nR zPcH@89K5+MABM{#Te(pTbDSL5ME`@jQ-pr)0jr%9)U7_OF}`X<#=aqE5_3ZGz{O6?J2=R0h?v|U8=EA79#~3WIbs33pF6YsRUZP+ zTd$nI@_r@9AO^PS#gXqo`$2B~3V=@tUaje7Bv>RAuuAQDTgB{^xnYN+78mbV`7fT| z?}4Phd?PspR4#45 zPIY~)G089MJRlguIovU!1;=ZBq3az}eqrr);q|ALD9a0pAkT760fR+OeWIBS5R#OJ%$OS7jccqDEYB3`x;^4Cra)t-%o>P-7J7{{{((u;^ z8tQMjt=PmeihSv?s*lKb(Ncf{vjo;C-xOYJcS|KXP^Nfz9F z(x2DB{zlhJmC$4!Wv@}Kx@Lij4M;nws1X%|Fr8*^_=aSq|4dX3uA9SZ&e4j84$vU#dqsp@(f z1io5=p0^)Iyi1)?!E5gBHSAkRjx<1E^vx?2-u
Sg*HUPunuwNY1*M29J$plgEN) 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

!o^0~d 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

njTwndo6GirLZUQu4c(tN!UmTZ_RO>$IB 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�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%0AUA&Y1$2zzk)s)1HK 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�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

AJ5HL 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 literal 0 HcmV?d00001 diff --git a/HDVF/doc/HDVF/fig/primal_dual.png b/HDVF/doc/HDVF/fig/primal_dual.png new file mode 100644 index 0000000000000000000000000000000000000000..4f53c4d946b6e6f8e41eac843cd93497bef70570 GIT binary patch literal 476749 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�utHd1Q)OJuQMVJ-_O>z9H& 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�Q4@#Te5>5Gl`9?0yhy)?*V}D`QA;Y4 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 void mesh_complex_output(const MeshType& mesh, const ComplexType& L, const SubChainComplex& K, const Options& options) @@ -154,7 +155,7 @@ void main_code (const Options &options) { using ComplexType = Simplicial_chain_complex ; using HDVFType = Dual_HDVF ; - using ToolsType = Duality_SimpComplexTools ; + using ToolsType = Duality_simplicial_complex_tools ; using SubCCType = SubChainComplex ; // MeshObject @@ -200,12 +201,12 @@ void main_code (const Options &options) // CubComplex else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) { - using ComplexType = Cubical_complex ; + using ComplexType = Cubical_chain_complex ; using HDVFType = Dual_HDVF ; using SubCCType = SubChainComplex ; - using ToolsType = CubComplexTools ; + using ToolsType = Duality_cubical_complex_tools ; - CubObject mesh ; + Cub_object mesh ; typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; if (options.primal) { @@ -241,7 +242,7 @@ void main_code (const Options &options) // Output/export mesh and complex - mesh_complex_output(mesh, L, K, options) ; + mesh_complex_output(mesh, L, K, options) ; // HDVF computation, export, output HDVFType& hdvf(dual_HDVF_comput(L, K, options)) ; diff --git a/HDVF/examples/HDVF/main_hdvf.cpp b/HDVF/examples/HDVF/main_hdvf.cpp index 246657b6a438..e4cbfbe4d35c 100644 --- a/HDVF/examples/HDVF/main_hdvf.cpp +++ b/HDVF/examples/HDVF/main_hdvf.cpp @@ -15,13 +15,15 @@ #include "CGAL/HDVF/tools_io.hpp" #include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" #include "CGAL/HDVF/SimpComplexTools.hpp" -#include "CGAL/HDVF/Cubical_complex.hpp" +#include "CGAL/HDVF/Cubical_chain_complex.hpp" #include "CGAL/HDVF/CubComplexTools.hpp" #include "CGAL/HDVF/hdvf.hpp" #include "CGAL/OSM/OSM.hpp" #include "CGAL/HDVF/hdvf_tools.hpp" #include "arguments.h" +using namespace CGAL ; + // ------- A ring // For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly @@ -142,10 +144,10 @@ void main_code (const Options &options) // CubComplex else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) { - using ComplexType = Cubical_complex ; + using ComplexType = Cubical_chain_complex ; using HDVFType = HDVF ; - CubObject mesh ; + Cub_object mesh ; typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; if (options.primal) { @@ -166,7 +168,7 @@ void main_code (const Options &options) // Complex ComplexType complex(mesh, primal_dual); - mesh_complex_output(mesh, complex, options) ; + mesh_complex_output(mesh, complex, options) ; // HDVF computation, export, output HDVFType hdvf(HDVF_comput(complex, options)) ; diff --git a/HDVF/examples/HDVF/main_per_hdvf.cpp b/HDVF/examples/HDVF/main_per_hdvf.cpp index e7f238cb417d..05ee1e92d4c9 100644 --- a/HDVF/examples/HDVF/main_per_hdvf.cpp +++ b/HDVF/examples/HDVF/main_per_hdvf.cpp @@ -16,14 +16,16 @@ #include "CGAL/HDVF/tools_io.hpp" #include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" #include "CGAL/HDVF/SimpComplexTools.hpp" -#include "CGAL/HDVF/Cubical_complex.hpp" +#include "CGAL/HDVF/Cubical_chain_complex.hpp" #include "CGAL/HDVF/CubComplexTools.hpp" #include "CGAL/HDVF/per_hdvf.hpp" #include "CGAL/OSM/OSM.hpp" #include "CGAL/HDVF/hdvf_tools.hpp" #include "arguments.h" -// ------- A ring +using namespace CGAL ; + +// ------- A ring // For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly //#define SCALAR 5 @@ -213,10 +215,10 @@ void main_code (const Options &options) // CubComplex else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) { - using ComplexType = Cubical_complex ; + using ComplexType = Cubical_chain_complex ; using HDVFType = PersistentHDVF ; - CubObject mesh ; + Cub_object mesh ; typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; if (options.primal) { @@ -237,7 +239,7 @@ void main_code (const Options &options) // Complex ComplexType complex(mesh, primal_dual); - mesh_complex_output(mesh, complex, options) ; + mesh_complex_output(mesh, complex, options) ; // Build filtration Filtration& f(build_filtration(complex, options)) ; diff --git a/HDVF/include/CGAL/Class.h b/HDVF/include/CGAL/Class.h index 8701fcb44271..b925c02411b3 100644 --- a/HDVF/include/CGAL/Class.h +++ b/HDVF/include/CGAL/Class.h @@ -1,4 +1,4 @@ -// Copyright (c) 2025 Marseille University (France). +// Copyright (c) 2025 LIS Marseille (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). @@ -7,7 +7,7 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Alexandra Bac +// Author(s) : Alexandra Bac #ifndef CGAL_CLASSIFICATION_H #define CGAL_CLASSIFICATION_H diff --git a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp index 1dc4bcceb825..55efc71bbb33 100644 --- a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp @@ -1,39 +1,61 @@ -#ifndef SIMPCOMPLEX_HPP -#define SIMPCOMPLEX_HPP +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_ABSTRAT_SIMPLICIAL_CHAIN_COMPLEX_HPP +#define CGAL_ABSTRAT_SIMPLICIAL_CHAIN_COMPLEX_HPP + +//#include #include #include -//#include "hdvf_common.hpp" #include "tools_io.hpp" #include "Simplex.hpp" #include "CGAL/OSM/OSM.hpp" -#include "CGAL/Simple_cartesian.h" + +namespace CGAL { // Forward declaration of SimpComplexTools -template class Duality_SimpComplexTools ; +template class Duality_simplicial_complex_tools ; + +/*! +\ingroup PkgHDVFAlgorithmClasses + +The class `Abstract_simplicial_chain_complex` represents (topological) chain complexes associated to abstract simplicial complexes. + +An abstract simplicial complex is a set of simplices, also called cells (class `Simplex`) such that: all the faces of a given simplex also belong to the complex and any two simplices intersect exactly along a common face. + + + +A simplex of dimension q contains exactly q+1 vertices (we will thus denote it by \f$\langle v_0, \ldots, v_q \rangle\f$). A 0-cell is thus a vertex, a 1-cell contains two vertices (edge), a 2-cell contains three vertices (triangle) while a 3-cell is a tetrahedron. + +The boundary map of the complex is computed by the constructor of the class using the standard formula: + \f[ \partial_q\left( \langle v_0, \ldots, v_q \rangle\right) = \sum_{i=0}^q (-1)^i\cdot \langle v_0, \ldots, \widehat{v_i}, \cdots, v_q \rangle\f] + where \f$\langle v_0, \ldots, \widehat{v_i}, \cdots, v_q \rangle\f$ denotes the \f$q-1\f$-simplex with \f$v_i\f$ omitted. Hence, matrices of boundary maps are stored in each dimension using sparse matrices (in column-major mode). + +Let us also point out that cells are indexed along each dimension, thus each simplex is uniquely determined by its dimension and its index in this dimension. + +\cgalModels{AbstractChainComplex} + +\tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). +*/ + -/** - * \class Abstract_simplicial_chain_complex - * \brief Implementation of abstract simplicial complexes. - * - * The Abstract_simplicial_chain_complex class contains constructors and functions associated to abstract simplicial complexes for HDVFs. It implements the Complex concept. - * - * \tparam CoefficientType The coefficient types used for boundary matrix computation (default is int) - * - * \author Alexandra Bac - */ template class Abstract_simplicial_chain_complex { public: /** - * \brief Default constructor. + * \brief Default constructor (empty simplicial complex). * * Builds an empty abstract simplicial complex. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ + */ Abstract_simplicial_chain_complex() ; /** @@ -42,11 +64,7 @@ class Abstract_simplicial_chain_complex { * Builds the abstract simplicial complex associated to a triangular mesh (ie. performs the down closure of cells and set the boundary matrices in any dimension). * * \param[in] mesh A Mesh_object containing a triangular mesh. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ + */ Abstract_simplicial_chain_complex(const Mesh_object& mesh); /** \brief Type of column-major chains */ @@ -58,16 +76,12 @@ class Abstract_simplicial_chain_complex { /** - * \brief Affectation operator for abstract simplicial complexes. - * - * Stores a copy of an abstract simplicial complex in *this. + * \brief Affectation operator for abstract simplicial chain complexes. * - * \param[in] complex The abstract simplicial complex which will be copied. + * Stores a copy of an abstract simplicial chain complex in *this. * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ + * \param[in] complex The abstract simplicial chain complex which will be copied. + */ Abstract_simplicial_chain_complex& operator= (const Abstract_simplicial_chain_complex& complex) { _dim = complex._dim; @@ -79,49 +93,41 @@ class Abstract_simplicial_chain_complex { } /// Methods of the SimpComplex concept - + /** - * \brief Method returning the boundary of the cell id_cell in dimension dim. + * \brief Method returning the boundary of the cell id_cell in dimension q. * - * Returns a copy of the column-major chain stored in the boundary matrix of dimension dim: boundary of the cell id_cell in dimension dim.. + * Returns a copy of the column-major chain stored in the boundary matrix of dimension dim: boundary of the cell id_cell in dimension q. * * \param[in] id_cell Index of the cell. - * \param[in] dim Dimension of the cell. - * - * \return The column-major chain containing the boundary of the cell id_cell in dimension dim. - * - * \see \link Abstract_simplicial_chain_complex \endlink + * \param[in] q Dimension of the cell. * - * \author Alexandra Bac - * */ - CChain d(int id_cell, int dim) const + * \return The column-major chain containing the boundary of the cell id_cell in dimension q. + */ + CChain d(int id_cell, int q) const { - if (dim > 0) - return OSM::getColumn(_d[dim], id_cell); + if (q > 0) + return OSM::getColumn(_d[q], id_cell); else return CChain(0) ; } /** - * \brief Method returning the co-boundary of the cell id_cell in dimension dim. + * \brief Method returning the co-boundary of the cell id_cell in dimension q. * - * Returns a row-major chain containing the co-boundary of the cell id_cell in dimension dim (so actually a row of the boundary matrix). + * Returns a row-major chain containing the co-boundary of the cell id_cell in dimension q (so actually a row of the boundary matrix). * * \warning As the boundary matrix is stored column-major, this entails crossing the full matrix to extract the row coefficients (O(number of non empty columns)) * * \param[in] id_cell Index of the cell. - * \param[in] dim Dimension of the cell. - * - * \return The row-major chain containing the co-boundary of the cell id_cell in dimension dim. + * \param[in] q Dimension of the cell. * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ - RChain cod(int id_cell, int dim) const + * \return The row-major chain containing the co-boundary of the cell id_cell in dimension q. + */ + RChain cod(int id_cell, int q) const { - if (dim < _dim) - return OSM::getRow(_d[dim+1], id_cell); + if (q < _dim) + return OSM::getRow(_d[q+1], id_cell); else return RChain(0) ; } @@ -132,28 +138,20 @@ class Abstract_simplicial_chain_complex { * Returns the dimension of the simplicial complex (ie. largest dimension of cells). * * \return The dimension of the complex.. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ + */ int dim() const { return _dim ;} /** * \brief Method returning the number of cells in a given dimension. * - * \param[in] dim Dimension along which the number of cells is returned. + * \param[in] q Dimension along which the number of cells is returned. * - * \return Number of cells in dimension dim. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ - int nb_cells(int dim) const + * \return Number of cells in dimension q. + */ + int nb_cells(int q) const { - if ((dim >=0) && (dim<=_dim)) - return _nb_cells[dim] ; + if ((q >=0) && (q<=_dim)) + return _nb_cells[q] ; else return 0 ; } @@ -164,55 +162,43 @@ class Abstract_simplicial_chain_complex { * Returns a constant reference to the vector of boundary matrices along each dimension. The q-th element of this vector is a column-major sparse matrix containing the boundaries of q-cells (ie. rows encode q-1 cells and columns q cells). * * \return Returns a constant reference to the vector of column-major boundary matrices along each dimension. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ + */ const vector & get_bnd_matrices() const { return _d ; } /** - * \brief Method returning a copy of the dim-th boundary matrix (ie. column-major matrix of d_dim). - * - * It is a column-major sparse matrix containing the boundaries of dim-cells (ie. rows encode dim-1 cells and columns dim cells). - * - * \param[in] dim Dimension of the boundary matrix (ie. columns will contain the boundary of dimension dim cells). + * \brief Method returning a copy of the dim-th boundary matrix (ie. column-major matrix of \f$\partial_q\f$). * - * \return A column-major sparse matrix containing the matrix of the boundary operator of dimension dim. + * It is a column-major sparse matrix containing the boundaries of q-cells (ie. rows encode q-1 cells and columns q cells). * - * \see \link Abstract_simplicial_chain_complex \endlink + * \param[in] q Dimension of the boundary matrix (ie. columns will contain the boundary of dimension q cells). * - * \author Alexandra Bac - * */ - const CMatrix & get_bnd_matrix(int dim) const + * \return A column-major sparse matrix containing the matrix of the boundary operator of dimension q. + */ + const CMatrix & get_bnd_matrix(int q) const { - return _d.at(dim) ; + return _d.at(q) ; } - + /** - * \brief Method returning dimension 0 simplicies indexes included in the cell with index id_cell of dimension dim. + * \brief Method returning dimension 0 simplicies indexes included in the cell with index id_cell of dimension q. * - * Returns the dimension 0 simplicies indexes included in the cell with index id_cell of dimension dim. + * Returns the dimension 0 simplicies indexes included in the cell with index id_cell of dimension q. * * \warning This does not come to return vertices indices, as dimension 0 simplices enumerate vertices in any order. For instance, if an abstract simplicial complex is build from 3 vertices {1,2,3} such that the enumeration of dimension 0 simplicies is: * id0: 3, id1 : 2, id2: 1 * then the bottom_faces of the 1-simplex {1,2} are two 0-simplices with id 2 and 1. * * \param[in] id_cell Index of the cell. - * \param[in] dim Dimension of the cell. + * \param[in] q Dimension of the cell. * * \return A vector of 0-simplices indices. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ - std::vector bottom_faces(int id_cell, int dim) const + */ + std::vector bottom_faces(int id_cell, int q) const { - std::set verts(_ind2simp.at(dim).at(id_cell).getVertices()) ; + std::set verts(_ind2simp.at(q).at(id_cell).getVertices()) ; std::vector res ; // For each vertex in verts, compute the corresponding dimension 0 cell for (int vert_id : verts) @@ -227,15 +213,10 @@ class Abstract_simplicial_chain_complex { * \brief Method printing informations of the complex. * * Displays the number of cells in each dimension and the boundary matrix in each dimension. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ - /** \brief */ + */ std::ostream& print_complex(std::ostream& out = std::cout) const; - - + + protected: /** \brief Dimension of the complex */ int _dim; @@ -247,22 +228,18 @@ class Abstract_simplicial_chain_complex { std::vector _nb_cells ; /** \brief Vector of column-major boundary matrices: _d.at(q) is the matrix of the boundary operator in dimension q. */ mutable std::vector _d; // Boundary matrices - + // Protected methods /** - * \brief Method filling the matrix _d.at(dim), ie. computing the boundaries of cells of dimension dim. + * \brief Method filling the matrix _d.at(q), ie. computing the boundaries of cells of dimension q. * * Compute the boundary with the standard simplicial complex definition: * \f[\partial (\{v_0,\ldots,v_q\}) = \sum_{i=0}^q (-1)^q \{v_0,\ldots, \hat{v_i},\ldots,v_q\}\f] * - * \param[in] dim Dimension considered for computation. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ - void calculate_d(int dim) const; + * \param[in] q Dimension considered for computation. + */ + void calculate_d(int q) const; /** * \brief Method inserting a simplex (and its faces if necessary) into the abstract simplicial complex. @@ -272,11 +249,7 @@ class Abstract_simplicial_chain_complex { * \warning insert_simplex does not update the boundary matrix. * * \param[in] tau The simplex inserted. - * - * \see \link Abstract_simplicial_chain_complex \endlink - * - * \author Alexandra Bac - * */ + */ void insert_simplex(const Simplex& tau); }; @@ -291,14 +264,14 @@ Abstract_simplicial_chain_complex::Abstract_simplicial_chain_co _ind2simp.resize(_dim + 1); _simp2ind.resize(_dim + 1); _nb_cells.resize(_dim + 1, 0); - + // Iterate through the mesh cells and add them to the complex for (const auto& cell : mesh.cells) { -// Simplex simplex(std::set(cell.begin(), cell.end())); -// insert_simplex(simplex); + // Simplex simplex(std::set(cell.begin(), cell.end())); + // insert_simplex(simplex); insert_simplex(cell) ; } - + _d.resize(_dim+1); for (int dim = 0; dim <= _dim; ++dim) { calculate_d(dim); @@ -310,13 +283,13 @@ template void Abstract_simplicial_chain_complex::insert_simplex(const Simplex& tau) { int q = tau.dimension(); if (q == -1) return; - + if (_simp2ind[q].find(tau) == _simp2ind[q].end()) { int i = _ind2simp[q].size(); _ind2simp[q].push_back(tau); _simp2ind[q][tau] = i; _nb_cells[q]++; - + std::vector bord = tau.boundary(); for (const auto& sigma : bord) { insert_simplex(sigma); @@ -329,7 +302,7 @@ template void Abstract_simplicial_chain_complex::calculate_d(int dim) const { int nb_lignes = (dim == 0) ? 0 : _nb_cells[dim - 1]; _d[dim] = CMatrix(nb_lignes, _nb_cells[dim]); - + // Iterate through the cells of dimension dim if (dim>0) { @@ -362,7 +335,7 @@ void Abstract_simplicial_chain_complex::calculate_d(int dim) co template std::ostream& Abstract_simplicial_chain_complex::print_complex(std::ostream& out) const { out << "Complex dimension: " << _dim << std::endl; - + // Total number of cells int nb_total_cells = 0; for (int i = 0; i <= _dim; ++i) { @@ -374,10 +347,10 @@ std::ostream& Abstract_simplicial_chain_complex::print_complex( for (int q = 0; q <= _dim; ++q) { out << "--- dimension " << q << std::endl; out << nb_cells(q) << " cells" << endl ; -// for (int j = 0; j < _nb_cells.at(q); ++j) { -// Simplex s(_ind2Simp.at(q).at(j)); -// std::cout << j << " -> " << s << " -> " << _Simp2ind.at(q).at(s) << std::endl; -// } + // for (int j = 0; j < _nb_cells.at(q); ++j) { + // Simplex s(_ind2Simp.at(q).at(j)); + // std::cout << j << " -> " << s << " -> " << _Simp2ind.at(q).at(s) << std::endl; + // } } // Boundary matrices @@ -387,82 +360,84 @@ std::ostream& Abstract_simplicial_chain_complex::print_complex( return out ; } -/** - * \class Simplicial_chain_complex - * \brief Implementation of simplicial complexes. - * - * The Simplicial_chain_complex class contains constructors and functions associated to simplicial complexes for HDVFs. It implements the GeometricComplex concept. Hence, vtk output is available. - * - * \tparam _CoefficientType The coefficient types used for boundary matrix computation (default is int) - * - * \author Alexandra Bac - */ +/*! +\ingroup PkgHDVFAlgorithmClasses + +The class `Simplicial_chain_complex` refines the `Abstract_simplicial_chain_complex` class by assigning coordinates to vertices (ie. 0-simplices). Hence, vtk output is available. + +\cgalModels{GeometricChainComplex} + +\tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). +*/ template class Simplicial_chain_complex : public Abstract_simplicial_chain_complex { public: - /// Public types + /** \brief Type of vertices coordinates */ typedef std::vector Point ; protected: + /** \brief Vector of vertices coordinates */ std::vector _coords ; private: - /// Associated to any dimension the type number of associated VTK cells - /// {1, 3, 5, 10} + /** \brief Vector of VTK types associated to cells in each dimension + e.g. {1, 3, 5, 10} */ static const std::vector VTK_simptypes ; public: /** - * \brief Default constructor: builds an empty simplicial complex - * - * \see \link Simplicial_chain_complex \endlink - * - * \author Alexandra Bac + * \brief Default constructor: builds an empty simplicial complex. */ Simplicial_chain_complex() {} ; // Constructor from a simplicial complex stored in a .simp file and read into a MeshObject /** * \brief Constructor from a Mesh_object. * - * Builds a simplicial complex from a Mesh_object and a vector of vertices coordinates ( - * - * \see \link Simplicial_chain_complex \endlink - * - * \author Alexandra Bac + * Builds a simplicial complex from a Mesh_object and saves the vector of vertices coordinates. */ Simplicial_chain_complex(const Mesh_object& mesh, std::vector coords) : Abstract_simplicial_chain_complex(mesh), _coords(coords) {} ; - /// Operator= + /** + * \brief Affectation operator for simplicial complexes. + * + * Stores a copy of a simplicial complex in *this. + * + * \param[in] complex The simplicial complex which will be copied. + */ Simplicial_chain_complex& operator= (const Simplicial_chain_complex& complex) { this->Abstract_simplicial_chain_complex::operator=(complex) ; _coords = complex._coords ; return *this ; } - - // Friend class : SimpObjectTools - friend Duality_SimpComplexTools ; + + /** \brief Friend class `Duality_simplicial_complex_tools` computes the complementary simplicial complex for Alexander duality */ + friend Duality_simplicial_complex_tools ; /** \brief Get the vector of vertices coordinates */ - const std::vector& get_nodes_coords() const + const std::vector& get_vertices_coords() const { return _coords ; } - /** \brief Get the coordinates of the ith dimension 0 simplex */ + /** \brief Get the coordinates of the ith dimension-0 simplex + + * \warning This does not come to return vertices indices, as dimension 0 simplices enumerate vertices in any order. For instance, if an abstract simplicial complex is build from 3 vertices {1,2,3} such that the enumeration of dimension 0 simplicies is: + * id0: 3, id1 : 2, id2: 1 + * then the bottom_faces of the 1-simplex {1,2} are two 0-simplices with id 2 and 1. + */ Point get_vertex_coords (int i) const { const Simplex simpl(this->_ind2simp.at(0).at(i)) ; const std::set verts(simpl.getVertices()) ; const int id(*(verts.cbegin())) ; return _coords.at(id); -// return _coords.at(i); } // VTK export - + /** * \brief Method exporting a simplicial complex (plus, optionally, labels) to a VTK file. * @@ -471,13 +446,9 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex > *labels=NULL) ; - + /** * \brief Method exporting a chain over a simplicial complex to a VTK file. * @@ -487,12 +458,8 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex& chain, int q, int cellId = -1) ; }; @@ -500,6 +467,7 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex const std::vector Simplicial_chain_complex::VTK_simptypes({1, 3, 5, 10}); +// Simplicial_chain_complex_to_vtk template void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const std::vector > *labels) { @@ -514,22 +482,22 @@ void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk( // Load out file... std::ofstream out ( filename, std::ios::out | std::ios::trunc); - + if ( not out . good () ) { std::cerr << "SimpComplex_to_vtk. Fatal Error:\n " << filename << " not found.\n"; throw std::runtime_error("File Parsing Error: File not found"); } - + // Header out << "# vtk DataFile Version 2.0" << endl ; out << "generators" << endl ; out << "ASCII" << endl ; out << "DATASET UNSTRUCTURED_GRID" << endl ; - + // Points size_t nnodes = K._coords.size() ; out << "POINTS " << nnodes << " double" << endl ; - const std::vector >& coords(K.get_nodes_coords()) ; + const std::vector& coords(K.get_vertices_coords()) ; for (int n = 0; n < nnodes; ++n) { vector p(coords.at(n)) ; @@ -539,7 +507,7 @@ void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk( out << "0 " ; out << endl ; } - + int ncells_tot = 0, size_cells_tot = 0 ; std::vector types ; std::vector scalars ; @@ -556,19 +524,6 @@ void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk( } out << "CELLS " << ncells_tot << " " << size_cells_tot << endl ; // Output cells by increasing dimension - -// // Vertices -// for (int i = 0; i::Simplicial_chain_complex_to_vtk( out.close() ; } -/** \brief Export chain of dimension q to vtk. -* -> Only cells of the chain are exported -* -> If a cell Id is provided scalars are exported (0 for the given cellId / 2 for other cells) -*/ - +// Simplicial_chain_complex_chain_to_vtk template void Simplicial_chain_complex::Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) { @@ -633,22 +584,22 @@ void Simplicial_chain_complex::Simplicial_chain_complex_chain_t // Load out file... std::ofstream out ( filename, std::ios::out | std::ios::trunc); - + if ( not out . good () ) { std::cerr << "SimpComplex_chain_to_vtk. Fatal Error:\n " << filename << " not found.\n"; throw std::runtime_error("File Parsing Error: File not found"); } - + // Header out << "# vtk DataFile Version 2.0" << endl ; out << "generators" << endl ; out << "ASCII" << endl ; out << "DATASET UNSTRUCTURED_GRID" << endl ; - + // Points int nnodes = K._coords.size() ; out << "POINTS " << nnodes << " double" << endl ; - const std::vector >& coords(K.get_nodes_coords()) ; + const std::vector& coords(K.get_vertices_coords()) ; for (int n = 0; n < nnodes; ++n) { vector p(coords.at(n)) ; @@ -658,7 +609,7 @@ void Simplicial_chain_complex::Simplicial_chain_complex_chain_t out << "0 " ; out << endl ; } - + int ncells_tot = 0, size_cells_tot = 0 ; std::vector types ; std::vector scalars ; @@ -710,7 +661,7 @@ void Simplicial_chain_complex::Simplicial_chain_complex_chain_t out << t << " " ; out << endl ; } - + if (with_scalars) { // CELL_TYPES @@ -730,4 +681,6 @@ void Simplicial_chain_complex::Simplicial_chain_complex_chain_t out.close() ; } -#endif // SIMPCOMPLEX_HPP +} /* end namespace CGAL */ + +#endif // CGAL_ABSTRAT_SIMPLICIAL_CHAIN_COMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index 2994459f3326..1acc8b49bb3d 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -1,11 +1,22 @@ -#ifndef CUBCOMPLEXTOOLS_HPP -#define CUBCOMPLEXTOOLS_HPP +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef Duality_cubical_complex_tools_HPP +#define Duality_cubical_complex_tools_HPP #include #include #include #include -#include "Cubical_complex.hpp" +#include "Cubical_chain_complex.hpp" #include "hdvf.hpp" #include "per_hdvf.hpp" #include "sub_chain_complex.hpp" @@ -13,7 +24,7 @@ #include "CGAL/OSM/OSM.hpp" /** - * \class CubComplexTools + * \class Duality_cubical_complex_tools * \brief Provides tools for CubComplexes ((co)homology, duality, persistent homology). * \brief Friend class of CubComplex * @@ -24,14 +35,16 @@ // CubComplex +namespace CGAL { + template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> -void Cub_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Cubical_complex &complex, string filename = "test") +void Cub_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Cubical_chain_complex &complex, string filename = "test") { - typedef Cubical_complex ComplexType; + typedef Cubical_chain_complex ComplexType; // Export PSC labelling vector > labels = hdvf.export_label(PSC) ; string outfilePSC(filename+"_PSC.vtk") ; - ComplexType::cubical_complex_to_vtk(complex, outfilePSC, &labels) ; + ComplexType::Cubical_chain_complex_to_vtk(complex, outfilePSC, &labels) ; // Export generators of all critical cells if available if (hdvf.get_hdvf_opts() != OPT_BND) @@ -45,9 +58,9 @@ void Cub_output_vtk (HDVF, _ChainType, _Spar if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) { string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; -// vector > labels = hdvf.export_label(G,c,q) ; + // vector > labels = hdvf.export_label(G,c,q) ; OSM::Chain chain(hdvf.export_GChain(c,q)) ; - ComplexType::cubical_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; + ComplexType::Cubical_chain_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; } if (q < complex.dim()) { @@ -55,7 +68,7 @@ void Cub_output_vtk (HDVF, _ChainType, _Spar { string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; OSM::Chain chain(hdvf.export_FSTARChain(c,q)) ; - ComplexType::cubical_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; + ComplexType::Cubical_chain_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; } } } @@ -71,7 +84,7 @@ void Cub_output_vtk (HDVF, _ChainType, _Spar // { // string outfile(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; // vector > labels = hdvf.export_label(G,c,q) ; -// cubical_complex_write_to_vtk(complex, outfile, &labels, BOOLEAN_LABELS, "bool") ; +// Cubical_chain_complex_write_to_vtk(complex, outfile, &labels, BOOLEAN_LABELS, "bool") ; // } // if (q < complex.dim()) // { @@ -79,7 +92,7 @@ void Cub_output_vtk (HDVF, _ChainType, _Spar // { // string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; // vector > labels_fstar = hdvf.export_label(FSTAR,c,q) ; -// cubical_complex_write_to_vtk(complex, outfile_f, &labels_fstar, BOOLEAN_LABELS, "bool") ; +// Cubical_chain_complex_write_to_vtk(complex, outfile_f, &labels_fstar, BOOLEAN_LABELS, "bool") ; // } // } // } @@ -90,12 +103,12 @@ void Cub_output_vtk (HDVF, _ChainType, _Spar // Duality template -class CubComplexTools { +class Duality_cubical_complex_tools { public: - typedef Cubical_complex _ComplexType ; + typedef Cubical_chain_complex _ComplexType ; typedef SubChainComplex _SubCCType ; // Constructor - CubComplexTools() {} + Duality_cubical_complex_tools() {} /** \brief Build a CubComplex L and SubChainComplex K from a CubComplex. @@ -108,11 +121,11 @@ class CubComplexTools { /** \brief Build the bounding box CubComplex of _CC */ static std::pair<_ComplexType&, _SubCCType&> CubComplexBB (const _ComplexType& _CC) { - CubObject tmp ; + Cub_object tmp ; tmp.dim = _CC.dim() ; tmp.N = _CC._size_bb ; tmp.ncubs.resize(tmp.dim+1) ; -// tmp.ncubs = tmp.N ; + // tmp.ncubs = tmp.N ; // Visit all boolean indices in the BB of _CC and insert corresponding Cells for (int i=0; i<_CC._P.at(_CC.dim()); ++i) { @@ -140,16 +153,16 @@ class CubComplexTools { } ; // Persistent homology - + /** \brief Export persistent information to vtk files */ template -void Per_Cub_output_vtk (PersistentHDVF, DegType> &per_hdvf, Cubical_complex &complex, string filename = "per") +void Per_Cub_output_vtk (PersistentHDVF, DegType> &per_hdvf, Cubical_chain_complex &complex, string filename = "per") { if (!per_hdvf.with_export()) throw("Cannot export persistent generators to vtk: with_export is off!") ; - using perHDVFType = PersistentHDVF, DegType> ; - using ComplexType = Cubical_complex ; + using perHDVFType = PersistentHDVF, DegType> ; + using ComplexType = Cubical_chain_complex ; using PerHole = PerHoleT ; // Iterate over persistence diagram (iterator over non zero intervals) // Batch informations are stored in file filename_infos.txt @@ -167,7 +180,7 @@ void Per_Cub_output_vtk (PersistentHDVF, Deg // Build name associated to the ith hole : filename_i string out_file = filename+"_"+to_string(i) ; // Export PSC labels to vtk - ComplexType::cubical_complex_to_vtk(complex, out_file+"_PSC.vtk", &hole_data.labelsPSC) ; + ComplexType::Cubical_chain_complex_to_vtk(complex, out_file+"_PSC.vtk", &hole_data.labelsPSC) ; const PerIntervalCells per_int_cells(std::get<1>(hole_data.hole)) ; // Export homology generators (g) if (per_hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) @@ -176,13 +189,13 @@ void Per_Cub_output_vtk (PersistentHDVF, Deg { const int id(per_int_cells.first.first), dim(per_int_cells.first.second) ; string tmp(out_file+"_g_"+to_string(id)+"_"+to_string(dim)+".vtk") ; - ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_sigma, dim); + ComplexType::Cubical_chain_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_sigma, dim); } // Second generator : filename_i_g_tau_q+1.vtk { const int id(per_int_cells.second.first), dim(per_int_cells.second.second) ; string tmp(out_file+"_g_"+to_string(id)+"_"+to_string(dim)+".vtk") ; - ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_tau, dim); + ComplexType::Cubical_chain_complex_chain_to_vtk(complex, tmp, hole_data.g_chain_tau, dim); } } // Export cohomology generators (fstar) @@ -192,13 +205,13 @@ void Per_Cub_output_vtk (PersistentHDVF, Deg { const int id(per_int_cells.first.first), dim(per_int_cells.first.second) ; string tmp(out_file+"_fstar_"+to_string(id)+"_"+to_string(dim)+".vtk") ; - ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_sigma, dim); + ComplexType::Cubical_chain_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_sigma, dim); } // Second generator : filename_i_fstar_tau_q+1.vtk { const int id(per_int_cells.second.first), dim(per_int_cells.second.second) ; string tmp(out_file+"_fstar_"+to_string(id)+"_"+to_string(dim)+".vtk") ; - ComplexType::cubical_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_tau, dim); + ComplexType::Cubical_chain_complex_chain_to_vtk(complex, tmp, hole_data.fstar_chain_tau, dim); } } } @@ -208,6 +221,6 @@ void Per_Cub_output_vtk (PersistentHDVF, Deg Cub_output_vtk(per_hdvf, complex, filename+"_inf") ; } +} - -#endif // CUBCOMPLEXTOOLS_HPP +#endif // Duality_cubical_complex_tools_HPP diff --git a/HDVF/include/CGAL/HDVF/Cubical_complex.hpp b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp similarity index 52% rename from HDVF/include/CGAL/HDVF/Cubical_complex.hpp rename to HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp index 81b23c02ab2f..e2891260500a 100644 --- a/HDVF/include/CGAL/HDVF/Cubical_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp @@ -1,16 +1,28 @@ -#ifndef CUBCOMPLEX_HPP -#define CUBCOMPLEX_HPP +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_CUBICAL_CHAIN_COMPLEX_HPP +#define CGAL_CUBICAL_CHAIN_COMPLEX_HPP #include #include #include #include -//#include "hdvf_common.hpp" #include "tools_io.hpp" #include "CGAL/OSM/OSM.hpp" -// Forward declaration of CubComplexTools -template class CubComplexTools ; +namespace CGAL { + +// Forward declaration of Duality_cubical_complex_tools +template class Duality_cubical_complex_tools ; // TOOLS @@ -22,42 +34,111 @@ ostream & operator<<(ostream & out, std::vector c) return out ; } -/** - * \class Cubical_complex - * \brief Implementation of cubical complexes. - * - * The Cubical_complex class contains constructors and functions associated to cubical complexes for HDVFs. It implements the GeometricComplex concept. Hence, vtk output is available. - * - * \tparam _CoefficientType The coefficient types used for boundary matrix computation (default is int) - * - * \author Alexandra Bac - */ +/*! +\ingroup PkgHDVFAlgorithmClasses + +The class `Cubical_chain_complex` represents (topological) chain complexes associated to cubical complexes. + + \paragraph Description + +An cubical complex is a set of "square" cells such that: all the faces of a given cell also belong to the complex and any two cells intersect exactly along a common face. + + + + A cell in a cubical complex of dimension q is the cartesian product of \f$q\f$ intervals \f$[n_1,n_1+\delta_1]\times [n_q,n_q+\delta_q] \f$ with \f$n_i\in \mathbb N \f$ and \f$\delta_i = 0,1\f$. + The dimension of such a cell is \f$\sum_{i=1}^q \delta_i\f$. + A 0-cell is thus a vertex, a 1-cell contains one non zero delta (edge along one of the axes), a 2-cell contains two non zero deltas (square along two of the axes), while a 3-cell is a cube... + + For instance, \f$v = [2,2]\times[1,1]\times[0,0]\f$, \f$e = [0,1]\times[1,1]\times[0,0]\f$ and \f$f = [2,3]\times[0,1]\times[1,1]\f$. + + Given a cubical complex of dimension \f$q\f$ included in \f$[0,B_1]\times\cdots \times[0,B_q]\f$, Khalimsky coordinates associate to each cell of the complex a unique coordinate in \f$[0,2B_1]\times\cdots \times[0,2B_q]\f$: + \f[ + \begin{array}{rcl} + \sigma & \mapsto & \mathrm{khal}(\sigma) \\ + [n_1,n_1+\delta_1]\times\cdots \times [n_q,n_q+\delta_q] & \,\to\, & (2n_1+\delta_1,\ldots,2n_1+\delta_1) \\ + \end{array}\f] + we set \f$N_i = 2B_i+1\f$ the size of the Khalimsky bounding box along the \f$i\f$th axis. + + The dimension of a cell is the given by the number of odd coordinates. + In our previous example, \f$B_1=3, B_2=2, B_3=1\f$, hence \f$N_1=7, N_2=5, N_3=3\f$ and we get the following Khalimsky coordinates: \f$\mathrm{khal}(v) = (4,2,0)\f$, \f$\mathrm{khal}(e) = (1,2,0)\f$ and \f$\mathrm{khal}(f) = (5,1,2)\f$. + +The boundary map of the complex is computed by the constructor of the class using the standard formula with Khalimsky coordinates. Given a cell \f$\sigma\f$ with \f$\mathrm{khal}(\sigma) = (x_1,\ldots,x_q)\f$ + \f[ \partial(x_1,\ldots,x_q) = \sum_{\substack{i=0\\x_i\text{ odd}}}^q (-1)^{j(i)} \left( (x_1,\ldots,x_i+1,\ldots, x_q) - (x_1,\ldots,x_i-1,\ldots, x_q)\right)\f] + where \f$j(i)\f$ is the number of odd coordinates between \f$x_1\f$ and \f$x_i\f$. + + + +Let us also point out that besides Khalimsky coordinates, cells are indexed along each dimension, thus each cell is uniquely determined by its dimension and its index in this dimension (called "base index"). + + \paragraph Implementation Implementation details + + As described above, Khalimsky coordinates provide a convenient tool to identify cells of any dimension. Hence a complex of dimension \f$q\f$ can be encoded by a boolean matrix of size \f$N_1\times\cdots\times N_q\f$ (with previous notations). For convenience, this matrix is vectorized and thus the complex is stored in a boolean vector (denoted by `_cells`) of size \f$N_1\times \cdots \times N_q\f$. + + Cells of any dimension are thus repesented by a given element of this boolean vector and the corresponding index is called their *boolean index*. + + As stated above, besides this boolean representation, topological computations require to identify the bases of cells in any dimension (bases of the free chain groups). Hence, a cell of dimension \f$d\f$ is also identified by its index in the basis of \f$d\f$-dimensional cells. This index is called its *basis index*. The vector `_bool2base` stores, for each dimension, the map between boolean and base indices, while the `_base2bool` stores, for each dimension, the permutation between base and boolean indices. + + + +\cgalModels{GeometricChainComplex} + +\tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). +*/ + -template // !!!! Substitute! -> coefficienttype everywhere... -class Cubical_complex { +template +class Cubical_chain_complex { +public: + /** \brief Type of vertices coordinates */ + typedef std::vector Point ; private: - /// Associate to any dimension the corresponding VTK type - /// {1, 3, 8, 11} + /** \brief Vector of VTK types associated to cells in each dimension + e.g. {1, 3, 8, 11} */ static const std::vector VTK_cubtypes ; public: - /// Type of construction applied by the constructor + /** \brief Type used to encode primal or dual construction. */ enum typeComplexCube {PRIMAL, DUAL}; - /// Constructors of CubObject - Cubical_complex() {} ; - Cubical_complex(const CubObject& cub,typeComplexCube type); - - /// Friend class : CubObjectTools - friend CubComplexTools ; - - ///typedef related to boundary matrices + /** + * \brief Default constructor (empty cubical complex). + * + * Builds an empty cubical complex. + */ + Cubical_chain_complex() {} ; + + /** + * \brief Constructor from a Cub_object (builds PRIMAL or DUAL associated complex depending on `type`). + * + * Builds the cubical complex associated to a a set of cells (vertices, edges, squares, cubes...), ie. performs the down closure of cells and set the boundary matrices in any dimension. Given a set of cells: + * + * - if the `type` is PRIMAL, the constructor builds the associated complex as such (see below middle), which comes to encode \f$3^q-1\f$ connectivity (with \f$q\f$ the dimension of the complex) + * - if the `type` is DUAL and the cub_object contains only cells of maximal dimension (ie. binary object), the constructor build the dual associated complex (see below right), which comes to encode \f$2q\f$ connectivity (with \f$q\f$ the dimension of the complex) + * + * + * + * \param[in] cub A Cub_object containing a set of "cubical" cells. + */ + Cubical_chain_complex(const Cub_object& cub,typeComplexCube type); + + /** \brief Friend class `Duality_cubical_complex_tools` provides tools for Alexander duality. */ + friend Duality_cubical_complex_tools ; + + /** \brief Type of column-major chains */ typedef OSM::Chain CChain; + /** \brief Type of row-major chains */ typedef OSM::Chain RChain ; + /** \brief Type of column-major sparse matrices */ typedef OSM::SparseMatrix CMatrix; - /// operator= - Cubical_complex& operator=(const Cubical_complex& complex) + /** + * \brief Affectation operator for cubical chain complexes. + * + * Stores a copy of an cubical chain complex in *this. + * + * \param[in] complex The cubical chain complex which will be copied. + */ + Cubical_chain_complex& operator=(const Cubical_chain_complex& complex) { _dim = complex._dim; _size_bb = complex._size_bb; @@ -65,51 +146,126 @@ class Cubical_complex { _cells = complex._cells; _base2bool = complex._base2bool; _bool2base = complex._bool2base; - visited_cells = complex.visited_cells; + _visited_cells = complex._visited_cells; return *this; } /// Methods of the CubComplex concept - CChain d(int id_cell, int dim) const //border of the cell of index id_cell of dimension dim + /** + * \brief Method returning the boundary of the cell id_cell in dimension q. + * + * Returns a copy of the column-major chain stored in the boundary matrix of dimension q: boundary of the cell id_cell in dimension q. + * + * \param[in] id_cell Index of the cell. + * \param[in] q Dimension of the cell. + * + * \return The column-major chain containing the boundary of the cell id_cell in dimension q. + */ + CChain d(int id_cell, int q) const { - if (dim > 0) - return OSM::cgetColumn(_d[dim], id_cell); + if (q > 0) + return OSM::cgetColumn(_d[q], id_cell); else return CChain(0) ; } - RChain cod(int id_cell, int dim) const // cobord of the cell of index id_cell of dimension dim + /** + * \brief Method returning the co-boundary of the cell id_cell in dimension q. + * + * Returns a row-major chain containing the co-boundary of the cell id_cell in dimension q (so actually a row of the boundary matrix). + * + * \warning As the boundary matrix is stored column-major, this entails crossing the full matrix to extract the row coefficients (O(number of non empty columns)) + * + * \param[in] id_cell Index of the cell. + * \param[in] q Dimension of the cell. + * + * \return The row-major chain containing the co-boundary of the cell id_cell in dimension q. + */ + RChain cod(int id_cell, int q) const { - if (dim < _dim) - return OSM::getRow(_d[dim+1], id_cell); + if (q < _dim) + return OSM::getRow(_d[q+1], id_cell); else return RChain(0) ; } + /** + * \brief Method returning the dimension of the complex. + * + * Returns the dimension of the cubical complex. + * + * \return The dimension of the complex.. + */ + int dim() const + { + return _dim ; + } + + /** + * \brief Method returning the number of cells in a given dimension. + * + * \param[in] q Dimension along which the number of cells is returned. + * + * \return Number of cells in dimension q. + */ + int nb_cells(int q) const + { + if ((q >=0) && (q <= _dim)) + return _base2bool.at(q).size() ; + else + return 0 ; + } + + /** + * \brief Method returning a constant reference to the vector of boundary matrices (along each dimension). + * + * Returns a constant reference to the vector of boundary matrices along each dimension. The q-th element of this vector is a column-major sparse matrix containing the boundaries of q-cells (ie. rows encode q-1 cells and columns q cells). + * + * \return Returns a constant reference to the vector of column-major boundary matrices along each dimension. + */ const vector & get_bnd_matrices() const { return _d ; } + /** + * \brief Method returning a copy of the dim-th boundary matrix (ie. column-major matrix of \f$\partial_q\f$). + * + * It is a column-major sparse matrix containing the boundaries of dim-cells (ie. rows encode q-1 cells and columns q cells). + * + * \param[in] q Dimension of the boundary matrix (ie. columns will contain the boundary of dimension q cells). + * + * \return A column-major sparse matrix containing the matrix of the boundary operator of dimension q. + */ const CMatrix & get_bnd_matrix(int q) const { return _d.at(q) ; } - int dim() const - { - return _dim ; - } - int nb_cells(int dim) const + /** + * \brief Method returning dimension 0 cells indexes included in the cell with index id_cell of dimension q. + * + * Returns the dimension 0 vertices indexes included in the cell with index id_cell of dimension q. + * + * \param[in] id_cell Index of the cell. + * \param[in] q Dimension of the cell. + * + * \return A vector of 0-cells indices. + */ + std::vector bottom_faces(int id_cell, int dim) const { - if ((dim >=0) && (dim <= _dim)) - return _base2bool.at(dim).size() ; - else - return 0 ; + // Khalimsky coordinates of the cell + const vector coords(ind2khal(_base2bool.at(dim).at(id_cell))) ; + return khal_to_verts(coords) ; } + /** + * \brief Method printing informations of the complex. + * + * Displays the number of cells in each dimension and the boundary matrix in each dimension. + */ void print_complex() const { for (int q = 0; q <= _dim; ++q) { std::cout << "-------- dimension " << q << std::endl; @@ -129,56 +285,84 @@ class Cubical_complex { } } - std::vector bottom_faces(int id_cell, int dim) const // Vertices included in the cell with index id_cell of dimension dim + /** \brief Get the coordinates of the ith vertex */ + + Point get_vertex_coords(int i) const + { + const vector coords(ind2khal(_base2bool.at(0).at(i))) ; + vector res ; + for (int c : coords) + res.push_back(c/2.) ; + for (int i = coords.size(); i<3; ++i) // points must be 3D + res.push_back(0) ; + return res ; + } + + /** \brief Get the vector of vertices coordinates */ + const std::vector& get_vertices_coords() const { - // Khalimsky coordinates of the cell - const vector coords(ind2khal(_base2bool.at(dim).at(id_cell))) ; - return khal_to_verts(coords) ; + std::vector res ; + for (int i=0; i &K, const std::string &filename, const std::vector > *labels=NULL) ; + + /** + * \brief Method exporting a chain over a cubical complex to a VTK file. + * + * The method generates legacy text VTK files. All the cells of the chain with non zero coefficient are exported. If a cellId is provided, labels are exported in a VTK property (2 for all cells, 0 for cell of index cellId). The index of each cell is exported in a CellID property. + * + * \param[in] K Cubical complex exported. + * \param[in] filename Output file root (output filenames will be built from this root). + * \param[in] chain Chain exported (all the cells with non-zero coefficients in the chain are exported to vtk). + * \param[in] q Dimension of the cells of the chain. + * \param[in] cellId If a positive cellID is provided, labels are exported to distinguish cells of the chain (label 2) from cellId cell (label 0). + */ + static void Cubical_chain_complex_chain_to_vtk(const Cubical_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId = -1) ; +protected: // Methods to access data + /** \brief Get the size of the Khalimsky bounding box \f$(N_1,\ldots,N_{\mathrm{\_dim}})\f$ */ std::vector get_size_bb() const { return _size_bb; } + /** \brief Get _P (coefficients used for the vectorisation of the Khalimsky boolean matrix) */ std::vector get_P() const { return _P; } + /** \brief Get the boolean vector of the complex in Khalimsky coordinates */ std::vector get_cells() const { return _cells; } - std::vector > get_base2bool() const { + /** \brief Get the vector of vectors _base2bool */ + std::vector > get_base2bool() const { return _base2bool; } - std::vector > get_bool2base() const { + /** \brief Get the vector of maps _bool2base */ + std::vector > get_bool2base() const { return _bool2base; } - // Method to get number of cells for a given dimension - int get_N(int dim) const { - if (dim >= 0 && dim <= _dim) { - return _base2bool[dim].size(); - } else { - throw std::out_of_range("Invalid dimension"); - } - } - - std::vector get_vertex_coords(int i) const - { - const vector coords(ind2khal(_base2bool.at(0).at(i))) ; - vector res ; - for (int c : coords) - res.push_back(c/2.) ; - for (int i = coords.size(); i<3; ++i) // points must be 3D - res.push_back(0) ; - return res ; - } - + /** \brief Method computing the boundary of a given cell */ CChain boundary_cell(int index_base, int dim) const { // Ensure dim is within valid range if (dim < 0 || dim >= _base2bool.size()) { @@ -190,7 +374,7 @@ class Cubical_complex { throw std::out_of_range("index_base " + std::to_string(index_base) + " not found in _base2bool[" + std::to_string(dim) + "]"); } - int nb_lignes = (dim == 0) ? 0 : get_N(dim - 1); + int nb_lignes = (dim == 0) ? 0 : nb_cells(dim - 1); CChain boundary(nb_lignes); int index_bool = _base2bool[dim][index_base]; @@ -219,13 +403,14 @@ class Cubical_complex { return boundary; } - - /// Check if a cell (given in Khalimsky coordinates) is valid + + /** \brief Check if a cell (given in Khalimsky coordinates) is valid */ bool is_valid_cell(const std::vector& cell) const ; - /// Check if a cell (given by its boolean index) is valid + /** \brief Check if a cell (given by its boolean index) is valid */ bool is_valid_cell(int id_cell) const ; + /** \brief Compute vertices of a cell given by its Khalimsky coordinates */ vector khal_to_verts(vector c) const { vector > vertices, vertices_tmp ; @@ -282,30 +467,31 @@ class Cubical_complex { return vertices_id ; } -// template -// friend void cubical_complex_write_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels, TDataLabels tdata, const std::string scalar_type) ; - -// template - static void cubical_complex_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels=NULL) ; - -// template - static void cubical_complex_chain_to_vtk(const Cubical_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId = -1) ; + /// Member data +protected: + /** \brief Dimension of the complex */ + int _dim; + /** \brief Size of the Khalimsky bounding box \f$(N_1,\ldots,N_{\mathrm{\_dim}})\f$*/ + std::vector _size_bb; + /** \brief Vector of coefficients used for vectorization of the boolean representation */ + std::vector _P; + /** \brief Vectorized boolean representation of the complex (true if a cell is present, false otherwise) */ + std::vector _cells; + /** \brief Maps from base indices to boolean indices (ie. indices in _cell) in each dimension */ + std::vector> _base2bool; + /** \brief Maps from boolean indices (ie. indices in _cells) to base indices in each dimension */ + std::vector> _bool2base; + /** \brief Vector of boundary matrices in each dimension */ + std::vector _d; +private: + std::vector _visited_cells; // Internal flag + /// Protected methods protected: - // Protected data - int _dim; // Complex dimension - std::vector _size_bb; // Size of the bounding box Ni - std::vector _P; // P vector - std::vector _cells; // Cells of the complex (true if the cell is present, false otherwise) - std::vector> _base2bool; // Maps from base indices to indices in _cells - std::vector> _bool2base; // Maps from indices in _cells to base indices - - std::set visited_cells; - - // Protected methods - void initialize_cells(const CubObject& cub,typeComplexCube type); // Initialize _cells and _base2bool and _bool2base + /** Initialize _cells, _base2bool and _bool2base */ + void initialize_cells(const Cub_object& cub,typeComplexCube type); - // khal coordinates + /** \brief Computes Khalimsky coordinates from boolean index */ std::vector ind2khal(int index) const { if (index > _P[_dim]) throw std::invalid_argument("Index exceeds the size of boolean vector"); @@ -316,8 +502,8 @@ class Cubical_complex { } return khal; } - + /** \brief Computes boolean index from Khalimsky coordinates */ int khal2ind(const std::vector& base_indices) const { if (base_indices.size() != _dim) { throw std::invalid_argument("Dimension of base_indices does not match _dim"); @@ -336,28 +522,37 @@ class Cubical_complex { throw std::out_of_range("Cell index out of bounds in _cells"); } } - - // vox coordinates (for DUAL construction) - std::vector ind2vox(int index, vector N, int max_size) const + + /** \brief Computes voxel coordinates (in a binary object) from an index in a boolean vector + * + * This function is used ONLY for DUAL construction from a binary object (binary image in 2D, binary volume in 3D...) + * Hence we consider a set of cells of maximal dimension vectorized to a boolean vector. + */ + std::vector ind2vox(int index, vector B, int max_size) const { if (index > max_size) throw std::invalid_argument("ind2vox : index exceeding size of boolean vector"); std::vector coords(_dim); for (int k = 0; k < _dim; ++k) { - coords[k] = index % N[k]; - index /= N[k]; + coords[k] = index % B[k]; + index /= B[k]; } return coords; } - int vox2ind(const std::vector& base_indices, vector N, int max_size) const { + /** \brief Computes an index in a boolean vector from voxel coordinates (in a binary object) + * + * This function is used ONLY for DUAL construction from a binary object (binary image in 2D, binary volume in 3D...) + * Hence we consider a set of cells of maximal dimension vectorized to a boolean vector. + */ + int vox2ind(const std::vector& base_indices, vector B, int max_size) const { if (base_indices.size() != _dim) { throw std::invalid_argument("Dimension of base_indices does not match _dim"); } int cell_index = 0; for (int i = 0; i < _dim; ++i) { - cell_index += base_indices[i] * N[i]; + cell_index += base_indices[i] * B[i]; } // Verfiy if cell_index is within bounds of _cells @@ -369,26 +564,33 @@ class Cubical_complex { } } - mutable std::vector _d; // Boundary matrix - void Calculate_d(int dim) const; // Calculate the boundary matrix of dimension dim + /** \brief Computes the boundary matrix of dimension q */ + void calculate_d(int q) ; - void insert_cell(int cell); // Insert a cell into the complex + /** \brief Insert a cell into the complex (and its faces if necessary) */ + void insert_cell(int cell); - int calculate_dimension(const std::vector& cell) const; // Calculate the dimension of a cell - int calculate_dimension(int cell_index) const { return calculate_dimension(ind2khal(cell_index)) ; } + /** \brief Calculate the dimension of a cell (given in Khalimsky coordinates) */ + int calculate_dimension(const std::vector& cell) const; + /** \brief Calculate the dimension of a cell (given by its boolean index) */ + int calculate_dimension(int cell_index) const + { + return calculate_dimension(ind2khal(cell_index)) ; + } - std::vector calculate_boundaries(int cell) const; // Calculate the boundaries of a cell + /** \brief Compute (the boolean indices of) cells belonging to the boundary of `cell` (given by its boolean index) */ + std::vector calculate_boundaries(int cell) const; }; // Initialization of static VTK_cubtypes template const -std::vector Cubical_complex::VTK_cubtypes({1, 3, 8, 11}) ; +std::vector Cubical_chain_complex::VTK_cubtypes({1, 3, 8, 11}) ; // Constructor implementation template -Cubical_complex::Cubical_complex(const CubObject& cub,typeComplexCube type) : _dim(cub.dim), _size_bb(_dim+1), _P(_dim+1,1), _base2bool(_dim+1), _bool2base(_dim+1) +Cubical_chain_complex::Cubical_chain_complex(const Cub_object& cub,typeComplexCube type) : _dim(cub.dim), _size_bb(_dim+1), _P(_dim+1,1), _base2bool(_dim+1), _bool2base(_dim+1) { // Initialize _size_bb and _P @@ -412,36 +614,32 @@ Cubical_complex::Cubical_complex(const CubObject& cub,typeCompl // Initialize _d _d.resize(_dim+1); for (int q = 0; q <= _dim; ++q) { - Calculate_d(q); + calculate_d(q); } + // Initialize _visited_cells + _visited_cells.resize(_P.at(_dim), false) ; + } +// initialize_cells implementation template -void Cubical_complex::initialize_cells(const CubObject& cub, typeComplexCube type) +void Cubical_chain_complex::initialize_cells(const Cub_object& cub, typeComplexCube type) { - if (type == PRIMAL) { - for (int i=0; i::initialize_cells(const CubObject& cub, ty for (int q = 1; q <= _dim; ++q) { for (int i = 0; i < _P[_dim]; ++i) { - + if (calculate_dimension(ind2khal(i)) == q) { std::vector boundaries = calculate_boundaries(i); bool all_boundaries_present = true; @@ -474,8 +672,6 @@ void Cubical_complex::initialize_cells(const CubObject& cub, ty } } if (all_boundaries_present) { - - _cells.at(i)= true ; // Add the cell in _base2bool and _bool2base const int dim(calculate_dimension(i)) ; @@ -494,8 +690,9 @@ void Cubical_complex::initialize_cells(const CubObject& cub, ty } +// is_valid_cell implementation template -bool Cubical_complex::is_valid_cell(const std::vector& cell) const { +bool Cubical_chain_complex::is_valid_cell(const std::vector& cell) const { for (int i=0; i<_dim; ++i) { if (cell[i] < 0 || cell[i] >= _size_bb[i]) { return false; @@ -505,7 +702,7 @@ bool Cubical_complex::is_valid_cell(const std::vector& cel } template -bool Cubical_complex::is_valid_cell(int id_cell) const +bool Cubical_chain_complex::is_valid_cell(int id_cell) const { if ((id_cell < 0) || (id_cell > _P[_dim])) return false; @@ -514,59 +711,57 @@ bool Cubical_complex::is_valid_cell(int id_cell) const } - +// insert_cell implementation template -void Cubical_complex::insert_cell(int cell) { +void Cubical_chain_complex::insert_cell(int cell) { if (!is_valid_cell(cell)) throw std::out_of_range("insert_cell: trying to insert cell with invalid index"); // verify if the cell has already been visited - if (visited_cells.find(cell) != visited_cells.end()) { + if (_visited_cells.at(cell)) { return; // cell has already been visited } std::vector cell_coords(ind2khal(cell)); int dim = calculate_dimension(cell_coords); - + _cells[cell] = true; int cell_base_index = _base2bool[dim].size(); _base2bool[dim].push_back(cell); _bool2base[dim][cell] = cell_base_index; - + std::vector boundaries(calculate_boundaries(cell)); for (const auto& boundary : boundaries) { if (!_cells[boundary]) { insert_cell(boundary); } } - + // mark cell as visited - visited_cells.insert(cell); + _visited_cells.at(cell) = true ; } - +// calculate_d implementation template -void Cubical_complex::Calculate_d(int dim) const { - int nb_lignes = (dim == 0) ? 0 : get_N(dim - 1); +void Cubical_chain_complex::calculate_d(int dim) { + int nb_lignes = (dim == 0) ? 0 : nb_cells(dim - 1); - _d[dim] = CMatrix(nb_lignes, get_N(dim)); + _d[dim] = CMatrix(nb_lignes, nb_cells(dim)); // Iterate through the cells of dimension dim - for (int i = 0; i < get_N(dim); ++i) { + for (int i = 0; i < nb_cells(dim); ++i) { // Boundary of the i-th cell of dimension dim CChain boundary = boundary_cell(i, dim); // Insert the chain into the corresponding column of the boundary matrix OSM::setColumn(_d[dim], i, boundary); } - - - } +// calculate_dimension implementation template -int Cubical_complex::calculate_dimension(const std::vector& cell) const { +int Cubical_chain_complex::calculate_dimension(const std::vector& cell) const { int dimension = 0; for (int index : cell) { if (index % 2 == 1) { // Un index impair indique une dimension plus élevée @@ -576,13 +771,12 @@ int Cubical_complex::calculate_dimension(const std::vector return dimension; } +// calculate_boundaries implementation template -std::vector Cubical_complex::calculate_boundaries(int idcell) const { +std::vector Cubical_chain_complex::calculate_boundaries(int idcell) const { std::vector boundaries; std::vector c = ind2khal(idcell); - - for (int i = 0; i < _dim; ++i) { if (c[i] % 2 == 1) { @@ -591,221 +785,37 @@ std::vector Cubical_complex::calculate_boundaries(int idce if (is_valid_cell(cell1)) boundaries.push_back(cell1) ; - int cell2 = idcell - _P[i]; if (is_valid_cell(cell2)) boundaries.push_back(cell2) ; - } } - return boundaries; } -// tdata: labels encode boolean (for FSTAR and G) or int data (for PSC) -// labels: data to mark cells (e.g. (co)homology generators labels -// -> for P,S,C labelling, the type is int => export all cells with their label -// -> for generator, the type is bool => export only cells with label true -// scalar_type: type of labels (e.g. T) - - -//template -//void cubical_complex_write_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels=NULL, TDataLabels tdata=INT_LABELS, const std::string scalar_type="none") -//{ -// bool with_scalars = (labels != NULL) ; -// int type_data(0) ; // 1 for int (ie. P,S,C labelling), 2 for bool (generators), 0 when no labels -// if (with_scalars) -// { -// if (tdata == INT_LABELS) -// type_data = 1 ; -// else -// type_data = 2 ; -// } -// // Load out file... -// std::ofstream out ( filename, std::ios::out | std::ios::trunc); -// -// if ( not out . good () ) { -// std::cerr << "SimplicialComplex::loadFromFile. Fatal Error:\n " << filename << " not found.\n"; -// throw std::runtime_error("File Parsing Error: File not found"); -// } -// -// // Header -// out << "# vtk DataFile Version 2.0" << endl ; -// out << "generators" << endl ; -// out << "ASCII" << endl ; -// out << "DATASET UNSTRUCTURED_GRID" << endl ; -// -// // Points -// int nnodes = K.nb_cells(0) ; -// out << "POINTS " << nnodes << " double" << endl ; -// for (int i=0; i coords(K.ind2khal(K._base2bool[0].at(i))) ; -// for (int c : coords) -// out << c/2 << " " ; -// for (int i = coords.size(); i<3; ++i) // points must be 3D -// out << "0 " ; -// out << endl ; -// } -// -// int ncells_tot = 0, size_cells_tot = 0 ; -// std::vector types ; -// std::vector scalars ; -// std::vector ids ; -// if ((type_data==0) || (type_data==1)) // all cells must be printed -// { -// // Cells up to dimension 3 -// // Number of cells : for each chain, each number of vertices for each cell -// // Size : size of a cell of dimension q : 2^q -// for (int q=0; q<=K._dim; ++q) -// { -// ncells_tot += K.nb_cells(q) ; -// const int size_cell = 1<::VTK_cubtypes.at(0)) ; -// if (with_scalars) -// { -// scalars.push_back((*labels).at(0).at(i)) ; -// ids.push_back(i) ; -// } -// } -// // Cells of higher dimension -// for (int q=1; q<=K._dim; ++q) -// { -// const int size_cell = 1< verts(K.khal_to_verts(K.ind2khal(K._base2bool.at(q).at(id)))) ; -// out << size_cell << " " ; -// for (int i : verts) -// out << i << " " ; -// out << endl ; -// types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; -// if (with_scalars) -// { -// scalars.push_back((*labels).at(q).at(id)) ; -// ids.push_back(id) ; -// } -// } -// } -// -// -// // CELL_TYPES -// out << "CELL_TYPES " << ncells_tot << endl ; -// for (int t : types) -// out << t << " " ; -// out << endl ; -// } -// else // output only cells labelled true -// { -// // 1 - Compute the number of cells / size of encoding -// // Vertices -// for (int i = 0; i::VTK_cubtypes.at(0)) ; -// } -// } -// // Cells of higher dimension -// for (int q=1; q<=K._dim; ++q) -// { -// const int size_cell = 1< khal(K.ind2khal(K._base2bool.at(q).at(id))) ; -// vector verts(K.khal_to_verts(K.ind2khal(K._base2bool.at(q).at(id)))) ; -// out << size_cell << " " ; -// for (int i : verts) -// out << i << " " ; -// out << endl ; -// types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; -// } -// } -// } -// // CELL_TYPES -// out << "CELL_TYPES " << ncells_tot << endl ; -// for (int t : types) -// out << t << " " ; -// out << endl ; -// } -// -// if (with_scalars && (type_data==1)) -// { -// // CELL_TYPES -// out << "CELL_DATA " << ncells_tot << endl ; -// out << "SCALARS Label " << scalar_type << " 1" << endl ; -// out << "LOOKUP_TABLE default" << endl ; -// for (int s : scalars) -// out << s << " " ; -// out << endl ; -// // CELL_IDs -// out << "SCALARS CellId " << scalar_type << " 1" << endl ; -// out << "LOOKUP_TABLE default" << endl ; -// for (int i : ids) -// out << i << " " ; -// out << endl ; -// } -// out.close() ; -//} /** \brief Export complex to vtk (with int labels if provided). -* -> All cells are exported */ + * -> All cells are exported */ template -void Cubical_complex::cubical_complex_to_vtk(const Cubical_complex &K, const std::string &filename, const std::vector > *labels) +void Cubical_chain_complex::Cubical_chain_complex_to_vtk(const Cubical_chain_complex &K, const std::string &filename, const std::vector > *labels) { bool with_scalars = (labels != NULL) ; // Load out file... std::ofstream out ( filename, std::ios::out | std::ios::trunc); - + if ( not out . good () ) { std::cerr << "CubComplex_to_vtk. Fatal Error:\n " << filename << " not found.\n"; throw std::runtime_error("File Parsing Error: File not found"); } - + // Header out << "# vtk DataFile Version 2.0" << endl ; out << "generators" << endl ; out << "ASCII" << endl ; out << "DATASET UNSTRUCTURED_GRID" << endl ; - + // Points size_t nnodes = K.nb_cells(0) ; out << "POINTS " << nnodes << " double" << endl ; @@ -818,7 +828,7 @@ void Cubical_complex::cubical_complex_to_vtk(const Cubical_comp out << "0 " ; out << endl ; } - + int ncells_tot = 0, size_cells_tot = 0 ; std::vector types ; std::vector scalars ; @@ -840,7 +850,7 @@ void Cubical_complex::cubical_complex_to_vtk(const Cubical_comp for (int i = 0; i::VTK_cubtypes.at(0)) ; + types.push_back(Cubical_chain_complex::VTK_cubtypes.at(0)) ; if (with_scalars) { scalars.push_back((*labels).at(0).at(i)) ; @@ -858,7 +868,7 @@ void Cubical_complex::cubical_complex_to_vtk(const Cubical_comp for (int i : verts) out << i << " " ; out << endl ; - types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; + types.push_back(Cubical_chain_complex::VTK_cubtypes.at(q)) ; if (with_scalars) { scalars.push_back((*labels).at(q).at(id)) ; @@ -894,29 +904,29 @@ void Cubical_complex::cubical_complex_to_vtk(const Cubical_comp } /** \brief Export chain of dimension q to vtk. -* -> Only cells of the chain are exported -* -> If a cell Id is provided scalars are exported (0 for the given cellId / 2 for other cells) -*/ + * -> Only cells of the chain are exported + * -> If a cell Id is provided scalars are exported (0 for the given cellId / 2 for other cells) + */ template -void Cubical_complex::cubical_complex_chain_to_vtk(const Cubical_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) +void Cubical_chain_complex::Cubical_chain_complex_chain_to_vtk(const Cubical_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) { bool with_scalars = (cellId != -1) ; // Load out file... std::ofstream out ( filename, std::ios::out | std::ios::trunc); - + if ( not out . good () ) { std::cerr << "SimpComplex_chain_to_vtk. Fatal Error:\n " << filename << " not found.\n"; throw std::runtime_error("File Parsing Error: File not found"); } - + // Header out << "# vtk DataFile Version 2.0" << endl ; out << "generators" << endl ; out << "ASCII" << endl ; out << "DATASET UNSTRUCTURED_GRID" << endl ; - + // Points int nnodes = K.nb_cells(0) ; out << "POINTS " << nnodes << " double" << endl ; @@ -929,7 +939,7 @@ void Cubical_complex::cubical_complex_chain_to_vtk(const Cubica out << "0 " ; out << endl ; } - + int ncells_tot = 0, size_cells_tot = 0 ; std::vector types ; std::vector scalars ; @@ -964,7 +974,7 @@ void Cubical_complex::cubical_complex_chain_to_vtk(const Cubica for (int i : verts) out << i << " " ; out << endl ; - types.push_back(Cubical_complex::VTK_cubtypes.at(q)) ; + types.push_back(Cubical_chain_complex::VTK_cubtypes.at(q)) ; if (with_scalars) { @@ -983,7 +993,7 @@ void Cubical_complex::cubical_complex_chain_to_vtk(const Cubica out << t << " " ; out << endl ; } - + if (with_scalars) { // CELL_TYPES @@ -1003,5 +1013,6 @@ void Cubical_complex::cubical_complex_chain_to_vtk(const Cubica out.close() ; } - -#endif // CUBCOMPLEX_HPP +} + +#endif // CGAL_CUBICAL_CHAIN_COMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index 4bfca2f83291..f64fa5fa7288 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -24,6 +24,8 @@ * \date 06/11/2024 */ +namespace CGAL { + // SimpComplex /** \brief vtk export for SimpComplex */ @@ -48,7 +50,7 @@ void Simp_output_vtk (HDVF, _ChainT if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) { string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; -// vector > labels = hdvf.export_label(G,c,q) ; + // vector > labels = hdvf.export_label(G,c,q) ; OSM::Chain chain(hdvf.export_GChain(c,q)) ; ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; } @@ -69,18 +71,18 @@ void Simp_output_vtk (HDVF, _ChainT // Duality template -class Duality_SimpComplexTools { +class Duality_simplicial_complex_tools { public: typedef Simplicial_chain_complex _ComplexType ; typedef SubChainComplex _SubCCType ; // Constructor - Duality_SimpComplexTools() {} + Duality_simplicial_complex_tools() {} /** \brief Build a SimpComplex L and SubChainComplex K from a SimpComplex _K. * L : complex built out of _K and a closing icosphere meshed by tetgen * K (SubChainComplex) : SubChainComplex identifying _K inside L */ - + /** \brief Build the bounding box CubComplex of _CC */ typedef struct ztriple { _ComplexType& L ; @@ -91,7 +93,7 @@ class Duality_SimpComplexTools { static TripleRes SimpComplexBB (const _ComplexType& _K, double BB_ratio=1.5, const string& out_file_prefix = "file_K_closed.off") { // Export _CC to a MeshObject to add the icosphere and mesh with tetGen - Mesh_object mesh_L = Duality_SimpComplexTools::export_meshObject(_K) ; + Mesh_object mesh_L = Duality_simplicial_complex_tools::export_meshObject(_K) ; // Closing K by adding the icosphere // Compute a bounding icosphere @@ -106,7 +108,7 @@ class Duality_SimpComplexTools { // Write this mesh to an off file for Tetgen mesh_L.write_off(out_file_prefix) ; -// const std::string tetgen_path(CMAKE_TETGEN_PATH) ; + // const std::string tetgen_path(CMAKE_TETGEN_PATH) ; // WARNING: use CGAL 3D triangulation to get rid of tetgen... const std::string tetgen_path("/Users/umenohana/Dropbox/G-Mod/TopAlg/code/tetgen1.6.0/build/") ; std::string tetgen_command = tetgen_path+"tetgen -pqkcYfe "+out_file_prefix+".off" ; @@ -144,8 +146,8 @@ class Duality_SimpComplexTools { const Simplex& s(_CC._ind2simp.at(q).at(i)) ; vcells.push_back(s.getVertices()) ; } - - Mesh_object &m = *(new Mesh_object(-3, _CC.get_nodes_coords(), vcells)) ; + + Mesh_object &m = *(new Mesh_object(-3, _CC.get_vertices_coords(), vcells)) ; return m ; } } ; @@ -220,4 +222,6 @@ void Per_Simp_output_vtk (PersistentHDVF(per_hdvf, complex, filename+"_inf") ; } +} + #endif // SimpComplexTools_HPP diff --git a/HDVF/include/CGAL/HDVF/Simplex.hpp b/HDVF/include/CGAL/HDVF/Simplex.hpp index 1cef13d25361..07d3661e0ef2 100644 --- a/HDVF/include/CGAL/HDVF/Simplex.hpp +++ b/HDVF/include/CGAL/HDVF/Simplex.hpp @@ -7,31 +7,33 @@ #include #include +namespace CGAL { + class Simplex { template friend class Abstract_simplicial_complex ; -private: + private: std::set _vertices; - -public: + + public: typedef std::set::const_iterator const_iterator ; const_iterator cbegin () { return _vertices.cbegin() ; } const_iterator cend () { return _vertices.cend() ; } // Constructor Simplex(const std::set& vertices) : _vertices(vertices) {} - + int dimension() const { return _vertices.size() - 1; } - + // Boundary operator std::vector boundary() const { std::vector result; result.reserve(_vertices.size()); - + auto it = _vertices.begin(); for (size_t i = 0; i < _vertices.size(); ++i) { std::set simplex_vertices; @@ -40,38 +42,39 @@ class Simplex { result.emplace_back(simplex_vertices); ++it; } - + return result; } - + // Method to get the vertices of the simplex (for testing) const std::set& getVertices() const { return _vertices ; } - + // Comparison operator used for sorting simplices (especially in the Complex class) bool operator<(const Simplex& other) const { return _vertices < other._vertices; } - + // Operator << friend std::ostream& operator<<(std::ostream& out, const Simplex& simplex) { - out << "<"; - bool first = true; - for (int vertex : simplex._vertices) { - if (!first) { - - out << " "; - } - out << vertex; - first = false; + out << "<"; + bool first = true; + for (int vertex : simplex._vertices) { + if (!first) { + + out << " "; } - out << ">"; - return out; + out << vertex; + first = false; + } + out << ">"; + return out; } }; +} #endif // SIMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp index b10155f1f0b6..28353cd3a717 100644 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -118,7 +118,7 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { /** \brief Operator<<. */ friend std::ostream& operator<<(std::ostream &_stream, const SubSparseMatrix &_matrix) { _stream << static_cast&>(_matrix) ; - _stream << _matrix._subChains << endl ; + _stream << _matrix._subChains << std::endl ; return _stream ; } }; diff --git a/HDVF/include/CGAL/HDVF/Zp.hpp b/HDVF/include/CGAL/HDVF/Zp.hpp index d3cfeff63b39..1352778f9cd2 100644 --- a/HDVF/include/CGAL/HDVF/Zp.hpp +++ b/HDVF/include/CGAL/HDVF/Zp.hpp @@ -14,55 +14,57 @@ #include #include +namespace CGAL { + // Chose _TSlot according to the size of p template class Zp { _TSlot _i ; public: - + /// Constructor (default) Zp(_TSlot i=0) : _i( (i>=0)?(i % p):((i % p) + p) ) { } - - + + /// Copy constructor Zp(const Zp& a) : _i(a._i) {} - + /// unary operator+ friend Zp operator+ (const Zp& a) { return Zp(a) ; } - + /// unary operator- friend Zp operator- (const Zp& a) { return Zp(- a._i) ; } - + /// operator+ friend Zp operator+ (const Zp& a, const Zp& b) { return Zp((a._i + b._i)) ; } - + /// operator- friend Zp operator- (const Zp& a, const Zp& b) { return Zp((a._i - b._i)) ; } - + /// operator* friend Zp operator* (const Zp& a, const Zp& b) { return Zp((a._i * b._i)) ; } - + /// operator/ friend Zp operator/ (const Zp& a, const Zp& b) { return Zp(a._i / b._i) ; } - + /// operator+= Zp & operator+= (const Zp& a) { @@ -76,7 +78,7 @@ class Zp { } return *this ; } - + /// operator-= Zp & operator-= (const Zp& a) { @@ -90,7 +92,7 @@ class Zp { } return *this ; } - + /// operator*= Zp & operator*= (const Zp& a) { @@ -104,7 +106,7 @@ class Zp { } return *this ; } - + /// operator/= Zp & operator/= (const Zp& a) { @@ -118,25 +120,25 @@ class Zp { } return *this ; } - + /// operator== friend bool operator== (const Zp& a, const Zp& b) { return (a._i == b._i) ; } - + /// operator!= friend bool operator!= (const Zp& a, const Zp& b) { return (a._i != b._i); } - + /// abs friend Zp abs(const Zp& a) { return Zp(abs(a._i)) ; } - + /// operator<< friend std::ostream& operator<<(std::ostream& out, const Zp& a) { @@ -144,4 +146,6 @@ class Zp { } }; +} + #endif diff --git a/HDVF/include/CGAL/HDVF/hdvf.hpp b/HDVF/include/CGAL/HDVF/hdvf.hpp index 45ef3e735cb5..3bfb04bbedc2 100644 --- a/HDVF/include/CGAL/HDVF/hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf.hpp @@ -17,11 +17,10 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" -//#include "Abstract_simplicial_complex.hpp" -//#include "Simplex.hpp" -//#include "CubComplex.hpp" #include "CGAL/HDVF/sub_chain_complex.hpp" +namespace CGAL { + /** \brief Enum for the HDVF label of cells. */ enum FlagType { PRIMARY, @@ -91,7 +90,7 @@ class HDVF { typedef _ChainType<_CoefficientType, OSM::ROW> RChain; typedef _SparseMatrixType<_CoefficientType, OSM::COLUMN> CMatrix; typedef _SparseMatrixType<_CoefficientType, OSM::ROW> RMatrix; - + protected: // Properties /** \brief Flags for the cells. */ @@ -116,7 +115,7 @@ class HDVF { /** \brief HDVF options for computation (computation of partial reduction). */ int _hdvf_opt; - + public: // Constructor - default : full reduction computed, no sub-complex HDVF(const _ComplexType& K, int hdvf_opt = OPT_FULL) ; @@ -124,7 +123,7 @@ class HDVF { HDVF(const HDVF& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } // Destructor ~HDVF() { } - + // findPair functions /** \brief find a valid PairCell for A in dimension q */ @@ -172,23 +171,23 @@ class HDVF { void MW(int pi, int sigma, int dim); /** \brief Compute a perfect HDVF - From dimension q-1 to dimension 0 - As long as findPairA(q) returns a pair - -> Perform operation A - -> Add the pair to the output vector - */ + From dimension q-1 to dimension 0 + As long as findPairA(q) returns a pair + -> Perform operation A + -> Add the pair to the output vector + */ std::vector computePerfectHDVF(bool verbose = false); /** \brief Compute a perfect HDVF - From dimension q-1 to dimension 0 - As long as findPairsA(q) returns pairs - -> Choose one randomly - -> Perform operation A - -> Add the pair to the output vector - Slower than computePerfectHDVF - */ - std::vector computeRandPerfectHDVF(bool verbose = false); - + From dimension q-1 to dimension 0 + As long as findPairsA(q) returns pairs + -> Choose one randomly + -> Perform operation A + -> Add the pair to the output vector + Slower than computePerfectHDVF + */ + std::vector computeRandPerfectHDVF(bool verbose = false); + // HDVF getters // Method to get cells if with a given flag (P,S,C) for each dimension virtual std::vector > get_flag (FlagType flag) const ; @@ -208,21 +207,21 @@ class HDVF { // Method to print A-pairs virtual std::ostream& print_pairs(const std::vector& pairs, std::ostream &out = std::cout); - + // Method to project a chain onto P, S, or C cells template _ChainType<_CoefficientType, ChainTypeFlag> projection(const _ChainType<_CoefficientType, ChainTypeFlag>& chain, FlagType flag, int dim) const { // Create a new chain to store the result // Better to initialize 'result' directly with the correct size and iterate over it _ChainType<_CoefficientType, ChainTypeFlag> result(chain); - + // Iterate over each element of the chain std::vector tmp ; for (typename _ChainType<_CoefficientType, ChainTypeFlag>::const_iterator it = result.cbegin(); it != result.cend(); ++it) { int cell_index = it->first; _CoefficientType value = it->second; - + // Check the flag of the corresponding cell if (_flag[dim][cell_index] != flag) { // Set to 0 @@ -299,20 +298,20 @@ class HDVF { virtual std::vector > export_labelsPSC () const { std::vector > labels(_K.dim()+1) ; - for (int q=0; q<=_K.dim(); ++q) + for (int q=0; q<=_K.dim(); ++q) + { + for (int i = 0; i<_K.nb_cells(q); ++i) { - for (int i = 0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == PRIMARY) - labels.at(q).push_back(-1) ; - else if (_flag.at(q).at(i) == SECONDARY) - labels.at(q).push_back(1) ; - else if (_flag.at(q).at(i) == CRITICAL) - labels.at(q).push_back(0) ; - else // NONE - labels.at(q).push_back(2) ; - } + if (_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else if (_flag.at(q).at(i) == CRITICAL) + labels.at(q).push_back(0) ; + else // NONE + labels.at(q).push_back(2) ; } + } return labels ; } @@ -393,27 +392,27 @@ HDVF::HDVF(const Co // Resize the _DD_col vector to hold dim+1 elements _DD_col.resize(dim + 1); - + // Resize the _F_row vector to hold dim+1 elements if (_hdvf_opt & (OPT_FULL | OPT_F)) _F_row.resize(dim + 1); - + // Resize the _G_col vector to hold dim+1 elements if (_hdvf_opt & (OPT_FULL | OPT_G)) _G_col.resize(dim + 1); - + // Resize the _H_col vector to hold dim+1 elements if (_hdvf_opt & OPT_FULL) _H_col.resize(dim + 1); - + // Resize flag and count vectors to hold dim+1 elements _flag.resize(dim + 1); _nb_P.resize(dim + 1); _nb_S.resize(dim + 1); _nb_C.resize(dim + 1); - + // Initialize matrices and counters - + for (int q = 0; q <= dim; q++) { // Initialize _F_row[q] as a row matrix with dimensions (dim(q) x dim(q)) if (_hdvf_opt & (OPT_FULL | OPT_F)) @@ -422,22 +421,22 @@ HDVF::HDVF(const Co // Initialize _G_col[q] as a column matrix with dimensions (dim(q) x dim(q)) if (_hdvf_opt & (OPT_FULL | OPT_G)) _G_col[q] = CMatrix(_K.nb_cells(q), _K.nb_cells(q)); - + // Initialize _H_col[q] as a column matrix with dimensions (dim(q+1) x dim(q)) if (_hdvf_opt & OPT_FULL) _H_col[q] = CMatrix(_K.nb_cells(q + 1), _K.nb_cells(q)); - + // Initialize the counters for PRIMARY, SECONDARY, and CRITICAL cells _nb_P[q] = 0; _nb_S[q] = 0; _nb_C[q] = _K.nb_cells(q); } - + // Initialize the flags for each dimension to CRITICAL for (int q = 0; q <= dim; q++) { _flag[q] = std::vector(_K.nb_cells(q), CRITICAL); } - + // Populate the DD matrices _DD_col.resize(_K.dim()+1) ; for (int q=0; q<=_K.dim(); ++q) @@ -509,7 +508,7 @@ PairCell HDVF::find return p; } - /** \brief find a valid PairCell containing tau for A in dimension q */ +/** \brief find a valid PairCell containing tau for A in dimension q */ //template template typename _ChainType, template typename _SparseMatrixType> PairCell HDVF::findPairA(int q, bool &found, int tau) // const @@ -579,38 +578,38 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::findPairsA(int q, bool &found, int tau) // const { - found = false; - std::vector pairs; - - // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible - RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; + found = false; + std::vector pairs; + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; for (typename RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - PairCell p ; - p.sigma = tau ; - p.tau = it->first ; - p.dim = q ; - pairs.push_back(p) ; - } - } - // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible - const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = tau ; + p.tau = it->first ; + p.dim = q ; + pairs.push_back(p) ; + } + } + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - PairCell p ; - p.sigma = it->first ; - p.tau = tau ; - p.dim = q-1 ; - pairs.push_back(p) ; - } - } - return pairs; + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = it->first ; + p.tau = tau ; + p.dim = q-1 ; + pairs.push_back(p) ; + } + } + return pairs; } // Methods to find a pair of cells for M in dimension q @@ -988,7 +987,7 @@ PairCell HDVF::find { found = false; PairCell p; - + if (_flag.at(q).at(tau) == CRITICAL) return p ; // Empty / found false @@ -1217,10 +1216,10 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> void HDVF::A(int tau1, int tau2, int q) { //----------------------------------------------- Submatrices of D ---------------------------------------------------- - + // Output operation details to the console -// cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; - + // cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; + // Extract submatrices from _DD_col RChain D12(OSM::getRow(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 CChain D21(OSM::getColumn(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 @@ -1239,9 +1238,9 @@ void HDVF::A(int ta // Delete rows and columns from _DD_col _DD_col[q + 1].delRow(tau1); // Remove row tau1 from _DD_col[q+1] _DD_col[q + 1].delColumn(tau2); // Remove column tau2 from _DD_col[q+1] - + //---------------------------------------------- Submatrices of F ----------------------------------------------------- - + RChain F11 ; CChain G11 ; if (_hdvf_opt & (OPT_FULL | OPT_F)) @@ -1252,9 +1251,9 @@ void HDVF::A(int ta // Delete the row tau1 from _F_row _F_row[q].delRow(tau1); } - + //--------------------------------------------- Submatrices of G ------------------------------------------------------ - + if (_hdvf_opt & (OPT_FULL | OPT_G)) { // Extract the relevant submatrix from _G_col @@ -1263,9 +1262,9 @@ void HDVF::A(int ta // Delete the column tau2 from _G_col _G_col[q + 1].delColumn(tau2); } - + //--------------------------------------------- Update matrices ------------------------------------------------------- - + // ---- Update _F_row if (_hdvf_opt & (OPT_FULL | OPT_F)) @@ -1281,7 +1280,7 @@ void HDVF::A(int ta // Remove the row tau2 from _F_row[q+1] _F_row[q + 1].delRow(tau2); } - + // ---- Update _G_col if (_hdvf_opt & (OPT_FULL | OPT_G)) @@ -1296,7 +1295,7 @@ void HDVF::A(int ta // Remove the column tau1 from _G_col[q] _G_col[q].delColumn(tau1); } - + // ---- Update _H_col if (_hdvf_opt & OPT_FULL) @@ -1317,7 +1316,7 @@ void HDVF::A(int ta // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv _H_col[q].set_coef(tau2, tau1, D11_inv); } - + // ---- Update _DD_col // Update _DD_col @@ -1338,7 +1337,7 @@ void HDVF::A(int ta _flag[q + 1][tau2] = SECONDARY; // Set the flag of tau2 in dimension q+1 to SECONDARY --_nb_C.at(q+1) ; ++_nb_S.at(q+1) ; - + // ----------------------------------------------------------------------------------------------------------------------- } @@ -1348,7 +1347,7 @@ void HDVF::A(int ta template typename _ChainType, template typename _SparseMatrixType> void HDVF::R(int pi, int sigma, int q) { //----------------------------------------------- Submatrices of H ---------------------------------------------------- - + if (_hdvf_opt & OPT_FULL) { // Output operation details to the console @@ -1511,22 +1510,22 @@ void HDVF::M(int pi _H_col[q].delColumn(pi); //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ - + // For DD_q+1 and DD_q: // Extract the relevant row chains from _DD_col - + // DD_q+1 (corresponds to the row matrix of _DD_col) RChain D11(OSM::getRow(_DD_col[q+1], gamma)); // D11 is the row chain from _DD_col[q+1] at index gamma _DD_col[q + 1].delRow(gamma); // Remove row gamma from _DD_col[q + 1] //--------------------------------------------- Submatrices of DD ------------------------------------------------------ - + // DD_q (corresponds to the column matrix of _DD_col) // CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); // D11_q is the column chain from _DD_col[q] at index gamma if (q > 0) _DD_col[q].delColumn(gamma); // Remove column gamma from _DD_col[q] - + //--------------------------------------------- Update matrices ------------------------------------------------------- // Update _H_col @@ -1590,9 +1589,9 @@ void HDVF::M(int pi template typename _ChainType, template typename _SparseMatrixType> void HDVF::W(int sigma, int gamma, int q) { - + //----------------------------------------------- Submatrices of G ---------------------------------------------------- - + if (_hdvf_opt & OPT_FULL) { // Output the operation details to the console @@ -1623,7 +1622,7 @@ void HDVF::W(int si //---------------------------------------------- Submatrices of F ----------------------------------------------------- // Extract the row chain from _F_row -// RChain F11(OSM::getRow(_F_row[q], gamma)); // F11 is the row chain from _F_row[q] at index gamma + // RChain F11(OSM::getRow(_F_row[q], gamma)); // F11 is the row chain from _F_row[q] at index gamma // Remove the row gamma from _F_row _F_row[q].delRow(gamma); @@ -1715,9 +1714,9 @@ void HDVF::W(int si template typename _ChainType, template typename _SparseMatrixType> void HDVF::MW(int pi, int sigma, int q) { - + //----------------------------------------------- Submatrices of G ---------------------------------------------------- - + if (_hdvf_opt & OPT_FULL) { // Output the operation details to the console @@ -1839,11 +1838,11 @@ std::vector HDVF pair_list; // Vector to store the list of pairs bool trouve = false; // Flag to indicate whether a pair was found int dim = _K.dim(); // Get the dimension of the complex K - + // Loop through dimensions from q-1 to 0 for (int q = dim - 1; q >= 0; --q) { std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; -// cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; + // cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) // Find a pair of cells in dimension q @@ -1867,7 +1866,7 @@ std::vector HDVF HDVF typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::computeRandPerfectHDVF(bool verbose) { - std::vector pair_list; // Vector to store the list of pairs - bool trouve = false; // Flag to indicate whether a pair was found - int dim = _K.dim(); // Get the dimension of the complex K - - // Init random generator - std::random_device dev; - std::mt19937 rng(dev()); // Random - - // Loop through dimensions from q-1 to 0 - for (int q = dim - 1; q >= 0; --q) { - std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; - // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) - - std::vector pairs = findPairsA(q, trouve); - - PairCell pair ; - - // While a pair is found - while (trouve) - { - // Add one of the pairs (randomly) to the list - { - // Pickup a random cell sigma - std::uniform_int_distribution rand_dist(0,pairs.size()-1); - int i(rand_dist(rng)) ; - pair = pairs.at(i) ; - } - pair_list.push_back(pair); - - // Perform operation A with the chosen pair - A(pair.sigma, pair.tau, pair.dim); - if (verbose) - { - std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; - print_matrices(std::cout) ; - } - - // Compute possible pairings - pairs = findPairsA(q, trouve); - } - } - // Return the list of pairs found - return pair_list; - } + std::vector pair_list; // Vector to store the list of pairs + bool trouve = false; // Flag to indicate whether a pair was found + int dim = _K.dim(); // Get the dimension of the complex K + + // Init random generator + std::random_device dev; + std::mt19937 rng(dev()); // Random + + // Loop through dimensions from q-1 to 0 + for (int q = dim - 1; q >= 0; --q) { + std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; + // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) + + std::vector pairs = findPairsA(q, trouve); + + PairCell pair ; + + // While a pair is found + while (trouve) + { + // Add one of the pairs (randomly) to the list + { + // Pickup a random cell sigma + std::uniform_int_distribution rand_dist(0,pairs.size()-1); + int i(rand_dist(rng)) ; + pair = pairs.at(i) ; + } + pair_list.push_back(pair); + + // Perform operation A with the chosen pair + A(pair.sigma, pair.tau, pair.dim); + if (verbose) + { + std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; + print_matrices(std::cout) ; + } + + // Compute possible pairings + pairs = findPairsA(q, trouve); + } + } + // Return the list of pairs found + return pair_list; +} // Method to get cells if with a given flag (P,S,C) for each dimension //template @@ -1982,11 +1981,11 @@ std::ostream& HDVF: out << "--- dim " << q << std::endl; for (int i = 0; i < critical.at(q).size(); ++i) { - out << critical.at(q).at(i) << " "; + out << critical.at(q).at(i) << " "; } out << std::endl; } - + if (_hdvf_opt & (OPT_FULL | OPT_G)) { // Print matrices g @@ -2006,7 +2005,7 @@ std::ostream& HDVF: } } } - + if (_hdvf_opt & (OPT_FULL | OPT_F)) { // Print matrices f* @@ -2040,4 +2039,6 @@ std::ostream& HDVF: return out ; } +} + #endif // HDVF_H diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp index 21449609390d..bcc824ae1743 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -13,13 +13,11 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" -#include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" -#include "CGAL/HDVF/Simplex.hpp" -#include "CGAL/HDVF/Cubical_complex.hpp" #include "CGAL/HDVF/hdvf.hpp" #include "CGAL/HDVF/sub_chain_complex.hpp" #include "CGAL/HDVF/SubSparseMatrix.hpp" +namespace CGAL { /** * \class Dual_HDVF @@ -420,26 +418,26 @@ class Dual_HDVF : public HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::S return CChain(0) ; } } - -// // Get fstar(cell, dim) with per indices -// RChain fstar_cell(OSM::cgetRow(this->_F_row.at(dim), cell)) ; -// // Add 1 to the cell -// fstar_cell[cell] = 1 ; -// // Keep cells of the chain belonging to _subCC -// // Compute the chain (transpose of F_STAR column) -// CChain fstar_cell_sub(fstar_cell.dimension()) ; -// for (typename RChain::const_iterator it = fstar_cell.begin(); it != fstar_cell.end(); ++it) -// { -// // Keep cells of the chain belonging to _subCC -// if (_subCC.get_Bit(dim, it->first)) -// { -// fstar_cell_sub[it->first] = it->second ; -// } -// } -// return fstar_cell_sub ; -// } -// else -// throw "Error : trying to export g_chain without proper HDVF option" ; + + // // Get fstar(cell, dim) with per indices + // RChain fstar_cell(OSM::cgetRow(this->_F_row.at(dim), cell)) ; + // // Add 1 to the cell + // fstar_cell[cell] = 1 ; + // // Keep cells of the chain belonging to _subCC + // // Compute the chain (transpose of F_STAR column) + // CChain fstar_cell_sub(fstar_cell.dimension()) ; + // for (typename RChain::const_iterator it = fstar_cell.begin(); it != fstar_cell.end(); ++it) + // { + // // Keep cells of the chain belonging to _subCC + // if (_subCC.get_Bit(dim, it->first)) + // { + // fstar_cell_sub[it->first] = it->second ; + // } + // } + // return fstar_cell_sub ; + // } + // else + // throw "Error : trying to export g_chain without proper HDVF option" ; } ; @@ -597,9 +595,9 @@ void Dual_HDVF<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() // Compute perfect HDVF over K this->computePerfectHDVF() ; critical_K = this->get_flag(CRITICAL) ; -// this->print_matrices() ; -// this->print_reduction() ; - + // this->print_matrices() ; + // this->print_reduction() ; + std::cout << "==== Compute perfect HDVF over L-K" << endl ; // set _subCC to L-K _subCC = _KCC.complement() ; @@ -608,12 +606,12 @@ void Dual_HDVF<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() // Compute perfect HDVF over L-K this->computePerfectHDVF() ; critical_L_K = this->get_flag(CRITICAL) ; -// this->print_matrices() ; -// this->print_reduction() ; + // this->print_matrices() ; + // this->print_reduction() ; -// std::cout << "==== Pairing matrix" << endl ; -// -// print_bnd_pairing() ; + // std::cout << "==== Pairing matrix" << endl ; + // + // print_bnd_pairing() ; } template @@ -622,7 +620,7 @@ std::vector Dual_HDVF<_CoefficientType,_ComplexType>::computePairingHD // TODO : check both HDVFs are perfect std::cout << "==== Compute pairing" << endl ; - + // Create a full SubChainComplex _subCC = SubChainComplex<_CoefficientType, _ComplexType>(_L) ; screen_DD_col() ; @@ -661,4 +659,6 @@ vector Dual_HDVF::get_flag_dim (FlagType flag, return res ; } +} + #endif /* HDVF_DUALITY_H */ diff --git a/HDVF/include/CGAL/HDVF/hdvf_tools.hpp b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp index 93b90cd1dbdc..7b50752e4c37 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_tools.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp @@ -11,6 +11,7 @@ #include "hdvf.hpp" #include "CGAL/OSM/OSM.hpp" +namespace CGAL { // IO tools @@ -53,7 +54,7 @@ void interaction_loop(HDVF &hdvf, PairCell p(possM.at(ipair)) ; cout << "M(" << p << ")" << endl ; hdvf.M(p.sigma, p.tau, p.dim) ; -// hdvf.print_matrices() ; + // hdvf.print_matrices() ; output_vtk(hdvf, complex) ; } } @@ -77,7 +78,7 @@ void interaction_loop(HDVF &hdvf, PairCell p(possW.at(ipair)) ; cout << "W(" << p << ")" << endl ; hdvf.W(p.sigma, p.tau, p.dim) ; -// hdvf.print_matrices() ; + // hdvf.print_matrices() ; output_vtk(hdvf, complex) ; } } @@ -101,7 +102,7 @@ void interaction_loop(HDVF &hdvf, PairCell p(possMW.at(ipair)) ; cout << "MW(" << p << ")" << endl ; hdvf.MW(p.sigma, p.tau, p.dim) ; -// hdvf.print_matrices() ; + // hdvf.print_matrices() ; output_vtk(hdvf, complex) ; } } @@ -111,4 +112,6 @@ void interaction_loop(HDVF &hdvf, } } +} + #endif // HDVF_TOOLS_HPP diff --git a/HDVF/include/CGAL/HDVF/per_hdvf.hpp b/HDVF/include/CGAL/HDVF/per_hdvf.hpp index 9e18a4035795..ac20bd8cd8dc 100644 --- a/HDVF/include/CGAL/HDVF/per_hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/per_hdvf.hpp @@ -32,6 +32,8 @@ * \date 22/08/2024 */ +namespace CGAL { + template class Filtration { @@ -206,13 +208,13 @@ void Filtration<_CoefType, _ComplexType, _DegType>::star_filtration(const std::v std::vector<_DegType> tmp_deg ; std::vector tmp_perm ; // Init tmp_perm (for vertices) -// cout << "vertices degrees : " << endl ; + // cout << "vertices degrees : " << endl ; for (int i=0; i " << deg.at(i) << endl ; + // cout << i << " -> " << deg.at(i) << endl ; } // For all other cells for (int q=1; q<=_K.dim(); ++q) @@ -225,7 +227,7 @@ void Filtration<_CoefType, _ComplexType, _DegType>::star_filtration(const std::v // Vertices of the cell // TODO : bottom_faces should produce a set std::vector verts(_K.bottom_faces(i,q)) ; -// cout << "cell " << i << " dim " << q << " : " << verts ; + // cout << "cell " << i << " dim " << q << " : " << verts ; // Compute the degree of the cell _DegType d = deg.at(verts.at(0)) ; for (int j=1; j::star_filtration(const std::v } tmp_deg.push_back(d) ; tmp_perm.push_back(tmp_perm.size()) ; -// cout << " -> " << d << endl ; + // cout << " -> " << d << endl ; } } // Sort filtration @@ -267,7 +269,7 @@ void Filtration<_CoefType, _ComplexType, _DegType>::star_filtration(const std::v } // Check filtration -// cout << "check_filtration : " << check_filtration() << endl ; + // cout << "check_filtration : " << check_filtration() << endl ; } template @@ -317,11 +319,11 @@ std::function deg_fun (const ComplexType& complex, std::function deg_fun_f = [&complex, &f](int i) { const std::vector Xi(complex.get_vertex_coords(i)) ; -// cout << "deg_fun_f, i: " << i ; -// cout << " Xi : " ; -// for (double c : Xi) -// cout << c << " " ; -// cout << " - degree: " << f(Xi) << endl ; + // cout << "deg_fun_f, i: " << i ; + // cout << " Xi : " ; + // for (double c : Xi) + // cout << c << " " ; + // cout << " - degree: " << f(Xi) << endl ; return f(Xi) ; } ; return deg_fun_f ; @@ -363,12 +365,12 @@ ostream& operator<< (ostream& out, const PerHoleT<_DegType>& hole) const PerIntervalCells per_int_cells(std::get<1>(hole)) ; const PerDegIntervalT<_DegType> per_int_deg(std::get<2>(hole)) ; -// const _DegType duration((per_int_deg.second>=0)?per_int_deg.second-per_int_deg.first:per_int_deg.second) ; + // const _DegType duration((per_int_deg.second>=0)?per_int_deg.second-per_int_deg.first:per_int_deg.second) ; const _DegType duration(per_int_deg.second-per_int_deg.first) ; if (duration >= 0) // finite interval { - out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; - out << per_int.second << " (" << per_int_cells.second.first << ", " << per_int_cells.second.second << ") / duration: " << duration << "]" << endl ; + out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; + out << per_int.second << " (" << per_int_cells.second.first << ", " << per_int_cells.second.second << ") / duration: " << duration << "]" << endl ; } else { @@ -443,7 +445,7 @@ class PersistentHDVF : public HDVF<_CoefficientType,_ComplexType, OSM::Chain, OS this->progress_bar(i, _f._filtration.size()) ; stepPersist() ; } - + // Compute "infinite" holes vector > criticals(this->get_flag(CRITICAL)) ; for (int q=0; q < criticals.size(); ++q) @@ -691,7 +693,7 @@ class PersistentHDVF : public HDVF<_CoefficientType,_ComplexType, OSM::Chain, OS { const int id(it2->first) ; if (_K_to_per.at(dim+1).at(id) <=_t_dim.at(dim+1)) - fstar_cofaces[id] = 1 ; + fstar_cofaces[id] = 1 ; } } return fstar_cofaces ; @@ -861,7 +863,7 @@ PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::PersistentHDVF(const _ { _masks.at(q) = OSM::Bitboard(this->_K.nb_cells(q)) ; } - + // Init boundary matrices vector _DD_per(this->_K.dim()+1) ; @@ -978,26 +980,26 @@ void PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::stepPersist() else export_perHDVF() ; } - -// if (interval_deg.second-interval_deg.first>0) -// { -// cout << "========> time : " << _t << endl ; -// cout << "pair found : " << p.sigma << ", " << p.tau << " - dim " << p.dim << endl ; -// this->print_reduction() ; -// -// } + + // if (interval_deg.second-interval_deg.first>0) + // { + // cout << "========> time : " << _t << endl ; + // cout << "pair found : " << p.sigma << ", " << p.tau << " - dim " << p.dim << endl ; + // this->print_reduction() ; + // + // } // Prepare for next step this->A(p.sigma, p.tau, p.dim) ; // Update the reduction -// if (interval_deg.second-interval_deg.first>0) -// { -// cout << "====> after A : " << endl ; -// this->print_reduction() ; -// -// } + // if (interval_deg.second-interval_deg.first>0) + // { + // cout << "====> after A : " << endl ; + // this->print_reduction() ; + // + // } } } - +} #endif // PER_HOM_HPP diff --git a/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp b/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp index b60702c7e7ea..463e4617f64c 100644 --- a/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp @@ -14,6 +14,8 @@ #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" +namespace CGAL { + /** * \class SubChainComplex * \brief Implementation of the sub chain complex relation (for duality) - subcomplex and cocomplex @@ -76,8 +78,8 @@ class SubChainComplex { for (int i : cells.at(q)) { - _sub.at(q).setOn(i) ; - ++_nb_cells.at(q) ; + _sub.at(q).setOn(i) ; + ++_nb_cells.at(q) ; } } } @@ -182,13 +184,13 @@ class SubChainComplex return _sub.at(q) ; } -// template -// friend ostream & operator << (ostream & out, const SubChainComplex<_CoefficientType,_ComplexType> & sub) -// { -// for (int q = 0; q <= sub._dim; ++q) -// out << "dim " << q << " : " << sub._sub.at(q) << endl ; -// return out ; -// } + // template + // friend ostream & operator << (ostream & out, const SubChainComplex<_CoefficientType,_ComplexType> & sub) + // { + // for (int q = 0; q <= sub._dim; ++q) + // out << "dim " << q << " : " << sub._sub.at(q) << endl ; + // return out ; + // } friend std::ostream & operator << (std::ostream & out, const SubChainComplex & sub) { @@ -198,4 +200,6 @@ class SubChainComplex } }; +} + #endif /* SUB_CHAIN_COMPLEX_H */ diff --git a/HDVF/include/CGAL/HDVF/tools_io.hpp b/HDVF/include/CGAL/HDVF/tools_io.hpp index d88e3433d129..1c63b374a364 100644 --- a/HDVF/include/CGAL/HDVF/tools_io.hpp +++ b/HDVF/include/CGAL/HDVF/tools_io.hpp @@ -16,6 +16,8 @@ #include #include +namespace CGAL { + using namespace std ; typedef std::vector IONodeType ; @@ -103,7 +105,7 @@ inline double dist(const IONodeType &v1, const IONodeType &v2) tmp = v2.at(i) - v1.at(i) ; x += tmp*tmp ; } - + return sqrt(x) ; } @@ -112,7 +114,7 @@ inline IONodeType max(const IONodeType &v1, const IONodeType &v2) assert(v1.size() == v2.size()) ; IONodeType tmp(v1) ; for (int i=0; i<3; ++i) - tmp[i] = max(tmp.at(i), v2.at(i)) ; + tmp[i] = std::max(tmp.at(i), v2.at(i)) ; return tmp ; } @@ -121,7 +123,7 @@ inline IONodeType min(const IONodeType &v1, const IONodeType &v2) assert(v1.size() == v2.size()) ; IONodeType tmp(v1) ; for (int i=0; i<3; ++i) - tmp[i] = min(tmp.at(i), v2.at(i)) ; + tmp[i] = std::min(tmp.at(i), v2.at(i)) ; return tmp ; } @@ -320,7 +322,7 @@ class Mesh_object return false; } // todo : check for header == "off" - + // 2 - number of vertices, number of faces, number of edges (can be ignored) std::string info; if (!get_next_uncommented_line(infile, info)) { @@ -328,9 +330,9 @@ class Mesh_object } std::istringstream info_stream; info_stream.str(info); - + info_stream >> nvertices >> ncells >> nedges; - + nodes.resize(nvertices) ; for(auto i=0; i < nvertices; ++i) { if (!get_next_uncommented_line(infile,info)) { @@ -341,7 +343,7 @@ class Mesh_object info_stream >> p[0] >> p[1] >> p[2] ; nodes[i] = p ; } - + // 4 - the actual faces cells.resize(ncells); for(auto i=0; i < ncells; ++i) { @@ -360,7 +362,7 @@ class Mesh_object cells[i] = c ; dim = (c.size()-1>dim)?c.size()-1:dim ; } - + infile.close(); return true; } @@ -499,7 +501,7 @@ class Mesh_object double r = 0 ; for (IONodeType v : nodes) { - r = max (r, dist(v,bary)) ; + r = std::max (r, dist(v,bary)) ; } return r ; } @@ -818,7 +820,7 @@ class IcosphereObject : public Mesh_object } rigid_transformation(c, r) ; } - + // Icosahedron inline static const float X=.525731112119133606f; @@ -898,8 +900,8 @@ class IcosphereObject : public Mesh_object // /////////////////// -// Generic CubObject class - for 2D/3D cubical meshes -class CubObject +// Generic Cub_object class - for 2D/3D cubical meshes +class Cub_object { public: int dim = 0 ; // Dimension of the complex @@ -908,10 +910,10 @@ class CubObject std::vector cubs ; bool khalimsky ; - CubObject() : dim(0), ncubs(vector(4)), N(vector(3)), khalimsky(false) {} - CubObject(int d, const std::vector &vcubs, bool khal = false) : dim(d), ncubs(vector(4)), N(vector(3)), cubs(vcubs), khalimsky(khal) + Cub_object() : dim(0), ncubs(vector(4)), N(vector(3)), khalimsky(false) {} + Cub_object(int d, const std::vector &vcubs, bool khal = false) : dim(d), ncubs(vector(4)), N(vector(3)), cubs(vcubs), khalimsky(khal) { check_dimension() ;} - CubObject(const CubObject &m) : dim(m.dim), ncubs(m.ncubs), N(m.N), cubs(m.cubs), khalimsky(m.khalimsky) {} + Cub_object(const Cub_object &m) : dim(m.dim), ncubs(m.ncubs), N(m.N), cubs(m.cubs), khalimsky(m.khalimsky) {} // Mesh operations void clear_cubs() { cubs.clear() ; for (int i=0; i<4; ++i) ncubs[i] = 0 ; } @@ -958,7 +960,7 @@ class CubObject getline(infile,inputLine); if(inputLine.compare("P2") != 0) cerr << "Version error" << endl; else cout << "Version : " << inputLine << endl; - + // Second line: dimensions getline(infile,inputLine); @@ -1080,7 +1082,7 @@ class CubObject void print_infos (int level = 0) const { - cout << "CubObject infos - dim : " << dim << ", cubs : " << cubs.size() << endl ; + cout << "Cub_object infos - dim : " << dim << ", cubs : " << cubs.size() << endl ; for (int q=0; q < dim; ++q) cout << "\tSize along dim " << q << " : " << N[q] << endl ; for (int q = 0; q <= dim; ++q) @@ -1150,5 +1152,7 @@ class CubObject } } ; +} + #endif /* tools_io_hpp */ From fbe280b880989e4238f6338fc865bcfa65441981 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Thu, 1 May 2025 07:50:30 +0200 Subject: [PATCH 009/343] HDVF (split HDVF_core/HDVF) In order to comply with the HDVF concept, splitted HDVF into -> HDVF_core (which will be inherited by all HDVF models) -> HDVF (which inherits HDVF_core and is the end user class for HDVF computing homology) --- HDVF/doc/HDVF/Concepts/HDVF.h | 15 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 2 +- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 2 +- HDVF/include/CGAL/HDVF/hdvf.hpp | 1500 +++----------- HDVF/include/CGAL/HDVF/hdvf_core.hpp | 2013 +++++++++++++++++++ 5 files changed, 2350 insertions(+), 1182 deletions(-) create mode 100644 HDVF/include/CGAL/HDVF/hdvf_core.hpp diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h index cd830952e8e2..df9b0304ddee 100644 --- a/HDVF/doc/HDVF/Concepts/HDVF.h +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -2,16 +2,17 @@ \ingroup PkgHDVFConcepts \cgalConcept -The concept `HDVF` describes the requirements for (topological) chain complexes associated to abstract complexes used in the concept `CGAL::HDVF`. - It provides methods to: +The concept `HDVF` describes the requirements for Homological Discrete Vector Fields, a theory of computational homology unifying discrete Morse theory and effective homology. + An HDVF is a combinatorial tool computing the homology of a chain complex (described by the `AbstractChainComplex` concept). - - get the dimension of the complex, the number of cells in each dimension - - get the boundary and co-boundary of cell(s) - - get the vertices of a given cell - - output the complex in text format + As described in the package description, an HDVF is: + - a partition of the cells of the underlying complex into three classes: primary, secondary and critical (together with partial invertibility conditions for the boundary operator) + - an associated reduction \f$(f,g,h)\f$ from the chain complex onto a chain complex generated by critical cells and a reduced boundary. + An HDVF is perfect when the reduced boundary is null; in this case, the maps \f$f\f$ and \f$g\f$ (and their duals) provide homology and cohomology information (generators, annotation...). - Cells are indexed along each dimension and thus identified by their index together with their dimension. + In order to build a perfect HDVF, a pairing operation called `A` associates (under conditions) two critical cells (becoming PRIMARY and SECONDARY) and updates the reduction in time \f$\mathcal O(n^2)\f$. + The `HDVF` concept \cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index 1acc8b49bb3d..0ddccec89700 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -42,7 +42,7 @@ void Cub_output_vtk (HDVF, _ChainType, { typedef Cubical_chain_complex ComplexType; // Export PSC labelling - vector > labels = hdvf.export_label(PSC) ; + vector > labels = hdvf.export_labelsPSC() ; string outfilePSC(filename+"_PSC.vtk") ; ComplexType::Cubical_chain_complex_to_vtk(complex, outfilePSC, &labels) ; diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index f64fa5fa7288..d1068d2aae26 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -36,7 +36,7 @@ void Simp_output_vtk (HDVF, _ChainT typedef Simplicial_chain_complex ComplexType; // Export PSC labelling string outfile(filename+"_PSC.vtk") ; - vector > labels = hdvf.export_label(PSC) ; + vector > labels = hdvf.export_labelsPSC() ; ComplexType::Simplicial_chain_complex_to_vtk(complex, outfile, &labels) ; if (hdvf.get_hdvf_opts() != OPT_BND) diff --git a/HDVF/include/CGAL/HDVF/hdvf.hpp b/HDVF/include/CGAL/HDVF/hdvf.hpp index 3bfb04bbedc2..ab721a82f2bc 100644 --- a/HDVF/include/CGAL/HDVF/hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf.hpp @@ -15,58 +15,12 @@ #include #include #include +#include "CGAL/HDVF/HDVF_core.hpp" #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" -#include "CGAL/HDVF/sub_chain_complex.hpp" namespace CGAL { -/** \brief Enum for the HDVF label of cells. */ -enum FlagType { - PRIMARY, - SECONDARY, - CRITICAL, - NONE // For duality and persistence -}; - -/** \brief HDVF options (partial computation of the reduction). */ -// Compute only reduced boundary -const int OPT_BND = 0b0001; -// Compute reduced boundary and f -const int OPT_F = 0b0010; -// Compute reduced boundary and g -const int OPT_G = 0b0100; -// Compute full reduction -const int OPT_FULL = 0b1000; - -/** \brief Enum for export: lets chose the type of export. - * - * \tparam PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) - * \tparam FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) - * \tparam G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) - */ -enum ExportType { - PSC, - FSTAR, - G -}; - - -/** \brief PairCell: Structure to represent a pair of cells (for HDVF operations). - * The PairCell follows the following conventions depending on the operation type: - * - A: sigma is of dim q and tau is of dim q+1 ; - * - R: sigma is of dim q and tau is of dim q+1 ; - * - M: sigma is primary and tau is critical of dim q ; - * - W: sigma is secondary and tau is critical of dim q ; - * - MW: sigma is primary and tau is secondary of dim q. - */ -struct PairCell { - int sigma; // Index of the first cell - int tau; // Index of the second cell - int dim; // Dimension of cells: q/q+1 for A and R, q for other operations -}; - - /** * \class HDVF * \brief Implementation of HDVF and associate operations. @@ -83,57 +37,16 @@ struct PairCell { template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> -class HDVF { -public: - /** \brief Typedefs for coefficient type and different chain and matrix types. */ - typedef _ChainType<_CoefficientType, OSM::COLUMN> CChain; - typedef _ChainType<_CoefficientType, OSM::ROW> RChain; - typedef _SparseMatrixType<_CoefficientType, OSM::COLUMN> CMatrix; - typedef _SparseMatrixType<_CoefficientType, OSM::ROW> RMatrix; - -protected: - // Properties - /** \brief Flags for the cells. */ - std::vector> _flag; - /** \brief Number of PRIMARY cells. */ - std::vector _nb_P; - /** \brief Number of SECONDARY cells. */ - std::vector _nb_S; - /** \brief Number of CRITICAL cells. */ - std::vector _nb_C; - /** \brief Row matrices for f. */ - std::vector _F_row; - /** \brief Column matrices for g. */ - std::vector _G_col; - /** \brief Column matrices for h. */ - std::vector _H_col; - /** \brief Column matrices for reduced boundary. */ - std::vector _DD_col; - - /** \brief Reference to the underlying complex. */ - const _ComplexType& _K; - - /** \brief HDVF options for computation (computation of partial reduction). */ - int _hdvf_opt; - +class HDVF : public HDVF_core<_CoefficientType, _ComplexType, _ChainType, _SparseMatrixType> { public: // Constructor - default : full reduction computed, no sub-complex HDVF(const _ComplexType& K, int hdvf_opt = OPT_FULL) ; // Copy constructor - HDVF(const HDVF& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } + HDVF(const HDVF& hdvf) : HDVF_core<_CoefficientType, _ComplexType, _ChainType, _SparseMatrixType>(hdvf) { } // Destructor ~HDVF() { } - // findPair functions - - /** \brief find a valid PairCell for A in dimension q */ - virtual PairCell findPairA(int q, bool &found); // const; - /** \brief find a valid PairCell containing tau for A in dimension q */ - virtual PairCell findPairA(int q, bool &found, int tau); // const; - /** \brief find all the valid PairCell for A in dimension q */ - virtual std::vector findPairsA(int q, bool &found); // const; - /** \brief find all the valid PairCell containing tau for A in dimension q */ - virtual std::vector findPairsA(int q, bool &found, int tau); // const; + // findPair functions for M, W, MW /** \brief find a valid PairCell for M in dimension q */ PairCell findPairM(int q, bool &found); // const; @@ -164,453 +77,21 @@ class HDVF { // HDVF methods /** \brief HDVF operation A(gamma1, gamma2) */ - void A(int gamma1, int gamma2, int dim); void R(int pi, int sigma, int dim); void M(int pi, int gamma, int dim); void W(int sigma, int gamma, int dim); void MW(int pi, int sigma, int dim); - /** \brief Compute a perfect HDVF - From dimension q-1 to dimension 0 - As long as findPairA(q) returns a pair - -> Perform operation A - -> Add the pair to the output vector - */ - std::vector computePerfectHDVF(bool verbose = false); - - /** \brief Compute a perfect HDVF - From dimension q-1 to dimension 0 - As long as findPairsA(q) returns pairs - -> Choose one randomly - -> Perform operation A - -> Add the pair to the output vector - Slower than computePerfectHDVF - */ - std::vector computeRandPerfectHDVF(bool verbose = false); - - // HDVF getters - // Method to get cells if with a given flag (P,S,C) for each dimension - virtual std::vector > get_flag (FlagType flag) const ; - // Method to get cells with a given flag (P,S,C) for a given dimension - virtual std::vector get_flag_dim (FlagType flag, int q) const ; - // Method to get the flag (P,S,C) of a cell tau of dimension q - FlagType get_cell_flag (int q, int tau) const { return _flag.at(q).at(tau); } - - // Method to get options - int get_hdvf_opts () const { return _hdvf_opt ; } - - // Method to print the matrices _F_row, _G_col, _H_col - virtual std::ostream& print_matrices(std::ostream &out = std::cout) const; - - // Method to print the reduction - virtual std::ostream& print_reduction(std::ostream &out = std::cout); // const; - - // Method to print A-pairs - virtual std::ostream& print_pairs(const std::vector& pairs, std::ostream &out = std::cout); - - // Method to project a chain onto P, S, or C cells - template - _ChainType<_CoefficientType, ChainTypeFlag> projection(const _ChainType<_CoefficientType, ChainTypeFlag>& chain, FlagType flag, int dim) const { - // Create a new chain to store the result - // Better to initialize 'result' directly with the correct size and iterate over it - _ChainType<_CoefficientType, ChainTypeFlag> result(chain); - - // Iterate over each element of the chain - std::vector tmp ; - for (typename _ChainType<_CoefficientType, ChainTypeFlag>::const_iterator it = result.cbegin(); it != result.cend(); ++it) - { - int cell_index = it->first; - _CoefficientType value = it->second; - - // Check the flag of the corresponding cell - if (_flag[dim][cell_index] != flag) { - // Set to 0 - tmp.push_back(cell_index) ; - - } - } - result /= tmp ; - return result; - } - - // [OLD] Method to generate labels for visualisation - // Kept for compatibility - // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned - virtual std::vector > export_label (ExportType type, int cell=0, int dim=0) const - { - std::vector > labels(_K.dim()+1) ; - if (type == PSC) - { - for (int q=0; q<=_K.dim(); ++q) - { - for (int i = 0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == PRIMARY) - labels.at(q).push_back(-1) ; - else if (_flag.at(q).at(i) == SECONDARY) - labels.at(q).push_back(1) ; - else - labels.at(q).push_back(0) ; - } - } - } - else - { - if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) - { - for (int q=0; q<=_K.dim(); ++q) - { - labels.at(q).resize(_K.nb_cells(q)) ; - } - - if (dim < _K.dim()) - { - labels.at(dim).at(cell) = 1 ; - const RChain& fstar_cell = OSM::cgetRow(_F_row.at(dim), cell) ; - for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) - { - // Set the cofaces of it->first in dimension dim+1 - RChain cofaces(_K.cod(it->first,dim)) ; - for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells - } - } - else - throw "Error: cannot export f* for a cell of maximal dimension" ; - } - else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G - { - for (int q=0; q<=_K.dim(); ++q) - { - labels.at(q).resize(_K.nb_cells(q)) ; - } - - labels.at(dim).at(cell) = 1 ; - const CChain& g_cell = OSM::cgetColumn(_G_col.at(dim), cell) ; - for (typename CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) - labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells - } - } - return labels ; - } - - // Method to generate PSC labels for visualisation - virtual std::vector > export_labelsPSC () const - { - std::vector > labels(_K.dim()+1) ; - for (int q=0; q<=_K.dim(); ++q) - { - for (int i = 0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == PRIMARY) - labels.at(q).push_back(-1) ; - else if (_flag.at(q).at(i) == SECONDARY) - labels.at(q).push_back(1) ; - else if (_flag.at(q).at(i) == CRITICAL) - labels.at(q).push_back(0) ; - else // NONE - labels.at(q).push_back(2) ; - } - } - return labels ; - } - - // Method to export G chains for visualisation - virtual CChain export_GChain (int cell, int dim) const - { - if ((dim<0) || (dim>_K.dim())) - throw "Error : export_GChain with dim out of range" ; - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - CChain g_cell(OSM::getColumn(_G_col.at(dim), cell)) ; - // Add 1 to the cell - g_cell[cell] = 1 ; - return g_cell ; - } - else - throw "Error : trying to export g_chain without proper HDVF option" ; - } - - // Method to export FSTAR chains for visualisation - virtual CChain export_FSTARChain (int cell, int dim) const - { - if ((dim<0) || (dim>_K.dim())) - throw "Error : export_GChain with dim out of range" ; - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - RChain fstar_cell(OSM::getRow(_F_row.at(dim), cell)) ; - // Add 1 to the cell - fstar_cell[cell] = 1 ; - // Compute the cofaces - if (dim < _K.dim()) - { - CChain fstar_cofaces(_K.nb_cells(dim+1)) ; - for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) - { - // Set the cofaces of it->first in dimension dim+1 - RChain cofaces(_K.cod(it->first,dim)) ; - for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - fstar_cofaces[it2->first] = 1 ; - } - return fstar_cofaces ; - } - else - return CChain(0) ; - } - else - throw "Error : trying to export g_chain without proper HDVF option" ; - } + protected: - void progress_bar(int i, int n) - { - const int step(n/20) ; - if ((i%step)==0) - { - const float percentage(float(i)/(n-1)) ; - const char PBSTR[] = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" ; - const int PBWIDTH(60) ; - int val = (int) (percentage * 100); - int lpad = (int) (percentage * PBWIDTH); - int rpad = PBWIDTH - lpad; - printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); - fflush(stdout); - } - if (i==(n-1)) - std::cout << std::endl ; - } }; // Constructor for the HDVF class -template typename _ChainType, template typename _SparseMatrixType> -HDVF::HDVF(const ComplexType& K, int hdvf_opt) : _K(K) { - // Get the dimension of the simplicial complex - int dim = _K.dim(); - std::cout << "----> Starting HDVF creation / dim " << dim << std::endl ; - // HDVF options - _hdvf_opt = hdvf_opt ; - - // Resize the _DD_col vector to hold dim+1 elements - _DD_col.resize(dim + 1); - - // Resize the _F_row vector to hold dim+1 elements - if (_hdvf_opt & (OPT_FULL | OPT_F)) - _F_row.resize(dim + 1); - - // Resize the _G_col vector to hold dim+1 elements - if (_hdvf_opt & (OPT_FULL | OPT_G)) - _G_col.resize(dim + 1); - - // Resize the _H_col vector to hold dim+1 elements - if (_hdvf_opt & OPT_FULL) - _H_col.resize(dim + 1); - - // Resize flag and count vectors to hold dim+1 elements - _flag.resize(dim + 1); - _nb_P.resize(dim + 1); - _nb_S.resize(dim + 1); - _nb_C.resize(dim + 1); - - // Initialize matrices and counters - - for (int q = 0; q <= dim; q++) { - // Initialize _F_row[q] as a row matrix with dimensions (dim(q) x dim(q)) - if (_hdvf_opt & (OPT_FULL | OPT_F)) - _F_row[q] = RMatrix(_K.nb_cells(q), _K.nb_cells(q)); - - // Initialize _G_col[q] as a column matrix with dimensions (dim(q) x dim(q)) - if (_hdvf_opt & (OPT_FULL | OPT_G)) - _G_col[q] = CMatrix(_K.nb_cells(q), _K.nb_cells(q)); - - // Initialize _H_col[q] as a column matrix with dimensions (dim(q+1) x dim(q)) - if (_hdvf_opt & OPT_FULL) - _H_col[q] = CMatrix(_K.nb_cells(q + 1), _K.nb_cells(q)); - - // Initialize the counters for PRIMARY, SECONDARY, and CRITICAL cells - _nb_P[q] = 0; - _nb_S[q] = 0; - _nb_C[q] = _K.nb_cells(q); - } - - // Initialize the flags for each dimension to CRITICAL - for (int q = 0; q <= dim; q++) { - _flag[q] = std::vector(_K.nb_cells(q), CRITICAL); - } - - // Populate the DD matrices - _DD_col.resize(_K.dim()+1) ; - for (int q=0; q<=_K.dim(); ++q) - _DD_col.at(q) = _K.get_bnd_matrix(q) ; - std::cout << "------> End HDVF creation" << std::endl ; -} - -// Method to print the matrices -template typename _ChainType, template typename _SparseMatrixType> -std::ostream& HDVF::print_matrices(std::ostream& out) const { - // Iterate through each dimension and print the corresponding matrices - for (int q = 0; q <= _K.dim(); ++q) { - out << "------- Dimension " << q << std::endl; - - out << "Matrices _DD_col:" << std::endl; - out << _DD_col[q] << std::endl; - - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - out << "Matrices _F_row:" << std::endl; - out << _F_row[q] << std::endl; - } - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - out << "Matrices _G_col:" << std::endl; - out << _G_col[q] << std::endl; - } - - if (_hdvf_opt & OPT_FULL) - { - out << "Matrices _H_col:" << std::endl; - out << _H_col[q] << std::endl; - } - } - return out ; -} - - -// Methods to find a pair of cells for A in dimension q -// -> = +- 1 with cell1, cell2 critical -// First version: returns a pair of dimensions q / q+1 -// Second version: returns all the pairs containing sigma +template typename ChainType, template typename SparseMatrixType> +HDVF::HDVF(const ComplexType& K, int hdvf_opt) : HDVF_core(K, hdvf_opt) { } -/** \brief find a valid PairCell for A in dimension q */ -//template -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairA(int q, bool &found) // const -{ - found = false; - PairCell p; - - // Iterate through columns of _DD_col[q+1] - for (OSM::Bitboard::iterator it_col = _DD_col[q+1].begin(); (it_col != _DD_col[q+1].end() && !found); ++it_col) - { - const CChain& col(OSM::cgetColumn(_DD_col[q+1], *it_col)) ; - - // Iterate through the entries of the column - for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { - if ((it->second == 1) || (it->second == -1)) { - // If an entry with coefficient 1 or -1 is found, set the pair and mark as found - p.sigma = it->first; - p.tau = *it_col; - p.dim = q; - found = true; - } - } - } - return p; -} - -/** \brief find a valid PairCell containing tau for A in dimension q */ -//template -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairA(int q, bool &found, int tau) // const -{ - found = false; - PairCell p ; - - // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible - const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; - for (typename CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - p.sigma = it->first ; - p.tau = tau ; - p.dim = q-1 ; - } - } - - // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible - RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; - for (typename RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - p.sigma = tau ; - p.tau = it->first ; - p.dim = q ; - } - } - return p; -} - -/** \brief find all the valid PairCell for A in dimension q */ -//template -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsA(int q, bool &found) // const -{ - std::vector pairs; - found = false ; - - // Iterate through columns of _DD_col[q+1] - for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) - { - const CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; - - // Iterate through the entries of the column - for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { - if ((it->second == 1) || (it->second == -1)) { - // If an entry with coefficient 1 or -1 is found, set the pair and mark as found - PairCell p; - p.sigma = it->first; - p.tau = *it_col; - p.dim = q; - pairs.push_back(p) ; - found = true; - } - } - } - return pairs; -} -/** \brief find all the valid PairCell containing tau for A in dimension q */ -//template -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsA(int q, bool &found, int tau) // const -{ - found = false; - std::vector pairs; - - // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible - RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; - for (typename RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - PairCell p ; - p.sigma = tau ; - p.tau = it->first ; - p.dim = q ; - pairs.push_back(p) ; - } - } - // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible - const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; - for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - PairCell p ; - p.sigma = it->first ; - p.tau = tau ; - p.dim = q-1 ; - pairs.push_back(p) ; - } - } - return pairs; -} // Methods to find a pair of cells for M in dimension q // -> = +- 1 with cell1 primary, cell2 critical @@ -622,18 +103,19 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> PairCell HDVF::findPairM(int q, bool &found) // const { + typedef HDVF_core HDVF_coreT; found = false; PairCell p; - if (_hdvf_opt & OPT_F) + if (this->_hdvf_opt & OPT_F) { // Search for +-1 in _F - iterate over rows - for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); (it_row != _F_row[q].end() && !found); ++it_row) + for (OSM::Bitboard::iterator it_row = this->_F_row[q].begin(); (it_row != this->_F_row[q].end() && !found); ++it_row) { - const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); + const typename HDVF_coreT::RChain &row(OSM::cgetRow(this->_F_row[q],*it_row)); // Iterate through the entries of the row - for (typename RChain::const_iterator it = row.begin(); (it != row.end() && !found); ++it) { + for (typename HDVF_coreT::RChain::const_iterator it = row.begin(); (it != row.end() && !found); ++it) { if ((it->second == 1) || (it->second == -1)) { // If an entry with coefficient 1 or -1 is found, set the pair and mark as found p.sigma = it->first; // primary cell @@ -652,19 +134,20 @@ PairCell HDVF::find template typename _ChainType, template typename _SparseMatrixType> PairCell HDVF::findPairM(int q, bool &found, int tau) // const { + typedef HDVF_core HDVF_coreT ; found = false; PairCell p; - if (_flag.at(q).at(tau) == SECONDARY) + if (this->_flag.at(q).at(tau) == SECONDARY) return p ; // Empty / found false - if (_hdvf_opt & OPT_F) + if (this->_hdvf_opt & OPT_F) { // If tau is primary, search for gamma such that =+-1 - if (_flag.at(q).at(tau) == PRIMARY) + if (this->_flag.at(q).at(tau) == PRIMARY) { - for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); (it_row != _F_row.at(q).end() && !found); ++it_row) + for (OSM::Bitboard::iterator it_row = this->_F_row.at(q).begin(); (it_row != this->_F_row.at(q).end() && !found); ++it_row) { - if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) + if (abs(this->_F_row.at(q).get_coef(*it_row,tau)) == 1) { p.sigma = tau ; // primary cell p.tau = *it_row ; // critical cell @@ -674,10 +157,10 @@ PairCell HDVF::find } } // If tau is critical, search for pi such that =+-1 - if (_flag.at(q).at(tau) == CRITICAL) + if (this->_flag.at(q).at(tau) == CRITICAL) { - const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; - for (typename RChain::const_iterator it = row.cbegin(); (it != row.cend() && !found); ++it) + const typename HDVF_coreT::RChain& row(OSM::getRow(this->_F_row.at(q), tau)) ; + for (typename HDVF_coreT::RChain::const_iterator it = row.cbegin(); (it != row.cend() && !found); ++it) { if (abs(it->second) == 1) { @@ -697,17 +180,18 @@ PairCell HDVF::find template typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::findPairsM(int q, bool &found) // const { + typedef HDVF_core HDVF_coreT; found = false; std::vector pairs; - if (_hdvf_opt & OPT_F) + if (this->_hdvf_opt & OPT_F) { // Search for +-1 in _F - iterate over rows - for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); it_row != _F_row[q].end() ; ++it_row) + for (OSM::Bitboard::iterator it_row = this->_F_row[q].begin(); it_row != this->_F_row[q].end() ; ++it_row) { - const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); + const typename HDVF_coreT::RChain &row(OSM::cgetRow(this->_F_row[q],*it_row)); // Iterate through the entries of the row - for (typename RChain::const_iterator it = row.begin(); it != row.end(); ++it) { + for (typename HDVF_coreT::RChain::const_iterator it = row.begin(); it != row.end(); ++it) { if ((it->second == 1) || (it->second == -1)) { // If an entry with coefficient 1 or -1 is found, set the pair and add it PairCell p ; @@ -728,19 +212,20 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::findPairsM(int q, bool &found, int tau) // const { + typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; - if (_flag.at(q).at(tau) == SECONDARY) + if (this->_flag.at(q).at(tau) == SECONDARY) return pairs ; // Empty / found false - if (_hdvf_opt & OPT_F) + if (this->_hdvf_opt & OPT_F) { // If tau is primary, search for gamma such that =+-1 - if (_flag.at(q).at(tau) == PRIMARY) + if (this->_flag.at(q).at(tau) == PRIMARY) { - for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); it_row != _F_row.at(q).end(); ++it_row) + for (OSM::Bitboard::iterator it_row = this->_F_row.at(q).begin(); it_row != this->_F_row.at(q).end(); ++it_row) { - if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) + if (abs(this->_F_row.at(q).get_coef(*it_row,tau)) == 1) { PairCell p ; p.sigma = tau ; // primary cell @@ -751,10 +236,10 @@ std::vector HDVF=+-1 - if (_flag.at(q).at(tau) == CRITICAL) + if (this->_flag.at(q).at(tau) == CRITICAL) { - const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; - for (typename RChain::const_iterator it = row.cbegin(); it != row.cend(); ++it) + const typename HDVF_coreT::RChain& row(OSM::getRow(this->_F_row.at(q), tau)) ; + for (typename HDVF_coreT::RChain::const_iterator it = row.cbegin(); it != row.cend(); ++it) { if (abs(it->second) == 1) { @@ -781,18 +266,19 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> PairCell HDVF::findPairW(int q, bool &found) // const { + typedef HDVF_core HDVF_coreT ; found = false; PairCell p; - if (_hdvf_opt & OPT_G) + if (this->_hdvf_opt & OPT_G) { // Search for +-1 in _G - iterate over cols - for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); (it_col != _F_row[q].end() && !found); ++it_col) + for (OSM::Bitboard::iterator it_col = this->_G_col[q].begin(); (it_col != this->_F_row[q].end() && !found); ++it_col) { - CChain &col = _G_col[q][*it_col]; + typename HDVF_coreT::CChain &col(this->_G_col[q][*it_col]); // Iterate through the entries of the col - for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { + for (typename HDVF_coreT::CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { if ((it->second == 1) || (it->second == -1)) { // If an entry with coefficient 1 or -1 is found, set the pair and mark as found p.sigma = it->first; // secondary cell @@ -811,19 +297,20 @@ PairCell HDVF::find template typename _ChainType, template typename _SparseMatrixType> PairCell HDVF::findPairW(int q, bool &found, int tau) // const { + typedef HDVF_core HDVF_coreT ; found = false; PairCell p; - if (_flag.at(q).at(tau) == PRIMARY) + if (this->_flag.at(q).at(tau) == PRIMARY) return p ; // Empty / found false - if (_hdvf_opt & OPT_G) + if (this->_hdvf_opt & OPT_G) { // If tau is primary, search for gamma such that =+-1 - if (_flag.at(q).at(tau) == SECONDARY) + if (this->_flag.at(q).at(tau) == SECONDARY) { - for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); (it_col != _G_col.at(q).end() && !found); ++it_col) + for (OSM::Bitboard::iterator it_col = this->_G_col.at(q).begin(); (it_col != this->_G_col.at(q).end() && !found); ++it_col) { - if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) + if (abs(this->_G_col.at(q).get_coef(tau, *it_col)) == 1) { p.sigma = tau ; // secondary cell p.tau = *it_col ; // critical cell @@ -833,10 +320,10 @@ PairCell HDVF::find } } // If tau is critical, search for sigma such that =+-1 - if (_flag.at(q).at(tau) == CRITICAL) + if (this->_flag.at(q).at(tau) == CRITICAL) { - CChain col(OSM::getColumn(_G_col.at(q), tau)) ; - for (typename CChain::const_iterator it = col.cbegin(); (it != col.cend() && !found); ++it) + typename HDVF_coreT::CChain col(OSM::getColumn(this->_G_col.at(q), tau)) ; + for (typename HDVF_coreT::CChain::const_iterator it = col.cbegin(); (it != col.cend() && !found); ++it) { if (abs(it->second) == 1) { @@ -856,18 +343,19 @@ PairCell HDVF::find template typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::findPairsW(int q, bool &found) // const { + typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // Search for +-1 in _G - iterate over cols - for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); it_col != _F_row[q].end(); ++it_col) + for (OSM::Bitboard::iterator it_col = this->_G_col[q].begin(); it_col != this->_F_row[q].end(); ++it_col) { - CChain &col = _G_col[q][*it_col]; + typename HDVF_coreT::CChain &col = this->_G_col[q][*it_col]; // Iterate through the entries of the col - for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { + for (typename HDVF_coreT::CChain::const_iterator it = col.begin(); it != col.end(); ++it) { if ((it->second == 1) || (it->second == -1)) { // If an entry with coefficient 1 or -1 is found, set the pair and mark as found PairCell p ; @@ -888,19 +376,20 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::findPairsW(int q, bool &found, int tau) // const { + typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; - if (_flag.at(q).at(tau) == PRIMARY) + if (this->_flag.at(q).at(tau) == PRIMARY) return pairs ; // Empty / found false - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // If tau is primary, search for gamma such that =+-1 - if (_flag.at(q).at(tau) == SECONDARY) + if (this->_flag.at(q).at(tau) == SECONDARY) { - for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); it_col != _G_col.at(q).end(); ++it_col) + for (OSM::Bitboard::iterator it_col = this->_G_col.at(q).begin(); it_col != this->_G_col.at(q).end(); ++it_col) { - if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) + if (abs(this->_G_col.at(q).get_coef(tau, *it_col)) == 1) { PairCell p ; p.sigma = tau ; // secondary cell @@ -911,10 +400,10 @@ std::vector HDVF=+-1 - if (_flag.at(q).at(tau) == CRITICAL) + if (this->_flag.at(q).at(tau) == CRITICAL) { - CChain col(OSM::getColumn(_G_col.at(q), tau)) ; - for (typename CChain::const_iterator it = col.cbegin(); it != col.cend(); ++it) + typename HDVF_coreT::CChain col(OSM::getColumn(this->_G_col.at(q), tau)) ; + for (typename HDVF_coreT::CChain::const_iterator it = col.cbegin(); it != col.cend(); ++it) { if (abs(it->second) == 1) { @@ -941,26 +430,27 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> PairCell HDVF::findPairMW(int q, bool &found) // const { + typedef HDVF_core HDVF_coreT ; found = false; PairCell p; - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero // iterate on H_q and H_q-1 accordingly - for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) + for (OSM::Bitboard::iterator it_pi = this->_H_col[q].begin(); (it_pi != this->_H_col[q].end() && !found); ++it_pi) { const int pi = *it_pi ; - CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; - CChain d_pi = _K.d(pi, q) ; - CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; - for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; + typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; + for (int sigma = 0; (sigma < this->_H_col.at(q-1).dimensions().first && !found); ++sigma) { - RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { - RChain cod_sigma = _K.cod(sigma, q) ; - RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; + typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; // Compute xi and xi' to test the validity of MW @@ -985,35 +475,36 @@ PairCell HDVF::find template typename _ChainType, template typename _SparseMatrixType> PairCell HDVF::findPairMW(int q, bool &found, int tau) // const { + typedef HDVF_core HDVF_coreT ; found = false; PairCell p; - if (_flag.at(q).at(tau) == CRITICAL) + if (this->_flag.at(q).at(tau) == CRITICAL) return p ; // Empty / found false - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // If tau is primary (rename pi), search for a valid sigma - if (_flag.at(q).at(tau) == PRIMARY) + if (this->_flag.at(q).at(tau) == PRIMARY) { const int pi(tau) ; // Col pi of H_q and proj_P(d(pi)) must at least be non empty - CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; - CChain d_pi = _K.d(pi, q) ; - CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; + typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; if (H11.isNull() || projP_d_pi.isNull()) return p ; // Search for sigma with col_sigma(H_q-1) non empty - for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) + for (int sigma = 0; (sigma < this->_H_col.at(q-1).dimensions().first && !found); ++sigma) { - RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { // and proj_S(cod(sigma)) non empty - RChain cod_sigma = _K.cod(sigma, q) ; - RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; + typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; if (!projS_cod_sigma.isNull()) { // test xi and xip @@ -1035,20 +526,20 @@ PairCell HDVF::find // cout << "secondary" << endl ; const int sigma(tau) ; // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty - RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; - RChain cod_sigma = _K.cod(sigma, q) ; - RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; + typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; if (H11q1.isNull() || projS_cod_sigma.isNull()) return p ; // Search for pi with col pi of H_q non empty - for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) + for (OSM::Bitboard::iterator it_pi = this->_H_col[q].begin(); (it_pi != this->_H_col[q].end() && !found); ++it_pi) { const int pi(*it_pi) ; - CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; - CChain d_pi = _K.d(pi, q) ; - CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; + typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; // proj_P of d(pi) must also be non empty if (!projP_d_pi.isNull()) { @@ -1074,26 +565,27 @@ PairCell HDVF::find template typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::findPairsMW(int q, bool &found) // const { + typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero // iterate on H_q and H_q-1 accordingly - for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) + for (OSM::Bitboard::iterator it_pi = this->_H_col[q].begin(); it_pi != this->_H_col[q].end(); ++it_pi) { const int pi = *it_pi ; - CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; - CChain d_pi = _K.d(pi, q) ; - CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; - for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; + typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; + for (int sigma = 0; sigma < this->_H_col.at(q-1).dimensions().first; ++sigma) { - RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { - RChain cod_sigma = _K.cod(sigma, q) ; - RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; + typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; // Compute xi and xi' to test the validity of MW @@ -1121,34 +613,35 @@ std::vector HDVF typename _ChainType, template typename _SparseMatrixType> std::vector HDVF::findPairsMW(int q, bool &found, int tau) // const { + typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; - if (_flag.at(q).at(tau) == CRITICAL) + if (this->_flag.at(q).at(tau) == CRITICAL) return pairs ; // Empty / found false - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // If tau is primary (rename pi), search for a valid sigma - if (_flag.at(q).at(tau) == PRIMARY) + if (this->_flag.at(q).at(tau) == PRIMARY) { const int pi(tau) ; // Col pi of H_q and proj_P(d(pi)) must at least be non empty - CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; - CChain d_pi = _K.d(pi, q) ; - CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; + typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; if (H11.isNull() || projP_d_pi.isNull()) return pairs ; // Search for sigma with col_sigma(H_q-1) non empty - for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) + for (int sigma = 0; sigma < this->_H_col.at(q-1).dimensions().first; ++sigma) { - RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { // and proj_S(cod(sigma)) non empty - RChain cod_sigma = _K.cod(sigma, q) ; - RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; + typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; + typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; if (!projS_cod_sigma.isNull()) { // test xi and xip @@ -1172,20 +665,20 @@ std::vector HDVF_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; + typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; if (H11q1.isNull() || projS_cod_sigma.isNull()) return pairs ; // Search for pi with col pi of H_q non empty - for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) + for (OSM::Bitboard::iterator it_pi = this->_H_col[q].begin(); it_pi != this->_H_col[q].end(); ++it_pi) { const int pi(*it_pi) ; - CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; - CChain d_pi = _K.d(pi, q) ; - CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; + typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; // proj_P of d(pi) must also be non empty if (!projP_d_pi.isNull()) { @@ -1210,152 +703,22 @@ std::vector HDVF -template typename _ChainType, template typename _SparseMatrixType> -void HDVF::A(int tau1, int tau2, int q) { - //----------------------------------------------- Submatrices of D ---------------------------------------------------- - - // Output operation details to the console - // cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; - - // Extract submatrices from _DD_col - RChain D12(OSM::getRow(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 - CChain D21(OSM::getColumn(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 - CoefficientType D11(D12[tau2]); // D11 is the coefficient at the intersection of tau2 in D12 - - // Assert that D11 is either 1 or -1 (check invertibility) - assert((D11 == 1) || (D11 == -1)); // !!!!! Test invertibility - - // Compute the inverse of D11 (which is itself, since D11 is 1 or -1) - CoefficientType D11_inv = D11; - - // Perform operations to remove the row and column contributions - D12 /= std::vector({tau2}); // Remove tau2 column from D12 - D21 /= std::vector({tau1}); // Remove tau1 row from D21 - - // Delete rows and columns from _DD_col - _DD_col[q + 1].delRow(tau1); // Remove row tau1 from _DD_col[q+1] - _DD_col[q + 1].delColumn(tau2); // Remove column tau2 from _DD_col[q+1] - - //---------------------------------------------- Submatrices of F ----------------------------------------------------- - - RChain F11 ; - CChain G11 ; - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - // Extract the relevant submatrix from _F_row - F11 = OSM::getRow(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 - - // Delete the row tau1 from _F_row - _F_row[q].delRow(tau1); - } - - //--------------------------------------------- Submatrices of G ------------------------------------------------------ - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - // Extract the relevant submatrix from _G_col - G11 = OSM::getColumn(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 - - // Delete the column tau2 from _G_col - _G_col[q + 1].delColumn(tau2); - } - - //--------------------------------------------- Update matrices ------------------------------------------------------- - - // ---- Update _F_row - - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - // Update _F_row[q] - // Subtract the product of (D21 * D11_inv) and F11 from _F_row[q] - // Note: % operator returns a row matrix, so be careful with operations - _F_row[q] -= (D21 * D11_inv) % F11; - - // Set the column tau1 of _F_row[q] to (D21 * (-D11_inv)) - OSM::setColumn(_F_row[q], tau1, D21 * (-D11_inv)); - - // Remove the row tau2 from _F_row[q+1] - _F_row[q + 1].delRow(tau2); - } - - // ---- Update _G_col - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - // Update _G_col[q + 1] - // Subtract the product of (G11 * D11_inv) and D12 from _G_col[q+1] - _G_col[q + 1] -= (G11 * D11_inv) * D12; - - // Set the row tau2 of _G_col[q + 1] to (D12 * (-D11_inv)) - OSM::setRow(_G_col[q + 1], tau2, D12 * (-D11_inv)); - - // Remove the column tau1 from _G_col[q] - _G_col[q].delColumn(tau1); - } - - // ---- Update _H_col - - if (_hdvf_opt & OPT_FULL) - { - // Update _H_col[q] - // Compute the temporary matrix product G11 * F11 - CMatrix tmp = G11 * F11; - - // Add the product of tmp and D11_inv to _H_col[q] - _H_col[q] += (tmp) * D11_inv; - - // Set the row tau2 of _H_col[q] to (F11 * D11_inv) - OSM::setRow(_H_col[q], tau2, F11 * D11_inv); - - // Set the column tau1 of _H_col[q] to (G11 * D11_inv) - OSM::setColumn(_H_col[q], tau1, G11 * D11_inv); - - // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv - _H_col[q].set_coef(tau2, tau1, D11_inv); - } - - // ---- Update _DD_col - - // Update _DD_col - _DD_col[q + 1] -= (D21 * D12) * D11_inv; - - // Remove columns and rows from _DD_col as necessary - if (q > 0) { - _DD_col[q].delColumn(tau1); // Remove column tau1 from _DD_col[q] - } - if (q + 2 <= _K.dim()) { - _DD_col[q + 2].delRow(tau2); // Remove row tau2 from _DD_col[q+2] - } - - // Update flags - _flag[q][tau1] = PRIMARY; // Set the flag of tau1 in dimension q to PRIMARY - --_nb_C.at(q) ; - ++_nb_P.at(q) ; - _flag[q + 1][tau2] = SECONDARY; // Set the flag of tau2 in dimension q+1 to SECONDARY - --_nb_C.at(q+1) ; - ++_nb_S.at(q+1) ; - - // ----------------------------------------------------------------------------------------------------------------------- -} - // Method to perform operation R // pi is in dimension q, sigma is in dimension q+1 //template template typename _ChainType, template typename _SparseMatrixType> void HDVF::R(int pi, int sigma, int q) { + typedef HDVF_core HDVF_coreT ; //----------------------------------------------- Submatrices of H ---------------------------------------------------- - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // Output operation details to the console std::cout << "R of " << pi << "(dim " << q << ") / " << sigma << "(dim " << q + 1 << ")" << std::endl; - // Extract the relevant row and column chains from _H_col - RChain H12 = OSM::getRow(_H_col[q], sigma); // H12 is the row chain from _H_col[q] at index sigma - CChain H21 = OSM::getColumn(_H_col[q], pi); // H21 is the column chain from _H_col[q] at index pi + // Extract the relevant row and column chains from this->_H_col + typename HDVF_coreT::RChain H12 = OSM::getRow(this->_H_col[q], sigma); // H12 is the row chain from this->_H_col[q] at index sigma + typename HDVF_coreT::CChain H21 = OSM::getColumn(this->_H_col[q], pi); // H21 is the column chain from this->_H_col[q] at index pi // Get the coefficient at the intersection of H12 and H21 CoefficientType H11(H12[pi]); // H11 is the coefficient at row sigma and column pi @@ -1368,93 +731,93 @@ void HDVF::R(int pi H12 /= std::vector({pi}); // Remove column pi from H12 H21 /= std::vector({sigma}); // Remove row sigma from H21 - // Remove the corresponding row and column from _H_col - _H_col[q].delRow(sigma); // Remove row sigma from _H_col[q] - _H_col[q].delColumn(pi); // Remove column pi from _H_col[q] + // Remove the corresponding row and column from this->_H_col + this->_H_col[q].delRow(sigma); // Remove row sigma from this->_H_col[q] + this->_H_col[q].delColumn(pi); // Remove column pi from this->_H_col[q] //---------------------------------------------- Submatrices of F ----------------------------------------------------- - // Extract the relevant column chain from _F_row - CChain F11 = OSM::getColumn(_F_row[q], pi); // F11 is the column chain from _F_row[q] at index pi + // Extract the relevant column chain from this->_F_row + typename HDVF_coreT::CChain F11 = OSM::getColumn(this->_F_row[q], pi); // F11 is the column chain from this->_F_row[q] at index pi - // Remove the column pi from _F_row - _F_row[q].delColumn(pi); + // Remove the column pi from this->_F_row + this->_F_row[q].delColumn(pi); //--------------------------------------------- Submatrices of G ------------------------------------------------------ - // Extract the relevant row chain from _G_col - RChain G11 = OSM::getRow(_G_col[q + 1], sigma); // G11 is the row chain from _G_col[q+1] at index sigma + // Extract the relevant row chain from this->_G_col + typename HDVF_coreT::RChain G11 = OSM::getRow(this->_G_col[q + 1], sigma); // G11 is the row chain from this->_G_col[q+1] at index sigma - // Remove the row sigma from _G_col - _G_col[q + 1].delRow(sigma); + // Remove the row sigma from this->_G_col + this->_G_col[q + 1].delRow(sigma); //--------------------------------------------- Update matrices ------------------------------------------------------- - // Update _F_row[q] - // Subtract the product of (H12 * F11) and H11 from _F_row[q] + // Update this->_F_row[q] + // Subtract the product of (H12 * F11) and H11 from this->_F_row[q] // Note: % operator returns a row matrix, so be careful with operations - _F_row[q] -= (F11 % H12) * H11_inv; + this->_F_row[q] -= (F11 % H12) * H11_inv; - // Set the row pi of _F_row[q] to (H12 * (-H11_inv)) - OSM::setRow(_F_row[q], pi, H12 * (-H11_inv)); + // Set the row pi of this->_F_row[q] to (H12 * (-H11_inv)) + OSM::setRow(this->_F_row[q], pi, H12 * (-H11_inv)); - // Update _G_col[q + 1] - // Subtract the product of (H21 * G11) and H11_inv from _G_col[q + 1] - _G_col[q + 1] -= (H21 * G11) * H11_inv; + // Update this->_G_col[q + 1] + // Subtract the product of (H21 * G11) and H11_inv from this->_G_col[q + 1] + this->_G_col[q + 1] -= (H21 * G11) * H11_inv; - // Set the column sigma of _G_col[q + 1] to (H21 * (-H11_inv)) - OSM::setColumn(_G_col[q + 1], sigma, H21 * (-H11_inv)); + // Set the column sigma of this->_G_col[q + 1] to (H21 * (-H11_inv)) + OSM::setColumn(this->_G_col[q + 1], sigma, H21 * (-H11_inv)); - // Update _DD_col + // Update this->_DD_col // Compute the temporary matrix product F11 * G11 - _DD_col[q + 1] += (F11 * G11) * H11_inv; + this->_DD_col[q + 1] += (F11 * G11) * H11_inv; - // Set the row pi in _DD_col[q + 1] to (G11 * H11_inv) - OSM::setRow(_DD_col[q + 1], pi, G11 * H11_inv); + // Set the row pi in this->_DD_col[q + 1] to (G11 * H11_inv) + OSM::setRow(this->_DD_col[q + 1], pi, G11 * H11_inv); - // Set the column sigma in _DD_col[q + 1] to (F11 * H11_inv) - OSM::setColumn(_DD_col[q + 1], sigma, F11 * H11_inv); + // Set the column sigma in this->_DD_col[q + 1] to (F11 * H11_inv) + OSM::setColumn(this->_DD_col[q + 1], sigma, F11 * H11_inv); - // Set the coefficient at (pi, sigma) in _DD_col to H11_inv - _DD_col[q + 1].set_coef(pi, sigma, H11_inv); + // Set the coefficient at (pi, sigma) in this->_DD_col to H11_inv + this->_DD_col[q + 1].set_coef(pi, sigma, H11_inv); - // Update _H_col[q] - // Subtract the product of (H21 * H12) and H11_inv from _H_col[q] - _H_col[q] -= (H21 * H12) * H11_inv; + // Update this->_H_col[q] + // Subtract the product of (H21 * H12) and H11_inv from this->_H_col[q] + this->_H_col[q] -= (H21 * H12) * H11_inv; // Perform additional updates // Extract boundary and coboundary chains - CChain bnd_pi(_K.d(pi, q)); // Boundary of pi in dimension q - RChain cobnd_sigma(_K.cod(sigma, q + 1)); // Coboundary of sigma in dimension q+1 + typename HDVF_coreT::CChain bnd_pi(this->_K.d(pi, q)); // Boundary of pi in dimension q + typename HDVF_coreT::RChain cobnd_sigma(this->_K.cod(sigma, q + 1)); // Coboundary of sigma in dimension q+1 // Project the boundary and coboundary chains onto PRIMARY and SECONDARY flags - CChain proj_P_pi(projection(bnd_pi, PRIMARY, q)); - RChain proj_S_sigma(projection(cobnd_sigma, SECONDARY, q + 1)); + typename HDVF_coreT::CChain proj_P_pi(this->projection(bnd_pi, PRIMARY, q)); + typename HDVF_coreT::RChain proj_S_sigma(this->projection(cobnd_sigma, SECONDARY, q + 1)); if (q > 0) { - // Update _DD_col[q] with projections and _F_row[q-1] - CChain c1(_F_row[q - 1] * proj_P_pi + projection(bnd_pi, CRITICAL, q)); - OSM::setColumn(_DD_col[q], pi, c1); - OSM::setColumn(_G_col[q], pi, _H_col[q - 1] * proj_P_pi); + // Update this->_DD_col[q] with projections and this->_F_row[q-1] + typename HDVF_coreT::CChain c1(this->_F_row[q - 1] * proj_P_pi + this->projection(bnd_pi, CRITICAL, q)); + OSM::setColumn(this->_DD_col[q], pi, c1); + OSM::setColumn(this->_G_col[q], pi, this->_H_col[q - 1] * proj_P_pi); } - // Update _F_row[q+1] with projection and _H_col[q+1] - OSM::setRow(_F_row[q + 1], sigma, proj_S_sigma * _H_col[q + 1]); + // Update this->_F_row[q+1] with this->projection and this->_H_col[q+1] + OSM::setRow(this->_F_row[q + 1], sigma, proj_S_sigma * this->_H_col[q + 1]); - if (q + 2 <= _K.dim()) { - // Update _DD_col[q+2] with projections - RChain c4(projection(cobnd_sigma, CRITICAL, q + 1) + proj_S_sigma * _G_col[q + 2]); - OSM::setRow(_DD_col[q + 2], sigma, c4); + if (q + 2 <= this->_K.dim()) { + // Update this->_DD_col[q+2] with projections + typename HDVF_coreT::RChain c4(this->projection(cobnd_sigma, CRITICAL, q + 1) + proj_S_sigma * this->_G_col[q + 2]); + OSM::setRow(this->_DD_col[q + 2], sigma, c4); } // Update flags - _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to CRITICAL - ++_nb_C.at(q) ; - --_nb_P.at(q) ; - _flag[q + 1][sigma] = CRITICAL; // Set the flag of sigma in dimension q+1 to CRITICAL - ++_nb_C.at(q+1) ; - --_nb_S.at(q+1) ; + this->_flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to CRITICAL + ++this->_nb_C.at(q) ; + --this->_nb_P.at(q) ; + this->_flag[q + 1][sigma] = CRITICAL; // Set the flag of sigma in dimension q+1 to CRITICAL + ++this->_nb_C.at(q+1) ; + --this->_nb_S.at(q+1) ; } else std::cout << "!!! R impossible with partial reduction options" << std::endl; @@ -1465,19 +828,20 @@ void HDVF::R(int pi //template template typename _ChainType, template typename _SparseMatrixType> void HDVF::M(int pi, int gamma, int q) { + typedef HDVF_core HDVF_coreT ; //----------------------------------------------- Submatrices of F ---------------------------------------------------- - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // Output the operation details to the console std::cout << "M_" << q << "(" << pi << "," << gamma << ")" << std::endl; - if (q == _K.dim()) + if (q == this->_K.dim()) throw("M operation in max dimension !!!") ; - // Extract row and column chains from _F_row - RChain F12(OSM::getRow(_F_row[q], gamma)); // F12 is the row chain from _F_row[q] at index gamma - CChain F21(OSM::getColumn(_F_row[q], pi)); // F21 is the column chain from _F_row[q] at index pi + // Extract row and column chains from this->_F_row + typename HDVF_coreT::RChain F12(OSM::getRow(this->_F_row[q], gamma)); // F12 is the row chain from this->_F_row[q] at index gamma + typename HDVF_coreT::CChain F21(OSM::getColumn(this->_F_row[q], pi)); // F21 is the column chain from this->_F_row[q] at index pi // Get the coefficient at the intersection of F12 and F21 CoefficientType F11(F12[pi]); // F11 is the coefficient at row gamma and column pi @@ -1490,95 +854,95 @@ void HDVF::M(int pi F12 /= std::vector({pi}); // Remove column pi from F12 F21 /= std::vector({gamma}); // Remove row gamma from F21 - // Remove the corresponding row and column from _F_row - _F_row[q].delRow(gamma); // Remove row gamma from _F_row[q] - _F_row[q].delColumn(pi); // Remove column pi from _F_row[q] + // Remove the corresponding row and column from this->_F_row + this->_F_row[q].delRow(gamma); // Remove row gamma from this->_F_row[q] + this->_F_row[q].delColumn(pi); // Remove column pi from this->_F_row[q] //--------------------------------------------- Submatrices of G ------------------------------------------------------ - // Extract the relevant column chain from _G_col - // G11_q is the column chain from _G_col[q] at index gamma - // CChain G11_q(OSM::getColumn(_G_col[q], gamma)); - _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] + // Extract the relevant column chain from this->_G_col + // G11_q is the column chain from this->_G_col[q] at index gamma + // HDVF_coreT::CChain G11_q(OSM::getColumn(this->_G_col[q], gamma)); + this->_G_col[q].delColumn(gamma); // Remove column gamma from this->_G_col[q] //---------------------------------------------- Submatrices of H ----------------------------------------------------- - // Extract the relevant column chain from _H_col - CChain H11(OSM::getColumn(_H_col[q], pi)); // H11 is the column chain from _H_col[q] at index pi + // Extract the relevant column chain from this->_H_col + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col[q], pi)); // H11 is the column chain from this->_H_col[q] at index pi - // Remove the column pi from _H_col - _H_col[q].delColumn(pi); + // Remove the column pi from this->_H_col + this->_H_col[q].delColumn(pi); //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ // For DD_q+1 and DD_q: - // Extract the relevant row chains from _DD_col + // Extract the relevant row chains from this->_DD_col - // DD_q+1 (corresponds to the row matrix of _DD_col) - RChain D11(OSM::getRow(_DD_col[q+1], gamma)); // D11 is the row chain from _DD_col[q+1] at index gamma - _DD_col[q + 1].delRow(gamma); // Remove row gamma from _DD_col[q + 1] + // DD_q+1 (corresponds to the row matrix of this->_DD_col) + typename HDVF_coreT::RChain D11(OSM::getRow(this->_DD_col[q+1], gamma)); // D11 is the row chain from this->_DD_col[q+1] at index gamma + this->_DD_col[q + 1].delRow(gamma); // Remove row gamma from this->_DD_col[q + 1] //--------------------------------------------- Submatrices of DD ------------------------------------------------------ - // DD_q (corresponds to the column matrix of _DD_col) - // CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); - // D11_q is the column chain from _DD_col[q] at index gamma + // DD_q (corresponds to the column matrix of this->_DD_col) + // HDVF_coreT::CChain D11_q(OSM::getColumn(this->_DD_col[q], gamma)); + // D11_q is the column chain from this->_DD_col[q] at index gamma if (q > 0) - _DD_col[q].delColumn(gamma); // Remove column gamma from _DD_col[q] + this->_DD_col[q].delColumn(gamma); // Remove column gamma from this->_DD_col[q] //--------------------------------------------- Update matrices ------------------------------------------------------- - // Update _H_col - // Subtract the product of (H11 * F11_inv) and F12 from _H_col[q] + // Update this->_H_col + // Subtract the product of (H11 * F11_inv) and F12 from this->_H_col[q] // Note: * operator is used for matrix column results - _H_col[q] -= (H11 * F11_inv) * F12; + this->_H_col[q] -= (H11 * F11_inv) * F12; - // Set the column gamma of _H_col[q] to (-1 * H11) * F11_inv - OSM::setColumn(_H_col[q], gamma, (-1 * H11) * (F11_inv)); + // Set the column gamma of this->_H_col[q] to (-1 * H11) * F11_inv + OSM::setColumn(this->_H_col[q], gamma, (-1 * H11) * (F11_inv)); - // Update _F_row - // Add the product of (F21 * F11_inv) and F12 to _F_row[q] - _F_row[q] -= (F21 * F11_inv) * F12; + // Update this->_F_row + // Add the product of (F21 * F11_inv) and F12 to this->_F_row[q] + this->_F_row[q] -= (F21 * F11_inv) * F12; - // Set the row pi of _F_row[q] to F11_inv * F12 - OSM::setRow(_F_row[q], pi, F11_inv * F12); + // Set the row pi of this->_F_row[q] to F11_inv * F12 + OSM::setRow(this->_F_row[q], pi, F11_inv * F12); - // Set the column gamma of _F_row[q] to F21 * (-F11_inv) - OSM::setColumn(_F_row[q], gamma, F21 * (-F11_inv)); + // Set the column gamma of this->_F_row[q] to F21 * (-F11_inv) + OSM::setColumn(this->_F_row[q], gamma, F21 * (-F11_inv)); - // Set the coefficient at (pi, gamma) in _F_row[q] to F11_inv - _F_row[q].set_coef(pi, gamma, F11_inv); + // Set the coefficient at (pi, gamma) in this->_F_row[q] to F11_inv + this->_F_row[q].set_coef(pi, gamma, F11_inv); - // Update _G_col - // Add the product of (H11 * F11_inv) and D11 to _G_col[q+1] - _G_col[q + 1] += (H11 * F11_inv) * D11; + // Update this->_G_col + // Add the product of (H11 * F11_inv) and D11 to this->_G_col[q+1] + this->_G_col[q + 1] += (H11 * F11_inv) * D11; - // Update _DD_col[q + 1] - _DD_col[q + 1] -= (F21 * F11_inv) * D11; // Subtract the product from _DD_col[q + 1] - OSM::setRow(_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in _DD_col[q + 1] + // Update this->_DD_col[q + 1] + this->_DD_col[q + 1] -= (F21 * F11_inv) * D11; // Subtract the product from this->_DD_col[q + 1] + OSM::setRow(this->_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in this->_DD_col[q + 1] - // Update _G_col (for dimension q) and _DD_col (for dimension q) + // Update this->_G_col (for dimension q) and this->_DD_col (for dimension q) if (q>0) { // Extract boundary chain and project it - CChain c = _K.d(pi, q); // Boundary of pi in dimension q - CChain projection_p(projection(c, PRIMARY, q-1)); // Project boundary chain to PRIMARY - CChain projection_c = projection(c, CRITICAL, q-1); // Project boundary chain to CRITICAL + typename HDVF_coreT::CChain c = this->_K.d(pi, q); // Boundary of pi in dimension q + typename HDVF_coreT::CChain projection_p(this->projection(c, PRIMARY, q-1)); // Project boundary chain to PRIMARY + typename HDVF_coreT::CChain projection_c = this->projection(c, CRITICAL, q-1); // Project boundary chain to CRITICAL - // Set the column pi of _G_col[q] to (-1 * _H_col[q-1]) * projection_p - OSM::setColumn(_G_col[q], pi, (CoefficientType(-1) * _H_col[q - 1]) * projection_p); + // Set the column pi of this->_G_col[q] to (-1 * this->_H_col[q-1]) * projection_p + OSM::setColumn(this->_G_col[q], pi, (CoefficientType(-1) * this->_H_col[q - 1]) * projection_p); - // Update _DD_col + // Update this->_DD_col // Extract projections and perform updates - CChain tmp(_F_row[q - 1] * projection_p + projection_c); // Compute the product of _F_row[q - 1] and projection_p - // Set the column pi of _DD_col[q] to cc - OSM::setColumn(_DD_col[q], pi, tmp); + typename HDVF_coreT::CChain tmp(this->_F_row[q - 1] * projection_p + projection_c); // Compute the product of this->_F_row[q - 1] and projection_p + // Set the column pi of this->_DD_col[q] to cc + OSM::setColumn(this->_DD_col[q], pi, tmp); } - // else: if the dimension is 0, no change for _G_col[q] and _DD_col[q] + // else: if the dimension is 0, no change for this->_G_col[q] and this->_DD_col[q] // Update flags - _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to PRIMARY - _flag[q][gamma] = PRIMARY; // Set the flag of gamma in dimension q to CRITICAL + this->_flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to PRIMARY + this->_flag[q][gamma] = PRIMARY; // Set the flag of gamma in dimension q to CRITICAL } else std::cout << "!!! M impossible with partial reduction options" << std::endl; @@ -1589,10 +953,10 @@ void HDVF::M(int pi template typename _ChainType, template typename _SparseMatrixType> void HDVF::W(int sigma, int gamma, int q) { - + typedef HDVF_core HDVF_coreT ; //----------------------------------------------- Submatrices of G ---------------------------------------------------- - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // Output the operation details to the console std::cout << "W_" << q << "(" << sigma << "," << gamma << ")" << std::endl; @@ -1600,9 +964,9 @@ void HDVF::W(int si if (q == 0) throw("W operation in dimension 0 !!!") ; - // Extract row and column chains from _G_col - RChain G12(OSM::getRow(_G_col[q], sigma)); // G12 is the row chain from _G_col[q] at index sigma - CChain G21(OSM::getColumn(_G_col[q], gamma)); // G21 is the column chain from _G_col[q] at index gamma + // Extract row and column chains from this->_G_col + typename HDVF_coreT::RChain G12(OSM::getRow(this->_G_col[q], sigma)); // G12 is the row chain from this->_G_col[q] at index sigma + typename HDVF_coreT::CChain G21(OSM::getColumn(this->_G_col[q], gamma)); // G21 is the column chain from this->_G_col[q] at index gamma // Get the coefficient at the intersection of G12 and G21 CoefficientType G11(G12[gamma]); // G11 is the coefficient at row sigma and column gamma @@ -1615,95 +979,95 @@ void HDVF::W(int si G12 /= std::vector({gamma}); // Remove column gamma from G12 G21 /= std::vector({sigma}); // Remove row sigma from G21 - // Remove the corresponding row and column from _G_col - _G_col[q].delRow(sigma); // Remove row sigma from _G_col[q] - _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] + // Remove the corresponding row and column from this->_G_col + this->_G_col[q].delRow(sigma); // Remove row sigma from this->_G_col[q] + this->_G_col[q].delColumn(gamma); // Remove column gamma from this->_G_col[q] //---------------------------------------------- Submatrices of F ----------------------------------------------------- - // Extract the row chain from _F_row - // RChain F11(OSM::getRow(_F_row[q], gamma)); // F11 is the row chain from _F_row[q] at index gamma + // Extract the row chain from this->_F_row + // RChain F11(OSM::getRow(this->_F_row[q], gamma)); // F11 is the row chain from this->_F_row[q] at index gamma - // Remove the row gamma from _F_row - _F_row[q].delRow(gamma); + // Remove the row gamma from this->_F_row + this->_F_row[q].delRow(gamma); //--------------------------------------------- Submatrices of H ------------------------------------------------------ - // Extract the row chain from _H_col - RChain H11(OSM::getRow(_H_col[q-1], sigma)); // H11 is the row chain from _H_col[q] at index sigma + // Extract the row chain from this->_H_col + typename HDVF_coreT::RChain H11(OSM::getRow(this->_H_col[q-1], sigma)); // H11 is the row chain from this->_H_col[q] at index sigma - // Remove the row sigma from _H_col - _H_col[q-1].delRow(sigma); + // Remove the row sigma from this->_H_col + this->_H_col[q-1].delRow(sigma); //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ - // Extract the row chain from _DD_col[q+1] - // RChain D11_q_plus1(OSM::getRow(_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from _DD_col[q + 1] at index gamma + // Extract the row chain from this->_DD_col[q+1] + // RChain D11_q_plus1(OSM::getRow(this->_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from this->_DD_col[q + 1] at index gamma - // Remove the row gamma from _DD_col - if (q < _K.dim()) - _DD_col[q + 1].delRow(gamma); + // Remove the row gamma from this->_DD_col + if (q < this->_K.dim()) + this->_DD_col[q + 1].delRow(gamma); //--------------------------------------------- Submatrices of DD_q ------------------------------------------------------ - // Extract the column chain from _DD_col[q] - CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); // D11_q is the column chain from _DD_col[q] at index gamma + // Extract the column chain from this->_DD_col[q] + typename HDVF_coreT::CChain D11_q(OSM::getColumn(this->_DD_col[q], gamma)); // D11_q is the column chain from this->_DD_col[q] at index gamma - // Remove the column gamma from _DD_col - _DD_col[q].delColumn(gamma); + // Remove the column gamma from this->_DD_col + this->_DD_col[q].delColumn(gamma); //--------------------------------------------- Update matrices ------------------------------------------------------- - // Update _H_col - // Subtract the product of (G21 * G11_inv) and H11 from _H_col[q] + // Update this->_H_col + // Subtract the product of (G21 * G11_inv) and H11 from this->_H_col[q] // Note: % operator is used for matrix row results - _H_col[q-1] -= (G21 * G11_inv) * H11; + this->_H_col[q-1] -= (G21 * G11_inv) * H11; - // Set the row gamma of _H_col[q] to (-1 * H11) * G11_inv - OSM::setRow(_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); + // Set the row gamma of this->_H_col[q] to (-1 * H11) * G11_inv + OSM::setRow(this->_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); - // Update _G_col - // Subtract the product of G11_inv and (G21 * G12) from _G_col[q] - _G_col[q] -= (G21 * G11_inv) * G12; + // Update this->_G_col + // Subtract the product of G11_inv and (G21 * G12) from this->_G_col[q] + this->_G_col[q] -= (G21 * G11_inv) * G12; - // Set the row gamma of _G_col[q] to G11_inv * G12 - OSM::setRow(_G_col[q], gamma, -G11_inv * G12); + // Set the row gamma of this->_G_col[q] to G11_inv * G12 + OSM::setRow(this->_G_col[q], gamma, -G11_inv * G12); - // Set the column sigma of _G_col[q] to G11_inv * G21 - OSM::setColumn(_G_col[q], sigma, G21 * G11_inv); + // Set the column sigma of this->_G_col[q] to G11_inv * G21 + OSM::setColumn(this->_G_col[q], sigma, G21 * G11_inv); - // Set the coefficient at (gamma, sigma) in _G_col[q] to G11_inv - _G_col[q].set_coef(gamma, sigma, G11_inv); + // Set the coefficient at (gamma, sigma) in this->_G_col[q] to G11_inv + this->_G_col[q].set_coef(gamma, sigma, G11_inv); - // Update _F_row (for dimension q-1) - // Add the product of (D11_q * G11_inv) and H11 to _F_row[q - 1] - _F_row[q - 1] += (D11_q * G11_inv) * H11; + // Update this->_F_row (for dimension q-1) + // Add the product of (D11_q * G11_inv) and H11 to this->_F_row[q - 1] + this->_F_row[q - 1] += (D11_q * G11_inv) * H11; - // Update _DD_col (for dimension q) - _DD_col[q] -= (D11_q * G11_inv) * G12;// Subtract the product of (D11_q * G11_inv) and G12 - OSM::setColumn(_DD_col[q], sigma, D11_q * G11_inv) ; + // Update this->_DD_col (for dimension q) + this->_DD_col[q] -= (D11_q * G11_inv) * G12;// Subtract the product of (D11_q * G11_inv) and G12 + OSM::setColumn(this->_DD_col[q], sigma, D11_q * G11_inv) ; - // Update _F_row (for dimension q) and _DD_col (for dimension q+1) - if (q < _K.dim()) + // Update this->_F_row (for dimension q) and this->_DD_col (for dimension q+1) + if (q < this->_K.dim()) { // Extract boundary chain and project it - RChain c = _K.cod(sigma, q); // Boundary of sigma in dimension q - RChain projection_s(projection(c, SECONDARY, q+1)); // Project boundary chain to SECONDARY - RChain projection_c(projection(c, CRITICAL, q+1)); // Project boundary chain to SECONDARY + typename HDVF_coreT::RChain c = this->_K.cod(sigma, q); // Boundary of sigma in dimension q + typename HDVF_coreT::RChain projection_s(this->projection(c, SECONDARY, q+1)); // Project boundary chain to SECONDARY + typename HDVF_coreT::RChain projection_c(this->projection(c, CRITICAL, q+1)); // Project boundary chain to SECONDARY - // Set the row sigma of _F_row[q] to (-1 * projection_s * _H_col[q]) - OSM::setRow(_F_row[q], sigma, (-1 * projection_s) * _H_col[q]); + // Set the row sigma of this->_F_row[q] to (-1 * projection_s * this->_H_col[q]) + OSM::setRow(this->_F_row[q], sigma, (-1 * projection_s) * this->_H_col[q]); - // Set the row sigma of _DD_col[q + 1] to projection_s * _G_col[q + 1] + projection_c + // Set the row sigma of this->_DD_col[q + 1] to projection_s * this->_G_col[q + 1] + projection_c - RChain tmp(projection_s * _G_col[q + 1] + projection_c) ; - OSM::setRow(_DD_col[q + 1], sigma, tmp); + typename HDVF_coreT::RChain tmp(projection_s * this->_G_col[q + 1] + projection_c) ; + OSM::setRow(this->_DD_col[q + 1], sigma, tmp); } - // else : if the dimension is maximal, no update of _DD_col[q+1] and _F_row[q] + // else : if the dimension is maximal, no update of this->_DD_col[q+1] and this->_F_row[q] // Update flags - _flag[q][gamma] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY - _flag[q][sigma] = CRITICAL; // Set the flag of sigma in dimension q to CRITICAL + this->_flag[q][gamma] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY + this->_flag[q][sigma] = CRITICAL; // Set the flag of sigma in dimension q to CRITICAL } else std::cout << "!!! W impossible with partial reduction options" << std::endl; @@ -1714,44 +1078,44 @@ void HDVF::W(int si template typename _ChainType, template typename _SparseMatrixType> void HDVF::MW(int pi, int sigma, int q) { - + typedef HDVF_core HDVF_coreT ; //----------------------------------------------- Submatrices of G ---------------------------------------------------- - if (_hdvf_opt & OPT_FULL) + if (this->_hdvf_opt & OPT_FULL) { // Output the operation details to the console std::cout << "MW_" << q << "(" << pi << "," << sigma << ")" << std::endl; if (q <= 0) throw("MW operation in dimension 0 !!!") ; - if (q >= _K.dim()) + if (q >= this->_K.dim()) throw("MW operation in maximal dimension !!!") ; // In order to compute xi and xi', extract sub-matrices of H_q, H_q-1 and compute d(pi) and cod(sigma) // H_q extractions - CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; // H21 -> delete H11 - _H_col.at(q) /= std::vector({pi}) ; + this->_H_col.at(q) /= std::vector({pi}) ; // H_q-1 extractions - RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; // H21_q-1 -> delete H11q1 - _H_col.at(q-1).delRow(sigma) ; + this->_H_col.at(q-1).delRow(sigma) ; // d(pi) - CChain d_pi = _K.d(pi, q) ; - CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; - CChain projC_d_pi = projection(d_pi, CRITICAL, q-1) ; + typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; + typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; + typename HDVF_coreT::CChain projC_d_pi = this->projection(d_pi, CRITICAL, q-1) ; // cod(sigma) - RChain cod_sigma = _K.cod(sigma, q) ; - RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; - RChain projC_cod_sigma = projection(cod_sigma, CRITICAL, q+1) ; + typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; + typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; + typename HDVF_coreT::RChain projC_cod_sigma = this->projection(cod_sigma, CRITICAL, q+1) ; // Compute xi and xi' to test the validity of MW @@ -1765,280 +1129,70 @@ void HDVF::MW(int p // F_q extraction - CChain F11(OSM::getColumn(_F_row.at(q), pi)) ; + typename HDVF_coreT::CChain F11(OSM::getColumn(this->_F_row.at(q), pi)) ; // F12 -> delete col F11 - _F_row.at(q).delColumn(pi) ; + this->_F_row.at(q).delColumn(pi) ; // G_q extractions - RChain G11(OSM::getRow(_G_col.at(q), sigma)) ; + typename HDVF_coreT::RChain G11(OSM::getRow(this->_G_col.at(q), sigma)) ; // G21 -> dele row G11 - _G_col.at(q).delRow(sigma) ; + this->_G_col.at(q).delRow(sigma) ; // ----------- Update of the reduction // H_q - RChain tmp1 = projS_cod_sigma * _H_col.at(q) ; + typename HDVF_coreT::RChain tmp1 = projS_cod_sigma * this->_H_col.at(q) ; - _H_col.at(q) -= (H11 * xi) * tmp1 ; - OSM::setColumn(_H_col.at(q), sigma, H11 * xi) ; + this->_H_col.at(q) -= (H11 * xi) * tmp1 ; + OSM::setColumn(this->_H_col.at(q), sigma, H11 * xi) ; // F_q - _F_row.at(q) += (F11 * xi) * tmp1 ; - OSM::setColumn(_F_row.at(q), sigma, F11 * (-xi)) ; + this->_F_row.at(q) += (F11 * xi) * tmp1 ; + OSM::setColumn(this->_F_row.at(q), sigma, F11 * (-xi)) ; // G_q+1 // note: G_q+1 is not be modified if the HDVF is perfect - RChain tmp2(projS_cod_sigma * _G_col.at(q+1)) ; + typename HDVF_coreT::RChain tmp2(projS_cod_sigma * this->_G_col.at(q+1)) ; tmp2 += projC_cod_sigma ; - _G_col.at(q+1) -= (H11 * xi) * tmp2 ; + this->_G_col.at(q+1) -= (H11 * xi) * tmp2 ; // DD_col_q+1 / DD_row_q - _DD_col.at(q+1) -= (F11 * xi) * tmp2 ; + this->_DD_col.at(q+1) -= (F11 * xi) * tmp2 ; // H_q-1 - CChain tmp3(_H_col.at(q-1) * projP_d_pi) ; + typename HDVF_coreT::CChain tmp3(this->_H_col.at(q-1) * projP_d_pi) ; - _H_col.at(q-1) -= (tmp3 * xip) * H11q1 ; - OSM::setRow(_H_col.at(q-1), pi, xip * H11q1) ; + this->_H_col.at(q-1) -= (tmp3 * xip) * H11q1 ; + OSM::setRow(this->_H_col.at(q-1), pi, xip * H11q1) ; // G_q - _G_col.at(q) -= (tmp3 * xip) * G11 ; - OSM::setRow(_G_col.at(q), pi, xip * G11) ; + this->_G_col.at(q) -= (tmp3 * xip) * G11 ; + OSM::setRow(this->_G_col.at(q), pi, xip * G11) ; // F_q-1 // note: F_q-1 is not be modified if the HDVF is perfect - CChain tmp4(_F_row.at(q-1) * projP_d_pi) ; + typename HDVF_coreT::CChain tmp4(this->_F_row.at(q-1) * projP_d_pi) ; tmp4 += projC_d_pi ; - _F_row.at(q-1) -= (tmp4 * xip) * H11q1 ; + this->_F_row.at(q-1) -= (tmp4 * xip) * H11q1 ; // DD_col_q - _DD_col.at(q) += (tmp4 * xip) * G11 ; + this->_DD_col.at(q) += (tmp4 * xip) * G11 ; // Update flags - _flag[q][pi] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY - _flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to CRITICAL + this->_flag[q][pi] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY + this->_flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to CRITICAL } else std::cout << "!!! MW impossible with partial reduction options" << std::endl; } - -// Method to compute a perfect HDVF (Higher Dimensional Vector Field) -// Returns a vector of PairCell objects representing the pairs found - -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::computePerfectHDVF(bool verbose) { - std::vector pair_list; // Vector to store the list of pairs - bool trouve = false; // Flag to indicate whether a pair was found - int dim = _K.dim(); // Get the dimension of the complex K - - // Loop through dimensions from q-1 to 0 - for (int q = dim - 1; q >= 0; --q) { - std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; - // cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; - // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) - - // Find a pair of cells in dimension q - PairCell pair = findPairA(q, trouve); - - // While a pair is found - while (trouve) { - progress_bar(_K.nb_cells(q)-_nb_C.at(q), _K.nb_cells(q)) ; - // Add the found pair to the list - pair_list.push_back(pair); - - // Perform operation A with the found pair - A(pair.sigma, pair.tau, q); - if (verbose) - { - std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; - print_matrices(std::cout) ; - } - - // Find another pair of cells in dimension q - pair = findPairA(q, trouve); - } - } - - // Return the list of pairs found - return pair_list; -} - -// Method to compute a random perfect HDVF (Higher Dimensional Vector Field) -// Returns a vector of PairCell objects representing the pairs found - -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::computeRandPerfectHDVF(bool verbose) { - std::vector pair_list; // Vector to store the list of pairs - bool trouve = false; // Flag to indicate whether a pair was found - int dim = _K.dim(); // Get the dimension of the complex K - - // Init random generator - std::random_device dev; - std::mt19937 rng(dev()); // Random - - // Loop through dimensions from q-1 to 0 - for (int q = dim - 1; q >= 0; --q) { - std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; - // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) - - std::vector pairs = findPairsA(q, trouve); - - PairCell pair ; - - // While a pair is found - while (trouve) - { - // Add one of the pairs (randomly) to the list - { - // Pickup a random cell sigma - std::uniform_int_distribution rand_dist(0,pairs.size()-1); - int i(rand_dist(rng)) ; - pair = pairs.at(i) ; - } - pair_list.push_back(pair); - - // Perform operation A with the chosen pair - A(pair.sigma, pair.tau, pair.dim); - if (verbose) - { - std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; - print_matrices(std::cout) ; - } - - // Compute possible pairings - pairs = findPairsA(q, trouve); - } - } - // Return the list of pairs found - return pair_list; -} - -// Method to get cells if with a given flag (P,S,C) for each dimension -//template -template typename _ChainType, template typename _SparseMatrixType> -std::vector > HDVF::get_flag (FlagType flag) const -{ - std::vector > res(_K.dim()+1) ; - for (int q=0; q<=_K.dim(); ++q) - { - for (int i=0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == flag) - res.at(q).push_back(i) ; - } - } - return res ; -} - -// Method to get cells with a given flag (P,S,C) for a given dimension -//template -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::get_flag_dim (FlagType flag, int q) const -{ - std::vector res ; - for (int i=0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == flag) - res.push_back(i) ; - } - return res ; -} - -// Method to print the current state of the reduction -//template -template typename _ChainType, template typename _SparseMatrixType> -std::ostream& HDVF::print_reduction(std::ostream& out) // const -{ - // Print PSC - out << "----- flags of cells:" << std::endl; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < _K.nb_cells(q); ++i) - { - const int flag(_flag.at(q).at(i)) ; - if (flag == PRIMARY) - out << i << " -> P" << std::endl ; - else if (flag == SECONDARY) - out << i << " -> S" << std::endl ; - else - out << i << " -> C" << std::endl ; - } - out << std::endl; - } - - // Print critical cells - out << "----- critical cells:" << std::endl; - std::vector > critical(get_flag(CRITICAL)) ; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < critical.at(q).size(); ++i) - { - out << critical.at(q).at(i) << " "; - } - out << std::endl; - } - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - // Print matrices g - out << "----- g:" << std::endl; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < critical.at(q).size(); ++i) - { - const int id(critical.at(q).at(i)) ; - out << "g(" << id << ") = (" << id << ")"; - // Iterate over the ith column of _G_col - CChain col(OSM::getColumn(_G_col.at(q), id)) ; // TODO cget - for (typename CChain::const_iterator it_col = col.cbegin(); it_col != col.cend(); ++it_col) { - out << " + " << it_col->second << ".(" << it_col->first << ") + "; - } - out << std::endl; - } - } - } - - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - // Print matrices f* - out << "----- f*:" << std::endl; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < critical.at(q).size(); ++i) - { - const int id(critical.at(q).at(i)) ; - out << "f*(" << id << ") = (" << id << ")"; - // Iterate over the ith row of _F_row - RChain row(OSM::getRow(_F_row.at(q), id)) ; // TODO cget - for (typename RChain::const_iterator it_row = row.cbegin(); it_row != row.cend(); ++it_row) { - out << " + " << it_row->second << ".(" << it_row->first << ") + "; - } - out << std::endl; - } - } - } - return out ; -} - -// Method to print A-pairs -//template -template typename _ChainType, template typename _SparseMatrixType> -std::ostream& HDVF::print_pairs(const std::vector& pairs, std::ostream& out) // const -{ - for (const auto& pair : pairs) { - out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; - } - return out ; -} - } #endif // HDVF_H diff --git a/HDVF/include/CGAL/HDVF/hdvf_core.hpp b/HDVF/include/CGAL/HDVF/hdvf_core.hpp new file mode 100644 index 000000000000..04a1b00d8f7d --- /dev/null +++ b/HDVF/include/CGAL/HDVF/hdvf_core.hpp @@ -0,0 +1,2013 @@ +/** + * \file hdvf.hpp + * \brief HDVF_core code library. + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + * + * HDVF_core code library (constructors, operations, finders). + */ + +#ifndef HDVF_CORE_H +#define HDVF_CORE_H + +#include +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/HDVF/sub_chain_complex.hpp" + +namespace CGAL { + +/** \brief Enum for the HDVF_core label of cells. */ +enum FlagType { + PRIMARY, + SECONDARY, + CRITICAL, + NONE // For duality and persistence +}; + +/** \brief HDVF_core options (partial computation of the reduction). */ +// Compute only reduced boundary +const int OPT_BND = 0b0001; +// Compute reduced boundary and f +const int OPT_F = 0b0010; +// Compute reduced boundary and g +const int OPT_G = 0b0100; +// Compute full reduction +const int OPT_FULL = 0b1000; + +/** \brief Enum for export: lets chose the type of export. + * + * \tparam PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) + * \tparam FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) + * \tparam G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) + */ +enum ExportType { + PSC, + FSTAR, + G +}; + + +/** \brief PairCell: Structure to represent a pair of cells (for HDVF_core operations). + * The PairCell follows the following conventions depending on the operation type: + * - A: sigma is of dim q and tau is of dim q+1 ; + * - R: sigma is of dim q and tau is of dim q+1 ; + * - M: sigma is primary and tau is critical of dim q ; + * - W: sigma is secondary and tau is critical of dim q ; + * - MW: sigma is primary and tau is secondary of dim q. + */ +struct PairCell { + int sigma; // Index of the first cell + int tau; // Index of the second cell + int dim; // Dimension of cells: q/q+1 for A and R, q for other operations +}; + + +/** + * \class HDVF_core + * \brief Implementation of HDVF_core and associate operations. + * + * The HDVF_core class contains all functions to build HDVF_core, create perfect HDVF_core (A and associate finders) and delineated generators through HDVF_core operations (R, M, W, MW and associate finders). + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ComplexType The type of complex (default is SimpComplex) + * + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + */ + + +template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> +class HDVF_core { +public: + /** \brief Typedefs for coefficient type and different chain and matrix types. */ + typedef _ChainType<_CoefficientType, OSM::COLUMN> CChain; + typedef _ChainType<_CoefficientType, OSM::ROW> RChain; + typedef _SparseMatrixType<_CoefficientType, OSM::COLUMN> CMatrix; + typedef _SparseMatrixType<_CoefficientType, OSM::ROW> RMatrix; + +protected: + // Properties + /** \brief Flags for the cells. */ + std::vector> _flag; + /** \brief Number of PRIMARY cells. */ + std::vector _nb_P; + /** \brief Number of SECONDARY cells. */ + std::vector _nb_S; + /** \brief Number of CRITICAL cells. */ + std::vector _nb_C; + /** \brief Row matrices for f. */ + std::vector _F_row; + /** \brief Column matrices for g. */ + std::vector _G_col; + /** \brief Column matrices for h. */ + std::vector _H_col; + /** \brief Column matrices for reduced boundary. */ + std::vector _DD_col; + + /** \brief Reference to the underlying complex. */ + const _ComplexType& _K; + + /** \brief HDVF_core options for computation (computation of partial reduction). */ + int _hdvf_opt; + +public: + // Constructor - default : full reduction computed, no sub-complex + HDVF_core(const _ComplexType& K, int hdvf_opt = OPT_FULL) ; + // Copy constructor + HDVF_core(const HDVF_core& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } + // Destructor + ~HDVF_core() { } + + // findPair functions + + /** \brief find a valid PairCell for A in dimension q */ + virtual PairCell findPairA(int q, bool &found); // const; + /** \brief find a valid PairCell containing tau for A in dimension q */ + virtual PairCell findPairA(int q, bool &found, int tau); // const; + /** \brief find all the valid PairCell for A in dimension q */ + virtual std::vector findPairsA(int q, bool &found); // const; + /** \brief find all the valid PairCell containing tau for A in dimension q */ + virtual std::vector findPairsA(int q, bool &found, int tau); // const; + + // HDVF_core methods + /** \brief HDVF_core operation A(gamma1, gamma2) */ + void A(int gamma1, int gamma2, int dim); + + /** \brief Compute a perfect HDVF_core + From dimension q-1 to dimension 0 + As long as findPairA(q) returns a pair + -> Perform operation A + -> Add the pair to the output vector + */ + std::vector computePerfectHDVF(bool verbose = false); + + /** \brief Compute a perfect HDVF_core + From dimension q-1 to dimension 0 + As long as findPairsA(q) returns pairs + -> Choose one randomly + -> Perform operation A + -> Add the pair to the output vector + Slower than computePerfectHDVF + */ + std::vector computeRandPerfectHDVF(bool verbose = false); + + // HDVF_core getters + // Method to get cells if with a given flag (P,S,C) for each dimension + virtual std::vector > get_flag (FlagType flag) const ; + // Method to get cells with a given flag (P,S,C) for a given dimension + virtual std::vector get_flag_dim (FlagType flag, int q) const ; + // Method to get the flag (P,S,C) of a cell tau of dimension q + FlagType get_cell_flag (int q, int tau) const { return _flag.at(q).at(tau); } + + // Method to get options + int get_hdvf_opts () const { return _hdvf_opt ; } + + // Method to print the matrices _F_row, _G_col, _H_col + virtual std::ostream& print_matrices(std::ostream &out = std::cout) const; + + // Method to print the reduction + virtual std::ostream& print_reduction(std::ostream &out = std::cout); // const; + + // Method to print A-pairs + virtual std::ostream& print_pairs(const std::vector& pairs, std::ostream &out = std::cout); + + // Method to project a chain onto P, S, or C cells + template + _ChainType<_CoefficientType, ChainTypeFlag> projection(const _ChainType<_CoefficientType, ChainTypeFlag>& chain, FlagType flag, int dim) const { + // Create a new chain to store the result + // Better to initialize 'result' directly with the correct size and iterate over it + _ChainType<_CoefficientType, ChainTypeFlag> result(chain); + + // Iterate over each element of the chain + std::vector tmp ; + for (typename _ChainType<_CoefficientType, ChainTypeFlag>::const_iterator it = result.cbegin(); it != result.cend(); ++it) + { + int cell_index = it->first; + _CoefficientType value = it->second; + + // Check the flag of the corresponding cell + if (_flag[dim][cell_index] != flag) { + // Set to 0 + tmp.push_back(cell_index) ; + + } + } + result /= tmp ; + return result; + } + +// // [OLD] Method to generate labels for visualisation +// // Kept for compatibility +// // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned +// virtual std::vector > export_label (ExportType type, int cell=0, int dim=0) const +// { +// std::vector > labels(_K.dim()+1) ; +// if (type == PSC) +// { +// for (int q=0; q<=_K.dim(); ++q) +// { +// for (int i = 0; i<_K.nb_cells(q); ++i) +// { +// if (_flag.at(q).at(i) == PRIMARY) +// labels.at(q).push_back(-1) ; +// else if (_flag.at(q).at(i) == SECONDARY) +// labels.at(q).push_back(1) ; +// else +// labels.at(q).push_back(0) ; +// } +// } +// } +// else +// { +// if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) +// { +// for (int q=0; q<=_K.dim(); ++q) +// { +// labels.at(q).resize(_K.nb_cells(q)) ; +// } +// +// if (dim < _K.dim()) +// { +// labels.at(dim).at(cell) = 1 ; +// const RChain& fstar_cell = OSM::cgetRow(_F_row.at(dim), cell) ; +// for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) +// { +// // Set the cofaces of it->first in dimension dim+1 +// RChain cofaces(_K.cod(it->first,dim)) ; +// for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) +// labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells +// } +// } +// else +// throw "Error: cannot export f* for a cell of maximal dimension" ; +// } +// else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G +// { +// for (int q=0; q<=_K.dim(); ++q) +// { +// labels.at(q).resize(_K.nb_cells(q)) ; +// } +// +// labels.at(dim).at(cell) = 1 ; +// const CChain& g_cell = OSM::cgetColumn(_G_col.at(dim), cell) ; +// for (typename CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) +// labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells +// } +// } +// return labels ; +// } + + // Method to generate PSC labels for visualisation + virtual std::vector > export_labelsPSC () const + { + std::vector > labels(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + { + for (int i = 0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else if (_flag.at(q).at(i) == CRITICAL) + labels.at(q).push_back(0) ; + else // NONE + labels.at(q).push_back(2) ; + } + } + return labels ; + } + + // Method to export G chains for visualisation + virtual CChain export_GChain (int cell, int dim) const + { + if ((dim<0) || (dim>_K.dim())) + throw "Error : export_GChain with dim out of range" ; + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + CChain g_cell(OSM::getColumn(_G_col.at(dim), cell)) ; + // Add 1 to the cell + g_cell[cell] = 1 ; + return g_cell ; + } + else + throw "Error : trying to export g_chain without proper HDVF_core option" ; + } + + // Method to export FSTAR chains for visualisation + virtual CChain export_FSTARChain (int cell, int dim) const + { + if ((dim<0) || (dim>_K.dim())) + throw "Error : export_GChain with dim out of range" ; + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + RChain fstar_cell(OSM::getRow(_F_row.at(dim), cell)) ; + // Add 1 to the cell + fstar_cell[cell] = 1 ; + // Compute the cofaces + if (dim < _K.dim()) + { + CChain fstar_cofaces(_K.nb_cells(dim+1)) ; + for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + { + // Set the cofaces of it->first in dimension dim+1 + RChain cofaces(_K.cod(it->first,dim)) ; + for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + fstar_cofaces[it2->first] = 1 ; + } + return fstar_cofaces ; + } + else + return CChain(0) ; + } + else + throw "Error : trying to export g_chain without proper HDVF_core option" ; + } +protected: + void progress_bar(int i, int n) + { + const int step(n/20) ; + if ((i%step)==0) + { + const float percentage(float(i)/(n-1)) ; + const char PBSTR[] = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" ; + const int PBWIDTH(60) ; + int val = (int) (percentage * 100); + int lpad = (int) (percentage * PBWIDTH); + int rpad = PBWIDTH - lpad; + printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); + fflush(stdout); + } + if (i==(n-1)) + std::cout << std::endl ; + } + +}; + +// Constructor for the HDVF_core class +template typename _ChainType, template typename _SparseMatrixType> +HDVF_core::HDVF_core(const ComplexType& K, int hdvf_opt) : _K(K) { + // Get the dimension of the simplicial complex + int dim = _K.dim(); + std::cout << "----> Starting HDVF_core creation / dim " << dim << std::endl ; + // HDVF_core options + _hdvf_opt = hdvf_opt ; + + // Resize the _DD_col vector to hold dim+1 elements + _DD_col.resize(dim + 1); + + // Resize the _F_row vector to hold dim+1 elements + if (_hdvf_opt & (OPT_FULL | OPT_F)) + _F_row.resize(dim + 1); + + // Resize the _G_col vector to hold dim+1 elements + if (_hdvf_opt & (OPT_FULL | OPT_G)) + _G_col.resize(dim + 1); + + // Resize the _H_col vector to hold dim+1 elements + if (_hdvf_opt & OPT_FULL) + _H_col.resize(dim + 1); + + // Resize flag and count vectors to hold dim+1 elements + _flag.resize(dim + 1); + _nb_P.resize(dim + 1); + _nb_S.resize(dim + 1); + _nb_C.resize(dim + 1); + + // Initialize matrices and counters + + for (int q = 0; q <= dim; q++) { + // Initialize _F_row[q] as a row matrix with dimensions (dim(q) x dim(q)) + if (_hdvf_opt & (OPT_FULL | OPT_F)) + _F_row[q] = RMatrix(_K.nb_cells(q), _K.nb_cells(q)); + + // Initialize _G_col[q] as a column matrix with dimensions (dim(q) x dim(q)) + if (_hdvf_opt & (OPT_FULL | OPT_G)) + _G_col[q] = CMatrix(_K.nb_cells(q), _K.nb_cells(q)); + + // Initialize _H_col[q] as a column matrix with dimensions (dim(q+1) x dim(q)) + if (_hdvf_opt & OPT_FULL) + _H_col[q] = CMatrix(_K.nb_cells(q + 1), _K.nb_cells(q)); + + // Initialize the counters for PRIMARY, SECONDARY, and CRITICAL cells + _nb_P[q] = 0; + _nb_S[q] = 0; + _nb_C[q] = _K.nb_cells(q); + } + + // Initialize the flags for each dimension to CRITICAL + for (int q = 0; q <= dim; q++) { + _flag[q] = std::vector(_K.nb_cells(q), CRITICAL); + } + + // Populate the DD matrices + _DD_col.resize(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + _DD_col.at(q) = _K.get_bnd_matrix(q) ; + std::cout << "------> End HDVF_core creation" << std::endl ; +} + +// Method to print the matrices +template typename _ChainType, template typename _SparseMatrixType> +std::ostream& HDVF_core::print_matrices(std::ostream& out) const { + // Iterate through each dimension and print the corresponding matrices + for (int q = 0; q <= _K.dim(); ++q) { + out << "------- Dimension " << q << std::endl; + + out << "Matrices _DD_col:" << std::endl; + out << _DD_col[q] << std::endl; + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + out << "Matrices _F_row:" << std::endl; + out << _F_row[q] << std::endl; + } + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + out << "Matrices _G_col:" << std::endl; + out << _G_col[q] << std::endl; + } + + if (_hdvf_opt & OPT_FULL) + { + out << "Matrices _H_col:" << std::endl; + out << _H_col[q] << std::endl; + } + } + return out ; +} + + +// Methods to find a pair of cells for A in dimension q +// -> = +- 1 with cell1, cell2 critical +// First version: returns a pair of dimensions q / q+1 +// Second version: returns all the pairs containing sigma + +/** \brief find a valid PairCell for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF_core::findPairA(int q, bool &found) // const +{ + found = false; + PairCell p; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = _DD_col[q+1].begin(); (it_col != _DD_col[q+1].end() && !found); ++it_col) + { + const CChain& col(OSM::cgetColumn(_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + found = true; + } + } + } + return p; +} + +/** \brief find a valid PairCell containing tau for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +PairCell HDVF_core::findPairA(int q, bool &found, int tau) // const +{ + found = false; + PairCell p ; + + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; + for (typename CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + p.sigma = it->first ; + p.tau = tau ; + p.dim = q-1 ; + } + } + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; + for (typename RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + p.sigma = tau ; + p.tau = it->first ; + p.dim = q ; + } + } + return p; +} + +/** \brief find all the valid PairCell for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF_core::findPairsA(int q, bool &found) // const +{ + std::vector pairs; + found = false ; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) + { + const CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + PairCell p; + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + pairs.push_back(p) ; + found = true; + } + } + } + return pairs; +} + +/** \brief find all the valid PairCell containing tau for A in dimension q */ +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF_core::findPairsA(int q, bool &found, int tau) // const +{ + found = false; + std::vector pairs; + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; + for (typename RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = tau ; + p.tau = it->first ; + p.dim = q ; + pairs.push_back(p) ; + } + } + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; + for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = it->first ; + p.tau = tau ; + p.dim = q-1 ; + pairs.push_back(p) ; + } + } + return pairs; +} + +//// Methods to find a pair of cells for M in dimension q +//// -> = +- 1 with cell1 primary, cell2 critical +//// First version: returns a pair of dimensions q +//// Second version: returns all the pairs containing sigma +// +///** \brief find a valid PairCell for M in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//PairCell HDVF_core::findPairM(int q, bool &found) // const +//{ +// found = false; +// PairCell p; +// +// if (_hdvf_opt & OPT_F) +// { +// // Search for +-1 in _F - iterate over rows +// for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); (it_row != _F_row[q].end() && !found); ++it_row) +// { +// const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); +// +// // Iterate through the entries of the row +// for (typename RChain::const_iterator it = row.begin(); (it != row.end() && !found); ++it) { +// if ((it->second == 1) || (it->second == -1)) { +// // If an entry with coefficient 1 or -1 is found, set the pair and mark as found +// p.sigma = it->first; // primary cell +// p.tau = *it_row; // critical cell +// p.dim = q; +// found = true; +// } +// } +// } +// } +// return p; +//} +// +///** \brief find a valid PairCell containing tau for M in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//PairCell HDVF_core::findPairM(int q, bool &found, int tau) // const +//{ +// found = false; +// PairCell p; +// if (_flag.at(q).at(tau) == SECONDARY) +// return p ; // Empty / found false +// +// if (_hdvf_opt & OPT_F) +// { +// // If tau is primary, search for gamma such that =+-1 +// if (_flag.at(q).at(tau) == PRIMARY) +// { +// for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); (it_row != _F_row.at(q).end() && !found); ++it_row) +// { +// if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) +// { +// p.sigma = tau ; // primary cell +// p.tau = *it_row ; // critical cell +// p.dim = q ; +// found = true; +// } +// } +// } +// // If tau is critical, search for pi such that =+-1 +// if (_flag.at(q).at(tau) == CRITICAL) +// { +// const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; +// for (typename RChain::const_iterator it = row.cbegin(); (it != row.cend() && !found); ++it) +// { +// if (abs(it->second) == 1) +// { +// p.sigma = it->first ; // primary cell +// p.tau = tau ; // critical cell +// p.dim = q ; +// found = true; +// } +// } +// } +// } +// return p; +//} +// +///** \brief find all the valid PairCell for M in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//std::vector HDVF_core::findPairsM(int q, bool &found) // const +//{ +// found = false; +// std::vector pairs; +// if (_hdvf_opt & OPT_F) +// { +// // Search for +-1 in _F - iterate over rows +// for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); it_row != _F_row[q].end() ; ++it_row) +// { +// const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); +// +// // Iterate through the entries of the row +// for (typename RChain::const_iterator it = row.begin(); it != row.end(); ++it) { +// if ((it->second == 1) || (it->second == -1)) { +// // If an entry with coefficient 1 or -1 is found, set the pair and add it +// PairCell p ; +// p.sigma = it->first; // primary cell +// p.tau = *it_row; // critical cell +// p.dim = q; +// pairs.push_back(p) ; +// } +// } +// } +// } +// found = !pairs.empty() ; +// return pairs; +//} +// +///** \brief find all the valid PairCell containing tau for M in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//std::vector HDVF_core::findPairsM(int q, bool &found, int tau) // const +//{ +// found = false; +// std::vector pairs; +// if (_flag.at(q).at(tau) == SECONDARY) +// return pairs ; // Empty / found false +// +// if (_hdvf_opt & OPT_F) +// { +// // If tau is primary, search for gamma such that =+-1 +// if (_flag.at(q).at(tau) == PRIMARY) +// { +// for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); it_row != _F_row.at(q).end(); ++it_row) +// { +// if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) +// { +// PairCell p ; +// p.sigma = tau ; // primary cell +// p.tau = *it_row ; // critical cell +// p.dim = q ; +// pairs.push_back(p) ; +// } +// } +// } +// // If tau is critical, search for pi such that =+-1 +// if (_flag.at(q).at(tau) == CRITICAL) +// { +// const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; +// for (typename RChain::const_iterator it = row.cbegin(); it != row.cend(); ++it) +// { +// if (abs(it->second) == 1) +// { +// PairCell p ; +// p.sigma = it->first ; // primary cell +// p.tau = tau ; // critical cell +// p.dim = q ; +// pairs.push_back(p) ; +// } +// } +// } +// } +// found = !pairs.empty() ; +// return pairs; +//} +// +//// Methods to find a pair of cells for W in dimension q +//// -> = +- 1 with cell1 secondary, cell2 critical +//// First version: returns a pair of dimensions q +//// Second version: returns all the pairs containing sigma +// +///** \brief find a valid PairCell for W in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//PairCell HDVF_core::findPairW(int q, bool &found) // const +//{ +// found = false; +// PairCell p; +// +// if (_hdvf_opt & OPT_G) +// { +// // Search for +-1 in _G - iterate over cols +// for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); (it_col != _F_row[q].end() && !found); ++it_col) +// { +// CChain &col = _G_col[q][*it_col]; +// +// // Iterate through the entries of the col +// for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { +// if ((it->second == 1) || (it->second == -1)) { +// // If an entry with coefficient 1 or -1 is found, set the pair and mark as found +// p.sigma = it->first; // secondary cell +// p.tau = *it_col; // critical cell +// p.dim = q; +// found = true; +// } +// } +// } +// } +// return p; +//} +// +///** \brief find a valid PairCell containing tau for W in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//PairCell HDVF_core::findPairW(int q, bool &found, int tau) // const +//{ +// found = false; +// PairCell p; +// if (_flag.at(q).at(tau) == PRIMARY) +// return p ; // Empty / found false +// +// if (_hdvf_opt & OPT_G) +// { +// // If tau is primary, search for gamma such that =+-1 +// if (_flag.at(q).at(tau) == SECONDARY) +// { +// for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); (it_col != _G_col.at(q).end() && !found); ++it_col) +// { +// if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) +// { +// p.sigma = tau ; // secondary cell +// p.tau = *it_col ; // critical cell +// p.dim = q ; +// found = true; +// } +// } +// } +// // If tau is critical, search for sigma such that =+-1 +// if (_flag.at(q).at(tau) == CRITICAL) +// { +// CChain col(OSM::getColumn(_G_col.at(q), tau)) ; +// for (typename CChain::const_iterator it = col.cbegin(); (it != col.cend() && !found); ++it) +// { +// if (abs(it->second) == 1) +// { +// p.sigma = it->first ; // secondary cell +// p.tau = tau ; // critical cell +// p.dim = q ; +// found = true; +// } +// } +// } +// } +// return p; +//} +// +///** \brief find all the valid PairCell for W in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//std::vector HDVF_core::findPairsW(int q, bool &found) // const +//{ +// found = false; +// std::vector pairs; +// +// if (_hdvf_opt & OPT_FULL) +// { +// // Search for +-1 in _G - iterate over cols +// for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); it_col != _F_row[q].end(); ++it_col) +// { +// CChain &col = _G_col[q][*it_col]; +// +// // Iterate through the entries of the col +// for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { +// if ((it->second == 1) || (it->second == -1)) { +// // If an entry with coefficient 1 or -1 is found, set the pair and mark as found +// PairCell p ; +// p.sigma = it->first; // secondary cell +// p.tau = *it_col; // critical cell +// p.dim = q; +// pairs.push_back(p) ; +// } +// } +// } +// } +// found = !pairs.empty() ; +// return pairs; +//} +// +///** \brief find all the valid PairCell containing tau for W in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//std::vector HDVF_core::findPairsW(int q, bool &found, int tau) // const +//{ +// found = false; +// std::vector pairs; +// if (_flag.at(q).at(tau) == PRIMARY) +// return pairs ; // Empty / found false +// +// if (_hdvf_opt & OPT_FULL) +// { +// // If tau is primary, search for gamma such that =+-1 +// if (_flag.at(q).at(tau) == SECONDARY) +// { +// for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); it_col != _G_col.at(q).end(); ++it_col) +// { +// if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) +// { +// PairCell p ; +// p.sigma = tau ; // secondary cell +// p.tau = *it_col ; // critical cell +// p.dim = q ; +// pairs.push_back(p) ; +// } +// } +// } +// // If tau is critical, search for sigma such that =+-1 +// if (_flag.at(q).at(tau) == CRITICAL) +// { +// CChain col(OSM::getColumn(_G_col.at(q), tau)) ; +// for (typename CChain::const_iterator it = col.cbegin(); it != col.cend(); ++it) +// { +// if (abs(it->second) == 1) +// { +// PairCell p ; +// p.sigma = it->first ; // secondary cell +// p.tau = tau ; // critical cell +// p.dim = q ; +// pairs.push_back(p) ; +// } +// } +// } +// } +// found = !pairs.empty() ; +// return pairs; +//} +// +//// Method to find a pair of cells for MW in dimension q +//// -> = +- 1 and = +- 1 with cell1 primary, cell2 secondary +//// First version: returns a pair of dimensions q +//// Second version: returns all the pairs containing sigma +// +///** \brief find a valid PairCell for MW in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//PairCell HDVF_core::findPairMW(int q, bool &found) // const +//{ +// found = false; +// PairCell p; +// +// if (_hdvf_opt & OPT_FULL) +// { +// // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero +// // iterate on H_q and H_q-1 accordingly +// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) +// { +// const int pi = *it_pi ; +// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; +// CChain d_pi = _K.d(pi, q) ; +// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; +// for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) +// { +// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; +// if (!H11q1.isNull()) +// { +// RChain cod_sigma = _K.cod(sigma, q) ; +// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; +// +// // Compute xi and xi' to test the validity of MW +// +// const int xi = projS_cod_sigma * H11 ; +// const int xip = H11q1 * projP_d_pi ; +// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; +// if (found) +// { +// p.sigma = pi ; // primary cell +// p.tau = sigma ; // secondary cell +// p.dim = q ; +// } +// } +// } +// } +// } +// return p; +//} +// +///** \brief find a valid PairCell containing tau for MW in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//PairCell HDVF_core::findPairMW(int q, bool &found, int tau) // const +//{ +// found = false; +// PairCell p; +// +// if (_flag.at(q).at(tau) == CRITICAL) +// return p ; // Empty / found false +// +// if (_hdvf_opt & OPT_FULL) +// { +// // If tau is primary (rename pi), search for a valid sigma +// if (_flag.at(q).at(tau) == PRIMARY) +// { +// const int pi(tau) ; +// // Col pi of H_q and proj_P(d(pi)) must at least be non empty +// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; +// CChain d_pi = _K.d(pi, q) ; +// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; +// +// if (H11.isNull() || projP_d_pi.isNull()) +// return p ; +// +// // Search for sigma with col_sigma(H_q-1) non empty +// for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) +// { +// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; +// if (!H11q1.isNull()) +// { +// // and proj_S(cod(sigma)) non empty +// RChain cod_sigma = _K.cod(sigma, q) ; +// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; +// if (!projS_cod_sigma.isNull()) +// { +// // test xi and xip +// const int xi = projS_cod_sigma * H11 ; +// const int xip = H11q1 * projP_d_pi ; +// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; +// if (found) +// { +// p.sigma = pi ; // primary cell +// p.tau = sigma ; // critical cell +// p.dim = q ; +// } +// } +// } +// } +// } +// else // cell is secondary +// { +// // cout << "secondary" << endl ; +// const int sigma(tau) ; +// // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty +// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; +// RChain cod_sigma = _K.cod(sigma, q) ; +// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; +// if (H11q1.isNull() || projS_cod_sigma.isNull()) +// return p ; +// +// // Search for pi with col pi of H_q non empty +// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) +// { +// const int pi(*it_pi) ; +// +// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; +// CChain d_pi = _K.d(pi, q) ; +// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; +// // proj_P of d(pi) must also be non empty +// if (!projP_d_pi.isNull()) +// { +// // test xi and xip +// const int xi = projS_cod_sigma * H11 ; +// const int xip = H11q1 * projP_d_pi ; +// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; +// if (found) +// { +// p.sigma = pi ; // primary cell +// p.tau = sigma ; // secondary cell +// p.dim = q ; +// } +// } +// } +// } +// } +// return p; +//} +// +///** \brief find all the valid PairCell for MW in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//std::vector HDVF_core::findPairsMW(int q, bool &found) // const +//{ +// found = false; +// std::vector pairs; +// +// if (_hdvf_opt & OPT_FULL) +// { +// // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero +// // iterate on H_q and H_q-1 accordingly +// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) +// { +// const int pi = *it_pi ; +// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; +// CChain d_pi = _K.d(pi, q) ; +// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; +// for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) +// { +// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; +// if (!H11q1.isNull()) +// { +// RChain cod_sigma = _K.cod(sigma, q) ; +// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; +// +// // Compute xi and xi' to test the validity of MW +// +// const int xi = projS_cod_sigma * H11 ; +// const int xip = H11q1 * projP_d_pi ; +// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; +// if (found) +// { +// PairCell p; +// p.sigma = pi ; // primary cell +// p.tau = sigma ; // secondary cell +// p.dim = q ; +// pairs.push_back(p) ; +// } +// } +// } +// } +// } +// found = !pairs.empty() ; +// return pairs; +//} +// +///** \brief find all the valid PairCell containing tau for MW in dimension q */ +////template +//template typename _ChainType, template typename _SparseMatrixType> +//std::vector HDVF_core::findPairsMW(int q, bool &found, int tau) // const +//{ +// found = false; +// std::vector pairs; +// if (_flag.at(q).at(tau) == CRITICAL) +// return pairs ; // Empty / found false +// +// if (_hdvf_opt & OPT_FULL) +// { +// // If tau is primary (rename pi), search for a valid sigma +// if (_flag.at(q).at(tau) == PRIMARY) +// { +// const int pi(tau) ; +// // Col pi of H_q and proj_P(d(pi)) must at least be non empty +// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; +// CChain d_pi = _K.d(pi, q) ; +// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; +// +// if (H11.isNull() || projP_d_pi.isNull()) +// return pairs ; +// +// // Search for sigma with col_sigma(H_q-1) non empty +// for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) +// { +// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; +// if (!H11q1.isNull()) +// { +// // and proj_S(cod(sigma)) non empty +// RChain cod_sigma = _K.cod(sigma, q) ; +// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; +// if (!projS_cod_sigma.isNull()) +// { +// // test xi and xip +// const CoefficientType xi = projS_cod_sigma * H11 ; +// const CoefficientType xip = H11q1 * projP_d_pi ; +// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; +// if (found) +// { +// PairCell p ; +// p.sigma = pi ; // primary cell +// p.tau = sigma ; // critical cell +// p.dim = q ; +// pairs.push_back(p) ; +// } +// } +// } +// } +// } +// else // cell is secondary +// { +// // cout << "secondary" << endl ; +// const int sigma(tau) ; +// // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty +// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; +// RChain cod_sigma = _K.cod(sigma, q) ; +// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; +// if (H11q1.isNull() || projS_cod_sigma.isNull()) +// return pairs ; +// +// // Search for pi with col pi of H_q non empty +// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) +// { +// const int pi(*it_pi) ; +// +// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; +// CChain d_pi = _K.d(pi, q) ; +// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; +// // proj_P of d(pi) must also be non empty +// if (!projP_d_pi.isNull()) +// { +// // test xi and xip +// const CoefficientType xi = projS_cod_sigma * H11 ; +// const CoefficientType xip = H11q1 * projP_d_pi ; +// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; +// if (found) +// { +// PairCell p ; +// p.sigma = pi ; // primary cell +// p.tau = sigma ; // secondary cell +// p.dim = q ; +// pairs.push_back(p) ; +// } +// } +// } +// } +// } +// found = !pairs.empty() ; +// return pairs; +//} + + +// Method to perform operation A +// tau1 is in dimension q, tau2 is in dimension q+1 +//template +template typename _ChainType, template typename _SparseMatrixType> +void HDVF_core::A(int tau1, int tau2, int q) { + //----------------------------------------------- Submatrices of D ---------------------------------------------------- + + // Output operation details to the console + // cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; + + // Extract submatrices from _DD_col + RChain D12(OSM::getRow(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 + CChain D21(OSM::getColumn(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 + CoefficientType D11(D12[tau2]); // D11 is the coefficient at the intersection of tau2 in D12 + + // Assert that D11 is either 1 or -1 (check invertibility) + assert((D11 == 1) || (D11 == -1)); // !!!!! Test invertibility + + // Compute the inverse of D11 (which is itself, since D11 is 1 or -1) + CoefficientType D11_inv = D11; + + // Perform operations to remove the row and column contributions + D12 /= std::vector({tau2}); // Remove tau2 column from D12 + D21 /= std::vector({tau1}); // Remove tau1 row from D21 + + // Delete rows and columns from _DD_col + _DD_col[q + 1].delRow(tau1); // Remove row tau1 from _DD_col[q+1] + _DD_col[q + 1].delColumn(tau2); // Remove column tau2 from _DD_col[q+1] + + //---------------------------------------------- Submatrices of F ----------------------------------------------------- + + RChain F11 ; + CChain G11 ; + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Extract the relevant submatrix from _F_row + F11 = OSM::getRow(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 + + // Delete the row tau1 from _F_row + _F_row[q].delRow(tau1); + } + + //--------------------------------------------- Submatrices of G ------------------------------------------------------ + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Extract the relevant submatrix from _G_col + G11 = OSM::getColumn(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 + + // Delete the column tau2 from _G_col + _G_col[q + 1].delColumn(tau2); + } + + //--------------------------------------------- Update matrices ------------------------------------------------------- + + // ---- Update _F_row + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Update _F_row[q] + // Subtract the product of (D21 * D11_inv) and F11 from _F_row[q] + // Note: % operator returns a row matrix, so be careful with operations + _F_row[q] -= (D21 * D11_inv) % F11; + + // Set the column tau1 of _F_row[q] to (D21 * (-D11_inv)) + OSM::setColumn(_F_row[q], tau1, D21 * (-D11_inv)); + + // Remove the row tau2 from _F_row[q+1] + _F_row[q + 1].delRow(tau2); + } + + // ---- Update _G_col + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Update _G_col[q + 1] + // Subtract the product of (G11 * D11_inv) and D12 from _G_col[q+1] + _G_col[q + 1] -= (G11 * D11_inv) * D12; + + // Set the row tau2 of _G_col[q + 1] to (D12 * (-D11_inv)) + OSM::setRow(_G_col[q + 1], tau2, D12 * (-D11_inv)); + + // Remove the column tau1 from _G_col[q] + _G_col[q].delColumn(tau1); + } + + // ---- Update _H_col + + if (_hdvf_opt & OPT_FULL) + { + // Update _H_col[q] + // Compute the temporary matrix product G11 * F11 + CMatrix tmp = G11 * F11; + + // Add the product of tmp and D11_inv to _H_col[q] + _H_col[q] += (tmp) * D11_inv; + + // Set the row tau2 of _H_col[q] to (F11 * D11_inv) + OSM::setRow(_H_col[q], tau2, F11 * D11_inv); + + // Set the column tau1 of _H_col[q] to (G11 * D11_inv) + OSM::setColumn(_H_col[q], tau1, G11 * D11_inv); + + // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv + _H_col[q].set_coef(tau2, tau1, D11_inv); + } + + // ---- Update _DD_col + + // Update _DD_col + _DD_col[q + 1] -= (D21 * D12) * D11_inv; + + // Remove columns and rows from _DD_col as necessary + if (q > 0) { + _DD_col[q].delColumn(tau1); // Remove column tau1 from _DD_col[q] + } + if (q + 2 <= _K.dim()) { + _DD_col[q + 2].delRow(tau2); // Remove row tau2 from _DD_col[q+2] + } + + // Update flags + _flag[q][tau1] = PRIMARY; // Set the flag of tau1 in dimension q to PRIMARY + --_nb_C.at(q) ; + ++_nb_P.at(q) ; + _flag[q + 1][tau2] = SECONDARY; // Set the flag of tau2 in dimension q+1 to SECONDARY + --_nb_C.at(q+1) ; + ++_nb_S.at(q+1) ; + + // ----------------------------------------------------------------------------------------------------------------------- +} + +//// Method to perform operation R +//// pi is in dimension q, sigma is in dimension q+1 +////template +//template typename _ChainType, template typename _SparseMatrixType> +//void HDVF_core::R(int pi, int sigma, int q) { +// //----------------------------------------------- Submatrices of H ---------------------------------------------------- +// +// if (_hdvf_opt & OPT_FULL) +// { +// // Output operation details to the console +// std::cout << "R of " << pi << "(dim " << q << ") / " << sigma << "(dim " << q + 1 << ")" << std::endl; +// +// // Extract the relevant row and column chains from _H_col +// RChain H12 = OSM::getRow(_H_col[q], sigma); // H12 is the row chain from _H_col[q] at index sigma +// CChain H21 = OSM::getColumn(_H_col[q], pi); // H21 is the column chain from _H_col[q] at index pi +// +// // Get the coefficient at the intersection of H12 and H21 +// CoefficientType H11(H12[pi]); // H11 is the coefficient at row sigma and column pi +// +// // Assert that H11 is either 1 or -1 (check invertibility) +// assert((H11 == 1) || (H11 == -1)); // !!!!! Test invertibility +// CoefficientType H11_inv = H11; // Inverse of H11 (which is itself for 1 or -1) +// +// // Remove the contributions of pi from H12 and sigma from H21 +// H12 /= std::vector({pi}); // Remove column pi from H12 +// H21 /= std::vector({sigma}); // Remove row sigma from H21 +// +// // Remove the corresponding row and column from _H_col +// _H_col[q].delRow(sigma); // Remove row sigma from _H_col[q] +// _H_col[q].delColumn(pi); // Remove column pi from _H_col[q] +// +// //---------------------------------------------- Submatrices of F ----------------------------------------------------- +// +// // Extract the relevant column chain from _F_row +// CChain F11 = OSM::getColumn(_F_row[q], pi); // F11 is the column chain from _F_row[q] at index pi +// +// // Remove the column pi from _F_row +// _F_row[q].delColumn(pi); +// +// //--------------------------------------------- Submatrices of G ------------------------------------------------------ +// +// // Extract the relevant row chain from _G_col +// RChain G11 = OSM::getRow(_G_col[q + 1], sigma); // G11 is the row chain from _G_col[q+1] at index sigma +// +// // Remove the row sigma from _G_col +// _G_col[q + 1].delRow(sigma); +// +// //--------------------------------------------- Update matrices ------------------------------------------------------- +// +// // Update _F_row[q] +// // Subtract the product of (H12 * F11) and H11 from _F_row[q] +// // Note: % operator returns a row matrix, so be careful with operations +// _F_row[q] -= (F11 % H12) * H11_inv; +// +// // Set the row pi of _F_row[q] to (H12 * (-H11_inv)) +// OSM::setRow(_F_row[q], pi, H12 * (-H11_inv)); +// +// // Update _G_col[q + 1] +// // Subtract the product of (H21 * G11) and H11_inv from _G_col[q + 1] +// _G_col[q + 1] -= (H21 * G11) * H11_inv; +// +// // Set the column sigma of _G_col[q + 1] to (H21 * (-H11_inv)) +// OSM::setColumn(_G_col[q + 1], sigma, H21 * (-H11_inv)); +// +// // Update _DD_col +// // Compute the temporary matrix product F11 * G11 +// _DD_col[q + 1] += (F11 * G11) * H11_inv; +// +// // Set the row pi in _DD_col[q + 1] to (G11 * H11_inv) +// OSM::setRow(_DD_col[q + 1], pi, G11 * H11_inv); +// +// // Set the column sigma in _DD_col[q + 1] to (F11 * H11_inv) +// OSM::setColumn(_DD_col[q + 1], sigma, F11 * H11_inv); +// +// // Set the coefficient at (pi, sigma) in _DD_col to H11_inv +// _DD_col[q + 1].set_coef(pi, sigma, H11_inv); +// +// // Update _H_col[q] +// // Subtract the product of (H21 * H12) and H11_inv from _H_col[q] +// _H_col[q] -= (H21 * H12) * H11_inv; +// +// // Perform additional updates +// +// // Extract boundary and coboundary chains +// CChain bnd_pi(_K.d(pi, q)); // Boundary of pi in dimension q +// RChain cobnd_sigma(_K.cod(sigma, q + 1)); // Coboundary of sigma in dimension q+1 +// +// // Project the boundary and coboundary chains onto PRIMARY and SECONDARY flags +// CChain proj_P_pi(projection(bnd_pi, PRIMARY, q)); +// RChain proj_S_sigma(projection(cobnd_sigma, SECONDARY, q + 1)); +// +// if (q > 0) { +// // Update _DD_col[q] with projections and _F_row[q-1] +// CChain c1(_F_row[q - 1] * proj_P_pi + projection(bnd_pi, CRITICAL, q)); +// OSM::setColumn(_DD_col[q], pi, c1); +// OSM::setColumn(_G_col[q], pi, _H_col[q - 1] * proj_P_pi); +// } +// +// // Update _F_row[q+1] with projection and _H_col[q+1] +// OSM::setRow(_F_row[q + 1], sigma, proj_S_sigma * _H_col[q + 1]); +// +// if (q + 2 <= _K.dim()) { +// // Update _DD_col[q+2] with projections +// RChain c4(projection(cobnd_sigma, CRITICAL, q + 1) + proj_S_sigma * _G_col[q + 2]); +// OSM::setRow(_DD_col[q + 2], sigma, c4); +// } +// +// // Update flags +// _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to CRITICAL +// ++_nb_C.at(q) ; +// --_nb_P.at(q) ; +// _flag[q + 1][sigma] = CRITICAL; // Set the flag of sigma in dimension q+1 to CRITICAL +// ++_nb_C.at(q+1) ; +// --_nb_S.at(q+1) ; +// } +// else +// std::cout << "!!! R impossible with partial reduction options" << std::endl; +//} +// +//// Method to perform operation M +//// pi is in dimension q, gamma is in dimension q +////template +//template typename _ChainType, template typename _SparseMatrixType> +//void HDVF_core::M(int pi, int gamma, int q) { +// //----------------------------------------------- Submatrices of F ---------------------------------------------------- +// +// if (_hdvf_opt & OPT_FULL) +// { +// // Output the operation details to the console +// std::cout << "M_" << q << "(" << pi << "," << gamma << ")" << std::endl; +// +// if (q == _K.dim()) +// throw("M operation in max dimension !!!") ; +// +// // Extract row and column chains from _F_row +// RChain F12(OSM::getRow(_F_row[q], gamma)); // F12 is the row chain from _F_row[q] at index gamma +// CChain F21(OSM::getColumn(_F_row[q], pi)); // F21 is the column chain from _F_row[q] at index pi +// +// // Get the coefficient at the intersection of F12 and F21 +// CoefficientType F11(F12[pi]); // F11 is the coefficient at row gamma and column pi +// +// // Assert that F11 is either 1 or -1 (for invertibility) +// assert((F11 == 1) || (F11 == -1)); // !!!!! Test invertibility +// CoefficientType F11_inv = F11; // Inverse of F11 (which is itself for 1 or -1) +// +// // Remove the contributions of pi from F12 and gamma from F21 +// F12 /= std::vector({pi}); // Remove column pi from F12 +// F21 /= std::vector({gamma}); // Remove row gamma from F21 +// +// // Remove the corresponding row and column from _F_row +// _F_row[q].delRow(gamma); // Remove row gamma from _F_row[q] +// _F_row[q].delColumn(pi); // Remove column pi from _F_row[q] +// +// //--------------------------------------------- Submatrices of G ------------------------------------------------------ +// +// // Extract the relevant column chain from _G_col +// // G11_q is the column chain from _G_col[q] at index gamma +// // CChain G11_q(OSM::getColumn(_G_col[q], gamma)); +// _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] +// +// //---------------------------------------------- Submatrices of H ----------------------------------------------------- +// +// // Extract the relevant column chain from _H_col +// CChain H11(OSM::getColumn(_H_col[q], pi)); // H11 is the column chain from _H_col[q] at index pi +// +// // Remove the column pi from _H_col +// _H_col[q].delColumn(pi); +// +// //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ +// +// // For DD_q+1 and DD_q: +// // Extract the relevant row chains from _DD_col +// +// // DD_q+1 (corresponds to the row matrix of _DD_col) +// RChain D11(OSM::getRow(_DD_col[q+1], gamma)); // D11 is the row chain from _DD_col[q+1] at index gamma +// _DD_col[q + 1].delRow(gamma); // Remove row gamma from _DD_col[q + 1] +// +// //--------------------------------------------- Submatrices of DD ------------------------------------------------------ +// +// // DD_q (corresponds to the column matrix of _DD_col) +// // CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); +// // D11_q is the column chain from _DD_col[q] at index gamma +// if (q > 0) +// _DD_col[q].delColumn(gamma); // Remove column gamma from _DD_col[q] +// +// //--------------------------------------------- Update matrices ------------------------------------------------------- +// +// // Update _H_col +// // Subtract the product of (H11 * F11_inv) and F12 from _H_col[q] +// // Note: * operator is used for matrix column results +// _H_col[q] -= (H11 * F11_inv) * F12; +// +// // Set the column gamma of _H_col[q] to (-1 * H11) * F11_inv +// OSM::setColumn(_H_col[q], gamma, (-1 * H11) * (F11_inv)); +// +// // Update _F_row +// // Add the product of (F21 * F11_inv) and F12 to _F_row[q] +// _F_row[q] -= (F21 * F11_inv) * F12; +// +// // Set the row pi of _F_row[q] to F11_inv * F12 +// OSM::setRow(_F_row[q], pi, F11_inv * F12); +// +// // Set the column gamma of _F_row[q] to F21 * (-F11_inv) +// OSM::setColumn(_F_row[q], gamma, F21 * (-F11_inv)); +// +// // Set the coefficient at (pi, gamma) in _F_row[q] to F11_inv +// _F_row[q].set_coef(pi, gamma, F11_inv); +// +// // Update _G_col +// // Add the product of (H11 * F11_inv) and D11 to _G_col[q+1] +// _G_col[q + 1] += (H11 * F11_inv) * D11; +// +// // Update _DD_col[q + 1] +// _DD_col[q + 1] -= (F21 * F11_inv) * D11; // Subtract the product from _DD_col[q + 1] +// OSM::setRow(_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in _DD_col[q + 1] +// +// // Update _G_col (for dimension q) and _DD_col (for dimension q) +// if (q>0) +// { +// // Extract boundary chain and project it +// CChain c = _K.d(pi, q); // Boundary of pi in dimension q +// CChain projection_p(projection(c, PRIMARY, q-1)); // Project boundary chain to PRIMARY +// CChain projection_c = projection(c, CRITICAL, q-1); // Project boundary chain to CRITICAL +// +// // Set the column pi of _G_col[q] to (-1 * _H_col[q-1]) * projection_p +// OSM::setColumn(_G_col[q], pi, (CoefficientType(-1) * _H_col[q - 1]) * projection_p); +// +// // Update _DD_col +// // Extract projections and perform updates +// CChain tmp(_F_row[q - 1] * projection_p + projection_c); // Compute the product of _F_row[q - 1] and projection_p +// // Set the column pi of _DD_col[q] to cc +// OSM::setColumn(_DD_col[q], pi, tmp); +// } +// // else: if the dimension is 0, no change for _G_col[q] and _DD_col[q] +// +// // Update flags +// _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to PRIMARY +// _flag[q][gamma] = PRIMARY; // Set the flag of gamma in dimension q to CRITICAL +// } +// else +// std::cout << "!!! M impossible with partial reduction options" << std::endl; +//} +// +//// Method to perform operation W +//// gamma is in dimension q, sigma is in dimension q +// +//template typename _ChainType, template typename _SparseMatrixType> +//void HDVF_core::W(int sigma, int gamma, int q) { +// +// //----------------------------------------------- Submatrices of G ---------------------------------------------------- +// +// if (_hdvf_opt & OPT_FULL) +// { +// // Output the operation details to the console +// std::cout << "W_" << q << "(" << sigma << "," << gamma << ")" << std::endl; +// +// if (q == 0) +// throw("W operation in dimension 0 !!!") ; +// +// // Extract row and column chains from _G_col +// RChain G12(OSM::getRow(_G_col[q], sigma)); // G12 is the row chain from _G_col[q] at index sigma +// CChain G21(OSM::getColumn(_G_col[q], gamma)); // G21 is the column chain from _G_col[q] at index gamma +// +// // Get the coefficient at the intersection of G12 and G21 +// CoefficientType G11(G12[gamma]); // G11 is the coefficient at row sigma and column gamma +// +// // Assert that G11 is either 1 or -1 (for invertibility) +// assert((G11 == 1) || (G11 == -1)); // !!!!! Test invertibility +// CoefficientType G11_inv = G11; // Inverse of G11 (which is itself for 1 or -1) +// +// // Remove the contributions of gamma from G12 and sigma from G21 +// G12 /= std::vector({gamma}); // Remove column gamma from G12 +// G21 /= std::vector({sigma}); // Remove row sigma from G21 +// +// // Remove the corresponding row and column from _G_col +// _G_col[q].delRow(sigma); // Remove row sigma from _G_col[q] +// _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] +// +// //---------------------------------------------- Submatrices of F ----------------------------------------------------- +// +// // Extract the row chain from _F_row +// // RChain F11(OSM::getRow(_F_row[q], gamma)); // F11 is the row chain from _F_row[q] at index gamma +// +// // Remove the row gamma from _F_row +// _F_row[q].delRow(gamma); +// +// //--------------------------------------------- Submatrices of H ------------------------------------------------------ +// +// // Extract the row chain from _H_col +// RChain H11(OSM::getRow(_H_col[q-1], sigma)); // H11 is the row chain from _H_col[q] at index sigma +// +// // Remove the row sigma from _H_col +// _H_col[q-1].delRow(sigma); +// +// //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ +// +// // Extract the row chain from _DD_col[q+1] +// // RChain D11_q_plus1(OSM::getRow(_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from _DD_col[q + 1] at index gamma +// +// // Remove the row gamma from _DD_col +// if (q < _K.dim()) +// _DD_col[q + 1].delRow(gamma); +// +// //--------------------------------------------- Submatrices of DD_q ------------------------------------------------------ +// +// // Extract the column chain from _DD_col[q] +// CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); // D11_q is the column chain from _DD_col[q] at index gamma +// +// // Remove the column gamma from _DD_col +// _DD_col[q].delColumn(gamma); +// +// //--------------------------------------------- Update matrices ------------------------------------------------------- +// +// // Update _H_col +// // Subtract the product of (G21 * G11_inv) and H11 from _H_col[q] +// // Note: % operator is used for matrix row results +// _H_col[q-1] -= (G21 * G11_inv) * H11; +// +// // Set the row gamma of _H_col[q] to (-1 * H11) * G11_inv +// OSM::setRow(_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); +// +// // Update _G_col +// // Subtract the product of G11_inv and (G21 * G12) from _G_col[q] +// _G_col[q] -= (G21 * G11_inv) * G12; +// +// // Set the row gamma of _G_col[q] to G11_inv * G12 +// OSM::setRow(_G_col[q], gamma, -G11_inv * G12); +// +// // Set the column sigma of _G_col[q] to G11_inv * G21 +// OSM::setColumn(_G_col[q], sigma, G21 * G11_inv); +// +// // Set the coefficient at (gamma, sigma) in _G_col[q] to G11_inv +// _G_col[q].set_coef(gamma, sigma, G11_inv); +// +// // Update _F_row (for dimension q-1) +// // Add the product of (D11_q * G11_inv) and H11 to _F_row[q - 1] +// _F_row[q - 1] += (D11_q * G11_inv) * H11; +// +// // Update _DD_col (for dimension q) +// _DD_col[q] -= (D11_q * G11_inv) * G12;// Subtract the product of (D11_q * G11_inv) and G12 +// OSM::setColumn(_DD_col[q], sigma, D11_q * G11_inv) ; +// +// // Update _F_row (for dimension q) and _DD_col (for dimension q+1) +// if (q < _K.dim()) +// { +// // Extract boundary chain and project it +// RChain c = _K.cod(sigma, q); // Boundary of sigma in dimension q +// RChain projection_s(projection(c, SECONDARY, q+1)); // Project boundary chain to SECONDARY +// RChain projection_c(projection(c, CRITICAL, q+1)); // Project boundary chain to SECONDARY +// +// // Set the row sigma of _F_row[q] to (-1 * projection_s * _H_col[q]) +// OSM::setRow(_F_row[q], sigma, (-1 * projection_s) * _H_col[q]); +// +// // Set the row sigma of _DD_col[q + 1] to projection_s * _G_col[q + 1] + projection_c +// +// RChain tmp(projection_s * _G_col[q + 1] + projection_c) ; +// OSM::setRow(_DD_col[q + 1], sigma, tmp); +// } +// // else : if the dimension is maximal, no update of _DD_col[q+1] and _F_row[q] +// +// // Update flags +// _flag[q][gamma] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY +// _flag[q][sigma] = CRITICAL; // Set the flag of sigma in dimension q to CRITICAL +// } +// else +// std::cout << "!!! W impossible with partial reduction options" << std::endl; +//} +// +//// Method to perform operation MW +//// gamma is in dimension q, sigma is in dimension q +// +//template typename _ChainType, template typename _SparseMatrixType> +//void HDVF_core::MW(int pi, int sigma, int q) { +// +// //----------------------------------------------- Submatrices of G ---------------------------------------------------- +// +// if (_hdvf_opt & OPT_FULL) +// { +// // Output the operation details to the console +// std::cout << "MW_" << q << "(" << pi << "," << sigma << ")" << std::endl; +// +// if (q <= 0) +// throw("MW operation in dimension 0 !!!") ; +// if (q >= _K.dim()) +// throw("MW operation in maximal dimension !!!") ; +// +// // In order to compute xi and xi', extract sub-matrices of H_q, H_q-1 and compute d(pi) and cod(sigma) +// +// // H_q extractions +// +// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; +// // H21 -> delete H11 +// _H_col.at(q) /= std::vector({pi}) ; +// +// // H_q-1 extractions +// +// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; +// // H21_q-1 -> delete H11q1 +// _H_col.at(q-1).delRow(sigma) ; +// +// // d(pi) +// +// CChain d_pi = _K.d(pi, q) ; +// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; +// CChain projC_d_pi = projection(d_pi, CRITICAL, q-1) ; +// +// // cod(sigma) +// +// RChain cod_sigma = _K.cod(sigma, q) ; +// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; +// RChain projC_cod_sigma = projection(cod_sigma, CRITICAL, q+1) ; +// +// // Compute xi and xi' to test the validity of MW +// +// CoefficientType xi = projS_cod_sigma * H11 ; +// CoefficientType xip = H11q1 * projP_d_pi ; +// +// if (abs(xi) != 1) +// throw "MW impossible, xi non invertible" ; +// if (abs(xip) != 1) +// throw "MW impossible, xi' non invertible" ; +// +// // F_q extraction +// +// CChain F11(OSM::getColumn(_F_row.at(q), pi)) ; +// // F12 -> delete col F11 +// _F_row.at(q).delColumn(pi) ; +// +// // G_q extractions +// +// RChain G11(OSM::getRow(_G_col.at(q), sigma)) ; +// // G21 -> dele row G11 +// _G_col.at(q).delRow(sigma) ; +// +// // ----------- Update of the reduction +// +// // H_q +// +// RChain tmp1 = projS_cod_sigma * _H_col.at(q) ; +// +// _H_col.at(q) -= (H11 * xi) * tmp1 ; +// OSM::setColumn(_H_col.at(q), sigma, H11 * xi) ; +// +// // F_q +// +// _F_row.at(q) += (F11 * xi) * tmp1 ; +// OSM::setColumn(_F_row.at(q), sigma, F11 * (-xi)) ; +// +// // G_q+1 // note: G_q+1 is not be modified if the HDVF_core is perfect +// +// RChain tmp2(projS_cod_sigma * _G_col.at(q+1)) ; +// tmp2 += projC_cod_sigma ; +// _G_col.at(q+1) -= (H11 * xi) * tmp2 ; +// +// // DD_col_q+1 / DD_row_q +// +// _DD_col.at(q+1) -= (F11 * xi) * tmp2 ; +// +// // H_q-1 +// +// CChain tmp3(_H_col.at(q-1) * projP_d_pi) ; +// +// _H_col.at(q-1) -= (tmp3 * xip) * H11q1 ; +// OSM::setRow(_H_col.at(q-1), pi, xip * H11q1) ; +// +// // G_q +// +// _G_col.at(q) -= (tmp3 * xip) * G11 ; +// OSM::setRow(_G_col.at(q), pi, xip * G11) ; +// +// // F_q-1 // note: F_q-1 is not be modified if the HDVF_core is perfect +// +// CChain tmp4(_F_row.at(q-1) * projP_d_pi) ; +// tmp4 += projC_d_pi ; +// _F_row.at(q-1) -= (tmp4 * xip) * H11q1 ; +// +// // DD_col_q +// +// _DD_col.at(q) += (tmp4 * xip) * G11 ; +// +// // Update flags +// _flag[q][pi] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY +// _flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to CRITICAL +// } +// else +// std::cout << "!!! MW impossible with partial reduction options" << std::endl; +//} + + +// Method to compute a perfect HDVF_core (Higher Dimensional Vector Field) +// Returns a vector of PairCell objects representing the pairs found + +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF_core::computePerfectHDVF(bool verbose) { + std::vector pair_list; // Vector to store the list of pairs + bool trouve = false; // Flag to indicate whether a pair was found + int dim = _K.dim(); // Get the dimension of the complex K + + // Loop through dimensions from q-1 to 0 + for (int q = dim - 1; q >= 0; --q) { + std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; + // cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; + // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) + + // Find a pair of cells in dimension q + PairCell pair = findPairA(q, trouve); + + // While a pair is found + while (trouve) { + progress_bar(_K.nb_cells(q)-_nb_C.at(q), _K.nb_cells(q)) ; + // Add the found pair to the list + pair_list.push_back(pair); + + // Perform operation A with the found pair + A(pair.sigma, pair.tau, q); + if (verbose) + { + std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; + print_matrices(std::cout) ; + } + + // Find another pair of cells in dimension q + pair = findPairA(q, trouve); + } + } + + // Return the list of pairs found + return pair_list; +} + +// Method to compute a random perfect HDVF_core (Higher Dimensional Vector Field) +// Returns a vector of PairCell objects representing the pairs found + +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF_core::computeRandPerfectHDVF(bool verbose) { + std::vector pair_list; // Vector to store the list of pairs + bool trouve = false; // Flag to indicate whether a pair was found + int dim = _K.dim(); // Get the dimension of the complex K + + // Init random generator + std::random_device dev; + std::mt19937 rng(dev()); // Random + + // Loop through dimensions from q-1 to 0 + for (int q = dim - 1; q >= 0; --q) { + std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; + // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) + + std::vector pairs = findPairsA(q, trouve); + + PairCell pair ; + + // While a pair is found + while (trouve) + { + // Add one of the pairs (randomly) to the list + { + // Pickup a random cell sigma + std::uniform_int_distribution rand_dist(0,pairs.size()-1); + int i(rand_dist(rng)) ; + pair = pairs.at(i) ; + } + pair_list.push_back(pair); + + // Perform operation A with the chosen pair + A(pair.sigma, pair.tau, pair.dim); + if (verbose) + { + std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; + print_matrices(std::cout) ; + } + + // Compute possible pairings + pairs = findPairsA(q, trouve); + } + } + // Return the list of pairs found + return pair_list; +} + +// Method to get cells if with a given flag (P,S,C) for each dimension +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector > HDVF_core::get_flag (FlagType flag) const +{ + std::vector > res(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + { + for (int i=0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == flag) + res.at(q).push_back(i) ; + } + } + return res ; +} + +// Method to get cells with a given flag (P,S,C) for a given dimension +//template +template typename _ChainType, template typename _SparseMatrixType> +std::vector HDVF_core::get_flag_dim (FlagType flag, int q) const +{ + std::vector res ; + for (int i=0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == flag) + res.push_back(i) ; + } + return res ; +} + +// Method to print the current state of the reduction +//template +template typename _ChainType, template typename _SparseMatrixType> +std::ostream& HDVF_core::print_reduction(std::ostream& out) // const +{ + // Print PSC + out << "----- flags of cells:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < _K.nb_cells(q); ++i) + { + const int flag(_flag.at(q).at(i)) ; + if (flag == PRIMARY) + out << i << " -> P" << std::endl ; + else if (flag == SECONDARY) + out << i << " -> S" << std::endl ; + else + out << i << " -> C" << std::endl ; + } + out << std::endl; + } + + // Print critical cells + out << "----- critical cells:" << std::endl; + std::vector > critical(get_flag(CRITICAL)) ; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + out << critical.at(q).at(i) << " "; + } + out << std::endl; + } + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Print matrices g + out << "----- g:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + const int id(critical.at(q).at(i)) ; + out << "g(" << id << ") = (" << id << ")"; + // Iterate over the ith column of _G_col + CChain col(OSM::getColumn(_G_col.at(q), id)) ; // TODO cget + for (typename CChain::const_iterator it_col = col.cbegin(); it_col != col.cend(); ++it_col) { + out << " + " << it_col->second << ".(" << it_col->first << ") + "; + } + out << std::endl; + } + } + } + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Print matrices f* + out << "----- f*:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + const int id(critical.at(q).at(i)) ; + out << "f*(" << id << ") = (" << id << ")"; + // Iterate over the ith row of _F_row + RChain row(OSM::getRow(_F_row.at(q), id)) ; // TODO cget + for (typename RChain::const_iterator it_row = row.cbegin(); it_row != row.cend(); ++it_row) { + out << " + " << it_row->second << ".(" << it_row->first << ") + "; + } + out << std::endl; + } + } + } + return out ; +} + +// Method to print A-pairs +//template +template typename _ChainType, template typename _SparseMatrixType> +std::ostream& HDVF_core::print_pairs(const std::vector& pairs, std::ostream& out) // const +{ + for (const auto& pair : pairs) { + out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; + } + return out ; +} + +} + +#endif // HDVF_H From 81439d38ab878f469ee5c9a13fbbe2001a0ef867 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Thu, 1 May 2025 08:47:46 +0200 Subject: [PATCH 010/343] HDVF rework --- HDVF/doc/HDVF/Concepts/HDVF.h | 10 +- HDVF/examples/HDVF/main_dual_hdvf.cpp | 1 - HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 6 +- .../CGAL/HDVF/Cubical_chain_complex.hpp | 9 +- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 4 +- HDVF/include/CGAL/HDVF/hdvf_core.hpp | 142 +++++++++--------- HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 14 +- HDVF/include/CGAL/HDVF/per_hdvf.hpp | 8 +- 8 files changed, 98 insertions(+), 96 deletions(-) diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h index df9b0304ddee..a6b8ee718044 100644 --- a/HDVF/doc/HDVF/Concepts/HDVF.h +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -11,11 +11,15 @@ The concept `HDVF` describes the requirements for Homological Discrete Vector Fi An HDVF is perfect when the reduced boundary is null; in this case, the maps \f$f\f$ and \f$g\f$ (and their duals) provide homology and cohomology information (generators, annotation...). In order to build a perfect HDVF, a pairing operation called `A` associates (under conditions) two critical cells (becoming PRIMARY and SECONDARY) and updates the reduction in time \f$\mathcal O(n^2)\f$. - - The `HDVF` concept + Starting from this operation, `HDVF` provides two methods to generate perfect HDVFs (and hence compute homology): + - `compute_perfect_hdvf` which computes a perfect HDVF by chosing at each step the first A-pairings available (depending on cells ordering in the chain complex) + - `compute_rand_perfect_hdvf` which computes a perfect random HDVF by chosing at each step a rand A-pairing among all possible ones (this option is thus slower) \cgalHasModelsBegin -\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} +\cgalHasModelsBare{`HDVF_core`} +\cgalHasModelsBare{`HDVF`} +\cgalHasModelsBare{`HDVF_persistence`} +\cgalHasModelsBare{`HDVF_duality`} \cgalHasModelsEnd */ diff --git a/HDVF/examples/HDVF/main_dual_hdvf.cpp b/HDVF/examples/HDVF/main_dual_hdvf.cpp index 3b43c97eaf72..cd07d34968f0 100644 --- a/HDVF/examples/HDVF/main_dual_hdvf.cpp +++ b/HDVF/examples/HDVF/main_dual_hdvf.cpp @@ -13,7 +13,6 @@ #include "CGAL/HDVF/SimpComplexTools.hpp" #include "CGAL/HDVF/Cubical_chain_complex.hpp" #include "CGAL/HDVF/CubComplexTools.hpp" -#include "CGAL/HDVF/hdvf.hpp" #include "CGAL/HDVF/hdvf_tools.hpp" #include "CGAL/HDVF/hdvf_duality.hpp" #include "CGAL/OSM/OSM.hpp" diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index 0ddccec89700..a01985e5a677 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -17,7 +17,7 @@ #include #include #include "Cubical_chain_complex.hpp" -#include "hdvf.hpp" +#include "hdvf_core.hpp" #include "per_hdvf.hpp" #include "sub_chain_complex.hpp" #include "tools_io.hpp" @@ -38,7 +38,7 @@ namespace CGAL { template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> -void Cub_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Cubical_chain_complex &complex, string filename = "test") +void Cub_output_vtk (HDVF_core, _ChainType, _SparseMatrixType> &hdvf, Cubical_chain_complex &complex, string filename = "test") { typedef Cubical_chain_complex ComplexType; // Export PSC labelling @@ -175,7 +175,7 @@ void Per_Cub_output_vtk (PersistentHDVF " << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << std::endl ; - if (per_hdvf.hole_duration(hole)) + if (per_hdvf.hole_duration(hole)>=0) { // Build name associated to the ith hole : filename_i string out_file = filename+"_"+to_string(i) ; diff --git a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp index e2891260500a..833eb0b1686b 100644 --- a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp @@ -608,6 +608,9 @@ Cubical_chain_complex::Cubical_chain_complex(const Cub_object& _cells.resize(_P[_dim], false) ; + // Initialize _visited_cells + _visited_cells.resize(_P[_dim], false) ; + // Initialize _cells, _base2bool, and _bool2base initialize_cells(cub,type); @@ -615,11 +618,7 @@ Cubical_chain_complex::Cubical_chain_complex(const Cub_object& _d.resize(_dim+1); for (int q = 0; q <= _dim; ++q) { calculate_d(q); - } - - // Initialize _visited_cells - _visited_cells.resize(_P.at(_dim), false) ; - + } } // initialize_cells implementation diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index d1068d2aae26..fcb58289da83 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -8,7 +8,7 @@ //#include "config.h" #include "Simplex.hpp" #include "Abstract_simplicial_chain_complex.hpp" -#include "hdvf.hpp" +#include "hdvf_core.hpp" #include "per_hdvf.hpp" #include "sub_chain_complex.hpp" #include "tools_io.hpp" @@ -31,7 +31,7 @@ namespace CGAL { /** \brief vtk export for SimpComplex */ template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix, typename VertexIdType = int> -void Simp_output_vtk (HDVF, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") +void Simp_output_vtk (HDVF_core, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") { typedef Simplicial_chain_complex ComplexType; // Export PSC labelling diff --git a/HDVF/include/CGAL/HDVF/hdvf_core.hpp b/HDVF/include/CGAL/HDVF/hdvf_core.hpp index 04a1b00d8f7d..858d0d62bbc0 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_core.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_core.hpp @@ -73,8 +73,8 @@ struct PairCell { * * The HDVF_core class contains all functions to build HDVF_core, create perfect HDVF_core (A and associate finders) and delineated generators through HDVF_core operations (R, M, W, MW and associate finders). * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ComplexType The type of complex (default is SimpComplex) + * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam ComplexType The type of complex (default is SimpComplex) * * \author Bac A. * \version 0.1.0 @@ -82,14 +82,14 @@ struct PairCell { */ -template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> +template typename ChainType = OSM::Chain, template typename SparseMatrixType = OSM::SparseMatrix> class HDVF_core { public: /** \brief Typedefs for coefficient type and different chain and matrix types. */ - typedef _ChainType<_CoefficientType, OSM::COLUMN> CChain; - typedef _ChainType<_CoefficientType, OSM::ROW> RChain; - typedef _SparseMatrixType<_CoefficientType, OSM::COLUMN> CMatrix; - typedef _SparseMatrixType<_CoefficientType, OSM::ROW> RMatrix; + typedef ChainType CChain; + typedef ChainType RChain; + typedef SparseMatrixType CMatrix; + typedef SparseMatrixType RMatrix; protected: // Properties @@ -111,14 +111,14 @@ class HDVF_core { std::vector _DD_col; /** \brief Reference to the underlying complex. */ - const _ComplexType& _K; + const ComplexType& _K; /** \brief HDVF_core options for computation (computation of partial reduction). */ int _hdvf_opt; public: // Constructor - default : full reduction computed, no sub-complex - HDVF_core(const _ComplexType& K, int hdvf_opt = OPT_FULL) ; + HDVF_core(const ComplexType& K, int hdvf_opt = OPT_FULL) ; // Copy constructor HDVF_core(const HDVF_core& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } // Destructor @@ -179,17 +179,17 @@ class HDVF_core { // Method to project a chain onto P, S, or C cells template - _ChainType<_CoefficientType, ChainTypeFlag> projection(const _ChainType<_CoefficientType, ChainTypeFlag>& chain, FlagType flag, int dim) const { + ChainType projection(const ChainType& chain, FlagType flag, int dim) const { // Create a new chain to store the result // Better to initialize 'result' directly with the correct size and iterate over it - _ChainType<_CoefficientType, ChainTypeFlag> result(chain); + ChainType result(chain); // Iterate over each element of the chain std::vector tmp ; - for (typename _ChainType<_CoefficientType, ChainTypeFlag>::const_iterator it = result.cbegin(); it != result.cend(); ++it) + for (typename ChainType::const_iterator it = result.cbegin(); it != result.cend(); ++it) { int cell_index = it->first; - _CoefficientType value = it->second; + CoefficientType value = it->second; // Check the flag of the corresponding cell if (_flag[dim][cell_index] != flag) { @@ -351,8 +351,8 @@ class HDVF_core { }; // Constructor for the HDVF_core class -template typename _ChainType, template typename _SparseMatrixType> -HDVF_core::HDVF_core(const ComplexType& K, int hdvf_opt) : _K(K) { +template typename ChainType, template typename SparseMatrixType> +HDVF_core::HDVF_core(const ComplexType& K, int hdvf_opt) : _K(K) { // Get the dimension of the simplicial complex int dim = _K.dim(); std::cout << "----> Starting HDVF_core creation / dim " << dim << std::endl ; @@ -414,8 +414,8 @@ HDVF_core::HDVF_cor } // Method to print the matrices -template typename _ChainType, template typename _SparseMatrixType> -std::ostream& HDVF_core::print_matrices(std::ostream& out) const { +template typename ChainType, template typename SparseMatrixType> +std::ostream& HDVF_core::print_matrices(std::ostream& out) const { // Iterate through each dimension and print the corresponding matrices for (int q = 0; q <= _K.dim(); ++q) { out << "------- Dimension " << q << std::endl; @@ -452,8 +452,8 @@ std::ostream& HDVF_core -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF_core::findPairA(int q, bool &found) // const +template typename ChainType, template typename SparseMatrixType> +PairCell HDVF_core::findPairA(int q, bool &found) // const { found = false; PairCell p; @@ -479,8 +479,8 @@ PairCell HDVF_core: /** \brief find a valid PairCell containing tau for A in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF_core::findPairA(int q, bool &found, int tau) // const +template typename ChainType, template typename SparseMatrixType> +PairCell HDVF_core::findPairA(int q, bool &found, int tau) // const { found = false; PairCell p ; @@ -515,8 +515,8 @@ PairCell HDVF_core: /** \brief find all the valid PairCell for A in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF_core::findPairsA(int q, bool &found) // const +template typename ChainType, template typename SparseMatrixType> +std::vector HDVF_core::findPairsA(int q, bool &found) // const { std::vector pairs; found = false ; @@ -544,8 +544,8 @@ std::vector HDVF_core -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF_core::findPairsA(int q, bool &found, int tau) // const +template typename ChainType, template typename SparseMatrixType> +std::vector HDVF_core::findPairsA(int q, bool &found, int tau) // const { found = false; std::vector pairs; @@ -588,8 +588,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//PairCell HDVF_core::findPairM(int q, bool &found) // const +//template typename ChainType, template typename SparseMatrixType> +//PairCell HDVF_core::findPairM(int q, bool &found) // const //{ // found = false; // PairCell p; @@ -618,8 +618,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//PairCell HDVF_core::findPairM(int q, bool &found, int tau) // const +//template typename ChainType, template typename SparseMatrixType> +//PairCell HDVF_core::findPairM(int q, bool &found, int tau) // const //{ // found = false; // PairCell p; @@ -663,8 +663,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//std::vector HDVF_core::findPairsM(int q, bool &found) // const +//template typename ChainType, template typename SparseMatrixType> +//std::vector HDVF_core::findPairsM(int q, bool &found) // const //{ // found = false; // std::vector pairs; @@ -694,8 +694,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//std::vector HDVF_core::findPairsM(int q, bool &found, int tau) // const +//template typename ChainType, template typename SparseMatrixType> +//std::vector HDVF_core::findPairsM(int q, bool &found, int tau) // const //{ // found = false; // std::vector pairs; @@ -747,8 +747,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//PairCell HDVF_core::findPairW(int q, bool &found) // const +//template typename ChainType, template typename SparseMatrixType> +//PairCell HDVF_core::findPairW(int q, bool &found) // const //{ // found = false; // PairCell p; @@ -777,8 +777,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//PairCell HDVF_core::findPairW(int q, bool &found, int tau) // const +//template typename ChainType, template typename SparseMatrixType> +//PairCell HDVF_core::findPairW(int q, bool &found, int tau) // const //{ // found = false; // PairCell p; @@ -822,8 +822,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//std::vector HDVF_core::findPairsW(int q, bool &found) // const +//template typename ChainType, template typename SparseMatrixType> +//std::vector HDVF_core::findPairsW(int q, bool &found) // const //{ // found = false; // std::vector pairs; @@ -854,8 +854,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//std::vector HDVF_core::findPairsW(int q, bool &found, int tau) // const +//template typename ChainType, template typename SparseMatrixType> +//std::vector HDVF_core::findPairsW(int q, bool &found, int tau) // const //{ // found = false; // std::vector pairs; @@ -907,8 +907,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//PairCell HDVF_core::findPairMW(int q, bool &found) // const +//template typename ChainType, template typename SparseMatrixType> +//PairCell HDVF_core::findPairMW(int q, bool &found) // const //{ // found = false; // PairCell p; @@ -951,8 +951,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//PairCell HDVF_core::findPairMW(int q, bool &found, int tau) // const +//template typename ChainType, template typename SparseMatrixType> +//PairCell HDVF_core::findPairMW(int q, bool &found, int tau) // const //{ // found = false; // PairCell p; @@ -1040,8 +1040,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//std::vector HDVF_core::findPairsMW(int q, bool &found) // const +//template typename ChainType, template typename SparseMatrixType> +//std::vector HDVF_core::findPairsMW(int q, bool &found) // const //{ // found = false; // std::vector pairs; @@ -1087,8 +1087,8 @@ std::vector HDVF_core -//template typename _ChainType, template typename _SparseMatrixType> -//std::vector HDVF_core::findPairsMW(int q, bool &found, int tau) // const +//template typename ChainType, template typename SparseMatrixType> +//std::vector HDVF_core::findPairsMW(int q, bool &found, int tau) // const //{ // found = false; // std::vector pairs; @@ -1182,8 +1182,8 @@ std::vector HDVF_core -template typename _ChainType, template typename _SparseMatrixType> -void HDVF_core::A(int tau1, int tau2, int q) { +template typename ChainType, template typename SparseMatrixType> +void HDVF_core::A(int tau1, int tau2, int q) { //----------------------------------------------- Submatrices of D ---------------------------------------------------- // Output operation details to the console @@ -1313,8 +1313,8 @@ void HDVF_core::A(i //// Method to perform operation R //// pi is in dimension q, sigma is in dimension q+1 ////template -//template typename _ChainType, template typename _SparseMatrixType> -//void HDVF_core::R(int pi, int sigma, int q) { +//template typename ChainType, template typename SparseMatrixType> +//void HDVF_core::R(int pi, int sigma, int q) { // //----------------------------------------------- Submatrices of H ---------------------------------------------------- // // if (_hdvf_opt & OPT_FULL) @@ -1432,8 +1432,8 @@ void HDVF_core::A(i //// Method to perform operation M //// pi is in dimension q, gamma is in dimension q ////template -//template typename _ChainType, template typename _SparseMatrixType> -//void HDVF_core::M(int pi, int gamma, int q) { +//template typename ChainType, template typename SparseMatrixType> +//void HDVF_core::M(int pi, int gamma, int q) { // //----------------------------------------------- Submatrices of F ---------------------------------------------------- // // if (_hdvf_opt & OPT_FULL) @@ -1556,8 +1556,8 @@ void HDVF_core::A(i //// Method to perform operation W //// gamma is in dimension q, sigma is in dimension q // -//template typename _ChainType, template typename _SparseMatrixType> -//void HDVF_core::W(int sigma, int gamma, int q) { +//template typename ChainType, template typename SparseMatrixType> +//void HDVF_core::W(int sigma, int gamma, int q) { // // //----------------------------------------------- Submatrices of G ---------------------------------------------------- // @@ -1681,8 +1681,8 @@ void HDVF_core::A(i //// Method to perform operation MW //// gamma is in dimension q, sigma is in dimension q // -//template typename _ChainType, template typename _SparseMatrixType> -//void HDVF_core::MW(int pi, int sigma, int q) { +//template typename ChainType, template typename SparseMatrixType> +//void HDVF_core::MW(int pi, int sigma, int q) { // // //----------------------------------------------- Submatrices of G ---------------------------------------------------- // @@ -1802,8 +1802,8 @@ void HDVF_core::A(i // Method to compute a perfect HDVF_core (Higher Dimensional Vector Field) // Returns a vector of PairCell objects representing the pairs found -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF_core::computePerfectHDVF(bool verbose) { +template typename ChainType, template typename SparseMatrixType> +std::vector HDVF_core::computePerfectHDVF(bool verbose) { std::vector pair_list; // Vector to store the list of pairs bool trouve = false; // Flag to indicate whether a pair was found int dim = _K.dim(); // Get the dimension of the complex K @@ -1843,8 +1843,8 @@ std::vector HDVF_core typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF_core::computeRandPerfectHDVF(bool verbose) { +template typename ChainType, template typename SparseMatrixType> +std::vector HDVF_core::computeRandPerfectHDVF(bool verbose) { std::vector pair_list; // Vector to store the list of pairs bool trouve = false; // Flag to indicate whether a pair was found int dim = _K.dim(); // Get the dimension of the complex K @@ -1892,8 +1892,8 @@ std::vector HDVF_core -template typename _ChainType, template typename _SparseMatrixType> -std::vector > HDVF_core::get_flag (FlagType flag) const +template typename ChainType, template typename SparseMatrixType> +std::vector > HDVF_core::get_flag (FlagType flag) const { std::vector > res(_K.dim()+1) ; for (int q=0; q<=_K.dim(); ++q) @@ -1909,8 +1909,8 @@ std::vector > HDVF_core -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF_core::get_flag_dim (FlagType flag, int q) const +template typename ChainType, template typename SparseMatrixType> +std::vector HDVF_core::get_flag_dim (FlagType flag, int q) const { std::vector res ; for (int i=0; i<_K.nb_cells(q); ++i) @@ -1923,8 +1923,8 @@ std::vector HDVF_core -template typename _ChainType, template typename _SparseMatrixType> -std::ostream& HDVF_core::print_reduction(std::ostream& out) // const +template typename ChainType, template typename SparseMatrixType> +std::ostream& HDVF_core::print_reduction(std::ostream& out) // const { // Print PSC out << "----- flags of cells:" << std::endl; @@ -1999,8 +1999,8 @@ std::ostream& HDVF_core -template typename _ChainType, template typename _SparseMatrixType> -std::ostream& HDVF_core::print_pairs(const std::vector& pairs, std::ostream& out) // const +template typename ChainType, template typename SparseMatrixType> +std::ostream& HDVF_core::print_pairs(const std::vector& pairs, std::ostream& out) // const { for (const auto& pair : pairs) { out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp index bcc824ae1743..e7016ae398a8 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -13,7 +13,7 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" -#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/HDVF/hdvf_core.hpp" #include "CGAL/HDVF/sub_chain_complex.hpp" #include "CGAL/HDVF/SubSparseMatrix.hpp" @@ -34,14 +34,14 @@ namespace CGAL { */ template -class Dual_HDVF : public HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> { +class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> { private: // Matrices types typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; typedef OSM::Chain<_CoefficientType, OSM::ROW> RChain; // HDVF Type - typedef HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; + typedef HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; // Complex L const _ComplexType& _L ; @@ -443,7 +443,7 @@ class Dual_HDVF : public HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::S template Dual_HDVF<_CoefficientType,_ComplexType>::Dual_HDVF(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt) : -HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} +HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} /** \brief find a valid PairCell for A in dimension q */ template @@ -587,7 +587,7 @@ std::vector Dual_HDVF<_CoefficientType,_ComplexType>::findPairsA(int q template void Dual_HDVF<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() { - std::cout << "==== Compute perfect HDVF over K" << endl ; + std::cout << endl << "==== Compute perfect HDVF over K" << endl ; // Set _subCC to K _subCC = _KCC ; // Restrict _DD_col accordingly @@ -598,7 +598,7 @@ void Dual_HDVF<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() // this->print_matrices() ; // this->print_reduction() ; - std::cout << "==== Compute perfect HDVF over L-K" << endl ; + std::cout << endl << "==== Compute perfect HDVF over L-K" << endl ; // set _subCC to L-K _subCC = _KCC.complement() ; // Restrict _DD_col accordingly @@ -619,7 +619,7 @@ std::vector Dual_HDVF<_CoefficientType,_ComplexType>::computePairingHD { // TODO : check both HDVFs are perfect - std::cout << "==== Compute pairing" << endl ; + std::cout << endl << "==== Compute pairing" << endl ; // Create a full SubChainComplex _subCC = SubChainComplex<_CoefficientType, _ComplexType>(_L) ; diff --git a/HDVF/include/CGAL/HDVF/per_hdvf.hpp b/HDVF/include/CGAL/HDVF/per_hdvf.hpp index ac20bd8cd8dc..11f719c09d30 100644 --- a/HDVF/include/CGAL/HDVF/per_hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/per_hdvf.hpp @@ -18,7 +18,7 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/HDVF/SubSparseMatrix.hpp" -#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/HDVF/hdvf_core.hpp" /** * \class Filtration class @@ -382,7 +382,7 @@ ostream& operator<< (ostream& out, const PerHoleT<_DegType>& hole) template -class PersistentHDVF : public HDVF<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix> +class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix> { // Matrices types typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; @@ -391,7 +391,7 @@ class PersistentHDVF : public HDVF<_CoefficientType,_ComplexType, OSM::Chain, OS typedef OSM::SubSparseMatrix<_CoefficientType, OSM::ROW> RMatrix; // HDVF type - typedef HDVF<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; + typedef HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; // Persistence diagram types typedef PerDegIntervalT<_DegType> PerDegInterval; @@ -835,7 +835,7 @@ class PersistentHDVF : public HDVF<_CoefficientType,_ComplexType, OSM::Chain, OS template -PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::PersistentHDVF(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt, bool with_export) : HDVF<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix>(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1), _computation_over(false) +PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::PersistentHDVF(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt, bool with_export) : HDVF_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix>(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1), _computation_over(false) { // Initialisation of _t_dim, _K_to_per and _per_to_K _t_dim.resize(this->_K.dim()+1, 0) ; From 01dcca5b76a6331cf05467aa701c86c081dfd4ca Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Thu, 1 May 2025 16:56:14 +0200 Subject: [PATCH 011/343] Changed Hdvf class names + namespace - Changed classes names from HDVF to Hdvf - Uniformized classes names: Hdvf_duality and Hdvf_persistence - namespace: HDVF --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 2 +- HDVF/doc/HDVF/Concepts/HDVF.h | 54 +- HDVF/examples/HDVF/arguments.cpp | 1 + HDVF/examples/HDVF/arguments.h | 2 +- HDVF/examples/HDVF/main_dual_hdvf.cpp | 11 +- HDVF/examples/HDVF/main_hdvf.cpp | 41 +- HDVF/examples/HDVF/main_per_hdvf.cpp | 9 +- .../Abstract_simplicial_chain_complex.hpp | 52 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 13 +- .../CGAL/HDVF/Cubical_chain_complex.hpp | 38 +- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 11 +- HDVF/include/CGAL/HDVF/Simplex.hpp | 4 +- HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 5 +- HDVF/include/CGAL/HDVF/Zp.hpp | 4 +- HDVF/include/CGAL/HDVF/hdvf.hpp | 132 +- HDVF/include/CGAL/HDVF/hdvf_core.hpp | 581 +++++---- HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 56 +- HDVF/include/CGAL/HDVF/hdvf_tools.hpp | 8 +- HDVF/include/CGAL/HDVF/per_hdvf.hpp | 28 +- HDVF/include/CGAL/HDVF/sub_chain_complex.hpp | 4 +- HDVF/include/CGAL/HDVF/tools_io.hpp | 4 +- HDVF/include/CGAL/OSM/Bitboard.hpp | 195 +-- HDVF/include/CGAL/OSM/Chain.hpp | 129 +- HDVF/include/CGAL/OSM/SparseMatrix.hpp | 1122 +++++++++-------- HDVF/include/CGAL/OSM/__base.hpp | 103 +- 25 files changed, 1335 insertions(+), 1274 deletions(-) diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h index f79f8d478b30..246c674f9417 100644 --- a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -14,7 +14,7 @@ The concept `AbstractChainComplex` describes the requirements for (topological) \cgalHasModelsBegin -\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} +\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} \cgalHasModelsEnd */ diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h index a6b8ee718044..b4fae0dae67b 100644 --- a/HDVF/doc/HDVF/Concepts/HDVF.h +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -16,15 +16,59 @@ The concept `HDVF` describes the requirements for Homological Discrete Vector Fi - `compute_rand_perfect_hdvf` which computes a perfect random HDVF by chosing at each step a rand A-pairing among all possible ones (this option is thus slower) \cgalHasModelsBegin -\cgalHasModelsBare{`HDVF_core`} -\cgalHasModelsBare{`HDVF`} -\cgalHasModelsBare{`HDVF_persistence`} -\cgalHasModelsBare{`HDVF_duality`} +\cgalHasModelsBare{`HDVF_core`} +\cgalHasModelsBare{`HDVF`} +\cgalHasModelsBare{`HDVF_persistence`} +\cgalHasModelsBare{`HDVF_duality`} \cgalHasModelsEnd + \sa `AbstractChainComplex` + \sa `Ring` + \sa `SparseChain` + \sa `SparseMatrix` + + \warning How to describe constants declared in the namespace HDVF and used everywhere? + + /** \brief Enum for the HDVF_core label of cells. */ + static enum FlagType { + PRIMARY, + SECONDARY, + CRITICAL, + NONE // For duality and persistence + }; + + /** \brief HDVF_core options (compute only reduced boundary). */ + const int OPT_BND = 0b0001; + /** \brief HDVF_core options (compute only reduced boundary and f). */ + const int OPT_F = 0b0010; + /** \brief HDVF_core options (compute only reduced boundary and g). */ + const int OPT_G = 0b0100; + /** \brief HDVF_core options (compute full reduction). */ + const int OPT_FULL = 0b1000; + + /** \brief Enum for export: lets chose the type of export. + * + * - PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) + * - FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) + * - G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) + */ + enum ExportType { + PSC, + FSTAR, + G + }; + + /** \brief PairCell: Structure to represent a pair of cells (for HDVF operations). + */ + struct PairCell { + int sigma; // Index of the first cell + int tau; // Index of the second cell + int dim; // Dimension of cells: q/q+1 for A and R, q for other operations + }; + */ -class AbstractChainComplex +class HDVF { public: /// \name Types diff --git a/HDVF/examples/HDVF/arguments.cpp b/HDVF/examples/HDVF/arguments.cpp index d784a54425a1..49ff5868ecef 100644 --- a/HDVF/examples/HDVF/arguments.cpp +++ b/HDVF/examples/HDVF/arguments.cpp @@ -4,6 +4,7 @@ using namespace std ; using namespace CGAL ; +using namespace HDVF ; void usage() { diff --git a/HDVF/examples/HDVF/arguments.h b/HDVF/examples/HDVF/arguments.h index ab5da5192496..d216dec813a8 100644 --- a/HDVF/examples/HDVF/arguments.h +++ b/HDVF/examples/HDVF/arguments.h @@ -12,7 +12,7 @@ struct Options std::string outfile_root = "res", in_file ; Algorithm algorithm = Algorithm::HDVF ; InputFormat in_format = InputFormat::OFF ; - int HDVF_opt = CGAL::OPT_FULL ; + int HDVF_opt = CGAL::HDVF::OPT_FULL ; int scalar = 0 ; // 0 : Z, n : Z/nZ bool with_export = true ; // Export reduction information to a file bool with_vtk_export = false ; // Export generators/cogenerators and PSC labels as vtk diff --git a/HDVF/examples/HDVF/main_dual_hdvf.cpp b/HDVF/examples/HDVF/main_dual_hdvf.cpp index cd07d34968f0..da0be54f778e 100644 --- a/HDVF/examples/HDVF/main_dual_hdvf.cpp +++ b/HDVF/examples/HDVF/main_dual_hdvf.cpp @@ -27,6 +27,7 @@ //#define SCALAR 5 using namespace CGAL ; +using namespace HDVF ; template void mesh_complex_output(const MeshType& mesh, const ComplexType& L, const SubChainComplex& K, const Options& options) @@ -56,7 +57,7 @@ inline ostream& dual_pairs_output(const std::vector& pairs, ostream& o } template -void dual_HDVF_pair (Dual_HDVF& dual_hdvf, const Options &options) +void dual_HDVF_pair (Hdvf_duality& dual_hdvf, const Options &options) { // Compute pairing std::vector pairs = dual_hdvf.computePairingHDVF() ; @@ -81,9 +82,9 @@ void dual_HDVF_pair (Dual_HDVF& dual_hdvf, const O } template -Dual_HDVF& dual_HDVF_comput (const ComplexType& L, SubChainComplex& K, const Options &options) +Hdvf_duality& dual_HDVF_comput (const ComplexType& L, SubChainComplex& K, const Options &options) { - using HDVFType = Dual_HDVF ; + using HDVFType = Hdvf_duality ; using SubCCType = SubChainComplex ; HDVFType& hdvf(*(new HDVFType(L, K, options.HDVF_opt))); @@ -153,7 +154,7 @@ void main_code (const Options &options) else if (options.in_format == InputFormat::OFF) { using ComplexType = Simplicial_chain_complex ; - using HDVFType = Dual_HDVF ; + using HDVFType = Hdvf_duality ; using ToolsType = Duality_simplicial_complex_tools ; using SubCCType = SubChainComplex ; @@ -201,7 +202,7 @@ void main_code (const Options &options) else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) { using ComplexType = Cubical_chain_complex ; - using HDVFType = Dual_HDVF ; + using HDVFType = Hdvf_duality ; using SubCCType = SubChainComplex ; using ToolsType = Duality_cubical_complex_tools ; diff --git a/HDVF/examples/HDVF/main_hdvf.cpp b/HDVF/examples/HDVF/main_hdvf.cpp index e4cbfbe4d35c..74b988ef9b2c 100644 --- a/HDVF/examples/HDVF/main_hdvf.cpp +++ b/HDVF/examples/HDVF/main_hdvf.cpp @@ -1,6 +1,6 @@ -// HDVF off files +// Hdvf off files // -------- -// Computes a "perfect" HDVF and provides a batch mode to specify arguments +// Computes a "perfect" Hdvf and provides a batch mode to specify arguments // For help: hdvf -h // -------- // A. Bac @@ -10,26 +10,27 @@ #include #include #include -#include "CGAL/HDVF/Zp.hpp" -#include "CGAL/HDVF/Simplex.hpp" -#include "CGAL/HDVF/tools_io.hpp" -#include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" -#include "CGAL/HDVF/SimpComplexTools.hpp" -#include "CGAL/HDVF/Cubical_chain_complex.hpp" -#include "CGAL/HDVF/CubComplexTools.hpp" -#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/Hdvf/Zp.hpp" +#include "CGAL/Hdvf/Simplex.hpp" +#include "CGAL/Hdvf/tools_io.hpp" +#include "CGAL/Hdvf/Abstract_simplicial_chain_complex.hpp" +#include "CGAL/Hdvf/SimpComplexTools.hpp" +#include "CGAL/Hdvf/Cubical_chain_complex.hpp" +#include "CGAL/Hdvf/CubComplexTools.hpp" +#include "CGAL/Hdvf/hdvf.hpp" #include "CGAL/OSM/OSM.hpp" -#include "CGAL/HDVF/hdvf_tools.hpp" +#include "CGAL/Hdvf/hdvf_tools.hpp" #include "arguments.h" using namespace CGAL ; +using namespace HDVF ; // ------- A ring // For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly //#define SCALAR 5 -// HDVF computation, output and export +// Hdvf computation, output and export template void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const Options& options) @@ -47,9 +48,9 @@ void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const } template -HDVF& HDVF_comput (const ComplexType& complex, const Options &options) +Hdvf& HDVF_comput (const ComplexType& complex, const Options &options) { - HDVF& hdvf(*(new HDVF(complex, options.HDVF_opt))); + Hdvf& hdvf(*(new Hdvf(complex, options.HDVF_opt))); std::vector pairs ; if (!options.random) pairs = hdvf.computePerfectHDVF(options.verbose); @@ -89,7 +90,7 @@ void main_code (const Options &options) if (options.in_format == InputFormat::SIMP) { using ComplexType = Abstract_simplicial_chain_complex ; - using HDVFType = HDVF ; + using HDVFType = Hdvf ; // MeshObject Mesh_object mesh ; @@ -100,7 +101,7 @@ void main_code (const Options &options) mesh_complex_output(mesh, complex, options) ; - // HDVF computation, export, output + // Hdvf computation, export, output HDVFType hdvf(HDVF_comput(complex, options)) ; // Export to vtk @@ -110,7 +111,7 @@ void main_code (const Options &options) else if (options.in_format == InputFormat::OFF) { using ComplexType = Simplicial_chain_complex ; - using HDVFType = HDVF ; + using HDVFType = Hdvf ; // MeshObject Mesh_object mesh ; @@ -121,7 +122,7 @@ void main_code (const Options &options) mesh_complex_output(mesh, complex, options) ; - // HDVF computation, export, output + // Hdvf computation, export, output HDVFType hdvf(HDVF_comput(complex, options)) ; // Loop on operations with vtk export @@ -145,7 +146,7 @@ void main_code (const Options &options) else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) { using ComplexType = Cubical_chain_complex ; - using HDVFType = HDVF ; + using HDVFType = Hdvf ; Cub_object mesh ; typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; @@ -170,7 +171,7 @@ void main_code (const Options &options) mesh_complex_output(mesh, complex, options) ; - // HDVF computation, export, output + // Hdvf computation, export, output HDVFType hdvf(HDVF_comput(complex, options)) ; // Loop on operations with vtk export diff --git a/HDVF/examples/HDVF/main_per_hdvf.cpp b/HDVF/examples/HDVF/main_per_hdvf.cpp index 05ee1e92d4c9..b8153f64bc90 100644 --- a/HDVF/examples/HDVF/main_per_hdvf.cpp +++ b/HDVF/examples/HDVF/main_per_hdvf.cpp @@ -24,6 +24,7 @@ #include "arguments.h" using namespace CGAL ; +using namespace HDVF ; // ------- A ring // For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly @@ -77,9 +78,9 @@ void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const } template -PersistentHDVF& per_HDVF_comput (const ComplexType& complex, const Filtration& f, const Options &options) +Hdvf_persistence& per_HDVF_comput (const ComplexType& complex, const Filtration& f, const Options &options) { - typedef PersistentHDVF HDVFType ; + typedef Hdvf_persistence HDVFType ; HDVFType& hdvf(*(new HDVFType(complex, f, options.HDVF_opt, options.with_vtk_export))); cout << "----> START computing persistent homology" << endl ; @@ -188,7 +189,7 @@ void main_code (const Options &options) else if (options.in_format == InputFormat::OFF) { using ComplexType = Simplicial_chain_complex ; - using HDVFType = PersistentHDVF ; + using HDVFType = Hdvf_persistence ; // MeshObject Mesh_object mesh ; @@ -216,7 +217,7 @@ void main_code (const Options &options) else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) { using ComplexType = Cubical_chain_complex ; - using HDVFType = PersistentHDVF ; + using HDVFType = Hdvf_persistence ; Cub_object mesh ; typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; diff --git a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp index 55efc71bbb33..8285370851ac 100644 --- a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp @@ -21,31 +21,32 @@ #include "CGAL/OSM/OSM.hpp" namespace CGAL { +namespace HDVF { // Forward declaration of SimpComplexTools template class Duality_simplicial_complex_tools ; /*! -\ingroup PkgHDVFAlgorithmClasses - -The class `Abstract_simplicial_chain_complex` represents (topological) chain complexes associated to abstract simplicial complexes. - -An abstract simplicial complex is a set of simplices, also called cells (class `Simplex`) such that: all the faces of a given simplex also belong to the complex and any two simplices intersect exactly along a common face. - - - -A simplex of dimension q contains exactly q+1 vertices (we will thus denote it by \f$\langle v_0, \ldots, v_q \rangle\f$). A 0-cell is thus a vertex, a 1-cell contains two vertices (edge), a 2-cell contains three vertices (triangle) while a 3-cell is a tetrahedron. + \ingroup PkgHDVFAlgorithmClasses + + The class `Abstract_simplicial_chain_complex` represents (topological) chain complexes associated to abstract simplicial complexes. -The boundary map of the complex is computed by the constructor of the class using the standard formula: + An abstract simplicial complex is a set of simplices, also called cells (class `Simplex`) such that: all the faces of a given simplex also belong to the complex and any two simplices intersect exactly along a common face. + + + + A simplex of dimension q contains exactly q+1 vertices (we will thus denote it by \f$\langle v_0, \ldots, v_q \rangle\f$). A 0-cell is thus a vertex, a 1-cell contains two vertices (edge), a 2-cell contains three vertices (triangle) while a 3-cell is a tetrahedron. + + The boundary map of the complex is computed by the constructor of the class using the standard formula: \f[ \partial_q\left( \langle v_0, \ldots, v_q \rangle\right) = \sum_{i=0}^q (-1)^i\cdot \langle v_0, \ldots, \widehat{v_i}, \cdots, v_q \rangle\f] where \f$\langle v_0, \ldots, \widehat{v_i}, \cdots, v_q \rangle\f$ denotes the \f$q-1\f$-simplex with \f$v_i\f$ omitted. Hence, matrices of boundary maps are stored in each dimension using sparse matrices (in column-major mode). - -Let us also point out that cells are indexed along each dimension, thus each simplex is uniquely determined by its dimension and its index in this dimension. - -\cgalModels{AbstractChainComplex} - -\tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). -*/ + + Let us also point out that cells are indexed along each dimension, thus each simplex is uniquely determined by its dimension and its index in this dimension. + + \cgalModels{AbstractChainComplex} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). + */ template @@ -361,14 +362,14 @@ std::ostream& Abstract_simplicial_chain_complex::print_complex( } /*! -\ingroup PkgHDVFAlgorithmClasses - -The class `Simplicial_chain_complex` refines the `Abstract_simplicial_chain_complex` class by assigning coordinates to vertices (ie. 0-simplices). Hence, vtk output is available. - -\cgalModels{GeometricChainComplex} - -\tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). -*/ + \ingroup PkgHDVFAlgorithmClasses + + The class `Simplicial_chain_complex` refines the `Abstract_simplicial_chain_complex` class by assigning coordinates to vertices (ie. 0-simplices). Hence, vtk output is available. + + \cgalModels{GeometricChainComplex} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). + */ template class Simplicial_chain_complex : public Abstract_simplicial_chain_complex { @@ -681,6 +682,7 @@ void Simplicial_chain_complex::Simplicial_chain_complex_chain_t out.close() ; } +} /* end namespace HDVF */ } /* end namespace CGAL */ #endif // CGAL_ABSTRAT_SIMPLICIAL_CHAIN_COMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index a01985e5a677..bb1153d45ba5 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -36,10 +36,12 @@ // CubComplex namespace CGAL { +namespace HDVF { template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> -void Cub_output_vtk (HDVF_core, _ChainType, _SparseMatrixType> &hdvf, Cubical_chain_complex &complex, string filename = "test") +void Cub_output_vtk (Hdvf_core, _ChainType, _SparseMatrixType> &hdvf, Cubical_chain_complex &complex, string filename = "test") { + typedef Hdvf_core, _ChainType, _SparseMatrixType> HDVF_type; typedef Cubical_chain_complex ComplexType; // Export PSC labelling vector > labels = hdvf.export_labelsPSC() ; @@ -75,7 +77,7 @@ void Cub_output_vtk (HDVF_core, _Chain } } } -// vector > criticals(hdvf.get_flag(CRITICAL)) ; +// vector > criticals(hdvf.get_flag(HDVF_coreT::CRITICAL)) ; // for (int q = 0; q <= complex.dim(); ++q) // { // for (int c : criticals.at(q)) @@ -156,12 +158,12 @@ class Duality_cubical_complex_tools { /** \brief Export persistent information to vtk files */ template -void Per_Cub_output_vtk (PersistentHDVF, DegType> &per_hdvf, Cubical_chain_complex &complex, string filename = "per") +void Per_Cub_output_vtk (Hdvf_persistence, DegType> &per_hdvf, Cubical_chain_complex &complex, string filename = "per") { if (!per_hdvf.with_export()) throw("Cannot export persistent generators to vtk: with_export is off!") ; - using perHDVFType = PersistentHDVF, DegType> ; + using perHDVFType = Hdvf_persistence, DegType> ; using ComplexType = Cubical_chain_complex ; using PerHole = PerHoleT ; // Iterate over persistence diagram (iterator over non zero intervals) @@ -221,6 +223,7 @@ void Per_Cub_output_vtk (PersistentHDVF(per_hdvf, complex, filename+"_inf") ; } -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif // Duality_cubical_complex_tools_HPP diff --git a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp index 833eb0b1686b..05d25b3bb542 100644 --- a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp @@ -20,6 +20,7 @@ #include "CGAL/OSM/OSM.hpp" namespace CGAL { +namespace HDVF { // Forward declaration of Duality_cubical_complex_tools template class Duality_cubical_complex_tools ; @@ -35,16 +36,16 @@ ostream & operator<<(ostream & out, std::vector c) } /*! -\ingroup PkgHDVFAlgorithmClasses - -The class `Cubical_chain_complex` represents (topological) chain complexes associated to cubical complexes. - + \ingroup PkgHDVFAlgorithmClasses + + The class `Cubical_chain_complex` represents (topological) chain complexes associated to cubical complexes. + \paragraph Description -An cubical complex is a set of "square" cells such that: all the faces of a given cell also belong to the complex and any two cells intersect exactly along a common face. - - - + An cubical complex is a set of "square" cells such that: all the faces of a given cell also belong to the complex and any two cells intersect exactly along a common face. + + + A cell in a cubical complex of dimension q is the cartesian product of \f$q\f$ intervals \f$[n_1,n_1+\delta_1]\times [n_q,n_q+\delta_q] \f$ with \f$n_i\in \mathbb N \f$ and \f$\delta_i = 0,1\f$. The dimension of such a cell is \f$\sum_{i=1}^q \delta_i\f$. A 0-cell is thus a vertex, a 1-cell contains one non zero delta (edge along one of the axes), a 2-cell contains two non zero deltas (square along two of the axes), while a 3-cell is a cube... @@ -62,13 +63,13 @@ An cubical complex is a set of "square" cells such that: all the faces of a give The dimension of a cell is the given by the number of odd coordinates. In our previous example, \f$B_1=3, B_2=2, B_3=1\f$, hence \f$N_1=7, N_2=5, N_3=3\f$ and we get the following Khalimsky coordinates: \f$\mathrm{khal}(v) = (4,2,0)\f$, \f$\mathrm{khal}(e) = (1,2,0)\f$ and \f$\mathrm{khal}(f) = (5,1,2)\f$. -The boundary map of the complex is computed by the constructor of the class using the standard formula with Khalimsky coordinates. Given a cell \f$\sigma\f$ with \f$\mathrm{khal}(\sigma) = (x_1,\ldots,x_q)\f$ + The boundary map of the complex is computed by the constructor of the class using the standard formula with Khalimsky coordinates. Given a cell \f$\sigma\f$ with \f$\mathrm{khal}(\sigma) = (x_1,\ldots,x_q)\f$ \f[ \partial(x_1,\ldots,x_q) = \sum_{\substack{i=0\\x_i\text{ odd}}}^q (-1)^{j(i)} \left( (x_1,\ldots,x_i+1,\ldots, x_q) - (x_1,\ldots,x_i-1,\ldots, x_q)\right)\f] where \f$j(i)\f$ is the number of odd coordinates between \f$x_1\f$ and \f$x_i\f$. - -Let us also point out that besides Khalimsky coordinates, cells are indexed along each dimension, thus each cell is uniquely determined by its dimension and its index in this dimension (called "base index"). + + Let us also point out that besides Khalimsky coordinates, cells are indexed along each dimension, thus each cell is uniquely determined by its dimension and its index in this dimension (called "base index"). \paragraph Implementation Implementation details @@ -79,11 +80,11 @@ Let us also point out that besides Khalimsky coordinates, cells are indexed alon As stated above, besides this boolean representation, topological computations require to identify the bases of cells in any dimension (bases of the free chain groups). Hence, a cell of dimension \f$d\f$ is also identified by its index in the basis of \f$d\f$-dimensional cells. This index is called its *basis index*. The vector `_bool2base` stores, for each dimension, the map between boolean and base indices, while the `_base2bool` stores, for each dimension, the permutation between base and boolean indices. - -\cgalModels{GeometricChainComplex} - -\tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). -*/ + + \cgalModels{GeometricChainComplex} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). + */ template @@ -775,7 +776,7 @@ template std::vector Cubical_chain_complex::calculate_boundaries(int idcell) const { std::vector boundaries; std::vector c = ind2khal(idcell); - + for (int i = 0; i < _dim; ++i) { if (c[i] % 2 == 1) { @@ -1012,6 +1013,7 @@ void Cubical_chain_complex::Cubical_chain_complex_chain_to_vtk( out.close() ; } -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif // CGAL_CUBICAL_CHAIN_COMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index fcb58289da83..e6292bcf7dab 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -25,15 +25,17 @@ */ namespace CGAL { +namespace HDVF { // SimpComplex /** \brief vtk export for SimpComplex */ template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix, typename VertexIdType = int> -void Simp_output_vtk (HDVF_core, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") +void Simp_output_vtk (Hdvf_core, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") { typedef Simplicial_chain_complex ComplexType; + typedef Hdvf_core, _ChainType, _SparseMatrixType> HDVF_type; // Export PSC labelling string outfile(filename+"_PSC.vtk") ; vector > labels = hdvf.export_labelsPSC() ; @@ -157,12 +159,12 @@ class Duality_simplicial_complex_tools { /** \brief Export persistent information to vtk files */ template -void Per_Simp_output_vtk (PersistentHDVF, DegType> &per_hdvf, Simplicial_chain_complex &complex, string filename = "per") +void Per_Simp_output_vtk (Hdvf_persistence, DegType> &per_hdvf, Simplicial_chain_complex &complex, string filename = "per") { if (!per_hdvf.with_export()) throw("Cannot export persistent generators to vtk: with_export is off!") ; - using perHDVFType = PersistentHDVF, DegType> ; + using perHDVFType = Hdvf_persistence, DegType> ; using ComplexType = Simplicial_chain_complex ; using PerHole = PerHoleT ; // Iterate over persistence diagram (iterator over non zero intervals) @@ -222,6 +224,7 @@ void Per_Simp_output_vtk (PersistentHDVF(per_hdvf, complex, filename+"_inf") ; } -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif // SimpComplexTools_HPP diff --git a/HDVF/include/CGAL/HDVF/Simplex.hpp b/HDVF/include/CGAL/HDVF/Simplex.hpp index 07d3661e0ef2..e159fa8fc9f2 100644 --- a/HDVF/include/CGAL/HDVF/Simplex.hpp +++ b/HDVF/include/CGAL/HDVF/Simplex.hpp @@ -8,6 +8,7 @@ #include namespace CGAL { +namespace HDVF { class Simplex { template @@ -75,6 +76,7 @@ class Simplex { } }; -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif // SIMPLEX_HPP diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp index 28353cd3a717..91cafcb39059 100644 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -15,7 +15,7 @@ #include "CGAL/OSM/SparseMatrix.hpp" #include "CGAL/OSM/Bitboard.hpp" - +namespace CGAL { namespace OSM { /** @@ -123,6 +123,7 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { } }; -} +} /* end namespace OSM */ +} /* end namespace CGAL */ #endif diff --git a/HDVF/include/CGAL/HDVF/Zp.hpp b/HDVF/include/CGAL/HDVF/Zp.hpp index 1352778f9cd2..7fa63311a3fd 100644 --- a/HDVF/include/CGAL/HDVF/Zp.hpp +++ b/HDVF/include/CGAL/HDVF/Zp.hpp @@ -15,6 +15,7 @@ #include namespace CGAL { +namespace HDVF { // Chose _TSlot according to the size of p template @@ -146,6 +147,7 @@ class Zp { } }; -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif diff --git a/HDVF/include/CGAL/HDVF/hdvf.hpp b/HDVF/include/CGAL/HDVF/hdvf.hpp index ab721a82f2bc..76327af45025 100644 --- a/HDVF/include/CGAL/HDVF/hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf.hpp @@ -1,11 +1,11 @@ /** * \file hdvf.hpp - * \brief HDVF code library. + * \brief Hdvf code library. * \author Bac A. * \version 0.1.0 * \date 22/08/2024 * - * HDVF code library (constructors, operations, finders). + * Hdvf code library (constructors, operations, finders). */ #ifndef HDVF_H @@ -15,20 +15,21 @@ #include #include #include -#include "CGAL/HDVF/HDVF_core.hpp" +#include "CGAL/Hdvf/Hdvf_core.hpp" #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" namespace CGAL { +namespace HDVF { /** - * \class HDVF - * \brief Implementation of HDVF and associate operations. + * \class Hdvf + * \brief Implementation of Hdvf and associate operations. * - * The HDVF class contains all functions to build HDVF, create perfect HDVF (A and associate finders) and delineated generators through HDVF operations (R, M, W, MW and associate finders). + * The Hdvf class contains all functions to build Hdvf, create perfect Hdvf (A and associate finders) and delineated generators through Hdvf operations (R, M, W, MW and associate finders). * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ComplexType The type of complex (default is SimpComplex) + * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam ComplexType The type of complex (default is SimpComplex) * * \author Bac A. * \version 0.1.0 @@ -36,15 +37,18 @@ namespace CGAL { */ -template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> -class HDVF : public HDVF_core<_CoefficientType, _ComplexType, _ChainType, _SparseMatrixType> { +template +class Hdvf : public Hdvf_core { public: + // Types + typedef Hdvf_core HDVF_coreT ; + // Constructor - default : full reduction computed, no sub-complex - HDVF(const _ComplexType& K, int hdvf_opt = OPT_FULL) ; + Hdvf(const ComplexType& K, int hdvf_opt = OPT_FULL) ; // Copy constructor - HDVF(const HDVF& hdvf) : HDVF_core<_CoefficientType, _ComplexType, _ChainType, _SparseMatrixType>(hdvf) { } + Hdvf(const Hdvf& hdvf) : Hdvf_core(hdvf) { } // Destructor - ~HDVF() { } + ~Hdvf() { } // findPair functions for M, W, MW @@ -75,21 +79,18 @@ class HDVF : public HDVF_core<_CoefficientType, _ComplexType, _ChainType, _Spars /** \brief find all the valid PairCell containing tau for MW in dimension q */ std::vector findPairsMW(int q, bool &found, int tau); // const; - // HDVF methods - /** \brief HDVF operation A(gamma1, gamma2) */ + // Hdvf methods + /** \brief Hdvf operation A(gamma1, gamma2) */ void R(int pi, int sigma, int dim); void M(int pi, int gamma, int dim); void W(int sigma, int gamma, int dim); void MW(int pi, int sigma, int dim); - -protected: - }; -// Constructor for the HDVF class -template typename ChainType, template typename SparseMatrixType> -HDVF::HDVF(const ComplexType& K, int hdvf_opt) : HDVF_core(K, hdvf_opt) { } +// Constructor for the Hdvf class +template +Hdvf::Hdvf(const ComplexType& K, int hdvf_opt) : Hdvf_core(K, hdvf_opt) { } @@ -100,10 +101,9 @@ HDVF::HDVF(const Comp /** \brief find a valid PairCell for M in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairM(int q, bool &found) // const +template +PairCell Hdvf::findPairM(int q, bool &found) // const { - typedef HDVF_core HDVF_coreT; found = false; PairCell p; @@ -131,10 +131,9 @@ PairCell HDVF::find /** \brief find a valid PairCell containing tau for M in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairM(int q, bool &found, int tau) // const +template +PairCell Hdvf::findPairM(int q, bool &found, int tau) // const { - typedef HDVF_core HDVF_coreT ; found = false; PairCell p; if (this->_flag.at(q).at(tau) == SECONDARY) @@ -177,10 +176,9 @@ PairCell HDVF::find /** \brief find all the valid PairCell for M in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsM(int q, bool &found) // const +template +std::vector Hdvf::findPairsM(int q, bool &found) // const { - typedef HDVF_core HDVF_coreT; found = false; std::vector pairs; if (this->_hdvf_opt & OPT_F) @@ -209,10 +207,9 @@ std::vector HDVF -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsM(int q, bool &found, int tau) // const +template +std::vector Hdvf::findPairsM(int q, bool &found, int tau) // const { - typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; if (this->_flag.at(q).at(tau) == SECONDARY) @@ -263,10 +260,9 @@ std::vector HDVF -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairW(int q, bool &found) // const +template +PairCell Hdvf::findPairW(int q, bool &found) // const { - typedef HDVF_core HDVF_coreT ; found = false; PairCell p; @@ -294,10 +290,9 @@ PairCell HDVF::find /** \brief find a valid PairCell containing tau for W in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairW(int q, bool &found, int tau) // const +template +PairCell Hdvf::findPairW(int q, bool &found, int tau) // const { - typedef HDVF_core HDVF_coreT ; found = false; PairCell p; if (this->_flag.at(q).at(tau) == PRIMARY) @@ -340,10 +335,9 @@ PairCell HDVF::find /** \brief find all the valid PairCell for W in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsW(int q, bool &found) // const +template +std::vector Hdvf::findPairsW(int q, bool &found) // const { - typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; @@ -373,10 +367,9 @@ std::vector HDVF -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsW(int q, bool &found, int tau) // const +template +std::vector Hdvf::findPairsW(int q, bool &found, int tau) // const { - typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; if (this->_flag.at(q).at(tau) == PRIMARY) @@ -427,10 +420,9 @@ std::vector HDVF -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairMW(int q, bool &found) // const +template +PairCell Hdvf::findPairMW(int q, bool &found) // const { - typedef HDVF_core HDVF_coreT ; found = false; PairCell p; @@ -472,10 +464,9 @@ PairCell HDVF::find /** \brief find a valid PairCell containing tau for MW in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -PairCell HDVF::findPairMW(int q, bool &found, int tau) // const +template +PairCell Hdvf::findPairMW(int q, bool &found, int tau) // const { - typedef HDVF_core HDVF_coreT ; found = false; PairCell p; @@ -562,10 +553,9 @@ PairCell HDVF::find /** \brief find all the valid PairCell for MW in dimension q */ //template -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsMW(int q, bool &found) // const +template +std::vector Hdvf::findPairsMW(int q, bool &found) // const { - typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; @@ -610,10 +600,9 @@ std::vector HDVF -template typename _ChainType, template typename _SparseMatrixType> -std::vector HDVF::findPairsMW(int q, bool &found, int tau) // const +template +std::vector Hdvf::findPairsMW(int q, bool &found, int tau) // const { - typedef HDVF_core HDVF_coreT ; found = false; std::vector pairs; if (this->_flag.at(q).at(tau) == CRITICAL) @@ -706,9 +695,8 @@ std::vector HDVF -template typename _ChainType, template typename _SparseMatrixType> -void HDVF::R(int pi, int sigma, int q) { - typedef HDVF_core HDVF_coreT ; +template +void Hdvf::R(int pi, int sigma, int q) { //----------------------------------------------- Submatrices of H ---------------------------------------------------- if (this->_hdvf_opt & OPT_FULL) @@ -826,9 +814,8 @@ void HDVF::R(int pi // Method to perform operation M // pi is in dimension q, gamma is in dimension q //template -template typename _ChainType, template typename _SparseMatrixType> -void HDVF::M(int pi, int gamma, int q) { - typedef HDVF_core HDVF_coreT ; +template +void Hdvf::M(int pi, int gamma, int q) { //----------------------------------------------- Submatrices of F ---------------------------------------------------- if (this->_hdvf_opt & OPT_FULL) @@ -951,9 +938,8 @@ void HDVF::M(int pi // Method to perform operation W // gamma is in dimension q, sigma is in dimension q -template typename _ChainType, template typename _SparseMatrixType> -void HDVF::W(int sigma, int gamma, int q) { - typedef HDVF_core HDVF_coreT ; +template +void Hdvf::W(int sigma, int gamma, int q) { //----------------------------------------------- Submatrices of G ---------------------------------------------------- if (this->_hdvf_opt & OPT_FULL) @@ -1076,9 +1062,8 @@ void HDVF::W(int si // Method to perform operation MW // gamma is in dimension q, sigma is in dimension q -template typename _ChainType, template typename _SparseMatrixType> -void HDVF::MW(int pi, int sigma, int q) { - typedef HDVF_core HDVF_coreT ; +template +void Hdvf::MW(int pi, int sigma, int q) { //----------------------------------------------- Submatrices of G ---------------------------------------------------- if (this->_hdvf_opt & OPT_FULL) @@ -1153,7 +1138,7 @@ void HDVF::MW(int p this->_F_row.at(q) += (F11 * xi) * tmp1 ; OSM::setColumn(this->_F_row.at(q), sigma, F11 * (-xi)) ; - // G_q+1 // note: G_q+1 is not be modified if the HDVF is perfect + // G_q+1 // note: G_q+1 is not be modified if the Hdvf is perfect typename HDVF_coreT::RChain tmp2(projS_cod_sigma * this->_G_col.at(q+1)) ; tmp2 += projC_cod_sigma ; @@ -1175,7 +1160,7 @@ void HDVF::MW(int p this->_G_col.at(q) -= (tmp3 * xip) * G11 ; OSM::setRow(this->_G_col.at(q), pi, xip * G11) ; - // F_q-1 // note: F_q-1 is not be modified if the HDVF is perfect + // F_q-1 // note: F_q-1 is not be modified if the Hdvf is perfect typename HDVF_coreT::CChain tmp4(this->_F_row.at(q-1) * projP_d_pi) ; tmp4 += projC_d_pi ; @@ -1187,12 +1172,13 @@ void HDVF::MW(int p // Update flags this->_flag[q][pi] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY - this->_flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to CRITICAL + this->_flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to PRIMARY } else std::cout << "!!! MW impossible with partial reduction options" << std::endl; } -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif // HDVF_H diff --git a/HDVF/include/CGAL/HDVF/hdvf_core.hpp b/HDVF/include/CGAL/HDVF/hdvf_core.hpp index 858d0d62bbc0..b899c45d7dc5 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_core.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_core.hpp @@ -1,11 +1,11 @@ /** * \file hdvf.hpp - * \brief HDVF_core code library. + * \brief Hdvf_core code library. * \author Bac A. * \version 0.1.0 * \date 22/08/2024 * - * HDVF_core code library (constructors, operations, finders). + * Hdvf_core code library (constructors, operations, finders). */ #ifndef HDVF_CORE_H @@ -20,30 +20,31 @@ #include "CGAL/HDVF/sub_chain_complex.hpp" namespace CGAL { +namespace HDVF { -/** \brief Enum for the HDVF_core label of cells. */ -enum FlagType { + +/** \brief Enum for the Hdvf_core label of cells. */ +static enum FlagType { PRIMARY, SECONDARY, CRITICAL, NONE // For duality and persistence }; -/** \brief HDVF_core options (partial computation of the reduction). */ -// Compute only reduced boundary +/** \brief Hdvf_core options (compute only reduced boundary). */ const int OPT_BND = 0b0001; -// Compute reduced boundary and f +/** \brief Hdvf_core options (compute only reduced boundary and f). */ const int OPT_F = 0b0010; -// Compute reduced boundary and g +/** \brief Hdvf_core options (compute only reduced boundary and g). */ const int OPT_G = 0b0100; -// Compute full reduction +/** \brief Hdvf_core options (compute full reduction). */ const int OPT_FULL = 0b1000; /** \brief Enum for export: lets chose the type of export. * - * \tparam PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) - * \tparam FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) - * \tparam G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) + * - PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) + * - FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) + * - G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) */ enum ExportType { PSC, @@ -51,14 +52,7 @@ enum ExportType { G }; - -/** \brief PairCell: Structure to represent a pair of cells (for HDVF_core operations). - * The PairCell follows the following conventions depending on the operation type: - * - A: sigma is of dim q and tau is of dim q+1 ; - * - R: sigma is of dim q and tau is of dim q+1 ; - * - M: sigma is primary and tau is critical of dim q ; - * - W: sigma is secondary and tau is critical of dim q ; - * - MW: sigma is primary and tau is secondary of dim q. +/** \brief PairCell: Structure to represent a pair of cells (for HDVF operations). */ struct PairCell { int sigma; // Index of the first cell @@ -68,10 +62,10 @@ struct PairCell { /** - * \class HDVF_core - * \brief Implementation of HDVF_core and associate operations. + * \class Hdvf_core + * \brief Implementation of Hdvf_core and associate operations. * - * The HDVF_core class contains all functions to build HDVF_core, create perfect HDVF_core (A and associate finders) and delineated generators through HDVF_core operations (R, M, W, MW and associate finders). + * The Hdvf_core class contains all functions to build Hdvf_core, create perfect Hdvf_core (A and associate finders) and delineated generators through Hdvf_core operations (R, M, W, MW and associate finders). * * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) * \tparam ComplexType The type of complex (default is SimpComplex) @@ -83,7 +77,7 @@ struct PairCell { template typename ChainType = OSM::Chain, template typename SparseMatrixType = OSM::SparseMatrix> -class HDVF_core { +class Hdvf_core { public: /** \brief Typedefs for coefficient type and different chain and matrix types. */ typedef ChainType CChain; @@ -113,16 +107,16 @@ class HDVF_core { /** \brief Reference to the underlying complex. */ const ComplexType& _K; - /** \brief HDVF_core options for computation (computation of partial reduction). */ + /** \brief Hdvf_core options for computation (computation of partial reduction). */ int _hdvf_opt; public: // Constructor - default : full reduction computed, no sub-complex - HDVF_core(const ComplexType& K, int hdvf_opt = OPT_FULL) ; + Hdvf_core(const ComplexType& K, int hdvf_opt = OPT_FULL) ; // Copy constructor - HDVF_core(const HDVF_core& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } + Hdvf_core(const Hdvf_core& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } // Destructor - ~HDVF_core() { } + ~Hdvf_core() { } // findPair functions @@ -135,11 +129,11 @@ class HDVF_core { /** \brief find all the valid PairCell containing tau for A in dimension q */ virtual std::vector findPairsA(int q, bool &found, int tau); // const; - // HDVF_core methods - /** \brief HDVF_core operation A(gamma1, gamma2) */ + // Hdvf_core methods + /** \brief Hdvf_core operation A(gamma1, gamma2) */ void A(int gamma1, int gamma2, int dim); - /** \brief Compute a perfect HDVF_core + /** \brief Compute a perfect Hdvf_core From dimension q-1 to dimension 0 As long as findPairA(q) returns a pair -> Perform operation A @@ -147,7 +141,7 @@ class HDVF_core { */ std::vector computePerfectHDVF(bool verbose = false); - /** \brief Compute a perfect HDVF_core + /** \brief Compute a perfect Hdvf_core From dimension q-1 to dimension 0 As long as findPairsA(q) returns pairs -> Choose one randomly @@ -157,7 +151,7 @@ class HDVF_core { */ std::vector computeRandPerfectHDVF(bool verbose = false); - // HDVF_core getters + // Hdvf_core getters // Method to get cells if with a given flag (P,S,C) for each dimension virtual std::vector > get_flag (FlagType flag) const ; // Method to get cells with a given flag (P,S,C) for a given dimension @@ -202,66 +196,66 @@ class HDVF_core { return result; } -// // [OLD] Method to generate labels for visualisation -// // Kept for compatibility -// // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned -// virtual std::vector > export_label (ExportType type, int cell=0, int dim=0) const -// { -// std::vector > labels(_K.dim()+1) ; -// if (type == PSC) -// { -// for (int q=0; q<=_K.dim(); ++q) -// { -// for (int i = 0; i<_K.nb_cells(q); ++i) -// { -// if (_flag.at(q).at(i) == PRIMARY) -// labels.at(q).push_back(-1) ; -// else if (_flag.at(q).at(i) == SECONDARY) -// labels.at(q).push_back(1) ; -// else -// labels.at(q).push_back(0) ; -// } -// } -// } -// else -// { -// if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) -// { -// for (int q=0; q<=_K.dim(); ++q) -// { -// labels.at(q).resize(_K.nb_cells(q)) ; -// } -// -// if (dim < _K.dim()) -// { -// labels.at(dim).at(cell) = 1 ; -// const RChain& fstar_cell = OSM::cgetRow(_F_row.at(dim), cell) ; -// for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) -// { -// // Set the cofaces of it->first in dimension dim+1 -// RChain cofaces(_K.cod(it->first,dim)) ; -// for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) -// labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells -// } -// } -// else -// throw "Error: cannot export f* for a cell of maximal dimension" ; -// } -// else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G -// { -// for (int q=0; q<=_K.dim(); ++q) -// { -// labels.at(q).resize(_K.nb_cells(q)) ; -// } -// -// labels.at(dim).at(cell) = 1 ; -// const CChain& g_cell = OSM::cgetColumn(_G_col.at(dim), cell) ; -// for (typename CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) -// labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells -// } -// } -// return labels ; -// } + // // [OLD] Method to generate labels for visualisation + // // Kept for compatibility + // // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned + // virtual std::vector > export_label (ExportType type, int cell=0, int dim=0) const + // { + // std::vector > labels(_K.dim()+1) ; + // if (type == PSC) + // { + // for (int q=0; q<=_K.dim(); ++q) + // { + // for (int i = 0; i<_K.nb_cells(q); ++i) + // { + // if (_flag.at(q).at(i) == PRIMARY) + // labels.at(q).push_back(-1) ; + // else if (_flag.at(q).at(i) == SECONDARY) + // labels.at(q).push_back(1) ; + // else + // labels.at(q).push_back(0) ; + // } + // } + // } + // else + // { + // if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) + // { + // for (int q=0; q<=_K.dim(); ++q) + // { + // labels.at(q).resize(_K.nb_cells(q)) ; + // } + // + // if (dim < _K.dim()) + // { + // labels.at(dim).at(cell) = 1 ; + // const RChain& fstar_cell = OSM::cgetRow(_F_row.at(dim), cell) ; + // for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + // { + // // Set the cofaces of it->first in dimension dim+1 + // RChain cofaces(_K.cod(it->first,dim)) ; + // for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + // labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells + // } + // } + // else + // throw "Error: cannot export f* for a cell of maximal dimension" ; + // } + // else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G + // { + // for (int q=0; q<=_K.dim(); ++q) + // { + // labels.at(q).resize(_K.nb_cells(q)) ; + // } + // + // labels.at(dim).at(cell) = 1 ; + // const CChain& g_cell = OSM::cgetColumn(_G_col.at(dim), cell) ; + // for (typename CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) + // labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells + // } + // } + // return labels ; + // } // Method to generate PSC labels for visualisation virtual std::vector > export_labelsPSC () const @@ -297,7 +291,7 @@ class HDVF_core { return g_cell ; } else - throw "Error : trying to export g_chain without proper HDVF_core option" ; + throw "Error : trying to export g_chain without proper Hdvf_core option" ; } // Method to export FSTAR chains for visualisation @@ -327,7 +321,7 @@ class HDVF_core { return CChain(0) ; } else - throw "Error : trying to export g_chain without proper HDVF_core option" ; + throw "Error : trying to export g_chain without proper Hdvf_core option" ; } protected: void progress_bar(int i, int n) @@ -350,13 +344,13 @@ class HDVF_core { }; -// Constructor for the HDVF_core class +// Constructor for the Hdvf_core class template typename ChainType, template typename SparseMatrixType> -HDVF_core::HDVF_core(const ComplexType& K, int hdvf_opt) : _K(K) { +Hdvf_core::Hdvf_core(const ComplexType& K, int hdvf_opt) : _K(K) { // Get the dimension of the simplicial complex int dim = _K.dim(); - std::cout << "----> Starting HDVF_core creation / dim " << dim << std::endl ; - // HDVF_core options + std::cout << "----> Starting Hdvf_core creation / dim " << dim << std::endl ; + // Hdvf_core options _hdvf_opt = hdvf_opt ; // Resize the _DD_col vector to hold dim+1 elements @@ -410,12 +404,12 @@ HDVF_core::HDVF_core( _DD_col.resize(_K.dim()+1) ; for (int q=0; q<=_K.dim(); ++q) _DD_col.at(q) = _K.get_bnd_matrix(q) ; - std::cout << "------> End HDVF_core creation" << std::endl ; + std::cout << "------> End Hdvf_core creation" << std::endl ; } // Method to print the matrices template typename ChainType, template typename SparseMatrixType> -std::ostream& HDVF_core::print_matrices(std::ostream& out) const { +std::ostream& Hdvf_core::print_matrices(std::ostream& out) const { // Iterate through each dimension and print the corresponding matrices for (int q = 0; q <= _K.dim(); ++q) { out << "------- Dimension " << q << std::endl; @@ -453,7 +447,7 @@ std::ostream& HDVF_core template typename ChainType, template typename SparseMatrixType> -PairCell HDVF_core::findPairA(int q, bool &found) // const +PairCell Hdvf_core::findPairA(int q, bool &found) // const { found = false; PairCell p; @@ -480,7 +474,7 @@ PairCell HDVF_core::f /** \brief find a valid PairCell containing tau for A in dimension q */ //template template typename ChainType, template typename SparseMatrixType> -PairCell HDVF_core::findPairA(int q, bool &found, int tau) // const +PairCell Hdvf_core::findPairA(int q, bool &found, int tau) // const { found = false; PairCell p ; @@ -516,7 +510,7 @@ PairCell HDVF_core::f /** \brief find all the valid PairCell for A in dimension q */ //template template typename ChainType, template typename SparseMatrixType> -std::vector HDVF_core::findPairsA(int q, bool &found) // const +std::vector Hdvf_core::findPairsA(int q, bool &found) // const { std::vector pairs; found = false ; @@ -545,7 +539,7 @@ std::vector HDVF_core template typename ChainType, template typename SparseMatrixType> -std::vector HDVF_core::findPairsA(int q, bool &found, int tau) // const +std::vector Hdvf_core::findPairsA(int q, bool &found, int tau) // const { found = false; std::vector pairs; @@ -589,18 +583,18 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//PairCell HDVF_core::findPairM(int q, bool &found) // const +//PairCell Hdvf_core::findPairM(int q, bool &found) // const //{ // found = false; // PairCell p; -// +// // if (_hdvf_opt & OPT_F) // { // // Search for +-1 in _F - iterate over rows // for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); (it_row != _F_row[q].end() && !found); ++it_row) // { // const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); -// +// // // Iterate through the entries of the row // for (typename RChain::const_iterator it = row.begin(); (it != row.end() && !found); ++it) { // if ((it->second == 1) || (it->second == -1)) { @@ -619,13 +613,13 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//PairCell HDVF_core::findPairM(int q, bool &found, int tau) // const +//PairCell Hdvf_core::findPairM(int q, bool &found, int tau) // const //{ // found = false; // PairCell p; // if (_flag.at(q).at(tau) == SECONDARY) // return p ; // Empty / found false -// +// // if (_hdvf_opt & OPT_F) // { // // If tau is primary, search for gamma such that =+-1 @@ -664,7 +658,7 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//std::vector HDVF_core::findPairsM(int q, bool &found) // const +//std::vector Hdvf_core::findPairsM(int q, bool &found) // const //{ // found = false; // std::vector pairs; @@ -674,7 +668,7 @@ std::vector HDVF_coresecond == 1) || (it->second == -1)) { @@ -695,13 +689,13 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//std::vector HDVF_core::findPairsM(int q, bool &found, int tau) // const +//std::vector Hdvf_core::findPairsM(int q, bool &found, int tau) // const //{ // found = false; // std::vector pairs; // if (_flag.at(q).at(tau) == SECONDARY) // return pairs ; // Empty / found false -// +// // if (_hdvf_opt & OPT_F) // { // // If tau is primary, search for gamma such that =+-1 @@ -748,18 +742,18 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//PairCell HDVF_core::findPairW(int q, bool &found) // const +//PairCell Hdvf_core::findPairW(int q, bool &found) // const //{ // found = false; // PairCell p; -// +// // if (_hdvf_opt & OPT_G) // { // // Search for +-1 in _G - iterate over cols // for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); (it_col != _F_row[q].end() && !found); ++it_col) // { // CChain &col = _G_col[q][*it_col]; -// +// // // Iterate through the entries of the col // for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { // if ((it->second == 1) || (it->second == -1)) { @@ -778,13 +772,13 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//PairCell HDVF_core::findPairW(int q, bool &found, int tau) // const +//PairCell Hdvf_core::findPairW(int q, bool &found, int tau) // const //{ // found = false; // PairCell p; // if (_flag.at(q).at(tau) == PRIMARY) // return p ; // Empty / found false -// +// // if (_hdvf_opt & OPT_G) // { // // If tau is primary, search for gamma such that =+-1 @@ -823,18 +817,18 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//std::vector HDVF_core::findPairsW(int q, bool &found) // const +//std::vector Hdvf_core::findPairsW(int q, bool &found) // const //{ // found = false; // std::vector pairs; -// +// // if (_hdvf_opt & OPT_FULL) // { // // Search for +-1 in _G - iterate over cols // for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); it_col != _F_row[q].end(); ++it_col) // { // CChain &col = _G_col[q][*it_col]; -// +// // // Iterate through the entries of the col // for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { // if ((it->second == 1) || (it->second == -1)) { @@ -855,13 +849,13 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//std::vector HDVF_core::findPairsW(int q, bool &found, int tau) // const +//std::vector Hdvf_core::findPairsW(int q, bool &found, int tau) // const //{ // found = false; // std::vector pairs; // if (_flag.at(q).at(tau) == PRIMARY) // return pairs ; // Empty / found false -// +// // if (_hdvf_opt & OPT_FULL) // { // // If tau is primary, search for gamma such that =+-1 @@ -908,11 +902,11 @@ std::vector HDVF_core //template typename ChainType, template typename SparseMatrixType> -//PairCell HDVF_core::findPairMW(int q, bool &found) // const +//PairCell Hdvf_core::findPairMW(int q, bool &found) // const //{ // found = false; // PairCell p; -// +// // if (_hdvf_opt & OPT_FULL) // { // // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero @@ -930,9 +924,9 @@ std::vector HDVF_core HDVF_core //template typename ChainType, template typename SparseMatrixType> -//PairCell HDVF_core::findPairMW(int q, bool &found, int tau) // const +//PairCell Hdvf_core::findPairMW(int q, bool &found, int tau) // const //{ // found = false; // PairCell p; -// +// // if (_flag.at(q).at(tau) == CRITICAL) // return p ; // Empty / found false -// +// // if (_hdvf_opt & OPT_FULL) // { // // If tau is primary (rename pi), search for a valid sigma @@ -970,10 +964,10 @@ std::vector HDVF_core HDVF_core HDVF_core //template typename ChainType, template typename SparseMatrixType> -//std::vector HDVF_core::findPairsMW(int q, bool &found) // const +//std::vector Hdvf_core::findPairsMW(int q, bool &found) // const //{ // found = false; // std::vector pairs; -// +// // if (_hdvf_opt & OPT_FULL) // { // // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero @@ -1063,9 +1057,9 @@ std::vector HDVF_core HDVF_core //template typename ChainType, template typename SparseMatrixType> -//std::vector HDVF_core::findPairsMW(int q, bool &found, int tau) // const +//std::vector Hdvf_core::findPairsMW(int q, bool &found, int tau) // const //{ // found = false; // std::vector pairs; // if (_flag.at(q).at(tau) == CRITICAL) // return pairs ; // Empty / found false -// +// // if (_hdvf_opt & OPT_FULL) // { // // If tau is primary (rename pi), search for a valid sigma @@ -1105,10 +1099,10 @@ std::vector HDVF_core HDVF_core HDVF_core template typename ChainType, template typename SparseMatrixType> -void HDVF_core::A(int tau1, int tau2, int q) { +void Hdvf_core::A(int tau1, int tau2, int q) { //----------------------------------------------- Submatrices of D ---------------------------------------------------- // Output operation details to the console @@ -1314,109 +1308,109 @@ void HDVF_core::A(int //// pi is in dimension q, sigma is in dimension q+1 ////template //template typename ChainType, template typename SparseMatrixType> -//void HDVF_core::R(int pi, int sigma, int q) { +//void Hdvf_core::R(int pi, int sigma, int q) { // //----------------------------------------------- Submatrices of H ---------------------------------------------------- -// +// // if (_hdvf_opt & OPT_FULL) // { // // Output operation details to the console // std::cout << "R of " << pi << "(dim " << q << ") / " << sigma << "(dim " << q + 1 << ")" << std::endl; -// +// // // Extract the relevant row and column chains from _H_col // RChain H12 = OSM::getRow(_H_col[q], sigma); // H12 is the row chain from _H_col[q] at index sigma // CChain H21 = OSM::getColumn(_H_col[q], pi); // H21 is the column chain from _H_col[q] at index pi -// +// // // Get the coefficient at the intersection of H12 and H21 // CoefficientType H11(H12[pi]); // H11 is the coefficient at row sigma and column pi -// +// // // Assert that H11 is either 1 or -1 (check invertibility) // assert((H11 == 1) || (H11 == -1)); // !!!!! Test invertibility // CoefficientType H11_inv = H11; // Inverse of H11 (which is itself for 1 or -1) -// +// // // Remove the contributions of pi from H12 and sigma from H21 // H12 /= std::vector({pi}); // Remove column pi from H12 // H21 /= std::vector({sigma}); // Remove row sigma from H21 -// +// // // Remove the corresponding row and column from _H_col // _H_col[q].delRow(sigma); // Remove row sigma from _H_col[q] // _H_col[q].delColumn(pi); // Remove column pi from _H_col[q] -// +// // //---------------------------------------------- Submatrices of F ----------------------------------------------------- -// +// // // Extract the relevant column chain from _F_row // CChain F11 = OSM::getColumn(_F_row[q], pi); // F11 is the column chain from _F_row[q] at index pi -// +// // // Remove the column pi from _F_row // _F_row[q].delColumn(pi); -// +// // //--------------------------------------------- Submatrices of G ------------------------------------------------------ -// +// // // Extract the relevant row chain from _G_col // RChain G11 = OSM::getRow(_G_col[q + 1], sigma); // G11 is the row chain from _G_col[q+1] at index sigma -// +// // // Remove the row sigma from _G_col // _G_col[q + 1].delRow(sigma); -// +// // //--------------------------------------------- Update matrices ------------------------------------------------------- -// +// // // Update _F_row[q] // // Subtract the product of (H12 * F11) and H11 from _F_row[q] // // Note: % operator returns a row matrix, so be careful with operations // _F_row[q] -= (F11 % H12) * H11_inv; -// +// // // Set the row pi of _F_row[q] to (H12 * (-H11_inv)) // OSM::setRow(_F_row[q], pi, H12 * (-H11_inv)); -// +// // // Update _G_col[q + 1] // // Subtract the product of (H21 * G11) and H11_inv from _G_col[q + 1] // _G_col[q + 1] -= (H21 * G11) * H11_inv; -// +// // // Set the column sigma of _G_col[q + 1] to (H21 * (-H11_inv)) // OSM::setColumn(_G_col[q + 1], sigma, H21 * (-H11_inv)); -// +// // // Update _DD_col // // Compute the temporary matrix product F11 * G11 // _DD_col[q + 1] += (F11 * G11) * H11_inv; -// +// // // Set the row pi in _DD_col[q + 1] to (G11 * H11_inv) // OSM::setRow(_DD_col[q + 1], pi, G11 * H11_inv); -// +// // // Set the column sigma in _DD_col[q + 1] to (F11 * H11_inv) // OSM::setColumn(_DD_col[q + 1], sigma, F11 * H11_inv); -// +// // // Set the coefficient at (pi, sigma) in _DD_col to H11_inv // _DD_col[q + 1].set_coef(pi, sigma, H11_inv); -// +// // // Update _H_col[q] // // Subtract the product of (H21 * H12) and H11_inv from _H_col[q] // _H_col[q] -= (H21 * H12) * H11_inv; -// +// // // Perform additional updates -// +// // // Extract boundary and coboundary chains // CChain bnd_pi(_K.d(pi, q)); // Boundary of pi in dimension q // RChain cobnd_sigma(_K.cod(sigma, q + 1)); // Coboundary of sigma in dimension q+1 -// +// // // Project the boundary and coboundary chains onto PRIMARY and SECONDARY flags // CChain proj_P_pi(projection(bnd_pi, PRIMARY, q)); // RChain proj_S_sigma(projection(cobnd_sigma, SECONDARY, q + 1)); -// +// // if (q > 0) { // // Update _DD_col[q] with projections and _F_row[q-1] // CChain c1(_F_row[q - 1] * proj_P_pi + projection(bnd_pi, CRITICAL, q)); // OSM::setColumn(_DD_col[q], pi, c1); // OSM::setColumn(_G_col[q], pi, _H_col[q - 1] * proj_P_pi); // } -// +// // // Update _F_row[q+1] with projection and _H_col[q+1] // OSM::setRow(_F_row[q + 1], sigma, proj_S_sigma * _H_col[q + 1]); -// +// // if (q + 2 <= _K.dim()) { // // Update _DD_col[q+2] with projections // RChain c4(projection(cobnd_sigma, CRITICAL, q + 1) + proj_S_sigma * _G_col[q + 2]); // OSM::setRow(_DD_col[q + 2], sigma, c4); // } -// +// // // Update flags // _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to CRITICAL // ++_nb_C.at(q) ; @@ -1433,99 +1427,99 @@ void HDVF_core::A(int //// pi is in dimension q, gamma is in dimension q ////template //template typename ChainType, template typename SparseMatrixType> -//void HDVF_core::M(int pi, int gamma, int q) { +//void Hdvf_core::M(int pi, int gamma, int q) { // //----------------------------------------------- Submatrices of F ---------------------------------------------------- -// +// // if (_hdvf_opt & OPT_FULL) // { // // Output the operation details to the console // std::cout << "M_" << q << "(" << pi << "," << gamma << ")" << std::endl; -// +// // if (q == _K.dim()) // throw("M operation in max dimension !!!") ; -// +// // // Extract row and column chains from _F_row // RChain F12(OSM::getRow(_F_row[q], gamma)); // F12 is the row chain from _F_row[q] at index gamma // CChain F21(OSM::getColumn(_F_row[q], pi)); // F21 is the column chain from _F_row[q] at index pi -// +// // // Get the coefficient at the intersection of F12 and F21 // CoefficientType F11(F12[pi]); // F11 is the coefficient at row gamma and column pi -// +// // // Assert that F11 is either 1 or -1 (for invertibility) // assert((F11 == 1) || (F11 == -1)); // !!!!! Test invertibility // CoefficientType F11_inv = F11; // Inverse of F11 (which is itself for 1 or -1) -// +// // // Remove the contributions of pi from F12 and gamma from F21 // F12 /= std::vector({pi}); // Remove column pi from F12 // F21 /= std::vector({gamma}); // Remove row gamma from F21 -// +// // // Remove the corresponding row and column from _F_row // _F_row[q].delRow(gamma); // Remove row gamma from _F_row[q] // _F_row[q].delColumn(pi); // Remove column pi from _F_row[q] -// +// // //--------------------------------------------- Submatrices of G ------------------------------------------------------ -// +// // // Extract the relevant column chain from _G_col // // G11_q is the column chain from _G_col[q] at index gamma // // CChain G11_q(OSM::getColumn(_G_col[q], gamma)); // _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] -// +// // //---------------------------------------------- Submatrices of H ----------------------------------------------------- -// +// // // Extract the relevant column chain from _H_col // CChain H11(OSM::getColumn(_H_col[q], pi)); // H11 is the column chain from _H_col[q] at index pi -// +// // // Remove the column pi from _H_col // _H_col[q].delColumn(pi); -// +// // //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ -// +// // // For DD_q+1 and DD_q: // // Extract the relevant row chains from _DD_col -// +// // // DD_q+1 (corresponds to the row matrix of _DD_col) // RChain D11(OSM::getRow(_DD_col[q+1], gamma)); // D11 is the row chain from _DD_col[q+1] at index gamma // _DD_col[q + 1].delRow(gamma); // Remove row gamma from _DD_col[q + 1] -// +// // //--------------------------------------------- Submatrices of DD ------------------------------------------------------ -// +// // // DD_q (corresponds to the column matrix of _DD_col) // // CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); // // D11_q is the column chain from _DD_col[q] at index gamma // if (q > 0) // _DD_col[q].delColumn(gamma); // Remove column gamma from _DD_col[q] -// +// // //--------------------------------------------- Update matrices ------------------------------------------------------- -// +// // // Update _H_col // // Subtract the product of (H11 * F11_inv) and F12 from _H_col[q] // // Note: * operator is used for matrix column results // _H_col[q] -= (H11 * F11_inv) * F12; -// +// // // Set the column gamma of _H_col[q] to (-1 * H11) * F11_inv // OSM::setColumn(_H_col[q], gamma, (-1 * H11) * (F11_inv)); -// +// // // Update _F_row // // Add the product of (F21 * F11_inv) and F12 to _F_row[q] // _F_row[q] -= (F21 * F11_inv) * F12; -// +// // // Set the row pi of _F_row[q] to F11_inv * F12 // OSM::setRow(_F_row[q], pi, F11_inv * F12); -// +// // // Set the column gamma of _F_row[q] to F21 * (-F11_inv) // OSM::setColumn(_F_row[q], gamma, F21 * (-F11_inv)); -// +// // // Set the coefficient at (pi, gamma) in _F_row[q] to F11_inv // _F_row[q].set_coef(pi, gamma, F11_inv); -// +// // // Update _G_col // // Add the product of (H11 * F11_inv) and D11 to _G_col[q+1] // _G_col[q + 1] += (H11 * F11_inv) * D11; -// +// // // Update _DD_col[q + 1] // _DD_col[q + 1] -= (F21 * F11_inv) * D11; // Subtract the product from _DD_col[q + 1] // OSM::setRow(_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in _DD_col[q + 1] -// +// // // Update _G_col (for dimension q) and _DD_col (for dimension q) // if (q>0) // { @@ -1533,10 +1527,10 @@ void HDVF_core::A(int // CChain c = _K.d(pi, q); // Boundary of pi in dimension q // CChain projection_p(projection(c, PRIMARY, q-1)); // Project boundary chain to PRIMARY // CChain projection_c = projection(c, CRITICAL, q-1); // Project boundary chain to CRITICAL -// +// // // Set the column pi of _G_col[q] to (-1 * _H_col[q-1]) * projection_p // OSM::setColumn(_G_col[q], pi, (CoefficientType(-1) * _H_col[q - 1]) * projection_p); -// +// // // Update _DD_col // // Extract projections and perform updates // CChain tmp(_F_row[q - 1] * projection_p + projection_c); // Compute the product of _F_row[q - 1] and projection_p @@ -1544,7 +1538,7 @@ void HDVF_core::A(int // OSM::setColumn(_DD_col[q], pi, tmp); // } // // else: if the dimension is 0, no change for _G_col[q] and _DD_col[q] -// +// // // Update flags // _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to PRIMARY // _flag[q][gamma] = PRIMARY; // Set the flag of gamma in dimension q to CRITICAL @@ -1557,101 +1551,101 @@ void HDVF_core::A(int //// gamma is in dimension q, sigma is in dimension q // //template typename ChainType, template typename SparseMatrixType> -//void HDVF_core::W(int sigma, int gamma, int q) { -// +//void Hdvf_core::W(int sigma, int gamma, int q) { +// // //----------------------------------------------- Submatrices of G ---------------------------------------------------- -// +// // if (_hdvf_opt & OPT_FULL) // { // // Output the operation details to the console // std::cout << "W_" << q << "(" << sigma << "," << gamma << ")" << std::endl; -// +// // if (q == 0) // throw("W operation in dimension 0 !!!") ; -// +// // // Extract row and column chains from _G_col // RChain G12(OSM::getRow(_G_col[q], sigma)); // G12 is the row chain from _G_col[q] at index sigma // CChain G21(OSM::getColumn(_G_col[q], gamma)); // G21 is the column chain from _G_col[q] at index gamma -// +// // // Get the coefficient at the intersection of G12 and G21 // CoefficientType G11(G12[gamma]); // G11 is the coefficient at row sigma and column gamma -// +// // // Assert that G11 is either 1 or -1 (for invertibility) // assert((G11 == 1) || (G11 == -1)); // !!!!! Test invertibility // CoefficientType G11_inv = G11; // Inverse of G11 (which is itself for 1 or -1) -// +// // // Remove the contributions of gamma from G12 and sigma from G21 // G12 /= std::vector({gamma}); // Remove column gamma from G12 // G21 /= std::vector({sigma}); // Remove row sigma from G21 -// +// // // Remove the corresponding row and column from _G_col // _G_col[q].delRow(sigma); // Remove row sigma from _G_col[q] // _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] -// +// // //---------------------------------------------- Submatrices of F ----------------------------------------------------- -// +// // // Extract the row chain from _F_row // // RChain F11(OSM::getRow(_F_row[q], gamma)); // F11 is the row chain from _F_row[q] at index gamma -// +// // // Remove the row gamma from _F_row // _F_row[q].delRow(gamma); -// +// // //--------------------------------------------- Submatrices of H ------------------------------------------------------ -// +// // // Extract the row chain from _H_col // RChain H11(OSM::getRow(_H_col[q-1], sigma)); // H11 is the row chain from _H_col[q] at index sigma -// +// // // Remove the row sigma from _H_col // _H_col[q-1].delRow(sigma); -// +// // //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ -// +// // // Extract the row chain from _DD_col[q+1] // // RChain D11_q_plus1(OSM::getRow(_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from _DD_col[q + 1] at index gamma -// +// // // Remove the row gamma from _DD_col // if (q < _K.dim()) // _DD_col[q + 1].delRow(gamma); -// +// // //--------------------------------------------- Submatrices of DD_q ------------------------------------------------------ -// +// // // Extract the column chain from _DD_col[q] // CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); // D11_q is the column chain from _DD_col[q] at index gamma -// +// // // Remove the column gamma from _DD_col // _DD_col[q].delColumn(gamma); -// +// // //--------------------------------------------- Update matrices ------------------------------------------------------- -// +// // // Update _H_col // // Subtract the product of (G21 * G11_inv) and H11 from _H_col[q] // // Note: % operator is used for matrix row results // _H_col[q-1] -= (G21 * G11_inv) * H11; -// +// // // Set the row gamma of _H_col[q] to (-1 * H11) * G11_inv // OSM::setRow(_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); -// +// // // Update _G_col // // Subtract the product of G11_inv and (G21 * G12) from _G_col[q] // _G_col[q] -= (G21 * G11_inv) * G12; -// +// // // Set the row gamma of _G_col[q] to G11_inv * G12 // OSM::setRow(_G_col[q], gamma, -G11_inv * G12); -// +// // // Set the column sigma of _G_col[q] to G11_inv * G21 // OSM::setColumn(_G_col[q], sigma, G21 * G11_inv); -// +// // // Set the coefficient at (gamma, sigma) in _G_col[q] to G11_inv // _G_col[q].set_coef(gamma, sigma, G11_inv); -// +// // // Update _F_row (for dimension q-1) // // Add the product of (D11_q * G11_inv) and H11 to _F_row[q - 1] // _F_row[q - 1] += (D11_q * G11_inv) * H11; -// +// // // Update _DD_col (for dimension q) // _DD_col[q] -= (D11_q * G11_inv) * G12;// Subtract the product of (D11_q * G11_inv) and G12 // OSM::setColumn(_DD_col[q], sigma, D11_q * G11_inv) ; -// +// // // Update _F_row (for dimension q) and _DD_col (for dimension q+1) // if (q < _K.dim()) // { @@ -1659,17 +1653,17 @@ void HDVF_core::A(int // RChain c = _K.cod(sigma, q); // Boundary of sigma in dimension q // RChain projection_s(projection(c, SECONDARY, q+1)); // Project boundary chain to SECONDARY // RChain projection_c(projection(c, CRITICAL, q+1)); // Project boundary chain to SECONDARY -// +// // // Set the row sigma of _F_row[q] to (-1 * projection_s * _H_col[q]) // OSM::setRow(_F_row[q], sigma, (-1 * projection_s) * _H_col[q]); -// +// // // Set the row sigma of _DD_col[q + 1] to projection_s * _G_col[q + 1] + projection_c -// +// // RChain tmp(projection_s * _G_col[q + 1] + projection_c) ; // OSM::setRow(_DD_col[q + 1], sigma, tmp); // } // // else : if the dimension is maximal, no update of _DD_col[q+1] and _F_row[q] -// +// // // Update flags // _flag[q][gamma] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY // _flag[q][sigma] = CRITICAL; // Set the flag of sigma in dimension q to CRITICAL @@ -1682,114 +1676,114 @@ void HDVF_core::A(int //// gamma is in dimension q, sigma is in dimension q // //template typename ChainType, template typename SparseMatrixType> -//void HDVF_core::MW(int pi, int sigma, int q) { -// +//void Hdvf_core::MW(int pi, int sigma, int q) { +// // //----------------------------------------------- Submatrices of G ---------------------------------------------------- -// +// // if (_hdvf_opt & OPT_FULL) // { // // Output the operation details to the console // std::cout << "MW_" << q << "(" << pi << "," << sigma << ")" << std::endl; -// +// // if (q <= 0) // throw("MW operation in dimension 0 !!!") ; // if (q >= _K.dim()) // throw("MW operation in maximal dimension !!!") ; -// +// // // In order to compute xi and xi', extract sub-matrices of H_q, H_q-1 and compute d(pi) and cod(sigma) -// +// // // H_q extractions -// +// // CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; // // H21 -> delete H11 // _H_col.at(q) /= std::vector({pi}) ; -// +// // // H_q-1 extractions -// +// // RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; // // H21_q-1 -> delete H11q1 // _H_col.at(q-1).delRow(sigma) ; -// +// // // d(pi) -// +// // CChain d_pi = _K.d(pi, q) ; // CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; // CChain projC_d_pi = projection(d_pi, CRITICAL, q-1) ; -// +// // // cod(sigma) -// +// // RChain cod_sigma = _K.cod(sigma, q) ; // RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; // RChain projC_cod_sigma = projection(cod_sigma, CRITICAL, q+1) ; -// +// // // Compute xi and xi' to test the validity of MW -// +// // CoefficientType xi = projS_cod_sigma * H11 ; // CoefficientType xip = H11q1 * projP_d_pi ; -// +// // if (abs(xi) != 1) // throw "MW impossible, xi non invertible" ; // if (abs(xip) != 1) // throw "MW impossible, xi' non invertible" ; -// +// // // F_q extraction -// +// // CChain F11(OSM::getColumn(_F_row.at(q), pi)) ; // // F12 -> delete col F11 // _F_row.at(q).delColumn(pi) ; -// +// // // G_q extractions -// +// // RChain G11(OSM::getRow(_G_col.at(q), sigma)) ; // // G21 -> dele row G11 // _G_col.at(q).delRow(sigma) ; -// +// // // ----------- Update of the reduction -// +// // // H_q -// +// // RChain tmp1 = projS_cod_sigma * _H_col.at(q) ; -// +// // _H_col.at(q) -= (H11 * xi) * tmp1 ; // OSM::setColumn(_H_col.at(q), sigma, H11 * xi) ; -// +// // // F_q -// +// // _F_row.at(q) += (F11 * xi) * tmp1 ; // OSM::setColumn(_F_row.at(q), sigma, F11 * (-xi)) ; -// -// // G_q+1 // note: G_q+1 is not be modified if the HDVF_core is perfect -// +// +// // G_q+1 // note: G_q+1 is not be modified if the Hdvf_core is perfect +// // RChain tmp2(projS_cod_sigma * _G_col.at(q+1)) ; // tmp2 += projC_cod_sigma ; // _G_col.at(q+1) -= (H11 * xi) * tmp2 ; -// +// // // DD_col_q+1 / DD_row_q -// +// // _DD_col.at(q+1) -= (F11 * xi) * tmp2 ; -// +// // // H_q-1 -// +// // CChain tmp3(_H_col.at(q-1) * projP_d_pi) ; -// +// // _H_col.at(q-1) -= (tmp3 * xip) * H11q1 ; // OSM::setRow(_H_col.at(q-1), pi, xip * H11q1) ; -// +// // // G_q -// +// // _G_col.at(q) -= (tmp3 * xip) * G11 ; // OSM::setRow(_G_col.at(q), pi, xip * G11) ; -// -// // F_q-1 // note: F_q-1 is not be modified if the HDVF_core is perfect -// +// +// // F_q-1 // note: F_q-1 is not be modified if the Hdvf_core is perfect +// // CChain tmp4(_F_row.at(q-1) * projP_d_pi) ; // tmp4 += projC_d_pi ; // _F_row.at(q-1) -= (tmp4 * xip) * H11q1 ; -// +// // // DD_col_q -// +// // _DD_col.at(q) += (tmp4 * xip) * G11 ; -// +// // // Update flags // _flag[q][pi] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY // _flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to CRITICAL @@ -1799,11 +1793,11 @@ void HDVF_core::A(int //} -// Method to compute a perfect HDVF_core (Higher Dimensional Vector Field) +// Method to compute a perfect Hdvf_core (Higher Dimensional Vector Field) // Returns a vector of PairCell objects representing the pairs found template typename ChainType, template typename SparseMatrixType> -std::vector HDVF_core::computePerfectHDVF(bool verbose) { +std::vector Hdvf_core::computePerfectHDVF(bool verbose) { std::vector pair_list; // Vector to store the list of pairs bool trouve = false; // Flag to indicate whether a pair was found int dim = _K.dim(); // Get the dimension of the complex K @@ -1840,11 +1834,11 @@ std::vector HDVF_core typename ChainType, template typename SparseMatrixType> -std::vector HDVF_core::computeRandPerfectHDVF(bool verbose) { +std::vector Hdvf_core::computeRandPerfectHDVF(bool verbose) { std::vector pair_list; // Vector to store the list of pairs bool trouve = false; // Flag to indicate whether a pair was found int dim = _K.dim(); // Get the dimension of the complex K @@ -1893,7 +1887,7 @@ std::vector HDVF_core template typename ChainType, template typename SparseMatrixType> -std::vector > HDVF_core::get_flag (FlagType flag) const +std::vector > Hdvf_core::get_flag (FlagType flag) const { std::vector > res(_K.dim()+1) ; for (int q=0; q<=_K.dim(); ++q) @@ -1910,7 +1904,7 @@ std::vector > HDVF_core template typename ChainType, template typename SparseMatrixType> -std::vector HDVF_core::get_flag_dim (FlagType flag, int q) const +std::vector Hdvf_core::get_flag_dim (FlagType flag, int q) const { std::vector res ; for (int i=0; i<_K.nb_cells(q); ++i) @@ -1924,7 +1918,7 @@ std::vector HDVF_core template typename ChainType, template typename SparseMatrixType> -std::ostream& HDVF_core::print_reduction(std::ostream& out) // const +std::ostream& Hdvf_core::print_reduction(std::ostream& out) // const { // Print PSC out << "----- flags of cells:" << std::endl; @@ -2000,7 +1994,7 @@ std::ostream& HDVF_core template typename ChainType, template typename SparseMatrixType> -std::ostream& HDVF_core::print_pairs(const std::vector& pairs, std::ostream& out) // const +std::ostream& Hdvf_core::print_pairs(const std::vector& pairs, std::ostream& out) // const { for (const auto& pair : pairs) { out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; @@ -2008,6 +2002,7 @@ std::ostream& HDVF_core -class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> { +class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> { private: // Matrices types typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; typedef OSM::Chain<_CoefficientType, OSM::ROW> RChain; // HDVF Type - typedef HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; + typedef Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; // Complex L const _ComplexType& _L ; @@ -53,20 +54,20 @@ class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, O std::vector > critical_K, critical_L_K ; /** - * \brief Build Dual_HDVF from a complex and a sub chain complex + * \brief Build Hdvf_duality from a complex and a sub chain complex * - * \warning The Dual_HDVF will check that the sub chain complex is compatible. TODO !!! + * \warning The Hdvf_duality will check that the sub chain complex is compatible. TODO !!! * * \param[in] L The (full) complex. * \param[in] K The sub chain complex. * - * \see \link OSM::Dual_HDVF \endlink + * \see \link OSM::Hdvf_duality \endlink * * \author Bac A. * \version 0.1.0 * \date 28/08/2024 */ - Dual_HDVF(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt = OPT_FULL) ; + Hdvf_duality(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt = OPT_FULL) ; /** \brief find a valid PairCell for A in dimension q */ virtual PairCell findPairA(int q, bool &found); // const; @@ -103,7 +104,7 @@ class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, O /** * \brief Compute "perfect" HDVF (if they exist) over both sub complexes + pairing matrix * - * \see \link OSM::Dual_HDVF \endlink + * \see \link OSM::Hdvf_duality \endlink * * \author Bac A. * \version 0.1.0 @@ -114,7 +115,7 @@ class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, O /** * \brief Compute "pairing" HDVF between K and L-K * - * \see \link OSM::Dual_HDVF \endlink + * \see \link OSM::Hdvf_duality \endlink * * \author Bac A. * \version 0.1.0 @@ -122,14 +123,14 @@ class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, O */ std::vector computePairingHDVF() ; - // Dual_HDVF getters + // Hdvf_duality getters // Method to get cells if with a given flag (P,S,C) for each dimension vector > get_flag (FlagType flag) const ; // Method to get cells with a given flag (P,S,C) for a given dimension vector get_flag_dim (FlagType flag, int q) const ; // Method to get the flag (P,S,C) of a cell tau of dimension q - // Dual_HDVF I/O + // Hdvf_duality I/O virtual ostream& print_reduction(ostream& out = cout) { @@ -259,9 +260,9 @@ class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, O { if (_subCC.get_Bit(q, i)) // i belongs to _subCC { - if (this->_flag.at(q).at(i) == PRIMARY) + if (this->_flag.at(q).at(i) == HDVF_type::PRIMARY) labels.at(q).push_back(-1) ; - else if (this->_flag.at(q).at(i) == SECONDARY) + else if (this->_flag.at(q).at(i) == HDVF_type::SECONDARY) labels.at(q).push_back(1) ; else labels.at(q).push_back(0) ; @@ -442,12 +443,12 @@ class Dual_HDVF : public HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, O } ; template -Dual_HDVF<_CoefficientType,_ComplexType>::Dual_HDVF(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt) : -HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} +Hdvf_duality<_CoefficientType,_ComplexType>::Hdvf_duality(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt) : +Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} /** \brief find a valid PairCell for A in dimension q */ template -PairCell Dual_HDVF<_CoefficientType,_ComplexType>::findPairA(int q, bool &found) // const +PairCell Hdvf_duality<_CoefficientType,_ComplexType>::findPairA(int q, bool &found) // const { found = false; PairCell p; @@ -474,13 +475,13 @@ PairCell Dual_HDVF<_CoefficientType,_ComplexType>::findPairA(int q, bool &found) /** \brief find a valid PairCell containing tau for A in dimension q */ template -PairCell Dual_HDVF<_CoefficientType,_ComplexType>::findPairA(int q, bool &found, int tau) // const +PairCell Hdvf_duality<_CoefficientType,_ComplexType>::findPairA(int q, bool &found, int tau) // const { found = false; PairCell p ; // Check tau belongs to _subCC if (!_subCC.get_Bit(q, tau)) - throw("Dual_HDVF: searching for a cell tau outside _subCC") ; + throw("Hdvf_duality: searching for a cell tau outside _subCC") ; // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible // and tau' belongs to _subCC @@ -515,7 +516,7 @@ PairCell Dual_HDVF<_CoefficientType,_ComplexType>::findPairA(int q, bool &found, /** \brief find all the valid PairCell for A in dimension q */ template -std::vector Dual_HDVF<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found) // const +std::vector Hdvf_duality<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found) // const { vector pairs; found = false ; @@ -543,13 +544,13 @@ std::vector Dual_HDVF<_CoefficientType,_ComplexType>::findPairsA(int q /** \brief find all the valid PairCell containing tau for A in dimension q */ template -std::vector Dual_HDVF<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found, int tau) // const +std::vector Hdvf_duality<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found, int tau) // const { found = false; std::vector pairs; // Check if tau belongs to _subCC if (!_subCC.get_Bit(q, tau)) - throw("Dual_HDVF: searching for a cell tau outside _subCC") ; + throw("Hdvf_duality: searching for a cell tau outside _subCC") ; // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible // and tau' belongs to _subCC @@ -585,7 +586,7 @@ std::vector Dual_HDVF<_CoefficientType,_ComplexType>::findPairsA(int q } template -void Dual_HDVF<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() +void Hdvf_duality<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() { std::cout << endl << "==== Compute perfect HDVF over K" << endl ; // Set _subCC to K @@ -615,7 +616,7 @@ void Dual_HDVF<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() } template -std::vector Dual_HDVF<_CoefficientType,_ComplexType>::computePairingHDVF() +std::vector Hdvf_duality<_CoefficientType,_ComplexType>::computePairingHDVF() { // TODO : check both HDVFs are perfect @@ -632,7 +633,7 @@ std::vector Dual_HDVF<_CoefficientType,_ComplexType>::computePairingHD // Method to get cells if with a given flag (P,S,C) for each dimension template -vector > Dual_HDVF::get_flag (FlagType flag) const +vector > Hdvf_duality::get_flag (FlagType flag) const { vector > res(_L.dim()+1) ; for (int q=0; q<=_L.dim(); ++q) @@ -648,7 +649,7 @@ vector > Dual_HDVF::get_flag (FlagType // Method to get cells with a given flag (P,S,C) for a given dimension template -vector Dual_HDVF::get_flag_dim (FlagType flag, int q) const +vector Hdvf_duality::get_flag_dim (FlagType flag, int q) const { vector res ; for (int i=0; i_K.nb_cells(q); ++i) @@ -659,6 +660,7 @@ vector Dual_HDVF::get_flag_dim (FlagType flag, return res ; } -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif /* HDVF_DUALITY_H */ diff --git a/HDVF/include/CGAL/HDVF/hdvf_tools.hpp b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp index 7b50752e4c37..d8eaf681ecd9 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_tools.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp @@ -12,6 +12,7 @@ #include "CGAL/OSM/OSM.hpp" namespace CGAL { +namespace HDVF { // IO tools @@ -23,9 +24,9 @@ inline ostream & operator<< (ostream &out, const PairCell &p) template -void interaction_loop(HDVF &hdvf, +void interaction_loop(Hdvf &hdvf, ComplexType &complex, - const std::function &hdvf, ComplexType &complex)> &output_vtk) + const std::function &hdvf, ComplexType &complex)> &output_vtk) { bool over = false ; output_vtk(hdvf, complex) ; @@ -112,6 +113,7 @@ void interaction_loop(HDVF &hdvf, } } -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif // HDVF_TOOLS_HPP diff --git a/HDVF/include/CGAL/HDVF/per_hdvf.hpp b/HDVF/include/CGAL/HDVF/per_hdvf.hpp index 11f719c09d30..87dc519f7e9d 100644 --- a/HDVF/include/CGAL/HDVF/per_hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/per_hdvf.hpp @@ -33,6 +33,7 @@ */ namespace CGAL { +namespace HDVF { template class Filtration @@ -145,7 +146,7 @@ class Filtration bool check_filtration() ; template - friend class PersistentHDVF ; + friend class Hdvf_persistence ; }; template @@ -336,7 +337,7 @@ std::function deg_fun (const ComplexType& complex, std::function& hole) template -class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix> +class Hdvf_persistence : public Hdvf_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix> { // Matrices types typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; @@ -391,7 +392,7 @@ class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chai typedef OSM::SubSparseMatrix<_CoefficientType, OSM::ROW> RMatrix; // HDVF type - typedef HDVF_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; + typedef Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; // Persistence diagram types typedef PerDegIntervalT<_DegType> PerDegInterval; @@ -430,8 +431,8 @@ class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chai bool _computation_over ; public: - /** \brief PersistentHDVF Constructor */ - PersistentHDVF(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt = OPT_BND, bool with_export = false) ; + /** \brief Hdvf_persistence Constructor */ + Hdvf_persistence(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt = OPT_BND, bool with_export = false) ; // Persistence step PairCell findNextPair(bool &found) ; @@ -483,7 +484,7 @@ class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chai return per_int_deg.second - per_int_deg.first ; } - friend ostream& operator<< (ostream& out, const PersistentHDVF& per_hdvf) + friend ostream& operator<< (ostream& out, const Hdvf_persistence& per_hdvf) { int i = 0 ; for (PerHole hole : per_hdvf._persist) @@ -759,7 +760,7 @@ class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chai using pointer = Exp_infos*; // or also value_type* // Iterator constructors - iterator(const PersistentHDVF& per_hdvf, int i=0) : _i(i), _per_hdvf(per_hdvf) + iterator(const Hdvf_persistence& per_hdvf, int i=0) : _i(i), _per_hdvf(per_hdvf) { if (_i == 0) { @@ -827,7 +828,7 @@ class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chai private: int _i ; // Index along _persist - const PersistentHDVF& _per_hdvf ; // per_hdvf iterated + const Hdvf_persistence& _per_hdvf ; // per_hdvf iterated }; iterator begin() { return iterator(*this, 0) ; } iterator end() { return iterator(*this, _persist.size()) ; } @@ -835,7 +836,7 @@ class PersistentHDVF : public HDVF_core<_CoefficientType,_ComplexType, OSM::Chai template -PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::PersistentHDVF(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt, bool with_export) : HDVF_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix>(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1), _computation_over(false) +Hdvf_persistence<_CoefficientType, _ComplexType, _DegType>::Hdvf_persistence(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt, bool with_export) : Hdvf_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix>(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1), _computation_over(false) { // Initialisation of _t_dim, _K_to_per and _per_to_K _t_dim.resize(this->_K.dim()+1, 0) ; @@ -902,7 +903,7 @@ PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::PersistentHDVF(const _ } template -PairCell PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::findNextPair(bool &found) +PairCell Hdvf_persistence<_CoefficientType, _ComplexType, _DegType>::findNextPair(bool &found) { PairCell p ; // Get current cell (in the basis K) @@ -944,7 +945,7 @@ PairCell PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::findNextPair( } template -void PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::stepPersist() +void Hdvf_persistence<_CoefficientType, _ComplexType, _DegType>::stepPersist() { // Compute next persistent pair @@ -1000,6 +1001,7 @@ void PersistentHDVF<_CoefficientType, _ComplexType, _DegType>::stepPersist() } } -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif // PER_HOM_HPP diff --git a/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp b/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp index 463e4617f64c..9e28f88a1348 100644 --- a/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp @@ -15,6 +15,7 @@ #include "CGAL/OSM/Bitboard.hpp" namespace CGAL { +namespace HDVF { /** * \class SubChainComplex @@ -200,6 +201,7 @@ class SubChainComplex } }; -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif /* SUB_CHAIN_COMPLEX_H */ diff --git a/HDVF/include/CGAL/HDVF/tools_io.hpp b/HDVF/include/CGAL/HDVF/tools_io.hpp index 1c63b374a364..3b21886f424f 100644 --- a/HDVF/include/CGAL/HDVF/tools_io.hpp +++ b/HDVF/include/CGAL/HDVF/tools_io.hpp @@ -17,6 +17,7 @@ #include namespace CGAL { +namespace HDVF { using namespace std ; @@ -1152,7 +1153,8 @@ class Cub_object } } ; -} +} /* end namespace HDVF */ +} /* end namespace CGAL */ #endif /* tools_io_hpp */ diff --git a/HDVF/include/CGAL/OSM/Bitboard.hpp b/HDVF/include/CGAL/OSM/Bitboard.hpp index 5980f277ad5b..285667961126 100644 --- a/HDVF/include/CGAL/OSM/Bitboard.hpp +++ b/HDVF/include/CGAL/OSM/Bitboard.hpp @@ -54,15 +54,15 @@ const int index64[64] = { 13, 18, 8, 12, 7, 6, 5, 63 }; - +namespace CGAL { namespace OSM { /** * \class Bitboard * \brief Bitboards are long bitset with specific operations. - * + * * Bitboards are used with SparseMatrix to quickly find and set non empty columns. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -251,7 +251,7 @@ class Bitboard { ++(*this); } while (index >_index); } - + } /** @@ -365,64 +365,64 @@ class Bitboard { std::size_t size; std::vector iteratedBoards; }; - + /** * \brief Bitboard default constructor. Initialize bitboard with all zeros and size 64. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 */ Bitboard(): boards({0UL}), _size(64) {} - + /** * \brief Bitboard value intializer. Initialize bitboard with given vector of bitboards. - * + * * \param[in] _bitboards The vector of 64bit ints. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 */ Bitboard(const std::vector &_bitboard): - boards(_bitboard), - _size(_bitboard.size() * 64) + boards(_bitboard), + _size(_bitboard.size() * 64) {} /** * \brief Bitboard size initializer. Initialize bitboard with given size. - * + * * \param[in] _size The size of the bitboard. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 */ Bitboard(const std::size_t _size, bool empty = true): - boards(std::vector(_size / BITBOARD_INT_SIZE + (_size % BITBOARD_INT_SIZE != 0))), - _size(_size) + boards(std::vector(_size / BITBOARD_INT_SIZE + (_size % BITBOARD_INT_SIZE != 0))), + _size(_size) { if (!empty) bit_not() ; } - + /** * \brief Bitboard copy constructor. Initialize bitboard with given bitboard. - * + * * \param[in] _bitboards The bitboard to copy. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 */ Bitboard(const Bitboard &_bitboard): - boards(_bitboard.boards), - _size(_bitboard._size) + boards(_bitboard.boards), + _size(_bitboard._size) {} - + /** * \brief Bitboard assign operator. Initialize bitboard with given bitboard. - * + * * \param[in] _bitboard The bitboard to copy. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -430,10 +430,10 @@ class Bitboard { Bitboard& operator=(const Bitboard &_bitboard) { this->boards = _bitboard.boards; this->_size = _bitboard._size; - + return *this; } - + /** * \brief Bitwise NOT on a bitboard. * @@ -448,7 +448,7 @@ class Bitboard { { boards[i] = ~boards[i]; } - + return *this; } @@ -470,21 +470,21 @@ class Bitboard { /** * \brief Bitboard begin iterator that allows to loop through all non-null indices. * \returns The begin iterator. - * + * * \note The iterator is constant. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 */ iterator begin() const { return iterator(0, _size, boards); } - + /** * \brief Bitboard past-the-end iterator. * \returns The past-the-end iterator. - * + * * \note The iterator is constant. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -503,7 +503,7 @@ class Bitboard { */ reverse_iterator reverse_begin() const { return reverse_iterator(_size-1, _size, boards); } reverse_iterator reverse_begin(size_t index) const { std::cout << "reverse with index " << index << std::endl ; return reverse_iterator(index, _size, boards); } - + /** * \brief Bitboard past-the-end reverse_iterator. * \returns The past-the-end reverse_iterator. @@ -515,14 +515,14 @@ class Bitboard { * \date 23/05/2024 */ reverse_iterator reverse_end() const { return reverse_iterator(size_t_maxvalue, _size, boards); } - + /** * \brief Stream operator that displays all bits. - * + * * \param[in,out] _stream The stream to edit. * \param[in] _bitboard The bitboard to display. * \returns The edited stream. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -531,22 +531,22 @@ class Bitboard { // Cheat for speed, iterate through all non-null indices and fill the in-between with zeros. std::size_t last = -1; for (auto index: _bitboard) { - _stream << std::string(index - last - 1, '0') << "1"; + _stream << std::string(index - last - 1, '0') << "1"; last = index; } // Add the leading zeros. _stream << std::string(_bitboard._size - last - 1, '0'); - + return _stream; } - + /** * \brief Bitwise OR between two bitboards. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the OR. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -556,14 +556,14 @@ class Bitboard { res |= _right; return res; } - + /** * \brief Bitwise OR between a bitboard and a single bit at given position. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the OR. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -573,14 +573,14 @@ class Bitboard { res |= _right; return res; } - + /** * \brief Bitwise OR between a bitboard and a single bit at given position. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the OR. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -590,14 +590,14 @@ class Bitboard { res |= _left; return res; } - + /** * \brief Bitwise AND between two bitboards. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the AND. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -607,14 +607,14 @@ class Bitboard { res &= _right; return res; } - + /** * \brief Bitwise AND between a bitboard and a single bit at given position. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the AND. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -624,14 +624,14 @@ class Bitboard { res &= _right; return res; } - + /** * \brief Bitwise AND between a bitboard and a single bit at given position. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the AND. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -641,14 +641,14 @@ class Bitboard { res &= _left; return res; } - + /** * \brief Bitwise XOR between two bitboards. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the XOR. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -658,14 +658,14 @@ class Bitboard { res ^= _right; return res; } - + /** * \brief Bitwise XOR between a bitboard and a single bit at given position. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the XOR. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -675,14 +675,14 @@ class Bitboard { res ^= _right; return res; } - + /** * \brief Bitwise XOR between a bitboard and a single bit at given position. - * + * * \param[in] _left The left hand side. * \param[in] _right The right hand side. * \returns A new bitboard which is the result of the XOR. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -692,13 +692,13 @@ class Bitboard { res ^= _left; return res; } - + /** * \brief Bitwise OR between two bitboards. - * + * * \param[in] _other The other bitboard. * \returns The reference to the ORed bitboard. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -707,16 +707,16 @@ class Bitboard { for (std::size_t i = 0 ; i < boards.size() ; i++) { boards[i] |= _other.boards[i]; } - + return *this; } /** * \brief Bitwise OR between a bitboard and a single bit at given position. - * + * * \param[in] _other The bit position. * \returns The reference to the ORed bitboard. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -724,17 +724,17 @@ class Bitboard { Bitboard& operator|=(const std::size_t &_other) { std::size_t boardIndex = _other / BITBOARD_INT_SIZE; std::uint64_t bit = 1ULL << (_other % BITBOARD_INT_SIZE); - + boards[boardIndex] |= bit; return *this; } - + /** * \brief Bitwise AND between two bitboards. - * + * * \param[in] _other The other bitboard. * \returns The reference to the ANDed bitboard. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -743,16 +743,16 @@ class Bitboard { for (std::size_t i = 0 ; i < boards.size() ; i++) { boards[i] &= _other.boards[i]; } - + return *this; } - + /** * \brief Bitwise AND between a bitboard and a single bit at given position. - * + * * \param[in] _other The bit position. * \returns The reference to the ANDed bitboard. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -760,17 +760,17 @@ class Bitboard { Bitboard& operator&=(const std::size_t &_other) { std::size_t boardIndex = _other / BITBOARD_INT_SIZE; std::uint64_t bit = 1ULL << (_other % BITBOARD_INT_SIZE); - + boards[boardIndex] &= bit; return *this; } - + /** * \brief Bitwise XOR between two bitboards. - * + * * \param[in] _other The other bitboard. * \returns The reference to the XORed bitboard. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -779,16 +779,16 @@ class Bitboard { for (std::size_t i = 0 ; i < boards.size() ; i++) { boards[i] ^= _other.boards[i]; } - + return *this; } - + /** * \brief Bitwise XOR between a bitboard and a single bit at given position. - * + * * \param[in] _other The bit position. * \returns The reference to the XORed bitboard. - * + * * \author Fedyna K. * \version 0.2.0 * \date 23/05/2024 @@ -796,14 +796,14 @@ class Bitboard { Bitboard& operator^=(const std::size_t &_other) { std::size_t boardIndex = _other / BITBOARD_INT_SIZE; std::uint64_t bit = 1ULL << (_other % BITBOARD_INT_SIZE); - + boards[boardIndex] ^= bit; return *this; } - + /** * \brief Toggle on and off a given bit. - * + * * \param[in] _index The bit position. * * \author Fedyna K. @@ -813,10 +813,10 @@ class Bitboard { void toggle(const std::size_t &_index) { *this ^= _index; } - + /** * \brief Toggle on a given bit. - * + * * \param[in] _index The bit position. * * \author Fedyna K. @@ -826,10 +826,10 @@ class Bitboard { void setOn(const std::size_t &_index) { *this |= _index; } - + /** * \brief Toggle off a given bit. - * + * * \param[in] _index The bit position. * * \author Fedyna K. @@ -839,20 +839,21 @@ class Bitboard { void setOff(const std::size_t &_index) { std::size_t boardIndex = _index / BITBOARD_INT_SIZE; std::uint64_t bit = 1ULL << (_index % BITBOARD_INT_SIZE); - + boards[boardIndex] &= ~bit; } - + bool isOn(const std::size_t &_index) const { std::size_t boardIndex = _index / BITBOARD_INT_SIZE; std::uint64_t bit = 1ULL << (_index % BITBOARD_INT_SIZE); - + return (boards[boardIndex] & bit) != 0; } size_t size() const { return _size ; } }; -} +} /* end namespace OSM */ +} /* end namespace CGAL */ #endif diff --git a/HDVF/include/CGAL/OSM/Chain.hpp b/HDVF/include/CGAL/OSM/Chain.hpp index b594cce5fc08..022fa1e75cd1 100644 --- a/HDVF/include/CGAL/OSM/Chain.hpp +++ b/HDVF/include/CGAL/OSM/Chain.hpp @@ -19,7 +19,7 @@ #include #include - +namespace CGAL { namespace OSM { /** @@ -37,12 +37,12 @@ namespace OSM { */ template class Chain { - + public: typedef std::pair pair; typedef typename std::unordered_map::iterator iterator; typedef typename std::unordered_map::const_iterator const_iterator; - + // Add these lines to allow the SparseMatrix class to access other templated // SparsedMatrix private members. template @@ -52,16 +52,16 @@ class Chain { protected: /** \brief The chain inner representation and storage of data. */ std::unordered_map chainData; - + /** \brief The chain coefficient type. */ typedef _CoefficientType coefficientType; - + /** \brief The chain type flag. */ int chainTypeFlag = _ChainTypeFlag; - + /** \brief The chain boundary. */ int upperBound; - + public: /** * \brief Create new Chain for SparseMatrix object. @@ -84,7 +84,7 @@ class Chain { upperBound = 0; chainData = std::unordered_map(); } - + /** * \brief Create new Chain for SparseMatrix object. * @@ -121,7 +121,7 @@ class Chain { * \date 08/04/2024 */ size_t dimension() const { return upperBound ; } - + /** * \brief Create new Chain for SparseMatrix object. * @@ -147,9 +147,9 @@ class Chain { Chain(const Chain &_otherToCopy) { upperBound = _otherToCopy.upperBound; chainData = _otherToCopy.chainData; -// *this = _otherToCopy; + // *this = _otherToCopy; } - + /** * \brief Assign to other chain. * @@ -172,10 +172,10 @@ class Chain { Chain& operator=(const Chain &_otherToCopy) { upperBound = _otherToCopy.upperBound; chainData = _otherToCopy.chainData; - + return *this; } - + /** * \brief Displays a Chain in the output stream. * @@ -195,15 +195,15 @@ class Chain { for (const_iterator i = _chain.chainData.begin() ; i != _chain.chainData.end() ; ++i) { _stream << i->first << ": " << i->second << ", "; } - + if (_chain.chainData.size() > 0) { _stream << "\b\b"; } _stream << "]"; - + return _stream; } - + /** * \brief Adds two chains together. * @@ -229,10 +229,10 @@ class Chain { friend Chain operator+(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { Chain newChain = _first; newChain += _second; - + return newChain; } - + /** * \brief Substract two chains together. * @@ -261,7 +261,7 @@ class Chain { return newChain; } - + /** * \brief Apply factor on each coefficients. * @@ -283,7 +283,7 @@ class Chain { return newChain; } - + /** * \brief Apply factor on each coefficients. * @@ -305,7 +305,7 @@ class Chain { return newChain; } - + /** * \brief Perform matrix multiplication between two chains. * @@ -328,7 +328,7 @@ class Chain { */ template friend SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); - + /** * \brief Perform matrix multiplication between two chains. * @@ -351,7 +351,7 @@ class Chain { */ template friend SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); - + /** * \brief Perform dot product between two chains. * @@ -372,7 +372,7 @@ class Chain { */ template friend _CT operator*(const Chain<_CT, ROW> &_row, const Chain<_CT, COLUMN> &_column); - + /** * \brief Add a chain and assign. * @@ -397,7 +397,7 @@ class Chain { if (this->upperBound != _other.upperBound) { throw std::runtime_error("Chains must be the same size."); } - + for (pair pair: _other.chainData) { this->chainData[pair.first] += pair.second; @@ -405,10 +405,10 @@ class Chain { this->chainData.erase(pair.first); } } - + return *this; } - + /** * \brief Substract a chain and assign. * @@ -433,18 +433,18 @@ class Chain { if (this->upperBound != _other.upperBound) { throw std::runtime_error("Chains must be the same size."); } - + for (pair pair: _other.chainData) { this->chainData[pair.first] -= pair.second; - + if (this->chainData[pair.first] == 0) { this->chainData.erase(pair.first); } } - + return *this; } - + /** * \brief Apply factor on each coefficients and assign. * @@ -463,14 +463,14 @@ class Chain { this->chainData.clear(); return *this; } - + for (pair pair: this->chainData) { this->chainData[pair.first] = pair.second * _lambda; } - + return *this; } - + /** * \brief Get a coefficient from the chain. * @@ -490,10 +490,10 @@ class Chain { if (_index >= upperBound) { throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); } - + return chainData.at(_index); } - + /** * \brief Set a coefficient in the chain. * @@ -513,10 +513,10 @@ class Chain { if (_index >= upperBound) { throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); } - + return chainData[_index]; } - + /** * \brief Checks if a coefficient is null. Should be used instead of operator[] for that case. * @@ -530,7 +530,7 @@ class Chain { const bool isNull(const int _index) const { return chainData.find(_index) == chainData.end(); } - + /** * \brief Checks if the chain is null. * @@ -543,7 +543,7 @@ class Chain { const bool isNull() const { return chainData.size() == 0; } - + /** * \brief Get a subchain from the chain. * @@ -565,7 +565,7 @@ class Chain { */ template friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes); - + /** * \brief Get a subchain from the chain. * @@ -587,7 +587,7 @@ class Chain { */ template friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _indexes); - + /** * \brief Get a subchain from the chain and assign. * @@ -610,10 +610,10 @@ class Chain { for (int index : _indexes) { this->chainData.erase(index); } - + return *this; } - + /** * \brief Get a subchain from the chain and assign. * @@ -634,10 +634,10 @@ class Chain { */ Chain& operator/=(const int _index) { this->chainData.erase(_index); - + return *this; } - + /** * \brief Set all coefficients to zero. * @@ -648,7 +648,7 @@ class Chain { void nullify() { this->chainData.clear(); } - + /** * \brief Iterator to the beginning of the chain. * @@ -668,7 +668,7 @@ class Chain { iterator begin() noexcept { return chainData.begin(); } - + /** * \brief Constant iterator to the beginning of the chain. * @@ -688,7 +688,7 @@ class Chain { const_iterator begin() const noexcept { return chainData.begin(); } - + /** * \brief Constant iterator to the beginning of the chain. * @@ -708,7 +708,7 @@ class Chain { const_iterator cbegin() const noexcept { return chainData.cbegin(); } - + /** * \brief Iterator to the end of the chain. * @@ -728,7 +728,7 @@ class Chain { iterator end() noexcept { return chainData.end(); } - + /** * \brief Constant iterator to the end of the chain. * @@ -748,7 +748,7 @@ class Chain { const_iterator end() const noexcept { return chainData.end(); } - + /** * \brief Constant iterator to the end of the chain. * @@ -768,7 +768,7 @@ class Chain { const_iterator cend() const noexcept { return chainData.cend(); } - + /** * \brief Transpose a Chain. * @@ -782,15 +782,15 @@ class Chain { */ Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> chain; - + chain.upperBound = this->upperBound; for (pair pair: this->chainData) { chain.chainData[pair.first] = pair.second; } - + return chain; } - + /** * \brief Checks if chain is a column. * @@ -805,7 +805,7 @@ class Chain { bool isColumn() const { return _ChainTypeFlag == COLUMN; } - + /** * \brief Checks if chain is a row. * @@ -846,11 +846,11 @@ class Chain { template SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { SparseMatrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); - + for (std::pair pair : _row.chainData) { OSM::setColumn(matrix,pair.first,_column * pair.second) ; } - + return matrix; } @@ -877,11 +877,11 @@ SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Cha template SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { SparseMatrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); - + for (std::pair pair : _column.chainData) { OSM::setRow(matrix,pair.first,_row * pair.second); } - + return matrix; } @@ -913,7 +913,7 @@ _CoefficientType operator*(const Chain<_CoefficientType, ROW> &_row, const Chain for (std::pair pair: _column.chainData) { indexes[pair.first] += 1; } - + // Perform dot product _CoefficientType result = _CoefficientType(); for (std::pair index: indexes) { @@ -921,7 +921,7 @@ _CoefficientType operator*(const Chain<_CoefficientType, ROW> &_row, const Chain result += _row.chainData.at(index.first) * _column.chainData.at(index.first); } } - + return result; } @@ -975,6 +975,7 @@ Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _index) { return newChain; } -} +} /* end namespace OSM */ +} /* end namespace CGAL */ #endif diff --git a/HDVF/include/CGAL/OSM/SparseMatrix.hpp b/HDVF/include/CGAL/OSM/SparseMatrix.hpp index f6967ba6c844..dc0d4d410be3 100644 --- a/HDVF/include/CGAL/OSM/SparseMatrix.hpp +++ b/HDVF/include/CGAL/OSM/SparseMatrix.hpp @@ -21,14 +21,15 @@ // DEBUG : matrix output for SparseMatrices / no DEBUG : chain output for SparseMatrices //#define DEBUG +namespace CGAL { namespace OSM { - + /** * \class SparseMatrix * \brief Vector implementation of sparse matrices. - * + * * The SparseMatrix class contains all algebraic functions that are related to OSM matrices (optimized sparse matrices). - * + * * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) * @@ -38,22 +39,22 @@ namespace OSM { */ template class SparseMatrix { - + public: typedef Chain<_CoefficientType, _ChainTypeFlag> MatrixChain; - + // Add these lines to allow the SparseMatrix class to access other templated // SparsedMatrix private members. template friend class SparseMatrix; - + protected: /** \brief The inner chain storage. */ std::vector> chains; - + /** \brief A bitboard containing state of each columns. */ Bitboard chainsStates; - + /** \brief The matrix size as a (row, column) pair. */ std::pair size; @@ -79,23 +80,23 @@ class SparseMatrix { if (_ChainTypeFlag == ROW && _index >= size.first) { throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); } - + chainsStates |= _index; return chains[_index]; } - + public: /** * \brief Create new SparseMatrix object. - * + * * Default constructor, initialize an empty Matrix as Z integers column chains. * The default matrix size is 128x128. - * + * * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -105,19 +106,19 @@ class SparseMatrix { chainsStates = Bitboard(0); size = {0, 0}; } - + /** * \brief Create new SparseMatrix object. - * + * * Constructor with size, initialize an empty Matrix as Z integers column chains. - * + * * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) * \param[in] _rowCount The number of rows to preallocate. * \param[in] _columnCount The number of columns to preallocate. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -125,35 +126,35 @@ class SparseMatrix { SparseMatrix(const int _rowCount, const int _columnCount) { int mainSize = _ChainTypeFlag == COLUMN ? _columnCount : _rowCount; int secondarySize = _ChainTypeFlag == COLUMN ? _rowCount : _columnCount; - + chains = std::vector>(mainSize); for (int i = 0 ; i < mainSize ; i++) { chains[i] = Chain<_CoefficientType, _ChainTypeFlag>(secondarySize); } - + chainsStates = Bitboard(mainSize); size = {_rowCount, _columnCount}; } - + /** * \brief Create new SparseMatrix from other SparseMatrix object. - * + * * Copy constructor, initialize a SparseMatrix (not necessarly based on the same type of matrix). * If types are different, the constructor performs conversion. * * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) * \param[in] _otherToCopy The matrix we want to copy. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template SparseMatrix(const SparseMatrix<_CoefficientType,CTF> &_otherToCopy) { -// *this = _otherToCopy; + // *this = _otherToCopy; if (_ChainTypeFlag == CTF) { chainsStates = _otherToCopy.chainsStates; @@ -194,20 +195,20 @@ class SparseMatrix { } } } - + /** * \brief Assign to other matrix. - * + * * Assign to other matrix coefficient-wise, equivalent to copying it. - * + * * \pre The matrices must have the same type. * * \param[in] _otherToCopy The matrix we want to copy. - * + * * \return The reference to the modified matrix. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -221,7 +222,7 @@ class SparseMatrix { return *this; } - + /** * \brief Clean a SparseMatrix (set everything to zero) * @@ -246,14 +247,14 @@ class SparseMatrix { /** * \brief Displays a SparseMatrix in the output stream. - * + * * \param[in] _stream The output stream. * \param[in] _matrix The matrix to display. - * + * * \return A reference to the modified stream. - * + * * \see \link OSM::Matrix \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -261,13 +262,13 @@ class SparseMatrix { friend std::ostream& operator<<(std::ostream &_stream, const SparseMatrix &_matrix) { #ifndef DEBUG bool empty = true; - + _stream << "["; for (int index : _matrix.chainsStates) { empty = false; _stream << index << ": " << _matrix.chains[index] << ", "; } - + if (!empty) { _stream << "\b\b"; } @@ -277,10 +278,10 @@ class SparseMatrix { { for (int j=0; j<_matrix.size.second; ++j) { - + //_CoefficientType tmp = _matrix[j][i] ; // get_coef(i,j) ; _CoefficientType tmp = _matrix.get_coef(i,j) ; - + if (tmp == 0) _stream << ".\t" ; else @@ -292,24 +293,24 @@ class SparseMatrix { return _stream; } - - + + /** * \brief Adds two matrices together. - * + * * Adds each coefficient of the matrix together. - * + * * \pre The matrixs have the same chain type. - * + * * \warning Will raise an error if the other matrix is not the same chain type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return A new matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -318,26 +319,26 @@ class SparseMatrix { friend SparseMatrix operator+(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { SparseMatrix newMatrix(_first); newMatrix += _second; - + return newMatrix; } - + /** * \brief Substracts two matrices together. - * + * * Substracts each coefficient of the matrix together. - * + * * \pre The matrixs have the same chain type. - * + * * \warning Will raise an error if the other matrix is not the same chain type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return A new matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -346,22 +347,22 @@ class SparseMatrix { friend SparseMatrix operator-(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { SparseMatrix newMatrix = _first; newMatrix -= _second; - + return newMatrix; } - + /** * \brief Apply factor on each coefficients. - * + * * \warning Will raise an error if _lambda is 0. - * + * * \param[in] _lambda The factor to apply. * \param[in] _matrix The matrix. - * + * * \return A new matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -370,22 +371,22 @@ class SparseMatrix { friend SparseMatrix operator*(const _CT& _lambda, const SparseMatrix<_CT, _CTF> &_matrix) { SparseMatrix newMatrix = _matrix; newMatrix *= _lambda; - + return newMatrix; } - + /** * \brief Apply factor on each coefficients. - * + * * \warning Will raise an error if _lambda is 0. - * + * * \param[in] _matrix The matrix. * \param[in] _lambda The factor to apply. - * + * * \return A new matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -394,102 +395,102 @@ class SparseMatrix { friend SparseMatrix operator*(const SparseMatrix<_CT, _CTF> &_matrix, const _CT& _lambda) { SparseMatrix newMatrix = _matrix; newMatrix *= _lambda; - + return newMatrix; } - + /** * \brief Perform matrix multiplication between two matrices. * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); - + /** * \brief Perform matrix multiplication between two matrices. * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); - + /** * \brief Perform matrix multiplication between two matrices. * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); - + /** * \brief Perform matrix multiplication between two matrices. * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); - + /** * \brief Perform multiplication between a column-based matrix and a column-based chain. * @@ -558,7 +559,7 @@ class SparseMatrix { */ template friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) ; - + /** * \brief Perform multiplication between a row-based chain and a column-based matrix. * @@ -584,111 +585,111 @@ class SparseMatrix { /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); - + /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); - + /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); - + /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ template friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); - + /** * \brief Add a matrix and assign. - * + * * Adds each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -697,80 +698,80 @@ class SparseMatrix { if (this->size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } - + for (int index: _other.chainsStates) { this->chainsStates |= index; this->chains[index] += _other.chains[index]; - + if (this->chains[index].isNull()) { this->chainsStates.setOff(index); } } - + return *this; } - + /** * \brief Add a matrix and assign. - * + * * Adds each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); - + /** * \brief Add a matrix and assign. - * + * * Adds each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); - + /** * \brief Substract a matrix and assign. - * + * * Substracts each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -779,7 +780,7 @@ class SparseMatrix { if (this->size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } - + for (int index: _other.chainsStates) { this->chainsStates |= index; this->chains[index] -= _other.chains[index]; @@ -788,68 +789,68 @@ class SparseMatrix { this->chainsStates.setOff(index); } } - + return *this; } - - + + /** * \brief Substract a matrix and assign. - * + * * Substracts each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); - + /** * \brief Substract a matrix and assign. - * + * * Substracts each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); - + /** * \brief Apply factor on each coefficients and assign. - * + * * \warning Will raise an error if _lambda is 0. - * + * * \param[in] _lambda The factor to apply. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -859,11 +860,11 @@ class SparseMatrix { *this = SparseMatrix(); return *this; } - + for (int index: this->chainsStates) { this->chains[index] *= _lambda; } - + return *this; } @@ -889,110 +890,110 @@ class SparseMatrix { } return res ; } - + /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); - + /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other); - + /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); - + /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); - + /** * \brief Get a chain from a const matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The chain stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1004,21 +1005,21 @@ class SparseMatrix { if (_ChainTypeFlag == ROW && _index >= size.first) { throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); } - + return chains[_index]; } - + /** * \brief Set a given coefficient. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _i The row index. * \param[in] _j The column index. * \param[in] _d The value. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1039,24 +1040,24 @@ class SparseMatrix { else (*this)[_i][_j] = _d ; } - -/** + + /** * \brief Get a given coefficient. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _i The row index. * \param[in] _j The column index. - * + * * \return The value of the given coefficient. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ - + _CoefficientType get_coef(const int _i, const int _j) const { if (_i >= size.first) { //std::cout << "Provided _i index should be less than " << size.first << "." << std::endl; @@ -1073,87 +1074,87 @@ class SparseMatrix { else // ROW return (*this)[_i][_j] ; } - + /** * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The column stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); - + /** * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The column stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index); - + /** * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The row stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); - + /** * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The row stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); - + /** * \brief Get a const reference over a column from a column matrix * @@ -1171,7 +1172,7 @@ class SparseMatrix { */ template friend const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); - + /** * \brief Get a const reference over a row from a row matrix * @@ -1207,7 +1208,7 @@ class SparseMatrix { */ template friend Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index); - + /** * \brief Get a reference over a row from a row matrix * @@ -1225,92 +1226,92 @@ class SparseMatrix { */ template friend Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index); - - + + /** * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new column. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); - + /** * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new column. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); - + /** * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new row. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); - + /** * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new row. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 */ template friend void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); - + /** * \brief Get a submatrix from the matrix. - * + * * Removes all indexes provided in the vector from the matrix and returns it. - * + * * \note Will return a copy of the matrix if given vector is empty. * \note The submatrix will be rectangular. - * + * * \param[in] _matrix The matrix to process. * \param[in] _indexes The indexes to remove. - * + * * \return A new matrix representing the result. - * + * * \see \link OSM::SparseMatrix \endlink * \see \link std::vector \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1320,23 +1321,23 @@ class SparseMatrix { res /= _indexes; return res; } - + /** * \brief Get a submatrix from the matrix. - * + * * Removes index from the matrix and returns it. - * + * * \note Will return a copy of the matrix if given vector is empty. * \note The submatrix will be rectangular. - * + * * \param[in] _matrix The matrix to process. * \param[in] _index The index to remove. - * + * * \return A new matrix representing the result. - * + * * \see \link OSM::SparseMatrix \endlink * \see \link std::vector \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1346,21 +1347,21 @@ class SparseMatrix { res /= _index; return res; } - + /** * \brief Get a submatrix from the matrix and assign. - * + * * Removes all indexes provided in the vector from the matrix and returns it. - * + * * \note Will not alter the matrix if given vector is empty. - * + * * \param[in] _indexes The indexes to remove. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::SparseMatrix \endlink * \see \link std::vector \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1369,25 +1370,25 @@ class SparseMatrix { for (int index : _indexes) { *this /= index; } - + return *this; } - + /** * \brief Get a submatrix from the matrix and assign. - * + * * Removes index from the matrix and returns it. - * + * * \note Will return a copy of the matrix if given vector is empty. * \note The submatrix will be rectangular. - * + * * \param[in] _index The index to remove. - * + * * \return A new matrix representing the result. - * + * * \see \link OSM::SparseMatrix \endlink * \see \link std::vector \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1395,7 +1396,7 @@ class SparseMatrix { SparseMatrix& operator/=(const int _index) { chains[_index].nullify(); chainsStates.setOff(_index); - + return *this; } @@ -1434,10 +1435,10 @@ class SparseMatrix { *this /= std::vector({index}) ; } } - + return *this; } - + SparseMatrix& delRow(int _index) { std::vector tmp_id{_index}; @@ -1459,7 +1460,7 @@ class SparseMatrix { SparseMatrix& delCoef(int _index1, int _index2) { - + if (_ChainTypeFlag == OSM::COLUMN) { std::vector tmp_id({_index1}) ; MatrixChain &tmp(chains[_index2]); @@ -1477,35 +1478,35 @@ class SparseMatrix { return *this; } - + /** * \brief Iterator to the beginning of the chains indices. - * + * * \return The iterator to the beginning of the chains indices. - * + * * \see \link OSM::SparseMatrix \endlink * \see \link OSM::Chain \endlink * \see \link std::vector \endlink * \see \link std::vector::iterator \endlink * \see \link std::vector::begin \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ inline Bitboard::iterator begin() noexcept { return chainsStates.begin(); } - + /** * \brief Iterator to the ending of the chains indices. - * + * * \return The iterator to the ending of the chains indices. - * + * * \see \link OSM::SparseMatrix \endlink * \see \link OSM::Chain \endlink * \see \link std::vector \endlink * \see \link std::vector::iterator \endlink * \see \link std::vector::end \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1529,7 +1530,7 @@ class SparseMatrix { */ inline Bitboard::reverse_iterator reverse_begin() noexcept { return chainsStates.reverse_begin(); } inline Bitboard::reverse_iterator reverse_begin(size_t index) noexcept { return chainsStates.reverse_begin(index); } - + /** * \brief Reverse iterator to the ending of the chains indices. * @@ -1546,38 +1547,38 @@ class SparseMatrix { * \date 08/04/2024 */ inline Bitboard::reverse_iterator reverse_end() noexcept { return chainsStates.reverse_end(); } - - + + /** * \brief Transpose a matrix. - * + * * \return A new matrix where the chain type flag is changed. - * + * * \see \link OSM::SparseMatrix \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transposed(this->size.second, this->size.first); - + for (int index : this->chainsStates) { transposed.chains[index] = this->chains[index].transpose(); } - + transposed.chainsStates = this->chainsStates; - + return transposed; } - + /** * \brief Gets the matrix size. - * + * * \return The matrix size as a Row/Column pair. - * + * * \see \link OSM::SparseMatrix \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 06/05/2024 @@ -1591,20 +1592,20 @@ class SparseMatrix { /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1612,7 +1613,7 @@ class SparseMatrix { template SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - + // Perform col-col matrix multiplication with linear combination of columns. for (int index: _second.chainsStates) { Chain<_CT, COLUMN> column(_first.size.first); @@ -1622,29 +1623,29 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, con column += colRight.second * _first.chains[colRight.first]; } } - + res[index] = column; } - + return res; } /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1652,7 +1653,7 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, con template SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - + // Perform row-col matrix multiplication with dot products. for (int colRight: _second.chainsStates) { Chain<_CT, COLUMN> column(_first.size.first); @@ -1663,29 +1664,29 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const column[rowLeft] = coef; } } - + res[colRight] = column; } - + return res; } /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1693,31 +1694,31 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const template SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - + // Perform row-col matrix multiplication with dot products. for (int colLeft: _first.chainsStates) { res += _first.chains[colLeft] * _second.chains[colLeft]; } - + return res; } /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a column-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1725,7 +1726,7 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, con template SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - + // Perform row-col matrix multiplication with dot products. for (int i = 0 ; i < _second.size.second ; i++) { Chain<_CT, COLUMN> column(_first.size.first); @@ -1736,12 +1737,12 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const column[rowLeft] = coef; } } - + if (!column.isNull()) { res[i] = column; } } - + return res; } @@ -1773,7 +1774,7 @@ Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chai for (typename Chain<_CT, COLUMN>::const_iterator it = _second.begin(); it != _second.end(); ++it) { - column += it->second * _first.chains[it->first]; + column += it->second * _first.chains[it->first]; } return column; @@ -1805,7 +1806,7 @@ Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_ // Perform row-col matrix multiplication with dots Chain<_CT, COLUMN> column(_first.size.first); - for (int index : _first.chainsStates) + for (int index : _first.chainsStates) { _CT tmp(_first[index] * _second) ; if (tmp != 0) @@ -1842,7 +1843,7 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, for (typename Chain<_CT, ROW>::const_iterator it = _first.begin(); it != _first.end(); ++it) { - row += it->second * _second.chains[it->first]; + row += it->second * _second.chains[it->first]; } return row; @@ -1885,20 +1886,20 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1906,41 +1907,41 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, template SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - + for (int i = 0 ; i < _first.size.first ; i++) { Chain<_CT, ROW> row(_second.size.second); - + for (int colRight: _second.chainsStates) { _CT coef = getRow(_first, i) * _second.chains[colRight]; if (coef != 0) { row[colRight] = coef; - } + } } - + if (!row.isNull()) { res[i] = row; } } - + return res; } /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1948,7 +1949,7 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const template SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - + // Perform row-col matrix multiplication with dot products. for (int rowLeft: _first.chainsStates) { Chain<_CT, ROW> row(_second.size.second); @@ -1959,29 +1960,29 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const Spa row[colRight] = coef; } } - + res[rowLeft] = row; } - + return res; } /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -1989,31 +1990,31 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const Spa template SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - + // Perform row-col matrix multiplication with dot products. for (int colLeft: _first.chainsStates) { res += _first.chains[colLeft] % _second.chains[colLeft]; } - + return res; } /** * \brief Perform matrix multiplication between two chains. - * + * * Generate a row-based matrix from the matrix multiplication and return it. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _first The first matrix. * \param[in] _second The second matrix. - * + * * \return The result of the matrix multiplication, column-based. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 @@ -2021,7 +2022,7 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const template SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - + // Perform row-row matrix multiplication with linear combination of rows. for (int index: _first.chainsStates) { Chain<_CT, ROW> row(_second.size.second); @@ -2031,29 +2032,29 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const Spa row += colRight.second * _second.chains[colRight.first]; } } - + res[index] = row; } - + return res; } /** * \brief Add a matrix and assign. - * + * * Adds each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2063,38 +2064,38 @@ SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } - + for (int index = 0 ; index < _other.size.second ; index++) { Chain column = getColumn(_other, index); if (!column.isNull()) { _matrix.chainsStates |= index; _matrix.chains[index] += getColumn(_other, index); - + if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); } } } - + return _matrix; } /** * \brief Add a matrix and assign. - * + * * Adds each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2104,38 +2105,38 @@ SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const Sparse if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } - + for (int index = 0 ; index < _other.size.first ; index++) { Chain row = getRow(_other, index); if (!row.isNull()) { _matrix.chainsStates |= index; _matrix.chains[index] += getRow(_other, index); - + if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); } } } - + return _matrix; } /** * \brief Substract a matrix and assign. - * + * * Substracts each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2145,38 +2146,38 @@ SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } - + for (int index = 0 ; index < _other.size.second ; index++) { Chain column = getColumn(_other, index); if (!column.isNull()) { _matrix.chainsStates |= index; _matrix.chains[index] -= getColumn(_other, index); - + if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); } } } - + return _matrix; } /** * \brief Substract a matrix and assign. - * + * * Substracts each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2186,37 +2187,37 @@ SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const Sparse if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } - + for (int index = 0 ; index < _other.size.second ; index++) { Chain row = getRow(_other, index); if (!row.isNull()) { _matrix.chainsStates |= index; _matrix.chains[index] -= getRow(_other, index); - + if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); } } } - + return _matrix; } /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::SparseMatrix \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2229,19 +2230,19 @@ SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2254,19 +2255,19 @@ SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const Sparse /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2279,19 +2280,19 @@ SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const /** * \brief Multiply a matrix and assign. - * + * * Multiply each coefficient of the matrix together. - * + * * \pre The matrix have the same coefficent type. - * + * * \warning Will raise an error if the two chains are not the same coefficient type. - * + * * \param[in] _other The other matrix. - * + * * \return The modified matrix representing the result. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 @@ -2304,17 +2305,17 @@ SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const Sparse /** * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The column stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2326,17 +2327,17 @@ Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int /** * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The column stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2352,23 +2353,23 @@ Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _i } } } - + return column; } /** * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The row stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2384,23 +2385,23 @@ Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _inde } } } - + return row; } /** * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. - * + * * \return The row stored at given index. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2508,14 +2509,14 @@ Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index) /** * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new column. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2531,14 +2532,14 @@ void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain /** * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new column. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2550,12 +2551,12 @@ void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_C for (int i = 0 ; i < _matrix.size.first ; i++) { if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { _matrix.chains[i] /= _index; - + if (_matrix.chains[i].isNull()) { _matrix.chainsStates.setOff(i); } } - + if (!_chain.isNull(i)) { _matrix.chainsStates |= i; _matrix.chains[i][_index] = _chain[i]; @@ -2565,14 +2566,14 @@ void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_C /** * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new row. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2589,7 +2590,7 @@ void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_C _matrix.chainsStates.setOff(i); } } - + if (!_chain.isNull(i)) { _matrix.chainsStates |= i; _matrix.chains[i][_index] = _chain[i]; @@ -2599,14 +2600,14 @@ void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_C /** * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * + * * \warning The matrix will perform boundary check. - * + * * \param[in] _index The coefficient index. * \param[in] _chain The new row. - * + * * \see \link OSM::Chain \endlink - * + * * \author Fedyna K. * \version 0.1.0 * \date 17/04/2024 @@ -2620,6 +2621,7 @@ void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, _matrix.chainsStates.setOff(_index) ; } -} +} /* end namespace OSM */ +} /* end namespace CGAL */ #endif diff --git a/HDVF/include/CGAL/OSM/__base.hpp b/HDVF/include/CGAL/OSM/__base.hpp index 586f16ff2b6c..972f68efd9f7 100644 --- a/HDVF/include/CGAL/OSM/__base.hpp +++ b/HDVF/include/CGAL/OSM/__base.hpp @@ -13,59 +13,62 @@ #include - +namespace CGAL { namespace OSM { - /** \brief Chain type flag for column chain. */ - const int COLUMN = 0b01; - /** \brief Chain type flag for row chain. */ - const int ROW = 0b10; - /** \brief The default type for signed integers. */ - typedef int ZCoefficient; +/** \brief Chain type flag for column chain. */ +const int COLUMN = 0b01; +/** \brief Chain type flag for row chain. */ +const int ROW = 0b10; + +/** \brief The default type for signed integers. */ +typedef int ZCoefficient; + +/** + * \class SparseMatrix + * \brief Vector implementation of sparse matrices. + * + * The SparseMatrix class contains all algebraic functions that are related to matrix. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +class SparseMatrix; - /** - * \class SparseMatrix - * \brief Vector implementation of sparse matrices. - * - * The SparseMatrix class contains all algebraic functions that are related to matrix. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - class SparseMatrix; +/** + * \class Chain + * \brief Allow to create row/column sparse vectors. + * + * The Chain class contains all algebraic functions that are related to vectors. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +class Chain; - /** - * \class Chain - * \brief Allow to create row/column sparse vectors. - * - * The Chain class contains all algebraic functions that are related to vectors. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - class Chain; +/** + * \class Bitboard + * \brief Bitboards are long bitset with specific operations. + * + * Bitboards are used with SparseMatrix to quickly find and set non empty columns. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 23/05/2024 + */ +class Bitboard; - /** - * \class Bitboard - * \brief Bitboards are long bitset with specific operations. - * - * Bitboards are used with SparseMatrix to quickly find and set non empty columns. - * - * \author Fedyna K. - * \version 0.2.0 - * \date 23/05/2024 - */ - class Bitboard; -} +} /* end namespace OSM */ +} /* end namespace CGAL */ -#endif \ No newline at end of file +#endif From 85b0334554481c887cd8bb807a3bd9c4749d03b1 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Mon, 5 May 2025 16:00:02 +0200 Subject: [PATCH 012/343] HDVF concept, HDVF classes - finished the HDVF concept description - Hdvf_core rework ongoing --- HDVF/doc/HDVF/Concepts/HDVF.h | 243 +++++++++++------- HDVF/doc/HDVF/Concepts/Ring.h | 2 +- HDVF/examples/HDVF/main_hdvf.cpp | 8 +- HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 12 +- HDVF/include/CGAL/HDVF/hdvf.hpp | 50 ++-- HDVF/include/CGAL/HDVF/hdvf_core.hpp | 273 ++++++++------------- HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 107 ++------ HDVF/include/CGAL/HDVF/hdvf_tools.hpp | 6 +- HDVF/include/CGAL/HDVF/per_hdvf.hpp | 79 ------ HDVF/include/CGAL/OSM/SparseMatrix.hpp | 4 +- 10 files changed, 325 insertions(+), 459 deletions(-) diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h index b4fae0dae67b..25d7b62a1d32 100644 --- a/HDVF/doc/HDVF/Concepts/HDVF.h +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -2,24 +2,55 @@ \ingroup PkgHDVFConcepts \cgalConcept -The concept `HDVF` describes the requirements for Homological Discrete Vector Fields, a theory of computational homology unifying discrete Morse theory and effective homology. - An HDVF is a combinatorial tool computing the homology of a chain complex (described by the `AbstractChainComplex` concept). +The concept `HDVF` describes the requirements for Homological Discrete Vector Fields (HDVF for short) , a theory of computational homology unifying discrete Morse theory and effective homology. + A HDVF is a combinatorial tool computing the homology of a chain complex (described by the `AbstractChainComplex` concept) including "geometric" information such as homology and cohomology generators. As described in the package description, an HDVF is: - a partition of the cells of the underlying complex into three classes: primary, secondary and critical (together with partial invertibility conditions for the boundary operator) - an associated reduction \f$(f,g,h)\f$ from the chain complex onto a chain complex generated by critical cells and a reduced boundary. An HDVF is perfect when the reduced boundary is null; in this case, the maps \f$f\f$ and \f$g\f$ (and their duals) provide homology and cohomology information (generators, annotation...). + More precisely, a HDVF over a chain complex C, derived from a complex K, is a partition of the cells: \f$K = P\coprod S\coprod C\f$ with \f$P\f$ primary cells, \f$S\f$ secondary cells and \f$C\f$ critical cells, such that the sub-matrix: + \f\[\partial (S)|_P\text{ is invertible.} + \f\] + In what follows, given \f$q\in \mathbb N\f$ and \f$G\f$ a sub-group of the qth chain group \f$C_q\f$, we denote by: + + - \f$i_G\f$ the inclusion \f$G\to C_q\f$ + - \f$j_G\f$ the projection \f$C_q\to G\f$ + +That is, for all \f$q\in \mathbb N\f$, if + + \f\[\mathrm{Mat}(\partial_q) = \begin{array}{lc} + & P_q \ \ \ \ S_q \ \ \ \ C_q \\ + \begin{array}{l} + P_{q-1} \\ + S_{q-1} \\ + C_{q-1} \\ + \end{array} & \left(\begin{array}{ccc} + \star & D_{PS} & \star \\ +\star & \star & \star \\ +\star & \star & \star \\ + \end{array}\right)\\ + \end{array} + \f\] + then \f$D_{PS}\f$, the matrix of \f$j_P\circ \partial\circ i_S\f$, is invertible. + In order to build a perfect HDVF, a pairing operation called `A` associates (under conditions) two critical cells (becoming PRIMARY and SECONDARY) and updates the reduction in time \f$\mathcal O(n^2)\f$. Starting from this operation, `HDVF` provides two methods to generate perfect HDVFs (and hence compute homology): - `compute_perfect_hdvf` which computes a perfect HDVF by chosing at each step the first A-pairings available (depending on cells ordering in the chain complex) - `compute_rand_perfect_hdvf` which computes a perfect random HDVF by chosing at each step a rand A-pairing among all possible ones (this option is thus slower) + + For efficiency, the HDVF reduction can be computed partialy: + - compute only the reduced boundary (option `OPT_BND`): to get Betti numbers + - compute \f$\partial'\f$ together with \f$h\f$ and \f$g\f$ (option `OPT_G`): to get homology generators + - compute \f$\partial'\f$ together with \f$h\f$ and \f$f\f$ (option `OPT_F`): to get co-homology generators + - compute the full reduction (option `OPT_FULL`): to get the full homological / cohomological information \cgalHasModelsBegin -\cgalHasModelsBare{`HDVF_core`} -\cgalHasModelsBare{`HDVF`} -\cgalHasModelsBare{`HDVF_persistence`} -\cgalHasModelsBare{`HDVF_duality`} +\cgalHasModelsBare{`Hdvf_core`} +\cgalHasModelsBare{`Hdvf`} +\cgalHasModelsBare{`Hdvf_persistence`} +\cgalHasModelsBare{`Hdvf_duality`} \cgalHasModelsEnd \sa `AbstractChainComplex` @@ -27,44 +58,7 @@ The concept `HDVF` describes the requirements for Homological Discrete Vector Fi \sa `SparseChain` \sa `SparseMatrix` - \warning How to describe constants declared in the namespace HDVF and used everywhere? - - /** \brief Enum for the HDVF_core label of cells. */ - static enum FlagType { - PRIMARY, - SECONDARY, - CRITICAL, - NONE // For duality and persistence - }; - - /** \brief HDVF_core options (compute only reduced boundary). */ - const int OPT_BND = 0b0001; - /** \brief HDVF_core options (compute only reduced boundary and f). */ - const int OPT_F = 0b0010; - /** \brief HDVF_core options (compute only reduced boundary and g). */ - const int OPT_G = 0b0100; - /** \brief HDVF_core options (compute full reduction). */ - const int OPT_FULL = 0b1000; - - /** \brief Enum for export: lets chose the type of export. - * - * - PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) - * - FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) - * - G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) - */ - enum ExportType { - PSC, - FSTAR, - G - }; - - /** \brief PairCell: Structure to represent a pair of cells (for HDVF operations). - */ - struct PairCell { - int sigma; // Index of the first cell - int tau; // Index of the second cell - int dim; // Dimension of cells: q/q+1 for A and R, q for other operations - }; + *How to describe constants declared in the namespace HDVF and used everywhere? FlagType, options, exporttype* */ @@ -75,84 +69,156 @@ class HDVF /// @{ /*! - Type of column-major chains (returned by the boundary operator) + Type of column-major chains */ typedef OSM::Chain CChain; /*! - Type of row-major chains (returned by the co-boundary operator) + Type of row-major chains */ typedef OSM::Chain RChain ; /*! - Type of column-major sparse matrices (used to store the boundary operator) + Type of column-major sparse matrices */ typedef OSM::SparseMatrix CMatrix; + +/*! + Type of row-major sparse matrices + */ +typedef OSM::SparseMatrix RMatrix; /// @} -/// \name Operators +/// \name Functions to find valid pairs for A operations /// @{ + +/*! + * \brief Find a valid PairCell of dimension q / q+1 for A. + * + * The function finds a pair of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * Sets `found` to `true` if a valid pair is found, `false` otherwise. + */ +virtual PairCell find_pair_A(int q, bool &found) const; + +/*! + * \brief Find a valid PairCell for A containing `gamma` (a cell of dimension `q`) + * + * The function finds a cell \f$\gamma'\f$ such that one of the following conditions holds: + * - \f$\gamma'\f$ has dimension q+1 and \f$(\gamma, \gamma')\f$ is valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma'), \gamma \rangle\f$ invertible), + * - \f$\gamma'\f$ has dimension q-1 and \f$(\gamma', \gamma)\f$ is valid for A (ie. such that \f$\langle \partial_{q}(\gamma), \gamma' \rangle\f$ invertible). + * + * Sets `found` to `true` if a valid pair is found, `false` otherwise. + */ +virtual PairCell find_pair_A(int q, bool &found, int gamma) const; /*! -Affectation operator. - -The operator creates a "fresh" copy of `complex`. + * \brief Find all valid PairCell of dimension q / q+1 for A. + * + * The function returns all pairs of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). + * + * Sets `found` to `true` if a valid pair is found, `false` otherwise. */ - AbstractChainComplex& operator= (const AbstractChainComplex& complex); +virtual std::vector find_pairs_A(int q, bool &found) const; + +/*! + * \brief Find all valid PairCell for A containing `gamma` (a cell of dimension `q`) + * + * The function finds all cells \f$\gamma'\f$ such that either: + * - \f$\gamma'\f$ has dimension q+1 and \f$(\gamma, \gamma')\f$ is valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma'), \gamma \rangle\f$ invertible), + * - \f$\gamma'\f$ has dimension q-1 and \f$(\gamma', \gamma)\f$ is valid for A (ie. such that \f$\langle \partial_{q}(\gamma), \gamma' \rangle\f$ invertible). + * + * Sets `found` to `true` if a valid pair is found, `false` otherwise. + */ +virtual std::vector find_pairs_A(int q, bool &found, int tau) const; + /// @} -/// \name Access functions + +/// \name HDVF functions and operations /// @{ /*! -Returns the dimension of the complex, that is, the largest dimension of cells. + * \brief A operation: pairs critical cells. + * + * A pair of critical cells \f$(\gamma_1, \gamma_2)\f$ of respective dimension q and q+1 is valid for A if \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ is invertible. After the A operation, \f$\gamma_1\f$ becomes PRIMARY, \f$\gamma_2\f$ becomes SECONDARY. The A functions updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). */ -int dim(); - +void A(int gamma1, int gamma2, int q); + /*! -Returns the number of cells of dimension `q`. -If `q` is negative of larger than the dimension of the complex, returns 0. + * \brief Compute a perfect HDVF. + * + * As long as valid pairs for A exist, the function selects the first available pair (returned by `find_pair_A`) and applies the corresponding A operation. + * If the `Ring` of coefficients is a field, this operation always produces a perfect HDVF (ie. the reduced boundary is null and the reduction provides homology and cohomology information). + * + * If the HDVF is initially not trivial (some cells have already been paired), the function completes it into a perfect HDVF. + * + * If the `verbose` parameter is `true`, all intermediate reductions are printed out. + * */ -int nb_cells(int q); +std::vector compute_perfect_hdvf(bool verbose = false); /*! -Returns all boundary matrices. - -The function returns constant reference to a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). - + * \brief Compute a random perfect HDVF. + * + *As long as valid pairs for A exist, the function selects a random pair (among pairs returned by `find_pairs_A`) and applies the corresponding A operation. + * If the `Ring` of coefficients is a field, this operation always produces a perfect HDVF (ie. the reduced boundary is null and the reduction provides homology and cohomology information). + * + * If the HDVF is initially not trivial (some cells have already been paired), the function randomly completes it into a perfect HDVF. + * + * If the `verbose` parameter is `true`, all intermediate reductions are printed out. */ -const vector & get_bnd_matrices() const; +std::vector compute_rand_perfect_hdvf(bool verbose = false); +/// @} + +/// \name Getters +/// @{ /*! -Returns the boundary matrix of dimension `q` (ie. the matrix of \f$\partial_q}\f$). - -The function returns a column-major sparse matrices. + * \brief Get cells with a given `flag` in any dimension. + * + * The function returns in each dimension the vector of cells with a given `flag`. + */ +std::vector > get_flag (FlagType flag) const; + +/*! + * \brief Get cells with a given `flag` in dimension `q`. + * + * The function returns the vector of cells of dimension `q` with a given `flag`. */ -const CMatrix & get_bnd_matrix(int q) const; +std::vector get_flag_dim (FlagType flag, int q) const; /*! -Returns the boundary of the cell of index `id_cell` in dimension `q`. + * \brief Get the flag of the cell `tau` in dimension `q`. + */ +FlagType get_cell_flag (int q, int tau) const; -This boundary is a finite linear combination of cells of dimension `q`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). This boundary is thus the `id_cell`-th column of the boundary matrix in dimension `q`. - -*/ -CChain d(int id_cell, int q); +/*! + * \brief Get HDVF option. + */ +int get_hdvf_opts (); - /*! -Returns the co-boundary of the cell of index `id_cell` in dimension `q`. + * \brief Get the row-major matrix of \f$f\f$ (from the reduction associated to the HDVF). + */ +const RMatrix& get_f (int q) const; -This boundary is a finite linear combination of cells of dimension `q`+1. It is encoded as a row-major chain (which maps each cell with a non-zero coefficient to this coefficient). This co-boundary is thus the `id_cell`-th row of the boundary matrix in dimension `q`+1. -*/ -CChain cod(int id_cell, int q); +/*! + * \brief Get the column-major matrix of \f$g\f$ (from the reduction associated to the HDVF). + */ +const CMatrix& get_g (int q) const; /*! -Returns the vertices of a given cell (that is, the indices of its faces of dimension 0). - -*/ - std::vector bottom_faces(int id_cell, int q) const; + * \brief Get the column-major matrix of \f$h\f$ (from the reduction associated to the HDVF). + */ +const CMatrix& get_h (int q) const; + +/*! + * \brief Get the column-major matrix of \f$\partial'\f$, reduced boundary operator (from the reduction associated to the HDVF). + */ +const CMatrix& get_dd (int q) const; /// @} @@ -160,11 +226,20 @@ Returns the vertices of a given cell (that is, the indices of its faces of dimen /// @{ /*! -Outputs the chain complex in text mode. + * Prints the matrices of the reduction (that is \f$f\f$, \f$g\f$, \f$h\f$, \f$\partial'\f$ the reduced boundary). By default, outputs the complex to `std::cout`. */ -std::ostream& print_complex(std::ostream& out = std::cout) const; +std::ostream& print_matrices(std::ostream &out = std::cout) const; + +/*! + * Prints the homology and cohomology reduction information (that is \f$f^*\f$, \f$g\f$ \f$\partial'\f$ the reduced boundary over each critical cell). + +By default, outputs the complex to `std::cout`. +*/ + +std::ostream& print_reduction(std::ostream &out = std::cout) const; + /// @} diff --git a/HDVF/doc/HDVF/Concepts/Ring.h b/HDVF/doc/HDVF/Concepts/Ring.h index 246c52bd42f2..2d6b82527b8c 100644 --- a/HDVF/doc/HDVF/Concepts/Ring.h +++ b/HDVF/doc/HDVF/Concepts/Ring.h @@ -2,7 +2,7 @@ \ingroup PkgHDVFConcepts \cgalConcept -The concept `Ring` describes the requirements for the ring of coefficients used to compute homology in the `CGAL::HDVF` concept. Besides ring operators, it also specifies the functions needed to test invertibility in the ring. +The concept `Ring` describes the requirements for the ring of coefficients used to compute homology in the `CGAL::HomologicalDiscreteVectorField` concept. Besides ring operators, it also specifies the functions needed to test invertibility in the ring. \cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Z`} diff --git a/HDVF/examples/HDVF/main_hdvf.cpp b/HDVF/examples/HDVF/main_hdvf.cpp index 74b988ef9b2c..c1630c086da8 100644 --- a/HDVF/examples/HDVF/main_hdvf.cpp +++ b/HDVF/examples/HDVF/main_hdvf.cpp @@ -53,14 +53,14 @@ Hdvf& HDVF_comput (const ComplexType& complex, con Hdvf& hdvf(*(new Hdvf(complex, options.HDVF_opt))); std::vector pairs ; if (!options.random) - pairs = hdvf.computePerfectHDVF(options.verbose); + pairs = hdvf.compute_perfect_hdvf(options.verbose); else - pairs = hdvf.computeRandPerfectHDVF(options.verbose); + pairs = hdvf.compute_rand_perfect_hdvf(options.verbose); if (options.with_output) { cout << "----> pairs found by computePerfectHDVF" << endl ; - hdvf.print_pairs(pairs) ; + print_pairs(pairs) ; cout << "----> reduction" << endl ; hdvf.print_reduction() ; } @@ -74,7 +74,7 @@ Hdvf& HDVF_comput (const ComplexType& complex, con throw std::runtime_error("File Parsing Error: File not found"); } out << "----> pairs found by computePerfectHDVF" << endl ; - hdvf.print_pairs(pairs, out) ; + print_pairs(pairs, out) ; out << "----> reduction" << endl ; hdvf.print_reduction(out) ; diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp index 91cafcb39059..a10700b39db2 100644 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -35,7 +35,7 @@ template class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { protected: - /** \brief A bitboard describing subchains along. */ + /** \brief A bitboard describing subchains restriction. */ Bitboard _subChains; /** \brief A bitboard containing state of each chain (restricted to subchains). */ @@ -72,14 +72,16 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { /** \brief Iterator to the beginning of the subchains indices. */ - inline Bitboard::iterator begin() noexcept + inline Bitboard::iterator begin() const noexcept { - _subChainsStates = this->chainsStates & _subChains ; - return _subChainsStates.begin(); + return _subChainsStates.begin() ; } /** \brief Iterator to the end of the subchains indices. */ - inline Bitboard::iterator end() noexcept { return _subChainsStates.end(); } + inline Bitboard::iterator end() const noexcept + { + return _subChainsStates.end() ; + } /** \brief Change subchains. */ inline void set_sub (const Bitboard& new_subChains) diff --git a/HDVF/include/CGAL/HDVF/hdvf.hpp b/HDVF/include/CGAL/HDVF/hdvf.hpp index 76327af45025..522ed29fdfd8 100644 --- a/HDVF/include/CGAL/HDVF/hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf.hpp @@ -53,31 +53,31 @@ class Hdvf : public Hdvf_core findPairsM(int q, bool &found); // const; + std::vector find_pairs_M(int q, bool &found); // const; /** \brief find all the valid PairCell containing tau for M in dimension q */ - std::vector findPairsM(int q, bool &found, int tau); // const; + std::vector find_pairs_M(int q, bool &found, int tau); // const; /** \brief find a valid PairCell for W in dimension q */ - PairCell findPairW(int q, bool &found); // const; + PairCell find_pair_W(int q, bool &found); // const; /** \brief find a valid PairCell containing tau for W in dimension q */ - PairCell findPairW(int q, bool &found, int tau); // const; + PairCell find_pair_W(int q, bool &found, int tau); // const; /** \brief find all the valid PairCell for W in dimension q */ - std::vector findPairsW(int q, bool &found); // const; + std::vector find_pairs_W(int q, bool &found); // const; /** \brief find all the valid PairCell containing tau for W in dimension q */ - std::vector findPairsW(int q, bool &found, int tau); // const; + std::vector find_pairs_W(int q, bool &found, int tau); // const; /** \brief find a valid PairCell for MW in dimension q */ - PairCell findPairMW(int q, bool &found); // const; + PairCell find_pair_MW(int q, bool &found); // const; /** \brief find a valid PairCell containing tau for MW in dimension q */ - PairCell findPairMW(int q, bool &found, int tau); // const; + PairCell find_pair_MW(int q, bool &found, int tau); // const; /** \brief find all the valid PairCell for MW in dimension q */ - std::vector findPairsMW(int q, bool &found); // const; + std::vector find_pairs_MW(int q, bool &found); // const; /** \brief find all the valid PairCell containing tau for MW in dimension q */ - std::vector findPairsMW(int q, bool &found, int tau); // const; + std::vector find_pairs_MW(int q, bool &found, int tau); // const; // Hdvf methods /** \brief Hdvf operation A(gamma1, gamma2) */ @@ -102,7 +102,7 @@ Hdvf::Hdvf(const ComplexType& K, int hdvf_opt) : H /** \brief find a valid PairCell for M in dimension q */ //template template -PairCell Hdvf::findPairM(int q, bool &found) // const +PairCell Hdvf::find_pair_M(int q, bool &found) // const { found = false; PairCell p; @@ -132,7 +132,7 @@ PairCell Hdvf::findPairM(int q, bool &found) // co /** \brief find a valid PairCell containing tau for M in dimension q */ //template template -PairCell Hdvf::findPairM(int q, bool &found, int tau) // const +PairCell Hdvf::find_pair_M(int q, bool &found, int tau) // const { found = false; PairCell p; @@ -177,7 +177,7 @@ PairCell Hdvf::findPairM(int q, bool &found, int t /** \brief find all the valid PairCell for M in dimension q */ //template template -std::vector Hdvf::findPairsM(int q, bool &found) // const +std::vector Hdvf::find_pairs_M(int q, bool &found) // const { found = false; std::vector pairs; @@ -208,7 +208,7 @@ std::vector Hdvf::findPairsM(int q, bool /** \brief find all the valid PairCell containing tau for M in dimension q */ //template template -std::vector Hdvf::findPairsM(int q, bool &found, int tau) // const +std::vector Hdvf::find_pairs_M(int q, bool &found, int tau) // const { found = false; std::vector pairs; @@ -261,7 +261,7 @@ std::vector Hdvf::findPairsM(int q, bool /** \brief find a valid PairCell for W in dimension q */ //template template -PairCell Hdvf::findPairW(int q, bool &found) // const +PairCell Hdvf::find_pair_W(int q, bool &found) // const { found = false; PairCell p; @@ -291,7 +291,7 @@ PairCell Hdvf::findPairW(int q, bool &found) // co /** \brief find a valid PairCell containing tau for W in dimension q */ //template template -PairCell Hdvf::findPairW(int q, bool &found, int tau) // const +PairCell Hdvf::find_pair_W(int q, bool &found, int tau) // const { found = false; PairCell p; @@ -336,7 +336,7 @@ PairCell Hdvf::findPairW(int q, bool &found, int t /** \brief find all the valid PairCell for W in dimension q */ //template template -std::vector Hdvf::findPairsW(int q, bool &found) // const +std::vector Hdvf::find_pairs_W(int q, bool &found) // const { found = false; std::vector pairs; @@ -368,7 +368,7 @@ std::vector Hdvf::findPairsW(int q, bool /** \brief find all the valid PairCell containing tau for W in dimension q */ //template template -std::vector Hdvf::findPairsW(int q, bool &found, int tau) // const +std::vector Hdvf::find_pairs_W(int q, bool &found, int tau) // const { found = false; std::vector pairs; @@ -421,7 +421,7 @@ std::vector Hdvf::findPairsW(int q, bool /** \brief find a valid PairCell for MW in dimension q */ //template template -PairCell Hdvf::findPairMW(int q, bool &found) // const +PairCell Hdvf::find_pair_MW(int q, bool &found) // const { found = false; PairCell p; @@ -465,7 +465,7 @@ PairCell Hdvf::findPairMW(int q, bool &found) // c /** \brief find a valid PairCell containing tau for MW in dimension q */ //template template -PairCell Hdvf::findPairMW(int q, bool &found, int tau) // const +PairCell Hdvf::find_pair_MW(int q, bool &found, int tau) // const { found = false; PairCell p; @@ -554,7 +554,7 @@ PairCell Hdvf::findPairMW(int q, bool &found, int /** \brief find all the valid PairCell for MW in dimension q */ //template template -std::vector Hdvf::findPairsMW(int q, bool &found) // const +std::vector Hdvf::find_pairs_MW(int q, bool &found) // const { found = false; std::vector pairs; @@ -599,9 +599,9 @@ std::vector Hdvf::findPairsMW(int q, boo } /** \brief find all the valid PairCell containing tau for MW in dimension q */ -//template + template -std::vector Hdvf::findPairsMW(int q, bool &found, int tau) // const +std::vector Hdvf::find_pairs_MW(int q, bool &found, int tau) // const { found = false; std::vector pairs; diff --git a/HDVF/include/CGAL/HDVF/hdvf_core.hpp b/HDVF/include/CGAL/HDVF/hdvf_core.hpp index b899c45d7dc5..5584b4d8d986 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_core.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_core.hpp @@ -1,15 +1,16 @@ -/** - * \file hdvf.hpp - * \brief Hdvf_core code library. - * \author Bac A. - * \version 0.1.0 - * \date 22/08/2024 - * - * Hdvf_core code library (constructors, operations, finders). - */ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac -#ifndef HDVF_CORE_H -#define HDVF_CORE_H +#ifndef HDVF_CORE_HPP +#define HDVF_CORE_HPP #include #include @@ -17,13 +18,12 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" -#include "CGAL/HDVF/sub_chain_complex.hpp" namespace CGAL { namespace HDVF { -/** \brief Enum for the Hdvf_core label of cells. */ +/** \brief HDVF Enum for the label of cells. */ static enum FlagType { PRIMARY, SECONDARY, @@ -31,28 +31,17 @@ static enum FlagType { NONE // For duality and persistence }; -/** \brief Hdvf_core options (compute only reduced boundary). */ +/** \brief HDVF option (compute only reduced boundary). */ const int OPT_BND = 0b0001; -/** \brief Hdvf_core options (compute only reduced boundary and f). */ +/** \brief HDVF option (compute only reduced boundary and f). */ const int OPT_F = 0b0010; -/** \brief Hdvf_core options (compute only reduced boundary and g). */ +/** \brief HDVF option (compute only reduced boundary and g). */ const int OPT_G = 0b0100; -/** \brief Hdvf_core options (compute full reduction). */ +/** \brief HDVF option (compute full reduction). */ const int OPT_FULL = 0b1000; -/** \brief Enum for export: lets chose the type of export. - * - * - PSC export a flag encoding the label of the cell: P (-1), S (1), C (0) - * - FSTAR exports a boolean flag for a given cohomology generator (true: the cell belongs to the cycle, false: the cell does not belong) - * - G exports a boolean flag for a given homology generator (true: the cell belongs to the cycle, false: the cell does not belong) - */ -enum ExportType { - PSC, - FSTAR, - G -}; -/** \brief PairCell: Structure to represent a pair of cells (for HDVF operations). +/** \brief Structure to represent data for HDVF operations (pairs of cells). */ struct PairCell { int sigma; // Index of the first cell @@ -60,19 +49,35 @@ struct PairCell { int dim; // Dimension of cells: q/q+1 for A and R, q for other operations }; +/** \brief Method printing PairCells (that is pairs of cells for HDVF operations) */ + +std::ostream& print_pairs(const std::vector& pairs, std::ostream& out = std::cout) +{ + for (const auto& pair : pairs) { + out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; + } + return out ; +} -/** - * \class Hdvf_core - * \brief Implementation of Hdvf_core and associate operations. - * - * The Hdvf_core class contains all functions to build Hdvf_core, create perfect Hdvf_core (A and associate finders) and delineated generators through Hdvf_core operations (R, M, W, MW and associate finders). - * - * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam ComplexType The type of complex (default is SimpComplex) - * - * \author Bac A. - * \version 0.1.0 - * \date 22/08/2024 +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Hdvf_core` is the core implementation of homological discrete vector fields (HDVF for short). + + An enumeration `FlagType` is defined in the `HDVF` namespace and the `Hdvf_core` class maps each cell to one of the flags (namely PRIMARY, SECONDARY, CRITICAL). The NONE is used in `HDVF_duality` to compute relative homology on a sub-complex). + The flag of each cell is stored in an appropriate structure and getters are provided to access to this information. + + The `Hdvf_core` class stores the associated reduction in sparse matrices: row-major for \f$f\f$, and column-major for \f$g\f$, \f$h\f$ and \f$\partial'\f$. Getters are provided to access this information. + + The class provides constuction operations: `compute_perfect_hdvf` and `compute_rand_perfect_hdvf`, which build perfect HDVFs by pairing iteratively critical cells through the `A` operation. + In order to find proper pairs, several `find_pair_A` functions are provided (searching for valid pairs of cells for `A`respecting various constraints). The `A` operation can be applied to any pair returned by these functions. + + \cgalModels{HDVF} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. + \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. + \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). + \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::SparseMatrix`), providing the type of sparse matrices used. */ @@ -121,13 +126,13 @@ class Hdvf_core { // findPair functions /** \brief find a valid PairCell for A in dimension q */ - virtual PairCell findPairA(int q, bool &found); // const; + virtual PairCell find_pair_A(int q, bool &found) const; /** \brief find a valid PairCell containing tau for A in dimension q */ - virtual PairCell findPairA(int q, bool &found, int tau); // const; + virtual PairCell find_pair_A(int q, bool &found, int tau) const; /** \brief find all the valid PairCell for A in dimension q */ - virtual std::vector findPairsA(int q, bool &found); // const; + virtual std::vector find_pairs_A(int q, bool &found) const; /** \brief find all the valid PairCell containing tau for A in dimension q */ - virtual std::vector findPairsA(int q, bool &found, int tau); // const; + virtual std::vector find_pairs_A(int q, bool &found, int tau) const; // Hdvf_core methods /** \brief Hdvf_core operation A(gamma1, gamma2) */ @@ -135,128 +140,52 @@ class Hdvf_core { /** \brief Compute a perfect Hdvf_core From dimension q-1 to dimension 0 - As long as findPairA(q) returns a pair + As long as find_pair_A(q) returns a pair -> Perform operation A -> Add the pair to the output vector */ - std::vector computePerfectHDVF(bool verbose = false); + std::vector compute_perfect_hdvf(bool verbose = false); /** \brief Compute a perfect Hdvf_core From dimension q-1 to dimension 0 - As long as findPairsA(q) returns pairs + As long as find_pairs_A(q) returns pairs -> Choose one randomly -> Perform operation A -> Add the pair to the output vector - Slower than computePerfectHDVF + Slower than compute_perfect_hdvf */ - std::vector computeRandPerfectHDVF(bool verbose = false); + std::vector compute_rand_perfect_hdvf(bool verbose = false); // Hdvf_core getters + + // Flag getters // Method to get cells if with a given flag (P,S,C) for each dimension - virtual std::vector > get_flag (FlagType flag) const ; + std::vector > get_flag (FlagType flag) const ; // Method to get cells with a given flag (P,S,C) for a given dimension - virtual std::vector get_flag_dim (FlagType flag, int q) const ; + std::vector get_flag_dim (FlagType flag, int q) const ; // Method to get the flag (P,S,C) of a cell tau of dimension q FlagType get_cell_flag (int q, int tau) const { return _flag.at(q).at(tau); } + // Options getters // Method to get options int get_hdvf_opts () const { return _hdvf_opt ; } + // Reduction getters + const RMatrix& get_f (int q) const { return _F_row.at(q); } + const CMatrix& get_g (int q) const { return _G_col.at(q); } + const CMatrix& get_h (int q) const { return _H_col.at(q); } + const CMatrix& get_dd (int q) const { return _DD_col.at(q); } + // Method to print the matrices _F_row, _G_col, _H_col - virtual std::ostream& print_matrices(std::ostream &out = std::cout) const; + std::ostream& print_matrices(std::ostream &out = std::cout) const; // Method to print the reduction - virtual std::ostream& print_reduction(std::ostream &out = std::cout); // const; + std::ostream& print_reduction(std::ostream &out = std::cout) const; // Method to print A-pairs - virtual std::ostream& print_pairs(const std::vector& pairs, std::ostream &out = std::cout); - - // Method to project a chain onto P, S, or C cells - template - ChainType projection(const ChainType& chain, FlagType flag, int dim) const { - // Create a new chain to store the result - // Better to initialize 'result' directly with the correct size and iterate over it - ChainType result(chain); - - // Iterate over each element of the chain - std::vector tmp ; - for (typename ChainType::const_iterator it = result.cbegin(); it != result.cend(); ++it) - { - int cell_index = it->first; - CoefficientType value = it->second; - - // Check the flag of the corresponding cell - if (_flag[dim][cell_index] != flag) { - // Set to 0 - tmp.push_back(cell_index) ; - - } - } - result /= tmp ; - return result; - } - - // // [OLD] Method to generate labels for visualisation - // // Kept for compatibility - // // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned - // virtual std::vector > export_label (ExportType type, int cell=0, int dim=0) const - // { - // std::vector > labels(_K.dim()+1) ; - // if (type == PSC) - // { - // for (int q=0; q<=_K.dim(); ++q) - // { - // for (int i = 0; i<_K.nb_cells(q); ++i) - // { - // if (_flag.at(q).at(i) == PRIMARY) - // labels.at(q).push_back(-1) ; - // else if (_flag.at(q).at(i) == SECONDARY) - // labels.at(q).push_back(1) ; - // else - // labels.at(q).push_back(0) ; - // } - // } - // } - // else - // { - // if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) - // { - // for (int q=0; q<=_K.dim(); ++q) - // { - // labels.at(q).resize(_K.nb_cells(q)) ; - // } - // - // if (dim < _K.dim()) - // { - // labels.at(dim).at(cell) = 1 ; - // const RChain& fstar_cell = OSM::cgetRow(_F_row.at(dim), cell) ; - // for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) - // { - // // Set the cofaces of it->first in dimension dim+1 - // RChain cofaces(_K.cod(it->first,dim)) ; - // for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - // labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells - // } - // } - // else - // throw "Error: cannot export f* for a cell of maximal dimension" ; - // } - // else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G - // { - // for (int q=0; q<=_K.dim(); ++q) - // { - // labels.at(q).resize(_K.nb_cells(q)) ; - // } - // - // labels.at(dim).at(cell) = 1 ; - // const CChain& g_cell = OSM::cgetColumn(_G_col.at(dim), cell) ; - // for (typename CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) - // labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells - // } - // } - // return labels ; - // } +// virtual std::ostream& print_pairs(const std::vector& pairs, std::ostream &out = std::cout); +public: // Method to generate PSC labels for visualisation virtual std::vector > export_labelsPSC () const { @@ -324,6 +253,31 @@ class Hdvf_core { throw "Error : trying to export g_chain without proper Hdvf_core option" ; } protected: + // Method to project a chain onto P, S, or C cells + template + ChainType projection(const ChainType& chain, FlagType flag, int dim) const { + // Create a new chain to store the result + // Better to initialize 'result' directly with the correct size and iterate over it + ChainType result(chain); + + // Iterate over each element of the chain + std::vector tmp ; + for (typename ChainType::const_iterator it = result.cbegin(); it != result.cend(); ++it) + { + int cell_index = it->first; + CoefficientType value = it->second; + + // Check the flag of the corresponding cell + if (_flag[dim][cell_index] != flag) { + // Set to 0 + tmp.push_back(cell_index) ; + + } + } + result /= tmp ; + return result; + } + void progress_bar(int i, int n) { const int step(n/20) ; @@ -447,7 +401,7 @@ std::ostream& Hdvf_core template typename ChainType, template typename SparseMatrixType> -PairCell Hdvf_core::findPairA(int q, bool &found) // const +PairCell Hdvf_core::find_pair_A(int q, bool &found) const { found = false; PairCell p; @@ -474,7 +428,7 @@ PairCell Hdvf_core::f /** \brief find a valid PairCell containing tau for A in dimension q */ //template template typename ChainType, template typename SparseMatrixType> -PairCell Hdvf_core::findPairA(int q, bool &found, int tau) // const +PairCell Hdvf_core::find_pair_A(int q, bool &found, int tau) const { found = false; PairCell p ; @@ -510,7 +464,7 @@ PairCell Hdvf_core::f /** \brief find all the valid PairCell for A in dimension q */ //template template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::findPairsA(int q, bool &found) // const +std::vector Hdvf_core::find_pairs_A(int q, bool &found) const { std::vector pairs; found = false ; @@ -539,7 +493,7 @@ std::vector Hdvf_core template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::findPairsA(int q, bool &found, int tau) // const +std::vector Hdvf_core::find_pairs_A(int q, bool &found, int tau) const { found = false; std::vector pairs; @@ -1797,19 +1751,19 @@ void Hdvf_core::A(int // Returns a vector of PairCell objects representing the pairs found template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::computePerfectHDVF(bool verbose) { +std::vector Hdvf_core::compute_perfect_hdvf(bool verbose) { std::vector pair_list; // Vector to store the list of pairs bool trouve = false; // Flag to indicate whether a pair was found int dim = _K.dim(); // Get the dimension of the complex K // Loop through dimensions from q-1 to 0 for (int q = dim - 1; q >= 0; --q) { - std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; + std::cout << std::endl << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; // cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) // Find a pair of cells in dimension q - PairCell pair = findPairA(q, trouve); + PairCell pair = find_pair_A(q, trouve); // While a pair is found while (trouve) { @@ -1826,7 +1780,7 @@ std::vector Hdvf_core Hdvf_core typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::computeRandPerfectHDVF(bool verbose) { +std::vector Hdvf_core::compute_rand_perfect_hdvf(bool verbose) { std::vector pair_list; // Vector to store the list of pairs bool trouve = false; // Flag to indicate whether a pair was found int dim = _K.dim(); // Get the dimension of the complex K @@ -1852,7 +1806,7 @@ std::vector Hdvf_core pairing cells of dimension " << q << " and " << q+1 << std::endl ; // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) - std::vector pairs = findPairsA(q, trouve); + std::vector pairs = find_pairs_A(q, trouve); PairCell pair ; @@ -1877,7 +1831,7 @@ std::vector Hdvf_core Hdvf_core template typename ChainType, template typename SparseMatrixType> -std::ostream& Hdvf_core::print_reduction(std::ostream& out) // const +std::ostream& Hdvf_core::print_reduction(std::ostream& out) const { // Print PSC out << "----- flags of cells:" << std::endl; @@ -1991,18 +1945,9 @@ std::ostream& Hdvf_core -template typename ChainType, template typename SparseMatrixType> -std::ostream& Hdvf_core::print_pairs(const std::vector& pairs, std::ostream& out) // const -{ - for (const auto& pair : pairs) { - out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; - } - return out ; -} + } /* end namespace HDVF */ } /* end namespace CGAL */ -#endif // HDVF_H +#endif // HDVF_CORE_HPP diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp index dbffb48207cc..1373a94c2c19 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -70,13 +70,13 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain Hdvf_duality(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt = OPT_FULL) ; /** \brief find a valid PairCell for A in dimension q */ - virtual PairCell findPairA(int q, bool &found); // const; + virtual PairCell find_pair_A(int q, bool &found) const; /** \brief find a valid PairCell containing tau for A in dimension q */ - virtual PairCell findPairA(int q, bool &found, int tau); // const; + virtual PairCell find_pair_A(int q, bool &found, int tau) const; /** \brief find all the valid PairCell for A in dimension q */ - virtual std::vector findPairsA(int q, bool &found); // const; + virtual std::vector find_pairs_A(int q, bool &found) const; /** \brief find all the valid PairCell containing tau for A in dimension q */ - virtual std::vector findPairsA(int q, bool &found, int tau); // const; + virtual std::vector find_pairs_A(int q, bool &found, int tau) const; /** \brief Set _DD_col to _subCC */ inline void screen_DD_col () @@ -247,87 +247,6 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain return out ; } - // Method to generate labels for visualisation - // For PSC, no additional arguments, for FSTAR and G, specify the critical cell concerned - vector > export_label (ExportType type, int cell=0, int dim=0) const - { - vector > labels(this->_K.dim()+1) ; - if (type == PSC) - { - for (int q=0; q<=this->_K.dim(); ++q) - { - for (int i = 0; i_K.nb_cells(q); ++i) - { - if (_subCC.get_Bit(q, i)) // i belongs to _subCC - { - if (this->_flag.at(q).at(i) == HDVF_type::PRIMARY) - labels.at(q).push_back(-1) ; - else if (this->_flag.at(q).at(i) == HDVF_type::SECONDARY) - labels.at(q).push_back(1) ; - else - labels.at(q).push_back(0) ; - } - else // i does not belongs to _subCC - labels.at(q).push_back(2) ; - } - } - } - else - { - if ((type == FSTAR) && (_hdvf_opt & (OPT_FULL | OPT_F))) - { - for (int q=0; q<=this->_K.dim(); ++q) - { - labels.at(q).resize(this->_K.nb_cells(q)) ; - } - - if (dim < this->_K.dim()) - { - labels.at(dim).at(cell) = 1 ; - const typename HDVF_type::RChain& fstar_cell = OSM::cgetRow(this->_F_row.at(dim), cell) ; - for (typename HDVF_type::RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) - { - // Keep cells of the chain belonging to _subCC - if (_subCC.get_Bit(dim, it->first)) - { - // Set the cofaces belonging to _subCC of it->first in dimension dim+1 - typename HDVF_type::RChain cofaces(this->_K.cod(it->first,dim)) ; - for (typename HDVF_type::RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - { - if (_subCC.get_Bit(dim+1, it2->first)) - labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells - } - } - } - } - else - throw "Error: cannot export f* for a cell of maximal dimension" ; - } - else if (_hdvf_opt & (OPT_FULL | OPT_G)) // G - { - // cout << "Export : _subCC : " << _subCC << endl ; - for (int q=0; q<=this->_K.dim(); ++q) - { - labels.at(q).resize(this->_K.nb_cells(q)) ; - } - - labels.at(dim).at(cell) = 1 ; - const typename HDVF_type::CChain& g_cell = OSM::cgetColumn(this->_G_col.at(dim), cell) ; - for (typename HDVF_type::CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) - { - // Keep cells of the chain belonging to _subCC - if (_subCC.get_Bit(dim, it->first)) - { - // cout << "g(" << cell << ", " << dim << ") : " << it->first << endl ; - labels.at(dim).at(it->first) = 1 ; // set the flag to 1 only for G(cell) cells - } - - } - - } - } - return labels ; - } // Method to generate PSC labels for visualisation @@ -448,7 +367,7 @@ Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hd /** \brief find a valid PairCell for A in dimension q */ template -PairCell Hdvf_duality<_CoefficientType,_ComplexType>::findPairA(int q, bool &found) // const +PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &found) const { found = false; PairCell p; @@ -475,7 +394,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::findPairA(int q, bool &fou /** \brief find a valid PairCell containing tau for A in dimension q */ template -PairCell Hdvf_duality<_CoefficientType,_ComplexType>::findPairA(int q, bool &found, int tau) // const +PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &found, int tau) const { found = false; PairCell p ; @@ -516,7 +435,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::findPairA(int q, bool &fou /** \brief find all the valid PairCell for A in dimension q */ template -std::vector Hdvf_duality<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found) // const +std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A(int q, bool &found) const { vector pairs; found = false ; @@ -544,7 +463,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::findPairsA(in /** \brief find all the valid PairCell containing tau for A in dimension q */ template -std::vector Hdvf_duality<_CoefficientType,_ComplexType>::findPairsA(int q, bool &found, int tau) // const +std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A(int q, bool &found, int tau) const { found = false; std::vector pairs; @@ -594,7 +513,8 @@ void Hdvf_duality<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() // Restrict _DD_col accordingly screen_DD_col() ; // Compute perfect HDVF over K - this->computePerfectHDVF() ; + std::vector tmp = this->compute_perfect_hdvf() ; + std::cout << tmp.size() << " cells paired" << endl ; critical_K = this->get_flag(CRITICAL) ; // this->print_matrices() ; // this->print_reduction() ; @@ -605,7 +525,10 @@ void Hdvf_duality<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() // Restrict _DD_col accordingly screen_DD_col() ; // Compute perfect HDVF over L-K - this->computePerfectHDVF() ; + tmp.clear() ; + tmp = this->compute_perfect_hdvf() ; + std::cout << tmp.size() << " cells paired" << endl ; + print_pairs(tmp) ; critical_L_K = this->get_flag(CRITICAL) ; // this->print_matrices() ; // this->print_reduction() ; @@ -626,7 +549,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::computePairin _subCC = SubChainComplex<_CoefficientType, _ComplexType>(_L) ; screen_DD_col() ; // Copy the HDVF before computing the pairing -> otherwise we loose it... - std::vector pairing = this->computePerfectHDVF() ; + std::vector pairing = this->compute_perfect_hdvf() ; return pairing ; } diff --git a/HDVF/include/CGAL/HDVF/hdvf_tools.hpp b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp index d8eaf681ecd9..58721344bacf 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_tools.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_tools.hpp @@ -42,7 +42,7 @@ void interaction_loop(Hdvf &hdvf, cout << "Provide sigma / q (separate with space):" << endl ; cin >> sigma >> q ; bool found = false ; - vector possM(hdvf.findPairsM(q, found, sigma)) ; + vector possM(hdvf.find_pairs_M(q, found, sigma)) ; cout << "-> possible pairings for M:" << endl ; for (int i = 0; i &hdvf, cout << "Provide sigma / q (separate with space):" << endl ; cin >> sigma >> q ; bool found = false ; - vector possW(hdvf.findPairsW(q, found, sigma)) ; + vector possW(hdvf.find_pairs_W(q, found, sigma)) ; cout << "-> possible pairings for W:" << endl ; for (int i = 0; i &hdvf, cout << "Provide sigma / q (separate with space):" << endl ; cin >> sigma >> q ; bool found = false ; - vector possMW(hdvf.findPairsMW(q, found, sigma)) ; + vector possMW(hdvf.find_pairs_MW(q, found, sigma)) ; cout << "-> possible pairings for MW:" << endl ; for (int i = 0; i > export_label (ExportType type, int cell=0, int dim=0) const - { - cout << "per export label" << endl ; - vector > labels(this->_K.dim()+1) ; - if (type == PSC) - { - for (int q=0; q<=this->_K.dim(); ++q) - { - for (int i = 0; i_K.nb_cells(q); ++i) // _K indices - { - // if index of i in the filtration is lower than time in dimension q -> display - if (_K_to_per.at(q).at(i) <= _t_dim.at(q)) - { - if (this->_flag.at(q).at(i) == PRIMARY) - labels.at(q).push_back(-1) ; - else if (this->_flag.at(q).at(i) == SECONDARY) - labels.at(q).push_back(1) ; - else - labels.at(q).push_back(0) ; - } - else // i has not yet been reached - labels.at(q).push_back(2) ; - } - } - } - else - { - if ((type == FSTAR) && (this->_hdvf_opt & (OPT_FULL | OPT_F))) - { - for (int q=0; q<=this->_K.dim(); ++q) - { - labels.at(q).resize(this->_K.nb_cells(q)) ; - } - - if (dim < this->_K.dim()) - { - int cellK = _per_to_K.at(dim).at(cell) ; // index of the cell in K - - labels.at(dim).at(cellK) = 1 ; - // Cross f* - const typename HDVF_type::RChain& fstar_cell = OSM::cgetRow(this->_F_row.at(dim), cell) ; - for (typename HDVF_type::RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) - { - int fstarcellK = _per_to_K.at(dim).at(it->first) ; // index of the cell of f* in K - // Set the cofaces of idcellK in dimension dim+1 - typename HDVF_type::RChain cofaces(this->_K.cod(fstarcellK,dim)) ; - for (typename HDVF_type::RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - { - labels.at(dim+1).at(it2->first) = 1 ; // set the flag to 1 only for FSTAR(cell) cells - } - } - } - else - throw "Error: cannot export f* for a cell of maximal dimension" ; - } - else if (this->_hdvf_opt & (OPT_FULL | OPT_G)) // G - { - // cout << "Export : _subCC : " << _subCC << endl ; - for (int q=0; q<=this->_K.dim(); ++q) - { - labels.at(q).resize(this->_K.nb_cells(q)) ; - } - - int cellK = _per_to_K.at(dim).at(cell) ; // index of the cell in K - labels.at(dim).at(cellK) = 1 ; - // Cross g - const typename HDVF_type::CChain& g_cell = OSM::cgetColumn(this->_G_col.at(dim), cell) ; - for (typename HDVF_type::CChain::const_iterator it = g_cell.cbegin(); it != g_cell.cend(); ++it) - { - // Index of the cell in K - int gcellK = _per_to_K.at(dim).at(it->first) ; - labels.at(dim).at(gcellK) = 1 ; // set the flag to 1 only for G(cell) cells - } - } - } - return labels ; - } // Method to generate PSC labels for visualisation virtual vector > export_labelsPSC () const diff --git a/HDVF/include/CGAL/OSM/SparseMatrix.hpp b/HDVF/include/CGAL/OSM/SparseMatrix.hpp index dc0d4d410be3..acf60f612e4d 100644 --- a/HDVF/include/CGAL/OSM/SparseMatrix.hpp +++ b/HDVF/include/CGAL/OSM/SparseMatrix.hpp @@ -1494,7 +1494,7 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - inline Bitboard::iterator begin() noexcept { return chainsStates.begin(); } + inline Bitboard::iterator begin() const noexcept { return chainsStates.begin(); } /** * \brief Iterator to the ending of the chains indices. @@ -1511,7 +1511,7 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - inline Bitboard::iterator end() noexcept { return chainsStates.end(); } + inline Bitboard::iterator end() const noexcept { return chainsStates.end(); } /** * \brief Reverse iterator to the chains indices. From cb2d6001eae82e4b8ba028bab499e40d5c06eb13 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Wed, 7 May 2025 09:34:28 +0200 Subject: [PATCH 013/343] HDVF review -> finished Hdvf_core -> starting Hdvf --- HDVF/doc/HDVF/Concepts/HDVF.h | 9 +- HDVF/examples/HDVF/main_hdvf.cpp | 4 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 8 +- HDVF/include/CGAL/HDVF/Hdvf_core.h | 1000 ++++++++++ HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 8 +- HDVF/include/CGAL/HDVF/hdvf.hpp | 58 +- HDVF/include/CGAL/HDVF/hdvf_core.hpp | 1953 ------------------- HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 18 +- HDVF/include/CGAL/HDVF/per_hdvf.hpp | 26 +- main_hdvf.cpp | 244 --- 10 files changed, 1069 insertions(+), 2259 deletions(-) create mode 100644 HDVF/include/CGAL/HDVF/Hdvf_core.h delete mode 100644 HDVF/include/CGAL/HDVF/hdvf_core.hpp delete mode 100644 main_hdvf.cpp diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h index 25d7b62a1d32..cebc001a437b 100644 --- a/HDVF/doc/HDVF/Concepts/HDVF.h +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -227,17 +227,16 @@ const CMatrix& get_dd (int q) const; /*! * Prints the matrices of the reduction (that is \f$f\f$, \f$g\f$, \f$h\f$, \f$\partial'\f$ the reduced boundary). - -By default, outputs the complex to `std::cout`. + * + * By default, outputs the complex to `std::cout`. */ std::ostream& print_matrices(std::ostream &out = std::cout) const; /*! * Prints the homology and cohomology reduction information (that is \f$f^*\f$, \f$g\f$ \f$\partial'\f$ the reduced boundary over each critical cell). - -By default, outputs the complex to `std::cout`. + * + * By default, outputs the complex to `std::cout`. */ - std::ostream& print_reduction(std::ostream &out = std::cout) const; diff --git a/HDVF/examples/HDVF/main_hdvf.cpp b/HDVF/examples/HDVF/main_hdvf.cpp index c1630c086da8..91981b96db77 100644 --- a/HDVF/examples/HDVF/main_hdvf.cpp +++ b/HDVF/examples/HDVF/main_hdvf.cpp @@ -60,7 +60,7 @@ Hdvf& HDVF_comput (const ComplexType& complex, con if (options.with_output) { cout << "----> pairs found by computePerfectHDVF" << endl ; - print_pairs(pairs) ; + std::cout << pairs ; cout << "----> reduction" << endl ; hdvf.print_reduction() ; } @@ -74,7 +74,7 @@ Hdvf& HDVF_comput (const ComplexType& complex, con throw std::runtime_error("File Parsing Error: File not found"); } out << "----> pairs found by computePerfectHDVF" << endl ; - print_pairs(pairs, out) ; + out << pairs ; out << "----> reduction" << endl ; hdvf.print_reduction(out) ; diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index bb1153d45ba5..867b7269d341 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -17,7 +17,7 @@ #include #include #include "Cubical_chain_complex.hpp" -#include "hdvf_core.hpp" +#include "Hdvf_core.h" #include "per_hdvf.hpp" #include "sub_chain_complex.hpp" #include "tools_io.hpp" @@ -44,7 +44,7 @@ void Cub_output_vtk (Hdvf_core, _Chain typedef Hdvf_core, _ChainType, _SparseMatrixType> HDVF_type; typedef Cubical_chain_complex ComplexType; // Export PSC labelling - vector > labels = hdvf.export_labelsPSC() ; + vector > labels = hdvf.export_psc_labels() ; string outfilePSC(filename+"_PSC.vtk") ; ComplexType::Cubical_chain_complex_to_vtk(complex, outfilePSC, &labels) ; @@ -61,7 +61,7 @@ void Cub_output_vtk (Hdvf_core, _Chain { string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; // vector > labels = hdvf.export_label(G,c,q) ; - OSM::Chain chain(hdvf.export_GChain(c,q)) ; + OSM::Chain chain(hdvf.export_homology_chain(c,q)) ; ComplexType::Cubical_chain_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; } if (q < complex.dim()) @@ -69,7 +69,7 @@ void Cub_output_vtk (Hdvf_core, _Chain if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_F)) { string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; - OSM::Chain chain(hdvf.export_FSTARChain(c,q)) ; + OSM::Chain chain(hdvf.export_cohomology_chain(c,q)) ; ComplexType::Cubical_chain_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; } } diff --git a/HDVF/include/CGAL/HDVF/Hdvf_core.h b/HDVF/include/CGAL/HDVF/Hdvf_core.h new file mode 100644 index 000000000000..cea04c9d09d2 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Hdvf_core.h @@ -0,0 +1,1000 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef HDVF_CORE_H +#define HDVF_CORE_H + +#include +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/OSM/Bitboard.hpp" + +namespace CGAL { +namespace HDVF { + +/** \brief HDVF Enum for the label of cells. */ +static enum FlagType { + PRIMARY, + SECONDARY, + CRITICAL, + NONE // For duality and persistence +}; + +/** \brief HDVF option (compute only reduced boundary). */ +const int OPT_BND = 0b0001; +/** \brief HDVF option (compute only reduced boundary and f). */ +const int OPT_F = 0b0010; +/** \brief HDVF option (compute only reduced boundary and g). */ +const int OPT_G = 0b0100; +/** \brief HDVF option (compute full reduction). */ +const int OPT_FULL = 0b1000; + + +/** \brief Structure to represent data for HDVF operations (pairs of cells). + * + * Cells are always sorted so that the dimension of `sigma` is lesser than the dimension of `tau`. + */ +struct PairCell { + int sigma; // Index of the first cell + int tau; // Index of the second cell + int dim; // Dimension of cells: q/q+1 for A and R, q for other operations +}; + +/** \brief Overload of operator<< for PairCell type. */ +inline std::ostream& operator<<(std::ostream &out, const std::vector& pairs) +{ + for (const auto& pair : pairs) { + out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; + } + return out ; +} + +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Hdvf_core` is the core implementation of homological discrete vector fields (HDVF for short). + + An enumeration `FlagType` is defined in the `HDVF` namespace and the `Hdvf_core` class maps each cell to one of the flags (namely PRIMARY, SECONDARY, CRITICAL). The NONE is used in `HDVF_duality` to compute relative homology on a sub-complex). + The flag of each cell is stored in an appropriate structure and getters are provided to access to this information. + + The `Hdvf_core` class stores the associated reduction in sparse matrices: row-major for \f$f\f$, and column-major for \f$g\f$, \f$h\f$ and \f$\partial'\f$. Getters are provided to access this information. + + The class provides constuction operations: `compute_perfect_hdvf` and `compute_rand_perfect_hdvf`, which build perfect HDVFs by pairing iteratively critical cells through the `A` operation. + In order to find proper pairs, several `find_pair_A` functions are provided (searching for valid pairs of cells for `A`respecting various constraints). The `A` operation can be applied to any pair returned by these functions. + + \cgalModels{HDVF} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. + \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. + \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). + \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::SparseMatrix`), providing the type of sparse matrices used. + */ + + +template typename ChainType = OSM::Chain, template typename SparseMatrixType = OSM::SparseMatrix> +class Hdvf_core { +public: + /*! + Type of column-major chains + */ + typedef ChainType CChain; + + /*! + Type of row-major chains + */ + typedef ChainType RChain; + + /*! + Type of column-major sparse matrices + */ + typedef SparseMatrixType CMatrix; + + /*! + Type of row-major sparse matrices + */ + typedef SparseMatrixType RMatrix; + +protected: + /** \brief Flags of the cells. + * _flag.at(q) contains the flags of cells of dimension q + */ + std::vector> _flag; + /** \brief Number of PRIMARY cells. */ + std::vector _nb_P; + /** \brief Number of SECONDARY cells. */ + std::vector _nb_S; + /** \brief Number of CRITICAL cells. */ + std::vector _nb_C; + /** \brief Row matrices for f. */ + std::vector _F_row; + /** \brief Column matrices for g. */ + std::vector _G_col; + /** \brief Column matrices for h. */ + std::vector _H_col; + /** \brief Column matrices for reduced boundary. */ + std::vector _DD_col; + + /** \brief Reference to the underlying complex. */ + const ComplexType& _K; + + /** \brief Hdvf_core options for computation (computation of partial reduction). */ + int _hdvf_opt; + +public: + /** + * \brief Default constructor. + * + * Builds a "empty" HDVF associated to K (with all cells critical). By default, the HDVF option is set to OPT_FULL (full reduction computed). + * + * \param[in] K A chain complex (a model of `AbstractChainComplex`) + * \param[in] hdvf_opt Option for HDVF computation (`OPT_BND`, `OPT_F`, `OPT_G` or `OPT_FULL`) + */ + Hdvf_core(const ComplexType& K, int hdvf_opt = OPT_FULL) ; + + /** + * \brief Constructor by copy. + * + * Builds a HDVF by copy from another, including options. + * + * \param[in] K A chain complex (a model of `AbstractChainComplex`) + * \param[in] hdvf_opt Option for HDVF computation (`OPT_BND`, `OPT_F`, `OPT_G` or `OPT_FULL`) + */ + Hdvf_core(const Hdvf_core& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } + + /** + * \brief HDVF destructor. */ + ~Hdvf_core() { } + + /** + * \brief Find a valid PairCell of dimension q / q+1 for A. + * + * \param[in] q The function finds a pair of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). It returns the first valid pair found by iterators. + + */ + virtual PairCell find_pair_A(int q, bool &found) const; + + /** + * \brief Find a valid PairCell for A containing `gamma` (a cell of dimension `q`) + * + * \param[in] q Dimension of the cell gamma. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] gamma The function finds a cell \f$\gamma'\f$ such that one of the following conditions holds: + * - \f$\gamma'\f$ has dimension q+1 and \f$(\gamma, \gamma')\f$ is valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma'), \gamma \rangle\f$ invertible), + * - \f$\gamma'\f$ has dimension q-1 and \f$(\gamma', \gamma)\f$ is valid for A (ie. such that \f$\langle \partial_{q}(\gamma), \gamma' \rangle\f$ invertible). + */ + virtual PairCell find_pair_A(int q, bool &found, int gamma) const; + + /** + * \brief Find *all* valid PairCells of dimension q / q+1 for A. This method is thus slower than `find_pair_A`. + * + * \param[in] q The function finds all pairs of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). It returns the vector of all valid pairs found. + */ + virtual std::vector find_pairs_A(int q, bool &found) const; + + /** + * \brief Find *all* valid PairCell for A containing `gamma` (a cell of dimension `q`) + * + * \param[in] q Dimension of the cell gamma. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] gamma The function finds all the cell \f$\gamma'\f$ such that one of the following conditions holds: + * - \f$\gamma'\f$ has dimension q+1 and \f$(\gamma, \gamma')\f$ is valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma'), \gamma \rangle\f$ invertible), + * - \f$\gamma'\f$ has dimension q-1 and \f$(\gamma', \gamma)\f$ is valid for A (ie. such that \f$\langle \partial_{q}(\gamma), \gamma' \rangle\f$ invertible). + * \return The vector of all possible valid pairs. + */ + virtual std::vector find_pairs_A(int q, bool &found, int gamma) const; + + /** + * \brief A operation: pairs critical cells. + * + * A pair of critical cells \f$(\gamma_1, \gamma_2)\f$ of respective dimension q and q+1 is valid for A if \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ is invertible. After the A operation, \f$\gamma_1\f$ becomes PRIMARY, \f$\gamma_2\f$ becomes SECONDARY. The A functions updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). + */ + void A(int gamma1, int gamma2, int dim); + + /** + * \brief Compute a perfect HDVF. + * + * As long as valid pairs for A exist, the function selects the first available pair (returned by `find_pair_A`) and applies the corresponding A operation. + * If the `Ring` of coefficients is a field, this operation always produces a perfect HDVF (ie. the reduced boundary is null and the reduction provides homology and cohomology information). + * Otherwise the operation produces a maximal HDVF with a residual boundary matrix over critical cells. + * + * If the HDVF is initially not trivial (some cells have already been paired), the function completes it into a perfect HDVF. + * + * \param[in] verbose If this parameter is `true`, all intermediate reductions are printed out. + * + * \return The vector of all pairs of cells used for apply A. + */ + std::vector compute_perfect_hdvf(bool verbose = false); + + /** + * \brief Compute a random perfect HDVF. + * + * As long as valid pairs for A exist, the function selects a random pair (among pairs returned by `find_pairs_A`) and applies the corresponding A operation. + * If the `Ring` of coefficients is a field, this operation always produces a perfect HDVF (that is the reduced boundary is null and the reduction provides homology and cohomology information). + * + * If the HDVF is initially not trivial (some cells have already been paired), the function randomly completes it into a perfect HDVF. + * + * \warning This method is slower that `compute_perfect_hdvf` (finding out all possible valid pairs requires additional time). + * + * \param[in] verbose If this parameter is `true`, all intermediate reductions are printed out. + * + * \return The vector of all pairs of cells used for apply A. + */ + std::vector compute_rand_perfect_hdvf(bool verbose = false); + + // Hdvf_core getters + + /** + * \brief Get cells with a given `flag` in any dimension. + * + * The function returns a vector containing, for each dimension, the vector of cells with a given `flag`. + * + * \param[in] flag Flag to select. + */ + std::vector > get_flag (FlagType flag) const ; + + /** + * \brief Get cells with a given `flag` in dimension `q`. + * + * The function returns the vector of cells of dimension `q` with a given `flag`. + * + * \param[in] flag Flag to select. + * \param[in] q Dimension visited. + */ + std::vector get_flag_dim (FlagType flag, int q) const ; + + /*! + * \brief Get the flag of the cell `tau` in dimension `q`. + * + * \param[in] tau Index of the cell. + * \param[in] q Dimension of the cell. + */ + FlagType get_cell_flag (int q, int tau) const { return _flag.at(q).at(tau); } + + /** + * \brief Get HDVF computation option. + */ + int get_hdvf_opts () const { return _hdvf_opt ; } + + /** + * \brief Get the row-major matrix of \f$f\f$ (from the reduction associated to the HDVF). + */ + const RMatrix& get_f (int q) const { return _F_row.at(q); } + + /** + * \brief Get the column-major matrix of \f$g\f$ (from the reduction associated to the HDVF). + */ + const CMatrix& get_g (int q) const { return _G_col.at(q); } + + /** + * \brief Get the column-major matrix of \f$h\f$ (from the reduction associated to the HDVF). + */ + const CMatrix& get_h (int q) const { return _H_col.at(q); } + + /** + * \brief Get the column-major matrix of \f$\partial'\f$, reduced boundary operator (from the reduction associated to the HDVF). + */ + const CMatrix& get_dd (int q) const { return _DD_col.at(q); } + + /** + * Prints the matrices of the reduction (that is \f$f\f$, \f$g\f$, \f$h\f$, \f$\partial'\f$ the reduced boundary). + * By default, outputs the complex to `std::cout`. + */ + std::ostream& print_matrices(std::ostream &out = std::cout) const; + + /** + * \brief Prints the homology and cohomology reduction information. + * + * Prints \f$f^*\f$, \f$g\f$ \f$\partial'\f$ the reduced boundary over each critical cell. + * + * By default, outputs the complex to `std::cout`. + */ + std::ostream& print_reduction(std::ostream &out = std::cout) const; + + + /** + * \brief Export Primary/Secondary/Critical labels for vtk export. + * + * The method exports the labels of every cells in each dimension. + * + * \return A vector containing, for each dimension, the vector of labels by cell index. + */ + virtual std::vector > export_psc_labels () const + { + std::vector > labels(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + { + for (int i = 0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (_flag.at(q).at(i) == SECONDARY) + labels.at(q).push_back(1) ; + else if (_flag.at(q).at(i) == CRITICAL) + labels.at(q).push_back(0) ; + else // NONE + labels.at(q).push_back(2) ; + } + } + return labels ; + } + + /** + * \brief Export homology generators associated to `cell` (critical cell) of dimension `q` for vtk export. + * + * The method exports the chain \f$g(\sigma)\f$ for \f$\sigma\f$ the cell of index `cell` and dimension `q`. + * + * \return A column-major chain. + */ + virtual CChain export_homology_chain (int cell, int q) const + { + if ((q<0) || (q>_K.dim())) + throw "Error : export_homology_chain with dim out of range" ; + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + CChain g_cell(OSM::getColumn(_G_col.at(q), cell)) ; + // Add 1 to the cell + g_cell[cell] = 1 ; + return g_cell ; + } + else + throw "Error : trying to export g_chain without proper Hdvf_core option" ; + } + + /** + * \brief Export cohomology generators associated to `cell` (critical cell) of dimension `q` for vtk export. + * + * The method exports the chain \f$f^\star(\sigma)\f$ for \f$\sigma\f$ the cell of index `cell` and dimension `q`. + * + * \return A column-major chain. + */ + virtual CChain export_cohomology_chain (int cell, int dim) const + { + if ((dim<0) || (dim>_K.dim())) + throw "Error : export_homology_chain with dim out of range" ; + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + RChain fstar_cell(OSM::getRow(_F_row.at(dim), cell)) ; + // Add 1 to the cell + fstar_cell[cell] = 1 ; + // Compute the cofaces + if (dim < _K.dim()) + { + CChain fstar_cofaces(_K.nb_cells(dim+1)) ; + for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) + { + // Set the cofaces of it->first in dimension dim+1 + RChain cofaces(_K.cod(it->first,dim)) ; + for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + fstar_cofaces[it2->first] = 1 ; + } + return fstar_cofaces ; + } + else + return CChain(0) ; + } + else + throw "Error : trying to export g_chain without proper Hdvf_core option" ; + } +protected: + /** \brief Project a chain onto a given flag + * The methods cancels all the coefficients of the chain of dimension `q` that do not correspond to`flag`. This is actually an implementation of the projection operator onto the sub A-module generated by cells of flag `flag`. + * + * \param[in] chain The chain projected. + * \param[in] flag The flag onto which the chain is projected. + * \param[in] q Dimension of the chain + * + * \result Returns a copy of `chain` where only coefficients of cells of flag `flag` are kept (all other coefficients are cancelled). + */ + template + ChainType projection(const ChainType& chain, FlagType flag, int q) const { + // Create a new chain to store the result + // Better to initialize 'result' directly with the correct size and iterate over it + ChainType result(chain); + + // Iterate over each element of the chain + std::vector tmp ; + for (typename ChainType::const_iterator it = result.cbegin(); it != result.cend(); ++it) + { + int cell_index = it->first; + CoefficientType value = it->second; + + // Check the flag of the corresponding cell + if (_flag[q][cell_index] != flag) { + // Mark for cancellation + tmp.push_back(cell_index) ; + + } + } + // Cancel all coefficients of tmp + result /= tmp ; + return result; + } + + /** \brief Display a text progress bar. */ + void progress_bar(int i, int n) + { + const int step(n/20) ; + if ((i%step)==0) + { + const float percentage(float(i)/(n-1)) ; + const char PBSTR[] = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" ; + const int PBWIDTH(60) ; + int val = (int) (percentage * 100); + int lpad = (int) (percentage * PBWIDTH); + int rpad = PBWIDTH - lpad; + printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); + fflush(stdout); + } + if (i==(n-1)) + std::cout << std::endl ; + } + +}; + +// Constructor for the Hdvf_core class +template typename ChainType, template typename SparseMatrixType> +Hdvf_core::Hdvf_core(const ComplexType& K, int hdvf_opt) : _K(K) { + // Get the dimension of the simplicial complex + int dim = _K.dim(); + std::cout << "----> Starting Hdvf_core creation / dim " << dim << std::endl ; + // Hdvf_core options + _hdvf_opt = hdvf_opt ; + + // Resize the _DD_col vector to hold dim+1 elements + _DD_col.resize(dim + 1); + + // Resize the _F_row vector to hold dim+1 elements + if (_hdvf_opt & (OPT_FULL | OPT_F)) + _F_row.resize(dim + 1); + + // Resize the _G_col vector to hold dim+1 elements + if (_hdvf_opt & (OPT_FULL | OPT_G)) + _G_col.resize(dim + 1); + + // Resize the _H_col vector to hold dim+1 elements + if (_hdvf_opt & OPT_FULL) + _H_col.resize(dim + 1); + + // Resize flag and count vectors to hold dim+1 elements + _flag.resize(dim + 1); + _nb_P.resize(dim + 1); + _nb_S.resize(dim + 1); + _nb_C.resize(dim + 1); + + // Initialize matrices and counters + + for (int q = 0; q <= dim; q++) { + // Initialize _F_row[q] as a row matrix with dimensions (dim(q) x dim(q)) + if (_hdvf_opt & (OPT_FULL | OPT_F)) + _F_row[q] = RMatrix(_K.nb_cells(q), _K.nb_cells(q)); + + // Initialize _G_col[q] as a column matrix with dimensions (dim(q) x dim(q)) + if (_hdvf_opt & (OPT_FULL | OPT_G)) + _G_col[q] = CMatrix(_K.nb_cells(q), _K.nb_cells(q)); + + // Initialize _H_col[q] as a column matrix with dimensions (dim(q+1) x dim(q)) + if (_hdvf_opt & OPT_FULL) + _H_col[q] = CMatrix(_K.nb_cells(q + 1), _K.nb_cells(q)); + + // Initialize the counters for PRIMARY, SECONDARY, and CRITICAL cells + _nb_P[q] = 0; + _nb_S[q] = 0; + _nb_C[q] = _K.nb_cells(q); + } + + // Initialize the flags for each dimension to CRITICAL + for (int q = 0; q <= dim; q++) { + _flag[q] = std::vector(_K.nb_cells(q), CRITICAL); + } + + // Populate the DD matrices + _DD_col.resize(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + _DD_col.at(q) = _K.get_bnd_matrix(q) ; + std::cout << "------> End Hdvf_core creation" << std::endl ; +} + +// Method to print the matrices +template typename ChainType, template typename SparseMatrixType> +std::ostream& Hdvf_core::print_matrices(std::ostream& out) const { + // Iterate through each dimension and print the corresponding matrices + for (int q = 0; q <= _K.dim(); ++q) { + out << "------- Dimension " << q << std::endl; + + out << "Matrices _DD_col:" << std::endl; + out << _DD_col[q] << std::endl; + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + out << "Matrices _F_row:" << std::endl; + out << _F_row[q] << std::endl; + } + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + out << "Matrices _G_col:" << std::endl; + out << _G_col[q] << std::endl; + } + + if (_hdvf_opt & OPT_FULL) + { + out << "Matrices _H_col:" << std::endl; + out << _H_col[q] << std::endl; + } + } + return out ; +} + + +// Methods to find a pair of cells for A in dimension q +// -> = +- 1 with cell1, cell2 critical +// First version: returns a pair of dimensions q / q+1 +// Second version: returns all the pairs containing sigma + +// find a valid PairCell for A in dimension q +template typename ChainType, template typename SparseMatrixType> +PairCell Hdvf_core::find_pair_A(int q, bool &found) const +{ + found = false; + PairCell p; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = _DD_col[q+1].begin(); (it_col != _DD_col[q+1].end() && !found); ++it_col) + { + const CChain& col(OSM::cgetColumn(_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + found = true; + } + } + } + return p; +} + +// find a valid PairCell containing tau for A in dimension q +template typename ChainType, template typename SparseMatrixType> +PairCell Hdvf_core::find_pair_A(int q, bool &found, int gamma) const +{ + found = false; + PairCell p ; + + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), gamma)) ; + for (typename CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + p.sigma = it->first ; + p.tau = gamma ; + p.dim = q-1 ; + } + } + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + RChain tmp(OSM::getRow(_DD_col.at(q+1), gamma)) ; + for (typename RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + p.sigma = gamma ; + p.tau = it->first ; + p.dim = q ; + } + } + return p; +} + +// find all the valid PairCells for A in dimension q +template typename ChainType, template typename SparseMatrixType> +std::vector Hdvf_core::find_pairs_A(int q, bool &found) const +{ + std::vector pairs; + found = false ; + + // Iterate through columns of _DD_col[q+1] + for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) + { + const CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + + // Iterate through the entries of the column + for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { + if ((it->second == 1) || (it->second == -1)) { + // If an entry with coefficient 1 or -1 is found, set the pair and mark as found + PairCell p; + p.sigma = it->first; + p.tau = *it_col; + p.dim = q; + pairs.push_back(p) ; + found = true; + } + } + } + return pairs; +} + +// find all the valid PairCell containing gamma for A in dimension q +template typename ChainType, template typename SparseMatrixType> +std::vector Hdvf_core::find_pairs_A(int q, bool &found, int gamma) const +{ + found = false; + std::vector pairs; + + // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible + RChain tmp(OSM::getRow(_DD_col.at(q+1), gamma)) ; + for (typename RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = gamma ; + p.tau = it->first ; + p.dim = q ; + pairs.push_back(p) ; + } + } + // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible + const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), gamma)) ; + for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) + { + if (abs(it->second) == 1) + { + found = true ; + PairCell p ; + p.sigma = it->first ; + p.tau = gamma ; + p.dim = q-1 ; + pairs.push_back(p) ; + } + } + return pairs; +} + + + + +// Method to perform operation A +// tau1 is in dimension q, tau2 is in dimension q+1 +template typename ChainType, template typename SparseMatrixType> +void Hdvf_core::A(int tau1, int tau2, int q) { + //----------------------------------------------- Submatrices of D ---------------------------------------------------- + + // Output operation details to the console + // cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; + + // Extract submatrices from _DD_col + RChain D12(OSM::getRow(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 + CChain D21(OSM::getColumn(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 + CoefficientType D11(D12[tau2]); // D11 is the coefficient at the intersection of tau2 in D12 + + // Assert that D11 is either 1 or -1 (check invertibility) + assert((D11 == 1) || (D11 == -1)); // !!!!! Test invertibility + + // Compute the inverse of D11 (which is itself, since D11 is 1 or -1) + CoefficientType D11_inv = D11; + + // Perform operations to remove the row and column contributions + D12 /= std::vector({tau2}); // Remove tau2 column from D12 + D21 /= std::vector({tau1}); // Remove tau1 row from D21 + + // Delete rows and columns from _DD_col + _DD_col[q + 1].delRow(tau1); // Remove row tau1 from _DD_col[q+1] + _DD_col[q + 1].delColumn(tau2); // Remove column tau2 from _DD_col[q+1] + + //---------------------------------------------- Submatrices of F ----------------------------------------------------- + + RChain F11 ; + CChain G11 ; + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Extract the relevant submatrix from _F_row + F11 = OSM::getRow(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 + + // Delete the row tau1 from _F_row + _F_row[q].delRow(tau1); + } + + //--------------------------------------------- Submatrices of G ------------------------------------------------------ + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Extract the relevant submatrix from _G_col + G11 = OSM::getColumn(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 + + // Delete the column tau2 from _G_col + _G_col[q + 1].delColumn(tau2); + } + + //--------------------------------------------- Update matrices ------------------------------------------------------- + + // ---- Update _F_row + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Update _F_row[q] + // Subtract the product of (D21 * D11_inv) and F11 from _F_row[q] + // Note: % operator returns a row matrix, so be careful with operations + _F_row[q] -= (D21 * D11_inv) % F11; + + // Set the column tau1 of _F_row[q] to (D21 * (-D11_inv)) + OSM::setColumn(_F_row[q], tau1, D21 * (-D11_inv)); + + // Remove the row tau2 from _F_row[q+1] + _F_row[q + 1].delRow(tau2); + } + + // ---- Update _G_col + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Update _G_col[q + 1] + // Subtract the product of (G11 * D11_inv) and D12 from _G_col[q+1] + _G_col[q + 1] -= (G11 * D11_inv) * D12; + + // Set the row tau2 of _G_col[q + 1] to (D12 * (-D11_inv)) + OSM::setRow(_G_col[q + 1], tau2, D12 * (-D11_inv)); + + // Remove the column tau1 from _G_col[q] + _G_col[q].delColumn(tau1); + } + + // ---- Update _H_col + + if (_hdvf_opt & OPT_FULL) + { + // Update _H_col[q] + // Compute the temporary matrix product G11 * F11 + CMatrix tmp = G11 * F11; + + // Add the product of tmp and D11_inv to _H_col[q] + _H_col[q] += (tmp) * D11_inv; + + // Set the row tau2 of _H_col[q] to (F11 * D11_inv) + OSM::setRow(_H_col[q], tau2, F11 * D11_inv); + + // Set the column tau1 of _H_col[q] to (G11 * D11_inv) + OSM::setColumn(_H_col[q], tau1, G11 * D11_inv); + + // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv + _H_col[q].set_coef(tau2, tau1, D11_inv); + } + + // ---- Update _DD_col + + // Update _DD_col + _DD_col[q + 1] -= (D21 * D12) * D11_inv; + + // Remove columns and rows from _DD_col as necessary + if (q > 0) { + _DD_col[q].delColumn(tau1); // Remove column tau1 from _DD_col[q] + } + if (q + 2 <= _K.dim()) { + _DD_col[q + 2].delRow(tau2); // Remove row tau2 from _DD_col[q+2] + } + + // Update flags + _flag[q][tau1] = PRIMARY; // Set the flag of tau1 in dimension q to PRIMARY + --_nb_C.at(q) ; + ++_nb_P.at(q) ; + _flag[q + 1][tau2] = SECONDARY; // Set the flag of tau2 in dimension q+1 to SECONDARY + --_nb_C.at(q+1) ; + ++_nb_S.at(q+1) ; + + // ----------------------------------------------------------------------------------------------------------------------- +} + + +// Method to compute a perfect Hdvf_core +template typename ChainType, template typename SparseMatrixType> +std::vector Hdvf_core::compute_perfect_hdvf(bool verbose) { + std::vector pair_list; // Vector to store the list of pairs + bool trouve = false; // Flag to indicate whether a pair was found + int dim = _K.dim(); // Get the dimension of the complex K + + // Loop through dimensions from q-1 to 0 + for (int q = dim - 1; q >= 0; --q) { + std::cout << std::endl << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; + // cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; + // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) + + // Find a pair of cells in dimension q + PairCell pair = find_pair_A(q, trouve); + + // While a pair is found + while (trouve) { + progress_bar(_K.nb_cells(q)-_nb_C.at(q), _K.nb_cells(q)) ; + // Add the found pair to the list + pair_list.push_back(pair); + + // Perform operation A with the found pair + A(pair.sigma, pair.tau, q); + if (verbose) + { + std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; + print_matrices(std::cout) ; + } + + // Find another pair of cells in dimension q + pair = find_pair_A(q, trouve); + } + } + + // Return the list of pairs found + return pair_list; +} + +// Method to compute a random perfect Hdvf_core +// Returns a vector of PairCell objects representing the pairs found +template typename ChainType, template typename SparseMatrixType> +std::vector Hdvf_core::compute_rand_perfect_hdvf(bool verbose) { + std::vector pair_list; // Vector to store the list of pairs + bool trouve = false; // Flag to indicate whether a pair was found + int dim = _K.dim(); // Get the dimension of the complex K + + // Init random generator + std::random_device dev; + std::mt19937 rng(dev()); // Random + + // Loop through dimensions from q-1 to 0 + for (int q = dim - 1; q >= 0; --q) { + std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; + // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) + + std::vector pairs = find_pairs_A(q, trouve); + + PairCell pair ; + + // While a pair is found + while (trouve) + { + // Add one of the pairs (randomly) to the list + { + // Pickup a random cell sigma + std::uniform_int_distribution rand_dist(0,pairs.size()-1); + int i(rand_dist(rng)) ; + pair = pairs.at(i) ; + } + pair_list.push_back(pair); + + // Perform operation A with the chosen pair + A(pair.sigma, pair.tau, pair.dim); + if (verbose) + { + std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; + print_matrices(std::cout) ; + } + + // Compute possible pairings + pairs = find_pairs_A(q, trouve); + } + } + // Return the list of pairs found + return pair_list; +} + +// Method to get cells if with a given flag (P,S,C) for each dimension +template typename ChainType, template typename SparseMatrixType> +std::vector > Hdvf_core::get_flag (FlagType flag) const +{ + std::vector > res(_K.dim()+1) ; + for (int q=0; q<=_K.dim(); ++q) + { + for (int i=0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == flag) + res.at(q).push_back(i) ; + } + } + return res ; +} + +// Method to get cells with a given flag (P,S,C) for a given dimension +template typename ChainType, template typename SparseMatrixType> +std::vector Hdvf_core::get_flag_dim (FlagType flag, int q) const +{ + std::vector res ; + for (int i=0; i<_K.nb_cells(q); ++i) + { + if (_flag.at(q).at(i) == flag) + res.push_back(i) ; + } + return res ; +} + +// Method to print the current state of the reduction +template typename ChainType, template typename SparseMatrixType> +std::ostream& Hdvf_core::print_reduction(std::ostream& out) const +{ + // Print PSC + out << "----- flags of cells:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < _K.nb_cells(q); ++i) + { + const int flag(_flag.at(q).at(i)) ; + if (flag == PRIMARY) + out << i << " -> P" << std::endl ; + else if (flag == SECONDARY) + out << i << " -> S" << std::endl ; + else + out << i << " -> C" << std::endl ; + } + out << std::endl; + } + + // Print critical cells + out << "----- critical cells:" << std::endl; + std::vector > critical(get_flag(CRITICAL)) ; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + out << critical.at(q).at(i) << " "; + } + out << std::endl; + } + + if (_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Print matrices g + out << "----- g:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + const int id(critical.at(q).at(i)) ; + out << "g(" << id << ") = (" << id << ")"; + // Iterate over the ith column of _G_col + CChain col(OSM::getColumn(_G_col.at(q), id)) ; // TODO cget + for (typename CChain::const_iterator it_col = col.cbegin(); it_col != col.cend(); ++it_col) { + out << " + " << it_col->second << ".(" << it_col->first << ") + "; + } + out << std::endl; + } + } + } + + if (_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Print matrices f* + out << "----- f*:" << std::endl; + for (int q = 0; q <= _K.dim(); ++q) { + out << "--- dim " << q << std::endl; + for (int i = 0; i < critical.at(q).size(); ++i) + { + const int id(critical.at(q).at(i)) ; + out << "f*(" << id << ") = (" << id << ")"; + // Iterate over the ith row of _F_row + RChain row(OSM::getRow(_F_row.at(q), id)) ; // TODO cget + for (typename RChain::const_iterator it_row = row.cbegin(); it_row != row.cend(); ++it_row) { + out << " + " << it_row->second << ".(" << it_row->first << ") + "; + } + out << std::endl; + } + } + } + return out ; +} + +} /* end namespace HDVF */ +} /* end namespace CGAL */ + +#endif // HDVF_CORE_H diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index e6292bcf7dab..3e40a0c7935a 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -8,7 +8,7 @@ //#include "config.h" #include "Simplex.hpp" #include "Abstract_simplicial_chain_complex.hpp" -#include "hdvf_core.hpp" +#include "Hdvf_core.h" #include "per_hdvf.hpp" #include "sub_chain_complex.hpp" #include "tools_io.hpp" @@ -38,7 +38,7 @@ void Simp_output_vtk (Hdvf_core, _C typedef Hdvf_core, _ChainType, _SparseMatrixType> HDVF_type; // Export PSC labelling string outfile(filename+"_PSC.vtk") ; - vector > labels = hdvf.export_labelsPSC() ; + vector > labels = hdvf.export_psc_labels() ; ComplexType::Simplicial_chain_complex_to_vtk(complex, outfile, &labels) ; if (hdvf.get_hdvf_opts() != OPT_BND) @@ -53,7 +53,7 @@ void Simp_output_vtk (Hdvf_core, _C { string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; // vector > labels = hdvf.export_label(G,c,q) ; - OSM::Chain chain(hdvf.export_GChain(c,q)) ; + OSM::Chain chain(hdvf.export_homology_chain(c,q)) ; ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; } if (q < complex.dim()) @@ -61,7 +61,7 @@ void Simp_output_vtk (Hdvf_core, _C if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_F)) { string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; - OSM::Chain chain(hdvf.export_FSTARChain(c,q)) ; + OSM::Chain chain(hdvf.export_cohomology_chain(c,q)) ; ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; } } diff --git a/HDVF/include/CGAL/HDVF/hdvf.hpp b/HDVF/include/CGAL/HDVF/hdvf.hpp index 522ed29fdfd8..174dce40a597 100644 --- a/HDVF/include/CGAL/HDVF/hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf.hpp @@ -1,39 +1,47 @@ -/** - * \file hdvf.hpp - * \brief Hdvf code library. - * \author Bac A. - * \version 0.1.0 - * \date 22/08/2024 - * - * Hdvf code library (constructors, operations, finders). - */ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac -#ifndef HDVF_H -#define HDVF_H +#ifndef CGAL_HDVF_H +#define CGAL_HDVF_H #include #include #include #include -#include "CGAL/Hdvf/Hdvf_core.hpp" +#include "CGAL/Hdvf/Hdvf_core.h" #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" namespace CGAL { namespace HDVF { -/** - * \class Hdvf - * \brief Implementation of Hdvf and associate operations. - * - * The Hdvf class contains all functions to build Hdvf, create perfect Hdvf (A and associate finders) and delineated generators through Hdvf operations (R, M, W, MW and associate finders). - * - * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam ComplexType The type of complex (default is SimpComplex) - * - * \author Bac A. - * \version 0.1.0 - * \date 22/08/2024 +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Hdvf` implements homology and cohomology computation via homological discrete vector fields (HDVF for short). + + An enumeration `FlagType` is defined in the `HDVF` namespace and the `Hdvf_core` class maps each cell to one of the flags (namely PRIMARY, SECONDARY, CRITICAL). The NONE is used in `HDVF_duality` to compute relative homology on a sub-complex). + The flag of each cell is stored in an appropriate structure and getters are provided to access to this information. + + The `Hdvf_core` class stores the associated reduction in sparse matrices: row-major for \f$f\f$, and column-major for \f$g\f$, \f$h\f$ and \f$\partial'\f$. Getters are provided to access this information. + + The class provides constuction operations: `compute_perfect_hdvf` and `compute_rand_perfect_hdvf`, which build perfect HDVFs by pairing iteratively critical cells through the `A` operation. + In order to find proper pairs, several `find_pair_A` functions are provided (searching for valid pairs of cells for `A`respecting various constraints). The `A` operation can be applied to any pair returned by these functions. + + \cgalModels{HDVF} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. + \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. + \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). + \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::SparseMatrix`), providing the type of sparse matrices used. */ @@ -1181,4 +1189,4 @@ void Hdvf::MW(int pi, int sigma, int q) { } /* end namespace HDVF */ } /* end namespace CGAL */ -#endif // HDVF_H +#endif // CGAL_HDVF_H diff --git a/HDVF/include/CGAL/HDVF/hdvf_core.hpp b/HDVF/include/CGAL/HDVF/hdvf_core.hpp deleted file mode 100644 index 5584b4d8d986..000000000000 --- a/HDVF/include/CGAL/HDVF/hdvf_core.hpp +++ /dev/null @@ -1,1953 +0,0 @@ -// Copyright (c) 2025 LIS Marseille (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Alexandra Bac - -#ifndef HDVF_CORE_HPP -#define HDVF_CORE_HPP - -#include -#include -#include -#include -#include "CGAL/OSM/OSM.hpp" -#include "CGAL/OSM/Bitboard.hpp" - -namespace CGAL { -namespace HDVF { - - -/** \brief HDVF Enum for the label of cells. */ -static enum FlagType { - PRIMARY, - SECONDARY, - CRITICAL, - NONE // For duality and persistence -}; - -/** \brief HDVF option (compute only reduced boundary). */ -const int OPT_BND = 0b0001; -/** \brief HDVF option (compute only reduced boundary and f). */ -const int OPT_F = 0b0010; -/** \brief HDVF option (compute only reduced boundary and g). */ -const int OPT_G = 0b0100; -/** \brief HDVF option (compute full reduction). */ -const int OPT_FULL = 0b1000; - - -/** \brief Structure to represent data for HDVF operations (pairs of cells). - */ -struct PairCell { - int sigma; // Index of the first cell - int tau; // Index of the second cell - int dim; // Dimension of cells: q/q+1 for A and R, q for other operations -}; - -/** \brief Method printing PairCells (that is pairs of cells for HDVF operations) */ - -std::ostream& print_pairs(const std::vector& pairs, std::ostream& out = std::cout) -{ - for (const auto& pair : pairs) { - out << "Sigma: " << pair.sigma << ", Tau: " << pair.tau << ", Dim: " << pair.dim << std::endl; - } - return out ; -} - -/*! - \ingroup PkgHDVFAlgorithmClasses - - The class `Hdvf_core` is the core implementation of homological discrete vector fields (HDVF for short). - - An enumeration `FlagType` is defined in the `HDVF` namespace and the `Hdvf_core` class maps each cell to one of the flags (namely PRIMARY, SECONDARY, CRITICAL). The NONE is used in `HDVF_duality` to compute relative homology on a sub-complex). - The flag of each cell is stored in an appropriate structure and getters are provided to access to this information. - - The `Hdvf_core` class stores the associated reduction in sparse matrices: row-major for \f$f\f$, and column-major for \f$g\f$, \f$h\f$ and \f$\partial'\f$. Getters are provided to access this information. - - The class provides constuction operations: `compute_perfect_hdvf` and `compute_rand_perfect_hdvf`, which build perfect HDVFs by pairing iteratively critical cells through the `A` operation. - In order to find proper pairs, several `find_pair_A` functions are provided (searching for valid pairs of cells for `A`respecting various constraints). The `A` operation can be applied to any pair returned by these functions. - - \cgalModels{HDVF} - - \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. - \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. - \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). - \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::SparseMatrix`), providing the type of sparse matrices used. - */ - - -template typename ChainType = OSM::Chain, template typename SparseMatrixType = OSM::SparseMatrix> -class Hdvf_core { -public: - /** \brief Typedefs for coefficient type and different chain and matrix types. */ - typedef ChainType CChain; - typedef ChainType RChain; - typedef SparseMatrixType CMatrix; - typedef SparseMatrixType RMatrix; - -protected: - // Properties - /** \brief Flags for the cells. */ - std::vector> _flag; - /** \brief Number of PRIMARY cells. */ - std::vector _nb_P; - /** \brief Number of SECONDARY cells. */ - std::vector _nb_S; - /** \brief Number of CRITICAL cells. */ - std::vector _nb_C; - /** \brief Row matrices for f. */ - std::vector _F_row; - /** \brief Column matrices for g. */ - std::vector _G_col; - /** \brief Column matrices for h. */ - std::vector _H_col; - /** \brief Column matrices for reduced boundary. */ - std::vector _DD_col; - - /** \brief Reference to the underlying complex. */ - const ComplexType& _K; - - /** \brief Hdvf_core options for computation (computation of partial reduction). */ - int _hdvf_opt; - -public: - // Constructor - default : full reduction computed, no sub-complex - Hdvf_core(const ComplexType& K, int hdvf_opt = OPT_FULL) ; - // Copy constructor - Hdvf_core(const Hdvf_core& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } - // Destructor - ~Hdvf_core() { } - - // findPair functions - - /** \brief find a valid PairCell for A in dimension q */ - virtual PairCell find_pair_A(int q, bool &found) const; - /** \brief find a valid PairCell containing tau for A in dimension q */ - virtual PairCell find_pair_A(int q, bool &found, int tau) const; - /** \brief find all the valid PairCell for A in dimension q */ - virtual std::vector find_pairs_A(int q, bool &found) const; - /** \brief find all the valid PairCell containing tau for A in dimension q */ - virtual std::vector find_pairs_A(int q, bool &found, int tau) const; - - // Hdvf_core methods - /** \brief Hdvf_core operation A(gamma1, gamma2) */ - void A(int gamma1, int gamma2, int dim); - - /** \brief Compute a perfect Hdvf_core - From dimension q-1 to dimension 0 - As long as find_pair_A(q) returns a pair - -> Perform operation A - -> Add the pair to the output vector - */ - std::vector compute_perfect_hdvf(bool verbose = false); - - /** \brief Compute a perfect Hdvf_core - From dimension q-1 to dimension 0 - As long as find_pairs_A(q) returns pairs - -> Choose one randomly - -> Perform operation A - -> Add the pair to the output vector - Slower than compute_perfect_hdvf - */ - std::vector compute_rand_perfect_hdvf(bool verbose = false); - - // Hdvf_core getters - - // Flag getters - // Method to get cells if with a given flag (P,S,C) for each dimension - std::vector > get_flag (FlagType flag) const ; - // Method to get cells with a given flag (P,S,C) for a given dimension - std::vector get_flag_dim (FlagType flag, int q) const ; - // Method to get the flag (P,S,C) of a cell tau of dimension q - FlagType get_cell_flag (int q, int tau) const { return _flag.at(q).at(tau); } - - // Options getters - // Method to get options - int get_hdvf_opts () const { return _hdvf_opt ; } - - // Reduction getters - const RMatrix& get_f (int q) const { return _F_row.at(q); } - const CMatrix& get_g (int q) const { return _G_col.at(q); } - const CMatrix& get_h (int q) const { return _H_col.at(q); } - const CMatrix& get_dd (int q) const { return _DD_col.at(q); } - - // Method to print the matrices _F_row, _G_col, _H_col - std::ostream& print_matrices(std::ostream &out = std::cout) const; - - // Method to print the reduction - std::ostream& print_reduction(std::ostream &out = std::cout) const; - - // Method to print A-pairs -// virtual std::ostream& print_pairs(const std::vector& pairs, std::ostream &out = std::cout); - -public: - // Method to generate PSC labels for visualisation - virtual std::vector > export_labelsPSC () const - { - std::vector > labels(_K.dim()+1) ; - for (int q=0; q<=_K.dim(); ++q) - { - for (int i = 0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == PRIMARY) - labels.at(q).push_back(-1) ; - else if (_flag.at(q).at(i) == SECONDARY) - labels.at(q).push_back(1) ; - else if (_flag.at(q).at(i) == CRITICAL) - labels.at(q).push_back(0) ; - else // NONE - labels.at(q).push_back(2) ; - } - } - return labels ; - } - - // Method to export G chains for visualisation - virtual CChain export_GChain (int cell, int dim) const - { - if ((dim<0) || (dim>_K.dim())) - throw "Error : export_GChain with dim out of range" ; - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - CChain g_cell(OSM::getColumn(_G_col.at(dim), cell)) ; - // Add 1 to the cell - g_cell[cell] = 1 ; - return g_cell ; - } - else - throw "Error : trying to export g_chain without proper Hdvf_core option" ; - } - - // Method to export FSTAR chains for visualisation - virtual CChain export_FSTARChain (int cell, int dim) const - { - if ((dim<0) || (dim>_K.dim())) - throw "Error : export_GChain with dim out of range" ; - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - RChain fstar_cell(OSM::getRow(_F_row.at(dim), cell)) ; - // Add 1 to the cell - fstar_cell[cell] = 1 ; - // Compute the cofaces - if (dim < _K.dim()) - { - CChain fstar_cofaces(_K.nb_cells(dim+1)) ; - for (typename RChain::const_iterator it = fstar_cell.cbegin(); it != fstar_cell.cend(); ++it) - { - // Set the cofaces of it->first in dimension dim+1 - RChain cofaces(_K.cod(it->first,dim)) ; - for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - fstar_cofaces[it2->first] = 1 ; - } - return fstar_cofaces ; - } - else - return CChain(0) ; - } - else - throw "Error : trying to export g_chain without proper Hdvf_core option" ; - } -protected: - // Method to project a chain onto P, S, or C cells - template - ChainType projection(const ChainType& chain, FlagType flag, int dim) const { - // Create a new chain to store the result - // Better to initialize 'result' directly with the correct size and iterate over it - ChainType result(chain); - - // Iterate over each element of the chain - std::vector tmp ; - for (typename ChainType::const_iterator it = result.cbegin(); it != result.cend(); ++it) - { - int cell_index = it->first; - CoefficientType value = it->second; - - // Check the flag of the corresponding cell - if (_flag[dim][cell_index] != flag) { - // Set to 0 - tmp.push_back(cell_index) ; - - } - } - result /= tmp ; - return result; - } - - void progress_bar(int i, int n) - { - const int step(n/20) ; - if ((i%step)==0) - { - const float percentage(float(i)/(n-1)) ; - const char PBSTR[] = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" ; - const int PBWIDTH(60) ; - int val = (int) (percentage * 100); - int lpad = (int) (percentage * PBWIDTH); - int rpad = PBWIDTH - lpad; - printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); - fflush(stdout); - } - if (i==(n-1)) - std::cout << std::endl ; - } - -}; - -// Constructor for the Hdvf_core class -template typename ChainType, template typename SparseMatrixType> -Hdvf_core::Hdvf_core(const ComplexType& K, int hdvf_opt) : _K(K) { - // Get the dimension of the simplicial complex - int dim = _K.dim(); - std::cout << "----> Starting Hdvf_core creation / dim " << dim << std::endl ; - // Hdvf_core options - _hdvf_opt = hdvf_opt ; - - // Resize the _DD_col vector to hold dim+1 elements - _DD_col.resize(dim + 1); - - // Resize the _F_row vector to hold dim+1 elements - if (_hdvf_opt & (OPT_FULL | OPT_F)) - _F_row.resize(dim + 1); - - // Resize the _G_col vector to hold dim+1 elements - if (_hdvf_opt & (OPT_FULL | OPT_G)) - _G_col.resize(dim + 1); - - // Resize the _H_col vector to hold dim+1 elements - if (_hdvf_opt & OPT_FULL) - _H_col.resize(dim + 1); - - // Resize flag and count vectors to hold dim+1 elements - _flag.resize(dim + 1); - _nb_P.resize(dim + 1); - _nb_S.resize(dim + 1); - _nb_C.resize(dim + 1); - - // Initialize matrices and counters - - for (int q = 0; q <= dim; q++) { - // Initialize _F_row[q] as a row matrix with dimensions (dim(q) x dim(q)) - if (_hdvf_opt & (OPT_FULL | OPT_F)) - _F_row[q] = RMatrix(_K.nb_cells(q), _K.nb_cells(q)); - - // Initialize _G_col[q] as a column matrix with dimensions (dim(q) x dim(q)) - if (_hdvf_opt & (OPT_FULL | OPT_G)) - _G_col[q] = CMatrix(_K.nb_cells(q), _K.nb_cells(q)); - - // Initialize _H_col[q] as a column matrix with dimensions (dim(q+1) x dim(q)) - if (_hdvf_opt & OPT_FULL) - _H_col[q] = CMatrix(_K.nb_cells(q + 1), _K.nb_cells(q)); - - // Initialize the counters for PRIMARY, SECONDARY, and CRITICAL cells - _nb_P[q] = 0; - _nb_S[q] = 0; - _nb_C[q] = _K.nb_cells(q); - } - - // Initialize the flags for each dimension to CRITICAL - for (int q = 0; q <= dim; q++) { - _flag[q] = std::vector(_K.nb_cells(q), CRITICAL); - } - - // Populate the DD matrices - _DD_col.resize(_K.dim()+1) ; - for (int q=0; q<=_K.dim(); ++q) - _DD_col.at(q) = _K.get_bnd_matrix(q) ; - std::cout << "------> End Hdvf_core creation" << std::endl ; -} - -// Method to print the matrices -template typename ChainType, template typename SparseMatrixType> -std::ostream& Hdvf_core::print_matrices(std::ostream& out) const { - // Iterate through each dimension and print the corresponding matrices - for (int q = 0; q <= _K.dim(); ++q) { - out << "------- Dimension " << q << std::endl; - - out << "Matrices _DD_col:" << std::endl; - out << _DD_col[q] << std::endl; - - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - out << "Matrices _F_row:" << std::endl; - out << _F_row[q] << std::endl; - } - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - out << "Matrices _G_col:" << std::endl; - out << _G_col[q] << std::endl; - } - - if (_hdvf_opt & OPT_FULL) - { - out << "Matrices _H_col:" << std::endl; - out << _H_col[q] << std::endl; - } - } - return out ; -} - - -// Methods to find a pair of cells for A in dimension q -// -> = +- 1 with cell1, cell2 critical -// First version: returns a pair of dimensions q / q+1 -// Second version: returns all the pairs containing sigma - -/** \brief find a valid PairCell for A in dimension q */ -//template -template typename ChainType, template typename SparseMatrixType> -PairCell Hdvf_core::find_pair_A(int q, bool &found) const -{ - found = false; - PairCell p; - - // Iterate through columns of _DD_col[q+1] - for (OSM::Bitboard::iterator it_col = _DD_col[q+1].begin(); (it_col != _DD_col[q+1].end() && !found); ++it_col) - { - const CChain& col(OSM::cgetColumn(_DD_col[q+1], *it_col)) ; - - // Iterate through the entries of the column - for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { - if ((it->second == 1) || (it->second == -1)) { - // If an entry with coefficient 1 or -1 is found, set the pair and mark as found - p.sigma = it->first; - p.tau = *it_col; - p.dim = q; - found = true; - } - } - } - return p; -} - -/** \brief find a valid PairCell containing tau for A in dimension q */ -//template -template typename ChainType, template typename SparseMatrixType> -PairCell Hdvf_core::find_pair_A(int q, bool &found, int tau) const -{ - found = false; - PairCell p ; - - // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible - const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; - for (typename CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - p.sigma = it->first ; - p.tau = tau ; - p.dim = q-1 ; - } - } - - // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible - RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; - for (typename RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - p.sigma = tau ; - p.tau = it->first ; - p.dim = q ; - } - } - return p; -} - -/** \brief find all the valid PairCell for A in dimension q */ -//template -template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::find_pairs_A(int q, bool &found) const -{ - std::vector pairs; - found = false ; - - // Iterate through columns of _DD_col[q+1] - for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) - { - const CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; - - // Iterate through the entries of the column - for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { - if ((it->second == 1) || (it->second == -1)) { - // If an entry with coefficient 1 or -1 is found, set the pair and mark as found - PairCell p; - p.sigma = it->first; - p.tau = *it_col; - p.dim = q; - pairs.push_back(p) ; - found = true; - } - } - } - return pairs; -} - -/** \brief find all the valid PairCell containing tau for A in dimension q */ -//template -template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::find_pairs_A(int q, bool &found, int tau) const -{ - found = false; - std::vector pairs; - - // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible - RChain tmp(OSM::getRow(_DD_col.at(q+1), tau)) ; - for (typename RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - PairCell p ; - p.sigma = tau ; - p.tau = it->first ; - p.dim = q ; - pairs.push_back(p) ; - } - } - // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible - const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), tau)) ; - for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) - { - if (abs(it->second) == 1) - { - found = true ; - PairCell p ; - p.sigma = it->first ; - p.tau = tau ; - p.dim = q-1 ; - pairs.push_back(p) ; - } - } - return pairs; -} - -//// Methods to find a pair of cells for M in dimension q -//// -> = +- 1 with cell1 primary, cell2 critical -//// First version: returns a pair of dimensions q -//// Second version: returns all the pairs containing sigma -// -///** \brief find a valid PairCell for M in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//PairCell Hdvf_core::findPairM(int q, bool &found) // const -//{ -// found = false; -// PairCell p; -// -// if (_hdvf_opt & OPT_F) -// { -// // Search for +-1 in _F - iterate over rows -// for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); (it_row != _F_row[q].end() && !found); ++it_row) -// { -// const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); -// -// // Iterate through the entries of the row -// for (typename RChain::const_iterator it = row.begin(); (it != row.end() && !found); ++it) { -// if ((it->second == 1) || (it->second == -1)) { -// // If an entry with coefficient 1 or -1 is found, set the pair and mark as found -// p.sigma = it->first; // primary cell -// p.tau = *it_row; // critical cell -// p.dim = q; -// found = true; -// } -// } -// } -// } -// return p; -//} -// -///** \brief find a valid PairCell containing tau for M in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//PairCell Hdvf_core::findPairM(int q, bool &found, int tau) // const -//{ -// found = false; -// PairCell p; -// if (_flag.at(q).at(tau) == SECONDARY) -// return p ; // Empty / found false -// -// if (_hdvf_opt & OPT_F) -// { -// // If tau is primary, search for gamma such that =+-1 -// if (_flag.at(q).at(tau) == PRIMARY) -// { -// for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); (it_row != _F_row.at(q).end() && !found); ++it_row) -// { -// if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) -// { -// p.sigma = tau ; // primary cell -// p.tau = *it_row ; // critical cell -// p.dim = q ; -// found = true; -// } -// } -// } -// // If tau is critical, search for pi such that =+-1 -// if (_flag.at(q).at(tau) == CRITICAL) -// { -// const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; -// for (typename RChain::const_iterator it = row.cbegin(); (it != row.cend() && !found); ++it) -// { -// if (abs(it->second) == 1) -// { -// p.sigma = it->first ; // primary cell -// p.tau = tau ; // critical cell -// p.dim = q ; -// found = true; -// } -// } -// } -// } -// return p; -//} -// -///** \brief find all the valid PairCell for M in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//std::vector Hdvf_core::findPairsM(int q, bool &found) // const -//{ -// found = false; -// std::vector pairs; -// if (_hdvf_opt & OPT_F) -// { -// // Search for +-1 in _F - iterate over rows -// for (OSM::Bitboard::iterator it_row = _F_row[q].begin(); it_row != _F_row[q].end() ; ++it_row) -// { -// const RChain &row(OSM::cgetRow(_F_row[q],*it_row)); -// -// // Iterate through the entries of the row -// for (typename RChain::const_iterator it = row.begin(); it != row.end(); ++it) { -// if ((it->second == 1) || (it->second == -1)) { -// // If an entry with coefficient 1 or -1 is found, set the pair and add it -// PairCell p ; -// p.sigma = it->first; // primary cell -// p.tau = *it_row; // critical cell -// p.dim = q; -// pairs.push_back(p) ; -// } -// } -// } -// } -// found = !pairs.empty() ; -// return pairs; -//} -// -///** \brief find all the valid PairCell containing tau for M in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//std::vector Hdvf_core::findPairsM(int q, bool &found, int tau) // const -//{ -// found = false; -// std::vector pairs; -// if (_flag.at(q).at(tau) == SECONDARY) -// return pairs ; // Empty / found false -// -// if (_hdvf_opt & OPT_F) -// { -// // If tau is primary, search for gamma such that =+-1 -// if (_flag.at(q).at(tau) == PRIMARY) -// { -// for (OSM::Bitboard::iterator it_row = _F_row.at(q).begin(); it_row != _F_row.at(q).end(); ++it_row) -// { -// if (abs(_F_row.at(q).get_coef(*it_row,tau)) == 1) -// { -// PairCell p ; -// p.sigma = tau ; // primary cell -// p.tau = *it_row ; // critical cell -// p.dim = q ; -// pairs.push_back(p) ; -// } -// } -// } -// // If tau is critical, search for pi such that =+-1 -// if (_flag.at(q).at(tau) == CRITICAL) -// { -// const RChain& row(OSM::getRow(_F_row.at(q), tau)) ; -// for (typename RChain::const_iterator it = row.cbegin(); it != row.cend(); ++it) -// { -// if (abs(it->second) == 1) -// { -// PairCell p ; -// p.sigma = it->first ; // primary cell -// p.tau = tau ; // critical cell -// p.dim = q ; -// pairs.push_back(p) ; -// } -// } -// } -// } -// found = !pairs.empty() ; -// return pairs; -//} -// -//// Methods to find a pair of cells for W in dimension q -//// -> = +- 1 with cell1 secondary, cell2 critical -//// First version: returns a pair of dimensions q -//// Second version: returns all the pairs containing sigma -// -///** \brief find a valid PairCell for W in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//PairCell Hdvf_core::findPairW(int q, bool &found) // const -//{ -// found = false; -// PairCell p; -// -// if (_hdvf_opt & OPT_G) -// { -// // Search for +-1 in _G - iterate over cols -// for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); (it_col != _F_row[q].end() && !found); ++it_col) -// { -// CChain &col = _G_col[q][*it_col]; -// -// // Iterate through the entries of the col -// for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { -// if ((it->second == 1) || (it->second == -1)) { -// // If an entry with coefficient 1 or -1 is found, set the pair and mark as found -// p.sigma = it->first; // secondary cell -// p.tau = *it_col; // critical cell -// p.dim = q; -// found = true; -// } -// } -// } -// } -// return p; -//} -// -///** \brief find a valid PairCell containing tau for W in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//PairCell Hdvf_core::findPairW(int q, bool &found, int tau) // const -//{ -// found = false; -// PairCell p; -// if (_flag.at(q).at(tau) == PRIMARY) -// return p ; // Empty / found false -// -// if (_hdvf_opt & OPT_G) -// { -// // If tau is primary, search for gamma such that =+-1 -// if (_flag.at(q).at(tau) == SECONDARY) -// { -// for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); (it_col != _G_col.at(q).end() && !found); ++it_col) -// { -// if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) -// { -// p.sigma = tau ; // secondary cell -// p.tau = *it_col ; // critical cell -// p.dim = q ; -// found = true; -// } -// } -// } -// // If tau is critical, search for sigma such that =+-1 -// if (_flag.at(q).at(tau) == CRITICAL) -// { -// CChain col(OSM::getColumn(_G_col.at(q), tau)) ; -// for (typename CChain::const_iterator it = col.cbegin(); (it != col.cend() && !found); ++it) -// { -// if (abs(it->second) == 1) -// { -// p.sigma = it->first ; // secondary cell -// p.tau = tau ; // critical cell -// p.dim = q ; -// found = true; -// } -// } -// } -// } -// return p; -//} -// -///** \brief find all the valid PairCell for W in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//std::vector Hdvf_core::findPairsW(int q, bool &found) // const -//{ -// found = false; -// std::vector pairs; -// -// if (_hdvf_opt & OPT_FULL) -// { -// // Search for +-1 in _G - iterate over cols -// for (OSM::Bitboard::iterator it_col = _G_col[q].begin(); it_col != _F_row[q].end(); ++it_col) -// { -// CChain &col = _G_col[q][*it_col]; -// -// // Iterate through the entries of the col -// for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { -// if ((it->second == 1) || (it->second == -1)) { -// // If an entry with coefficient 1 or -1 is found, set the pair and mark as found -// PairCell p ; -// p.sigma = it->first; // secondary cell -// p.tau = *it_col; // critical cell -// p.dim = q; -// pairs.push_back(p) ; -// } -// } -// } -// } -// found = !pairs.empty() ; -// return pairs; -//} -// -///** \brief find all the valid PairCell containing tau for W in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//std::vector Hdvf_core::findPairsW(int q, bool &found, int tau) // const -//{ -// found = false; -// std::vector pairs; -// if (_flag.at(q).at(tau) == PRIMARY) -// return pairs ; // Empty / found false -// -// if (_hdvf_opt & OPT_FULL) -// { -// // If tau is primary, search for gamma such that =+-1 -// if (_flag.at(q).at(tau) == SECONDARY) -// { -// for (OSM::Bitboard::iterator it_col = _G_col.at(q).begin(); it_col != _G_col.at(q).end(); ++it_col) -// { -// if (abs(_G_col.at(q).get_coef(tau, *it_col)) == 1) -// { -// PairCell p ; -// p.sigma = tau ; // secondary cell -// p.tau = *it_col ; // critical cell -// p.dim = q ; -// pairs.push_back(p) ; -// } -// } -// } -// // If tau is critical, search for sigma such that =+-1 -// if (_flag.at(q).at(tau) == CRITICAL) -// { -// CChain col(OSM::getColumn(_G_col.at(q), tau)) ; -// for (typename CChain::const_iterator it = col.cbegin(); it != col.cend(); ++it) -// { -// if (abs(it->second) == 1) -// { -// PairCell p ; -// p.sigma = it->first ; // secondary cell -// p.tau = tau ; // critical cell -// p.dim = q ; -// pairs.push_back(p) ; -// } -// } -// } -// } -// found = !pairs.empty() ; -// return pairs; -//} -// -//// Method to find a pair of cells for MW in dimension q -//// -> = +- 1 and = +- 1 with cell1 primary, cell2 secondary -//// First version: returns a pair of dimensions q -//// Second version: returns all the pairs containing sigma -// -///** \brief find a valid PairCell for MW in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//PairCell Hdvf_core::findPairMW(int q, bool &found) // const -//{ -// found = false; -// PairCell p; -// -// if (_hdvf_opt & OPT_FULL) -// { -// // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero -// // iterate on H_q and H_q-1 accordingly -// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) -// { -// const int pi = *it_pi ; -// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; -// CChain d_pi = _K.d(pi, q) ; -// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; -// for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) -// { -// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; -// if (!H11q1.isNull()) -// { -// RChain cod_sigma = _K.cod(sigma, q) ; -// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; -// -// // Compute xi and xi' to test the validity of MW -// -// const int xi = projS_cod_sigma * H11 ; -// const int xip = H11q1 * projP_d_pi ; -// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; -// if (found) -// { -// p.sigma = pi ; // primary cell -// p.tau = sigma ; // secondary cell -// p.dim = q ; -// } -// } -// } -// } -// } -// return p; -//} -// -///** \brief find a valid PairCell containing tau for MW in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//PairCell Hdvf_core::findPairMW(int q, bool &found, int tau) // const -//{ -// found = false; -// PairCell p; -// -// if (_flag.at(q).at(tau) == CRITICAL) -// return p ; // Empty / found false -// -// if (_hdvf_opt & OPT_FULL) -// { -// // If tau is primary (rename pi), search for a valid sigma -// if (_flag.at(q).at(tau) == PRIMARY) -// { -// const int pi(tau) ; -// // Col pi of H_q and proj_P(d(pi)) must at least be non empty -// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; -// CChain d_pi = _K.d(pi, q) ; -// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; -// -// if (H11.isNull() || projP_d_pi.isNull()) -// return p ; -// -// // Search for sigma with col_sigma(H_q-1) non empty -// for (int sigma = 0; (sigma < _H_col.at(q-1).dimensions().first && !found); ++sigma) -// { -// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; -// if (!H11q1.isNull()) -// { -// // and proj_S(cod(sigma)) non empty -// RChain cod_sigma = _K.cod(sigma, q) ; -// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; -// if (!projS_cod_sigma.isNull()) -// { -// // test xi and xip -// const int xi = projS_cod_sigma * H11 ; -// const int xip = H11q1 * projP_d_pi ; -// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; -// if (found) -// { -// p.sigma = pi ; // primary cell -// p.tau = sigma ; // critical cell -// p.dim = q ; -// } -// } -// } -// } -// } -// else // cell is secondary -// { -// // cout << "secondary" << endl ; -// const int sigma(tau) ; -// // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty -// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; -// RChain cod_sigma = _K.cod(sigma, q) ; -// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; -// if (H11q1.isNull() || projS_cod_sigma.isNull()) -// return p ; -// -// // Search for pi with col pi of H_q non empty -// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); (it_pi != _H_col[q].end() && !found); ++it_pi) -// { -// const int pi(*it_pi) ; -// -// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; -// CChain d_pi = _K.d(pi, q) ; -// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; -// // proj_P of d(pi) must also be non empty -// if (!projP_d_pi.isNull()) -// { -// // test xi and xip -// const int xi = projS_cod_sigma * H11 ; -// const int xip = H11q1 * projP_d_pi ; -// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; -// if (found) -// { -// p.sigma = pi ; // primary cell -// p.tau = sigma ; // secondary cell -// p.dim = q ; -// } -// } -// } -// } -// } -// return p; -//} -// -///** \brief find all the valid PairCell for MW in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//std::vector Hdvf_core::findPairsMW(int q, bool &found) // const -//{ -// found = false; -// std::vector pairs; -// -// if (_hdvf_opt & OPT_FULL) -// { -// // pi and sigma must at least satisfy that col pi of H_q and row sigma of H_q-1 are non zero -// // iterate on H_q and H_q-1 accordingly -// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) -// { -// const int pi = *it_pi ; -// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; -// CChain d_pi = _K.d(pi, q) ; -// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; -// for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) -// { -// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; -// if (!H11q1.isNull()) -// { -// RChain cod_sigma = _K.cod(sigma, q) ; -// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; -// -// // Compute xi and xi' to test the validity of MW -// -// const int xi = projS_cod_sigma * H11 ; -// const int xip = H11q1 * projP_d_pi ; -// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; -// if (found) -// { -// PairCell p; -// p.sigma = pi ; // primary cell -// p.tau = sigma ; // secondary cell -// p.dim = q ; -// pairs.push_back(p) ; -// } -// } -// } -// } -// } -// found = !pairs.empty() ; -// return pairs; -//} -// -///** \brief find all the valid PairCell containing tau for MW in dimension q */ -////template -//template typename ChainType, template typename SparseMatrixType> -//std::vector Hdvf_core::findPairsMW(int q, bool &found, int tau) // const -//{ -// found = false; -// std::vector pairs; -// if (_flag.at(q).at(tau) == CRITICAL) -// return pairs ; // Empty / found false -// -// if (_hdvf_opt & OPT_FULL) -// { -// // If tau is primary (rename pi), search for a valid sigma -// if (_flag.at(q).at(tau) == PRIMARY) -// { -// const int pi(tau) ; -// // Col pi of H_q and proj_P(d(pi)) must at least be non empty -// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; -// CChain d_pi = _K.d(pi, q) ; -// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; -// -// if (H11.isNull() || projP_d_pi.isNull()) -// return pairs ; -// -// // Search for sigma with col_sigma(H_q-1) non empty -// for (int sigma = 0; sigma < _H_col.at(q-1).dimensions().first; ++sigma) -// { -// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; -// if (!H11q1.isNull()) -// { -// // and proj_S(cod(sigma)) non empty -// RChain cod_sigma = _K.cod(sigma, q) ; -// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; -// if (!projS_cod_sigma.isNull()) -// { -// // test xi and xip -// const CoefficientType xi = projS_cod_sigma * H11 ; -// const CoefficientType xip = H11q1 * projP_d_pi ; -// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; -// if (found) -// { -// PairCell p ; -// p.sigma = pi ; // primary cell -// p.tau = sigma ; // critical cell -// p.dim = q ; -// pairs.push_back(p) ; -// } -// } -// } -// } -// } -// else // cell is secondary -// { -// // cout << "secondary" << endl ; -// const int sigma(tau) ; -// // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty -// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; -// RChain cod_sigma = _K.cod(sigma, q) ; -// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; -// if (H11q1.isNull() || projS_cod_sigma.isNull()) -// return pairs ; -// -// // Search for pi with col pi of H_q non empty -// for (OSM::Bitboard::iterator it_pi = _H_col[q].begin(); it_pi != _H_col[q].end(); ++it_pi) -// { -// const int pi(*it_pi) ; -// -// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; -// CChain d_pi = _K.d(pi, q) ; -// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; -// // proj_P of d(pi) must also be non empty -// if (!projP_d_pi.isNull()) -// { -// // test xi and xip -// const CoefficientType xi = projS_cod_sigma * H11 ; -// const CoefficientType xip = H11q1 * projP_d_pi ; -// found = ((abs(xi) == 1) && (abs(xip) == 1)) ; -// if (found) -// { -// PairCell p ; -// p.sigma = pi ; // primary cell -// p.tau = sigma ; // secondary cell -// p.dim = q ; -// pairs.push_back(p) ; -// } -// } -// } -// } -// } -// found = !pairs.empty() ; -// return pairs; -//} - - -// Method to perform operation A -// tau1 is in dimension q, tau2 is in dimension q+1 -//template -template typename ChainType, template typename SparseMatrixType> -void Hdvf_core::A(int tau1, int tau2, int q) { - //----------------------------------------------- Submatrices of D ---------------------------------------------------- - - // Output operation details to the console - // cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; - - // Extract submatrices from _DD_col - RChain D12(OSM::getRow(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 - CChain D21(OSM::getColumn(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 - CoefficientType D11(D12[tau2]); // D11 is the coefficient at the intersection of tau2 in D12 - - // Assert that D11 is either 1 or -1 (check invertibility) - assert((D11 == 1) || (D11 == -1)); // !!!!! Test invertibility - - // Compute the inverse of D11 (which is itself, since D11 is 1 or -1) - CoefficientType D11_inv = D11; - - // Perform operations to remove the row and column contributions - D12 /= std::vector({tau2}); // Remove tau2 column from D12 - D21 /= std::vector({tau1}); // Remove tau1 row from D21 - - // Delete rows and columns from _DD_col - _DD_col[q + 1].delRow(tau1); // Remove row tau1 from _DD_col[q+1] - _DD_col[q + 1].delColumn(tau2); // Remove column tau2 from _DD_col[q+1] - - //---------------------------------------------- Submatrices of F ----------------------------------------------------- - - RChain F11 ; - CChain G11 ; - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - // Extract the relevant submatrix from _F_row - F11 = OSM::getRow(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 - - // Delete the row tau1 from _F_row - _F_row[q].delRow(tau1); - } - - //--------------------------------------------- Submatrices of G ------------------------------------------------------ - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - // Extract the relevant submatrix from _G_col - G11 = OSM::getColumn(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 - - // Delete the column tau2 from _G_col - _G_col[q + 1].delColumn(tau2); - } - - //--------------------------------------------- Update matrices ------------------------------------------------------- - - // ---- Update _F_row - - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - // Update _F_row[q] - // Subtract the product of (D21 * D11_inv) and F11 from _F_row[q] - // Note: % operator returns a row matrix, so be careful with operations - _F_row[q] -= (D21 * D11_inv) % F11; - - // Set the column tau1 of _F_row[q] to (D21 * (-D11_inv)) - OSM::setColumn(_F_row[q], tau1, D21 * (-D11_inv)); - - // Remove the row tau2 from _F_row[q+1] - _F_row[q + 1].delRow(tau2); - } - - // ---- Update _G_col - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - // Update _G_col[q + 1] - // Subtract the product of (G11 * D11_inv) and D12 from _G_col[q+1] - _G_col[q + 1] -= (G11 * D11_inv) * D12; - - // Set the row tau2 of _G_col[q + 1] to (D12 * (-D11_inv)) - OSM::setRow(_G_col[q + 1], tau2, D12 * (-D11_inv)); - - // Remove the column tau1 from _G_col[q] - _G_col[q].delColumn(tau1); - } - - // ---- Update _H_col - - if (_hdvf_opt & OPT_FULL) - { - // Update _H_col[q] - // Compute the temporary matrix product G11 * F11 - CMatrix tmp = G11 * F11; - - // Add the product of tmp and D11_inv to _H_col[q] - _H_col[q] += (tmp) * D11_inv; - - // Set the row tau2 of _H_col[q] to (F11 * D11_inv) - OSM::setRow(_H_col[q], tau2, F11 * D11_inv); - - // Set the column tau1 of _H_col[q] to (G11 * D11_inv) - OSM::setColumn(_H_col[q], tau1, G11 * D11_inv); - - // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv - _H_col[q].set_coef(tau2, tau1, D11_inv); - } - - // ---- Update _DD_col - - // Update _DD_col - _DD_col[q + 1] -= (D21 * D12) * D11_inv; - - // Remove columns and rows from _DD_col as necessary - if (q > 0) { - _DD_col[q].delColumn(tau1); // Remove column tau1 from _DD_col[q] - } - if (q + 2 <= _K.dim()) { - _DD_col[q + 2].delRow(tau2); // Remove row tau2 from _DD_col[q+2] - } - - // Update flags - _flag[q][tau1] = PRIMARY; // Set the flag of tau1 in dimension q to PRIMARY - --_nb_C.at(q) ; - ++_nb_P.at(q) ; - _flag[q + 1][tau2] = SECONDARY; // Set the flag of tau2 in dimension q+1 to SECONDARY - --_nb_C.at(q+1) ; - ++_nb_S.at(q+1) ; - - // ----------------------------------------------------------------------------------------------------------------------- -} - -//// Method to perform operation R -//// pi is in dimension q, sigma is in dimension q+1 -////template -//template typename ChainType, template typename SparseMatrixType> -//void Hdvf_core::R(int pi, int sigma, int q) { -// //----------------------------------------------- Submatrices of H ---------------------------------------------------- -// -// if (_hdvf_opt & OPT_FULL) -// { -// // Output operation details to the console -// std::cout << "R of " << pi << "(dim " << q << ") / " << sigma << "(dim " << q + 1 << ")" << std::endl; -// -// // Extract the relevant row and column chains from _H_col -// RChain H12 = OSM::getRow(_H_col[q], sigma); // H12 is the row chain from _H_col[q] at index sigma -// CChain H21 = OSM::getColumn(_H_col[q], pi); // H21 is the column chain from _H_col[q] at index pi -// -// // Get the coefficient at the intersection of H12 and H21 -// CoefficientType H11(H12[pi]); // H11 is the coefficient at row sigma and column pi -// -// // Assert that H11 is either 1 or -1 (check invertibility) -// assert((H11 == 1) || (H11 == -1)); // !!!!! Test invertibility -// CoefficientType H11_inv = H11; // Inverse of H11 (which is itself for 1 or -1) -// -// // Remove the contributions of pi from H12 and sigma from H21 -// H12 /= std::vector({pi}); // Remove column pi from H12 -// H21 /= std::vector({sigma}); // Remove row sigma from H21 -// -// // Remove the corresponding row and column from _H_col -// _H_col[q].delRow(sigma); // Remove row sigma from _H_col[q] -// _H_col[q].delColumn(pi); // Remove column pi from _H_col[q] -// -// //---------------------------------------------- Submatrices of F ----------------------------------------------------- -// -// // Extract the relevant column chain from _F_row -// CChain F11 = OSM::getColumn(_F_row[q], pi); // F11 is the column chain from _F_row[q] at index pi -// -// // Remove the column pi from _F_row -// _F_row[q].delColumn(pi); -// -// //--------------------------------------------- Submatrices of G ------------------------------------------------------ -// -// // Extract the relevant row chain from _G_col -// RChain G11 = OSM::getRow(_G_col[q + 1], sigma); // G11 is the row chain from _G_col[q+1] at index sigma -// -// // Remove the row sigma from _G_col -// _G_col[q + 1].delRow(sigma); -// -// //--------------------------------------------- Update matrices ------------------------------------------------------- -// -// // Update _F_row[q] -// // Subtract the product of (H12 * F11) and H11 from _F_row[q] -// // Note: % operator returns a row matrix, so be careful with operations -// _F_row[q] -= (F11 % H12) * H11_inv; -// -// // Set the row pi of _F_row[q] to (H12 * (-H11_inv)) -// OSM::setRow(_F_row[q], pi, H12 * (-H11_inv)); -// -// // Update _G_col[q + 1] -// // Subtract the product of (H21 * G11) and H11_inv from _G_col[q + 1] -// _G_col[q + 1] -= (H21 * G11) * H11_inv; -// -// // Set the column sigma of _G_col[q + 1] to (H21 * (-H11_inv)) -// OSM::setColumn(_G_col[q + 1], sigma, H21 * (-H11_inv)); -// -// // Update _DD_col -// // Compute the temporary matrix product F11 * G11 -// _DD_col[q + 1] += (F11 * G11) * H11_inv; -// -// // Set the row pi in _DD_col[q + 1] to (G11 * H11_inv) -// OSM::setRow(_DD_col[q + 1], pi, G11 * H11_inv); -// -// // Set the column sigma in _DD_col[q + 1] to (F11 * H11_inv) -// OSM::setColumn(_DD_col[q + 1], sigma, F11 * H11_inv); -// -// // Set the coefficient at (pi, sigma) in _DD_col to H11_inv -// _DD_col[q + 1].set_coef(pi, sigma, H11_inv); -// -// // Update _H_col[q] -// // Subtract the product of (H21 * H12) and H11_inv from _H_col[q] -// _H_col[q] -= (H21 * H12) * H11_inv; -// -// // Perform additional updates -// -// // Extract boundary and coboundary chains -// CChain bnd_pi(_K.d(pi, q)); // Boundary of pi in dimension q -// RChain cobnd_sigma(_K.cod(sigma, q + 1)); // Coboundary of sigma in dimension q+1 -// -// // Project the boundary and coboundary chains onto PRIMARY and SECONDARY flags -// CChain proj_P_pi(projection(bnd_pi, PRIMARY, q)); -// RChain proj_S_sigma(projection(cobnd_sigma, SECONDARY, q + 1)); -// -// if (q > 0) { -// // Update _DD_col[q] with projections and _F_row[q-1] -// CChain c1(_F_row[q - 1] * proj_P_pi + projection(bnd_pi, CRITICAL, q)); -// OSM::setColumn(_DD_col[q], pi, c1); -// OSM::setColumn(_G_col[q], pi, _H_col[q - 1] * proj_P_pi); -// } -// -// // Update _F_row[q+1] with projection and _H_col[q+1] -// OSM::setRow(_F_row[q + 1], sigma, proj_S_sigma * _H_col[q + 1]); -// -// if (q + 2 <= _K.dim()) { -// // Update _DD_col[q+2] with projections -// RChain c4(projection(cobnd_sigma, CRITICAL, q + 1) + proj_S_sigma * _G_col[q + 2]); -// OSM::setRow(_DD_col[q + 2], sigma, c4); -// } -// -// // Update flags -// _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to CRITICAL -// ++_nb_C.at(q) ; -// --_nb_P.at(q) ; -// _flag[q + 1][sigma] = CRITICAL; // Set the flag of sigma in dimension q+1 to CRITICAL -// ++_nb_C.at(q+1) ; -// --_nb_S.at(q+1) ; -// } -// else -// std::cout << "!!! R impossible with partial reduction options" << std::endl; -//} -// -//// Method to perform operation M -//// pi is in dimension q, gamma is in dimension q -////template -//template typename ChainType, template typename SparseMatrixType> -//void Hdvf_core::M(int pi, int gamma, int q) { -// //----------------------------------------------- Submatrices of F ---------------------------------------------------- -// -// if (_hdvf_opt & OPT_FULL) -// { -// // Output the operation details to the console -// std::cout << "M_" << q << "(" << pi << "," << gamma << ")" << std::endl; -// -// if (q == _K.dim()) -// throw("M operation in max dimension !!!") ; -// -// // Extract row and column chains from _F_row -// RChain F12(OSM::getRow(_F_row[q], gamma)); // F12 is the row chain from _F_row[q] at index gamma -// CChain F21(OSM::getColumn(_F_row[q], pi)); // F21 is the column chain from _F_row[q] at index pi -// -// // Get the coefficient at the intersection of F12 and F21 -// CoefficientType F11(F12[pi]); // F11 is the coefficient at row gamma and column pi -// -// // Assert that F11 is either 1 or -1 (for invertibility) -// assert((F11 == 1) || (F11 == -1)); // !!!!! Test invertibility -// CoefficientType F11_inv = F11; // Inverse of F11 (which is itself for 1 or -1) -// -// // Remove the contributions of pi from F12 and gamma from F21 -// F12 /= std::vector({pi}); // Remove column pi from F12 -// F21 /= std::vector({gamma}); // Remove row gamma from F21 -// -// // Remove the corresponding row and column from _F_row -// _F_row[q].delRow(gamma); // Remove row gamma from _F_row[q] -// _F_row[q].delColumn(pi); // Remove column pi from _F_row[q] -// -// //--------------------------------------------- Submatrices of G ------------------------------------------------------ -// -// // Extract the relevant column chain from _G_col -// // G11_q is the column chain from _G_col[q] at index gamma -// // CChain G11_q(OSM::getColumn(_G_col[q], gamma)); -// _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] -// -// //---------------------------------------------- Submatrices of H ----------------------------------------------------- -// -// // Extract the relevant column chain from _H_col -// CChain H11(OSM::getColumn(_H_col[q], pi)); // H11 is the column chain from _H_col[q] at index pi -// -// // Remove the column pi from _H_col -// _H_col[q].delColumn(pi); -// -// //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ -// -// // For DD_q+1 and DD_q: -// // Extract the relevant row chains from _DD_col -// -// // DD_q+1 (corresponds to the row matrix of _DD_col) -// RChain D11(OSM::getRow(_DD_col[q+1], gamma)); // D11 is the row chain from _DD_col[q+1] at index gamma -// _DD_col[q + 1].delRow(gamma); // Remove row gamma from _DD_col[q + 1] -// -// //--------------------------------------------- Submatrices of DD ------------------------------------------------------ -// -// // DD_q (corresponds to the column matrix of _DD_col) -// // CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); -// // D11_q is the column chain from _DD_col[q] at index gamma -// if (q > 0) -// _DD_col[q].delColumn(gamma); // Remove column gamma from _DD_col[q] -// -// //--------------------------------------------- Update matrices ------------------------------------------------------- -// -// // Update _H_col -// // Subtract the product of (H11 * F11_inv) and F12 from _H_col[q] -// // Note: * operator is used for matrix column results -// _H_col[q] -= (H11 * F11_inv) * F12; -// -// // Set the column gamma of _H_col[q] to (-1 * H11) * F11_inv -// OSM::setColumn(_H_col[q], gamma, (-1 * H11) * (F11_inv)); -// -// // Update _F_row -// // Add the product of (F21 * F11_inv) and F12 to _F_row[q] -// _F_row[q] -= (F21 * F11_inv) * F12; -// -// // Set the row pi of _F_row[q] to F11_inv * F12 -// OSM::setRow(_F_row[q], pi, F11_inv * F12); -// -// // Set the column gamma of _F_row[q] to F21 * (-F11_inv) -// OSM::setColumn(_F_row[q], gamma, F21 * (-F11_inv)); -// -// // Set the coefficient at (pi, gamma) in _F_row[q] to F11_inv -// _F_row[q].set_coef(pi, gamma, F11_inv); -// -// // Update _G_col -// // Add the product of (H11 * F11_inv) and D11 to _G_col[q+1] -// _G_col[q + 1] += (H11 * F11_inv) * D11; -// -// // Update _DD_col[q + 1] -// _DD_col[q + 1] -= (F21 * F11_inv) * D11; // Subtract the product from _DD_col[q + 1] -// OSM::setRow(_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in _DD_col[q + 1] -// -// // Update _G_col (for dimension q) and _DD_col (for dimension q) -// if (q>0) -// { -// // Extract boundary chain and project it -// CChain c = _K.d(pi, q); // Boundary of pi in dimension q -// CChain projection_p(projection(c, PRIMARY, q-1)); // Project boundary chain to PRIMARY -// CChain projection_c = projection(c, CRITICAL, q-1); // Project boundary chain to CRITICAL -// -// // Set the column pi of _G_col[q] to (-1 * _H_col[q-1]) * projection_p -// OSM::setColumn(_G_col[q], pi, (CoefficientType(-1) * _H_col[q - 1]) * projection_p); -// -// // Update _DD_col -// // Extract projections and perform updates -// CChain tmp(_F_row[q - 1] * projection_p + projection_c); // Compute the product of _F_row[q - 1] and projection_p -// // Set the column pi of _DD_col[q] to cc -// OSM::setColumn(_DD_col[q], pi, tmp); -// } -// // else: if the dimension is 0, no change for _G_col[q] and _DD_col[q] -// -// // Update flags -// _flag[q][pi] = CRITICAL; // Set the flag of pi in dimension q to PRIMARY -// _flag[q][gamma] = PRIMARY; // Set the flag of gamma in dimension q to CRITICAL -// } -// else -// std::cout << "!!! M impossible with partial reduction options" << std::endl; -//} -// -//// Method to perform operation W -//// gamma is in dimension q, sigma is in dimension q -// -//template typename ChainType, template typename SparseMatrixType> -//void Hdvf_core::W(int sigma, int gamma, int q) { -// -// //----------------------------------------------- Submatrices of G ---------------------------------------------------- -// -// if (_hdvf_opt & OPT_FULL) -// { -// // Output the operation details to the console -// std::cout << "W_" << q << "(" << sigma << "," << gamma << ")" << std::endl; -// -// if (q == 0) -// throw("W operation in dimension 0 !!!") ; -// -// // Extract row and column chains from _G_col -// RChain G12(OSM::getRow(_G_col[q], sigma)); // G12 is the row chain from _G_col[q] at index sigma -// CChain G21(OSM::getColumn(_G_col[q], gamma)); // G21 is the column chain from _G_col[q] at index gamma -// -// // Get the coefficient at the intersection of G12 and G21 -// CoefficientType G11(G12[gamma]); // G11 is the coefficient at row sigma and column gamma -// -// // Assert that G11 is either 1 or -1 (for invertibility) -// assert((G11 == 1) || (G11 == -1)); // !!!!! Test invertibility -// CoefficientType G11_inv = G11; // Inverse of G11 (which is itself for 1 or -1) -// -// // Remove the contributions of gamma from G12 and sigma from G21 -// G12 /= std::vector({gamma}); // Remove column gamma from G12 -// G21 /= std::vector({sigma}); // Remove row sigma from G21 -// -// // Remove the corresponding row and column from _G_col -// _G_col[q].delRow(sigma); // Remove row sigma from _G_col[q] -// _G_col[q].delColumn(gamma); // Remove column gamma from _G_col[q] -// -// //---------------------------------------------- Submatrices of F ----------------------------------------------------- -// -// // Extract the row chain from _F_row -// // RChain F11(OSM::getRow(_F_row[q], gamma)); // F11 is the row chain from _F_row[q] at index gamma -// -// // Remove the row gamma from _F_row -// _F_row[q].delRow(gamma); -// -// //--------------------------------------------- Submatrices of H ------------------------------------------------------ -// -// // Extract the row chain from _H_col -// RChain H11(OSM::getRow(_H_col[q-1], sigma)); // H11 is the row chain from _H_col[q] at index sigma -// -// // Remove the row sigma from _H_col -// _H_col[q-1].delRow(sigma); -// -// //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ -// -// // Extract the row chain from _DD_col[q+1] -// // RChain D11_q_plus1(OSM::getRow(_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from _DD_col[q + 1] at index gamma -// -// // Remove the row gamma from _DD_col -// if (q < _K.dim()) -// _DD_col[q + 1].delRow(gamma); -// -// //--------------------------------------------- Submatrices of DD_q ------------------------------------------------------ -// -// // Extract the column chain from _DD_col[q] -// CChain D11_q(OSM::getColumn(_DD_col[q], gamma)); // D11_q is the column chain from _DD_col[q] at index gamma -// -// // Remove the column gamma from _DD_col -// _DD_col[q].delColumn(gamma); -// -// //--------------------------------------------- Update matrices ------------------------------------------------------- -// -// // Update _H_col -// // Subtract the product of (G21 * G11_inv) and H11 from _H_col[q] -// // Note: % operator is used for matrix row results -// _H_col[q-1] -= (G21 * G11_inv) * H11; -// -// // Set the row gamma of _H_col[q] to (-1 * H11) * G11_inv -// OSM::setRow(_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); -// -// // Update _G_col -// // Subtract the product of G11_inv and (G21 * G12) from _G_col[q] -// _G_col[q] -= (G21 * G11_inv) * G12; -// -// // Set the row gamma of _G_col[q] to G11_inv * G12 -// OSM::setRow(_G_col[q], gamma, -G11_inv * G12); -// -// // Set the column sigma of _G_col[q] to G11_inv * G21 -// OSM::setColumn(_G_col[q], sigma, G21 * G11_inv); -// -// // Set the coefficient at (gamma, sigma) in _G_col[q] to G11_inv -// _G_col[q].set_coef(gamma, sigma, G11_inv); -// -// // Update _F_row (for dimension q-1) -// // Add the product of (D11_q * G11_inv) and H11 to _F_row[q - 1] -// _F_row[q - 1] += (D11_q * G11_inv) * H11; -// -// // Update _DD_col (for dimension q) -// _DD_col[q] -= (D11_q * G11_inv) * G12;// Subtract the product of (D11_q * G11_inv) and G12 -// OSM::setColumn(_DD_col[q], sigma, D11_q * G11_inv) ; -// -// // Update _F_row (for dimension q) and _DD_col (for dimension q+1) -// if (q < _K.dim()) -// { -// // Extract boundary chain and project it -// RChain c = _K.cod(sigma, q); // Boundary of sigma in dimension q -// RChain projection_s(projection(c, SECONDARY, q+1)); // Project boundary chain to SECONDARY -// RChain projection_c(projection(c, CRITICAL, q+1)); // Project boundary chain to SECONDARY -// -// // Set the row sigma of _F_row[q] to (-1 * projection_s * _H_col[q]) -// OSM::setRow(_F_row[q], sigma, (-1 * projection_s) * _H_col[q]); -// -// // Set the row sigma of _DD_col[q + 1] to projection_s * _G_col[q + 1] + projection_c -// -// RChain tmp(projection_s * _G_col[q + 1] + projection_c) ; -// OSM::setRow(_DD_col[q + 1], sigma, tmp); -// } -// // else : if the dimension is maximal, no update of _DD_col[q+1] and _F_row[q] -// -// // Update flags -// _flag[q][gamma] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY -// _flag[q][sigma] = CRITICAL; // Set the flag of sigma in dimension q to CRITICAL -// } -// else -// std::cout << "!!! W impossible with partial reduction options" << std::endl; -//} -// -//// Method to perform operation MW -//// gamma is in dimension q, sigma is in dimension q -// -//template typename ChainType, template typename SparseMatrixType> -//void Hdvf_core::MW(int pi, int sigma, int q) { -// -// //----------------------------------------------- Submatrices of G ---------------------------------------------------- -// -// if (_hdvf_opt & OPT_FULL) -// { -// // Output the operation details to the console -// std::cout << "MW_" << q << "(" << pi << "," << sigma << ")" << std::endl; -// -// if (q <= 0) -// throw("MW operation in dimension 0 !!!") ; -// if (q >= _K.dim()) -// throw("MW operation in maximal dimension !!!") ; -// -// // In order to compute xi and xi', extract sub-matrices of H_q, H_q-1 and compute d(pi) and cod(sigma) -// -// // H_q extractions -// -// CChain H11(OSM::getColumn(_H_col.at(q), pi)) ; -// // H21 -> delete H11 -// _H_col.at(q) /= std::vector({pi}) ; -// -// // H_q-1 extractions -// -// RChain H11q1(OSM::getRow(_H_col.at(q-1), sigma)) ; -// // H21_q-1 -> delete H11q1 -// _H_col.at(q-1).delRow(sigma) ; -// -// // d(pi) -// -// CChain d_pi = _K.d(pi, q) ; -// CChain projP_d_pi = projection(d_pi, PRIMARY, q-1) ; -// CChain projC_d_pi = projection(d_pi, CRITICAL, q-1) ; -// -// // cod(sigma) -// -// RChain cod_sigma = _K.cod(sigma, q) ; -// RChain projS_cod_sigma = projection(cod_sigma, SECONDARY, q+1) ; -// RChain projC_cod_sigma = projection(cod_sigma, CRITICAL, q+1) ; -// -// // Compute xi and xi' to test the validity of MW -// -// CoefficientType xi = projS_cod_sigma * H11 ; -// CoefficientType xip = H11q1 * projP_d_pi ; -// -// if (abs(xi) != 1) -// throw "MW impossible, xi non invertible" ; -// if (abs(xip) != 1) -// throw "MW impossible, xi' non invertible" ; -// -// // F_q extraction -// -// CChain F11(OSM::getColumn(_F_row.at(q), pi)) ; -// // F12 -> delete col F11 -// _F_row.at(q).delColumn(pi) ; -// -// // G_q extractions -// -// RChain G11(OSM::getRow(_G_col.at(q), sigma)) ; -// // G21 -> dele row G11 -// _G_col.at(q).delRow(sigma) ; -// -// // ----------- Update of the reduction -// -// // H_q -// -// RChain tmp1 = projS_cod_sigma * _H_col.at(q) ; -// -// _H_col.at(q) -= (H11 * xi) * tmp1 ; -// OSM::setColumn(_H_col.at(q), sigma, H11 * xi) ; -// -// // F_q -// -// _F_row.at(q) += (F11 * xi) * tmp1 ; -// OSM::setColumn(_F_row.at(q), sigma, F11 * (-xi)) ; -// -// // G_q+1 // note: G_q+1 is not be modified if the Hdvf_core is perfect -// -// RChain tmp2(projS_cod_sigma * _G_col.at(q+1)) ; -// tmp2 += projC_cod_sigma ; -// _G_col.at(q+1) -= (H11 * xi) * tmp2 ; -// -// // DD_col_q+1 / DD_row_q -// -// _DD_col.at(q+1) -= (F11 * xi) * tmp2 ; -// -// // H_q-1 -// -// CChain tmp3(_H_col.at(q-1) * projP_d_pi) ; -// -// _H_col.at(q-1) -= (tmp3 * xip) * H11q1 ; -// OSM::setRow(_H_col.at(q-1), pi, xip * H11q1) ; -// -// // G_q -// -// _G_col.at(q) -= (tmp3 * xip) * G11 ; -// OSM::setRow(_G_col.at(q), pi, xip * G11) ; -// -// // F_q-1 // note: F_q-1 is not be modified if the Hdvf_core is perfect -// -// CChain tmp4(_F_row.at(q-1) * projP_d_pi) ; -// tmp4 += projC_d_pi ; -// _F_row.at(q-1) -= (tmp4 * xip) * H11q1 ; -// -// // DD_col_q -// -// _DD_col.at(q) += (tmp4 * xip) * G11 ; -// -// // Update flags -// _flag[q][pi] = SECONDARY; // Set the flag of gamma in dimension q to SECONDARY -// _flag[q][sigma] = PRIMARY; // Set the flag of sigma in dimension q to CRITICAL -// } -// else -// std::cout << "!!! MW impossible with partial reduction options" << std::endl; -//} - - -// Method to compute a perfect Hdvf_core (Higher Dimensional Vector Field) -// Returns a vector of PairCell objects representing the pairs found - -template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::compute_perfect_hdvf(bool verbose) { - std::vector pair_list; // Vector to store the list of pairs - bool trouve = false; // Flag to indicate whether a pair was found - int dim = _K.dim(); // Get the dimension of the complex K - - // Loop through dimensions from q-1 to 0 - for (int q = dim - 1; q >= 0; --q) { - std::cout << std::endl << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; - // cout << _K.nb_cells(q) << " cells of dimension " << q << endl ; - // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) - - // Find a pair of cells in dimension q - PairCell pair = find_pair_A(q, trouve); - - // While a pair is found - while (trouve) { - progress_bar(_K.nb_cells(q)-_nb_C.at(q), _K.nb_cells(q)) ; - // Add the found pair to the list - pair_list.push_back(pair); - - // Perform operation A with the found pair - A(pair.sigma, pair.tau, q); - if (verbose) - { - std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; - print_matrices(std::cout) ; - } - - // Find another pair of cells in dimension q - pair = find_pair_A(q, trouve); - } - } - - // Return the list of pairs found - return pair_list; -} - -// Method to compute a random perfect Hdvf_core (Higher Dimensional Vector Field) -// Returns a vector of PairCell objects representing the pairs found - -template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::compute_rand_perfect_hdvf(bool verbose) { - std::vector pair_list; // Vector to store the list of pairs - bool trouve = false; // Flag to indicate whether a pair was found - int dim = _K.dim(); // Get the dimension of the complex K - - // Init random generator - std::random_device dev; - std::mt19937 rng(dev()); // Random - - // Loop through dimensions from q-1 to 0 - for (int q = dim - 1; q >= 0; --q) { - std::cout << "-> pairing cells of dimension " << q << " and " << q+1 << std::endl ; - // Incorrect: the number of cells is the number of cols in _DD_col ... (duality) - - std::vector pairs = find_pairs_A(q, trouve); - - PairCell pair ; - - // While a pair is found - while (trouve) - { - // Add one of the pairs (randomly) to the list - { - // Pickup a random cell sigma - std::uniform_int_distribution rand_dist(0,pairs.size()-1); - int i(rand_dist(rng)) ; - pair = pairs.at(i) ; - } - pair_list.push_back(pair); - - // Perform operation A with the chosen pair - A(pair.sigma, pair.tau, pair.dim); - if (verbose) - { - std::cout << "A : " << pair.sigma << " - " << pair.tau << " (dim " << pair.dim << ")" << std::endl ; - print_matrices(std::cout) ; - } - - // Compute possible pairings - pairs = find_pairs_A(q, trouve); - } - } - // Return the list of pairs found - return pair_list; -} - -// Method to get cells if with a given flag (P,S,C) for each dimension -//template -template typename ChainType, template typename SparseMatrixType> -std::vector > Hdvf_core::get_flag (FlagType flag) const -{ - std::vector > res(_K.dim()+1) ; - for (int q=0; q<=_K.dim(); ++q) - { - for (int i=0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == flag) - res.at(q).push_back(i) ; - } - } - return res ; -} - -// Method to get cells with a given flag (P,S,C) for a given dimension -//template -template typename ChainType, template typename SparseMatrixType> -std::vector Hdvf_core::get_flag_dim (FlagType flag, int q) const -{ - std::vector res ; - for (int i=0; i<_K.nb_cells(q); ++i) - { - if (_flag.at(q).at(i) == flag) - res.push_back(i) ; - } - return res ; -} - -// Method to print the current state of the reduction -//template -template typename ChainType, template typename SparseMatrixType> -std::ostream& Hdvf_core::print_reduction(std::ostream& out) const -{ - // Print PSC - out << "----- flags of cells:" << std::endl; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < _K.nb_cells(q); ++i) - { - const int flag(_flag.at(q).at(i)) ; - if (flag == PRIMARY) - out << i << " -> P" << std::endl ; - else if (flag == SECONDARY) - out << i << " -> S" << std::endl ; - else - out << i << " -> C" << std::endl ; - } - out << std::endl; - } - - // Print critical cells - out << "----- critical cells:" << std::endl; - std::vector > critical(get_flag(CRITICAL)) ; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < critical.at(q).size(); ++i) - { - out << critical.at(q).at(i) << " "; - } - out << std::endl; - } - - if (_hdvf_opt & (OPT_FULL | OPT_G)) - { - // Print matrices g - out << "----- g:" << std::endl; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < critical.at(q).size(); ++i) - { - const int id(critical.at(q).at(i)) ; - out << "g(" << id << ") = (" << id << ")"; - // Iterate over the ith column of _G_col - CChain col(OSM::getColumn(_G_col.at(q), id)) ; // TODO cget - for (typename CChain::const_iterator it_col = col.cbegin(); it_col != col.cend(); ++it_col) { - out << " + " << it_col->second << ".(" << it_col->first << ") + "; - } - out << std::endl; - } - } - } - - if (_hdvf_opt & (OPT_FULL | OPT_F)) - { - // Print matrices f* - out << "----- f*:" << std::endl; - for (int q = 0; q <= _K.dim(); ++q) { - out << "--- dim " << q << std::endl; - for (int i = 0; i < critical.at(q).size(); ++i) - { - const int id(critical.at(q).at(i)) ; - out << "f*(" << id << ") = (" << id << ")"; - // Iterate over the ith row of _F_row - RChain row(OSM::getRow(_F_row.at(q), id)) ; // TODO cget - for (typename RChain::const_iterator it_row = row.cbegin(); it_row != row.cend(); ++it_row) { - out << " + " << it_row->second << ".(" << it_row->first << ") + "; - } - out << std::endl; - } - } - } - return out ; -} - - - -} /* end namespace HDVF */ -} /* end namespace CGAL */ - -#endif // HDVF_CORE_HPP diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp index 1373a94c2c19..11e138855e4e 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -13,7 +13,7 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" -#include "CGAL/HDVF/hdvf_core.hpp" +#include "CGAL/HDVF/Hdvf_core.h" #include "CGAL/HDVF/sub_chain_complex.hpp" #include "CGAL/HDVF/SubSparseMatrix.hpp" @@ -250,7 +250,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain // Method to generate PSC labels for visualisation - virtual vector > export_labelsPSC () const + virtual vector > export_psc_labels () const { vector > labels(this->_K.dim()+1) ; for (int q=0; q<=this->_K.dim(); ++q) @@ -275,12 +275,12 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain // Method to export a G chain for visualisation // with cell indices in initial _K - virtual CChain export_GChain (int cell, int dim) const + virtual CChain export_homology_chain (int cell, int dim) const { if ((dim<0) || (dim>this->_K.dim())) - throw "Error : export_GChain with dim out of range" ; + throw "Error : export_homology_chain with dim out of range" ; // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) - // throw "Error : export_GChain with 'future' cell wrt persistence" ; + // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; if (this->_hdvf_opt & (OPT_FULL | OPT_G)) { @@ -306,12 +306,12 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain // Method to export a FSTAR chain for visualisation // with cell indices in initial _K - virtual CChain export_FSTARChain (int cell, int dim) const + virtual CChain export_cohomology_chain (int cell, int dim) const { if ((dim<0) || (dim>this->_K.dim())) - throw "Error : export_FSTARChain with dim out of range" ; + throw "Error : export_cohomology_chain with dim out of range" ; // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) - // throw "Error : export_GChain with 'future' cell wrt persistence" ; + // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; if (this->_hdvf_opt & (OPT_FULL | OPT_F)) { @@ -528,7 +528,7 @@ void Hdvf_duality<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() tmp.clear() ; tmp = this->compute_perfect_hdvf() ; std::cout << tmp.size() << " cells paired" << endl ; - print_pairs(tmp) ; + std::cout << tmp ; critical_L_K = this->get_flag(CRITICAL) ; // this->print_matrices() ; // this->print_reduction() ; diff --git a/HDVF/include/CGAL/HDVF/per_hdvf.hpp b/HDVF/include/CGAL/HDVF/per_hdvf.hpp index e2d61ac64e2d..32911cafa9ee 100644 --- a/HDVF/include/CGAL/HDVF/per_hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/per_hdvf.hpp @@ -18,7 +18,7 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/HDVF/SubSparseMatrix.hpp" -#include "CGAL/HDVF/hdvf_core.hpp" +#include "CGAL/HDVF/Hdvf_core.h" /** * \class Filtration class @@ -531,7 +531,7 @@ class Hdvf_persistence : public Hdvf_core<_CoefficientType,_ComplexType, OSM::Ch // Method to generate PSC labels for visualisation - virtual vector > export_labelsPSC () const + virtual vector > export_psc_labels () const { vector > labels(this->_K.dim()+1) ; for (int q=0; q<=this->_K.dim(); ++q) @@ -559,12 +559,12 @@ class Hdvf_persistence : public Hdvf_core<_CoefficientType,_ComplexType, OSM::Ch // Method to export a G chain for visualisation // with cell indices in initial _K - virtual CChain export_GChain (int cell, int dim) const + virtual CChain export_homology_chain (int cell, int dim) const { if ((dim<0) || (dim>this->_K.dim())) - throw "Error : export_GChain with dim out of range" ; + throw "Error : export_homology_chain with dim out of range" ; // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) - // throw "Error : export_GChain with 'future' cell wrt persistence" ; + // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; if (this->_hdvf_opt & (OPT_FULL | OPT_G)) { @@ -587,12 +587,12 @@ class Hdvf_persistence : public Hdvf_core<_CoefficientType,_ComplexType, OSM::Ch // Method to export a FSTAR chain for visualisation // with cell indices in initial _K - virtual CChain export_FSTARChain (int cell, int dim) const + virtual CChain export_cohomology_chain (int cell, int dim) const { if ((dim<0) || (dim>this->_K.dim())) - throw "Error : export_GChain with dim out of range" ; + throw "Error : export_homology_chain with dim out of range" ; // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) - // throw "Error : export_GChain with 'future' cell wrt persistence" ; + // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; if (this->_hdvf_opt & (OPT_FULL | OPT_F)) { @@ -631,24 +631,24 @@ class Hdvf_persistence : public Hdvf_core<_CoefficientType,_ComplexType, OSM::Ch void export_perHDVF(PairCell p) { // Export labels - ExpLabels labels(this->export_labelsPSC()) ; + ExpLabels labels(this->export_psc_labels()) ; _export_labels.push_back(labels) ; // Export g (according to options) if (this->_hdvf_opt & (OPT_FULL | OPT_G)) { - CChain chain_sigma(export_GChain(p.sigma, p.dim)) ; + CChain chain_sigma(export_homology_chain(p.sigma, p.dim)) ; CChain chain_tau ; if (p.tau >= 0) - chain_tau = export_GChain(p.tau, p.dim+1) ; + chain_tau = export_homology_chain(p.tau, p.dim+1) ; _export_g.push_back(std::pair(chain_sigma, chain_tau)) ; } // Export fstar (according to options) if (this->_hdvf_opt & (OPT_FULL | OPT_F)) { - CChain chain_sigma(export_FSTARChain(p.sigma, p.dim)) ; + CChain chain_sigma(export_cohomology_chain(p.sigma, p.dim)) ; CChain chain_tau ; if (p.tau >= 0) - chain_tau = export_FSTARChain(p.tau, p.dim+1) ; + chain_tau = export_cohomology_chain(p.tau, p.dim+1) ; _export_fstar.push_back(std::pair(chain_sigma, chain_tau)) ; } } diff --git a/main_hdvf.cpp b/main_hdvf.cpp deleted file mode 100644 index 81ad2661fff4..000000000000 --- a/main_hdvf.cpp +++ /dev/null @@ -1,244 +0,0 @@ -// HDVF off files -// -------- -// Computes a "perfect" HDVF and provides a batch mode to specify arguments -// For help: hdvf -h -// -------- -// A. Bac -// -------- - -#include -#include -#include -#include -#include "CGAL/HDVF/Zp.hpp" -#include "CGAL/HDVF/Simplex.hpp" -#include "CGAL/HDVF/tools_io.hpp" -#include "CGAL/HDVF/Abstract_simplicial_chain_complex.hpp" -#include "CGAL/HDVF/SimpComplexTools.hpp" -#include "CGAL/HDVF/Cubical_complex.hpp" -#include "CGAL/HDVF/CubComplexTools.hpp" -#include "CGAL/HDVF/hdvf.hpp" -#include "CGAL/OSM/OSM.hpp" -#include "CGAL/HDVF/hdvf_tools.hpp" -#include "arguments.h" - -// ------- A ring -// For Z/nZ other than Z (ie. n=0) and Z/2Z, uncomment and set the following define properly - -//#define SCALAR 5 - -// HDVF computation, output and export - -template -void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const Options& options) -{ - if (options.with_output) - { - // Mesh - cout << "----> mesh informations" << endl ; - mesh.print_infos() ; - - // Complex - cout << "----> complex informations" << endl ; - complex.print_complex(); - } -} - -template -HDVF& HDVF_comput (const ComplexType& complex, const Options &options) -{ - HDVF& hdvf(*(new HDVF(complex, options.HDVF_opt))); - std::vector pairs ; - if (!options.random) - pairs = hdvf.computePerfectHDVF(options.verbose); - else - pairs = hdvf.computeRandPerfectHDVF(options.verbose); - - if (options.with_output) - { - cout << "----> pairs found by computePerfectHDVF" << endl ; - hdvf.print_pairs(pairs) ; - cout << "----> reduction" << endl ; - hdvf.print_reduction() ; - } - if (options.with_export) - { - string file(options.outfile_root+"_reduction.txt") ; - std::ofstream out ( file, std::ios::out | std::ios::trunc); - - if ( not out . good () ) { - std::cerr << "hdvf: with_export. Fatal Error:\n " << file << " not found.\n"; - throw std::runtime_error("File Parsing Error: File not found"); - } - out << "----> pairs found by computePerfectHDVF" << endl ; - hdvf.print_pairs(pairs, out) ; - out << "----> reduction" << endl ; - hdvf.print_reduction(out) ; - - out.close() ; - } - return hdvf ; -} - -template -void main_code (const Options &options) -{ - /// SIMP format - if (options.in_format == InputFormat::SIMP) - { - using ComplexType = Abstract_Simplicial_chain_complex ; - using HDVFType = HDVF ; - - // MeshObject - Mesh_object mesh ; - mesh.read_simp(options.in_file) ; - - // Complex - ComplexType complex(mesh); - - mesh_complex_output(mesh, complex, options) ; - - // HDVF computation, export, output - HDVFType hdvf(HDVF_comput(complex, options)) ; - - // Export to vtk - // None for SIMP format - } - /// OFF format - else if (options.in_format == InputFormat::OFF) - { - using ComplexType = Simplicial_chain_complex ; - using HDVFType = HDVF ; - - // MeshObject - Mesh_object mesh ; - mesh.read_off(options.in_file) ; - - // Complex - ComplexType complex(mesh, mesh.nodes); - - mesh_complex_output(mesh, complex, options) ; - - // HDVF computation, export, output - HDVFType hdvf(HDVF_comput(complex, options)) ; - - // Loop on operations with vtk export - if (options.loop) - { - auto output_vtk_simp = [options](HDVFType &hdvf, ComplexType& complex) - { - Simp_output_vtk(hdvf, complex, options.outfile_root) ; - } ; - - interaction_loop(hdvf, complex, output_vtk_simp) ; - } - // Export to vtk - else if (options.with_vtk_export) - { - cout << "----> exporting to vtk" << endl ; - Simp_output_vtk(hdvf, complex, options.outfile_root) ; - } - } - // CubComplex - else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) - { - using ComplexType = Cubical_complex ; - using HDVFType = HDVF ; - - CubObject mesh ; - typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; - if (options.primal) - { - if (options.in_format == InputFormat::PGM) - mesh.read_pgm(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) - else - mesh.read_cub(options.in_file, true) ; // Read with Khalimsky coordinates (for primal) - } - else // dual - { - if (options.in_format == InputFormat::PGM) - mesh.read_pgm(options.in_file, false) ; // Read with pixel coordinates (for dual) - else - mesh.read_cub(options.in_file, false) ; // Read with pixel coordinates (for dual) - primal_dual = ComplexType::DUAL ; - } - - // Complex - ComplexType complex(mesh, primal_dual); - - mesh_complex_output(mesh, complex, options) ; - - // HDVF computation, export, output - HDVFType hdvf(HDVF_comput(complex, options)) ; - - // Loop on operations with vtk export - if (options.loop) - { - auto output_vtk_cub = [options](HDVFType &hdvf, ComplexType& complex) - { - Cub_output_vtk(hdvf, complex, options.outfile_root) ; - } ; - - interaction_loop(hdvf, complex, output_vtk_cub) ; - } - // Export to vtk - else if (options.with_vtk_export) - { - cout << "----> exporting to vtk" << endl ; - Cub_output_vtk(hdvf, complex, options.outfile_root) ; - } - } -} - -// Main - -int main(int argc, char **argv) -{ - if (argc <= 2) - usage() ; - else - { - for (int i=0;i(options) ; - } - else if (options.scalar == 2) - { - using CoefficientType = Zp<2,int8_t> ; - main_code(options) ; - } - else - { - cout << "Z" << options.scalar << " not instantiated, use the #define at line 27" << endl ; - } -#else - typedef Zp CoefficientType; -#endif - } - - return 0 ; -} - - - - - - - - - - - - - - - From d696cf2d9e704a6d38477e78b1149307c9d6e801 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Wed, 7 May 2025 14:57:25 +0200 Subject: [PATCH 014/343] Hdvf - Finished documentation of Hdvf class - Renamed the .h file accordingly --- HDVF/examples/HDVF/arguments.h | 2 +- HDVF/examples/HDVF/main_hdvf.cpp | 2 +- HDVF/include/CGAL/HDVF/{hdvf.hpp => Hdvf.h} | 323 ++++++++++++++------ HDVF/include/CGAL/HDVF/Hdvf_core.h | 51 ++-- HDVF/include/CGAL/HDVF/hdvf_tools.hpp | 2 +- HDVF/include/CGAL/HDVF/per_hdvf.hpp | 19 +- 6 files changed, 283 insertions(+), 116 deletions(-) rename HDVF/include/CGAL/HDVF/{hdvf.hpp => Hdvf.h} (77%) diff --git a/HDVF/examples/HDVF/arguments.h b/HDVF/examples/HDVF/arguments.h index d216dec813a8..1efadc989c0c 100644 --- a/HDVF/examples/HDVF/arguments.h +++ b/HDVF/examples/HDVF/arguments.h @@ -1,7 +1,7 @@ #ifndef ARGUMENTS_H #define ARGUMENTS_H -#include "CGAL/HDVF/hdvf.hpp" +#include "CGAL/HDVF/Hdvf.h" enum class Algorithm { HDVF, DualHDVF, PerHDVF }; enum class InputFormat { SIMP, OFF, CUB, PGM }; diff --git a/HDVF/examples/HDVF/main_hdvf.cpp b/HDVF/examples/HDVF/main_hdvf.cpp index 91981b96db77..7e1e79f79b57 100644 --- a/HDVF/examples/HDVF/main_hdvf.cpp +++ b/HDVF/examples/HDVF/main_hdvf.cpp @@ -17,7 +17,7 @@ #include "CGAL/Hdvf/SimpComplexTools.hpp" #include "CGAL/Hdvf/Cubical_chain_complex.hpp" #include "CGAL/Hdvf/CubComplexTools.hpp" -#include "CGAL/Hdvf/hdvf.hpp" +#include "CGAL/Hdvf/Hdvf.h" #include "CGAL/OSM/OSM.hpp" #include "CGAL/Hdvf/hdvf_tools.hpp" #include "arguments.h" diff --git a/HDVF/include/CGAL/HDVF/hdvf.hpp b/HDVF/include/CGAL/HDVF/Hdvf.h similarity index 77% rename from HDVF/include/CGAL/HDVF/hdvf.hpp rename to HDVF/include/CGAL/HDVF/Hdvf.h index 174dce40a597..f9fd05f9da36 100644 --- a/HDVF/include/CGAL/HDVF/hdvf.hpp +++ b/HDVF/include/CGAL/HDVF/Hdvf.h @@ -26,73 +26,237 @@ namespace HDVF { /*! \ingroup PkgHDVFAlgorithmClasses - The class `Hdvf` implements homology and cohomology computation via homological discrete vector fields (HDVF for short). + The class `Hdvf` implements homology and cohomology computation via homological discrete vector fields (HDVF for short). It derives from `Hdvf_core` and shares all its data and methods. - An enumeration `FlagType` is defined in the `HDVF` namespace and the `Hdvf_core` class maps each cell to one of the flags (namely PRIMARY, SECONDARY, CRITICAL). The NONE is used in `HDVF_duality` to compute relative homology on a sub-complex). - The flag of each cell is stored in an appropriate structure and getters are provided to access to this information. - - The `Hdvf_core` class stores the associated reduction in sparse matrices: row-major for \f$f\f$, and column-major for \f$g\f$, \f$h\f$ and \f$\partial'\f$. Getters are provided to access this information. - - The class provides constuction operations: `compute_perfect_hdvf` and `compute_rand_perfect_hdvf`, which build perfect HDVFs by pairing iteratively critical cells through the `A` operation. - In order to find proper pairs, several `find_pair_A` functions are provided (searching for valid pairs of cells for `A`respecting various constraints). The `A` operation can be applied to any pair returned by these functions. + But besides construction operations and methods (using the A operation), the `Hdvf` class implements four other HDVF operations: R, M, W and MW together with appropriate "find_pair" functions. These operations change the HDVF (that is change homology / cohomology generators) and thus provide a convenient tool to move inside the "space of homology/cohomology computations". + +- R operation is the "dual" of the A pairing operation (it cancels the pairing and turns back a PRIMARY/SECONDARY pair into a pair of CRITICAL cells) +- M operation exchanges a PRIMARY \f$\pi\f$ and a CRITICAL cell \f$\gamma\f$ (under conditions) and modifies the homology generator associated to \f$\gamma\f$ (while preserving is associated cohomology generator) +- W operation exchanges a SECONDARY \f$\sigma\f$ and a CRITICAL cell \f$\gamma\f$ (under conditions) and modifies the cohomology generator associated to \f$\gamma\f$ (while preserving is associated homology generator) +- MW operation exchanges a PRIMARY \f$\pi\f$ and a SECONDARY cell \f$\sigma\f$ (under conditions). See the introduction to HDVF for more details on this operation. + +Using appropriate combinations of such operations, one can change a HDVF until corresponding homology or cohomology generators meet a given basis or delineate a hole. - \cgalModels{HDVF} +\cgalModels{HDVF} - \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. - \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. - \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). - \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::SparseMatrix`), providing the type of sparse matrices used. +\tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. +\tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. */ - template class Hdvf : public Hdvf_core { public: - // Types + /*! + Type of parent Hdvf_core class. + */ typedef Hdvf_core HDVF_coreT ; - // Constructor - default : full reduction computed, no sub-complex + /** + * \brief Default constructor. + * + * Builds a "empty" HDVF associated to K (with all cells critical). By default, the HDVF option is set to OPT_FULL (full reduction computed). + * + * \param[in] K A chain complex (a model of `AbstractChainComplex`) + * \param[in] hdvf_opt Option for HDVF computation (`OPT_BND`, `OPT_F`, `OPT_G` or `OPT_FULL`) + */ Hdvf(const ComplexType& K, int hdvf_opt = OPT_FULL) ; - // Copy constructor + + /** + * \brief Constructor by copy. + * + * Builds a HDVF by copy from another, including options. + * + * \param[in] hdvf An initial HDVF. + */ Hdvf(const Hdvf& hdvf) : Hdvf_core(hdvf) { } - // Destructor + + /** + * \brief HDVF destructor. */ ~Hdvf() { } - // findPair functions for M, W, MW + // findPair functions for M + + /** + * \brief Find a valid PairCell of dimension q for M. + * + * The function searches a pair of cells \f$(\pi, \gamma)\f$ with \f$\pi\f$ PRIMARY and \f$\gamma\f$ CRITICAL, valid for M (ie. such that \f$\langle f(\pi), \gamma \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + */ + PairCell find_pair_M(int q, bool &found) const; + + /** + * \brief Find a valid PairCell of dimension q for M cointaining `tau`. + * + * The function searches a pair of cells \f$(\pi, \gamma)\f$ with \f$\pi\f$ PRIMARY and \f$\gamma\f$ CRITICAL (one of them is `tau`), valid for M (ie. such that \f$\langle f(\pi), \gamma \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] tau Cell of dimension `q` to pair. + */ + PairCell find_pair_M(int q, bool &found, int tau) const; + + /** + * \brief Find *all* valid PairCell of dimension q for M. + * + * The function searches all pairs of cells \f$(\pi, \gamma)\f$ with \f$\pi\f$ PRIMARY and \f$\gamma\f$ CRITICAL, valid for M (ie. such that \f$\langle f(\pi), \gamma \rangle\f$ invertible). + * It returns a vector of such pairs. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + */ + std::vector find_pairs_M(int q, bool &found) const; - /** \brief find a valid PairCell for M in dimension q */ - PairCell find_pair_M(int q, bool &found); // const; - /** \brief find a valid PairCell containing tau for M in dimension q */ - PairCell find_pair_M(int q, bool &found, int tau); // const; - /** \brief find all the valid PairCell for M in dimension q */ - std::vector find_pairs_M(int q, bool &found); // const; - /** \brief find all the valid PairCell containing tau for M in dimension q */ - std::vector find_pairs_M(int q, bool &found, int tau); // const; + /** + * \brief Find *all* valid PairCell of dimension q for M cointaining `tau`. + * + * The function searches all pairs of cells \f$(\pi, \gamma)\f$ with \f$\pi\f$ PRIMARY and \f$\gamma\f$ CRITICAL (one of them is `tau`), valid for M (ie. such that \f$\langle f(\pi), \gamma \rangle\f$ invertible). + * It returns a vector of such pairs. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] tau Cell of dimension `q` to pair. + */ + std::vector find_pairs_M(int q, bool &found, int tau) const; - /** \brief find a valid PairCell for W in dimension q */ - PairCell find_pair_W(int q, bool &found); // const; - /** \brief find a valid PairCell containing tau for W in dimension q */ - PairCell find_pair_W(int q, bool &found, int tau); // const; - /** \brief find all the valid PairCell for W in dimension q */ - std::vector find_pairs_W(int q, bool &found); // const; - /** \brief find all the valid PairCell containing tau for W in dimension q */ - std::vector find_pairs_W(int q, bool &found, int tau); // const; + // findPair functions for W - /** \brief find a valid PairCell for MW in dimension q */ - PairCell find_pair_MW(int q, bool &found); // const; - /** \brief find a valid PairCell containing tau for MW in dimension q */ - PairCell find_pair_MW(int q, bool &found, int tau); // const; - /** \brief find all the valid PairCell for MW in dimension q */ - std::vector find_pairs_MW(int q, bool &found); // const; - /** \brief find all the valid PairCell containing tau for MW in dimension q */ - std::vector find_pairs_MW(int q, bool &found, int tau); // const; + /** + * \brief Find a valid PairCell of dimension q for W. + * + * The function searches a pair of cells \f$(\sigma, \gamma)\f$ with \f$\sigma\f$ SECONDARY and \f$\gamma\f$ CRITICAL, valid for W (ie. such that \f$\langle g(\gamma), \sigma \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + */ + PairCell find_pair_W(int q, bool &found) const; + + /** + * \brief Find a valid PairCell of dimension q for W cointaining `tau`. + * + * The function searches a pair of cells \f$(\sigma, \gamma)\f$ with \f$\sigma\f$ SECONDARY and \f$\gamma\f$ CRITICAL (one of them is `tau`), valid for W (ie. such that \f$\langle g(\gamma), \sigma \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] tau Cell of dimension `q` to pair. + */ + PairCell find_pair_W(int q, bool &found, int tau) const; + + /** + * \brief Find *all* valid PairCell of dimension q for W. + * + * The function searches all pairs of cells \f$(\sigma, \gamma)\f$ with \f$\sigma\f$ SECONDARY and \f$\gamma\f$ CRITICAL, valid for W (ie. such that \f$\langle g(\gamma), \sigma \rangle\f$ invertible). + * It returns a vector of such pairs. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + */ + std::vector find_pairs_W(int q, bool &found) const; + + /** + * \brief Find *all* valid PairCell of dimension q for W cointaining `tau`. + * + * The function searches all pairs of cells \f$(\sigma, \gamma)\f$ with \f$\sigma\f$ SECONDARY and \f$\gamma\f$ CRITICAL (one of them is `tau`), valid for W (ie. such that \f$\langle g(\gamma), \sigma \rangle\f$ invertible). It returns the first valid pair found by iterators. + * It returns a vector of such pairs. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] tau Cell of dimension `q` to pair. + */ + std::vector find_pairs_W(int q, bool &found, int tau) const; + + // findPair functions for MW + + /** + * \brief Find a valid PairCell of dimension q for MW. + * + * The function searches a pair of cells \f$(\pi, \sigma)\f$ with \f$\pi\f$ PRIMARY and \f$\sigma\f$ SECONDARY, valid for MW (ie. such that \f$\langle h_{q-1}\partial_q(\pi), \sigma \rangle\f$ invertible and \f$\langle \partial_{q+1} h_q(\sigma), \pi \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + */ + PairCell find_pair_MW(int q, bool &found) const; + + /** + * \brief Find a valid PairCell of dimension q for MW cointaining `tau`. + * + * The function searches a pair of cells \f$(\pi, \sigma)\f$ with \f$\pi\f$ PRIMARY and \f$\sigma\f$ SECONDARY (one of them is `tau`), valid for MW (ie. such that \f$\langle h_{q-1}\partial_q(\pi), \sigma \rangle\f$ invertible and \f$\langle \partial_{q+1} h_q(\sigma), \pi \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] tau Cell of dimension `q` to pair. + */ + PairCell find_pair_MW(int q, bool &found, int tau) const; + + /** + * \brief Find *all* valid PairCell of dimension q for MW. + * + * The function searches all pairs of cells \f$(\pi, \sigma)\f$ with \f$\pi\f$ PRIMARY and \f$\sigma\f$ SECONDARY, valid for MW (ie. such that \f$\langle h_{q-1}\partial_q(\pi), \sigma \rangle\f$ invertible and \f$\langle \partial_{q+1} h_q(\sigma), \pi \rangle\f$ invertible). + * It returns a vector of such pairs. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + */ + std::vector find_pairs_MW(int q, bool &found) const; + + /** + * \brief Find *all* valid PairCell of dimension q for W cointaining `tau`. + * + * The function searches all pairs of cells \f$(\pi, \sigma)\f$ with \f$\pi\f$ PRIMARY and \f$\sigma\f$ SECONDARY (one of them is `tau`), valid for MW (ie. such that \f$\langle h_{q-1}\partial_q(\pi), \sigma \rangle\f$ invertible and \f$\langle \partial_{q+1} h_q(\sigma), \pi \rangle\f$ invertible). + * It returns a vector of such pairs. + * + * \param[in] q Dimension of the pair searched. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] tau Cell of dimension `q` to pair. + */ + std::vector find_pairs_MW(int q, bool &found, int tau) const; // Hdvf methods - /** \brief Hdvf operation A(gamma1, gamma2) */ - void R(int pi, int sigma, int dim); - void M(int pi, int gamma, int dim); - void W(int sigma, int gamma, int dim); - void MW(int pi, int sigma, int dim); + + /** + * \brief R operation (cancels a A operation). + * + * A pair of cells \f$(\pi, \sigma)\f$ of respective dimension q and q+1, with \f$\pi\f$ PRIMARY and \f$\sigma\f$ SECONDARY, is valid for R if \f$\langle h(\pi), \sigma \rangle\f$ is invertible. After the R operation, \f$\pi\f$ and \f$\sigma\f$ become CRITICAL. The R method updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). + * + * \param[in] pi First cell of the pair (dimension `q`) + * \param[in] sigma Second cell of the pair (dimension `q+1`) + * \param[in] q Dimension of the pair + */ + void R(int pi, int sigma, int q); + + /** + * \brief M operation. + * + * A pair of cells \f$(\pi, \gamma)\f$ of dimension q, with \f$\pi\f$ PRIMARY and \f$\gamma\f$ CRITICAL, is valid for M if \f$\langle f(\pi), \gamma \rangle\f$ is invertible. After the M operation, \f$\pi\f$ becomes CRITICAL and \f$\gamma\f$ become PRIMARY. The M method updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). + * + * \param[in] pi First cell of the pair (dimension `q`) + * \param[in] gamma Second cell of the pair (dimension `q`) + * \param[in] q Dimension of the pair + */ + void M(int pi, int gamma, int q); + + /** + * \brief W operation. + * + * A pair of cells \f$(\sigma, \gamma)\f$ of dimension q, with \f$\sigma\f$ SECONDARY and \f$\gamma\f$ CRITICAL, is valid for W if \f$\langle g(\gamma), \sigma \rangle\f$ is invertible. After the W operation, \f$\sigma\f$ becomes CRITICAL and \f$\gamma\f$ become SECONDARY. The W method updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). + * + * \param[in] sigma First cell of the pair (dimension `q`) + * \param[in] gamma Second cell of the pair (dimension `q`) + * \param[in] q Dimension of the pair + */ + void W(int sigma, int gamma, int q); + + /** + * \brief MW operation. + * + * A pair of cells \f$(\pi, \sigma)\f$ of dimension q, with \f$\pi\f$ PRIMARY and \f$\sigma\f$ SECONDARY, is valid for MW if \f$\langle h_{q-1}\partial_q(\pi), \sigma \rangle\f$ is invertible and \f$\langle \partial_{q+1} h_q(\sigma), \pi \rangle\f$ is invertible. After the MW operation, \f$\pi\f$ becomes SECONDARY and \f$\sigma\f$ become PRIMARY. The MW method updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). + * + * \param[in] pi First cell of the pair (dimension `q`) + * \param[in] sigma Second cell of the pair (dimension `q`) + * \param[in] q Dimension of the pair + */ + void MW(int pi, int sigma, int q); }; @@ -107,10 +271,10 @@ Hdvf::Hdvf(const ComplexType& K, int hdvf_opt) : H // First version: returns a pair of dimensions q // Second version: returns all the pairs containing sigma -/** \brief find a valid PairCell for M in dimension q */ -//template +// \brief find a valid PairCell for M in dimension q + template -PairCell Hdvf::find_pair_M(int q, bool &found) // const +PairCell Hdvf::find_pair_M(int q, bool &found) const { found = false; PairCell p; @@ -137,10 +301,10 @@ PairCell Hdvf::find_pair_M(int q, bool &found) // return p; } -/** \brief find a valid PairCell containing tau for M in dimension q */ -//template +// find a valid PairCell containing tau for M in dimension q + template -PairCell Hdvf::find_pair_M(int q, bool &found, int tau) // const +PairCell Hdvf::find_pair_M(int q, bool &found, int tau) const { found = false; PairCell p; @@ -182,10 +346,9 @@ PairCell Hdvf::find_pair_M(int q, bool &found, int return p; } -/** \brief find all the valid PairCell for M in dimension q */ -//template +// find all the valid PairCell for M in dimension q template -std::vector Hdvf::find_pairs_M(int q, bool &found) // const +std::vector Hdvf::find_pairs_M(int q, bool &found) const { found = false; std::vector pairs; @@ -213,10 +376,9 @@ std::vector Hdvf::find_pairs_M(int q, bo return pairs; } -/** \brief find all the valid PairCell containing tau for M in dimension q */ -//template +// find all the valid PairCell containing tau for M in dimension q template -std::vector Hdvf::find_pairs_M(int q, bool &found, int tau) // const +std::vector Hdvf::find_pairs_M(int q, bool &found, int tau) const { found = false; std::vector pairs; @@ -266,10 +428,9 @@ std::vector Hdvf::find_pairs_M(int q, bo // First version: returns a pair of dimensions q // Second version: returns all the pairs containing sigma -/** \brief find a valid PairCell for W in dimension q */ -//template +// find a valid PairCell for W in dimension q template -PairCell Hdvf::find_pair_W(int q, bool &found) // const +PairCell Hdvf::find_pair_W(int q, bool &found) const { found = false; PairCell p; @@ -296,10 +457,9 @@ PairCell Hdvf::find_pair_W(int q, bool &found) // return p; } -/** \brief find a valid PairCell containing tau for W in dimension q */ -//template +// find a valid PairCell containing tau for W in dimension q template -PairCell Hdvf::find_pair_W(int q, bool &found, int tau) // const +PairCell Hdvf::find_pair_W(int q, bool &found, int tau) const { found = false; PairCell p; @@ -341,10 +501,9 @@ PairCell Hdvf::find_pair_W(int q, bool &found, int return p; } -/** \brief find all the valid PairCell for W in dimension q */ -//template +// find all the valid PairCell for W in dimension q template -std::vector Hdvf::find_pairs_W(int q, bool &found) // const +std::vector Hdvf::find_pairs_W(int q, bool &found) const { found = false; std::vector pairs; @@ -373,10 +532,9 @@ std::vector Hdvf::find_pairs_W(int q, bo return pairs; } -/** \brief find all the valid PairCell containing tau for W in dimension q */ -//template +// find all the valid PairCell containing tau for W in dimension q template -std::vector Hdvf::find_pairs_W(int q, bool &found, int tau) // const +std::vector Hdvf::find_pairs_W(int q, bool &found, int tau) const { found = false; std::vector pairs; @@ -426,10 +584,9 @@ std::vector Hdvf::find_pairs_W(int q, bo // First version: returns a pair of dimensions q // Second version: returns all the pairs containing sigma -/** \brief find a valid PairCell for MW in dimension q */ -//template +// find a valid PairCell for MW in dimension q template -PairCell Hdvf::find_pair_MW(int q, bool &found) // const +PairCell Hdvf::find_pair_MW(int q, bool &found) const { found = false; PairCell p; @@ -470,10 +627,9 @@ PairCell Hdvf::find_pair_MW(int q, bool &found) // return p; } -/** \brief find a valid PairCell containing tau for MW in dimension q */ -//template +// find a valid PairCell containing tau for MW in dimension q template -PairCell Hdvf::find_pair_MW(int q, bool &found, int tau) // const +PairCell Hdvf::find_pair_MW(int q, bool &found, int tau) const { found = false; PairCell p; @@ -559,10 +715,9 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in return p; } -/** \brief find all the valid PairCell for MW in dimension q */ -//template +// find all the valid PairCell for MW in dimension q template -std::vector Hdvf::find_pairs_MW(int q, bool &found) // const +std::vector Hdvf::find_pairs_MW(int q, bool &found) const { found = false; std::vector pairs; @@ -606,10 +761,9 @@ std::vector Hdvf::find_pairs_MW(int q, b return pairs; } -/** \brief find all the valid PairCell containing tau for MW in dimension q */ - +// find all the valid PairCell containing tau for MW in dimension q template -std::vector Hdvf::find_pairs_MW(int q, bool &found, int tau) // const +std::vector Hdvf::find_pairs_MW(int q, bool &found, int tau) const { found = false; std::vector pairs; @@ -702,7 +856,6 @@ std::vector Hdvf::find_pairs_MW(int q, b // Method to perform operation R // pi is in dimension q, sigma is in dimension q+1 -//template template void Hdvf::R(int pi, int sigma, int q) { //----------------------------------------------- Submatrices of H ---------------------------------------------------- diff --git a/HDVF/include/CGAL/HDVF/Hdvf_core.h b/HDVF/include/CGAL/HDVF/Hdvf_core.h index cea04c9d09d2..81e52dd50187 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_core.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_core.h @@ -9,8 +9,8 @@ // // Author(s) : Alexandra Bac -#ifndef HDVF_CORE_H -#define HDVF_CORE_H +#ifndef CGAL_HDVF_CORE_H +#define CGAL_HDVF_CORE_H #include #include @@ -146,59 +146,72 @@ class Hdvf_core { * * Builds a HDVF by copy from another, including options. * - * \param[in] K A chain complex (a model of `AbstractChainComplex`) - * \param[in] hdvf_opt Option for HDVF computation (`OPT_BND`, `OPT_F`, `OPT_G` or `OPT_FULL`) + * \param[in] hdvf An initial HDVF. */ Hdvf_core(const Hdvf_core& hdvf) : _flag(hdvf._flag), _nb_P(hdvf._nb_P), _nb_S(hdvf._nb_S), _nb_C(hdvf._nb_C), _F_row(hdvf._F_row), _G_col(hdvf._G_col), _H_col(hdvf._H_col), _DD_col(hdvf._DD_col), _K(hdvf._K), _hdvf_opt(hdvf._hdvf_opt) { } /** - * \brief HDVF destructor. */ + * \brief HDVF_core destructor. */ ~Hdvf_core() { } /** * \brief Find a valid PairCell of dimension q / q+1 for A. * - * \param[in] q The function finds a pair of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). It returns the first valid pair found by iterators. - + * The function searches a pair of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). It returns the first valid pair found by iterators. + * + * \param[in] q Lower dimension of the pair. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. */ virtual PairCell find_pair_A(int q, bool &found) const; /** * \brief Find a valid PairCell for A containing `gamma` (a cell of dimension `q`) * - * \param[in] q Dimension of the cell gamma. - * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. - * \param[in] gamma The function finds a cell \f$\gamma'\f$ such that one of the following conditions holds: + * The function searches a cell \f$\gamma'\f$ such that one of the following conditions holds: * - \f$\gamma'\f$ has dimension q+1 and \f$(\gamma, \gamma')\f$ is valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma'), \gamma \rangle\f$ invertible), * - \f$\gamma'\f$ has dimension q-1 and \f$(\gamma', \gamma)\f$ is valid for A (ie. such that \f$\langle \partial_{q}(\gamma), \gamma' \rangle\f$ invertible). + * + * \param[in] q Dimension of the cell `gamma`. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] gamma Index of a cell to pair. */ virtual PairCell find_pair_A(int q, bool &found, int gamma) const; /** - * \brief Find *all* valid PairCells of dimension q / q+1 for A. This method is thus slower than `find_pair_A`. + * \brief Find *all* valid PairCell of dimension q / q+1 for A. * - * \param[in] q The function finds all pairs of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). It returns the vector of all valid pairs found. + * The function searches all pairs of critical cells \f$(\gamma_1, \gamma2)\f$ of dimension q / q+1, valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ invertible). + * It returns a vector of such pairs. + * + * \param[in] q Lower dimension of the pair. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. */ virtual std::vector find_pairs_A(int q, bool &found) const; /** * \brief Find *all* valid PairCell for A containing `gamma` (a cell of dimension `q`) * - * \param[in] q Dimension of the cell gamma. - * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. - * \param[in] gamma The function finds all the cell \f$\gamma'\f$ such that one of the following conditions holds: + * The function searches all CRITICAL cells \f$\gamma'\f$ such that one of the following conditions holds: * - \f$\gamma'\f$ has dimension q+1 and \f$(\gamma, \gamma')\f$ is valid for A (ie. such that \f$\langle \partial_{q+1}(\gamma'), \gamma \rangle\f$ invertible), * - \f$\gamma'\f$ has dimension q-1 and \f$(\gamma', \gamma)\f$ is valid for A (ie. such that \f$\langle \partial_{q}(\gamma), \gamma' \rangle\f$ invertible). - * \return The vector of all possible valid pairs. + * It returns a vector of such pairs. + * + * \param[in] q Dimension of the cell `gamma`. + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + * \param[in] gamma Index of a cell to pair. */ virtual std::vector find_pairs_A(int q, bool &found, int gamma) const; /** * \brief A operation: pairs critical cells. * - * A pair of critical cells \f$(\gamma_1, \gamma_2)\f$ of respective dimension q and q+1 is valid for A if \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ is invertible. After the A operation, \f$\gamma_1\f$ becomes PRIMARY, \f$\gamma_2\f$ becomes SECONDARY. The A functions updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). + * A pair of critical cells \f$(\gamma_1, \gamma_2)\f$ of respective dimension q and q+1 is valid for A if \f$\langle \partial_{q+1}(\gamma_2), \gamma_1 \rangle\f$ is invertible. After the A operation, \f$\gamma_1\f$ becomes PRIMARY, \f$\gamma_2\f$ becomes SECONDARY. The A method updates the reduction accordingly (in time \f$\mathcal O(n^2)\f$). + * + * \param[in] gamma1 First cell of the pair (dimension `q`) + * \param[in] gamma2 Second cell of the pair (dimension `q+1`) + * \param[in] q Dimension of the pair */ - void A(int gamma1, int gamma2, int dim); + void A(int gamma1, int gamma2, int q); /** * \brief Compute a perfect HDVF. @@ -997,4 +1010,4 @@ std::ostream& Hdvf_core #ifndef PER_HOM_HPP #define PER_HOM_HPP From fde3905d6be246c378a6a1ff4970e657a8d728e3 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Wed, 14 May 2025 06:59:01 +0200 Subject: [PATCH 015/343] Hdvf_persistence, Filtration -> Hdvf_persistence OK -> Filtration rework ongoing --- HDVF/doc/HDVF/Concepts/Filtration.h | 153 ++++ HDVF/examples/HDVF/main_per_hdvf.cpp | 46 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 12 +- HDVF/include/CGAL/HDVF/Filtration_lower.h | 344 ++++++++ HDVF/include/CGAL/HDVF/Hdvf_core.h | 8 +- HDVF/include/CGAL/HDVF/Hdvf_persistence.h | 822 +++++++++++++++++ HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 12 +- HDVF/include/CGAL/HDVF/per_hdvf.hpp | 929 -------------------- 8 files changed, 1361 insertions(+), 965 deletions(-) create mode 100644 HDVF/doc/HDVF/Concepts/Filtration.h create mode 100644 HDVF/include/CGAL/HDVF/Filtration_lower.h create mode 100644 HDVF/include/CGAL/HDVF/Hdvf_persistence.h delete mode 100644 HDVF/include/CGAL/HDVF/per_hdvf.hpp diff --git a/HDVF/doc/HDVF/Concepts/Filtration.h b/HDVF/doc/HDVF/Concepts/Filtration.h new file mode 100644 index 000000000000..6338e5eb48b1 --- /dev/null +++ b/HDVF/doc/HDVF/Concepts/Filtration.h @@ -0,0 +1,153 @@ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `Filtration` describes the requirements for persistent filtrations associated to persistent homology computation. + +A filtration is associated to an `AbstractSimplicialComplex`. Each cells is equiped with a scalar value (called its degree) and the filtration is an enumeration of cells in any dimension by increasing degrees. + +A filtration class provides: + + - an iterator to visit all cells by increasing degrees. + - getters to get the degree of a cell, and the cell of a given index along the filtration. + - an overload of `<<` to output filtrations. + +Cells are indexed along each dimension and thus identified by their index together with their dimension. + +\cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Filtration_lower_star`} +\cgalHasModelsEnd + +*/ + +class Filtration +{ +public: + /*! \brief (Scalar) type of degrees. + */ + typedef unspecified_type DegreeType ; + + /*! \brief Type for indexing uniquely a cell. + * - First element of the pair: index of the cell. + * - Second element of the pair: dimension of the cell. + */ + typedef std::pair CellDim ; + + /*! \brief Value returned by the filtration iterator. + * Contains a cell (identified by its index and dimenion in a `CellDim`) and its associated degree. + */ + typedef struct { + CellDim cell_dim ; + _DegType degree ; + } FiltrationIterValue ; + +protected: + /*! + Type of column-major sparse matrices. + */ + typedef OSM::SparseMatrix<_CoefType,OSM::COLUMN> CMatrix ; + + /*! + Type of row-major sparse matrices. + */ + typedef OSM::SparseMatrix<_CoefType,OSM::ROW> RMatrix ; + + /*! + Type of column-major chains. + */ + typedef OSM::Chain<_CoefType,OSM::COLUMN> CChain ; + + /*! + Type of row-major chains. + */ + typedef OSM::Chain<_CoefType,OSM::ROW> RChain ; + +public: + /** + * \brief The iterator over filtration. + * + * Iterate the filtration by increasing degrees. + */ + struct iterator + { + // Iterator tags + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = FiltrationIterValue; + + /*! Iterator constructor + */ + iterator(const Filtration& f, int i=0); + + /*! Dereference operator. + */ + value_type operator*() const; + + /*! Get the index (time) associated to the iterator. + */ + int time () const ; + + /*! Get the `CellDim` (cell and its dimension) associated to the iterator. + */ + CellDim cell_dim () const ; + + /*! Get the degree associated to the iterator. + */ + DegreeType degree () const ; + + /*! + * \brief Prefix incrementation. + * Move to next index in the filtration. + */ + iterator& operator++(); + + /*! \brief Postfix incrementation. + */ + iterator operator++(int); + + /*! + * \brief Equality check. + * \returns True if the indices are equal. + */ + friend bool operator== (const iterator& a, const iterator& b); + + /*! + * \brief Inequality check. + * \returns True if the indices are different. + */ + friend bool operator!= (const iterator& a, const iterator& b); + }; + + /*! + * \brief Iterator to the beginning of the filtration. + */ + iterator begin(); + + /*! + * \brief Iterator to the ending of the filtration. + */ + iterator end(); + + // getters + /*! \brief Get the filtration size. + */ + int get_filtration_size () const; + + /*! \brief Get the cell (that is cell index and dimension) at the index `i` of the filtration. + */ + CellDim get_cell_dim (int i) const; + + /*! \brief Get the degree of the `i`th element of the filtration. + */ + DegreeType get_degree (int i) const; + + // Filtration verification + /*! \brief Check that a filtration is valid (cells are ordered in increasing degrees and all cells have indices larger than their faces. + */ + bool check_filtration() const; + + // Output filtration + /*! \brief Overload of the `<<`operator for filtrations. + */ + friend ostream & operator<<(ostream & out, const Filtration &f); +}; diff --git a/HDVF/examples/HDVF/main_per_hdvf.cpp b/HDVF/examples/HDVF/main_per_hdvf.cpp index b8153f64bc90..8afa292ca4c0 100644 --- a/HDVF/examples/HDVF/main_per_hdvf.cpp +++ b/HDVF/examples/HDVF/main_per_hdvf.cpp @@ -18,7 +18,7 @@ #include "CGAL/HDVF/SimpComplexTools.hpp" #include "CGAL/HDVF/Cubical_chain_complex.hpp" #include "CGAL/HDVF/CubComplexTools.hpp" -#include "CGAL/HDVF/per_hdvf.hpp" +#include "CGAL/HDVF/Hdvf_persistence.h" #include "CGAL/OSM/OSM.hpp" #include "CGAL/HDVF/hdvf_tools.hpp" #include "arguments.h" @@ -77,20 +77,20 @@ void mesh_complex_output(const MeshType& mesh, const ComplexType& complex, const } } -template -Hdvf_persistence& per_HDVF_comput (const ComplexType& complex, const Filtration& f, const Options &options) +template +Hdvf_persistence& per_HDVF_comput (const ComplexType& complex, const FiltrationType& f, const Options &options) { - typedef Hdvf_persistence HDVFType ; + typedef Hdvf_persistence HDVFType ; HDVFType& hdvf(*(new HDVFType(complex, f, options.HDVF_opt, options.with_vtk_export))); cout << "----> START computing persistent homology" << endl ; - hdvf.computePersistentHomology() ; + hdvf.compute_perfect_hdvf() ; cout << "------> END computing persistent homology" << endl ; if (options.with_output) { cout << "----> perHDVF" << endl ; - hdvf.print_perHDVFInfo(cout); + hdvf.print_hdvf_persistence_info(cout); cout << "----> reduction" << endl ; hdvf.print_reduction() ; cout << "----> persistent diagram" << endl ; @@ -107,7 +107,7 @@ Hdvf_persistence& per_HDVF_comput (const throw std::runtime_error("File Parsing Error: File not found"); } out << "----> perHDVF" << endl ; - hdvf.print_perHDVFInfo(out); + hdvf.print_hdvf_persistence_info(out); out << "----> reduction" << endl ; hdvf.print_reduction(out) ; @@ -128,10 +128,10 @@ Hdvf_persistence& per_HDVF_comput (const return hdvf ; } -template -Filtration& build_filtration(const ComplexType& complex, const Options& options) +template +FiltrationType& build_filtration(const ComplexType& complex, const Options& options) { - + typedef FiltrationType Filtration; std::function deg_function ; #ifndef CUST_FILTRATION // Standard lower star filtration along x,y or z @@ -151,9 +151,13 @@ Filtration& build_filtration(const Comple deg_function = (deg_fun(complex)) ; #endif - Filtration& f = *(new Filtration(complex)) ; +// Filtration& f = *(new Filtration(complex)) ; +// cout << "----> START building filtration" << endl ; +// f.star_filtration(deg_function) ; +// cout << "------> END building filtration" << endl ; +// return f ; cout << "----> START building filtration" << endl ; - f.star_filtration(deg_function) ; + Filtration& f = *(new Filtration(complex, deg_function)) ; cout << "------> END building filtration" << endl ; return f ; } @@ -189,7 +193,8 @@ void main_code (const Options &options) else if (options.in_format == InputFormat::OFF) { using ComplexType = Simplicial_chain_complex ; - using HDVFType = Hdvf_persistence ; + using FiltrationType = Filtration_lower_star ; + using HDVFType = Hdvf_persistence ; // MeshObject Mesh_object mesh ; @@ -199,25 +204,26 @@ void main_code (const Options &options) ComplexType complex(mesh, mesh.nodes); // Build filtration - Filtration& f(build_filtration(complex, options)) ; + FiltrationType& f(build_filtration(complex, options)) ; mesh_complex_output(mesh, complex, options) ; // HDVF computation, export, output - HDVFType& hdvf(per_HDVF_comput(complex,f, options)) ; + HDVFType& hdvf(per_HDVF_comput(complex,f, options)) ; // Export to vtk if (options.with_vtk_export) { cout << "----> exporting to vtk" << endl ; - Per_Simp_output_vtk(hdvf, complex, options.outfile_root) ; + Per_Simp_output_vtk(hdvf, complex, options.outfile_root) ; } } // CubComplex else if ((options.in_format == InputFormat::PGM) || (options.in_format == InputFormat::CUB)) { using ComplexType = Cubical_chain_complex ; - using HDVFType = Hdvf_persistence ; + using FiltrationType = Filtration_lower_star ; + using HDVFType = Hdvf_persistence ; Cub_object mesh ; typename ComplexType::typeComplexCube primal_dual(ComplexType::PRIMAL) ; @@ -243,16 +249,16 @@ void main_code (const Options &options) mesh_complex_output(mesh, complex, options) ; // Build filtration - Filtration& f(build_filtration(complex, options)) ; + FiltrationType& f(build_filtration(complex, options)) ; // HDVF computation, export, output - HDVFType& hdvf(per_HDVF_comput(complex,f, options)) ; + HDVFType& hdvf(per_HDVF_comput(complex,f, options)) ; // Export to vtk if (options.with_vtk_export) { cout << "----> exporting to vtk" << endl ; - Per_Cub_output_vtk(hdvf, complex, options.outfile_root) ; + Per_Cub_output_vtk(hdvf, complex, options.outfile_root) ; // Cub_output_vtk(hdvf, complex, options.outfile_root) ; } } diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index 867b7269d341..2808adcf7fdd 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -18,7 +18,7 @@ #include #include "Cubical_chain_complex.hpp" #include "Hdvf_core.h" -#include "per_hdvf.hpp" +#include "Hdvf_persistence.h" #include "sub_chain_complex.hpp" #include "tools_io.hpp" #include "CGAL/OSM/OSM.hpp" @@ -157,13 +157,13 @@ class Duality_cubical_complex_tools { // Persistent homology /** \brief Export persistent information to vtk files */ -template -void Per_Cub_output_vtk (Hdvf_persistence, DegType> &per_hdvf, Cubical_chain_complex &complex, string filename = "per") +template +void Per_Cub_output_vtk (Hdvf_persistence, DegType, FiltrationType> &per_hdvf, Cubical_chain_complex &complex, string filename = "per") { if (!per_hdvf.with_export()) throw("Cannot export persistent generators to vtk: with_export is off!") ; - using perHDVFType = Hdvf_persistence, DegType> ; + using perHDVFType = Hdvf_persistence, DegType, FiltrationType> ; using ComplexType = Cubical_chain_complex ; using PerHole = PerHoleT ; // Iterate over persistence diagram (iterator over non zero intervals) @@ -172,7 +172,7 @@ void Per_Cub_output_vtk (Hdvf_persistence " << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << std::endl ; @@ -183,7 +183,7 @@ void Per_Cub_output_vtk (Hdvf_persistence(hole_data.hole)) ; + const CellsPerInterval per_int_cells(std::get<1>(hole_data.hole)) ; // Export homology generators (g) if (per_hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) { diff --git a/HDVF/include/CGAL/HDVF/Filtration_lower.h b/HDVF/include/CGAL/HDVF/Filtration_lower.h new file mode 100644 index 000000000000..f9c83b5adf23 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Filtration_lower.h @@ -0,0 +1,344 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_FILTRATION_H +#define CGAL_FILTRATION_H + +#include +#include +#include +#include +#include + +/** + * \class Filtration_lower_star class + * \brief Implementation of the filtration. + * + * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam ComplexType The type of complex + */ + +namespace CGAL { +namespace HDVF { + +template +class Filtration_lower_star +{ +public: + typedef std::pair CellDim ; + typedef struct zFiltration_iter_type { + CellDim cell_dim ; + DegreeType degree ; + } FiltrationIterValue ; + +protected: + const ComplexType& _K ; + std::vector _filtration ; + std::vector _deg ; + + // Cell -> (filtration index, basis index according to the filtration) + std::map _cell_to_t ; + + typedef OSM::SparseMatrix CMatrix ; + typedef OSM::SparseMatrix RMatrix ; + typedef OSM::Chain CChain ; + typedef OSM::Chain RChain ; +public: + // Constructor of an empty filtration + Filtration_lower_star(const ComplexType& K) : _K(K) + { + } + + // Copy constructor + Filtration_lower_star(const Filtration_lower_star& f) : _K(f._K), _filtration(f._filtration), _cell_to_t(f._cell_to_t) {} + + // Constructor from a filtration on all cells + Filtration_lower_star(const ComplexType& K, const std::vector& filtration, const std::vector& deg) : + _K(K), _filtration(filtration), _deg(deg) + { + check_filtration() ; + build_filtration_structure() ; + } + + // Constructor from the vector of degrees of vertices + Filtration_lower_star(const ComplexType& K, const std::vector& deg) : _K(K) + { + star_filtration(deg); + } + + // Constructor from a function over vertices + Filtration_lower_star(const ComplexType& K, std::function& deg_fun) : _K(K) + { + star_filtration(deg_fun); + } + + // Build lower-star filtration + // From the degrees of vertices + void star_filtration(const std::vector& deg) ; + // From a function over vertices + void star_filtration(std::function& deg_fun) ; + + // iterator (iterate a filtration) + struct iterator + { + // Iterator tags + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = FiltrationIterValue; + + // Iterator constructors + iterator(const Filtration_lower_star& f, int i=0) : _i(i), _f(f) {} + + // Operators + value_type operator*() const + { + FiltrationIterValue res ; + res.cell_dim = _f._filtration.at(_i) ; + res.degree = _f._deg.at(_i) ; + return res ; + } + + int time () const { return _i ; } + CellDim cell_dim () const { return _f._filtration.at(_i); } + DegreeType degree () const { return _f._deg.at(_i); } + + // Prefix increment + // Find next hole of positive duration + iterator& operator++() + { + ++_i; + return *this; + } + + // Postfix increment + iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } + + friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; + friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; + + private: + int _i ; // Index along _persist + const Filtration_lower_star& _f ; // Filtration_lower_star iterated + }; + iterator begin() { return iterator(*this, 0) ; } + iterator end() { return iterator(*this, _filtration.size()) ; } + + // getters + int get_filtration_size () const { return _filtration.size();} + CellDim get_cell_dim (int i) const { return _filtration.at(i); } + DegreeType get_degree (int i) const { return _deg.at(i); } + + // Output filtration + friend ostream & operator<<(ostream & out, const Filtration_lower_star &f) + { + const int N(f._filtration.size()) ; + for (int i=0; i (" << f._filtration.at(i).first << "- dim " << f._filtration.at(i).second << " , " << f._deg.at(i) << ") " << std::endl ; + } + return out ; + } + + bool check_filtration() const ; + +protected: + void build_filtration_structure() ; + + template + friend class Hdvf_persistence ; +}; + +template +void Filtration_lower_star::build_filtration_structure() +{ + for (int i = 0; i<_filtration.size(); ++i) + { + const CellDim c(_filtration.at(i)) ; + // c : filtration index i, index in the basis reordered by filtration : j + _cell_to_t[c] = i ; + } +} + +template +bool Filtration_lower_star::check_filtration() const +{ + bool valid = true ; + for (int i=0; i<_filtration.size() && valid; ++i) + { + if (i>0) + valid = valid & (_deg.at(i) >= _deg.at(i-1)) ; + CellDim c(_filtration.at(i)) ; + cout << i << " -> " << c.first << " dim "<< c.second << endl ; + const int q = c.second ; + if (q>0) + { + CChain dc = _K.d(c.first, q) ; + cout << "bnd : " << dc << endl ; + for (typename CChain::iterator it = dc.begin(); it != dc.end() && valid; ++it) + { + // Faces of c + const CellDim face(it->first,q-1) ; + // Check if the face c belongs to the filtration + auto it_face(_cell_to_t.find(face)) ; + valid = valid & (it_face != _cell_to_t.end()) ; + if (!valid) + cout << "face not found" << endl ; + if (it_face != _cell_to_t.end()) + valid = valid & (_cell_to_t[face] < i) ; + if (!valid) + cout << "face " << it->first << " at time : " << _cell_to_t[face] << " with i : " << i << endl ; + } + } + if (!valid) + cout << "check failed : " << i << endl ; + } + return valid ; +} + +template +void Filtration_lower_star::star_filtration(const std::vector °) +{ + if (deg.size() != _K.nb_cells(0)) + throw "Star filtration error : deg should provide one value by vertex" ; + + // Create filtration and degrees for all cells according to deg + // -> lower star: maximum degree of vertices + // -> upper star: minimum degree of vertices + std::vector tmp_filtration ; + std::vector tmp_deg ; + std::vector tmp_perm ; + // Init tmp_perm (for vertices) + // cout << "vertices degrees : " << endl ; + for (int i=0; i " << deg.at(i) << endl ; + } + // For all other cells + for (int q=1; q<=_K.dim(); ++q) + { + for (int i=0; i<_K.nb_cells(q); ++i) + { + tmp_filtration.push_back(CellDim(i,q)) ; + + // Compute corresponding degree + // Vertices of the cell + // TODO : bottom_faces should produce a set + std::vector verts(_K.bottom_faces(i,q)) ; + // cout << "cell " << i << " dim " << q << " : " << verts ; + // Compute the degree of the cell + DegreeType d = deg.at(verts.at(0)) ; + for (int j=1; j d) + d = tmp_d ; + } + else // upper + { + if (tmp_d < d) + d = tmp_d ; + } + } + tmp_deg.push_back(d) ; + tmp_perm.push_back(tmp_perm.size()) ; + // cout << " -> " << d << endl ; + } + } + // Sort filtration + + // Create sorting function : lexicographic order over (deg, dim) + // Test if cell i < cell j + auto f_sort = [&tmp_filtration, &tmp_deg] (int i, int j) + { + // degree of i is lower than degree of j or (they are equal and the dimension of i is lower than the dimension of j) + return ((tmp_deg[i] < tmp_deg[j]) || ((tmp_deg[i] == tmp_deg[j]) && (tmp_filtration[i].second < tmp_filtration[j].second))) ; + } ; + // Sort -> create the right permutation + std::sort(tmp_perm.begin(), tmp_perm.end(), f_sort) ; + // Insert cells in the filtration and degrees accordingly + for (int i=0; i +void Filtration_lower_star::star_filtration(std::function& deg_fun) +{ + std::vector deg ; + for (int i=0; i<_K.nb_cells(0); ++i) + { + deg.push_back(deg_fun(i)) ; + } + star_filtration(deg) ; +} + +/* Standard functions for lower star filtration */ +/* DegType = double */ + +//std::function deg_fun_x = [&complex](int i) +//{ +// std::vector Xi(complex.get_vertex_coords(i)) ; +// return (Xi.at(0)) ; +//} ; +// +//std::function deg_fun_z = [&complex](int i) +//{ +// std::vector Xi(complex.get_vertex_coords(i)) ; +// return (Xi.at(2)) ; +//} ; + +std::function&)> f_x = [](const std::vector& v) +{ + return (v.at(0)) ; +} ; + +std::function&)> f_y = [](const std::vector& v) +{ + return (v.at(1)) ; +} ; + +std::function&)> f_z = [](const std::vector& v) +{ + return (v.at(2)) ; +} ; + +template +std::function deg_fun (const ComplexType& complex, std::function&)>& f) +{ + std::function deg_fun_f = [&complex, &f](int i) + { + const std::vector Xi(complex.get_vertex_coords(i)) ; + // cout << "deg_fun_f, i: " << i ; + // cout << " Xi : " ; + // for (double c : Xi) + // cout << c << " " ; + // cout << " - degree: " << f(Xi) << endl ; + return f(Xi) ; + } ; + return deg_fun_f ; +} + +} /* end namespace HDVF */ +} /* end namespace CGAL */ + +#endif // CGAL_FILTRATION_H diff --git a/HDVF/include/CGAL/HDVF/Hdvf_core.h b/HDVF/include/CGAL/HDVF/Hdvf_core.h index 81e52dd50187..b558f20af271 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_core.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_core.h @@ -134,7 +134,7 @@ class Hdvf_core { /** * \brief Default constructor. * - * Builds a "empty" HDVF associated to K (with all cells critical). By default, the HDVF option is set to OPT_FULL (full reduction computed). + * Builds an "empty" HDVF_core associated to K (with all cells critical). By default, the HDVF option is set to OPT_FULL (full reduction computed). * * \param[in] K A chain complex (a model of `AbstractChainComplex`) * \param[in] hdvf_opt Option for HDVF computation (`OPT_BND`, `OPT_F`, `OPT_G` or `OPT_FULL`) @@ -224,7 +224,7 @@ class Hdvf_core { * * \param[in] verbose If this parameter is `true`, all intermediate reductions are printed out. * - * \return The vector of all pairs of cells used for apply A. + * \return The vector of all `PairCell` paired with A. */ std::vector compute_perfect_hdvf(bool verbose = false); @@ -342,7 +342,7 @@ class Hdvf_core { } /** - * \brief Export homology generators associated to `cell` (critical cell) of dimension `q` for vtk export. + * \brief Export homology generators associated to `cell` (critical cell) of dimension `q` (used by vtk export). * * The method exports the chain \f$g(\sigma)\f$ for \f$\sigma\f$ the cell of index `cell` and dimension `q`. * @@ -364,7 +364,7 @@ class Hdvf_core { } /** - * \brief Export cohomology generators associated to `cell` (critical cell) of dimension `q` for vtk export. + * \brief Export cohomology generators associated to `cell` (critical cell) of dimension `q` (used by vtk export). * * The method exports the chain \f$f^\star(\sigma)\f$ for \f$\sigma\f$ the cell of index `cell` and dimension `q`. * diff --git a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h new file mode 100644 index 000000000000..950667df880c --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h @@ -0,0 +1,822 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_HDVF_PERSISTENCE_H +#define CGAL_HDVF_PERSISTENCE_H + +#include +#include +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/HDVF/SubSparseMatrix.hpp" +#include "CGAL/HDVF/Hdvf_core.h" +#include "CGAL/HDVF/Filtration_lower.h" + +namespace CGAL { +namespace HDVF { + + +/** + * \class Persistent HDVF + * \brief Implementation of persistent HDVF (inherits HDVF). + * + * The Hdvf_persistence class contains all functions to build persistent HDVF and create perfect persistent HDVF. + * + * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam ComplexType The type of complex (default is SimpComplex) + * + * \author Bac A. + * \version 0.1.0 + * \date 22/08/2024 + */ + +// Types for persistent homology / cohomology + +/** \brief Type to store persistent intervals filtration indices (birth/death indices) + * + * For "infinite" intervals borne at index i, the interval is set to (i,i-1) + */ +typedef std::pair FiltrIndexPerInterval ; + +/** \brief Type for indexing uniquely a cell. + * - First element of the pair: index of the cell. + * - Second element of the pair: dimension of the cell. + * + * "Infinite cells" are defined as (-1,q+1) where q is the dimension of the chain complex. + */ +typedef std::pair CellDim ; + +/** \brief Type for describing the pair of cells associated to a persistence interval: + * - First element of the pair: cell entailing the birth of the hole. + * - Second element of the pair: cell entailing the death of the hole. + * + * For infinite intervals, the "infinite cells" is defined as (-1,q+1) where q is the dimension of the chain complex. + */ +typedef std::pair CellsPerInterval ; + +/** \brief Template for persistent intervals degrees (birth/death degrees) + * + * For "infinite" intervals borne at degree d, the interval is set to (d,d-1) + */ +template +using DegreePerIntervalT = std::pair ; + +/** \brief Template for (full) persistent interval data: + * - First element: persistent interval filtration indices + * - Second element: persistent interval cells + * - Third element: persistent interval degrees + */ +template +using PerHoleT = std::tuple > ; + +/** \brief Overload of the `<<` operator to display persistent intervals (that is PerHoleT). + * + * Format: + */ +template +ostream& operator<< (ostream& out, const PerHoleT& hole) +{ + // time (cell, dim) -> time (cell, dim) / time to live + const FiltrIndexPerInterval per_int(std::get<0>(hole)) ; + const CellsPerInterval per_int_cells(std::get<1>(hole)) ; + const DegreePerIntervalT per_int_deg(std::get<2>(hole)) ; + + const DegType deg_duration(per_int_deg.second-per_int_deg.first) ; + if (deg_duration >= 0) // finite interval + { + out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; + out << per_int.second << " (" << per_int_cells.second.first << ", " << per_int_cells.second.second << ") / duration: " << deg_duration << "]" << endl ; + } + else + { + out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; + out << "inf]" << endl ; + } + return out ; +} + +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Hdvf_persistence` computes persistent homology using HDVFs. Hence, unlike other persistence algorithms, beside standard persistent intervals informations (birth/death indices, degrees, associated cells), `Hdvf_persistence` also provides homology and cohomology generators for persistent pairs. Intuitively, holes die when they are "filled" by a cell: associated homology and cohomology generators provide a representation of the hole and of the cells filling the hole. + + Given a `Filtration`, the `Hdvf_persistence`constructor basically builds a HDVF where indices of cells in the bases follow the filtration order (permutations between initial indices of cells in the chain complex and new indices given by the filtration are stored). + Besides, `Hdvf_persistence` derives from `Hdvf_core` with the SparseMatrix parameter type set to `Sub_sparse_matrix`. Hence, `Hdvf_persistence` computes homology over a larger and larger sub-complex of `K` (encoded through a Bitboard mask of `Sub_sparse_matrix`) following the filtration `f`. At each step of the filtration, the new cell is paired (A operation) with the youngest cell valid for A. + + Persistent intervals can be exported to a file; moreover, persistent homology and cohomology generators can be exported to chains (and to vtk). + + \cgalModels{HDVF} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. + \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. + \tparam DegType a scalar data type used for the degrees of the filtration. + \tparam FiltrationType a model of the `Filtration` concept, providing the filtration used to compute persistence. + */ + +template +class Hdvf_persistence : public Hdvf_core +{ +public: + // Matrices types + /*! + Type of column-major chains + */ + typedef OSM::Chain CChain; + + /*! + Type of row-major chains + */ + typedef OSM::Chain RChain; + + /*! + Type of column-major sparse matrices + */ + typedef OSM::SubSparseMatrix CMatrix; + + /*! + Type of row-major sparse matrices + */ + typedef OSM::SubSparseMatrix RMatrix; + + /*! Type of parent HDVF class (Hdvf_core with appropriate template parameters) + * The SparseMatrix model is set to Sub_sparse_matrix to activate (co)homology computation over a subcomplex. + */ + typedef Hdvf_core HDVFParent ; + + /*! Type of filtrations used to compute persistence. + */ + typedef FiltrationType Filtration; + + /*! Instanciation of `DegreePerIntervalT` (persistant intervals degrees) for `DegType`. + */ + typedef DegreePerIntervalT DegreePerInterval; + + /*! Instanciation of `PerHoleT` (full persistant intervals informations) for `DegType`. + */ + typedef PerHoleT PerHole; + + /*! Type for PRIMARY/SECONDARY/CRITICAL labels export + * Encoding used: + * - PRIMARY: -1 + * - SECONDARY: +1 + * - CRITICAL: 0 + */ + typedef std::vector > ExpLabels ; + + /*! Type chains export (column-major chains) + */ + typedef CChain ExpChain ; + + /*! For persistent diagram iterator (returned by *it) + */ + typedef struct { + PerHole hole ; + ExpLabels labelsPSC ; + ExpChain g_chain_sigma, g_chain_tau, fstar_chain_sigma, fstar_chain_tau ; + } PerIntervalInformation ; + +protected: + /** \brief Reference to the filtration used for persistence */ + const Filtration &_f ; + + /** \brief Permutation between indices in the chain complex K and indices along the filtration + * Indices along the filtration provide new indices for cells in each dimension. + */ + std::vector > _K_to_per, _per_to_K ; + + /** \brief Vector of persistent pairs computed */ + std::vector _persist ; + + /** \brief Boolean determining weather or not export homology/cohomology generators associated to persistent pairs + * - If _with_export is true, PSC labels and homology/cohomology generators are stored for each persistent pair of duration (that is, such as the difference between degrees of birth/death) strictly positive. + * - If _with_export is false, only persistent intervals are stored. + */ + bool _with_export ; + + /** \brief Vector of exported PSC labels */ + std::vector _export_labels ; + + /** \brief Vector of exported homology/cohomology generators */ + std::vector > _export_g, _export_fstar ; + + /** Current time (that is, current index) in the filtration */ + int _t ; + /** Current time (that is, current index) along each dimension */ + std::vector _t_dim ; + + /** Bitboard masks in each dimension + * At a given filtration time, only cells already met have a bit set to 1 + */ + std::vector _masks ; + + +private: + // Hide find_pair_A methods of the Hdvf_core class + // Hide A operation of the Hdvf_core class + // This operation is redefined with a different prototype in Hdvf_persistence and set as private since persistence lets no choice for A pairing (rule of the "youngest") + using HDVFParent::find_pair_A; + using HDVFParent::find_pairs_A; + using HDVFParent::A; +public: + /** + * \brief Hdvf_persistence Constructor + * + * Builds an "empty" HDVF_persistence (with all cells critical) associated to the chain complex `K` and the filtration `f`. + * By default, the HDVF option is set to OPT_FULL (full reduction computed) + * + * \param[in] K A chain complex (a model of `AbstractChainComplex`). + * \param[in] f A filtration (a model of `Filtration`). + * \param[in] hdvf_opt Option for HDVF computation (`OPT_BND`, `OPT_F`, `OPT_G` or `OPT_FULL`) + * \param[in] with_export Boolean option to activate or not the export of PSC labels and homology/cohomology generators for of persistent intervals of positive duration. This information is used by vtk exporters. + */ + Hdvf_persistence(const ComplexType& K, const Filtration& f, int hdvf_opt = OPT_BND, bool with_export = false) ; + + /** + * \brief Compute a perfect persistent HDVF. + * + * This method follows the filtration and considers cells one by one. For each of them, it searches the youngest possible cell valid for A (returned by `find_pair_A`), and applies the corresponding A operation. + * By definition of persistent homology, the `Ring` of coefficients *must be* a field. + * + * \param[in] verbose If this parameter is `true`, all intermediate reductions are printed out. + * + * \returns The vector of all `PairCell` paired with A. + */ + std::vector compute_perfect_hdvf(bool verbose = false) + { + bool found; + PairCell pair; + std::vector res ; + for (int i=0; i < _f._filtration.size(); ++i) + { + this->progress_bar(i, _f._filtration.size()) ; + found = false ; + pair = step_persist(found, verbose) ; + if (found) + res.push_back(pair) ; + } + + // Compute "infinite" holes + vector > criticals(this->get_flag(CRITICAL)) ; + for (int q=0; q < criticals.size(); ++q) + { + for (int i : criticals.at(q)) + { + // i : persistence index + const PairCell p = {i, -1, q} ; + const int ki(_per_to_K.at(q).at(i)) ; // K index + const CellDim c(ki,q) ; + const int ti(_f._cell_to_t.at(c)) ; + const DegType di(_f._deg.at(i)) ; + FiltrIndexPerInterval per_int(ti,ti-1) ; + CellDim inf(-1,q+1) ; + CellsPerInterval per_int_cell(c,inf) ; + DegreePerInterval per_deg_int(di,di-1) ; + PerHole hole(per_int, per_int_cell, per_deg_int) ; + _persist.push_back(hole) ; + + // If export is on, store export data + if (_with_export) + export_hdvf_persistence_pair(p) ; + } + } + return res; + } + + /** \brief Export the "with_export" boolean flag. + * If the flag is `true`, homology/cohomology generators and corresponding PSC labels are exported for each persistent interval of positive duration. + */ + bool with_export () { return _with_export ; } + + + /** \brief Compute the (degree) duration of a persistent interval (ie. persistent hole) + * + * By definitions of "default" values, infinite intervals have a duration of -1. + * + * \param[in] hole Persistent interval considered for duration computation + */ + DegType hole_duration (const PerHole hole) const + { + const DegreePerInterval per_int_deg(std::get<2>(hole)) ; + return per_int_deg.second - per_int_deg.first ; + } + + /** \brief Overload of operator<< for Hdvf_persistence. + * + * Prints out finite and infinite persistence intervals. + * + * \param[in] out Reference to an out stream. + * \param[in] per_hdvf Constant reference on the Hdvf_persistence to print. + */ + friend ostream& operator<< (ostream& out, const Hdvf_persistence& per_hdvf) + { + int i = 0 ; + for (PerHole hole : per_hdvf._persist) + { + if (abs(per_hdvf.hole_duration(hole)) > 0) + out << i << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << endl ; + ++i ; + } + return out ; + } + + /** \brief Print informations related to the filtration. + * + * Prints out the filtration and associated permutations (_K_to_per and _per_to_K) between indices of cells in each dimension in the basis of K and indices along the filtration. + * + * \param[in] out Reference to an out stream. + */ + ostream& print_hdvf_persistence_info (ostream& out) + { + out << "Filtration: " << _f << endl ; + out << "_K_to_per and _per_to_K" << endl ; + for (int q=0; q<=this->_K.dim(); ++q) + { + out << "-> dim " << q << endl ; + out << "index_per -(_per_to_K)-> index_K -(_K_to_per)-> index_per" << endl ; + for (int i=0; i_K.nb_cells(q); ++i) + { + const int id_K(_per_to_K.at(q).at(i)) ; + out << i << " -> " << id_K << " -> " << _K_to_per.at(q).at(id_K) << endl ; + } + } + return out ; + } + + + /** + * \brief Export Primary/Secondary/Critical labels (e.g. for vtk export). + * + * The method exports the labels of every cells in each dimension. + * Encoding used: + * - PRIMARY: -1 + * - SECONDARY: +1 + * - CRITICAL: 0 + * + * \returns A vector containing, for each dimension, the vector of labels by cell index. + */ + virtual vector > export_psc_labels () const + { + vector > labels(this->_K.dim()+1) ; + for (int q=0; q<=this->_K.dim(); ++q) + { + for (int i = 0; i_K.nb_cells(q); ++i) + { + const int id_per(_K_to_per.at(q).at(i)) ; + if (id_per <=_t_dim.at(q)) + { + if (this->_flag.at(q).at(id_per) == PRIMARY) + labels.at(q).push_back(-1) ; + else if (this->_flag.at(q).at(id_per) == SECONDARY) + labels.at(q).push_back(1) ; + else if (this->_flag.at(q).at(id_per) == CRITICAL) + labels.at(q).push_back(0) ; + else // NONE + labels.at(q).push_back(2) ; + } + else + labels.at(q).push_back(2) ; + } + } + return labels ; + } + + /** + * \brief Export homology generators associated to `cell` (critical cell) of dimension `q` (e.g. forx@ vtk export). + * + * The method exports the chain \f$g(\sigma)\f$ for \f$\sigma\f$ the cell of index `cell` and dimension `q`. + * + * \returns A column-major chain. + */ + virtual CChain export_homology_chain (int cell, int q) const + { + if ((q<0) || (q>this->_K.dim())) + throw "Error : export_homology_chain with dim out of range" ; + // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) + // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; + + if (this->_hdvf_opt & (OPT_FULL | OPT_G)) + { + // Get g(cell, dim) with per indices + CChain g_cell(OSM::getColumn(this->_G_col.at(q), cell)) ; + // Add 1 to the cell + g_cell[cell] = 1 ; + // Compute the chain with _K indices + CChain g_cell_K(g_cell.dimension()) ; + for (typename CChain::const_iterator it = g_cell.begin(); it != g_cell.end(); ++it) + { + const int i(_per_to_K.at(q).at(it->first)) ; + g_cell_K[i] = it->second ; + } + return g_cell_K ; + } + else + throw "Error : trying to export g_chain without proper HDVF option" ; + } + + /** + * \brief Export cohomology generators associated to `cell` (critical cell) of dimension `q` (used by vtk export). + * + * The method exports the chain \f$f^\star(\sigma)\f$ for \f$\sigma\f$ the cell of index `cell` and dimension `q`. + * + * \returns A column-major chain. + */ + virtual CChain export_cohomology_chain (int cell, int q) const + { + if ((q<0) || (q>this->_K.dim())) + throw "Error : export_homology_chain with dim out of range" ; + // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) + // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; + + if (this->_hdvf_opt & (OPT_FULL | OPT_F)) + { + // Get fstar(cell, dim) with per indices + RChain fstar_cell(OSM::getRow(this->_F_row.at(q), cell)) ; + // Add 1 to the cell + fstar_cell[cell] = 1 ; + // Compute the cofaces of the chain with _K indices + if (q < this->_K.dim()) + { + CChain fstar_cofaces(this->_K.nb_cells(q+1)) ; + for (typename RChain::const_iterator it = fstar_cell.begin(); it != fstar_cell.end(); ++it) + { + // Set the cofaces of indices_K(it->first) in dimension dim+1 + // belonging to _K(_t) + const int i(_per_to_K.at(q).at(it->first)) ; + RChain cofaces(this->_K.cod(i,q)) ; + for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) + { + const int id(it2->first) ; + if (_K_to_per.at(q+1).at(id) <=_t_dim.at(q+1)) + fstar_cofaces[id] = 1 ; + } + } + return fstar_cofaces ; + } + else + return CChain(0) ; + } + else + throw "Error : trying to export g_chain without proper HDVF option" ; + } + + /** \brief Iterator over (finite) persistent intervals. + * + * Iterate over persistent intervals of finite degree duration. + * If `discard_small` is true (which is the default), the iterator discards persistent intervals with a null degree duration (that is, small persistent holes). + */ + struct iterator + { + // Iterator tags + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = PerIntervalInformation; + + /** \brief Iterator constructor + * + * \param[in] per_hdvf Constant reference over the Hdvf_persistence iterated. + * \param[in] i The initial index. + * \param[in] discard_small If `true` (default), only persistent intervals of (strictly) positive degree duration are iterated. Otherwise, all persistent intervals are iterated. + */ + iterator(const Hdvf_persistence& per_hdvf, int i=0, bool discard_small = true) : _i(i), _per_hdvf(per_hdvf), _discard_small(discard_small) + { + if(_discard_small) + { + // Iterate only over holes of duration > 0 + while ((_i<_per_hdvf._persist.size()) && (_per_hdvf.hole_duration(_per_hdvf._persist.at(_i)) == 0)) + { + ++_i ; + } + } + } + + /** \brief Returns the `discard_small` flag. */ + bool has_discard_small() { return _discard_small; } + + // Operators + /** \brief Iterator dereference + * + * \returns A `PerIntervalInformation` structure containing the information of the current persistence interval. + */ + value_type operator*() const + { + PerIntervalInformation res ; + res.hole = _per_hdvf._persist.at(_i) ; + res.labelsPSC = _per_hdvf._export_labels.at(_i) ; + if (_per_hdvf._hdvf_opt & (OPT_G | OPT_FULL)) + { + res.g_chain_sigma = _per_hdvf._export_g.at(_i).first ; + res.g_chain_tau = _per_hdvf._export_g.at(_i).second ; + } + if (_per_hdvf._hdvf_opt & (OPT_F | OPT_FULL)) + { + res.fstar_chain_sigma = _per_hdvf._export_fstar.at(_i).first ; + res.fstar_chain_tau = _per_hdvf._export_fstar.at(_i).second ; + } + return res ; + } + + /** + * \brief Prefix incrementation. Finds next persistent interval. + * + * If `discard_small` is true, the iterator searches next persistent interval with a (strictly) positive degree duration, otherwise, the iterator returns next persistent interval. + * + * \returns The reference to the current iterator. + */ + iterator& operator++() + { + ++_i; + if (_discard_small) + { + // Iterate only over holes of duration > 0 + while ((_i<_per_hdvf._persist.size()) && (_per_hdvf.hole_duration(_per_hdvf._persist.at(_i)) == 0)) + { + ++_i ; + } + } + return *this; + } + + /** + * \brief Postfix incrementation. Finds the next not-null index. + * \returns The pre-incremented iterator. + */ + iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } + + /** + * \brief Equality check. + * \returns True if the indices are equal. + */ + friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; + + /** + * \brief Inequality check. + * \returns True if the indices are different. + */ + friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; + + private: + int _i ; // Index along _persist + const Hdvf_persistence& _per_hdvf ; // per_hdvf iterated + const bool _discard_small ; + }; + + /** + * \brief Iterator to the beginning of persistent intervals. + * + * \param[in] discard_small If `true`, the iterator visits only persistent intervals of (strictly) positive degree duration. Otherwise, visit all persistent intervals. + * + * \returns The iterator to the beginning of the chains indices. + */ + iterator begin(bool discard_small = true) { return iterator(*this, 0, discard_small) ; } + + /** + * \brief Iterator to the ending of the chains indices. + * + * \returns The iterator to the ending of the chains indices. + */ + iterator end() { return iterator(*this, _persist.size()) ; } + +private: + /** \brief Export current persistent pair informations. + * + * This method exports and saves PSC labels, homology and cohomology generators of the current persistent pair `p` to corresponding private vectors (_export_label, _export_g, _export_fstar). + * The method is invoqued on the result of `find_pair_A` before pairing cells with the A operation. + */ + void export_hdvf_persistence_pair(PairCell p) + { + // Export labels + ExpLabels labels(this->export_psc_labels()) ; + _export_labels.push_back(labels) ; + // Export g (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_G)) + { + CChain chain_sigma(export_homology_chain(p.sigma, p.dim)) ; + CChain chain_tau ; + if (p.tau >= 0) + chain_tau = export_homology_chain(p.tau, p.dim+1) ; + _export_g.push_back(std::pair(chain_sigma, chain_tau)) ; + } + // Export fstar (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_F)) + { + CChain chain_sigma(export_cohomology_chain(p.sigma, p.dim)) ; + CChain chain_tau ; + if (p.tau >= 0) + chain_tau = export_cohomology_chain(p.tau, p.dim+1) ; + _export_fstar.push_back(std::pair(chain_sigma, chain_tau)) ; + } + } + + /** \brief Export empty persistent pair. + * Export empty persistence information (for "small" discarded pairs). + */ + void export_hdvf_persistence_pair() + { + // Export labels + ExpLabels labels ; + _export_labels.push_back(labels) ; + // Export g (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_G)) + { + CChain chain_sigma, chain_tau ; + _export_g.push_back(std::pair(chain_sigma, chain_tau)) ; + } + // Export fstar (according to options) + if (this->_hdvf_opt & (OPT_FULL | OPT_F)) + { + CChain chain_sigma, chain_tau ; + _export_fstar.push_back(std::pair(chain_sigma, chain_tau)) ; + } + } + + /** + * \brief Find a valid PairCell for A for persistent homology. + * + * The function searches, at a given time \f$t\f$ in the filtration, the youngest critical cell \f$\gamma'\f$ forming a valid pair with the cell \f$\gamma\f$. Hence, \f$(\gamma', \gamma)\f$ valid pair is a valid pair + * (ie. such that \f$\langle \partial(\gamma), \gamma' \rangle\f$ invertible). + * + * \param[in] found Reference to a boolean variable. The method sets `found` to `true` if a valid pair is found, `false` otherwise. + */ + PairCell find_pair_A(bool &found) ; + + /** + * \brief Step forward along the filtration. + * + * Searches a possible persistent pair for A with `find_pair_A`, apply A and update internal structures. + */ + PairCell step_persist(bool& found, bool verbose = false) ; +} ; + + +template +Hdvf_persistence::Hdvf_persistence(const ComplexType& K, const FiltrationType& f, int hdvf_opt, bool with_export) : Hdvf_core(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1) +{ + // Initialisation of _t_dim, _K_to_per and _per_to_K + _t_dim.resize(this->_K.dim()+1, 0) ; + _K_to_per.resize(this->_K.dim()+1) ; + _per_to_K.resize(this->_K.dim()+1) ; + for (int q=0; q<=this->_K.dim(); ++q) + { + _K_to_per.at(q).resize(this->_K.nb_cells(q)) ; + _t_dim.at(q) = -1 ; + } + + for (int i = 0; i<_f._filtration.size(); ++i) + { + const CellDim c(_f._filtration.at(i)); + const int q(c.second) ; + const int ind_K_i(c.first) ; + const int ind_per_i(_per_to_K.at(q).size()) ; + _per_to_K.at(q).push_back(ind_K_i) ; + _K_to_per.at(q).at(ind_K_i) = ind_per_i ; + } + + // Init _masks + _masks.resize(this->_K.dim()+1) ; + for (int q=0; q_K.dim()+1; ++q) + { + _masks.at(q) = OSM::Bitboard(this->_K.nb_cells(q)) ; + } + + // Init boundary matrices + vector _DD_per(this->_K.dim()+1) ; + + // Copy _DD_col with filtration order (for dimensions q>0) + for (int q = 0 ; q <= this->_K.dim(); ++q) + { + const std::pair s(this->_DD_col.at(q).dimensions()) ; + _DD_per.at(q) = CMatrix(s.first, s.second) ; + } + // Set empty mask for _DD_per[0] + _DD_per.at(0).complement(); + + for (int q = 1 ; q <= this->_K.dim(); ++q) + { + // Cross _DD_col.at(q) and set _DD_per.at(q) coefficients on the fly + for (OSM::Bitboard::iterator it_col = this->_DD_col.at(q).begin(); it_col != this->_DD_col.at(q).end(); ++it_col) + { + const int j(*it_col) ; + const CChain& col(OSM::cgetColumn(this->_DD_col.at(q), j)) ; + for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) + { + const int i(it->first) ; + const CoefficientType v(it->second) ; + // Cells in the _K basis : i(dim q-1) / j(dim q) + // Convert to indices in the persistent order + const int pi(_K_to_per.at(q-1).at(i)), pj(_K_to_per.at(q).at(j)) ; + _DD_per.at(q).set_coef(pi, pj, v) ; + } + } + } + this->_DD_col = _DD_per ; + + // Init _DD_col mask (empty for all cells) + for (int q = 1 ; q <= this->_K.dim(); ++q) + this->_DD_col.at(q).set_sub(_masks.at(q)) ; +} + +template +PairCell Hdvf_persistence::find_pair_A(bool &found) +{ + PairCell p ; + // Get current cell (in the basis K) + CellDim c(_f._filtration.at(_t)) ; + const int q(c.second), sigma(_K_to_per.at(q).at(c.first)) ; + // Search for pairing + found = false; + + if (q >= 1) + { + // Compute bounded max while iterating over the Chain + const CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), sigma)) ; + std::size_t tmax = _t_dim.at(q-1) ; + std::size_t i ; + for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) + { + if ((it->first <= tmax) && (abs(it->second) == 1)) // possible pairing + { + if (!found) // for first cell met + { + found = true ; + i = it->first ; + } + else // update the i with the maximum cell index (persistance) + { + if (it->first > i) + i = it->first ; + } + } + } + if (found) + { + p.sigma = i ; + p.tau = sigma ; + p.dim = q-1 ; + } + } + return p; +} + +template +PairCell Hdvf_persistence::step_persist(bool& found, bool verbose) +{ + // Compute next persistent pair + + ++_t ; // Step forward in the filtration + const int q_current(_f._filtration.at(_t).second) ; // Get the dimension of the new current cell + ++_t_dim.at(q_current) ; // Update time in the dimension of the current cell + _masks.at(q_current).setOn(_t_dim.at(q_current)) ; // Update mask accordingly + this->_DD_col.at(q_current).set_bitOn(_t_dim.at(q_current)) ; // Update _DD_col mask + + // Search for pairing +// bool found ; + PairCell p(find_pair_A(found)) ; + if (found) + { + // Corresponding persistent interval + const int q(p.dim) ; + // indices of both cells in the _K basis + const int ki(_per_to_K.at(q).at(p.sigma)), kj(_per_to_K.at(q+1).at(p.tau)) ; + CellDim ci(ki, q), cj(kj, q+1) ; // cells of the interval - in the K basis + int ti(_f._cell_to_t.at(ci)), tj(_f._cell_to_t.at(cj)) ; // times of the interval + FiltrIndexPerInterval interval(ti, tj) ; + CellsPerInterval interval_cells(ci, cj) ; + DegreePerInterval interval_deg(_f._deg.at(ti), _f._deg.at(tj)) ; + PerHole hole(interval, interval_cells, interval_deg) ; + // Add this interval + _persist.push_back(hole) ; + + // If export is on, store export data for significant persistant intervals + if (_with_export) + { + if ((interval_deg.second-interval_deg.first)>0) + export_hdvf_persistence_pair(p) ; + else + export_hdvf_persistence_pair() ; + } + + + // Prepare for next step + this->A(p.sigma, p.tau, p.dim) ; // Update the reduction + if (verbose) + { + std::cout << "A : " << p.sigma << " - " << p.tau << " (dim " << p.dim << ")" << std::endl ; + this->print_matrices(std::cout) ; + } + } +} + +} /* end namespace HDVF */ +} /* end namespace CGAL */ + +#endif // CGAL_HDVF_PERSISTENCE_H diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index 3e40a0c7935a..bf50468f093a 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -9,7 +9,7 @@ #include "Simplex.hpp" #include "Abstract_simplicial_chain_complex.hpp" #include "Hdvf_core.h" -#include "per_hdvf.hpp" +#include "Hdvf_persistence.h" #include "sub_chain_complex.hpp" #include "tools_io.hpp" #include "CGAL/OSM/OSM.hpp" @@ -158,13 +158,13 @@ class Duality_simplicial_complex_tools { /** \brief Export persistent information to vtk files */ -template -void Per_Simp_output_vtk (Hdvf_persistence, DegType> &per_hdvf, Simplicial_chain_complex &complex, string filename = "per") +template +void Per_Simp_output_vtk (Hdvf_persistence, DegType, FiltrationType> &per_hdvf, Simplicial_chain_complex &complex, string filename = "per") { if (!per_hdvf.with_export()) throw("Cannot export persistent generators to vtk: with_export is off!") ; - using perHDVFType = Hdvf_persistence, DegType> ; + using perHDVFType = Hdvf_persistence, DegType, FiltrationType> ; using ComplexType = Simplicial_chain_complex ; using PerHole = PerHoleT ; // Iterate over persistence diagram (iterator over non zero intervals) @@ -173,7 +173,7 @@ void Per_Simp_output_vtk (Hdvf_persistence " << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << std::endl ; @@ -184,7 +184,7 @@ void Per_Simp_output_vtk (Hdvf_persistence(hole_data.hole)) ; + const CellsPerInterval per_int_cells(std::get<1>(hole_data.hole)) ; // Export homology generators (g) if (per_hdvf.get_hdvf_opts() & (OPT_FULL | OPT_G)) { diff --git a/HDVF/include/CGAL/HDVF/per_hdvf.hpp b/HDVF/include/CGAL/HDVF/per_hdvf.hpp deleted file mode 100644 index 06a1216d0540..000000000000 --- a/HDVF/include/CGAL/HDVF/per_hdvf.hpp +++ /dev/null @@ -1,929 +0,0 @@ -// Copyright (c) 2025 LIS Marseille (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Alexandra Bac - -#ifndef PER_HOM_HPP -#define PER_HOM_HPP - -#include -#include -#include -#include -#include -#include "CGAL/OSM/OSM.hpp" -#include "CGAL/HDVF/SubSparseMatrix.hpp" -#include "CGAL/HDVF/Hdvf_core.h" - -/** - * \class Filtration class - * \brief Implementation of the filtration. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ComplexType The type of complex (default is SimpComplex) - * - * \author Bac A. - * \version 0.1.0 - * \date 22/08/2024 - */ - -namespace CGAL { -namespace HDVF { - -template -class Filtration -{ -public: - typedef std::pair CellDim ; - typedef struct zFiltration_iter_type { - CellDim cell_dim ; - _DegType degree ; - } Filtration_iter_type ; - -protected: - const _ComplexType& _K ; - std::vector _filtration ; - std::vector<_DegType> _deg ; - - // Cell -> (filtration index, basis index according to the filtration) - std::map _cell_to_t ; - - typedef OSM::SparseMatrix<_CoefType,OSM::COLUMN> CMatrix ; - typedef OSM::SparseMatrix<_CoefType,OSM::ROW> RMatrix ; - typedef OSM::Chain<_CoefType,OSM::COLUMN> CChain ; - typedef OSM::Chain<_CoefType,OSM::ROW> RChain ; -public: - // Constructor from a filtration on all cells - Filtration(const _ComplexType& K, const std::vector& filtration, const std::vector<_DegType>& deg) : - _K(K), _filtration(filtration), _deg(deg) - { - check_filtration() ; - build_filtration_structure() ; - } - - // Constructor of an empty filtration - Filtration(const _ComplexType& K) : _K(K) - { - } - - // Copy constructor - Filtration(const Filtration& f) : _K(f._K), _filtration(f._filtration), _cell_to_t(f._cell_to_t) {} - - // Build lower (resp. upper)-star filtration - // From the degrees of vertices - void star_filtration(const std::vector<_DegType>& deg, bool lower = true) ; - // From a function over vertices - void star_filtration(std::function<_DegType(int)>& deg_fun, bool lower = true) ; - - // iterator (iterate a filtration) - struct iterator - { - // Iterator tags - using iterator_category = std::forward_iterator_tag; - using difference_type = std::ptrdiff_t; - using value_type = Filtration_iter_type; - - // Iterator constructors - iterator(const Filtration& f, int i=0) : _i(i), _f(f) {} - - // Operators - value_type operator*() const - { - Filtration_iter_type res ; - res.cell_dim = _f._filtration.at(_i) ; - res.degree = _f._deg.at(_i) ; - return res ; - } - - int time () { return _i ; } - CellDim cell_dim () { return _f._filtration.at(_i); } - _DegType degree () { return _f._deg.at(_i); } - - // Prefix increment - // Find next hole of positive duration - iterator& operator++() - { - ++_i; - return *this; - } - - // Postfix increment - iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } - - friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; - friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; - - private: - int _i ; // Index along _persist - const Filtration& _f ; // Filtration iterated - }; - iterator begin() { return iterator(*this, 0) ; } - iterator end() { return iterator(*this, _filtration.size()) ; } - - // getters - CellDim get_cell_dim (int i) { return _filtration.at(i); } - _DegType get_degree (int i) { return _deg.at(i); } - - // Output filtration - friend ostream & operator<<(ostream & out, const Filtration &f) - { - const int N(f._filtration.size()) ; - for (int i=0; i (" << f._filtration.at(i).first << "- dim " << f._filtration.at(i).second << " , " << f._deg.at(i) << ") " << std::endl ; - } - return out ; - } - -protected: - void build_filtration_structure() ; - bool check_filtration() ; - - template - friend class Hdvf_persistence ; -}; - -template -void Filtration<_CoefType, _ComplexType, _DegType>::build_filtration_structure() -{ - for (int i = 0; i<_filtration.size(); ++i) - { - const CellDim c(_filtration.at(i)) ; - // c : filtration index i, index in the basis reordered by filtration : j - _cell_to_t[c] = i ; - } -} - -template -bool Filtration<_CoefType, _ComplexType, _DegType>::check_filtration() -{ - bool valid = true ; - for (int i=0; i<_filtration.size() && valid; ++i) - { - if (i>0) - valid = valid & (_deg.at(i) >= _deg.at(i-1)) ; - CellDim c(_filtration.at(i)) ; - cout << i << " -> " << c.first << " dim "<< c.second << endl ; - const int q = c.second ; - if (q>0) - { - CChain dc = _K.d(c.first, q) ; - cout << "bnd : " << dc << endl ; - for (typename CChain::iterator it = dc.begin(); it != dc.end() && valid; ++it) - { - // Faces of c - const CellDim face(it->first,q-1) ; - // Check if the face c belongs to the filtration - auto it_face(_cell_to_t.find(face)) ; - valid = valid & (it_face != _cell_to_t.end()) ; - if (!valid) - cout << "face not found" << endl ; - if (it_face != _cell_to_t.end()) - valid = valid & (_cell_to_t[face] < i) ; - if (!valid) - cout << "face " << it->first << " at time : " << _cell_to_t[face] << " with i : " << i << endl ; - } - } - if (!valid) - cout << "check failed : " << i << endl ; - } - return valid ; -} - -template -void Filtration<_CoefType, _ComplexType, _DegType>::star_filtration(const std::vector<_DegType> °, bool lower) -{ - if (deg.size() != _K.nb_cells(0)) - throw "Star filtration error : deg should provide one value by vertex" ; - - // Create filtration and degrees for all cells according to deg - // -> lower star: maximum degree of vertices - // -> upper star: minimum degree of vertices - std::vector tmp_filtration ; - std::vector<_DegType> tmp_deg ; - std::vector tmp_perm ; - // Init tmp_perm (for vertices) - // cout << "vertices degrees : " << endl ; - for (int i=0; i " << deg.at(i) << endl ; - } - // For all other cells - for (int q=1; q<=_K.dim(); ++q) - { - for (int i=0; i<_K.nb_cells(q); ++i) - { - tmp_filtration.push_back(CellDim(i,q)) ; - - // Compute corresponding degree - // Vertices of the cell - // TODO : bottom_faces should produce a set - std::vector verts(_K.bottom_faces(i,q)) ; - // cout << "cell " << i << " dim " << q << " : " << verts ; - // Compute the degree of the cell - _DegType d = deg.at(verts.at(0)) ; - for (int j=1; j d) - d = tmp_d ; - } - else // upper - { - if (tmp_d < d) - d = tmp_d ; - } - } - tmp_deg.push_back(d) ; - tmp_perm.push_back(tmp_perm.size()) ; - // cout << " -> " << d << endl ; - } - } - // Sort filtration - - // Create sorting function : lexicographic order over (deg, dim) - // Test if cell i < cell j - auto f_sort = [&tmp_filtration, &tmp_deg] (int i, int j) - { - // degree of i is lower than degree of j or (they are equal and the dimension of i is lower than the dimension of j) - return ((tmp_deg[i] < tmp_deg[j]) || ((tmp_deg[i] == tmp_deg[j]) && (tmp_filtration[i].second < tmp_filtration[j].second))) ; - } ; - // Sort -> create the right permutation - std::sort(tmp_perm.begin(), tmp_perm.end(), f_sort) ; - // Insert cells in the filtration and degrees accordingly - for (int i=0; i -void Filtration<_CoefType, _ComplexType, _DegType>::star_filtration(std::function<_DegType(int)>& deg_fun, bool lower) -{ - std::vector<_DegType> deg ; - for (int i=0; i<_K.nb_cells(0); ++i) - { - deg.push_back(deg_fun(i)) ; - } - star_filtration(deg) ; -} - -/* Standard functions for lower star filtration */ -/* DegType = double */ - -//std::function deg_fun_x = [&complex](int i) -//{ -// std::vector Xi(complex.get_vertex_coords(i)) ; -// return (Xi.at(0)) ; -//} ; -// -//std::function deg_fun_z = [&complex](int i) -//{ -// std::vector Xi(complex.get_vertex_coords(i)) ; -// return (Xi.at(2)) ; -//} ; - -std::function&)> f_x = [](const std::vector& v) -{ - return (v.at(0)) ; -} ; - -std::function&)> f_y = [](const std::vector& v) -{ - return (v.at(1)) ; -} ; - -std::function&)> f_z = [](const std::vector& v) -{ - return (v.at(2)) ; -} ; - -template -std::function deg_fun (const ComplexType& complex, std::function&)>& f) -{ - std::function deg_fun_f = [&complex, &f](int i) - { - const std::vector Xi(complex.get_vertex_coords(i)) ; - // cout << "deg_fun_f, i: " << i ; - // cout << " Xi : " ; - // for (double c : Xi) - // cout << c << " " ; - // cout << " - degree: " << f(Xi) << endl ; - return f(Xi) ; - } ; - return deg_fun_f ; -} - - -/* ************************************************************************ */ - -/** - * \class Persistent HDVF - * \brief Implementation of persistent HDVF (inherits HDVF). - * - * The Hdvf_persistence class contains all functions to build persistent HDVF and create perfect persistent HDVF. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ComplexType The type of complex (default is SimpComplex) - * - * \author Bac A. - * \version 0.1.0 - * \date 22/08/2024 - */ - -// Persistent interval types -typedef std::pair PerInterval ; -typedef std::pair CellDim ; -typedef std::pair PerIntervalCells ; - -template -using PerDegIntervalT = std::pair<_DegType,_DegType> ; - -template -using PerHoleT = std::tuple > ; - -template -ostream& operator<< (ostream& out, const PerHoleT<_DegType>& hole) -{ - // time (cell, dim) -> time (cell, dim) / time to live - const PerInterval per_int(std::get<0>(hole)) ; - const PerIntervalCells per_int_cells(std::get<1>(hole)) ; - const PerDegIntervalT<_DegType> per_int_deg(std::get<2>(hole)) ; - - // const _DegType duration((per_int_deg.second>=0)?per_int_deg.second-per_int_deg.first:per_int_deg.second) ; - const _DegType duration(per_int_deg.second-per_int_deg.first) ; - if (duration >= 0) // finite interval - { - out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; - out << per_int.second << " (" << per_int_cells.second.first << ", " << per_int_cells.second.second << ") / duration: " << duration << "]" << endl ; - } - else - { - out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; - out << "inf]" << endl ; - } - return out ; -} - - -template -class Hdvf_persistence : public Hdvf_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix> -{ - // Matrices types - typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; - typedef OSM::Chain<_CoefficientType, OSM::ROW> RChain; - typedef OSM::SubSparseMatrix<_CoefficientType, OSM::COLUMN> CMatrix; - typedef OSM::SubSparseMatrix<_CoefficientType, OSM::ROW> RMatrix; - - // HDVF type - typedef Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; - - // Persistence diagram types - typedef PerDegIntervalT<_DegType> PerDegInterval; - typedef PerHoleT<_DegType> PerHole; - -public: - // Export types - typedef std::vector > ExpLabels ; - typedef CChain ExpChain ; - - // For persistent diagram iterator - typedef struct zexp_infos { - PerHole hole ; - ExpLabels labelsPSC ; - ExpChain g_chain_sigma, g_chain_tau, fstar_chain_sigma, fstar_chain_tau ; - } Exp_infos ; - -protected: - const Filtration<_CoefficientType, _ComplexType, _DegType> &_f ; - // Permutation between K indices and persistent indices (order given by the filtration) - std::vector > _K_to_per, _per_to_K ; - // Persistent pairs - std::vector _persist ; - // Export data - bool _with_export ; - std::vector _export_labels ; - std::vector > _export_g, _export_fstar ; - - // Current "time" in the filtration - int _t ; - // Current "times" along each dimension - std::vector _t_dim ; - // Corresponding masks (for SubSparseMatrices) - std::vector _masks ; - // Persistence computed - bool _computation_over ; - -public: - /** \brief Hdvf_persistence Constructor */ - Hdvf_persistence(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt = OPT_BND, bool with_export = false) ; - - // Persistence step - PairCell findNextPair(bool &found) ; - - void stepPersist() ; - - void computePersistentHomology() - { - for (int i=0; i < _f._filtration.size(); ++i) - { - this->progress_bar(i, _f._filtration.size()) ; - stepPersist() ; - } - - // Compute "infinite" holes - vector > criticals(this->get_flag(CRITICAL)) ; - for (int q=0; q < criticals.size(); ++q) - { - for (int i : criticals.at(q)) - { - // i : persistence index - const PairCell p = {i, -1, q} ; - const int ki(_per_to_K.at(q).at(i)) ; // K index - const CellDim c(ki,q) ; - const int ti(_f._cell_to_t.at(c)) ; - const _DegType di(_f._deg.at(i)) ; - PerInterval per_int(ti,ti-1) ; - CellDim inf(-1,q+1) ; - PerIntervalCells per_int_cell(c,inf) ; - PerDegInterval per_deg_int(di,di-1) ; - PerHole hole(per_int, per_int_cell, per_deg_int) ; - _persist.push_back(hole) ; - - // If export is on, store export data - if (_with_export) - export_perHDVF(p) ; - } - } - _computation_over = true ; - } - - bool with_export () { return _with_export ; } - - /* ********** */ - - _DegType hole_duration (const PerHole hole) const - { - const PerDegInterval per_int_deg(std::get<2>(hole)) ; - return per_int_deg.second - per_int_deg.first ; - } - - friend ostream& operator<< (ostream& out, const Hdvf_persistence& per_hdvf) - { - int i = 0 ; - for (PerHole hole : per_hdvf._persist) - { - if (abs(per_hdvf.hole_duration(hole)) > 0) - out << i << " --- duration : " << per_hdvf.hole_duration(hole) << " -- " << hole << endl ; - ++i ; - // // time (cell, dim) -> time (cell, dim) / time to live - // const PerInterval per_int(std::get<0>(hole)) ; - // const PerIntervalCells per_int_cells(std::get<1>(hole)) ; - // const PerDegInterval per_int_deg(std::get<2>(hole)) ; - // - // const _DegType duration((per_int_deg.second>=0)?per_int_deg.second-per_int_deg.first:-per_int_deg.second) ; - // if (duration >= 0) // finite interval - // { - // out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; - // out << per_int.second << " (" << per_int_cells.second.first << ", " << per_int_cells.second.second << ") / duration: " << duration << "]" << endl ; - // } - // else - // { - // out << "[" << per_int.first << " (" << per_int_cells.first.first << ", " << per_int_cells.first.second << ") -> " ; - // out << "inf]" << endl ; - // } - } - return out ; - } - - ostream& print_perHDVFInfo (ostream& out) - { - out << "Filtration: " << _f << endl ; - out << "_K_to_per and _per_to_K" << endl ; - for (int q=0; q<=this->_K.dim(); ++q) - { - out << "-> dim " << q << endl ; - out << "index_per -(_per_to_K)-> index_K -(_K_to_per)-> index_per" << endl ; - for (int i=0; i_K.nb_cells(q); ++i) - { - const int id_K(_per_to_K.at(q).at(i)) ; - out << i << " -> " << id_K << " -> " << _K_to_per.at(q).at(id_K) << endl ; - } - } - return out ; - } - - - // Method to generate PSC labels for visualisation - virtual vector > export_psc_labels () const - { - vector > labels(this->_K.dim()+1) ; - for (int q=0; q<=this->_K.dim(); ++q) - { - for (int i = 0; i_K.nb_cells(q); ++i) - { - const int id_per(_K_to_per.at(q).at(i)) ; - if (id_per <=_t_dim.at(q)) - { - if (this->_flag.at(q).at(id_per) == PRIMARY) - labels.at(q).push_back(-1) ; - else if (this->_flag.at(q).at(id_per) == SECONDARY) - labels.at(q).push_back(1) ; - else if (this->_flag.at(q).at(id_per) == CRITICAL) - labels.at(q).push_back(0) ; - else // NONE - labels.at(q).push_back(2) ; - } - else - labels.at(q).push_back(2) ; - } - } - return labels ; - } - - // Method to export a G chain for visualisation - // with cell indices in initial _K - virtual CChain export_homology_chain (int cell, int dim) const - { - if ((dim<0) || (dim>this->_K.dim())) - throw "Error : export_homology_chain with dim out of range" ; - // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) - // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; - - if (this->_hdvf_opt & (OPT_FULL | OPT_G)) - { - // Get g(cell, dim) with per indices - CChain g_cell(OSM::getColumn(this->_G_col.at(dim), cell)) ; - // Add 1 to the cell - g_cell[cell] = 1 ; - // Compute the chain with _K indices - CChain g_cell_K(g_cell.dimension()) ; - for (typename CChain::const_iterator it = g_cell.begin(); it != g_cell.end(); ++it) - { - const int i(_per_to_K.at(dim).at(it->first)) ; - g_cell_K[i] = it->second ; - } - return g_cell_K ; - } - else - throw "Error : trying to export g_chain without proper HDVF option" ; - } - - // Method to export a FSTAR chain for visualisation - // with cell indices in initial _K - virtual CChain export_cohomology_chain (int cell, int dim) const - { - if ((dim<0) || (dim>this->_K.dim())) - throw "Error : export_homology_chain with dim out of range" ; - // if (_K_to_per.at(dim).at(cell) > _t_dim.at(dim)) - // throw "Error : export_homology_chain with 'future' cell wrt persistence" ; - - if (this->_hdvf_opt & (OPT_FULL | OPT_F)) - { - // Get fstar(cell, dim) with per indices - RChain fstar_cell(OSM::getRow(this->_F_row.at(dim), cell)) ; - // Add 1 to the cell - fstar_cell[cell] = 1 ; - // Compute the cofaces of the chain with _K indices - // Compute the cofaces - if (dim < this->_K.dim()) - { - CChain fstar_cofaces(this->_K.nb_cells(dim+1)) ; - for (typename RChain::const_iterator it = fstar_cell.begin(); it != fstar_cell.end(); ++it) - { - // Set the cofaces of indices_K(it->first) in dimension dim+1 - // belonging to _K(_t) - const int i(_per_to_K.at(dim).at(it->first)) ; - RChain cofaces(this->_K.cod(i,dim)) ; - for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - { - const int id(it2->first) ; - if (_K_to_per.at(dim+1).at(id) <=_t_dim.at(dim+1)) - fstar_cofaces[id] = 1 ; - } - } - return fstar_cofaces ; - } - else - return CChain(0) ; - } - else - throw "Error : trying to export g_chain without proper HDVF option" ; - } - - // Export method (at a given time, for a pair of critical cells - before pairing) - void export_perHDVF(PairCell p) - { - // Export labels - ExpLabels labels(this->export_psc_labels()) ; - _export_labels.push_back(labels) ; - // Export g (according to options) - if (this->_hdvf_opt & (OPT_FULL | OPT_G)) - { - CChain chain_sigma(export_homology_chain(p.sigma, p.dim)) ; - CChain chain_tau ; - if (p.tau >= 0) - chain_tau = export_homology_chain(p.tau, p.dim+1) ; - _export_g.push_back(std::pair(chain_sigma, chain_tau)) ; - } - // Export fstar (according to options) - if (this->_hdvf_opt & (OPT_FULL | OPT_F)) - { - CChain chain_sigma(export_cohomology_chain(p.sigma, p.dim)) ; - CChain chain_tau ; - if (p.tau >= 0) - chain_tau = export_cohomology_chain(p.tau, p.dim+1) ; - _export_fstar.push_back(std::pair(chain_sigma, chain_tau)) ; - } - } - // Empty export method (for persistent intervals below the threshold) - void export_perHDVF() - { - // Export labels - ExpLabels labels ; - _export_labels.push_back(labels) ; - // Export g (according to options) - if (this->_hdvf_opt & (OPT_FULL | OPT_G)) - { - CChain chain_sigma, chain_tau ; - _export_g.push_back(std::pair(chain_sigma, chain_tau)) ; - } - // Export fstar (according to options) - if (this->_hdvf_opt & (OPT_FULL | OPT_F)) - { - CChain chain_sigma, chain_tau ; - _export_fstar.push_back(std::pair(chain_sigma, chain_tau)) ; - } - } - - struct iterator - { - // Iterator tags - using iterator_category = std::forward_iterator_tag; - using difference_type = std::ptrdiff_t; - using value_type = Exp_infos; - using pointer = Exp_infos*; // or also value_type* - - // Iterator constructors - iterator(const Hdvf_persistence& per_hdvf, int i=0) : _i(i), _per_hdvf(per_hdvf) - { - if (_i == 0) - { - // Iterate over holes of duration > 0 - while ((_i<_per_hdvf._persist.size()) && (_per_hdvf.hole_duration(_per_hdvf._persist.at(_i)) == 0)) - { - ++_i ; - } - } - } ; - - // Operators - value_type operator*() const - { - Exp_infos res ; - res.hole = _per_hdvf._persist.at(_i) ; - res.labelsPSC = _per_hdvf._export_labels.at(_i) ; - if (_per_hdvf._hdvf_opt & (OPT_G | OPT_FULL)) - { - res.g_chain_sigma = _per_hdvf._export_g.at(_i).first ; - res.g_chain_tau = _per_hdvf._export_g.at(_i).second ; - } - if (_per_hdvf._hdvf_opt & (OPT_F | OPT_FULL)) - { - res.fstar_chain_sigma = _per_hdvf._export_fstar.at(_i).first ; - res.fstar_chain_tau = _per_hdvf._export_fstar.at(_i).second ; - } - return res ; - } - pointer operator->() - { - Exp_infos res ; - res.hole = _per_hdvf._persist.at(_i) ; - res.labelsPSC = _per_hdvf._export_labels.at(_i) ; - if (_per_hdvf._hdvf_opt & (OPT_G | OPT_FULL)) - { - res.g_chain_sigma = _per_hdvf._export_g.at(_i).first ; - res.g_chain_tau = _per_hdvf._export_g.at(_i).second ; - } - if (_per_hdvf._hdvf_opt & (OPT_F | OPT_FULL)) - { - res.fstar_chain_sigma = _per_hdvf._export_fstar.at(_i).first ; - res.fstar_chain_tau = _per_hdvf._export_fstar.at(_i).second ; - } - return res ; - } - - // Prefix increment - // Find next hole of positive duration - iterator& operator++() - { - ++_i; - while ((_i<_per_hdvf._persist.size()) && (_per_hdvf.hole_duration(_per_hdvf._persist.at(_i)) == 0)) - { - ++_i ; - } - return *this; - } - - // Postfix increment - iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } - - friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; - friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; - - private: - int _i ; // Index along _persist - const Hdvf_persistence& _per_hdvf ; // per_hdvf iterated - }; - iterator begin() { return iterator(*this, 0) ; } - iterator end() { return iterator(*this, _persist.size()) ; } -} ; - - -template -Hdvf_persistence<_CoefficientType, _ComplexType, _DegType>::Hdvf_persistence(const _ComplexType& K, const Filtration<_CoefficientType, _ComplexType, _DegType>& f, int hdvf_opt, bool with_export) : Hdvf_core<_CoefficientType,_ComplexType, OSM::Chain, OSM::SubSparseMatrix>(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1), _computation_over(false) -{ - // Initialisation of _t_dim, _K_to_per and _per_to_K - _t_dim.resize(this->_K.dim()+1, 0) ; - _K_to_per.resize(this->_K.dim()+1) ; - _per_to_K.resize(this->_K.dim()+1) ; - for (int q=0; q<=this->_K.dim(); ++q) - { - _K_to_per.at(q).resize(this->_K.nb_cells(q)) ; - _t_dim.at(q) = -1 ; - } - - for (int i = 0; i<_f._filtration.size(); ++i) - { - const CellDim c(_f._filtration.at(i)); - const int q(c.second) ; - const int ind_K_i(c.first) ; - const int ind_per_i(_per_to_K.at(q).size()) ; - _per_to_K.at(q).push_back(ind_K_i) ; - _K_to_per.at(q).at(ind_K_i) = ind_per_i ; - } - - // Init _masks - _masks.resize(this->_K.dim()+1) ; - for (int q=0; q_K.dim()+1; ++q) - { - _masks.at(q) = OSM::Bitboard(this->_K.nb_cells(q)) ; - } - - // Init boundary matrices - vector _DD_per(this->_K.dim()+1) ; - - // Copy _DD_col with filtration order (for dimensions q>0) - for (int q = 0 ; q <= this->_K.dim(); ++q) - { - const std::pair s(this->_DD_col.at(q).dimensions()) ; - _DD_per.at(q) = CMatrix(s.first, s.second) ; - } - // Set empty mask for _DD_per[0] - _DD_per.at(0).complement(); - - for (int q = 1 ; q <= this->_K.dim(); ++q) - { - // Cross _DD_col.at(q) and set _DD_per.at(q) coefficients on the fly - for (OSM::Bitboard::iterator it_col = this->_DD_col.at(q).begin(); it_col != this->_DD_col.at(q).end(); ++it_col) - { - const int j(*it_col) ; - const CChain& col(OSM::cgetColumn(this->_DD_col.at(q), j)) ; - for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) - { - const int i(it->first) ; - const _CoefficientType v(it->second) ; - // Cells in the _K basis : i(dim q-1) / j(dim q) - // Convert to indices in the persistent order - const int pi(_K_to_per.at(q-1).at(i)), pj(_K_to_per.at(q).at(j)) ; - _DD_per.at(q).set_coef(pi, pj, v) ; - } - } - } - this->_DD_col = _DD_per ; - - // Init _DD_col mask (empty for all cells) - for (int q = 1 ; q <= this->_K.dim(); ++q) - this->_DD_col.at(q).set_sub(_masks.at(q)) ; -} - -template -PairCell Hdvf_persistence<_CoefficientType, _ComplexType, _DegType>::findNextPair(bool &found) -{ - PairCell p ; - // Get current cell (in the basis K) - CellDim c(_f._filtration.at(_t)) ; - const int q(c.second), sigma(_K_to_per.at(q).at(c.first)) ; - // Search for pairing - found = false; - - if (q >= 1) - { - // Compute bounded max while iterating over the Chain - const CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), sigma)) ; - std::size_t tmax = _t_dim.at(q-1) ; - std::size_t i ; - for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) - { - if ((it->first <= tmax) && (abs(it->second) == 1)) // possible pairing - { - if (!found) // for first cell met - { - found = true ; - i = it->first ; - } - else // update the i with the maximum cell index (persistance) - { - if (it->first > i) - i = it->first ; - } - } - } - if (found) - { - p.sigma = i ; - p.tau = sigma ; - p.dim = q-1 ; - } - } - return p; -} - -template -void Hdvf_persistence<_CoefficientType, _ComplexType, _DegType>::stepPersist() -{ - // Compute next persistent pair - - ++_t ; // Step forward in the filtration - const int q_current(_f._filtration.at(_t).second) ; // Get the dimension of the new current cell - ++_t_dim.at(q_current) ; // Update time in the dimension of the current cell - _masks.at(q_current).setOn(_t_dim.at(q_current)) ; // Update mask accordingly - this->_DD_col.at(q_current).set_bitOn(_t_dim.at(q_current)) ; // Update _DD_col mask - - // Search for pairing - bool found ; - PairCell p(findNextPair(found)) ; - if (found) - { - // Corresponding persistent interval - const int q(p.dim) ; - // indices of both cells in the _K basis - const int ki(_per_to_K.at(q).at(p.sigma)), kj(_per_to_K.at(q+1).at(p.tau)) ; - CellDim ci(ki, q), cj(kj, q+1) ; // cells of the interval - in the K basis - int ti(_f._cell_to_t.at(ci)), tj(_f._cell_to_t.at(cj)) ; // times of the interval - PerInterval interval(ti, tj) ; - PerIntervalCells interval_cells(ci, cj) ; - PerDegInterval interval_deg(_f._deg.at(ti), _f._deg.at(tj)) ; - PerHole hole(interval, interval_cells, interval_deg) ; - // Add this interval - _persist.push_back(hole) ; - - // If export is on, store export data for significant persistant intervals - if (_with_export) - { - if ((interval_deg.second-interval_deg.first)>0) - export_perHDVF(p) ; - else - export_perHDVF() ; - } - - // if (interval_deg.second-interval_deg.first>0) - // { - // cout << "========> time : " << _t << endl ; - // cout << "pair found : " << p.sigma << ", " << p.tau << " - dim " << p.dim << endl ; - // this->print_reduction() ; - // - // } - - // Prepare for next step - this->A(p.sigma, p.tau, p.dim) ; // Update the reduction - // if (interval_deg.second-interval_deg.first>0) - // { - // cout << "====> after A : " << endl ; - // this->print_reduction() ; - // - // } - } -} - -} /* end namespace HDVF */ -} /* end namespace CGAL */ - -#endif // PER_HOM_HPP From 3ea95fc17da219115f003a7564f1664d1bb0f819 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Mon, 19 May 2025 08:21:17 +0200 Subject: [PATCH 016/343] Sub_chain_complex_mask Sub_chain_complex_mask documentation OK. --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 1 + HDVF/doc/HDVF/Concepts/Filtration.h | 13 +- HDVF/doc/HDVF/Concepts/SparseChain.h | 1061 ++++++- HDVF/doc/HDVF/Concepts/SparseMatrix.h | 2683 ++++++++++++++++- HDVF/doc/HDVF/fig/lower_star_filtration_y.png | Bin 0 -> 189897 bytes HDVF/doc/HDVF/fig/lower_star_filtration_z.png | Bin 0 -> 187504 bytes HDVF/examples/HDVF/main_dual_hdvf.cpp | 10 +- .../Abstract_simplicial_chain_complex.hpp | 42 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 16 +- .../CGAL/HDVF/Cubical_chain_complex.hpp | 19 +- HDVF/include/CGAL/HDVF/Filtration_core.h | 335 ++ HDVF/include/CGAL/HDVF/Filtration_lower.h | 344 --- .../include/CGAL/HDVF/Filtration_lower_star.h | 236 ++ HDVF/include/CGAL/HDVF/Hdvf_persistence.h | 27 +- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 16 +- .../CGAL/HDVF/Simplicial_complex_toolbox.h | 35 + HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 4 +- .../CGAL/HDVF/Sub_chain_complex_mask.h | 297 ++ HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 45 +- HDVF/include/CGAL/HDVF/sub_chain_complex.hpp | 207 -- HDVF/include/CGAL/OSM/{Chain.hpp => Chain.h} | 2 +- HDVF/include/CGAL/OSM/OSM.hpp | 4 +- .../OSM/{SparseMatrix.hpp => Sparse_matrix.h} | 2 +- 23 files changed, 4588 insertions(+), 811 deletions(-) create mode 100644 HDVF/doc/HDVF/fig/lower_star_filtration_y.png create mode 100644 HDVF/doc/HDVF/fig/lower_star_filtration_z.png create mode 100644 HDVF/include/CGAL/HDVF/Filtration_core.h delete mode 100644 HDVF/include/CGAL/HDVF/Filtration_lower.h create mode 100644 HDVF/include/CGAL/HDVF/Filtration_lower_star.h create mode 100644 HDVF/include/CGAL/HDVF/Simplicial_complex_toolbox.h create mode 100644 HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h delete mode 100644 HDVF/include/CGAL/HDVF/sub_chain_complex.hpp rename HDVF/include/CGAL/OSM/{Chain.hpp => Chain.h} (99%) rename HDVF/include/CGAL/OSM/{SparseMatrix.hpp => Sparse_matrix.h} (99%) diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h index 246c674f9417..48217fa8598c 100644 --- a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -15,6 +15,7 @@ The concept `AbstractChainComplex` describes the requirements for (topological) \cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} +\cgalHasModelsBare{`CGAL::Sub_chain_complex_mask`} \cgalHasModelsEnd */ diff --git a/HDVF/doc/HDVF/Concepts/Filtration.h b/HDVF/doc/HDVF/Concepts/Filtration.h index 6338e5eb48b1..7ce48f58c656 100644 --- a/HDVF/doc/HDVF/Concepts/Filtration.h +++ b/HDVF/doc/HDVF/Concepts/Filtration.h @@ -15,6 +15,7 @@ A filtration class provides: Cells are indexed along each dimension and thus identified by their index together with their dimension. \cgalHasModelsBegin +\cgalHasModelsBare{`CGAL::Filtration_core`} \cgalHasModelsBare{`CGAL::Filtration_lower_star`} \cgalHasModelsEnd @@ -142,12 +143,20 @@ class Filtration DegreeType get_degree (int i) const; // Filtration verification - /*! \brief Check that a filtration is valid (cells are ordered in increasing degrees and all cells have indices larger than their faces. + /*! \brief Check that a filtration is valid + * Checks that cells are ordered in increasing degrees and all cells have indices larger than their faces. */ - bool check_filtration() const; + bool is_valid_filtration() const; // Output filtration /*! \brief Overload of the `<<`operator for filtrations. */ friend ostream & operator<<(ostream & out, const Filtration &f); + + /** + * \brief Export the filtration time indices. + * + * The method exports the time index of every cells in each dimension. + */ + vector > export_filtration () const }; diff --git a/HDVF/doc/HDVF/Concepts/SparseChain.h b/HDVF/doc/HDVF/Concepts/SparseChain.h index f79f8d478b30..022fa1e75cd1 100644 --- a/HDVF/doc/HDVF/Concepts/SparseChain.h +++ b/HDVF/doc/HDVF/Concepts/SparseChain.h @@ -1,122 +1,981 @@ -/*! -\ingroup PkgHDVFConcepts -\cgalConcept - -The concept `AbstractChainComplex` describes the requirements for (topological) chain complexes associated to abstract complexes used in the concept `CGAL::HDVF`. - It provides methods to: - - - get the dimension of the complex, the number of cells in each dimension - - get the boundary and co-boundary of cell(s) - - get the vertices of a given cell - - output the complex in text format - - Cells are indexed along each dimension and thus identified by their index together with their dimension. - - -\cgalHasModelsBegin -\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} -\cgalHasModelsEnd - -*/ - -class AbstractChainComplex -{ -public: -/// \name Types -/// @{ - -/*! - Type of column-major chains (returned by the boundary operator) +/** + * \file Chain.hpp + * \brief Namespace file for describing library. + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + * + * Define everything for the Chain class */ -typedef OSM::Chain CChain; -/*! - Type of row-major chains (returned by the co-boundary operator) - */ -typedef OSM::Chain RChain ; +#ifndef __OSM_CHAIN__ +#define __OSM_CHAIN__ -/*! - Type of column-major sparse matrices (used to store the boundary operator) - */ -typedef OSM::SparseMatrix CMatrix; -/// @} +#include "__base.hpp" +#include "SparseMatrix.hpp" +#include +#include +#include +#include -/// \name Operators -/// @{ +namespace CGAL { +namespace OSM { -/*! -Affectation operator. - -The operator creates a "fresh" copy of `complex`. +/** + * \class Chain + * \brief Allow to create row/column sparse vectors. + * + * The Chain class contains all algebraic functions that are related to vectors. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ - AbstractChainComplex& operator= (const AbstractChainComplex& complex); +template +class Chain { + +public: + typedef std::pair pair; + typedef typename std::unordered_map::iterator iterator; + typedef typename std::unordered_map::const_iterator const_iterator; + + // Add these lines to allow the SparseMatrix class to access other templated + // SparsedMatrix private members. + template + friend class Chain; + template + friend class SparseMatrix; +protected: + /** \brief The chain inner representation and storage of data. */ + std::unordered_map chainData; + + /** \brief The chain coefficient type. */ + typedef _CoefficientType coefficientType; + + /** \brief The chain type flag. */ + int chainTypeFlag = _ChainTypeFlag; + + /** \brief The chain boundary. */ + int upperBound; + +public: + /** + * \brief Create new Chain for SparseMatrix object. + * + * Default constructor, initialize an empty Chain as a Z integers column chain. + * The default chain size is 128. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain() { + upperBound = 0; + chainData = std::unordered_map(); + } + + /** + * \brief Create new Chain for SparseMatrix object. + * + * Constructor with size, initialize an empty Chain as a Z integers column chain with boundary check. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _chainSize The upper bound of the Chain. + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain(const int _chainSize) { + upperBound = _chainSize; + chainData = std::unordered_map(); + } + + /** + * \brief Size of the chain + * + * \return Size of the chain (upperBound) + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + size_t dimension() const { return upperBound ; } + + /** + * \brief Create new Chain for SparseMatrix object. + * + * Copy constructor, initialize a Chain based on the same type of chain. + * The resulting chain will be a copy of the passed chain. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the other chain is not the same coefficient type. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _otherToCopy The chain we want to copy. + * + * \see \link OSM::ZCoefficient \endlink + * \see \link OSM::COLUMN \endlink + * \see \link OSM::ROW \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain(const Chain &_otherToCopy) { + upperBound = _otherToCopy.upperBound; + chainData = _otherToCopy.chainData; + // *this = _otherToCopy; + } + + /** + * \brief Assign to other chain. + * + * Assign to other chain coefficient-wise, equivalent to copying it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the other chain is not the same coefficient type. + * + * \param[in] _otherToCopy The chain we want to copy. + * + * \return The reference to the modified chain. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator=(const Chain &_otherToCopy) { + upperBound = _otherToCopy.upperBound; + chainData = _otherToCopy.chainData; + + return *this; + } + + /** + * \brief Displays a Chain in the output stream. + * + * \param[in] _stream The output stream. + * \param[in] _chain The chain to display. + * + * \return A reference to the modified stream. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend std::ostream& operator<<(std::ostream &_stream, const Chain &_chain) { + _stream << "["; + for (const_iterator i = _chain.chainData.begin() ; i != _chain.chainData.end() ; ++i) { + _stream << i->first << ": " << i->second << ", "; + } + + if (_chain.chainData.size() > 0) { + _stream << "\b\b"; + } + _stream << "]"; + + return _stream; + } + + /** + * \brief Adds two chains together. + * + * Adds each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _first The first chain. + * \param[in] _second The second chain. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator+(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { + Chain newChain = _first; + newChain += _second; + + return newChain; + } + + /** + * \brief Substract two chains together. + * + * Substract each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _first The first chain. + * \param[in] _second The second chain. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator-(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { + Chain newChain = _first; + newChain -= _second; + + return newChain; + } + + /** + * \brief Apply factor on each coefficients. + * + * \param[in] _lambda The factor to apply. + * \param[in] _chain The second chain. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator*(const _CoefficientType& _lambda, const Chain<_CoefficientType, _CTF> &_chain) { + Chain newChain = _chain; + newChain *= _lambda; + + return newChain; + } + + /** + * \brief Apply factor on each coefficients. + * + * \param[in] _chain The second chain. + * \param[in] _lambda The factor to apply. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain operator*(const Chain<_CoefficientType, _CTF> &_chain, const _CoefficientType& _lambda) { + Chain newChain = _chain; + newChain *= _lambda; + + return newChain; + } + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + + /** + * \brief Perform dot product between two chains. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _row The row chain. + * \param[in] _column The column chain. + * + * \return The result of type _CoefficientType. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend _CT operator*(const Chain<_CT, ROW> &_row, const Chain<_CT, COLUMN> &_column); + + /** + * \brief Add a chain and assign. + * + * Adds each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _other The other chain. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator+=(const Chain &_other) { + if (this->upperBound != _other.upperBound) { + throw std::runtime_error("Chains must be the same size."); + } + + for (pair pair: _other.chainData) { + this->chainData[pair.first] += pair.second; + + if (this->chainData[pair.first] == 0) { + this->chainData.erase(pair.first); + } + } + + return *this; + } + + /** + * \brief Substract a chain and assign. + * + * Substract each coefficient of the chain together. + * + * \pre The chains have the same coefficent type and the same type flag. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two chains don't have the same type flag. + * + * \param[in] _other The other chain. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator-=(const Chain &_other) { + if (this->upperBound != _other.upperBound) { + throw std::runtime_error("Chains must be the same size."); + } + + for (pair pair: _other.chainData) { + this->chainData[pair.first] -= pair.second; + + if (this->chainData[pair.first] == 0) { + this->chainData.erase(pair.first); + } + } + + return *this; + } + + /** + * \brief Apply factor on each coefficients and assign. + * + * \param[in] _lambda The factor to apply. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator*=(const _CoefficientType& _lambda) { + if (_lambda == 0) { + this->chainData.clear(); + return *this; + } + + for (pair pair: this->chainData) { + this->chainData[pair.first] = pair.second * _lambda; + } + + return *this; + } + + /** + * \brief Get a coefficient from the chain. + * + * \warning The chain will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The coefficient stored in the chain. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + _CoefficientType operator[](const int _index) const { + if (_index >= upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); + } + + return chainData.at(_index); + } -/// @} + /** + * \brief Set a coefficient in the chain. + * + * \warning The chain will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The reference to the assigned coefficient. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + _CoefficientType& operator[](const int _index) { + if (_index >= upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); + } + + return chainData[_index]; + } -/// \name Access functions -/// @{ + /** + * \brief Checks if a coefficient is null. Should be used instead of operator[] for that case. + * + * \param[in] _index The index to check. + * \return True if the data is null at given index. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 29/05/2024 + */ + const bool isNull(const int _index) const { + return chainData.find(_index) == chainData.end(); + } + + /** + * \brief Checks if the chain is null. + * + * \return True if the chain is null. + * + * \author Fedyna K. + * \version 0.2.0 + * \date 29/05/2024 + */ + const bool isNull() const { + return chainData.size() == 0; + } + + /** + * \brief Get a subchain from the chain. + * + * Removes all indexes provided in the vector from the chain and returns it. + * + * \note Will return a copy of the chain if given vector is empty. + * + * \param[in] _chain The chain to process. + * \param[in] _indexes The indexes to remove. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes); + + /** + * \brief Get a subchain from the chain. + * + * Removes the index provided from the chain and returns it. + * + * \note Will return a copy of the chain if given vector is empty. + * + * \param[in] _chain The chain to process. + * \param[in] _index The index to remove. + * + * \return A new chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _indexes); + + /** + * \brief Get a subchain from the chain and assign. + * + * Removes all indexes provided in the vector from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator/=(const std::vector &_indexes) { + for (int index : _indexes) { + this->chainData.erase(index); + } + + return *this; + } + + /** + * \brief Get a subchain from the chain and assign. + * + * Removes the index provided from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _index The index to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain& operator/=(const int _index) { + this->chainData.erase(_index); + + return *this; + } + + /** + * \brief Set all coefficients to zero. + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + void nullify() { + this->chainData.clear(); + } + + /** + * \brief Iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The iterator to the beginning of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::iterator \endlink + * \see \link std::unordered_map::begin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + iterator begin() noexcept { + return chainData.begin(); + } + + /** + * \brief Constant iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the beginning of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::begin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator begin() const noexcept { + return chainData.begin(); + } + + /** + * \brief Constant iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the beginning of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::cbegin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator cbegin() const noexcept { + return chainData.cbegin(); + } + + /** + * \brief Iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The iterator to the end of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::iterator \endlink + * \see \link std::unordered_map::end \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + iterator end() noexcept { + return chainData.end(); + } + + /** + * \brief Constant iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the end of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::end \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator end() const noexcept { + return chainData.end(); + } + + /** + * \brief Constant iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The constant iterator to the end of the chain. + * + * \see \link OSM::Chain \endlink + * \see \link std::unordered_map \endlink + * \see \link std::unordered_map::const_iterator \endlink + * \see \link std::unordered_map::cend \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + const_iterator cend() const noexcept { + return chainData.cend(); + } + + /** + * \brief Transpose a Chain. + * + * \return A new chain where the chain type flag is changed. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { + Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> chain; + + chain.upperBound = this->upperBound; + for (pair pair: this->chainData) { + chain.chainData[pair.first] = pair.second; + } + + return chain; + } + + /** + * \brief Checks if chain is a column. + * + * \return true if chain is represented as a column, false otherwise. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + bool isColumn() const { + return _ChainTypeFlag == COLUMN; + } + + /** + * \brief Checks if chain is a row. + * + * \return true if chain is represented as a row, false otherwise. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + bool isRow() const { + return _ChainTypeFlag == ROW; + } +}; -/*! -Returns the dimension of the complex, that is, the largest dimension of cells. - */ -int dim(); -/*! -Returns the number of cells of dimension `q`. -If `q` is negative of larger than the dimension of the complex, returns 0. +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -int nb_cells(int q); - -/*! -Returns all boundary matrices. - -The function returns constant reference to a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). +template +SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + SparseMatrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); + + for (std::pair pair : _row.chainData) { + OSM::setColumn(matrix,pair.first,_column * pair.second) ; + } + + return matrix; +} +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _column The column chain. + * \param[in] _row The row chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -const vector & get_bnd_matrices() const; +template +SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + SparseMatrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); + + for (std::pair pair : _column.chainData) { + OSM::setRow(matrix,pair.first,_row * pair.second); + } + + return matrix; +} -/*! -Returns the boundary matrix of dimension `q` (ie. the matrix of \f$\partial_q}\f$). - -The function returns a column-major sparse matrices. +/** + * \brief Perform dot product between two chains. + * + * \pre The chains have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _row The row chain. + * \param[in] _column The column chain. + * + * \return The result of type _CoefficientType. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -const CMatrix & get_bnd_matrix(int q) const; - -/*! -Returns the boundary of the cell of index `id_cell` in dimension `q`. - -This boundary is a finite linear combination of cells of dimension `q`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). This boundary is thus the `id_cell`-th column of the boundary matrix in dimension `q`. - -*/ -CChain d(int id_cell, int q); - +template +_CoefficientType operator*(const Chain<_CoefficientType, ROW> &_row, const Chain<_CoefficientType, COLUMN> &_column) { + // Get indexes (avoid adding double indexes). + std::unordered_map indexes; + for (std::pair pair: _row.chainData) { + indexes[pair.first] = 1; + } + for (std::pair pair: _column.chainData) { + indexes[pair.first] += 1; + } -/*! -Returns the co-boundary of the cell of index `id_cell` in dimension `q`. - -This boundary is a finite linear combination of cells of dimension `q`+1. It is encoded as a row-major chain (which maps each cell with a non-zero coefficient to this coefficient). This co-boundary is thus the `id_cell`-th row of the boundary matrix in dimension `q`+1. -*/ -CChain cod(int id_cell, int q); - -/*! -Returns the vertices of a given cell (that is, the indices of its faces of dimension 0). - -*/ - std::vector bottom_faces(int id_cell, int q) const; + // Perform dot product + _CoefficientType result = _CoefficientType(); + for (std::pair index: indexes) { + if (index.second == 2) { + result += _row.chainData.at(index.first) * _column.chainData.at(index.first); + } + } + + return result; +} -/// @} +/** + * \brief Get a subchain from the chain and assign. + * + * Removes all indexes provided in the vector from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes) { + Chain newChain = _chain; + newChain /= _indexes; + return newChain; +} -/// \name Output functions -/// @{ +/** + * \brief Get a subchain from the chain and assign. + * + * Removes the index provided from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _index The index to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _index) { + Chain newChain = _chain; + newChain /= _index; + return newChain; +} -/*! -Outputs the chain complex in text mode. - -By default, outputs the complex to `std::cout`. -*/ -std::ostream& print_complex(std::ostream& out = std::cout) const; - -/// @} +} /* end namespace OSM */ +} /* end namespace CGAL */ -}; +#endif diff --git a/HDVF/doc/HDVF/Concepts/SparseMatrix.h b/HDVF/doc/HDVF/Concepts/SparseMatrix.h index f79f8d478b30..acf60f612e4d 100644 --- a/HDVF/doc/HDVF/Concepts/SparseMatrix.h +++ b/HDVF/doc/HDVF/Concepts/SparseMatrix.h @@ -1,122 +1,2627 @@ -/*! -\ingroup PkgHDVFConcepts -\cgalConcept - -The concept `AbstractChainComplex` describes the requirements for (topological) chain complexes associated to abstract complexes used in the concept `CGAL::HDVF`. - It provides methods to: - - - get the dimension of the complex, the number of cells in each dimension - - get the boundary and co-boundary of cell(s) - - get the vertices of a given cell - - output the complex in text format - - Cells are indexed along each dimension and thus identified by their index together with their dimension. - - -\cgalHasModelsBegin -\cgalHasModelsBare{`CGAL::Abstract_simplicial_chain_complex`} -\cgalHasModelsEnd - -*/ - -class AbstractChainComplex -{ +/** + * \file SparseMatrix.hpp + * \brief Namespace file for describing library. + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + * + * Define everything for the SparseMatrix class + */ + +#ifndef __OSM_SPARSE_MATRIX__ +#define __OSM_SPARSE_MATRIX__ + + +#include "Chain.hpp" +#include "Bitboard.hpp" +#include +#include +#include + +// DEBUG : matrix output for SparseMatrices / no DEBUG : chain output for SparseMatrices +//#define DEBUG + +namespace CGAL { +namespace OSM { + +/** + * \class SparseMatrix + * \brief Vector implementation of sparse matrices. + * + * The SparseMatrix class contains all algebraic functions that are related to OSM matrices (optimized sparse matrices). + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +class SparseMatrix { + public: -/// \name Types -/// @{ + typedef Chain<_CoefficientType, _ChainTypeFlag> MatrixChain; + + // Add these lines to allow the SparseMatrix class to access other templated + // SparsedMatrix private members. + template + friend class SparseMatrix; + +protected: + /** \brief The inner chain storage. */ + std::vector> chains; + + /** \brief A bitboard containing state of each columns. */ + Bitboard chainsStates; + + /** \brief The matrix size as a (row, column) pair. */ + std::pair size; + + /** + * \brief Get a chain from a matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The reference to the chain stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + MatrixChain& operator[](const int _index) { + if (_ChainTypeFlag == COLUMN && _index >= size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); + } + if (_ChainTypeFlag == ROW && _index >= size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); + } + + chainsStates |= _index; + return chains[_index]; + } + +public: + /** + * \brief Create new SparseMatrix object. + * + * Default constructor, initialize an empty Matrix as Z integers column chains. + * The default matrix size is 128x128. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix() { + chains = std::vector(0); + chainsStates = Bitboard(0); + size = {0, 0}; + } + + /** + * \brief Create new SparseMatrix object. + * + * Constructor with size, initialize an empty Matrix as Z integers column chains. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _rowCount The number of rows to preallocate. + * \param[in] _columnCount The number of columns to preallocate. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix(const int _rowCount, const int _columnCount) { + int mainSize = _ChainTypeFlag == COLUMN ? _columnCount : _rowCount; + int secondarySize = _ChainTypeFlag == COLUMN ? _rowCount : _columnCount; + + chains = std::vector>(mainSize); + for (int i = 0 ; i < mainSize ; i++) { + chains[i] = Chain<_CoefficientType, _ChainTypeFlag>(secondarySize); + } + + chainsStates = Bitboard(mainSize); + size = {_rowCount, _columnCount}; + } + + /** + * \brief Create new SparseMatrix from other SparseMatrix object. + * + * Copy constructor, initialize a SparseMatrix (not necessarly based on the same type of matrix). + * If types are different, the constructor performs conversion. + * + * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \param[in] _otherToCopy The matrix we want to copy. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + SparseMatrix(const SparseMatrix<_CoefficientType,CTF> &_otherToCopy) { + // *this = _otherToCopy; + if (_ChainTypeFlag == CTF) + { + chainsStates = _otherToCopy.chainsStates; + size = _otherToCopy.size; + // Copy of chains as such + chains.resize(_otherToCopy.chains.size()) ; + for (int i = 0; i<_otherToCopy.chains.size(); ++i) + { + const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; + Chain<_CoefficientType,_ChainTypeFlag> res(tmp.dimension()) ; + for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + res[it->first] = it->second ; + } + chains[i] = res ; + } + } + else // Copy coefficient by coefficient + { + size = _otherToCopy.size; + int vec_size = (_ChainTypeFlag == OSM::COLUMN)?size.second:size.first ; + int chain_size = (_ChainTypeFlag == OSM::COLUMN)?size.first:size.second ; + chains.resize(vec_size) ; + chainsStates = OSM::Bitboard(vec_size) ; + for (int i=0; i(chain_size) ; + } + + for (int i = 0; i<_otherToCopy.chains.size(); ++i) + { + const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; + for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + { + chains[it->first][i] = it->second ; + chainsStates.setOn(it->first) ; + } + } + } + } + + /** + * \brief Assign to other matrix. + * + * Assign to other matrix coefficient-wise, equivalent to copying it. + * + * \pre The matrices must have the same type. + * + * \param[in] _otherToCopy The matrix we want to copy. + * + * \return The reference to the modified matrix. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator=(const SparseMatrix& _otherToCopy) + { + chainsStates = _otherToCopy.chainsStates; + size = _otherToCopy.size; + chains = _otherToCopy.chains; + + return *this; + } + + + /** + * \brief Clean a SparseMatrix (set everything to zero) + * + * Empty all structures of the sparse matrix. + * + * \warning Will raise an error if the other matrix is not the same chain type. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + void nullify() { + std::vector coefs ; + for (OSM::Bitboard::iterator it = begin(); it != end(); ++it) + { + coefs.push_back(*it) ; + } + *this /= coefs ; + } + + /** + * \brief Displays a SparseMatrix in the output stream. + * + * \param[in] _stream The output stream. + * \param[in] _matrix The matrix to display. + * + * \return A reference to the modified stream. + * + * \see \link OSM::Matrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend std::ostream& operator<<(std::ostream &_stream, const SparseMatrix &_matrix) { +#ifndef DEBUG + bool empty = true; + + _stream << "["; + for (int index : _matrix.chainsStates) { + empty = false; + _stream << index << ": " << _matrix.chains[index] << ", "; + } + + if (!empty) { + _stream << "\b\b"; + } + _stream << "]" << std::endl ; +#else + for (int i=0; i<_matrix.size.first; ++i) + { + for (int j=0; j<_matrix.size.second; ++j) + { + + //_CoefficientType tmp = _matrix[j][i] ; // get_coef(i,j) ; + _CoefficientType tmp = _matrix.get_coef(i,j) ; + + if (tmp == 0) + _stream << ".\t" ; + else + _stream << tmp << "\t" ; + } + _stream << std::endl ; + } +#endif + + return _stream; + } + + + /** + * \brief Adds two matrices together. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrixs have the same chain type. + * + * \warning Will raise an error if the other matrix is not the same chain type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator+(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { + SparseMatrix newMatrix(_first); + newMatrix += _second; + + return newMatrix; + } + + /** + * \brief Substracts two matrices together. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrixs have the same chain type. + * + * \warning Will raise an error if the other matrix is not the same chain type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator-(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { + SparseMatrix newMatrix = _first; + newMatrix -= _second; + + return newMatrix; + } + + /** + * \brief Apply factor on each coefficients. + * + * \warning Will raise an error if _lambda is 0. + * + * \param[in] _lambda The factor to apply. + * \param[in] _matrix The matrix. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator*(const _CT& _lambda, const SparseMatrix<_CT, _CTF> &_matrix) { + SparseMatrix newMatrix = _matrix; + newMatrix *= _lambda; + + return newMatrix; + } + + /** + * \brief Apply factor on each coefficients. + * + * \warning Will raise an error if _lambda is 0. + * + * \param[in] _matrix The matrix. + * \param[in] _lambda The factor to apply. + * + * \return A new matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix operator*(const SparseMatrix<_CT, _CTF> &_matrix, const _CT& _lambda) { + SparseMatrix newMatrix = _matrix; + newMatrix *= _lambda; + + return newMatrix; + } + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Perform matrix multiplication between two matrices. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Perform multiplication between a column-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second); + + /** + * \brief Perform multiplication between a row-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second); + + /** + * \brief Perform multiplication between a row-based chain and a row-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) ; + + /** + * \brief Perform multiplication between a row-based chain and a column-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) ; + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + template + friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + + /** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator+=(const SparseMatrix &_other) { + if (this->size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index: _other.chainsStates) { + this->chainsStates |= index; + this->chains[index] += _other.chains[index]; + + if (this->chains[index].isNull()) { + this->chainsStates.setOff(index); + } + } + + return *this; + } + + /** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator-=(const SparseMatrix &_other) { + if (this->size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index: _other.chainsStates) { + this->chainsStates |= index; + this->chains[index] -= _other.chains[index]; + + if (this->chains[index].isNull()) { + this->chainsStates.setOff(index); + } + } + + return *this; + } + + + /** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Apply factor on each coefficients and assign. + * + * \warning Will raise an error if _lambda is 0. + * + * \param[in] _lambda The factor to apply. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator*=(const _CoefficientType& _lambda) { + if (_lambda == 0) { + *this = SparseMatrix(); + return *this; + } + + for (int index: this->chainsStates) { + this->chains[index] *= _lambda; + } + + return *this; + } + + /** + * \brief Compute the negative of a matrix (unary operator). + * + * \return The resulting matrix. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 07/09/2024 + */ + friend SparseMatrix operator-(const SparseMatrix& _matrix) { + SparseMatrix res(_matrix.size.first, _matrix.size.second) ; + + for (int index: _matrix.chainsStates) + { + const MatrixChain& tmp_chain(_matrix.chains[index]) ; + for (typename MatrixChain::const_iterator it = tmp_chain.cbegin(); it != tmp_chain.cend(); ++it) + res[index][it->first] = -it->second ; + } + return res ; + } + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + + /** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ + template + friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + + /** + * \brief Get a chain from a const matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The chain stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + MatrixChain operator[](const int _index) const { + if (_ChainTypeFlag == COLUMN && _index >= size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); + } + if (_ChainTypeFlag == ROW && _index >= size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); + } + + return chains[_index]; + } + + /** + * \brief Set a given coefficient. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _i The row index. + * \param[in] _j The column index. + * \param[in] _d The value. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + void set_coef(const int _i, const int _j, const _CoefficientType _d) { + if (_i >= size.first) { + throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); + } + if (_j >= size.second) { + throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); + } + + + if (_ChainTypeFlag == COLUMN) + { + (*this)[_j][_i] = _d ; + } + else + (*this)[_i][_j] = _d ; + } + + /** + * \brief Get a given coefficient. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _i The row index. + * \param[in] _j The column index. + * + * \return The value of the given coefficient. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + + _CoefficientType get_coef(const int _i, const int _j) const { + if (_i >= size.first) { + //std::cout << "Provided _i index should be less than " << size.first << "." << std::endl; + throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); + } + if (_j >= size.second) { + //std::cout << "Provided _j index should be less than " << size.second << "." << std::endl; + throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); + } + + + if (_ChainTypeFlag == COLUMN) + return (*this)[_j][_i] ; + else // ROW + return (*this)[_i][_j] ; + } + + /** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + + /** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + + /** + * \brief Get a const reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a const reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + + /** + * \brief Get a reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + + /** + * \brief Get a reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index); + + + /** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + + /** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + + /** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + + /** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ + template + friend void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + + /** + * \brief Get a submatrix from the matrix. + * + * Removes all indexes provided in the vector from the matrix and returns it. + * + * \note Will return a copy of the matrix if given vector is empty. + * \note The submatrix will be rectangular. + * + * \param[in] _matrix The matrix to process. + * \param[in] _indexes The indexes to remove. + * + * \return A new matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend SparseMatrix operator/(const SparseMatrix &_matrix, const std::vector &_indexes) { + SparseMatrix res(_matrix); + res /= _indexes; + return res; + } + + /** + * \brief Get a submatrix from the matrix. + * + * Removes index from the matrix and returns it. + * + * \note Will return a copy of the matrix if given vector is empty. + * \note The submatrix will be rectangular. + * + * \param[in] _matrix The matrix to process. + * \param[in] _index The index to remove. + * + * \return A new matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + friend SparseMatrix operator/(const SparseMatrix &_matrix, const int _index) { + SparseMatrix res(_matrix); + res /= _index; + return res; + } + + /** + * \brief Get a submatrix from the matrix and assign. + * + * Removes all indexes provided in the vector from the matrix and returns it. + * + * \note Will not alter the matrix if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator/=(const std::vector &_indexes) { + for (int index : _indexes) { + *this /= index; + } + + return *this; + } + + /** + * \brief Get a submatrix from the matrix and assign. + * + * Removes index from the matrix and returns it. + * + * \note Will return a copy of the matrix if given vector is empty. + * \note The submatrix will be rectangular. + * + * \param[in] _index The index to remove. + * + * \return A new matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& operator/=(const int _index) { + chains[_index].nullify(); + chainsStates.setOff(_index); + + return *this; + } + + /** + * \brief Get a submatrix from the matrix and assign. + * + * Removes all indexes provided in the vector from the matrix and returns it. + * + * \note Will not alter the matrix if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix& delColumn(int _index) { + std::vector tmp_id{_index} ; + if (_ChainTypeFlag == OSM::COLUMN) + { + (*this)/=tmp_id ; + } + else // OSM::ROW + { + for (int index : chainsStates) + { + MatrixChain &tmp(chains[index]) ; + tmp/=tmp_id ; + // If the row index has become empty: update + if (tmp.isNull()) + *this /= std::vector({index}) ; + } + } + + return *this; + } + + SparseMatrix& delRow(int _index) + { + std::vector tmp_id{_index}; + if (_ChainTypeFlag == OSM::ROW) { + (*this) /= tmp_id; + } else // OSM::COLUMN + { + for (int index : chainsStates) { + MatrixChain &tmp(chains[index]); + tmp /= tmp_id; + // If the column index has become empty: update + if (tmp.isNull()) + *this /= std::vector({index}) ; + } + } + + return *this; + } + + SparseMatrix& delCoef(int _index1, int _index2) + { + + if (_ChainTypeFlag == OSM::COLUMN) { + std::vector tmp_id({_index1}) ; + MatrixChain &tmp(chains[_index2]); + tmp /= tmp_id; + if (tmp.isNull()) + chainsStates.setOff(_index2) ; + } else // OSM::ROW + { + std::vector tmp_id({_index2}) ; + MatrixChain &tmp(chains[_index1]); + tmp /= tmp_id; + if (tmp.isNull()) + chainsStates.setOff(_index1) ; + } + + return *this; + } + + /** + * \brief Iterator to the beginning of the chains indices. + * + * \return The iterator to the beginning of the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::begin \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::iterator begin() const noexcept { return chainsStates.begin(); } + + /** + * \brief Iterator to the ending of the chains indices. + * + * \return The iterator to the ending of the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::end \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::iterator end() const noexcept { return chainsStates.end(); } + + /** + * \brief Reverse iterator to the chains indices. + * + * \return The reverse iterator to the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::begin \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::reverse_iterator reverse_begin() noexcept { return chainsStates.reverse_begin(); } + inline Bitboard::reverse_iterator reverse_begin(size_t index) noexcept { return chainsStates.reverse_begin(index); } + + /** + * \brief Reverse iterator to the ending of the chains indices. + * + * \return The reverse iterator to the ending of the chains indices. + * + * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Chain \endlink + * \see \link std::vector \endlink + * \see \link std::vector::iterator \endlink + * \see \link std::vector::end \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 08/04/2024 + */ + inline Bitboard::reverse_iterator reverse_end() noexcept { return chainsStates.reverse_end(); } + + + /** + * \brief Transpose a matrix. + * + * \return A new matrix where the chain type flag is changed. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { + SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transposed(this->size.second, this->size.first); + + for (int index : this->chainsStates) { + transposed.chains[index] = this->chains[index].transpose(); + } + + transposed.chainsStates = this->chainsStates; + + return transposed; + } + + /** + * \brief Gets the matrix size. + * + * \return The matrix size as a Row/Column pair. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 06/05/2024 + */ + std::pair dimensions() const { + return this->size; + } +}; + + -/*! - Type of column-major chains (returned by the boundary operator) +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -typedef OSM::Chain CChain; +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform col-col matrix multiplication with linear combination of columns. + for (int index: _second.chainsStates) { + Chain<_CT, COLUMN> column(_first.size.first); + + for (std::pair colRight: _second.chains[index]) { + if (_first.chainsStates.isOn(colRight.first)) { + column += colRight.second * _first.chains[colRight.first]; + } + } + + res[index] = column; + } + + return res; +} -/*! - Type of row-major chains (returned by the co-boundary operator) +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -typedef OSM::Chain RChain ; +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int colRight: _second.chainsStates) { + Chain<_CT, COLUMN> column(_first.size.first); + + for (int rowLeft: _first.chainsStates) { + _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; + if (coef != 0) { + column[rowLeft] = coef; + } + } + + res[colRight] = column; + } + + return res; +} -/*! - Type of column-major sparse matrices (used to store the boundary operator) +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -typedef OSM::SparseMatrix CMatrix; +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int colLeft: _first.chainsStates) { + res += _first.chains[colLeft] * _second.chains[colLeft]; + } + + return res; +} -/// @} +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int i = 0 ; i < _second.size.second ; i++) { + Chain<_CT, COLUMN> column(_first.size.first); + + for (int rowLeft: _first.chainsStates) { + _CT coef = _first.chains[rowLeft] * getColumn(_second, i); + if (coef != 0) { + column[rowLeft] = coef; + } + } + + if (!column.isNull()) { + res[i] = column; + } + } + + return res; +} -/// \name Operators -/// @{ +/** + * \brief Perform multiplication between a column-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second) +{ + // Perform col-col matrix multiplication with linear combination of columns. + Chain<_CT, COLUMN> column(_first.size.first); + + for (typename Chain<_CT, COLUMN>::const_iterator it = _second.begin(); it != _second.end(); ++it) + { + column += it->second * _first.chains[it->first]; + } + + return column; +} -/*! -Affectation operator. - -The operator creates a "fresh" copy of `complex`. +/** + * \brief Perform multiplication between a row-based matrix and a column-based chain. + * + * Generate a column-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ - AbstractChainComplex& operator= (const AbstractChainComplex& complex); +template +Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second) +{ + // Perform row-col matrix multiplication with dots + Chain<_CT, COLUMN> column(_first.size.first); -/// @} + for (int index : _first.chainsStates) + { + _CT tmp(_first[index] * _second) ; + if (tmp != 0) + column[index] = tmp ; + } + return column; +} + +/** + * \brief Perform multiplication between a row-based chain and a row-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) +{ + // Perform row-row matrix multiplication with linear combination of rows. + Chain<_CT, ROW> row(_second.size.second); + + for (typename Chain<_CT, ROW>::const_iterator it = _first.begin(); it != _first.end(); ++it) + { + row += it->second * _second.chains[it->first]; + } -/// \name Access functions -/// @{ + return row; +} -/*! -Returns the dimension of the complex, that is, the largest dimension of cells. +/** + * \brief Perform multiplication between a row-based chain and a column-based matrix. + * + * Generate a row-based chain from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The matrix. + * \param[in] _second The chain. + * + * \return The result of the matrix multiplication, row-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -int dim(); +template +Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) +{ + // Perform row-col matrix multiplication with dots + Chain<_CT, ROW> row(_second.size.second); + + for (int index : _second.chainsStates) + { + _CT tmp(_first * _second[index]) ; + if (tmp != 0) + row[index] = tmp ; + } + return row; +} -/*! -Returns the number of cells of dimension `q`. -If `q` is negative of larger than the dimension of the complex, returns 0. +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -int nb_cells(int q); +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + for (int i = 0 ; i < _first.size.first ; i++) { + Chain<_CT, ROW> row(_second.size.second); + + for (int colRight: _second.chainsStates) { + _CT coef = getRow(_first, i) * _second.chains[colRight]; + if (coef != 0) { + row[colRight] = coef; + } + } + + if (!row.isNull()) { + res[i] = row; + } + } + + return res; +} -/*! -Returns all boundary matrices. - -The function returns constant reference to a vector of column-major sparse matrices. The `q`-th element of this vector is the matrix of \f$\partial_q\f$, which gives the boundary of cells of dimension `q`(as a linear combination of `q`-1 cells). +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int rowLeft: _first.chainsStates) { + Chain<_CT, ROW> row(_second.size.second); + + for (int colRight: _second.chainsStates) { + _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; + if (coef != 0) { + row[colRight] = coef; + } + } + + res[rowLeft] = row; + } + + return res; +} +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -const vector & get_bnd_matrices() const; +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + // Perform row-col matrix multiplication with dot products. + for (int colLeft: _first.chainsStates) { + res += _first.chains[colLeft] % _second.chains[colLeft]; + } + + return res; +} -/*! -Returns the boundary matrix of dimension `q` (ie. the matrix of \f$\partial_q}\f$). - -The function returns a column-major sparse matrices. +/** + * \brief Perform matrix multiplication between two chains. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _first The first matrix. + * \param[in] _second The second matrix. + * + * \return The result of the matrix multiplication, column-based. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 */ -const CMatrix & get_bnd_matrix(int q) const; +template +SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { + SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); + + // Perform row-row matrix multiplication with linear combination of rows. + for (int index: _first.chainsStates) { + Chain<_CT, ROW> row(_second.size.second); + + for (std::pair colRight: _first.chains[index]) { + if (_first.chainsStates.isOn(colRight.first)) { + row += colRight.second * _second.chains[colRight.first]; + } + } + + res[index] = row; + } + + return res; +} -/*! -Returns the boundary of the cell of index `id_cell` in dimension `q`. +/** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index = 0 ; index < _other.size.second ; index++) { + Chain column = getColumn(_other, index); + if (!column.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] += getColumn(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} -This boundary is a finite linear combination of cells of dimension `q`-1. It is encoded as a column-major chain (which maps each cell with a non-zero coefficient to this coefficient). This boundary is thus the `id_cell`-th column of the boundary matrix in dimension `q`. - -*/ -CChain d(int id_cell, int q); +/** + * \brief Add a matrix and assign. + * + * Adds each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index = 0 ; index < _other.size.first ; index++) { + Chain row = getRow(_other, index); + if (!row.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] += getRow(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} +/** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } + + for (int index = 0 ; index < _other.size.second ; index++) { + Chain column = getColumn(_other, index); + if (!column.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] -= getColumn(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} + +/** + * \brief Substract a matrix and assign. + * + * Substracts each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _matrix The matrix to reassign. + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + if (_matrix.size != _other.size) { + throw std::runtime_error("Matrices must be the same size."); + } -/*! -Returns the co-boundary of the cell of index `id_cell` in dimension `q`. + for (int index = 0 ; index < _other.size.second ; index++) { + Chain row = getRow(_other, index); + if (!row.isNull()) { + _matrix.chainsStates |= index; + _matrix.chains[index] -= getRow(_other, index); + + if (_matrix.chains[index].isNull()) { + _matrix.chainsStates.setOff(index); + } + } + } + + return _matrix; +} + +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::SparseMatrix \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + _matrix = _matrix * _other; + return _matrix; +} + +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + _matrix = _matrix % _other; + return _matrix; +} -This boundary is a finite linear combination of cells of dimension `q`+1. It is encoded as a row-major chain (which maps each cell with a non-zero coefficient to this coefficient). This co-boundary is thus the `id_cell`-th row of the boundary matrix in dimension `q`+1. -*/ -CChain cod(int id_cell, int q); +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { + _matrix = _matrix * _other; + return _matrix; +} -/*! -Returns the vertices of a given cell (that is, the indices of its faces of dimension 0). - -*/ - std::vector bottom_faces(int id_cell, int q) const; +/** + * \brief Multiply a matrix and assign. + * + * Multiply each coefficient of the matrix together. + * + * \pre The matrix have the same coefficent type. + * + * \warning Will raise an error if the two chains are not the same coefficient type. + * + * \param[in] _other The other matrix. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.3.0 + * \date 31/04/2024 + */ +template +SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { + _matrix = _matrix % _other; + return _matrix; +} -/// @} +/** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { + return _matrix.chains[_index]; +} -/// \name Output functions -/// @{ +/** + * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * + * \note For column-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { + Chain<_CT, COLUMN> column(_matrix.size.first); + if (_matrix.size.first > 0) + { + for (int i : _matrix.chainsStates) { + if (!_matrix.chains[i].isNull(_index)) { + column[i] = _matrix.chains[i][_index]; + } + } + } + + return column; +} -/*! -Outputs the chain complex in text mode. - -By default, outputs the complex to `std::cout`. -*/ -std::ostream& print_complex(std::ostream& out = std::cout) const; +/** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { + Chain<_CT, ROW> row(_matrix.size.second); + if (_matrix.size.second > 0) + { + for (int i : _matrix.chainsStates) { + if (!_matrix.chains[i].isNull(_index)) { + row[i] = _matrix.chains[i][_index]; + } + } + } -/// @} + return row; +} -}; +/** + * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * + * \note For row-chain matrixes, it is equivalent to operator[]. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return The row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { + return _matrix.chains[_index]; +} + +/** + * \brief Get a const reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) +{ + if (_index >= _matrix.size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Get a const reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A const reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) +{ + if (_index >= _matrix.size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Get a reference over a column from a column matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the column stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index) +{ + if (_index >= _matrix.size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Get a reference over a row from a row matrix + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * + * \return A reference over the row stored at given index. + * + * \see \link OSM::Chain \endlink + * + * \author Bac A. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index) +{ + if (_index >= _matrix.size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); + } + return _matrix.chains[_index]; +} + +/** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { + if(_matrix.dimensions().first != _chain.dimension()) + throw std::runtime_error("setColumn dimension error") ; + _matrix[_index] = _chain; + if (_chain.isNull()) + _matrix.chainsStates.setOff(_index) ; +} + +/** + * \brief Set a column from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new column. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { + if(_matrix.dimensions().first != _chain.dimension()) + throw std::runtime_error("setColumn dimension error") ; + for (int i = 0 ; i < _matrix.size.first ; i++) { + if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { + _matrix.chains[i] /= _index; + + if (_matrix.chains[i].isNull()) { + _matrix.chainsStates.setOff(i); + } + } + + if (!_chain.isNull(i)) { + _matrix.chainsStates |= i; + _matrix.chains[i][_index] = _chain[i]; + } + } +} + +/** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { + if(_matrix.dimensions().second != _chain.dimension()) + throw("setColumn dimension error") ; + for (int i = 0 ; i < _matrix.size.second ; i++) { + if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { + _matrix.chains[i] /= _index; + + if (_matrix.chains[i].isNull()) { + _matrix.chainsStates.setOff(i); + } + } + + if (!_chain.isNull(i)) { + _matrix.chainsStates |= i; + _matrix.chains[i][_index] = _chain[i]; + } + } +} + +/** + * \brief Set a row from the matrix, even if matrix is a row-chain matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] _index The coefficient index. + * \param[in] _chain The new row. + * + * \see \link OSM::Chain \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 17/04/2024 + */ +template +void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { + if(_matrix.dimensions().second != _chain.dimension()) + throw("setColumn dimension error") ; + _matrix[_index] = _chain; + if (_chain.isNull()) + _matrix.chainsStates.setOff(_index) ; +} + +} /* end namespace OSM */ +} /* end namespace CGAL */ + +#endif diff --git a/HDVF/doc/HDVF/fig/lower_star_filtration_y.png b/HDVF/doc/HDVF/fig/lower_star_filtration_y.png new file mode 100644 index 0000000000000000000000000000000000000000..8a7ddb91850a8e42be644ce3b8b4beeb9166d7a3 GIT binary patch literal 189897 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

    );SvfeNqR?GaGpD~yFD`E94$x)g=LP{- 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 hz$kFa#^5x-hKHdnhrRm$5XpawRX$EAjqZ(hdvf, L, options.outfile_root+"_complex_K") ; + Simp_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; } // L-K { hdvf.set_mask_L_K() ; - Simp_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; + Simp_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; } } @@ -254,12 +254,12 @@ void main_code (const Options &options) // K { hdvf.set_mask_K() ; - Cub_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; + Cub_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; } // L-K { hdvf.set_mask_L_K() ; - Cub_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; + Cub_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; } } diff --git a/HDVF/examples/HDVF/main_hdvf.cpp b/HDVF/examples/HDVF/main_hdvf.cpp index 7e1e79f79b57..a3a14bcd92bd 100644 --- a/HDVF/examples/HDVF/main_hdvf.cpp +++ b/HDVF/examples/HDVF/main_hdvf.cpp @@ -19,6 +19,7 @@ #include "CGAL/Hdvf/CubComplexTools.hpp" #include "CGAL/Hdvf/Hdvf.h" #include "CGAL/OSM/OSM.hpp" +#include "CGAL/OSM/Sparse_chain.h" #include "CGAL/Hdvf/hdvf_tools.hpp" #include "arguments.h" @@ -207,6 +208,16 @@ int main(int argc, char **argv) Options options(read_arguments_hdvf(argc, argv)) ; cout << "options:" << endl << options ; + // TEST + cout << "TEST" << endl ; + OSM::Sparse_chain gamma(4) ; + cout << "before: " << gamma.is_null() << endl ; + gamma.set_coef(2, 1) ; + cout << "after: " << gamma.is_null() << endl ; + gamma.set_coef(2, 0) ; + cout << "after2: " << gamma.is_null() << endl ; + cout << "END TEST" << endl ; + // ----- Definition of the CoefficientType #ifndef SCALAR if (options.scalar == 0) diff --git a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp index 12e8e7f1a380..7ce2cc42e0cb 100644 --- a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp @@ -69,9 +69,9 @@ class Abstract_simplicial_chain_complex { Abstract_simplicial_chain_complex(const Mesh_object& mesh); /** \brief Type of column-major chains */ - typedef OSM::Chain CChain; + typedef OSM::Sparse_chain CChain; /** \brief Type of row-major chains */ - typedef OSM::Chain RChain ; + typedef OSM::Sparse_chain RChain ; /** \brief Type of column-major sparse matrices */ typedef OSM::Sparse_matrix CMatrix; @@ -349,7 +349,7 @@ void Abstract_simplicial_chain_complex::calculate_d(int dim) co auto it = _simp2ind[dim - 1].find(bord[j]); // Find the index of Simplex j if (it != _simp2ind[dim - 1].end()) { // If Simplex j is found int ind_j = it->second; // Retrieve the index of Simplex j - chain[ind_j] = (j % 2 == 0) ? 1 : -1; + chain.set_coef(ind_j, (j % 2 == 0) ? 1 : -1); } else throw "calculate_d boundary simplex not found!"; @@ -486,11 +486,11 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex& chain, int q, int cellId = -1) ; + static void Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Sparse_chain& chain, int q, int cellId = -1) ; }; // Initialization of static VTK_simptypes @@ -602,7 +602,7 @@ void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk( // Simplicial_chain_complex_chain_to_vtk template -void Simplicial_chain_complex::Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) +void Simplicial_chain_complex::Simplicial_chain_complex_chain_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const OSM::Sparse_chain& chain, int q, int cellId) { typedef Simplicial_chain_complex ComplexType ; if (K._coords.size() != K.nb_cells(0)) @@ -653,7 +653,7 @@ void Simplicial_chain_complex::Simplicial_chain_complex_chain_t const int size_cell = q+1 ; for (int id =0; id < K.nb_cells(q); ++id) { - if (!chain.isNull(id)) + if (!chain.is_null(id)) { ++ncells_tot; size_cells_tot += (size_cell+1) ; @@ -667,7 +667,7 @@ void Simplicial_chain_complex::Simplicial_chain_complex_chain_t const int size_cell = q+1 ; for (int id =0; id < K.nb_cells(q); ++id) { - if (!chain.isNull(id)) + if (!chain.is_null(id)) { Simplex verts(K._ind2simp.at(q).at(id)) ; out << size_cell << " " ; diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index a350b1038a17..9c5d5c5dcd61 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -38,7 +38,7 @@ namespace CGAL { namespace HDVF { -template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::Sparse_matrix> +template typename _ChainType = OSM::Sparse_chain, template typename _SparseMatrixType = OSM::Sparse_matrix> void Cub_output_vtk (Hdvf_core, _ChainType, _SparseMatrixType> &hdvf, Cubical_chain_complex &complex, string filename = "test") { typedef Hdvf_core, _ChainType, _SparseMatrixType> HDVF_type; @@ -61,7 +61,7 @@ void Cub_output_vtk (Hdvf_core, _Chain { string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; // vector > labels = hdvf.export_label(G,c,q) ; - OSM::Chain chain(hdvf.export_homology_chain(c,q)) ; + OSM::Sparse_chain chain(hdvf.export_homology_chain(c,q)) ; ComplexType::Cubical_chain_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; } if (q < complex.dim()) @@ -69,7 +69,7 @@ void Cub_output_vtk (Hdvf_core, _Chain if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_F)) { string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; - OSM::Chain chain(hdvf.export_cohomology_chain(c,q)) ; + OSM::Sparse_chain chain(hdvf.export_cohomology_chain(c,q)) ; ComplexType::Cubical_chain_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; } } diff --git a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp index 511f7610a346..1966fb3a86a3 100644 --- a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp @@ -126,9 +126,9 @@ class Cubical_chain_complex { friend Duality_cubical_complex_tools ; /** \brief Type of column-major chains */ - typedef OSM::Chain CChain; + typedef OSM::Sparse_chain CChain; /** \brief Type of row-major chains */ - typedef OSM::Chain RChain ; + typedef OSM::Sparse_chain RChain ; /** \brief Type of column-major sparse matrices */ typedef OSM::Sparse_matrix CMatrix; @@ -335,11 +335,11 @@ class Cubical_chain_complex { * * \param[in] K Cubical complex exported. * \param[in] filename Output file root (output filenames will be built from this root). - * \param[in] chain Chain exported (all the cells with non-zero coefficients in the chain are exported to vtk). + * \param[in] chain Sparse_chain exported (all the cells with non-zero coefficients in the chain are exported to vtk). * \param[in] q Dimension of the cells of the chain. * \param[in] cellId If a positive cellID is provided, labels are exported to distinguish cells of the chain (label 2) from cellId cell (label 0). */ - static void Cubical_chain_complex_chain_to_vtk(const Cubical_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId = -1) ; + static void Cubical_chain_complex_chain_to_vtk(const Cubical_chain_complex &K, const std::string &filename, const OSM::Sparse_chain& chain, int q, int cellId = -1) ; protected: // Methods to access data @@ -398,11 +398,11 @@ class Cubical_chain_complex { // Insert the coefficient in the corresponding row of the boundary matrix if (cell1 >= 0 && cell1 < _cells.size()) { int index = _bool2base[dim - 1].at(cell1); - boundary[index] = sign; + boundary.set_coef(index, sign); } if (cell2 >= 0 && cell2 < _cells.size()) { int index = _bool2base[dim - 1].at(cell2); - boundary[index] = -sign; + boundary.set_coef(index, -sign); } } } @@ -924,7 +924,7 @@ void Cubical_chain_complex::Cubical_chain_complex_to_vtk(const */ template -void Cubical_chain_complex::Cubical_chain_complex_chain_to_vtk(const Cubical_chain_complex &K, const std::string &filename, const OSM::Chain& chain, int q, int cellId) +void Cubical_chain_complex::Cubical_chain_complex_chain_to_vtk(const Cubical_chain_complex &K, const std::string &filename, const OSM::Sparse_chain& chain, int q, int cellId) { bool with_scalars = (cellId != -1) ; @@ -967,7 +967,7 @@ void Cubical_chain_complex::Cubical_chain_complex_chain_to_vtk( const int size_cell = 1<::Cubical_chain_complex_chain_to_vtk( const int size_cell = q+1 ; for (int id =0; id < K.nb_cells(q); ++id) { - if (!chain.isNull(id)) + if (!chain.is_null(id)) { vector khal(K.ind2khal(K._base2bool.at(q).at(id))) ; vector verts(K.khal_to_verts(K.ind2khal(K._base2bool.at(q).at(id)))) ; diff --git a/HDVF/include/CGAL/HDVF/Filtration_core.h b/HDVF/include/CGAL/HDVF/Filtration_core.h index 6f8e8c74a9a5..5e809ff3755d 100644 --- a/HDVF/include/CGAL/HDVF/Filtration_core.h +++ b/HDVF/include/CGAL/HDVF/Filtration_core.h @@ -90,12 +90,12 @@ class Filtration_core /*! Type of column-major chains */ - typedef OSM::Chain CChain ; + typedef OSM::Sparse_chain CChain ; /*! Type of row-major chains */ - typedef OSM::Chain RChain ; + typedef OSM::Sparse_chain RChain ; public: /*! \brief Filtration_core default constructor * diff --git a/HDVF/include/CGAL/HDVF/Hdvf.h b/HDVF/include/CGAL/HDVF/Hdvf.h index e64d23a55f17..74c6dc2f0551 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf.h +++ b/HDVF/include/CGAL/HDVF/Hdvf.h @@ -44,12 +44,12 @@ Using appropriate combinations of such operations, one can change a HDVF until c */ template -class Hdvf : public Hdvf_core { +class Hdvf : public Hdvf_core { public: /*! Type of parent Hdvf_core class. */ - typedef Hdvf_core HDVF_coreT ; + typedef Hdvf_core HDVF_coreT ; /** * \brief Default constructor. @@ -68,7 +68,7 @@ class Hdvf : public Hdvf_core(hdvf) { } + Hdvf(const Hdvf& hdvf) : Hdvf_core(hdvf) { } /** * \brief HDVF destructor. */ @@ -262,7 +262,7 @@ class Hdvf : public Hdvf_core -Hdvf::Hdvf(const ComplexType& K, int hdvf_opt) : Hdvf_core(K, hdvf_opt) { } +Hdvf::Hdvf(const ComplexType& K, int hdvf_opt) : Hdvf_core(K, hdvf_opt) { } @@ -604,7 +604,7 @@ PairCell Hdvf::find_pair_MW(int q, bool &found) co for (int sigma = 0; (sigma < this->_H_col.at(q-1).dimensions().first && !found); ++sigma) { typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; - if (!H11q1.isNull()) + if (!H11q1.is_null()) { typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; @@ -648,19 +648,19 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; - if (H11.isNull() || projP_d_pi.isNull()) + if (H11.is_null() || projP_d_pi.is_null()) return p ; // Search for sigma with col_sigma(H_q-1) non empty for (int sigma = 0; (sigma < this->_H_col.at(q-1).dimensions().first && !found); ++sigma) { typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; - if (!H11q1.isNull()) + if (!H11q1.is_null()) { // and proj_S(cod(sigma)) non empty typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; - if (!projS_cod_sigma.isNull()) + if (!projS_cod_sigma.is_null()) { // test xi and xip const int xi = projS_cod_sigma * H11 ; @@ -684,7 +684,7 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; - if (H11q1.isNull() || projS_cod_sigma.isNull()) + if (H11q1.is_null() || projS_cod_sigma.is_null()) return p ; // Search for pi with col pi of H_q non empty @@ -696,7 +696,7 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; // proj_P of d(pi) must also be non empty - if (!projP_d_pi.isNull()) + if (!projP_d_pi.is_null()) { // test xi and xip const int xi = projS_cod_sigma * H11 ; @@ -735,7 +735,7 @@ std::vector Hdvf::find_pairs_MW(int q, b for (int sigma = 0; sigma < this->_H_col.at(q-1).dimensions().first; ++sigma) { typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; - if (!H11q1.isNull()) + if (!H11q1.is_null()) { typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; @@ -781,19 +781,19 @@ std::vector Hdvf::find_pairs_MW(int q, b typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; - if (H11.isNull() || projP_d_pi.isNull()) + if (H11.is_null() || projP_d_pi.is_null()) return pairs ; // Search for sigma with col_sigma(H_q-1) non empty for (int sigma = 0; sigma < this->_H_col.at(q-1).dimensions().first; ++sigma) { typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; - if (!H11q1.isNull()) + if (!H11q1.is_null()) { // and proj_S(cod(sigma)) non empty typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; - if (!projS_cod_sigma.isNull()) + if (!projS_cod_sigma.is_null()) { // test xi and xip const CoefficientType xi = projS_cod_sigma * H11 ; @@ -819,7 +819,7 @@ std::vector Hdvf::find_pairs_MW(int q, b typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; - if (H11q1.isNull() || projS_cod_sigma.isNull()) + if (H11q1.is_null() || projS_cod_sigma.is_null()) return pairs ; // Search for pi with col pi of H_q non empty @@ -831,7 +831,7 @@ std::vector Hdvf::find_pairs_MW(int q, b typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; // proj_P of d(pi) must also be non empty - if (!projP_d_pi.isNull()) + if (!projP_d_pi.is_null()) { // test xi and xip const CoefficientType xi = projS_cod_sigma * H11 ; @@ -992,7 +992,7 @@ void Hdvf::M(int pi, int gamma, int q) { typename HDVF_coreT::CChain F21(OSM::get_column(this->_F_row[q], pi)); // F21 is the column chain from this->_F_row[q] at index pi // Get the coefficient at the intersection of F12 and F21 - CoefficientType F11(F12[pi]); // F11 is the coefficient at row gamma and column pi + const CoefficientType F11(F12.get_coef(pi)); // F11 is the coefficient at row gamma and column pi // Assert that F11 is either 1 or -1 (for invertibility) assert((F11 == 1) || (F11 == -1)); // !!!!! Test invertibility @@ -1116,7 +1116,7 @@ void Hdvf::W(int sigma, int gamma, int q) { typename HDVF_coreT::CChain G21(OSM::get_column(this->_G_col[q], gamma)); // G21 is the column chain from this->_G_col[q] at index gamma // Get the coefficient at the intersection of G12 and G21 - CoefficientType G11(G12[gamma]); // G11 is the coefficient at row sigma and column gamma + CoefficientType G11(G12.get_coef(gamma)); // G11 is the coefficient at row sigma and column gamma // Assert that G11 is either 1 or -1 (for invertibility) assert((G11 == 1) || (G11 == -1)); // !!!!! Test invertibility diff --git a/HDVF/include/CGAL/HDVF/Hdvf_core.h b/HDVF/include/CGAL/HDVF/Hdvf_core.h index 663d86709bd1..ca4333968c70 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_core.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_core.h @@ -76,12 +76,12 @@ inline std::ostream& operator<<(std::ostream &out, const std::vector& \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. - \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). + \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Sparse_chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::Sparse_matrix`), providing the type of sparse matrices used. */ -template typename ChainType = OSM::Chain, template typename SparseMatrixType = OSM::Sparse_matrix> +template typename ChainType = OSM::Sparse_chain, template typename SparseMatrixType = OSM::Sparse_matrix> class Hdvf_core { public: /*! @@ -356,7 +356,7 @@ class Hdvf_core { { CChain g_cell(OSM::get_column(_G_col.at(q), cell)) ; // Add 1 to the cell - g_cell[cell] = 1 ; + g_cell.set_coef(cell, 1) ; return g_cell ; } else @@ -378,7 +378,7 @@ class Hdvf_core { { RChain fstar_cell(OSM::get_row(_F_row.at(dim), cell)) ; // Add 1 to the cell - fstar_cell[cell] = 1 ; + fstar_cell.set_coef(cell, 1) ; // Compute the cofaces if (dim < _K.dim()) { @@ -388,7 +388,7 @@ class Hdvf_core { // Set the cofaces of it->first in dimension dim+1 RChain cofaces(_K.cod(it->first,dim)) ; for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) - fstar_cofaces[it2->first] = 1 ; + fstar_cofaces.set_coef(it2->first, 1) ; } return fstar_cofaces ; } @@ -696,7 +696,7 @@ void Hdvf_core::A(int // Extract submatrices from _DD_col RChain D12(OSM::get_row(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 CChain D21(OSM::get_column(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 - CoefficientType D11(D12[tau2]); // D11 is the coefficient at the intersection of tau2 in D12 + const CoefficientType D11 = D12.get_coef(tau2); // D11 is the coefficient at the intersection of tau2 in D12 // Assert that D11 is either 1 or -1 (check invertibility) assert((D11 == 1) || (D11 == -1)); // !!!!! Test invertibility diff --git a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h index 80b0f259076a..4d31a45a2209 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h @@ -124,19 +124,19 @@ ostream& operator<< (ostream& out, const PerHoleT& hole) */ template -class Hdvf_persistence : public Hdvf_core +class Hdvf_persistence : public Hdvf_core { public: // Matrices types /*! Type of column-major chains */ - typedef OSM::Chain CChain; + typedef OSM::Sparse_chain CChain; /*! Type of row-major chains */ - typedef OSM::Chain RChain; + typedef OSM::Sparse_chain RChain; /*! Type of column-major sparse matrices @@ -151,7 +151,7 @@ class Hdvf_persistence : public Hdvf_core HDVFParent ; + typedef Hdvf_core HDVFParent ; /*! Type of filtrations used to compute persistence. */ @@ -412,13 +412,13 @@ class Hdvf_persistence : public Hdvf_core_G_col.at(q), cell)) ; // Add 1 to the cell - g_cell[cell] = 1 ; + g_cell.set_coef(cell, 1) ; // Compute the chain with _K indices CChain g_cell_K(g_cell.dimension()) ; for (typename CChain::const_iterator it = g_cell.begin(); it != g_cell.end(); ++it) { const int i(_per_to_K.at(q).at(it->first)) ; - g_cell_K[i] = it->second ; + g_cell_K.set_coef(i, it->second) ; } return g_cell_K ; } @@ -445,7 +445,7 @@ class Hdvf_persistence : public Hdvf_core_F_row.at(q), cell)) ; // Add 1 to the cell - fstar_cell[cell] = 1 ; + fstar_cell.set_coef(cell, 1) ; // Compute the cofaces of the chain with _K indices if (q < this->_K.dim()) { @@ -460,7 +460,7 @@ class Hdvf_persistence : public Hdvf_corefirst) ; if (_K_to_per.at(q+1).at(id) <=_t_dim.at(q+1)) - fstar_cofaces[id] = 1 ; + fstar_cofaces.set_coef(id, 1) ; } } return fstar_cofaces ; @@ -662,7 +662,7 @@ class Hdvf_persistence : public Hdvf_core -Hdvf_persistence::Hdvf_persistence(const ComplexType& K, const FiltrationType& f, int hdvf_opt, bool with_export) : Hdvf_core(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1) +Hdvf_persistence::Hdvf_persistence(const ComplexType& K, const FiltrationType& f, int hdvf_opt, bool with_export) : Hdvf_core(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1) { // Initialisation of _t_dim, _K_to_per and _per_to_K _t_dim.resize(this->_K.dim()+1, 0) ; @@ -740,7 +740,7 @@ PairCell Hdvf_persistence if (q >= 1) { - // Compute bounded max while iterating over the Chain + // Compute bounded max while iterating over the Sparse_chain const CChain& tmp2(OSM::cget_column(this->_DD_col.at(q), sigma)) ; std::size_t tmax = _t_dim.at(q-1) ; std::size_t i ; diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index 34d5bebb7be2..71405698c5ac 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -31,7 +31,7 @@ namespace HDVF { /** \brief vtk export for SimpComplex */ -template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::Sparse_matrix, typename VertexIdType = int> +template typename _ChainType = OSM::Sparse_chain, template typename _SparseMatrixType = OSM::Sparse_matrix, typename VertexIdType = int> void Simp_output_vtk (Hdvf_core, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") { typedef Simplicial_chain_complex ComplexType; @@ -53,7 +53,7 @@ void Simp_output_vtk (Hdvf_core, _C { string outfile_g(filename+"_G_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; // vector > labels = hdvf.export_label(G,c,q) ; - OSM::Chain chain(hdvf.export_homology_chain(c,q)) ; + OSM::Sparse_chain chain(hdvf.export_homology_chain(c,q)) ; ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, outfile_g, chain, q, c) ; } if (q < complex.dim()) @@ -61,7 +61,7 @@ void Simp_output_vtk (Hdvf_core, _C if (hdvf.get_hdvf_opts() & (OPT_FULL | OPT_F)) { string outfile_f(filename+"_FSTAR_"+to_string(c)+"_dim_"+to_string(q)+".vtk") ; - OSM::Chain chain(hdvf.export_cohomology_chain(c,q)) ; + OSM::Sparse_chain chain(hdvf.export_cohomology_chain(c,q)) ; ComplexType::Simplicial_chain_complex_chain_to_vtk(complex, outfile_f, chain, q+1, c) ; } } diff --git a/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h index c3c20cdd1ae9..edf3d4e00b9f 100644 --- a/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h +++ b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h @@ -74,8 +74,8 @@ class Sub_chain_complex_mask if (q>0) // Then faces must be considered { // Add all its faces to faces.at(q-1) - OSM::Chain bnd(_K.d(i,q)) ; - for (typename OSM::Chain::const_iterator it = bnd.cbegin(); it != bnd.cend(); ++it) + OSM::Sparse_chain bnd(_K.d(i,q)) ; + for (typename OSM::Sparse_chain::const_iterator it = bnd.cbegin(); it != bnd.cend(); ++it) { const int c(it->first) ; if (!_sub.at(q-1).isOn(c)) diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp index 591bb5625596..7932ae078601 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -35,14 +35,14 @@ namespace HDVF { */ template -class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> { +class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::SubSparseMatrix> { private: // Matrices types - typedef OSM::Chain<_CoefficientType, OSM::COLUMN> CChain; - typedef OSM::Chain<_CoefficientType, OSM::ROW> RChain; + typedef OSM::Sparse_chain<_CoefficientType, OSM::COLUMN> CChain; + typedef OSM::Sparse_chain<_CoefficientType, OSM::ROW> RChain; // HDVF Type - typedef Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix> HDVF_type ; + typedef Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::SubSparseMatrix> HDVF_type ; // Complex L const _ComplexType& _L ; @@ -278,7 +278,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain // Get g(cell, dim) with per indices CChain g_cell(OSM::get_column(this->_G_col.at(dim), cell)) ; // Add 1 to the cell - g_cell[cell] = 1 ; + g_cell.set_coef(cell, 1) ; // Keep cells of the chain belonging to _subCC CChain g_cell_sub(g_cell.dimension()) ; for (typename CChain::const_iterator it = g_cell.begin(); it != g_cell.end(); ++it) @@ -286,7 +286,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain if (_subCC.get_Bit(dim, it->first)) { - g_cell_sub[it->first] = it->second ; + g_cell_sub.set_coef(it->first, it->second) ; } } return g_cell_sub ; @@ -308,7 +308,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain { RChain fstar_cell(OSM::get_row(this->_F_row.at(dim), cell)) ; // Add 1 to the cell - fstar_cell[cell] = 1 ; + fstar_cell.set_coef(cell, 1) ; // Compute the cofaces if (dim < this->_K.dim()) { @@ -320,7 +320,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) { if (_subCC.get_Bit(dim+1, it2->first)) - fstar_cofaces[it2->first] = 1 ; + fstar_cofaces.set_coef(it2->first, 1) ; } } return fstar_cofaces ; @@ -329,32 +329,11 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain return CChain(0) ; } } - - // // Get fstar(cell, dim) with per indices - // RChain fstar_cell(OSM::cget_row(this->_F_row.at(dim), cell)) ; - // // Add 1 to the cell - // fstar_cell[cell] = 1 ; - // // Keep cells of the chain belonging to _subCC - // // Compute the chain (transpose of F_STAR column) - // CChain fstar_cell_sub(fstar_cell.dimension()) ; - // for (typename RChain::const_iterator it = fstar_cell.begin(); it != fstar_cell.end(); ++it) - // { - // // Keep cells of the chain belonging to _subCC - // if (_subCC.get_Bit(dim, it->first)) - // { - // fstar_cell_sub[it->first] = it->second ; - // } - // } - // return fstar_cell_sub ; - // } - // else - // throw "Error : trying to export g_chain without proper HDVF option" ; - } ; template Hdvf_duality<_CoefficientType,_ComplexType>::Hdvf_duality(const _ComplexType& L, Sub_chain_complex_mask<_CoefficientType, _ComplexType>& K, int hdvf_opt) : -Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} +Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} /** \brief find a valid PairCell for A in dimension q */ template diff --git a/HDVF/include/CGAL/OSM/Chain.h b/HDVF/include/CGAL/OSM/Chain.h deleted file mode 100644 index ba914f78cd50..000000000000 --- a/HDVF/include/CGAL/OSM/Chain.h +++ /dev/null @@ -1,981 +0,0 @@ -/** - * \file Chain.hpp - * \brief Namespace file for describing library. - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - * - * Define everything for the Chain class - */ - -#ifndef __OSM_CHAIN__ -#define __OSM_CHAIN__ - - -#include "__base.hpp" -#include "Sparse_matrix.h" -#include -#include -#include -#include - -namespace CGAL { -namespace OSM { - -/** - * \class Chain - * \brief Allow to create row/column sparse vectors. - * - * The Chain class contains all algebraic functions that are related to vectors. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -class Chain { - -public: - typedef std::pair pair; - typedef typename std::unordered_map::iterator iterator; - typedef typename std::unordered_map::const_iterator const_iterator; - - // Add these lines to allow the Sparse_matrix class to access other templated - // SparsedMatrix private members. - template - friend class Chain; - template - friend class Sparse_matrix; -protected: - /** \brief The chain inner representation and storage of data. */ - std::unordered_map chainData; - - /** \brief The chain coefficient type. */ - typedef _CoefficientType coefficientType; - - /** \brief The chain type flag. */ - int chainTypeFlag = _ChainTypeFlag; - - /** \brief The chain boundary. */ - int upperBound; - -public: - /** - * \brief Create new Chain for Sparse_matrix object. - * - * Default constructor, initialize an empty Chain as a Z integers column chain. - * The default chain size is 128. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain() { - upperBound = 0; - chainData = std::unordered_map(); - } - - /** - * \brief Create new Chain for Sparse_matrix object. - * - * Constructor with size, initialize an empty Chain as a Z integers column chain with boundary check. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _chainSize The upper bound of the Chain. - * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain(const int _chainSize) { - upperBound = _chainSize; - chainData = std::unordered_map(); - } - - /** - * \brief Size of the chain - * - * \return Size of the chain (upperBound) - * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - size_t dimension() const { return upperBound ; } - - /** - * \brief Create new Chain for Sparse_matrix object. - * - * Copy constructor, initialize a Chain based on the same type of chain. - * The resulting chain will be a copy of the passed chain. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the other chain is not the same coefficient type. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _otherToCopy The chain we want to copy. - * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain(const Chain &_otherToCopy) { - upperBound = _otherToCopy.upperBound; - chainData = _otherToCopy.chainData; - // *this = _otherToCopy; - } - - /** - * \brief Assign to other chain. - * - * Assign to other chain coefficient-wise, equivalent to copying it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the other chain is not the same coefficient type. - * - * \param[in] _otherToCopy The chain we want to copy. - * - * \return The reference to the modified chain. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator=(const Chain &_otherToCopy) { - upperBound = _otherToCopy.upperBound; - chainData = _otherToCopy.chainData; - - return *this; - } - - /** - * \brief Displays a Chain in the output stream. - * - * \param[in] _stream The output stream. - * \param[in] _chain The chain to display. - * - * \return A reference to the modified stream. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - friend std::ostream& operator<<(std::ostream &_stream, const Chain &_chain) { - _stream << "["; - for (const_iterator i = _chain.chainData.begin() ; i != _chain.chainData.end() ; ++i) { - _stream << i->first << ": " << i->second << ", "; - } - - if (_chain.chainData.size() > 0) { - _stream << "\b\b"; - } - _stream << "]"; - - return _stream; - } - - /** - * \brief Adds two chains together. - * - * Adds each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _first The first chain. - * \param[in] _second The second chain. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator+(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { - Chain newChain = _first; - newChain += _second; - - return newChain; - } - - /** - * \brief Substract two chains together. - * - * Substract each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _first The first chain. - * \param[in] _second The second chain. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator-(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { - Chain newChain = _first; - newChain -= _second; - - return newChain; - } - - /** - * \brief Apply factor on each coefficients. - * - * \param[in] _lambda The factor to apply. - * \param[in] _chain The second chain. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator*(const _CoefficientType& _lambda, const Chain<_CoefficientType, _CTF> &_chain) { - Chain newChain = _chain; - newChain *= _lambda; - - return newChain; - } - - /** - * \brief Apply factor on each coefficients. - * - * \param[in] _chain The second chain. - * \param[in] _lambda The factor to apply. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator*(const Chain<_CoefficientType, _CTF> &_chain, const _CoefficientType& _lambda) { - Chain newChain = _chain; - newChain *= _lambda; - - return newChain; - } - - /** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); - - /** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); - - /** - * \brief Perform dot product between two chains. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _row The row chain. - * \param[in] _column The column chain. - * - * \return The result of type _CoefficientType. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend _CT operator*(const Chain<_CT, ROW> &_row, const Chain<_CT, COLUMN> &_column); - - /** - * \brief Add a chain and assign. - * - * Adds each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _other The other chain. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator+=(const Chain &_other) { - if (this->upperBound != _other.upperBound) { - throw std::runtime_error("Chains must be the same size."); - } - - for (pair pair: _other.chainData) { - this->chainData[pair.first] += pair.second; - - if (this->chainData[pair.first] == 0) { - this->chainData.erase(pair.first); - } - } - - return *this; - } - - /** - * \brief Substract a chain and assign. - * - * Substract each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _other The other chain. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator-=(const Chain &_other) { - if (this->upperBound != _other.upperBound) { - throw std::runtime_error("Chains must be the same size."); - } - - for (pair pair: _other.chainData) { - this->chainData[pair.first] -= pair.second; - - if (this->chainData[pair.first] == 0) { - this->chainData.erase(pair.first); - } - } - - return *this; - } - - /** - * \brief Apply factor on each coefficients and assign. - * - * \param[in] _lambda The factor to apply. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator*=(const _CoefficientType& _lambda) { - if (_lambda == 0) { - this->chainData.clear(); - return *this; - } - - for (pair pair: this->chainData) { - this->chainData[pair.first] = pair.second * _lambda; - } - - return *this; - } - - /** - * \brief Get a coefficient from the chain. - * - * \warning The chain will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The coefficient stored in the chain. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - _CoefficientType operator[](const int _index) const { - if (_index >= upperBound) { - throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); - } - - return chainData.at(_index); - } - - /** - * \brief Set a coefficient in the chain. - * - * \warning The chain will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The reference to the assigned coefficient. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - _CoefficientType& operator[](const int _index) { - if (_index >= upperBound) { - throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); - } - - return chainData[_index]; - } - - /** - * \brief Checks if a coefficient is null. Should be used instead of operator[] for that case. - * - * \param[in] _index The index to check. - * \return True if the data is null at given index. - * - * \author Fedyna K. - * \version 0.2.0 - * \date 29/05/2024 - */ - const bool isNull(const int _index) const { - return chainData.find(_index) == chainData.end(); - } - - /** - * \brief Checks if the chain is null. - * - * \return True if the chain is null. - * - * \author Fedyna K. - * \version 0.2.0 - * \date 29/05/2024 - */ - const bool isNull() const { - return chainData.size() == 0; - } - - /** - * \brief Get a subchain from the chain. - * - * Removes all indexes provided in the vector from the chain and returns it. - * - * \note Will return a copy of the chain if given vector is empty. - * - * \param[in] _chain The chain to process. - * \param[in] _indexes The indexes to remove. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes); - - /** - * \brief Get a subchain from the chain. - * - * Removes the index provided from the chain and returns it. - * - * \note Will return a copy of the chain if given vector is empty. - * - * \param[in] _chain The chain to process. - * \param[in] _index The index to remove. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _indexes); - - /** - * \brief Get a subchain from the chain and assign. - * - * Removes all indexes provided in the vector from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _indexes The indexes to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator/=(const std::vector &_indexes) { - for (int index : _indexes) { - this->chainData.erase(index); - } - - return *this; - } - - /** - * \brief Get a subchain from the chain and assign. - * - * Removes the index provided from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _index The index to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator/=(const int _index) { - this->chainData.erase(_index); - - return *this; - } - - /** - * \brief Set all coefficients to zero. - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ - void nullify() { - this->chainData.clear(); - } - - /** - * \brief Iterator to the beginning of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The iterator to the beginning of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::iterator \endlink - * \see \link std::unordered_map::begin \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - iterator begin() noexcept { - return chainData.begin(); - } - - /** - * \brief Constant iterator to the beginning of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the beginning of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::begin \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - const_iterator begin() const noexcept { - return chainData.begin(); - } - - /** - * \brief Constant iterator to the beginning of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the beginning of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::cbegin \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - const_iterator cbegin() const noexcept { - return chainData.cbegin(); - } - - /** - * \brief Iterator to the end of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The iterator to the end of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::iterator \endlink - * \see \link std::unordered_map::end \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - iterator end() noexcept { - return chainData.end(); - } - - /** - * \brief Constant iterator to the end of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the end of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::end \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - const_iterator end() const noexcept { - return chainData.end(); - } - - /** - * \brief Constant iterator to the end of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the end of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::cend \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - const_iterator cend() const noexcept { - return chainData.cend(); - } - - /** - * \brief Transpose a Chain. - * - * \return A new chain where the chain type flag is changed. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { - Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> chain; - - chain.upperBound = this->upperBound; - for (pair pair: this->chainData) { - chain.chainData[pair.first] = pair.second; - } - - return chain; - } - - /** - * \brief Checks if chain is a column. - * - * \return true if chain is represented as a column, false otherwise. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ - bool isColumn() const { - return _ChainTypeFlag == COLUMN; - } - - /** - * \brief Checks if chain is a row. - * - * \return true if chain is represented as a row, false otherwise. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ - bool isRow() const { - return _ChainTypeFlag == ROW; - } -}; - - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - Sparse_matrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); - - for (std::pair pair : _row.chainData) { - OSM::set_column(matrix,pair.first,_column * pair.second) ; - } - - return matrix; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - Sparse_matrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); - - for (std::pair pair : _column.chainData) { - OSM::set_row(matrix,pair.first,_row * pair.second); - } - - return matrix; -} - -/** - * \brief Perform dot product between two chains. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _row The row chain. - * \param[in] _column The column chain. - * - * \return The result of type _CoefficientType. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -_CoefficientType operator*(const Chain<_CoefficientType, ROW> &_row, const Chain<_CoefficientType, COLUMN> &_column) { - // Get indexes (avoid adding double indexes). - std::unordered_map indexes; - for (std::pair pair: _row.chainData) { - indexes[pair.first] = 1; - } - for (std::pair pair: _column.chainData) { - indexes[pair.first] += 1; - } - - // Perform dot product - _CoefficientType result = _CoefficientType(); - for (std::pair index: indexes) { - if (index.second == 2) { - result += _row.chainData.at(index.first) * _column.chainData.at(index.first); - } - } - - return result; -} - -/** - * \brief Get a subchain from the chain and assign. - * - * Removes all indexes provided in the vector from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _indexes The indexes to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes) { - Chain newChain = _chain; - newChain /= _indexes; - return newChain; -} - -/** - * \brief Get a subchain from the chain and assign. - * - * Removes the index provided from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _index The index to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _index) { - Chain newChain = _chain; - newChain /= _index; - return newChain; -} - -} /* end namespace OSM */ -} /* end namespace CGAL */ - -#endif diff --git a/HDVF/include/CGAL/OSM/OSM.hpp b/HDVF/include/CGAL/OSM/OSM.hpp index 0c33a30d271f..413b0c7eb86b 100644 --- a/HDVF/include/CGAL/OSM/OSM.hpp +++ b/HDVF/include/CGAL/OSM/OSM.hpp @@ -14,7 +14,7 @@ //#define DEBUG #include "__base.hpp" -#include "Chain.h" +#include "Sparse_chain.h" #include "Sparse_matrix.h" #endif diff --git a/HDVF/include/CGAL/OSM/Sparse_chain.h b/HDVF/include/CGAL/OSM/Sparse_chain.h new file mode 100644 index 000000000000..e23a3197f287 --- /dev/null +++ b/HDVF/include/CGAL/OSM/Sparse_chain.h @@ -0,0 +1,774 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac +// Kevin Fedyna + +#ifndef CGAL_OSM_SPARSE_CHAIN_H +#define CGAL_OSM_SPARSE_CHAIN_H + +#include "__base.hpp" +#include "Sparse_matrix.h" +#include +#include +#include +#include + +namespace CGAL { +namespace OSM { + +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Sparse_chain` implements the concept `SparseChain`, that is, sparse vectors (encoding homological chains) optimized for topological computations. + Given a complex (for instance a simplicial, cubical or cellular complex) which cells in a given dimension \f$q\f$ are numbered + \f$\{\sigma_i\,;\, i=1\ldots n_q\}\f$, homology with coefficients in a given ring \f$\mathbb K\f$ defines \f$q\f$-chains as formal linear combinations: + \f\[\gamma = \sum_{i=1}^{n_q}\lambda_i\cdot \sigma_i\f\] + with coefficients \f$\lambda_i\in\mathbb K\f$. + In the basis \f$\{\sigma_i\,;\, i=1\ldots n_q\}\f$, the coordinates of \f$\gamma\f$ are given by the vector: \f$[\lambda_1,\ldots \lambda_{n_q}]\f$. + + Now, as chains considered in homology are boundaries of cells, most \f$\lambda_i\f$ coefficients are null. + Hence `Sparse_chain` encodes such vectors in a "sparse" way, that is, storing only non zero coefficients through a map: + \f\[i\mapsto \lambda_i\ \ \ \forall i=1\ldots n_q\text{ such that }\lambda_i\neq 0\f\] + Moreover, as per any linear algebra vector, a `Sparse_chain` is either a column or row vector (the `ChainTypeFlag` parameter determines the type). + + The class `Sparse_chain` provides standard linear algebra operators and fast iterators and block operations (set, get and nullify) which are required to implement efficiently HDVFs. + + \cgalModels{SparseChain} + + \tparam CoefficientType a model of the `Ring` concept, providing the ring used to compute homology. + \tparam ChainTypeFlag an integer constant encoding the type of matrices (`OSM::COLUMN` or `OSM::ROW`). +*/ + +template +class Sparse_chain { + +public: + /*! + Type of chains iterators. + */ + typedef typename std::unordered_map::iterator iterator; + + /*! + Type of chains constant iterators. + */ + typedef typename std::unordered_map::const_iterator const_iterator; + + // Allow the Sparse_matrix class to access other templated Sparse_matrix and + // Sparse_chain protected members. + template + friend class Sparse_chain; + + template + friend class Sparse_matrix; + + // Friend methods (friends of Sparse_matrix) + template + friend Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_chain<_CT, COLUMN> &_second); + template + friend Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_chain<_CT, ROW> &_second); + template + friend Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_chain<_CT, COLUMN> &_second); + template + friend Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_chain<_CT, ROW> &_second); + template + friend Sparse_chain<_CT, ROW> operator*(const Sparse_chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second); + template + friend Sparse_chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, int _index); + template + friend Sparse_chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, int _index); + template + friend Sparse_chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, int _index); + template + friend Sparse_chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, int _index); + template + friend void set_column(Sparse_matrix<_CT, COLUMN> &matrix, int index, const Sparse_chain<_CT, COLUMN> &chain); + template + friend void set_column(Sparse_matrix<_CT, ROW> &matrix, int index, const Sparse_chain<_CT, COLUMN> &chain); + template + friend void set_row(Sparse_matrix<_CT, COLUMN> &_matrix, int _index, const Sparse_chain<_CT, ROW> &_chain); + template + friend void set_row(Sparse_matrix<_CT, ROW> &_matrix, int _index, const Sparse_chain<_CT, ROW> &_chain); + +protected: + /** \brief Type of data stored in the chain: map between indexes and coefficients. */ + typedef std::pair pair; + + /** \brief The chain inner representation and storage of data. */ + std::unordered_map _chainData; + + /** \brief The chain boundary. */ + int _upperBound; + +public: + /** + * \brief Create new empty Sparse_chain. + * + * Default constructor, initialize an empty Sparse_chain. + * The default chain size is 0. + */ + Sparse_chain() { + _upperBound = 0; + _chainData = std::unordered_map(); + } + + /** + * \brief Create new empty SparseChain of given size. + * + * Constructor with size, initialize an empty Sparse_chain. + * + * \param[in] chainSize The size of the Sparse_chain. + */ + Sparse_chain(const int chainSize) { + _upperBound = chainSize; + _chainData = std::unordered_map(); + } + + + + /** + * \brief Create new SparseChain by copy. + * + * Copy constructor, initialize a SparseChain from an existing SparseChain. + * + * \pre The chains have the same `CoefficientType` and `ChainTypeFlag`. + + * \param[in] otherToCopy The chain to copy. + */ + Sparse_chain(const Sparse_chain &otherToCopy) { + _upperBound = otherToCopy._upperBound; + _chainData = otherToCopy._chainData; + } + + /** + * \brief Assign to other chain. + * + * Assign to other chain coefficient-wise, equivalent to copying it. + * + * \pre The chains have the same coefficent type. + * + * \warning Chains must have the same `CoefficientType`. + * + * \param[in] otherToCopy The chain we want to copy. + */ + Sparse_chain& operator=(const Sparse_chain &otherToCopy) { + _upperBound = otherToCopy._upperBound; + _chainData = otherToCopy._chainData; + + return *this; + } + + /** + * \brief Size of the chain + * + * \return Size allocated for the chain. + */ + size_t dimension() const { return _upperBound ; } + + /** + * \brief Displays a Sparse_chain in the output stream. + * + * \param[in] stream The output stream. + * \param[in] chain The chain to display. + * + * \return A reference to the modified stream. + */ + friend std::ostream& operator<<(std::ostream &stream, const Sparse_chain &chain) { + stream << "["; + for (const_iterator i = chain._chainData.begin() ; i != chain._chainData.end() ; ++i) { + stream << i->first << ": " << i->second << ", "; + } + + if (chain._chainData.size() > 0) { + stream << "\b\b"; + } + stream << "]"; + + return stream; + } + + /** + * \brief Adds two chains together. + * + * Adds two chains together and return the result in a new matrix. + * + * \pre Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. + * + * \warning Will raise an error if the two chains are not the same `CoefficientType`. + * \warning Will raise an error if the two chains don't have the same `ChainTypeFlag`. + * + * \param[in] first The first chain. + * \param[in] second The second chain. + * + * \return A new chain representing the result. + */ + template + friend Sparse_chain operator+(const Sparse_chain &first, const Sparse_chain &second) { + Sparse_chain newChain = first; + newChain += second; + + return newChain; + } + + /** + * \brief Subtract two chains together. + * + * Subtract two chains together and return the result in a new matrix. + * + * \pre Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. + * + * \warning Will raise an error if the two chains are not the same `CoefficientType`. + * \warning Will raise an error if the two chains don't have the same `ChainTypeFlag`. + * + * \param[in] first The first chain. + * \param[in] second The second chain. + * + * \return A new chain representing the result. + */ + template + friend Sparse_chain operator-(const Sparse_chain &first, const Sparse_chain &second) { + Sparse_chain newChain = first; + newChain -= second; + + return newChain; + } + + /** + * \brief Apply factor on each coefficients. + * + * \param[in] lambda The factor to apply. + * \param[in] chain The second chain. + * + * \return A new chain representing the result. + */ + template + friend Sparse_chain operator*(const CoefficientType& lambda, const Sparse_chain &chain) { + Sparse_chain newChain = chain; + newChain *= lambda; + + return newChain; + } + + /** + * \brief Apply factor on each coefficients. + * + * \param[in] chain The second chain. + * \param[in] lambda The factor to apply. + * + * \return A new chain representing the result. + */ + template + friend Sparse_chain operator*(const Sparse_chain &chain, const CoefficientType& lambda) { + Sparse_chain newChain = chain; + newChain *= lambda; + + return newChain; + } + + /** + * \brief Perform matrix multiplication between two chains (COLUMN x ROW) and return a COLUMN matrix. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * + * \pre Chains must have the same `CoefficientType`. + * + * \warning Will raise an error if chains do not have the same `CoefficientType`. + * + * \param[in] column The column chain. + * \param[in] row The row chain. + * + * \return The result of the matrix multiplication, column-based. + */ + template + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_chain<_CT, COLUMN> &column, const Sparse_chain<_CT, ROW> &row); + + /** + * \brief Perform matrix multiplication between two chains (COLUMN x ROW) and return a ROW matrix. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * + * \pre Chains must have the same `CoefficientType`. + * + * \warning Will raise an error if chains do not have the same `CoefficientType`. + * + * \param[in] column The column chain. + * \param[in] row The row chain. + * + * \return The result of the matrix multiplication, row-based. + */ + template + friend Sparse_matrix<_CT, ROW> operator%(const Sparse_chain<_CT, COLUMN> &column, const Sparse_chain<_CT, ROW> &row); + + /** + * \brief Perform dot product between two chains (ROW x COLUMN). + * + * \pre Chains must have the same `CoefficientType`. + * + * \warning Will raise an error if the chains do not have the same `CoefficientType`. + * + * \param[in] row The row chain. + * \param[in] column The column chain. + * + * \return The result of type CoefficientType. + */ + template + friend _CT operator*(const Sparse_chain<_CT, ROW> &row, const Sparse_chain<_CT, COLUMN> &column); + + /** + * \brief Add a chain to `this`. + * + * Add a chain to `this`. + * + * \pre Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. + * + * \warning Will raise an error if the two chains are not the same `CoefficientType`. + * \warning Will raise an error if the two chains don't have the same `ChainTypeFlag`. + * + * \param[in] other The other chain. + * + * \return The modified chain representing the result. + */ + Sparse_chain& operator+=(const Sparse_chain &other) { + if (this->_upperBound != other._upperBound) { + throw std::runtime_error("Chains must be the same size."); + } + + for (pair pair: other._chainData) { + this->_chainData[pair.first] += pair.second; + + if (this->_chainData[pair.first] == 0) { + this->_chainData.erase(pair.first); + } + } + + return *this; + } + + /** + * \brief Sustract a chain to `this`. + * + * Subtract a chain to `this`. + * + * \pre Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. + * + * \warning Will raise an error if the two chains are not the same `CoefficientType`. + * \warning Will raise an error if the two chains don't have the same `ChainTypeFlag`. + * + * \param[in] other The other chain. + * + * \return The modified chain representing the result. + */ + Sparse_chain& operator-=(const Sparse_chain &other) { + if (this->_upperBound != other._upperBound) { + throw std::runtime_error("Chains must be the same size."); + } + + for (pair pair: other._chainData) { + this->_chainData[pair.first] -= pair.second; + + if (this->_chainData[pair.first] == 0) { + this->_chainData.erase(pair.first); + } + } + + return *this; + } + + /** + * \brief Apply factor on each coefficients of `this`. + * + * If `lambda` is null, this function comes to nullify the chain. + * + * \param[in] lambda The factor to apply. + * + * \return The modified chain representing the result. + */ + Sparse_chain& operator*=(const CoefficientType& lambda) { + if (lambda == 0) { + this->_chainData.clear(); + return *this; + } + + for (pair pair: this->_chainData) { + this->_chainData[pair.first] = pair.second * lambda; + } + + return *this; + } + + /** + * \brief Get the value of a coefficient of the chain. + * + * \warning The chain will perform boundary check. + * + * \param[in] index The coefficient index. + * + * \return The value of the coefficient. + */ + CoefficientType operator[](int index) const { + if (index >= _upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_upperBound) + "."); + } + + return _chainData.at(index); + } + + /** + * \brief Get the value of a coefficient of the chain. + * + * \warning The chain will perform boundary check. + * + * \param[in] index The coefficient index. + * + * \return The value of the coefficient. + */ + CoefficientType get_coef(int index) const { + if (index >= _upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_upperBound) + "."); + } + + return _chainData.at(index); + } + + /** + * \brief Set a given coefficient of the chain. + * + * Set the value of the coefficient in the chain at `index`. + * + * \warning The chain will perform boundary check. + * + * \param[in] index The coefficient index. + * \param[in] d Value of the coefficient + */ + void set_coef(int index, CoefficientType d) + { + if (index >= _upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_upperBound) + "."); + } + if (d == 0) + *this /= index ; + else + _chainData[index] = d ; + } + + /** + * \brief Checks if a coefficient is null. + * + * \param[in] index The index to check. + * \return True if the data is null at given index. + */ + const bool is_null(int index) const { + return _chainData.find(index) == _chainData.end(); + } + + /** + * \brief Checks if the chain is null. + * + * \return True if the chain is null. + */ + const bool is_null() const { + return _chainData.size() == 0; + } + + /** + * \brief Get a subchain from the chain. + * + * Return a new chain where all coefficients of indices provided in the vector are removed. + * + * \note Will return a copy of the chain if `indices` is empty. + * + * \param[in] chain The chain to process. + * \param[in] indices The indexes to remove. + * + * \return A new chain representing the result. + */ + template + friend Sparse_chain<_CT, _CTF> operator/(const Sparse_chain<_CT, _CTF> &chain, const std::vector &indices); + + /** + * \brief Get a subchain from the chain. + * + * Return a new chain where the coefficients at a given index is removed. + * + * \param[in] chain The chain to process. + * \param[in] index The index to remove. + */ + template + friend Sparse_chain<_CT, _CTF> operator/(const Sparse_chain<_CT, _CTF> &chain, int index); + + /** + * \brief Restrict the chain to a sub-chain by removing indices. + * + * Removes all indices provided in the vector from the chain. Return a reference to the modified chain. + * + * \note Will not alter the chain if `indices` is empty. + * + * \param[in] indices The indices to remove. + * + * \return Return a reference to the modified chain. + */ + Sparse_chain& operator/=(const std::vector &indices) { + for (int index : indices) { + this->_chainData.erase(index); + } + + return *this; + } + + /** + * \brief Restrict the chain to a sub-chain by removing a given index. + * + * Removes the index provided from the chain. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] index The index to remove. + * + * \return Return a reference to the modified chain. + */ + Sparse_chain& operator/=(const int index) { + this->_chainData.erase(index); + + return *this; + } + + /** + * \brief Remove all coefficients from the chain. + * + * The function comes to set all coefficients to zero. + */ + void nullify() { + this->_chainData.clear(); + } + + /** + * \brief Iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The function returns an iterator to the first non zero index. + */ + iterator begin() noexcept { + return _chainData.begin(); + } + + /** + * \brief Constant iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The function returns a constant iterator to the first non zero index. + */ + const_iterator begin() const noexcept { + return _chainData.begin(); + } + + /** + * \brief Constant iterator to the beginning of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The function returns a constant iterator to the first non zero index. + */ + const_iterator cbegin() const noexcept { + return _chainData.cbegin(); + } + + /** + * \brief Iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The function returns an iterator to the ending of the chain. + */ + iterator end() noexcept { + return _chainData.end(); + } + + /** + * \brief Constant iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The function returns a constant iterator to the ending of the chain. + */ + const_iterator end() const noexcept { + return _chainData.end(); + } + + /** + * \brief Constant iterator to the end of the chain. + * + * \warning The chain is stored unordered for speed reason. + * + * \return The function returns a constant iterator to the ending of the chain. + */ + const_iterator cend() const noexcept { + return _chainData.cend(); + } + + /** + * \brief Transpose a Sparse_chain. + * + * The result is a chain with `ChainTypeFlag` switched between COLUMN and ROW. + * + * \return A new chain where the chain type flag is changed. + */ + Sparse_chain transpose() { + Sparse_chain chain; + + chain._upperBound = this->_upperBound; + for (pair pair: this->_chainData) { + chain._chainData[pair.first] = pair.second; + } + + return chain; + } + + /** + * \brief Checks if chain is a column. + * + * \return true if chain is column-major, false otherwise. + */ + bool is_column() const { + return ChainTypeFlag == COLUMN; + } + + /** + * \brief Checks if chain is a row. + * + * \return true if chain is row-major, false otherwise. + */ + bool is_row() const { + return ChainTypeFlag == ROW; + } + +private: + /** + * \brief Get a reference on a coefficient of the chain. + * + * Used to set a coefficient in the chain. + * + * \warning The chain will perform boundary check. + * + * \param[in] index The coefficient index. + * + * \return The reference to the assigned coefficient. + */ + CoefficientType& operator[](const int index) { + if (index >= _upperBound) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_upperBound) + "."); + } + + return _chainData[index]; + } +}; + + +// COLUMN chain x ROW chain -> COLUMN matrix +template +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_chain<_CT, COLUMN> &_column, const Sparse_chain<_CT, ROW> &_row) { + Sparse_matrix<_CT, COLUMN> matrix(_column._upperBound, _row._upperBound); + + for (std::pair pair : _row._chainData) { + OSM::set_column(matrix,pair.first,_column * pair.second) ; + } + + return matrix; +} + +// COLUMN chain x ROW chain -> ROW matrix +template +Sparse_matrix<_CT, ROW> operator%(const Sparse_chain<_CT, COLUMN> &_column, const Sparse_chain<_CT, ROW> &_row) { + Sparse_matrix<_CT, ROW> matrix(_column._upperBound, _row._upperBound); + + for (std::pair pair : _column._chainData) { + OSM::set_row(matrix,pair.first,_row * pair.second); + } + + return matrix; +} + +// Dot product (ROW chain x COLUMN chain) +template +CoefficientType operator*(const Sparse_chain &_row, const Sparse_chain &_column) { + // Get indexes (avoid adding double indexes). + std::unordered_map indexes; + for (std::pair pair: _row._chainData) { + indexes[pair.first] = 1; + } + for (std::pair pair: _column._chainData) { + indexes[pair.first] += 1; + } + + // Perform dot product + CoefficientType result = CoefficientType(); + for (std::pair index: indexes) { + if (index.second == 2) { + result += _row._chainData.at(index.first) * _column._chainData.at(index.first); + } + } + + return result; +} + +/** + * \brief Get a subchain from the chain and assign. + * + * Removes all indexes provided in the vector from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _indexes The indexes to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Sparse_chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Sparse_chain<_CT, _CTF> operator/(const Sparse_chain<_CT, _CTF> &_chain, const std::vector &_indexes) { + Sparse_chain newChain = _chain; + newChain /= _indexes; + return newChain; +} + +/** + * \brief Get a subchain from the chain and assign. + * + * Removes the index provided from the chain and returns it. + * + * \note Will not alter the chain if given vector is empty. + * + * \param[in] _index The index to remove. + * + * \return The modified chain representing the result. + * + * \see \link OSM::Sparse_chain \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ +template +Sparse_chain<_CT, _CTF> operator/(const Sparse_chain<_CT, _CTF> &_chain, int _index) { + Sparse_chain newChain = _chain; + newChain /= _index; + return newChain; +} + +} /* end namespace OSM */ +} /* end namespace CGAL */ + +#endif // CGAL_OSM_SPARSE_CHAIN_H diff --git a/HDVF/include/CGAL/OSM/Sparse_matrix.h b/HDVF/include/CGAL/OSM/Sparse_matrix.h index 80e50a50854f..85b2a2cff093 100644 --- a/HDVF/include/CGAL/OSM/Sparse_matrix.h +++ b/HDVF/include/CGAL/OSM/Sparse_matrix.h @@ -14,7 +14,7 @@ #define CGAL_OSM_SPARSE_MATRIX_H -#include "Chain.h" +#include "Sparse_chain.h" #include "Bitboard.h" #include #include @@ -29,28 +29,30 @@ namespace OSM { /*! \ingroup PkgHDVFAlgorithmClasses - The class `Sparse_matrix` implements the concept `SparseMatrix`, that is, sparse matrices optimized to topological computations. It provides standard linear algebra operators and fast iterators and block operations (set, get and nullify) which are required to implement efficiently HDVFs. + The class `Sparse_matrix` implements the concept `SparseMatrix`, that is, sparse matrices optimized for topological computations. It provides standard linear algebra operators and fast iterators and block operations (set, get and nullify) which are required to implement efficiently HDVFs. The implementation is based on mapped sparse matrices. Hence matrices of the `Sparse_matrix` class are either column of row major (the `ChainTypeFlag` parameter determines the type). A column-major (resp. row-major) `Sparse_matrix` is a vector of `Sparse_chains` which encode columns (res. rows). Moreover, in order to efficiently iterate over non empty columns (resp. rows) the `Bitboard` data structure implements the concept `SparseMatrix::NonZeroChainIndices`. A bitboard is basically a bucket of bits recording the indices of non empty chains. However, this data structure has been designed in order to efficiently remove or add indices, as well as provide efficient iterators to visit non empty chains. - For instance, let us consider the \f$3\times 4\f$ matrix: + For instance, let us consider the \f$5\times 4\f$ matrix: \f[ A = \left(\begin{array}{cccc} 1 & \cdot & \cdot & \cdot \\ -1 & \cdot & 2 & \cdot\\ \cdot & \cdot & 1 & \cdot \\ \cdot & \cdot & \cdot & \cdot \\ + \cdot & \cdot & \cdot & \cdot \\ \end{array}\right) \f] where \f$\cdot\f$ means \f$0\f$. - If the matrix is stored column-major, following data structures are created: + Figures below shows the data structures are created according to the chosen representation (left: column-major, right: row-major): + \cgalModels{SparseMatrix} - \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. + \tparam CoefficientType a model of the `Ring` concept, providing the ring used to compute homology. \tparam ChainTypeFlag an integer constant encoding the type of matrices (`OSM::COLUMN` or `OSM::ROW`). */ @@ -62,7 +64,7 @@ class Sparse_matrix { /*! Type of chains associated to the matrix. */ - typedef Chain MatrixChain; + typedef Sparse_chain MatrixChain; // Allow the Sparse_matrix class to access other templated Sparse_matrix private members. template @@ -70,7 +72,7 @@ class Sparse_matrix { protected: /** \brief The inner chain storage. */ - std::vector> _chains; + std::vector> _chains; /** \brief A bitboard containing state of each columns. */ Bitboard _chainsStates; @@ -126,9 +128,9 @@ class Sparse_matrix { int mainSize = ChainTypeFlag == COLUMN ? columnCount : rowCount; int secondarySize = ChainTypeFlag == COLUMN ? rowCount : columnCount; - _chains = std::vector>(mainSize); + _chains = std::vector>(mainSize); for (int i = 0 ; i < mainSize ; i++) { - _chains[i] = Chain(secondarySize); + _chains[i] = Sparse_chain(secondarySize); } _chainsStates = Bitboard(mainSize); @@ -153,9 +155,9 @@ class Sparse_matrix { _chains.resize(otherToCopy._chains._size()) ; for (int i = 0; i& tmp(otherToCopy._chains.at(i)) ; - Chain res(tmp.dimension()) ; - for (typename Chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + const Sparse_chain& tmp(otherToCopy._chains.at(i)) ; + Sparse_chain res(tmp.dimension()) ; + for (typename Sparse_chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { res[it->first] = it->second ; } @@ -171,13 +173,13 @@ class Sparse_matrix { _chainsStates = OSM::Bitboard(vec_size) ; for (int i=0; i(chain_size) ; + _chains.at(i) = Sparse_chain(chain_size) ; } for (int i = 0; i& tmp(otherToCopy._chains.at(i)) ; - for (typename Chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + const Sparse_chain& tmp(otherToCopy._chains.at(i)) ; + for (typename Sparse_chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { _chains[it->first][i] = it->second ; _chainsStates.setOn(it->first) ; @@ -348,11 +350,11 @@ class Sparse_matrix { } /** - * \defgroup MatrixProdCol Matrix product (with column-based result). + * \defgroup MatrixMatrixProdCol Matrices product (with column-based result). * \ingroup PkgHDVFAlgorithmClasses * @brief Perform multiplication between matrices and returns a new column-major matrix. * - * Perform standard linear algebra product between matrices and returns a new column-major matrix (when possible, prefer `*=` for efficiency). Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. Efficiency of the product depends of `ChainTypeFlag` (when possible, prefer row-major by column-major products). + * Perform standard linear algebra product between matrices and returns a new column-major matrix (when possible, prefer `*=` for efficiency). Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. The product is optimized (using standard definition or block products) for each combination of `ChainTypeFlag`. However, efficiency depends on `ChainTypeFlag` (when possible, prefer row-major by column-major products). * * @param first The first matrix. * @param second The second matrix. @@ -360,238 +362,125 @@ class Sparse_matrix { * @{ */ - //* COLUMN x COLUMN -> COLUMN */ + /** \brief Matrices product: COLUMN x COLUMN -> COLUMN */ template friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, COLUMN> &second); - //* ROW x COLUMN -> COLUMN */ + /** \brief Matrices product: ROW x COLUMN -> COLUMN */ template friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, COLUMN> &second); - //* COLUMN x ROW -> COLUMN */ + /** \brief Matrices product: COLUMN x ROW -> COLUMN */ template friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, ROW> &second); - //* ROW x ROW -> COLUMN */ + /** \brief Matrices product: ROW x ROW -> COLUMN */ template friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, ROW> &second); /** @} */ - /** - * \brief Perform multiplication between a column-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. + * \defgroup MatrixChainProd Matrix / column-chain product (with column-chain result). + * \ingroup PkgHDVFAlgorithmClasses + * @brief Perform multiplication between a sparse matrix (column or row major) and a column-chain. The function returns a new column-major chain. * - * \see \link OSM::Chain \endlink + * Perform standard linear algebra product between a matrix and a column-chain (ie. matrix / column vector product) and returns a new column-major chain. Both arguments must have the same `CoefficientType` but the matrix can have any `ChainTypeFlag` (and the product is optimized for each of them). * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @param first The matrix. + * @param second The column-major chain. + * @return The result of the matrix multiplication, column-based. + * @{ */ + + /** \brief Matrix/column chain product: COLUMN matrix x COLUMN chain -> COLUMN chain. */ template - friend Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second); + friend Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_chain<_CT, COLUMN> &_second); - /** - * \brief Perform multiplication between a row-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + /** \brief Matrix/column chain product: ROW matrix x COLUMN chain -> COLUMN chain. */ template - friend Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second); + friend Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_chain<_CT, COLUMN> &_second); + + /** @} */ /** - * \brief Perform multiplication between a row-based chain and a row-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, row-based. + * \defgroup ChainMatrixProd Row-chain / matrix product (with row-chain result). + * \ingroup PkgHDVFAlgorithmClasses + * @brief Perform multiplication between a row-chain and a sparse matrix (column or row major). The function returns a new row-major chain. * - * \see \link OSM::Chain \endlink + * Perform standard linear algebra product between a row-chain and a matrix (ie. row vector / matrix product) and returns a new row-major chain. Both arguments must have the same `CoefficientType` but the matrix can have any `ChainTypeFlag` (and the product is optimized for each of them). * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @param first The row-major chain. + * @param second The matrix. + * @return The result of the matrix multiplication, row-based. + * @{ */ + + /** \brief Row chain/matrix product: ROW chain x COLUMN matrix -> ROW chain. */ template - friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) ; + friend Sparse_chain<_CT, ROW> operator*(const Sparse_chain<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) ; - /** - * \brief Perform multiplication between a row-based chain and a column-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + /** \brief Row chain/matrix product: ROW chain x ROW matrix -> ROW chain. */ template - friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) ; + friend Sparse_chain<_CT, ROW> operator*(const Sparse_chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) ; + + /** @} */ /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. + * \defgroup MatrixMatrixProdRow Matrices product (with row-based result). + * \ingroup PkgHDVFAlgorithmClasses + * @brief Perform multiplication between matrices and returns a new row-major matrix. * - * \see \link OSM::Chain \endlink + * Perform standard linear algebra product between matrices and returns a new row-major matrix (when possible, prefer `*=` for efficiency). Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. The product is optimized (using standard definition or block products) for each combination of `ChainTypeFlag`. However, efficiency depends on `ChainTypeFlag`. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @param first The first matrix. + * @param second The second matrix. + * @return The result of the matrix multiplication, row-based. + * @{ */ + + /** \brief Matrices product: COLUMN x COLUMN -> ROW */ template friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second); - /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + /** \brief Matrices product: ROW x COLUMN -> ROW */ template friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second); - /** - * \brief Perform matrix multiplication between two _chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + /** \brief Matrices product: COLUMN x ROW -> ROW */ template friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second); - /** - * \brief Perform matrix multiplication between two _chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + /** \brief Matrices product: ROW x ROW -> ROW */ template friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second); + /** @} */ + /** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. + * \defgroup MatrixMatrixAddAssign Sum matrices and assign. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Perform addition between matrices and assigns the result to `matrix`. * - * \see \link OSM::Chain \endlink + * Perform standard linear algebra addition. Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. The addition is optimized for each combination of `ChainTypeFlag`. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @param matrix The first matrix. + * @param other The second matrix. + * @return A reference to the modified matrix `matrix` containing the result. + * @{ */ - Sparse_matrix& operator+=(const Sparse_matrix &_other) { - if (this->_size != _other._size) { + + /** \brief Matrices sum and assign: COLUMN += COLUMN or ROW += ROW. */ + Sparse_matrix& operator+=(const Sparse_matrix &other) { + if (this->_size != other._size) { throw std::runtime_error("Matrices must be the same _size."); } - for (int index: _other._chainsStates) { + for (int index: other._chainsStates) { this->_chainsStates |= index; - this->_chains[index] += _other._chains[index]; + this->_chains[index] += other._chains[index]; - if (this->_chains[index].isNull()) { + if (this->_chains[index].is_null()) { this->_chainsStates.setOff(index); } } @@ -599,81 +488,40 @@ class Sparse_matrix { return *this; } - /** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ + /** \brief Matrices sum and assign: COLUMN += ROW. */ template - friend Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &matrix, const Sparse_matrix<_CT, ROW> &other); - /** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ + /** \brief Matrices sum and assign: ROW += COLUMN. */ template - friend Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &matrix, const Sparse_matrix<_CT, COLUMN> &other); + + /** @} */ /** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. + * \defgroup MatrixMatrixSubtractAssign Subtract matrices and assign. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Perform subtraction between matrices and assigns the result to `matrix`. * - * \see \link OSM::Chain \endlink + * Perform standard linear algebra subtraction. Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. The addition is optimized for each combination of `ChainTypeFlag`. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @param matrix The first matrix. + * @param other The second matrix. + * @return A reference to the modified matrix `matrix` containing the result. + * @{ */ - Sparse_matrix& operator-=(const Sparse_matrix &_other) { - if (this->_size != _other._size) { + + /** \brief Matrices subtraction and assign: COLUMN -= COLUMN or ROW -= ROW. */ + Sparse_matrix& operator-=(const Sparse_matrix &other) { + if (this->_size != other._size) { throw std::runtime_error("Matrices must be the same _size."); } - for (int index: _other._chainsStates) { + for (int index: other._chainsStates) { this->_chainsStates |= index; - this->_chains[index] -= _other._chains[index]; + this->_chains[index] -= other._chains[index]; - if (this->_chains[index].isNull()) { + if (this->_chains[index].is_null()) { this->_chainsStates.setOff(index); } } @@ -681,77 +529,33 @@ class Sparse_matrix { return *this; } - - /** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ + /** \brief Matrices subtraction and assign: COLUMN -= ROW. */ template - friend Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &matrix, const Sparse_matrix<_CT, ROW> &other); - /** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ + /** \brief Matrices subtraction and assign: ROW -= COLUMN. */ template - friend Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &matrix, const Sparse_matrix<_CT, COLUMN> &other); + + /** @} */ /** * \brief Apply factor on each coefficients and assign. * - * \warning Will raise an error if _lambda is 0. + * If `lambda` is 0, this comes to nullify the matrix. * - * \param[in] _lambda The factor to apply. + * \param[in] lambda The factor to apply. * * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - Sparse_matrix& operator*=(const CoefficientType& _lambda) { - if (_lambda == 0) { - std::pair p(this->dimensions()) ; - *this = Sparse_matrix(p.first, p.second); + Sparse_matrix& operator*=(const CoefficientType& lambda) { + if (lambda == 0) { + this->nullify(); return *this; } for (int index: this->_chainsStates) { - this->_chains[index] *= _lambda; + this->_chains[index] *= lambda; } return *this; @@ -761,19 +565,13 @@ class Sparse_matrix { * \brief Compute the negative of a matrix (unary operator). * * \return The resulting matrix. - * - * \see \link OSM::Sparse_matrix \endlink - * - * \author Bac A. - * \version 0.1.0 - * \date 07/09/2024 */ - friend Sparse_matrix operator-(const Sparse_matrix& _matrix) { - Sparse_matrix res(_matrix._size.first, _matrix._size.second) ; + friend Sparse_matrix operator-(const Sparse_matrix& matrix) { + Sparse_matrix res(matrix._size.first, matrix._size.second) ; - for (int index: _matrix._chainsStates) + for (int index: matrix._chainsStates) { - const MatrixChain& tmp_chain(_matrix._chains[index]) ; + const MatrixChain& tmp_chain(matrix._chains[index]) ; for (typename MatrixChain::const_iterator it = tmp_chain.cbegin(); it != tmp_chain.cend(); ++it) res[index][it->first] = -it->second ; } @@ -781,509 +579,335 @@ class Sparse_matrix { } /** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. + * \defgroup MatrixMatrixProdAssign Multiplies matrices and assign. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Perform product between matrices and assigns the result to `matrix`. * - * \see \link OSM::Chain \endlink + * Perform standard linear algebra product. Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. The product is optimized for each combination of `ChainTypeFlag`. * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 + * @param matrix The first matrix. + * @param other The second matrix. + * @return A reference to the modified matrix `matrix` containing the result. + * @{ */ + + /** \brief Matrices product and assign: COLUMN *= COLUMN. */ template - friend Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &matrix, const Sparse_matrix<_CT, COLUMN> &other); - /** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ + /** \brief Matrices product and assign: ROW *= ROW. */ template - friend Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &matrix, const Sparse_matrix<_CT, ROW> &other); - /** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ + /** \brief Matrices product and assign: COLUMN *= ROW. */ template - friend Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &matrix, const Sparse_matrix<_CT, ROW> &other); - /** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ + /** \brief Matrices product and assign: ROW *= COLUMN. */ template - friend Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &matrix, const Sparse_matrix<_CT, COLUMN> &other); + + /** @} */ /** - * \brief Get a chain from a const matrix. + * \brief Get the value of a chain from a const matrix. * * \warning The matrix will perform boundary check. * - * \param[in] _index The coefficient index. + * \param[in] index The chain index. * * \return The chain stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - MatrixChain operator[](const int _index) const { - if (ChainTypeFlag == COLUMN && _index >= _size.second) { + MatrixChain operator[](int index) const { + if (ChainTypeFlag == COLUMN && index >= _size.second) { throw std::runtime_error("Provided index should be less than " + std::to_string(_size.second) + "."); } - if (ChainTypeFlag == ROW && _index >= _size.first) { + if (ChainTypeFlag == ROW && index >= _size.first) { throw std::runtime_error("Provided index should be less than " + std::to_string(_size.first) + "."); } - return _chains[_index]; + return _chains[index]; } /** * \brief Set a given coefficient. * - * \warning The matrix will perform boundary check. + * Assign the scalar `d` to the coefficient on row `i` and column `j`. * - * \param[in] _i The row index. - * \param[in] _j The column index. - * \param[in] _d The value. - * - * \see \link OSM::Chain \endlink + * \warning The matrix will perform boundary check. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \param[in] i The row index. + * \param[in] j The column index. + * \param[in] d The value. */ - void set_coef(const int _i, const int _j, const CoefficientType _d) { - if (_i >= _size.first) { - throw std::runtime_error("Provided _i index should be less than " + std::to_string(_size.first) + "."); + void set_coef(const int i, const int j, const CoefficientType d) { + if (i >= _size.first) { + throw std::runtime_error("Provided i index should be less than " + std::to_string(_size.first) + "."); } - if (_j >= _size.second) { - throw std::runtime_error("Provided _j index should be less than " + std::to_string(_size.second) + "."); + if (j >= _size.second) { + throw std::runtime_error("Provided j index should be less than " + std::to_string(_size.second) + "."); } - - if (ChainTypeFlag == COLUMN) + if (d != 0) { - (*this)[_j][_i] = _d ; + if (ChainTypeFlag == COLUMN) + { + (*this)[j][i] = d ; + } + else + (*this)[i][j] = d ; } else - (*this)[_i][_j] = _d ; + { + del_coef(i, j); + } } /** * \brief Get a given coefficient. * + * Returns the coefficient on row `i` and column `j` of the matrix. + * * \warning The matrix will perform boundary check. * - * \param[in] _i The row index. - * \param[in] _j The column index. + * \param[in] i The row index. + * \param[in] j The column index. * * \return The value of the given coefficient. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - - CoefficientType get_coef(const int _i, const int _j) const { - if (_i >= _size.first) { - //std::cout << "Provided _i index should be less than " << _size.first << "." << std::endl; + CoefficientType get_coef(const int i, const int j) const { + if (i >= _size.first) { throw std::runtime_error("Provided _i index should be less than " + std::to_string(_size.first) + "."); } - if (_j >= _size.second) { - //std::cout << "Provided _j index should be less than " << _size.second << "." << std::endl; + if (j >= _size.second) { throw std::runtime_error("Provided _j index should be less than " + std::to_string(_size.second) + "."); } - if (ChainTypeFlag == COLUMN) - return (*this)[_j][_i] ; + return (this->_chains)[j][i] ; else // ROW - return (*this)[_i][_j] ; + return (this->_chains)[i][j] ; } /** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. + * \defgroup GetColumn Get a column. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Get the value of the column at a given `index` from the matrix (whatever the `ChainTypeFlag` of the matrix). * - * \note For column-chain matrixes, it is equivalent to operator[]. + * \note For column-matrices, it is equivalent to `operator[]`, for row-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). * * \warning The matrix will perform boundary check. * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * @param matrix The matrix considered. + * @param index The coefficient index. + * @return The column at given index. + * @{ */ + + /** \brief Get a column from a COLUMN matrix. */ template - friend Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index); + friend Sparse_chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &matrix, int index); - /** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ + /** \brief Get a column from a ROW matrix. */ template - friend Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, const int _index); + friend Sparse_chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &matrix, int index); + + /** @} */ /** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. + * \defgroup GetRow Get a row. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Get the value of the row at a given `index` from the matrix (whatever the `ChainTypeFlag` of the matrix). * - * \note For row-chain matrixes, it is equivalent to operator[]. + * \note For row-matrices, it is equivalent to `operator[]`, for column-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). * * \warning The matrix will perform boundary check. * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * @param matrix The matrix considered. + * @param index The coefficient index. + * @return The row at given index. + * @{ */ + + /** \brief Get a row from a COLUMN matrix. */ template - friend Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index); + friend Sparse_chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &matrix, int index); - /** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ + /** \brief Get a row from a ROW matrix. */ template - friend Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index); + friend Sparse_chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &matrix, int index); + + /** @} */ /** - * \brief Get a const reference over a column from a column matrix + * \brief Get a const reference over a column from a column matrix. * - * \warning The matrix will perform boundary check. + * Constant time get. * - * \param[in] _index The coefficient index. - * - * \return A const reference over the column stored at given index. + * \warning The matrix will perform boundary check. * - * \see \link OSM::Chain \endlink + * \param[in] matrix The matrix considered. + * \param[in] index The column index. * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * \return A constant reference over the column stored at given index. */ template - friend const Chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index); + friend const Sparse_chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &matrix, int index); /** - * \brief Get a const reference over a row from a row matrix + * \brief Get a constant reference over a row from a row matrix + * + * Constant time get. * * \warning The matrix will perform boundary check. * - * \param[in] _index The coefficient index. + * \param[in] matrix The matrix considered. + * \param[in] index The row index. * * \return A const reference over the row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 */ template - friend const Chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index); + friend const Sparse_chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &matrix, const int index); /** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. + * \defgroup SetColumn Set a column. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Set the value of the column at a given `index` from the matrix to `chain` (whatever the `ChainTypeFlag` of the matrix). * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. + * \note For column-matrices, it is equivalent to `operator[]` followed by an assignment, for row-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). * - * \see \link OSM::Chain \endlink + * \warning The matrix will perform boundary check. * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * @param matrix The matrix. + * @param index The column index. + * @param chain The new column value. + * @{ */ + + /** \brief Set a column in a COLUMN matrix. */ template - friend void set_column(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + friend void set_column(Sparse_matrix<_CT, COLUMN> &matrix, int index, const Sparse_chain<_CT, COLUMN> &chain); - /** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ + /** \brief Set a column in a ROW matrix. */ template - friend void set_column(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + friend void set_column(Sparse_matrix<_CT, ROW> &matrix, int index, const Sparse_chain<_CT, COLUMN> &chain); + + /** @} */ /** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. + * \defgroup SetRow Set a row. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Set the value of the row at a given `index` from the matrix to `chain` (whatever the `ChainTypeFlag` of the matrix). * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. + * \note For row-matrices, it is equivalent to `operator[]` followed by an assignment, for column-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). * - * \see \link OSM::Chain \endlink + * \warning The matrix will perform boundary check. * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * @param matrix The matrix. + * @param index The row index. + * @param chain The new row value. + * @{ */ + + /** \brief Set a row in a COLUMN matrix. */ template - friend void set_row(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + friend void set_row(Sparse_matrix<_CT, COLUMN> &matrix, int index, const Sparse_chain<_CT, ROW> &chain); - /** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ + /** \brief Set a row in a ROW matrix. */ template - friend void set_row(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + friend void set_row(Sparse_matrix<_CT, ROW> &matrix, int index, const Sparse_chain<_CT, ROW> &chain); + + /** @} */ /** - * \brief Get a submatrix from the matrix. - * - * Removes all indexes provided in the vector from the matrix and returns it. + * \defgroup GetBlockMatrix Get a sub-matrix by removing chains in a matrix. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Build and return a new matrix by copying a `matrix` and removing all chains with indices in the `indices` vector (or at a given `index`). The result is thus a block of the initial matrix. When possible, for efficiency, prefer `\=`. * * \note Will return a copy of the matrix if given vector is empty. - * \note The submatrix will be rectangular. - * - * \param[in] _matrix The matrix to process. - * \param[in] _indexes The indexes to remove. * - * \return A new matrix representing the result. + * \warning The matrix will perform boundary check. * - * \see \link OSM::Sparse_matrix \endlink - * \see \link std::vector \endlink + * @param matrix The initial matrix. + * @param indices/index The indice(s) of the chain(s) to remove. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @return A new matrix containing the result. + * @{ */ - friend Sparse_matrix operator/(const Sparse_matrix &_matrix, const std::vector &_indexes) { - Sparse_matrix res(_matrix); - res /= _indexes; + + /** \brief Remove a set of chains from a copy of a matrix. */ + friend Sparse_matrix operator/(const Sparse_matrix &matrix, const std::vector &_indices) { + Sparse_matrix res(matrix); + res /= _indices; return res; } - /** - * \brief Get a submatrix from the matrix. - * - * Nullifies a chain along the major direction of a copy of the matrix returns it. - * - * \note Will return a copy of the matrix. - * \note The submatrix will be rectangular. - * - * \param[in] _matrix The matrix to process. - * \param[in] _index The index to remove. - * - * \return A new matrix representing the result. - * - * \see \link OSM::Sparse_matrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - friend Sparse_matrix operator/(const Sparse_matrix &_matrix, const int _index) { - Sparse_matrix res(_matrix); - res /= _index; + /** \brief Remove the chain at a given `index` from a copy of a matrix. */ + friend Sparse_matrix operator/(const Sparse_matrix &matrix, int index) { + Sparse_matrix res(matrix); + res /= index; return res; } + /** @} */ + /** - * \brief Get a submatrix from the matrix and assign. - * - * Removes all indexes provided in the vector from the matrix and returns it. - * - * \note Will not alter the matrix if given vector is empty. - * - * \param[in] _indexes The indexes to remove. + * \defgroup GetBlockMatrixAssign Assign a sub-matrix by removing chains in a matrix. + * \ingroup PkgHDVFAlgorithmClasses + * @brief Remove all chains with indices in the `indices` vector (or at a given `index`). The result is thus a block of the initial matrix. * - * \return The modified matrix representing the result. + * \warning The matrix will perform boundary check. * - * \see \link OSM::Sparse_matrix \endlink - * \see \link std::vector \endlink + * @param indices/index The indice(s) of the chain(s) to remove. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @return A reference on the modified matrix. + * @{ */ - Sparse_matrix& operator/=(const std::vector &_indexes) { - for (int index : _indexes) { + + /** \brief Remove a set of chains from a matrix. */ + Sparse_matrix& operator/=(const std::vector &indexes) { + for (int index : indexes) { *this /= index; } return *this; } - /** - * \brief Get a submatrix from the matrix and assign. - * - * Removes index from the matrix and returns it. - * - * \note Will return a copy of the matrix if given vector is empty. - * \note The submatrix will be rectangular. - * - * \param[in] _index The index to remove. - * - * \return A new matrix representing the result. - * - * \see \link OSM::Sparse_matrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Sparse_matrix& operator/=(const int _index) { - _chains[_index].nullify(); - _chainsStates.setOff(_index); + /** \brief Remove the chain at a given `index` from a matrix. */ + Sparse_matrix& operator/=(const int index) { + _chains[index].nullify(); + _chainsStates.setOff(index); return *this; } + /** @} */ + /** - * \brief Nullifies a column from the matrix. + * \brief Remove a column from the matrix. * - * Removes column of index `_index` whatever the `ChainTypeFlag` of the matrix. For column matrices, it just comes to the `\=` operator and for row matrices, it entails a traversal of the matrix. + * Removes column of index `index` whatever the `ChainTypeFlag` of the matrix. For column matrices, it just comes to the `\=` operator and for row matrices, it entails a traversal of the matrix. * - * \param[in] _index The index to remove. + * \param[in] index The index to remove. * * \return The modified matrix representing the result. - * - * \see \link OSM::Sparse_matrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - Sparse_matrix& del_column(int _index) { - std::vector tmp_id{_index} ; + Sparse_matrix& del_column(int index) { + std::vector tmp_id{index} ; if (ChainTypeFlag == OSM::COLUMN) { (*this)/=tmp_id ; } else // OSM::ROW { - for (int index : _chainsStates) + for (int ind : _chainsStates) { - MatrixChain &tmp(_chains[index]) ; + MatrixChain &tmp(_chains[ind]) ; tmp/=tmp_id ; // If the row index has become empty: update - if (tmp.isNull()) - *this /= std::vector({index}) ; + if (tmp.is_null()) + *this /= std::vector({ind}) ; } } @@ -1291,34 +915,27 @@ class Sparse_matrix { } /** - * \brief Nullifies a row from the matrix. + * \brief Remove a row from the matrix. * - * Removes row of index `_index` whatever the `ChainTypeFlag` of the matrix. For row matrices, it just comes to the `\=` operator and for column matrices, it entails a traversal of the matrix. + * Removes row of index `index` whatever the `ChainTypeFlag` of the matrix. For row matrices, it just comes to the `\=` operator and for column matrices, it entails a traversal of the matrix. * - * \param[in] _index The index to remove. + * \param[in] index The index to remove. * * \return The modified matrix representing the result. - * - * \see \link OSM::Sparse_matrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - Sparse_matrix& del_row(int _index) + Sparse_matrix& del_row(int index) { - std::vector tmp_id{_index}; + std::vector tmp_id{index}; if (ChainTypeFlag == OSM::ROW) { (*this) /= tmp_id; } else // OSM::COLUMN { - for (int index : _chainsStates) { - MatrixChain &tmp(_chains[index]); + for (int ind : _chainsStates) { + MatrixChain &tmp(_chains[ind]); tmp /= tmp_id; // If the column index has become empty: update - if (tmp.isNull()) - *this /= std::vector({index}) ; + if (tmp.is_null()) + *this /= std::vector({ind}) ; } } @@ -1326,21 +943,14 @@ class Sparse_matrix { } /** - * \brief Nullifies a coefficient from the matrix. + * \brief Remove a coefficient from the matrix. * - * Removes coefficient at row `i` and column `j` and update (if necessary) the status of corresponding _chains (null or not). + * Removes coefficient at row `i` and column `j`. * * \param[in] i Index of the row * \param[in] j Index of the column * * \return The modified matrix representing the result. - * - * \see \link OSM::Sparse_matrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ Sparse_matrix& del_coef(int i, int j) { @@ -1349,14 +959,14 @@ class Sparse_matrix { std::vector tmp_id({i}) ; MatrixChain &tmp(_chains[j]); tmp /= tmp_id; - if (tmp.isNull()) + if (tmp.is_null()) _chainsStates.setOff(j) ; } else // OSM::ROW { std::vector tmp_id({j}) ; MatrixChain &tmp(_chains[i]); tmp /= tmp_id; - if (tmp.isNull()) + if (tmp.is_null()) _chainsStates.setOff(i) ; } @@ -1364,71 +974,35 @@ class Sparse_matrix { } /** - * \brief Iterator to the beginning of the _chains indices. - * - * \return The iterator to the beginning of the _chains indices. + * \brief Iterator to the index of the first non null chain. * - * \see \link OSM::Sparse_matrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::begin \endlink + * Return an iterator to the index of the first non null chain (the iterator visits indices of non null chains along the major dimension of the matrix). * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \return The iterator to the index of the first non null chain. */ inline Bitboard::iterator begin() const noexcept { return _chainsStates.begin(); } /** - * \brief Iterator to the ending of the _chains indices. + * \brief Iterator to the ending of chains indices. * - * \return The iterator to the ending of the _chains indices. - * - * \see \link OSM::Sparse_matrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::end \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \return The iterator to the ending of chains indices. */ inline Bitboard::iterator end() const noexcept { return _chainsStates.end(); } /** - * \brief Reverse iterator to the _chains indices. - * - * \return The reverse iterator to the _chains indices. + * \brief Reverse iterator to the index of the last non null chain. * - * \see \link OSM::Sparse_matrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::begin \endlink + * Return a reverse iiterator to the index of the last non null chain (the iterator visits indices of non null chains, in decreading order, along the major dimension of the matrix). * - * \author Bac A. - * \version 0.1.0 - * \date 08/04/2024 + * \return The reverse iterator to the index of the last non null chain. */ inline Bitboard::reverse_iterator reverse_begin() noexcept { return _chainsStates.reverse_begin(); } inline Bitboard::reverse_iterator reverse_begin(size_t index) noexcept { return _chainsStates.reverse_begin(index); } /** - * \brief Reverse iterator to the ending of the _chains indices. - * - * \return The reverse iterator to the ending of the _chains indices. - * - * \see \link OSM::Sparse_matrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::end \endlink + * \brief Reverse iterator to the ending of chains indices. * - * \author Bac A. - * \version 0.1.0 - * \date 08/04/2024 + * \return The reverse iterator to the ending of chains indices. */ inline Bitboard::reverse_iterator reverse_end() noexcept { return _chainsStates.reverse_end(); } @@ -1436,13 +1010,7 @@ class Sparse_matrix { /** * \brief Transpose a matrix. * - * \return A new matrix where the chain type flag is changed. - * - * \see \link OSM::Sparse_matrix \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \return A new matrix where the chain type flag has been swapped between COLUMN and ROW and data chains have been transposed. */ Sparse_matrix transpose() { Sparse_matrix transposed(this->_size.second, this->_size.first); @@ -1457,15 +1025,9 @@ class Sparse_matrix { } /** - * \brief Gets the matrix size. - * - * \return The matrix size as a Row/Column pair. + * \brief Get the matrix sizes. * - * \see \link OSM::Sparse_matrix \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 06/05/2024 + * \return The matrix size as a row/column pair. */ std::pair dimensions() const { return this->_size; @@ -1473,9 +1035,7 @@ class Sparse_matrix { }; -/** @ingroup MatrixProdCol - * @brief COLUMN x COLUMN -> COLUMN - */ +// Matrix-matrix product // COLUMN x COLUMN -> COLUMN template Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, COLUMN> &second) { @@ -1483,7 +1043,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, co // Perform col-col matrix multiplication with linear combination of columns. for (int index: second._chainsStates) { - Chain<_CT, COLUMN> column(first._size.first); + Sparse_chain<_CT, COLUMN> column(first._size.first); for (std::pair colRight: second._chains[index]) { if (first._chainsStates.isOn(colRight.first)) { @@ -1497,9 +1057,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, co return res; } -/** @ingroup MatrixProdCol - * @brief ROW x COLUMN -> COLUMN - */ +// Matrix-matrix product // ROW x COLUMN -> COLUMN template Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, COLUMN> &second) { @@ -1507,7 +1065,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const // Perform row-col matrix multiplication with dot products. for (int colRight: second._chainsStates) { - Chain<_CT, COLUMN> column(first._size.first); + Sparse_chain<_CT, COLUMN> column(first._size.first); for (int rowLeft: first._chainsStates) { _CT coef = first._chains[rowLeft] * second._chains[colRight]; @@ -1522,9 +1080,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const return res; } -/** @ingroup MatrixProdCol - * @brief COLUMN x ROW -> COLUMN - */ +// Matrix-matrix product // COLUMN x ROW -> COLUMN template Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, ROW> &second) { @@ -1538,9 +1094,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, co return res; } -/** @ingroup MatrixProdCol - * @brief ROW x ROW -> COLUMN - */ +// Matrix-matrix product // ROW x ROW -> COLUMN template Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, ROW> &second) { @@ -1548,7 +1102,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const // Perform row-col matrix multiplication with dot products. for (int i = 0 ; i < second._size.second ; i++) { - Chain<_CT, COLUMN> column(first._size.first); + Sparse_chain<_CT, COLUMN> column(first._size.first); for (int rowLeft: first._chainsStates) { _CT coef = first._chains[rowLeft] * get_column(second, i); @@ -1557,7 +1111,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const } } - if (!column.isNull()) { + if (!column.is_null()) { res[i] = column; } } @@ -1565,33 +1119,15 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const return res; } -/** - * \brief Perform multiplication between a column-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Matrix - column chain product +// COLUMN matrix template -Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second) +Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_chain<_CT, COLUMN> &_second) { // Perform col-col matrix multiplication with linear combination of columns. - Chain<_CT, COLUMN> column(_first._size.first); + Sparse_chain<_CT, COLUMN> column(_first._size.first); - for (typename Chain<_CT, COLUMN>::const_iterator it = _second.begin(); it != _second.end(); ++it) + for (typename Sparse_chain<_CT, COLUMN>::const_iterator it = _second.begin(); it != _second.end(); ++it) { column += it->second * _first._chains[it->first]; } @@ -1599,31 +1135,13 @@ Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Cha return column; } -/** - * \brief Perform multiplication between a row-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Matrix - column chain product +// ROW matrix template -Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second) +Sparse_chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_chain<_CT, COLUMN> &_second) { // Perform row-col matrix multiplication with dots - Chain<_CT, COLUMN> column(_first._size.first); + Sparse_chain<_CT, COLUMN> column(_first._size.first); for (int index : _first._chainsStates) { @@ -1634,33 +1152,15 @@ Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Chain< return column; } -/** - * \brief Perform multiplication between a row-based chain and a row-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Row chain - matrix product +// ROW matrix template -Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) +Sparse_chain<_CT, ROW> operator*(const Sparse_chain<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { // Perform row-row matrix multiplication with linear combination of rows. - Chain<_CT, ROW> row(_second._size.second); + Sparse_chain<_CT, ROW> row(_second._size.second); - for (typename Chain<_CT, ROW>::const_iterator it = _first.begin(); it != _first.end(); ++it) + for (typename Sparse_chain<_CT, ROW>::const_iterator it = _first.begin(); it != _first.end(); ++it) { row += it->second * _second._chains[it->first]; } @@ -1668,31 +1168,13 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT return row; } -/** - * \brief Perform multiplication between a row-based chain and a column-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Row chain - matrix product +// COLUMN matrix template -Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) +Sparse_chain<_CT, ROW> operator*(const Sparse_chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { // Perform row-col matrix multiplication with dots - Chain<_CT, ROW> row(_second._size.second); + Sparse_chain<_CT, ROW> row(_second._size.second); for (int index : _second._chainsStates) { @@ -1703,32 +1185,14 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT return row; } -/** - * \brief Perform matrix multiplication between two _chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Matrix-matrix product +// COLUMN x COLUMN -> ROW template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); for (int i = 0 ; i < _first._size.first ; i++) { - Chain<_CT, ROW> row(_second._size.second); + Sparse_chain<_CT, ROW> row(_second._size.second); for (int colRight: _second._chainsStates) { _CT coef = get_row(_first, i) * _second._chains[colRight]; @@ -1737,7 +1201,7 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, cons } } - if (!row.isNull()) { + if (!row.is_null()) { res[i] = row; } } @@ -1745,33 +1209,15 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, cons return res; } -/** - * \brief Perform matrix multiplication between two _chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Matrix-matrix product +// ROW x COLUMN -> ROW template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); // Perform row-col matrix multiplication with dot products. for (int rowLeft: _first._chainsStates) { - Chain<_CT, ROW> row(_second._size.second); + Sparse_chain<_CT, ROW> row(_second._size.second); for (int colRight: _second._chainsStates) { _CT coef = _first._chains[rowLeft] * _second._chains[colRight]; @@ -1786,26 +1232,8 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const S return res; } -/** - * \brief Perform matrix multiplication between two _chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Matrix-matrix product +// COLUMN x ROW -> ROW template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second) { Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); @@ -1818,33 +1246,15 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, cons return res; } -/** - * \brief Perform matrix multiplication between two _chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Matrix-matrix product +// ROW x ROW -> ROW template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); // Perform row-row matrix multiplication with linear combination of rows. for (int index: _first._chainsStates) { - Chain<_CT, ROW> row(_second._size.second); + Sparse_chain<_CT, ROW> row(_second._size.second); for (std::pair colRight: _first._chains[index]) { if (_first._chainsStates.isOn(colRight.first)) { @@ -1858,26 +1268,8 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const S return res; } -/** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices sum and assign +// COLUMN += ROW template Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { if (_matrix._size != _other._size) { @@ -1885,12 +1277,12 @@ Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, cons } for (int index = 0 ; index < _other._size.second ; index++) { - Chain column = get_column(_other, index); - if (!column.isNull()) { + Sparse_chain column = get_column(_other, index); + if (!column.is_null()) { _matrix._chainsStates |= index; _matrix._chains[index] += get_column(_other, index); - if (_matrix._chains[index].isNull()) { + if (_matrix._chains[index].is_null()) { _matrix._chainsStates.setOff(index); } } @@ -1899,26 +1291,8 @@ Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, cons return _matrix; } -/** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices sum and assign +// ROW += COLUMN template Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { if (_matrix._size != _other._size) { @@ -1926,12 +1300,12 @@ Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Spar } for (int index = 0 ; index < _other._size.first ; index++) { - Chain row = get_row(_other, index); - if (!row.isNull()) { + Sparse_chain row = get_row(_other, index); + if (!row.is_null()) { _matrix._chainsStates |= index; _matrix._chains[index] += get_row(_other, index); - if (_matrix._chains[index].isNull()) { + if (_matrix._chains[index].is_null()) { _matrix._chainsStates.setOff(index); } } @@ -1940,26 +1314,8 @@ Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Spar return _matrix; } -/** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices subtraction and assign +// COLUMN -= ROW template Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { if (_matrix._size != _other._size) { @@ -1967,12 +1323,12 @@ Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, cons } for (int index = 0 ; index < _other._size.second ; index++) { - Chain column = get_column(_other, index); - if (!column.isNull()) { + Sparse_chain column = get_column(_other, index); + if (!column.is_null()) { _matrix._chainsStates |= index; _matrix._chains[index] -= get_column(_other, index); - if (_matrix._chains[index].isNull()) { + if (_matrix._chains[index].is_null()) { _matrix._chainsStates.setOff(index); } } @@ -1981,26 +1337,8 @@ Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, cons return _matrix; } -/** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices subtraction and assign +// ROW -= COLUMN template Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { if (_matrix._size != _other._size) { @@ -2008,12 +1346,12 @@ Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Spar } for (int index = 0 ; index < _other._size.second ; index++) { - Chain row = get_row(_other, index); - if (!row.isNull()) { + Sparse_chain row = get_row(_other, index); + if (!row.is_null()) { _matrix._chainsStates |= index; _matrix._chains[index] -= get_row(_other, index); - if (_matrix._chains[index].isNull()) { + if (_matrix._chains[index].is_null()) { _matrix._chainsStates.setOff(index); } } @@ -2022,152 +1360,52 @@ Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Spar return _matrix; } -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Sparse_matrix \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices product and assign +// COLUMN += COLUMN template Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { _matrix = _matrix * _other; return _matrix; } -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices product and assign +// ROW += ROW template Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { _matrix = _matrix % _other; return _matrix; } -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices product and assign +// COLUMN += ROW template Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { _matrix = _matrix * _other; return _matrix; } -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two _chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ +// Matrices product and assign +// ROW += COLUMN template Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { _matrix = _matrix % _other; return _matrix; } -/** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Get column (in COLUMN matrix) template -Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { +Sparse_chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, int _index) { return _matrix._chains[_index]; } -/** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Get column (in ROW matrix) template -Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { - Chain<_CT, COLUMN> column(_matrix._size.first); +Sparse_chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, int _index) { + Sparse_chain<_CT, COLUMN> column(_matrix._size.first); if (_matrix._size.first > 0) { for (int i : _matrix._chainsStates) { - if (!_matrix._chains[i].isNull(_index)) { + if (!_matrix._chains[i].is_null(_index)) { column[i] = _matrix._chains[i][_index]; } } @@ -2176,30 +1414,14 @@ Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, const int return column; } -/** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Get row (in COLUMN matrix) template -Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { - Chain<_CT, ROW> row(_matrix._size.second); +Sparse_chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, int _index) { + Sparse_chain<_CT, ROW> row(_matrix._size.second); if (_matrix._size.second > 0) { for (int i : _matrix._chainsStates) { - if (!_matrix._chains[i].isNull(_index)) { + if (!_matrix._chains[i].is_null(_index)) { row[i] = _matrix._chains[i][_index]; } } @@ -2208,45 +1430,15 @@ Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _in return row; } -/** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Get row (in COLUMN matrix) template -Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { +Sparse_chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, int _index) { return _matrix._chains[_index]; } -/** - * \brief Get a const reference over a column from a column matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A const reference over the column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Get constant reference over a column in a column-matrix template -const Chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) +const Sparse_chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix, int _index) { if (_index >= _matrix._size.second) { throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix._size.second) + "."); @@ -2254,23 +1446,9 @@ const Chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix return _matrix._chains[_index]; } -/** - * \brief Get a const reference over a row from a row matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A const reference over the row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Get constant reference over a row in a row-matrix template -const Chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) +const Sparse_chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { if (_index >= _matrix._size.first) { throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix._size.first) + "."); @@ -2278,117 +1456,65 @@ const Chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &_matrix, const i return _matrix._chains[_index]; } -/** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Set column in a COLUMN matrix template -void set_column(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { - if(_matrix.dimensions().first != _chain.dimension()) +void set_column(Sparse_matrix<_CT, COLUMN> &matrix, int index, const Sparse_chain<_CT, COLUMN> &chain) { + if(matrix.dimensions().first != chain.dimension()) throw std::runtime_error("set_column dimension error") ; - _matrix[_index] = _chain; - if (_chain.isNull()) - _matrix._chainsStates.setOff(_index) ; + matrix[index] = chain; + if (chain.is_null()) + matrix._chainsStates.setOff(index) ; } -/** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Set column in a ROW matrix template -void set_column(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { - if(_matrix.dimensions().first != _chain.dimension()) +void set_column(Sparse_matrix<_CT, ROW> &matrix, int index, const Sparse_chain<_CT, COLUMN> &chain) { + if(matrix.dimensions().first != chain.dimension()) throw std::runtime_error("set_column dimension error") ; - for (int i = 0 ; i < _matrix._size.first ; i++) { - if (!_matrix._chains[i].isNull(_index) && _chain.isNull(i)) { - _matrix._chains[i] /= _index; + for (int i = 0 ; i < matrix._size.first ; i++) { + if (!matrix._chains[i].is_null(index) && chain.is_null(i)) { + matrix._chains[i] /= index; - if (_matrix._chains[i].isNull()) { - _matrix._chainsStates.setOff(i); + if (matrix._chains[i].is_null()) { + matrix._chainsStates.setOff(i); } } - if (!_chain.isNull(i)) { - _matrix._chainsStates |= i; - _matrix._chains[i][_index] = _chain[i]; + if (!chain.is_null(i)) { + matrix._chainsStates |= i; + matrix._chains[i][index] = chain[i]; } } } -/** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Set row in a COLUMN matrix template -void set_row(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { +void set_row(Sparse_matrix<_CT, COLUMN> &_matrix, int _index, const Sparse_chain<_CT, ROW> &_chain) { if(_matrix.dimensions().second != _chain.dimension()) throw("set_column dimension error") ; for (int i = 0 ; i < _matrix._size.second ; i++) { - if (!_matrix._chains[i].isNull(_index) && _chain.isNull(i)) { + if (!_matrix._chains[i].is_null(_index) && _chain.is_null(i)) { _matrix._chains[i] /= _index; - if (_matrix._chains[i].isNull()) { + if (_matrix._chains[i].is_null()) { _matrix._chainsStates.setOff(i); } } - if (!_chain.isNull(i)) { + if (!_chain.is_null(i)) { _matrix._chainsStates |= i; _matrix._chains[i][_index] = _chain[i]; } } } -/** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ +// Set row in a ROW matrix template -void set_row(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { +void set_row(Sparse_matrix<_CT, ROW> &_matrix, int _index, const Sparse_chain<_CT, ROW> &_chain) { if(_matrix.dimensions().second != _chain.dimension()) throw("set_column dimension error") ; _matrix[_index] = _chain; - if (_chain.isNull()) + if (_chain.is_null()) _matrix._chainsStates.setOff(_index) ; } diff --git a/HDVF/include/CGAL/OSM/__base.hpp b/HDVF/include/CGAL/OSM/__base.hpp index 79c230d48efb..7b34d75a3e46 100644 --- a/HDVF/include/CGAL/OSM/__base.hpp +++ b/HDVF/include/CGAL/OSM/__base.hpp @@ -28,10 +28,10 @@ typedef int ZCoefficient; template class Sparse_matrix; -// Class Chain +// Class Sparse_chain template -class Chain; +class Sparse_chain; // Class Bitboard From c58e7a5c99445e7089fb5d1c5f49650f409552d9 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Tue, 27 May 2025 16:54:12 +0200 Subject: [PATCH 020/343] Sparse_chain, Sparse_matrix -> finished documenting both classes -> improved coherence by changing ALL Sparse_matrix getters to friend --- HDVF/doc/HDVF/Concepts/Ring.h | 23 ++-- HDVF/doc/HDVF/Concepts/SparseMatrix.h | 19 +++- HDVF/include/CGAL/HDVF/Hdvf.h | 46 ++++---- HDVF/include/CGAL/HDVF/Hdvf_core.h | 18 +-- HDVF/include/CGAL/HDVF/Hdvf_persistence.h | 2 +- HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 26 +++-- HDVF/include/CGAL/OSM/Sparse_matrix.h | 126 +++++++++++++++------ 7 files changed, 169 insertions(+), 91 deletions(-) diff --git a/HDVF/doc/HDVF/Concepts/Ring.h b/HDVF/doc/HDVF/Concepts/Ring.h index 2d6b82527b8c..8b8771ec503b 100644 --- a/HDVF/doc/HDVF/Concepts/Ring.h +++ b/HDVF/doc/HDVF/Concepts/Ring.h @@ -18,25 +18,26 @@ class Ring /// @{ /*! - Type of scalars of the ring. + Type of elements of the ring. */ -typedef unspecified_type Scalar ; +typedef unspecified_type Value ; /// @} /// \name Operators /// @{ -/*! -Returns the vector of vertices coordinates. - */ -const std::vector& get_vertices_coords() const; - -/*! - Returns the coordinates of the cell of index `i` and dimension 0. - */ -Point get_vertex_coords (int i) const; /// @} + + +/// \name Invertibility +/// @{ + /*! + \brief Test if `v` is invertible in the ring. + */ + bool is_invertible(Value v); + +/// @} }; diff --git a/HDVF/doc/HDVF/Concepts/SparseMatrix.h b/HDVF/doc/HDVF/Concepts/SparseMatrix.h index 65621bdc1a2c..e8dc9ba4fd08 100644 --- a/HDVF/doc/HDVF/Concepts/SparseMatrix.h +++ b/HDVF/doc/HDVF/Concepts/SparseMatrix.h @@ -288,14 +288,14 @@ class SparseMatrix { * * Assign the scalar `d` to the coefficient on row `i` and column `j`. */ - void set_coef(int i, int j, const CoefficientType d); + friend void set_coef(Sparse_matrix& matrix, int i, int j, const CoefficientType d); /** * \brief Get a given coefficient. * * Returns the coefficient on row `i` and column `j` of the matrix. */ - CoefficientType get_coef(int i, int j) const; + friend CoefficientType get_coef(const Sparse_matrix& matrix, int i, int j); /** * \brief Get the value of the column at a given `index` from the matrix (whatever the `ChainTypeFlag` of the matrix). @@ -363,8 +363,21 @@ class SparseMatrix { * * Removes column of index `i` whatever the `ChainTypeFlag` of the matrix. For column matrices, it just comes to the `\=` operator and for row matrices, it entails a traversal of the matrix. */ - SparseMatrix& del_column(int i); + friend Sparse_matrix& del_column(Sparse_matrix& matrix, int index); + /** + * \brief Nullifies a row from the matrix. + * + * Removes row of index `i` whatever the `ChainTypeFlag` of the matrix. For row matrices, it just comes to the `\=` operator and for column matrices, it entails a traversal of the matrix. + */ + friend Sparse_matrix& del_row(Sparse_matrix& matrix, int index); + + /** + * \brief Nullifies a coefficient of the matrix. + * + * Removes coefficient on row `i` / column `j` of the matrix. + */ + friend Sparse_matrix& del_coef(Sparse_matrix& matrix, int i, int j); /// @} diff --git a/HDVF/include/CGAL/HDVF/Hdvf.h b/HDVF/include/CGAL/HDVF/Hdvf.h index 74c6dc2f0551..f61af31c0b47 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf.h +++ b/HDVF/include/CGAL/HDVF/Hdvf.h @@ -392,7 +392,7 @@ std::vector Hdvf::find_pairs_M(int q, bo { for (OSM::Bitboard::iterator it_row = this->_F_row.at(q).begin(); it_row != this->_F_row.at(q).end(); ++it_row) { - if (abs(this->_F_row.at(q).get_coef(*it_row,tau)) == 1) + if (abs(get_coef(this->_F_row.at(q), *it_row,tau)) == 1) { PairCell p ; p.sigma = tau ; // primary cell @@ -548,7 +548,7 @@ std::vector Hdvf::find_pairs_W(int q, bo { for (OSM::Bitboard::iterator it_col = this->_G_col.at(q).begin(); it_col != this->_G_col.at(q).end(); ++it_col) { - if (abs(this->_G_col.at(q).get_coef(tau, *it_col)) == 1) + if (abs(get_coef(this->_G_col.at(q), tau, *it_col)) == 1) { PairCell p ; p.sigma = tau ; // secondary cell @@ -881,8 +881,8 @@ void Hdvf::R(int pi, int sigma, int q) { H21 /= std::vector({sigma}); // Remove row sigma from H21 // Remove the corresponding row and column from this->_H_col - this->_H_col[q].del_row(sigma); // Remove row sigma from this->_H_col[q] - this->_H_col[q].del_column(pi); // Remove column pi from this->_H_col[q] + del_row(this->_H_col[q], sigma); // Remove row sigma from this->_H_col[q] + del_column(this->_H_col[q], pi); // Remove column pi from this->_H_col[q] //---------------------------------------------- Submatrices of F ----------------------------------------------------- @@ -890,7 +890,7 @@ void Hdvf::R(int pi, int sigma, int q) { typename HDVF_coreT::CChain F11 = OSM::get_column(this->_F_row[q], pi); // F11 is the column chain from this->_F_row[q] at index pi // Remove the column pi from this->_F_row - this->_F_row[q].del_column(pi); + del_column(this->_F_row[q], pi); //--------------------------------------------- Submatrices of G ------------------------------------------------------ @@ -898,7 +898,7 @@ void Hdvf::R(int pi, int sigma, int q) { typename HDVF_coreT::RChain G11 = OSM::get_row(this->_G_col[q + 1], sigma); // G11 is the row chain from this->_G_col[q+1] at index sigma // Remove the row sigma from this->_G_col - this->_G_col[q + 1].del_row(sigma); + del_row(this->_G_col[q + 1], sigma); //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -1003,15 +1003,15 @@ void Hdvf::M(int pi, int gamma, int q) { F21 /= std::vector({gamma}); // Remove row gamma from F21 // Remove the corresponding row and column from this->_F_row - this->_F_row[q].del_row(gamma); // Remove row gamma from this->_F_row[q] - this->_F_row[q].del_column(pi); // Remove column pi from this->_F_row[q] + del_row(this->_F_row[q], gamma); // Remove row gamma from this->_F_row[q] + del_column(this->_F_row[q], pi); // Remove column pi from this->_F_row[q] //--------------------------------------------- Submatrices of G ------------------------------------------------------ // Extract the relevant column chain from this->_G_col // G11_q is the column chain from this->_G_col[q] at index gamma // HDVF_coreT::CChain G11_q(OSM::get_column(this->_G_col[q], gamma)); - this->_G_col[q].del_column(gamma); // Remove column gamma from this->_G_col[q] + del_column(this->_G_col[q], gamma); // Remove column gamma from this->_G_col[q] //---------------------------------------------- Submatrices of H ----------------------------------------------------- @@ -1019,7 +1019,7 @@ void Hdvf::M(int pi, int gamma, int q) { typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col[q], pi)); // H11 is the column chain from this->_H_col[q] at index pi // Remove the column pi from this->_H_col - this->_H_col[q].del_column(pi); + del_column(this->_H_col[q], pi); //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ @@ -1028,7 +1028,7 @@ void Hdvf::M(int pi, int gamma, int q) { // DD_q+1 (corresponds to the row matrix of this->_DD_col) typename HDVF_coreT::RChain D11(OSM::get_row(this->_DD_col[q+1], gamma)); // D11 is the row chain from this->_DD_col[q+1] at index gamma - this->_DD_col[q + 1].del_row(gamma); // Remove row gamma from this->_DD_col[q + 1] + del_row(this->_DD_col[q + 1], gamma); // Remove row gamma from this->_DD_col[q + 1] //--------------------------------------------- Submatrices of DD ------------------------------------------------------ @@ -1036,7 +1036,7 @@ void Hdvf::M(int pi, int gamma, int q) { // HDVF_coreT::CChain D11_q(OSM::get_column(this->_DD_col[q], gamma)); // D11_q is the column chain from this->_DD_col[q] at index gamma if (q > 0) - this->_DD_col[q].del_column(gamma); // Remove column gamma from this->_DD_col[q] + del_column(this->_DD_col[q], gamma); // Remove column gamma from this->_DD_col[q] //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -1059,7 +1059,7 @@ void Hdvf::M(int pi, int gamma, int q) { OSM::set_column(this->_F_row[q], gamma, F21 * (-F11_inv)); // Set the coefficient at (pi, gamma) in this->_F_row[q] to F11_inv - this->_F_row[q].set_coef(pi, gamma, F11_inv); + set_coef(this->_F_row[q], pi, gamma, F11_inv); // Update this->_G_col // Add the product of (H11 * F11_inv) and D11 to this->_G_col[q+1] @@ -1127,8 +1127,8 @@ void Hdvf::W(int sigma, int gamma, int q) { G21 /= std::vector({sigma}); // Remove row sigma from G21 // Remove the corresponding row and column from this->_G_col - this->_G_col[q].del_row(sigma); // Remove row sigma from this->_G_col[q] - this->_G_col[q].del_column(gamma); // Remove column gamma from this->_G_col[q] + del_row(this->_G_col[q], sigma); // Remove row sigma from this->_G_col[q] + del_column(this->_G_col[q], gamma); // Remove column gamma from this->_G_col[q] //---------------------------------------------- Submatrices of F ----------------------------------------------------- @@ -1136,7 +1136,7 @@ void Hdvf::W(int sigma, int gamma, int q) { // RChain F11(OSM::get_row(this->_F_row[q], gamma)); // F11 is the row chain from this->_F_row[q] at index gamma // Remove the row gamma from this->_F_row - this->_F_row[q].del_row(gamma); + del_row(this->_F_row[q], gamma); //--------------------------------------------- Submatrices of H ------------------------------------------------------ @@ -1144,7 +1144,7 @@ void Hdvf::W(int sigma, int gamma, int q) { typename HDVF_coreT::RChain H11(OSM::get_row(this->_H_col[q-1], sigma)); // H11 is the row chain from this->_H_col[q] at index sigma // Remove the row sigma from this->_H_col - this->_H_col[q-1].del_row(sigma); + del_row(this->_H_col[q-1], sigma); //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ @@ -1153,7 +1153,7 @@ void Hdvf::W(int sigma, int gamma, int q) { // Remove the row gamma from this->_DD_col if (q < this->_K.dim()) - this->_DD_col[q + 1].del_row(gamma); + del_row(this->_DD_col[q + 1], gamma); //--------------------------------------------- Submatrices of DD_q ------------------------------------------------------ @@ -1161,7 +1161,7 @@ void Hdvf::W(int sigma, int gamma, int q) { typename HDVF_coreT::CChain D11_q(OSM::get_column(this->_DD_col[q], gamma)); // D11_q is the column chain from this->_DD_col[q] at index gamma // Remove the column gamma from this->_DD_col - this->_DD_col[q].del_column(gamma); + del_column(this->_DD_col[q], gamma); //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -1184,7 +1184,7 @@ void Hdvf::W(int sigma, int gamma, int q) { OSM::set_column(this->_G_col[q], sigma, G21 * G11_inv); // Set the coefficient at (gamma, sigma) in this->_G_col[q] to G11_inv - this->_G_col[q].set_coef(gamma, sigma, G11_inv); + set_coef(this->_G_col[q], gamma, sigma, G11_inv); // Update this->_F_row (for dimension q-1) // Add the product of (D11_q * G11_inv) and H11 to this->_F_row[q - 1] @@ -1249,7 +1249,7 @@ void Hdvf::MW(int pi, int sigma, int q) { typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; // H21_q-1 -> delete H11q1 - this->_H_col.at(q-1).del_row(sigma) ; + del_row(this->_H_col.at(q-1), sigma) ; // d(pi) @@ -1277,13 +1277,13 @@ void Hdvf::MW(int pi, int sigma, int q) { typename HDVF_coreT::CChain F11(OSM::get_column(this->_F_row.at(q), pi)) ; // F12 -> delete col F11 - this->_F_row.at(q).del_column(pi) ; + del_column(this->_F_row.at(q), pi) ; // G_q extractions typename HDVF_coreT::RChain G11(OSM::get_row(this->_G_col.at(q), sigma)) ; // G21 -> dele row G11 - this->_G_col.at(q).del_row(sigma) ; + del_row(this->_G_col.at(q), sigma) ; // ----------- Update of the reduction diff --git a/HDVF/include/CGAL/HDVF/Hdvf_core.h b/HDVF/include/CGAL/HDVF/Hdvf_core.h index ca4333968c70..e5df3dfd4a0c 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_core.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_core.h @@ -709,8 +709,8 @@ void Hdvf_core::A(int D21 /= std::vector({tau1}); // Remove tau1 row from D21 // Delete rows and columns from _DD_col - _DD_col[q + 1].del_row(tau1); // Remove row tau1 from _DD_col[q+1] - _DD_col[q + 1].del_column(tau2); // Remove column tau2 from _DD_col[q+1] + del_row(_DD_col[q + 1], tau1); // Remove row tau1 from _DD_col[q+1] + del_column(_DD_col[q + 1], tau2); // Remove column tau2 from _DD_col[q+1] //---------------------------------------------- Submatrices of F ----------------------------------------------------- @@ -722,7 +722,7 @@ void Hdvf_core::A(int F11 = OSM::get_row(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 // Delete the row tau1 from _F_row - _F_row[q].del_row(tau1); + del_row(_F_row[q], tau1); } //--------------------------------------------- Submatrices of G ------------------------------------------------------ @@ -733,7 +733,7 @@ void Hdvf_core::A(int G11 = OSM::get_column(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 // Delete the column tau2 from _G_col - _G_col[q + 1].del_column(tau2); + del_column(_G_col[q + 1], tau2); } //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -751,7 +751,7 @@ void Hdvf_core::A(int OSM::set_column(_F_row[q], tau1, D21 * (-D11_inv)); // Remove the row tau2 from _F_row[q+1] - _F_row[q + 1].del_row(tau2); + del_row(_F_row[q + 1], tau2); } // ---- Update _G_col @@ -766,7 +766,7 @@ void Hdvf_core::A(int OSM::set_row(_G_col[q + 1], tau2, D12 * (-D11_inv)); // Remove the column tau1 from _G_col[q] - _G_col[q].del_column(tau1); + del_column(_G_col[q], tau1); } // ---- Update _H_col @@ -787,7 +787,7 @@ void Hdvf_core::A(int OSM::set_column(_H_col[q], tau1, G11 * D11_inv); // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv - _H_col[q].set_coef(tau2, tau1, D11_inv); + set_coef(_H_col[q], tau2, tau1, D11_inv); } // ---- Update _DD_col @@ -797,10 +797,10 @@ void Hdvf_core::A(int // Remove columns and rows from _DD_col as necessary if (q > 0) { - _DD_col[q].del_column(tau1); // Remove column tau1 from _DD_col[q] + del_column(_DD_col[q], tau1); // Remove column tau1 from _DD_col[q] } if (q + 2 <= _K.dim()) { - _DD_col[q + 2].del_row(tau2); // Remove row tau2 from _DD_col[q+2] + del_row(_DD_col[q + 2], tau2); // Remove row tau2 from _DD_col[q+2] } // Update flags diff --git a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h index 4d31a45a2209..f7ea9faba725 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h @@ -717,7 +717,7 @@ Hdvf_persistence::Hdvf_pe // Cells in the _K basis : i(dim q-1) / j(dim q) // Convert to indices in the persistent order const int pi(_K_to_per.at(q-1).at(i)), pj(_K_to_per.at(q).at(j)) ; - _DD_per.at(q).set_coef(pi, pj, v) ; + set_coef(_DD_per.at(q), pi, pj, v) ; } } } diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp index 29e82c022bc8..f3fb5c64d4d5 100644 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -1,15 +1,17 @@ -/** - * \file SubSparseMatrix.hpp - * \brief Namespace file for describing library. - * \author Bac A. - * \version 0.1.0 - * \date 02/10/2024 - * - * Define everything for the SubSparseMatrix class - */ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac +// Kevin Fedyna -#ifndef __SUB_SPARSE_MATRIX__ -#define __SUB_SPARSE_MATRIX__ +#ifndef CGAL_OSM_SUB_SPARSE_MATRIX_H +#define CGAL_OSM_SUB_SPARSE_MATRIX_H #include "CGAL/OSM/Sparse_matrix.h" @@ -128,4 +130,4 @@ class SubSparseMatrix : public Sparse_matrix<_CoefficientType, _ChainTypeFlag> { } /* end namespace OSM */ } /* end namespace CGAL */ -#endif +#endif // CGAL_OSM_SUB_SPARSE_MATRIX_H diff --git a/HDVF/include/CGAL/OSM/Sparse_matrix.h b/HDVF/include/CGAL/OSM/Sparse_matrix.h index 85b2a2cff093..0cf006357745 100644 --- a/HDVF/include/CGAL/OSM/Sparse_matrix.h +++ b/HDVF/include/CGAL/OSM/Sparse_matrix.h @@ -629,17 +629,8 @@ class Sparse_matrix { return _chains[index]; } - /** - * \brief Set a given coefficient. - * - * Assign the scalar `d` to the coefficient on row `i` and column `j`. - * - * \warning The matrix will perform boundary check. - * - * \param[in] i The row index. - * \param[in] j The column index. - * \param[in] d The value. - */ +protected: + // Protected method for set_coef void set_coef(const int i, const int j, const CoefficientType d) { if (i >= _size.first) { throw std::runtime_error("Provided i index should be less than " + std::to_string(_size.first) + "."); @@ -662,19 +653,24 @@ class Sparse_matrix { del_coef(i, j); } } - +public: /** - * \brief Get a given coefficient. + * \brief Set a given coefficient in `matrix`. * - * Returns the coefficient on row `i` and column `j` of the matrix. + * Assign the scalar `d` to the coefficient on row `i` and column `j`. * * \warning The matrix will perform boundary check. * + * \param[in] matrix Reference on the matrix to modify. * \param[in] i The row index. * \param[in] j The column index. - * - * \return The value of the given coefficient. + * \param[in] d The value. */ + template + friend void set_coef(Sparse_matrix<_CT, _CTF>& matrix, int i, int j, const _CT d); + +protected: + // Protected method for get_coef CoefficientType get_coef(const int i, const int j) const { if (i >= _size.first) { throw std::runtime_error("Provided _i index should be less than " + std::to_string(_size.first) + "."); @@ -688,6 +684,22 @@ class Sparse_matrix { else // ROW return (this->_chains)[i][j] ; } +public: + /** + * \brief Get a given coefficient. + * + * Returns the coefficient on row `i` and column `j` of the matrix. + * + * \warning The matrix will perform boundary check. + * + * \param[in] matrix Constant reference on the matrix. + * \param[in] i The row index. + * \param[in] j The column index. + * + * \return The value of the given coefficient. + */ + template + friend _CT get_coef(const Sparse_matrix<_CT, _CTF>& matrix, int i, int j); /** * \defgroup GetColumn Get a column. @@ -884,15 +896,8 @@ class Sparse_matrix { /** @} */ - /** - * \brief Remove a column from the matrix. - * - * Removes column of index `index` whatever the `ChainTypeFlag` of the matrix. For column matrices, it just comes to the `\=` operator and for row matrices, it entails a traversal of the matrix. - * - * \param[in] index The index to remove. - * - * \return The modified matrix representing the result. - */ +protected: + // Protected version of del_column Sparse_matrix& del_column(int index) { std::vector tmp_id{index} ; if (ChainTypeFlag == OSM::COLUMN) @@ -913,16 +918,22 @@ class Sparse_matrix { return *this; } - +public: /** - * \brief Remove a row from the matrix. + * \brief Remove a column from the matrix. * - * Removes row of index `index` whatever the `ChainTypeFlag` of the matrix. For row matrices, it just comes to the `\=` operator and for column matrices, it entails a traversal of the matrix. + * Removes column of index `index` whatever the `ChainTypeFlag` of the matrix. For column matrices, it just comes to the `\=` operator and for row matrices, it entails a traversal of the matrix. * + * \param[in] matrix Reference on the matrix to modify. * \param[in] index The index to remove. * * \return The modified matrix representing the result. */ + template + friend Sparse_matrix<_CT, _CTF>& del_column(Sparse_matrix<_CT, _CTF>& matrix, int index); + +protected: + // Protected version of del_row Sparse_matrix& del_row(int index) { std::vector tmp_id{index}; @@ -942,16 +953,22 @@ class Sparse_matrix { return *this; } +public: /** - * \brief Remove a coefficient from the matrix. + * \brief Remove a row from the matrix. * - * Removes coefficient at row `i` and column `j`. + * Removes row of index `index` whatever the `ChainTypeFlag` of the matrix. For row matrices, it just comes to the `\=` operator and for column matrices, it entails a traversal of the matrix. * - * \param[in] i Index of the row - * \param[in] j Index of the column + * \param[in] matrix Reference on the matrix to modify. + * \param[in] index The index to remove. * * \return The modified matrix representing the result. */ + template + friend Sparse_matrix<_CT, _CTF>& del_row(Sparse_matrix<_CT, _CTF>& matrix, int index); + +protected: + // Protected version of del_coef Sparse_matrix& del_coef(int i, int j) { @@ -973,6 +990,21 @@ class Sparse_matrix { return *this; } +public: + /** + * \brief Remove a coefficient from the matrix. + * + * Removes coefficient at row `i` and column `j`. + * + * \param[in] matrix Reference on the matrix to modify. + * \param[in] i Index of the row + * \param[in] j Index of the column + * + * \return The modified matrix representing the result. + */ + template + friend Sparse_matrix<_CT, _CTF>& del_coef(Sparse_matrix<_CT, _CTF>& matrix, int i, int j); + /** * \brief Iterator to the index of the first non null chain. * @@ -1518,6 +1550,36 @@ void set_row(Sparse_matrix<_CT, ROW> &_matrix, int _index, const Sparse_chain<_ _matrix._chainsStates.setOff(_index) ; } +template +void set_coef(Sparse_matrix<_CT, _CTF>& matrix, int i, int j, const _CT d) +{ + matrix.set_coef(i, j, d); +} + +template +_CT get_coef(const Sparse_matrix<_CT, _CTF>& matrix, int i, int j) +{ + matrix.get_coef(i, j); +} + +template +Sparse_matrix<_CT, _CTF>& del_column(Sparse_matrix<_CT, _CTF>& matrix, int index) +{ + return matrix.del_column(index); +} + +template +Sparse_matrix<_CT, _CTF>& del_row(Sparse_matrix<_CT, _CTF>& matrix, int index) +{ + return matrix.del_row(index); +} + +template +Sparse_matrix<_CT, _CTF>& del_coef(Sparse_matrix<_CT, _CTF>& matrix, int i, int j) +{ + return matrix.del_coef(i, j); +} + } /* end namespace OSM */ } /* end namespace CGAL */ From 720f5f6249a615f8a8e16f5d6c325c115969305f Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Wed, 28 May 2025 10:04:55 +0200 Subject: [PATCH 021/343] Sub_sparse_matrix -> finish documentation and rework of Sub_sparse_matrix class --- HDVF/examples/HDVF/main_dual_hdvf.cpp | 12 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 2 +- .../HDVF/{hdvf_duality.hpp => Hdvf_duality.h} | 52 ++--- HDVF/include/CGAL/HDVF/Hdvf_persistence.h | 14 +- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 2 +- HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 133 ------------ .../CGAL/HDVF/Sub_chain_complex_mask.h | 14 +- HDVF/include/CGAL/HDVF/Sub_sparse_matrix.h | 197 ++++++++++++++++++ HDVF/include/CGAL/OSM/Sparse_matrix.h | 14 +- 9 files changed, 252 insertions(+), 188 deletions(-) rename HDVF/include/CGAL/HDVF/{hdvf_duality.hpp => Hdvf_duality.h} (93%) delete mode 100644 HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp create mode 100644 HDVF/include/CGAL/HDVF/Sub_sparse_matrix.h diff --git a/HDVF/examples/HDVF/main_dual_hdvf.cpp b/HDVF/examples/HDVF/main_dual_hdvf.cpp index dc87bac5a883..9e3b570e2e4a 100644 --- a/HDVF/examples/HDVF/main_dual_hdvf.cpp +++ b/HDVF/examples/HDVF/main_dual_hdvf.cpp @@ -14,9 +14,9 @@ #include "CGAL/HDVF/Cubical_chain_complex.hpp" #include "CGAL/HDVF/CubComplexTools.hpp" #include "CGAL/HDVF/hdvf_tools.hpp" -#include "CGAL/HDVF/hdvf_duality.hpp" +#include "CGAL/HDVF/Hdvf_duality.h" #include "CGAL/OSM/OSM.hpp" -#include "CGAL/HDVF/SubSparseMatrix.hpp" +#include "CGAL/HDVF/Sub_sparse_matrix.h" #include "CGAL/HDVF/hdvf_tools.hpp" #include "arguments.h" #include "CGAL/HDVF/Zp.hpp" @@ -186,12 +186,12 @@ void main_code (const Options &options) // K { hdvf.set_mask_K() ; - Simp_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; + Simp_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; } // L-K { hdvf.set_mask_L_K() ; - Simp_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; + Simp_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; } } @@ -254,12 +254,12 @@ void main_code (const Options &options) // K { hdvf.set_mask_K() ; - Cub_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; + Cub_output_vtk(hdvf, L, options.outfile_root+"_complex_K") ; } // L-K { hdvf.set_mask_L_K() ; - Cub_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; + Cub_output_vtk(hdvf, L, options.outfile_root+"_cocomplex_L_K") ; } } diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index 9c5d5c5dcd61..2c99d3a98e03 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -147,7 +147,7 @@ class Duality_cubical_complex_tools { { const std::vector khal(_CC.ind2khal(_CC._base2bool.at(q).at(i))) ; const int j = L._bool2base.at(q).at(L.khal2ind(khal)) ; - K.set_BitOn(q,j) ; + K.set_bit_on(q,j) ; } } return std::pair<_ComplexType&, _SubCCType&>(L,K) ; diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/Hdvf_duality.h similarity index 93% rename from HDVF/include/CGAL/HDVF/hdvf_duality.hpp rename to HDVF/include/CGAL/HDVF/Hdvf_duality.h index 7932ae078601..102fe632a991 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/Hdvf_duality.h @@ -15,7 +15,7 @@ #include "CGAL/OSM/Bitboard.h" #include "CGAL/HDVF/Hdvf_core.h" #include "CGAL/HDVF/Sub_chain_complex_mask.h" -#include "CGAL/HDVF/SubSparseMatrix.hpp" +#include "CGAL/HDVF/Sub_sparse_matrix.h" namespace CGAL { namespace HDVF { @@ -35,14 +35,14 @@ namespace HDVF { */ template -class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::SubSparseMatrix> { +class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::Sub_sparse_matrix> { private: // Matrices types typedef OSM::Sparse_chain<_CoefficientType, OSM::COLUMN> CChain; typedef OSM::Sparse_chain<_CoefficientType, OSM::ROW> RChain; // HDVF Type - typedef Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::SubSparseMatrix> HDVF_type ; + typedef Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::Sub_sparse_matrix> HDVF_type ; // Complex L const _ComplexType& _L ; @@ -150,7 +150,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars out << "--- dim " << q << endl; for (int i = 0; i < _L.nb_cells(q); ++i) { - if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { + if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_bit(q, i))) { out << i << " "; } } @@ -164,7 +164,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars for (int q = 0; q <= _L.dim(); ++q) { out << "--- dim " << q << endl; for (int i = 0; i < _L.nb_cells(q); ++i) { - if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { + if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_bit(q, i))) { out << "g(" << i << ") = (" << i << ")"; // Iterate over the ith column of _G_col typename HDVF_type::CChain col(OSM::get_column(this->_G_col.at(q), i)) ; // TODO cget @@ -184,7 +184,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars for (int q = 0; q <= _L.dim(); ++q) { out << "--- dim " << q << endl; for (int i = 0; i < _L.nb_cells(q); ++i) { - if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { + if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_bit(q, i))) { out << "f*(" << i << ") = (" << i << ")"; // Iterate over the ith row of _F_row typename HDVF_type::RChain row(OSM::get_row(this->_F_row.at(q), i)) ; // TODO cget @@ -207,25 +207,25 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars for (int q=0; q<=_L.dim(); ++q) { for (int i=0; i dim " << q << " : q / q-1 cells" << endl ; out << "id " << q << " : " ; - for (typename OSM::Bitboard::iterator it = subPair.get_BitBoard(q).begin(); it != subPair.get_BitBoard(q).end(); ++it) + for (typename OSM::Bitboard::iterator it = subPair.get_bitboard(q).begin(); it != subPair.get_bitboard(q).end(); ++it) out << *it << " " ; out << endl ; out << "id " << q-1 << " : " ; - for (typename OSM::Bitboard::iterator it = subPair.get_BitBoard(q-1).begin(); it != subPair.get_BitBoard(q-1).end(); ++it) + for (typename OSM::Bitboard::iterator it = subPair.get_bitboard(q-1).begin(); it != subPair.get_bitboard(q-1).end(); ++it) out << *it << " " ; out << endl ; - for (typename OSM::Bitboard::iterator it = subPair.get_BitBoard(q).begin(); it != subPair.get_BitBoard(q).end(); ++it) + for (typename OSM::Bitboard::iterator it = subPair.get_bitboard(q).begin(); it != subPair.get_bitboard(q).end(); ++it) { - for (typename OSM::Bitboard::iterator it2 = subPair.get_BitBoard(q-1).begin(); it2 != subPair.get_BitBoard(q-1).end(); ++it2) + for (typename OSM::Bitboard::iterator it2 = subPair.get_bitboard(q-1).begin(); it2 != subPair.get_bitboard(q-1).end(); ++it2) { if (this->_DD_col.at(q).get_coef(*it2, *it) == 0) out << ".\t" ; @@ -248,7 +248,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars { for (int i = 0; i_K.nb_cells(q); ++i) { - if (_subCC.get_Bit(q, i)) // i belongs to _subCC + if (_subCC.get_bit(q, i)) // i belongs to _subCC { if (this->_flag.at(q).at(i) == PRIMARY) labels.at(q).push_back(-1) ; @@ -284,7 +284,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars for (typename CChain::const_iterator it = g_cell.begin(); it != g_cell.end(); ++it) { - if (_subCC.get_Bit(dim, it->first)) + if (_subCC.get_bit(dim, it->first)) { g_cell_sub.set_coef(it->first, it->second) ; } @@ -319,7 +319,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars RChain cofaces(this->_K.cod(it->first,dim)) ; for (typename RChain::const_iterator it2 = cofaces.cbegin(); it2 != cofaces.cend(); ++it2) { - if (_subCC.get_Bit(dim+1, it2->first)) + if (_subCC.get_bit(dim+1, it2->first)) fstar_cofaces.set_coef(it2->first, 1) ; } } @@ -333,7 +333,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Spars template Hdvf_duality<_CoefficientType,_ComplexType>::Hdvf_duality(const _ComplexType& L, Sub_chain_complex_mask<_CoefficientType, _ComplexType>& K, int hdvf_opt) : -Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} +Hdvf_core<_CoefficientType, _ComplexType, OSM::Sparse_chain, OSM::Sub_sparse_matrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} /** \brief find a valid PairCell for A in dimension q */ template @@ -350,7 +350,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &f // Iterate through the entries of the column // Check that the row belongs to the subchaincomplex for (typename HDVF_type::CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { - if (_subCC.get_Bit(q, it->first) && (abs(it->second) == 1)) { + if (_subCC.get_bit(q, it->first) && (abs(it->second) == 1)) { // If an entry with coefficient 1 or -1 is found, set the pair and mark as found p.sigma = it->first; p.tau = *it_col; @@ -369,7 +369,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &f found = false; PairCell p ; // Check tau belongs to _subCC - if (!_subCC.get_Bit(q, tau)) + if (!_subCC.get_bit(q, tau)) throw("Hdvf_duality: searching for a cell tau outside _subCC") ; // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible @@ -377,7 +377,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &f const typename HDVF_type::CChain& tmp2(OSM::cget_column(this->_DD_col.at(q), tau)) ; for (typename HDVF_type::CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) { - if (_subCC.get_Bit(q-1, it->first) && abs(it->second) == 1) + if (_subCC.get_bit(q-1, it->first) && abs(it->second) == 1) { found = true ; p.sigma = it->first ; @@ -391,7 +391,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &f typename HDVF_type::RChain tmp(OSM::get_row(this->_DD_col.at(q+1), tau)) ; for (typename HDVF_type::RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) { - if (_subCC.get_Bit(q+1, it->first) && (abs(it->second) == 1)) + if (_subCC.get_bit(q+1, it->first) && (abs(it->second) == 1)) { found = true ; PairCell p ; @@ -417,7 +417,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A( // Iterate through the entries of the column for (typename HDVF_type::CChain::const_iterator it = col.begin(); it != col.end(); ++it) { - if (_subCC.get_Bit(q, it->first) && ((it->second == 1) || (it->second == -1))) { + if (_subCC.get_bit(q, it->first) && ((it->second == 1) || (it->second == -1))) { // If an entry of _subCC with coefficient 1 or -1 is found, set the pair and mark as found PairCell p; p.sigma = it->first; @@ -438,7 +438,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A( found = false; std::vector pairs; // Check if tau belongs to _subCC - if (!_subCC.get_Bit(q, tau)) + if (!_subCC.get_bit(q, tau)) throw("Hdvf_duality: searching for a cell tau outside _subCC") ; // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible @@ -446,7 +446,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A( typename HDVF_type::RChain tmp(OSM::get_row(this->_DD_col.at(q+1), tau)) ; for (typename HDVF_type::RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { - if (_subCC.get_Bit(q+1, it->first) && (abs(it->second) == 1)) + if (_subCC.get_bit(q+1, it->first) && (abs(it->second) == 1)) { found = true ; PairCell p ; @@ -461,7 +461,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A( const typename HDVF_type::CChain& tmp2(OSM::cget_column(this->_DD_col.at(q), tau)) ; for (typename HDVF_type::CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) { - if (_subCC.get_Bit(q-1, it->first) && (abs(it->second) == 1)) + if (_subCC.get_bit(q-1, it->first) && (abs(it->second) == 1)) { found = true ; PairCell p ; @@ -533,7 +533,7 @@ vector > Hdvf_duality::get_flag (FlagTy { for (int i=0; i<_L.nb_cells(q); ++i) { - if (_subCC.get_Bit(q, i) && (this->_flag.at(q).at(i) == flag)) + if (_subCC.get_bit(q, i) && (this->_flag.at(q).at(i) == flag)) res.at(q).push_back(i) ; } } @@ -547,7 +547,7 @@ vector Hdvf_duality::get_flag_dim (FlagType fl vector res ; for (int i=0; i_K.nb_cells(q); ++i) { - if (_subCC.get_Bit(q, i) && (this->_flag.at(q).at(i) == flag)) + if (_subCC.get_bit(q, i) && (this->_flag.at(q).at(i) == flag)) res.push_back(i) ; } return res ; diff --git a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h index f7ea9faba725..7929e8fb2a93 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h @@ -18,7 +18,7 @@ #include #include #include "CGAL/OSM/OSM.hpp" -#include "CGAL/HDVF/SubSparseMatrix.hpp" +#include "CGAL/HDVF/Sub_sparse_matrix.h" #include "CGAL/HDVF/Hdvf_core.h" #include "CGAL/HDVF/Filtration_lower_star.h" @@ -124,7 +124,7 @@ ostream& operator<< (ostream& out, const PerHoleT& hole) */ template -class Hdvf_persistence : public Hdvf_core +class Hdvf_persistence : public Hdvf_core { public: // Matrices types @@ -141,17 +141,17 @@ class Hdvf_persistence : public Hdvf_core CMatrix; + typedef OSM::Sub_sparse_matrix CMatrix; /*! Type of row-major sparse matrices */ - typedef OSM::SubSparseMatrix RMatrix; + typedef OSM::Sub_sparse_matrix RMatrix; /*! Type of parent HDVF class (Hdvf_core with appropriate template parameters) * The SparseMatrix model is set to Sub_sparse_matrix to activate (co)homology computation over a subcomplex. */ - typedef Hdvf_core HDVFParent ; + typedef Hdvf_core HDVFParent ; /*! Type of filtrations used to compute persistence. */ @@ -662,7 +662,7 @@ class Hdvf_persistence : public Hdvf_core -Hdvf_persistence::Hdvf_persistence(const ComplexType& K, const FiltrationType& f, int hdvf_opt, bool with_export) : Hdvf_core(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1) +Hdvf_persistence::Hdvf_persistence(const ComplexType& K, const FiltrationType& f, int hdvf_opt, bool with_export) : Hdvf_core(K,hdvf_opt), _f(f), _with_export(with_export), _t(-1) { // Initialisation of _t_dim, _K_to_per and _per_to_K _t_dim.resize(this->_K.dim()+1, 0) ; @@ -779,7 +779,7 @@ PairCell Hdvf_persistence const int q_current(_f._filtration.at(_t).second) ; // Get the dimension of the new current cell ++_t_dim.at(q_current) ; // Update time in the dimension of the current cell _masks.at(q_current).setOn(_t_dim.at(q_current)) ; // Update mask accordingly - this->_DD_col.at(q_current).set_bitOn(_t_dim.at(q_current)) ; // Update _DD_col mask + this->_DD_col.at(q_current).set_bit_on(_t_dim.at(q_current)) ; // Update _DD_col mask // Search for pairing // bool found ; diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index 71405698c5ac..0db7335e739d 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -131,7 +131,7 @@ class Duality_simplicial_complex_tools { { const std::set& simplex(_K._ind2simp.at(q).at(i).getVertices()) ; const int id(L._simp2ind.at(q)[simplex]) ; - K.set_BitOn(q, id) ; + K.set_bit_on(q, id) ; } } TripleRes t = {L,K,tetL.nodes} ; diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp deleted file mode 100644 index f3fb5c64d4d5..000000000000 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2025 LIS Marseille (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Alexandra Bac -// Kevin Fedyna - -#ifndef CGAL_OSM_SUB_SPARSE_MATRIX_H -#define CGAL_OSM_SUB_SPARSE_MATRIX_H - - -#include "CGAL/OSM/Sparse_matrix.h" -#include "CGAL/OSM/Bitboard.h" - -namespace CGAL { -namespace OSM { - -/** - * \class SubSparseMatrix - * \brief Vector implementation of sparse matrices with a bitboard submatrix mask. - * - * The SubSparseMatrix class contains functions related to OSM matrix restriction. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Bac A. - * \version 0.1.0 - * \date 02/10/2024 - */ -template -class SubSparseMatrix : public Sparse_matrix<_CoefficientType, _ChainTypeFlag> { - -protected: - /** \brief A bitboard describing subchains restriction. */ - Bitboard _subChains; - - /** \brief A bitboard containing state of each chain (restricted to subchains). */ - Bitboard _subChainsStates; - -public: - /** \brief Constructor with sizes and Bitboard describing subchains. */ - SubSparseMatrix(const int _rowCount, const int _columnCount, const Bitboard& subChain) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->_chainsStates & subChain) - { - } - - /** \brief Constructor with sizes (Bitboard describing subchains set to full Bitboard). */ - SubSparseMatrix(const int _rowCount=0, const int _columnCount=0) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount) - { - if (_ChainTypeFlag == OSM::COLUMN) - _subChains = OSM::Bitboard(_columnCount,false) ; - else - _subChains = OSM::Bitboard(_rowCount,false) ; - _subChainsStates = this->_chainsStates & _subChains ; - } - - /** \brief Copy constructor. */ - SubSparseMatrix(const SubSparseMatrix& otherToCopy) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(otherToCopy), _subChains(otherToCopy._subChains), _subChainsStates(otherToCopy._subChainsStates) {} - - /** \brief Copy constructor from Sparse_matrix. */ - SubSparseMatrix(const Sparse_matrix<_CoefficientType,_ChainTypeFlag>& otherToCopy) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(otherToCopy) - { - if (_ChainTypeFlag == OSM::COLUMN) - _subChains = OSM::Bitboard(otherToCopy.dimensions().second,false) ; - else - _subChains = OSM::Bitboard(otherToCopy.dimensions().first,false) ; - _subChainsStates = this->_chainsStates & _subChains ; - } - - - /** \brief Iterator to the beginning of the subchains indices. */ - inline Bitboard::iterator begin() const noexcept - { - return _subChainsStates.begin() ; - } - - /** \brief Iterator to the end of the subchains indices. */ - inline Bitboard::iterator end() const noexcept - { - return _subChainsStates.end() ; - } - - /** \brief Change subchains. */ - inline void set_sub (const Bitboard& new_subChains) - { - _subChains = new_subChains ; - _subChainsStates = this->_chainsStates & _subChains ; - } - - /** \brief Set a bit on in subchains and update _chainsStates accordingly. */ - inline void set_bitOn (int index) - { - _subChains.setOn(index) ; - if (this->_chainsStates.isOn(index)) - _subChainsStates.setOn(index) ; - } - - /** \brief Set a bit off in subchains and update _chainsStates accordingly. */ - inline void set_bitOff (int index) - { - _subChains.setOff(index) ; - _subChainsStates.setOff(index) ; - } - - /** \brief Change subchains to their complement. */ - inline void complement() { _subChains.bit_not() ; } - - /** \brief Operator=. */ - inline SubSparseMatrix& operator=(const SubSparseMatrix &other) - { - (dynamic_cast&>(*this)).operator=(other) ; - _subChains = other._subChains ; - _subChainsStates = other._subChainsStates ; - return *this ; - } - - /** \brief Operator<<. */ - friend std::ostream& operator<<(std::ostream &_stream, const SubSparseMatrix &_matrix) { - _stream << static_cast&>(_matrix) ; - _stream << _matrix._subChains << std::endl ; - return _stream ; - } -}; - -} /* end namespace OSM */ -} /* end namespace CGAL */ - -#endif // CGAL_OSM_SUB_SPARSE_MATRIX_H diff --git a/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h index edf3d4e00b9f..1b252a90f31e 100644 --- a/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h +++ b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h @@ -18,7 +18,7 @@ #include #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.h" -#include "CGAL/HDVF/SubSparseMatrix.hpp" +#include "CGAL/HDVF/Sub_sparse_matrix.h" namespace CGAL { namespace HDVF { @@ -224,13 +224,13 @@ class Sub_chain_complex_mask } /** \brief Get a bit of the mask (bit i in dimension q). */ - inline bool get_Bit(int q, int i) const + inline bool get_bit(int q, int i) const { return _sub.at(q).isOn(i) ; } /** \brief Set a bit to 1 (bit i in dimension q). */ - inline void set_BitOn(int q, int i) + inline void set_bit_on(int q, int i) { if (!_sub.at(q).isOn(i)) { @@ -240,7 +240,7 @@ class Sub_chain_complex_mask } /** \brief Set a bit to 0 (bit i in dimension q). */ - inline void set_BitOff(int q, int i) + inline void set_bit_off(int q, int i) { if (_sub.at(q).isOn(i)) { @@ -253,13 +253,13 @@ class Sub_chain_complex_mask * * Returns a constant reference to the vector of bitboards in each dimension. */ - inline const std::vector& get_BitBoard() const + inline const std::vector& get_bitboard() const { return _sub ; } /** \brief Getter for the bitboard of the sub chain complex in dimension q. */ - inline const OSM::Bitboard& get_BitBoard(int q) const + inline const OSM::Bitboard& get_bitboard(int q) const { return _sub.at(q) ; } @@ -273,7 +273,7 @@ class Sub_chain_complex_mask * \param[in] matrices A vector of Sub_sparse_matrix (in each dimension). */ template - void screen_matrices(std::vector >& matrices) + void screen_matrices(std::vector >& matrices) { for (int q=0; q<=_K.dim(); ++q) { diff --git a/HDVF/include/CGAL/HDVF/Sub_sparse_matrix.h b/HDVF/include/CGAL/HDVF/Sub_sparse_matrix.h new file mode 100644 index 000000000000..3e48057df40c --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Sub_sparse_matrix.h @@ -0,0 +1,197 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac +// Kevin Fedyna + +#ifndef CGAL_OSM_SUB_SPARSE_MATRIX_H +#define CGAL_OSM_SUB_SPARSE_MATRIX_H + + +#include "CGAL/OSM/Sparse_matrix.h" +#include "CGAL/OSM/Bitboard.h" + +namespace CGAL { +namespace OSM { + +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Sub_sparse_matrix` is a technical class implementing the concept `SparseMatrix` together with a system of masks to partially screen matrices (and restrict computations to a subset of indices *along their major direction*). This class is used to compute reduced homology (and thus to compute persistent homology and Alexander duality). + + `Sub_sparse_matrix` inherits `Sparse_matrix` structure and basically adds two bitboards: + - one describing indices of cells belonging to the subset of indices considered (let us denote it by \f$A\f$) + - the second providing indices of non-empty chains in \f$A\f$ + + The class does not modify linear algebra operators, but focuses on adapted iterators, output operators and methods to adjust the "mask". + + \cgalModels{SparseMatrix} + + \tparam CoefficientType a model of the `Ring` concept, providing the ring used to compute homology. + \tparam ChainTypeFlag an integer constant encoding the type of matrices (`OSM::COLUMN` or `OSM::ROW`). +*/ + + +template +class Sub_sparse_matrix : public Sparse_matrix { + +protected: + /** \brief A bitboard describing subchains restriction. */ + Bitboard _subChains; + + /** \brief A bitboard containing state of each chain (restricted to subchains). */ + Bitboard _subChainsStates; + +public: + /** + * \brief Default constructor of a new `Sub_sparse_matrix` (with given rows/columns sizes and mask set to `full`). + * + * Default constructor. Constructor with sizes, initialize an empty Sub_sparse_matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType`, a given size along rows/columns. The constructor sets the mask to `full`. + * + * \param[in] rowCount The number of rows to preallocate (default 0). + * \param[in] columnCount The number of columns to preallocate (default 0). + */ + Sub_sparse_matrix(int rowCount=0, int columnCount=0) : Sparse_matrix(rowCount, columnCount) + { + if (ChainTypeFlag == OSM::COLUMN) + _subChains = OSM::Bitboard(columnCount,false) ; + else + _subChains = OSM::Bitboard(rowCount,false) ; + _subChainsStates = this->_chainsStates & _subChains ; + } + + /** + * \brief Constructor with given rows/columns sizes and a mask. + * + * Create a new empty `Sub_sparse_matrix` of type `ChainTypeFlag` with coefficients of type `CoefficientType`, a given size along rows/columns and a given mask. + * + * \param[in] rowCount The number of rows to preallocate. + * \param[in] columnCount The number of columns to preallocate. + * \param[in] subChain Bitboard describing the subset of indices considered as a mask. + */ + Sub_sparse_matrix(int rowCount, int columnCount, const Bitboard& subChain) : Sparse_matrix(rowCount, columnCount), _subChains(subChain), _subChainsStates(this->_chainsStates & subChain) + { + } + + /** \brief Copy constructor from another `Sub_sparse_matrix`. + * + * Create a new empty `Sub_sparse_matrix` from another of type `ChainTypeFlag` with coefficients of type `CoefficientType`, a given size along rows/columns and a given mask. + * + * \param[in] rowCount The number of rows to preallocate. + * \param[in] columnCount The number of columns to preallocate. + * \param[in] subChain Bitboard describing the subset of indices considered as a mask. + */ + Sub_sparse_matrix(const Sub_sparse_matrix& otherToCopy) : Sparse_matrix(otherToCopy), _subChains(otherToCopy._subChains), _subChainsStates(otherToCopy._subChainsStates) {} + + /** \brief Copy constructor from `Sparse_matrix`. + * + * Create a new `Sub_sparse_matrix` from a `Sparse_matrix` object (with the same `ChainTypeFlag`). Create a "full" mask. + * + * \param[in] otherToCopy The matrix copied. + */ + Sub_sparse_matrix(const Sparse_matrix& otherToCopy) : Sparse_matrix(otherToCopy) + { + if (ChainTypeFlag == OSM::COLUMN) + _subChains = OSM::Bitboard(otherToCopy.dimensions().second,false) ; + else + _subChains = OSM::Bitboard(otherToCopy.dimensions().first,false) ; + _subChainsStates = this->_chainsStates & _subChains ; + } + + + /** \brief Iterator to the beginning of the indices of non empty chains inside the mask. */ + inline Bitboard::iterator begin() const noexcept + { + return _subChainsStates.begin() ; + } + + /** \brief Iterator to the end of the of the indices of non empty chains inside the mask. */ + inline Bitboard::iterator end() const noexcept + { + return _subChainsStates.end() ; + } + + /** \brief Change the indices subset mask. + * + * Set a new mask encoding a new subset of indices along the major dimension. + */ + inline void set_sub (const Bitboard& new_subChains) + { + _subChains = new_subChains ; + _subChainsStates = this->_chainsStates & _subChains ; + } + + /** \brief Add an index to the mask. + * + * Set the bit encoding a given index to 1 (ie. add the index in the mask). + * + * \param[in] index Index to turn on in the mask. + */ + inline void set_bit_on (int index) + { + _subChains.setOn(index) ; + if (this->_chainsStates.isOn(index)) + _subChainsStates.setOn(index) ; + } + + /** \brief Remove an index from the mask. + * + * Set the bit encoding a given index to 0 (ie. remove the index from the mask). + * + * \param[in] index Index to turn off in the mask. + */ + inline void set_bit_off (int index) + { + _subChains.setOff(index) ; + _subChainsStates.setOff(index) ; + } + + /** \brief Change the mask to its complement. */ + inline void complement() { _subChains.bit_not() ; } + + /** + * \brief Assign to other `Sub_sparse_matrix`. + * + * Assign to other matrix coefficient-wise, and copy the bitboard. + * + * \pre The matrices must have the same type. + * + * \param[in] otherToCopy The matrix we want to copy. + * + * \return The reference to the modified matrix. + */ + inline Sub_sparse_matrix& operator=(const Sub_sparse_matrix &otherToCopy) + { + (dynamic_cast&>(*this)).operator=(otherToCopy) ; + _subChains = otherToCopy._subChains ; + _subChainsStates = otherToCopy._subChainsStates ; + return *this ; + } + + /** + * \brief Displays a `Sub_sparse_matrix` in the output stream. + * + * Displays the sparse matrix as well as its mask. + * + * \param[in] stream The output stream. + * \param[in] matrix The matrix to display. + * + * \return A reference to the modified stream. + */ + friend std::ostream& operator<<(std::ostream &stream, const Sub_sparse_matrix &matrix) { + stream << static_cast&>(matrix) ; + stream << matrix._subChains << std::endl ; + return stream ; + } +}; + +} /* end namespace OSM */ +} /* end namespace CGAL */ + +#endif // CGAL_OSM_SUB_SPARSE_MATRIX_H diff --git a/HDVF/include/CGAL/OSM/Sparse_matrix.h b/HDVF/include/CGAL/OSM/Sparse_matrix.h index 0cf006357745..590142bbc54c 100644 --- a/HDVF/include/CGAL/OSM/Sparse_matrix.h +++ b/HDVF/include/CGAL/OSM/Sparse_matrix.h @@ -105,9 +105,9 @@ class Sparse_matrix { public: /** - * \brief Create an empty new SparseMatrix object. + * \brief Default constructor (empty new `Sparse_matrix` object). * - * Default constructor, initialize an empty Matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType`. + * Create an empty Matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType`. * The default matrix size is 0x0. */ Sparse_matrix() { @@ -117,9 +117,9 @@ class Sparse_matrix { } /** - * \brief Create a new SparseMatrix object with given rows/columns sizes. + * \brief Constructor with given rows/columns sizes. * - * Constructor with sizes, initialize an empty Matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType` and a given size along rows/columns. + * Create a new empty Sparse_matrix object of type `ChainTypeFlag` with coefficients of type `CoefficientType` and a given size along rows/columns. * * \param[in] rowCount The number of rows to preallocate. * \param[in] columnCount The number of columns to preallocate. @@ -138,9 +138,9 @@ class Sparse_matrix { } /** - * \brief Create a new SparseMatrix from another SparseMatrix object (with possibly a different `ChainTypeFlag`). + * \brief Copy constructor. * - * Copy constructor, initialize a SparseMatrix of same sizes, containing the same coefficients (but not necessarly of the same `ChainTypeFlag`). + * Create a new SparseMatrix from another SparseMatrix object (with possibly a different `ChainTypeFlag`). Initialize a SparseMatrix of same sizes, containing the same coefficients (but not necessarly of the same `ChainTypeFlag`). * If types are different, the constructor performs conversion. * * \param[in] otherToCopy The matrix copied. @@ -195,7 +195,7 @@ class Sparse_matrix { * * \pre The matrices must have the same type. * - * \param[in] _otherToCopy The matrix we want to copy. + * \param[in] otherToCopy The matrix we want to copy. * * \return The reference to the modified matrix. */ From d8e7b0b0e0f75e77482eecbc073b47770ef5da02 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Thu, 29 May 2025 04:15:47 +0200 Subject: [PATCH 022/343] Hdvf_duality -> documentation and rework of the class done !!!!! Why is it necessary to set get_flag as virtual in Hdvf_core ? While I don't see any dynamic types... --- HDVF/doc/HDVF/fig/duality_example.png | Bin 0 -> 2130468 bytes HDVF/doc/HDVF/fig/duality_example_twirl.png | Bin 0 -> 392778 bytes HDVF/doc/HDVF/fig/duality_example_twirl2.png | Bin 0 -> 108614 bytes HDVF/examples/HDVF/main_dual_hdvf.cpp | 6 +- HDVF/include/CGAL/HDVF/Hdvf_core.h | 14 +- HDVF/include/CGAL/HDVF/Hdvf_duality.h | 431 ++++++++++++++----- 6 files changed, 325 insertions(+), 126 deletions(-) create mode 100644 HDVF/doc/HDVF/fig/duality_example.png create mode 100644 HDVF/doc/HDVF/fig/duality_example_twirl.png create mode 100644 HDVF/doc/HDVF/fig/duality_example_twirl2.png diff --git a/HDVF/doc/HDVF/fig/duality_example.png b/HDVF/doc/HDVF/fig/duality_example.png new file mode 100644 index 0000000000000000000000000000000000000000..6be4d8f49f8e574abb05e016a619709f4cea126e GIT binary patch literal 2130468 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

    8j=eqCS1Cd|6nvLs}9bfMd0cPmBBejo@ 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 Zd8ZRZ2sj9Xpk=veJav!>PKaZBP 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�u}PJEko@!amt8ZO_qWyd18cHD%W*aoSjG-o>}uZxpl~?zworEh5@E5mG@F$tcMgZJ*U{_MmAffmkd}8Oe7qM02|^f>9r|B5YNB zEG&JW;U~>O-*`L6LvQY&%eIU;YdNFCTsCaJeoHCAN!q&gc#5y*Bn@C$s-?TI$)G^#N}4`adS9|3kbVfF1_GlZCPKvCUR9 z1a=S;FVYr(!N>x!7||tMj##z4P5c9J)1E%X>EzdT!LockcPL9Iu*JG5T#; z6sCx~so0P=Uez*;7+x=@@5I7mm6>cyF#BlgWT;e5(!sydA~QxWzmr5UL5I(X5v@`X zdk}dHEH_1~EV9*qCL9h=aHH?W2C)^tJg4~Quu*n%QHU{OJ1@DA>h-XJ@cxv^C!{^0 zwd-v5{%E_x0&Sj|Mld_yAnlYC;*zZVl>I#Ie0GQ1uHat;sRPAfVIsJVX&rl!hRDMF`8L z)r&O06L%VR6l*3Bif3p3#1k#>hVQPMue=GZC73Lloj~WHiXzPkCq7ER{CK`AgC_LY z(eV2^$nbMssDO{!Ap8zbw^$mYolJbIl0Fn03N!!_5fj5noPd?3QRdwAD*C`+3?wsW z;|NEf(7@pE0v%7@7E7J%q^e8tdBg`GNQK5coU{}wh>Tm2a2lDogQDk#(LK^GJlztu zjH95mR7#yxN7-Q_E$X|!)GZ6|-e-NFZMrI^+x;#e*tR=gO3-aCkPsSG{GQ9ox^iM+ zUC-O6lrrG!eou6Vj$^-yE$h!pR<|VcG$@Cu1~GZ$gHK~|dQau|r{Bi{GQ~k|=|iby zbfnsU9o&BBxPX7uKzi>BsbDaJez`SPl@bV`xoQ)6ZSb(K9kK!W6_Jwpj~cpnuAuqY z35o?_>RZ1Sfj4T#vUm$GZHf^jz_bh+t|nmP3gU@}0zFp@Hm&b{U#TYWxL?hltVYUn zU4u`~ zoEEu{DP5bxu44Pn4tgdFBto9K#&)H0(8kCTKK0cWyt@FRAUYcs zbIGTuJ5H1xCU~u%<~O$^xTCe*&m|_sYTBNh-*i+w!+M{?ddVFf9oxtt+bO{}AWtZm zl2ohzkf;k%V+Ekpx&MXJ?8&^*kR|@`2}L#{x6>X6tU` zM}^R?zGxApj)R2Zci6qAvh93+f1A!R0fE|%-;0o0ha!IkDGA+lymtbd*kL^$Wr6G38_&3HxQZY2oM*<`T!TpHnXMgOC#yp!Ij ztbqzR2?FrlQ~4jnNG%0OTUq3P%KGj`zmU=p49r$MvcRqvo>Zm%OTJ=?R>wwntiCbB z?owxCJf)N`q@owv2uiCL0>bENP36Ne@UW23v;2A}P^Hu zTSaLt5hh(M{5|XB`^XX4d(^2_D(}-xN{nrh9NO*w86+>sVALw`L7bUGLTT9ckbKC> z$VB~zavj2J{3%?!x(?M|j7EDSCWY}~-ukSqRbQsId@agPp5nMQrLnt2V=@MJi-m)) z#YxaDR_y0waP&8lX+C$qDv`YoLYY!XtXg7f@}l7Duq4<0W&62rX0q1fg69Ex5nWWY z2@9`+7$+quD8P5p*r!WfSH)fP*ONJ7`B#IN&q3Rk~BdOQ{rXaHz3kQ%BaxGLx&<<5bHKYDdn$%+{OaNCdxWEFxaclN?` zg!VnQ)nV}6<;%|J0u`CSg=$tqSoXi{9`soO1pMxGWOBKE-!qQoY7qhlP05S{Hh^9c zDC!Pa@J9>ox}n2x^GLzYH>#sDap8F^e)fO$7IMWHK-DDkQ(Vb^_wjKn78Pd&P8X;A zv5X(p2Hy{bjAU=R#|vNoT=jT$5D-Onl+J>^A($MTtt}&(m2RfBl!^QkUrjhFpKnJ% z!{==Z`>1GCK#Of`Hwj>ZlUeAp5v_?SRlD(QelsGYcdFG|Z+MD17_qHBZHm@F;+jXD#Ozms!XJkar!!l1+ z0bWdim5YC4*>Y|c#yR9@eB8#r9Ze1}0@A=4&6+aCzn#s+OY_JX!%I&gKt8Yr1jds? z-2Y&Mixo}no&i>$n|X0&pyNrHh(x#G$Xf61J^YgFAvZtg8YSm5_$&x98fH>R>nl%W zK!Cd?6o;1S5nhNg_9qk*SM=xr05rW{b|+M!P_AIMH@=C;Dq5&kI@&+gNH`!tD3;l zR7YQyXc$W0yoaRVK!l$A^V7Aq;%Q4O(QByRZP+j{XM!+B1(es$AkG=Yc+Ea&M$p6Wu0EZg5MjeM0?+F1{^(TL^HBw=opM&NxBH zhrE(>_PKQ}=S5BDW^4DA4LBoa zCGvul2V4bIR9OUc{-LhQi;|tAW4Q}1p`x+ID40- zSevpxD`+ULjuz&@QKwxpgfkjC3)ZHuueGYZ^>(8ZeFy`M{jR`^X-G3nWN-y z1~LD4+OZ||7(OmrV+s`>CK_hhqt7Uqqa3?M)h@pAuQKIFLKCQqqM6v2;ks%|&;yMx zDdZMrll3Iazb>P@QNA9h(Au|HNaf!(6(mG=w3ZF3dajD;|G-KrVF15*Wce;LK0mxK zrgu2;{SxW&LudwcsXj4NE+S@nn24T+rroKm#)e^rs z(R3Xw`wJvSX#xjtC?kkR?f%`)VKNnE){Mmn3$sH$lOP*q;D6QU(#ANahp_CqI;+`! z9JvI3R@yV_Eq(#RXN-K0$2Af5sX~q6bvJh0zYFO_g?`TEd+*-bK@AI7VN5|9o$=Iz ze0kYd4ou0MH(#padTWcTW8P3sMnciD9nK*BVFh@OOS(5g2EK{r#VMmDjCIg&EmUpX$M~8l=Nz$bt*G zjm@wf;l~e{S>5AJG7wtG(5MVsw)y)>>aa*qq{^Xv!-HXiGD#eS;8KNcC-}t81jwKi zz*_vHDojL;a<~*Qa5{SJ%$va(TW4tcv9w|8g%rt(KFkgSX33`Abo>E4aE=BKn3*Bg z4N=nJKj;144u8$hF3k?{dJPBJdf%qo<-E`1;-+S%#ZszK_v*){OdA2^+yiYw0~wzo zh1@~V?i;C_MtnvHCjAgXbf%XZiZ6fh(O1wmx`9VAdIdPx#CW^AX^A}0jIm?rfy~ON zV|NjLYcY}6vGHHC%n=Jjc$HHjOB(cGeQ2Zb_R$6QbozA)krg?HRHd*%QgSRw&pkj; z1zNGN-~G4pLD*46j8d+#i2c z?to>|=5Umhtyt?{J+)p$q;kz zxL*f+x;s`P#~%dYwP5AR#RdSIu7;!`P5RDUYTj}%7%wm{_6{!?I)5VfAWV;X6;Wt^`S1u?;^UJOJ*J%@x4IsuPkv@hhlGkIsWDIk(e(vKFWA}=H?Q5xFKw>&J^;PmDuvFL+*BhJWq zgM2;Z`b~kHz5FOGni9}=*1Y)#v$zKZh|Uk>HB9Dzw2-%sA_TgK&YuBa-!Hum zcvDfSfz;K531~me#6y1m61&GljIiDUjMRFI52?UJttTFzNi~=$fQ-~=72&f-P6f5C zYStVV)CvQLv+C?p1+@{wwhb(T{M~&|SAz z_Jk?JjtRzZ%cCc;I?QT%=E-4Rv66)1ha1o2P6wD9s=Q89`2*lyJ3={CRWOO_H_VSypozlxnKoYEaErpr( zMw$JC$8ekeLZbS?JjnlQaXUn~L|9BVl<<8ai03Mh!vf_oMn>|n?@T!+g8Vm9UGP1g zOZiW)fPO%~l(G2kh!<8o#o#3DQd=otY=F((?d5>dOY)5jt!Y*7dfn4zg9asAoj}%A z;9PbKMgyh@a}x!`9w-hHx-(Eo0t;op4X;i$>&?fM8LtpL-Q^4wkNJNr1Ak%Lwi%qu zeIFi-YQ?CQFI%Gu3|x&ITa*#n$5MeVF#`-L&&U)mSm}chsf{&}p^r4G*qz~EITwY) zrj;q>8-!(`T8Ia}lqM=5EP|5}?hjm`Zt0Le2yPQFfUW=}l>)7~jo$_5v>GY0jU+oI z1{6ZiG-WAmp2)#pMSBtAV+EbY<{UZD3NE0roJO6eon%FMo92mz0#cHWo!)-NdSNpi zx*O>ps<}keY~v|F?n&V}kT@}Mz*=;Gyn*UB51{@pPtE^R=D8fr|M<7o+u-lT`ORSY^~E0lY@8teI}JTE!HrU}050m0 zN%@61>AbS?h}Xod;z^&IJhBAc#+==)SST|MUJ)zgY<)?P+-ttB;KZkRd`g_wugJg= z)>{skO`rpsKTDPRFA##|lVZKpPMb#%7kAgX`&LJ@@73*U-{B zSmZoE;yC`qU-c&Z&Lr}PZ9sJ(h#D`A7b3^>bBU0#h- zA8JO>y(8Z#5+5CkB;VWXD4z(D8)#0oR%z8E>MKyu;VzrsLo1wTPVWTs6W|mRQjzLo z@GMRkbB0rbzzDF$`5^>>LW&aZd$VUFAz5jOuv9Ii`QwKWbe+iF+5CgsIW6j^ zI`dup`$u@rn??8s2f(vkj8in20K6`ArCz};P2dk*e|&ujUPc_{G?=oh(suL^M_r}2f7v|m*KaL+ zFUQCHd6N;_u9ma1D^xG+>9`s2&YSfQcaNf1_eKprbXg=y5VS7k)Gxt7JMFqtWliGl zi|3;Z(5j1wjR>Q$9;avfraM{B6H}bgvvxreq#eA|1j{@GYDG!GlQI~xR5#b7pwF9OfUxz zZ^Q|H!ZJ44vY--+@1EUAmbwu}%>9f-X9g&gk^5mH*;a-E&uWzk)2rs!Weulgm7B58 z>lu+=S#Ql{19t zNJHG4@6+{f+FBzxKYuaKqb2mb-p^C2CH~Kl*eH)!ht%w{)l-fj?+Kv#d%EuRjf9C+ z*YRs+2fPP&Mp>*L*f=tZN5%%bA^%_9TJ~qM@C5>Hw@ed*l|4ku7D{XMcTAX^M^q5V z>_cnMEmy+Djx-w@4EKs@tO@v#zZg^uG)0foD~2!%qfx}p2i}HD7UDOXG+BYoAViF8 z{7xSLYy|S(rn{m(Z$XkWQ+m)qtyiK00vp`y-xKhzQJlV*K-NPesLRFy?{=vChJ z>^j54h&(|$Y0?2`8NBpVHRFGwcX~fYK92P!T+15%9|gNPppWlsk?$`z-8%w1;059S zpa+Y3c2Dic9L+FyfI3-9ueH&DB3P+f{_e7g+OMk6RF%!4~T3 zCHumVFYu3(7u>eGorXurm4&RHobkq%?(cH)IGn*f_t9N9?Q^kxQ^^M4M+aq{I$hs9 zyFA`dn;CRyM4NBjLrh&1_59ev;VEhT)X1nx)~bza^p0PTL&r+)IlUk;HK^K(Ia=X2Ci)M7VO8CgYX4e#uAk&)sA)W*nV_v;*ciE${&~K8v8y){t3Aj_{v|0u4{rq$<%d&i;&&hL$KL z6`UFGZf&q0mt=s^V`L^_sX9dc^d2H1e~+-GAq6E#^_6Hd?FpF;ud6 z+R=U<@zMng0~Z?=k5iI0cCX=gEaPi0ZRTdXb{;kbb=4;Xm=#7nd>k%n%|8URSoCAf zs3==JnF~|gdi69oa_EC+Z_`gVrmtu0(0gLd5=E$sk1b1^+J`V?x43UTERUIWR&0 zA*x`Jz7bK;pu00BUc8OI*Hyz2ULfqQDZgDikKn8NzC-}XXnu1wE49j( z^YiuA))UShH{!$evajf_sFbLPRU*AfNoA@Ju{H?U0+QwYX49pY0jua`%MM%o>O z0^5VgxiwAzT&R;C^And%WPM=Do6jn{7dT^=TOZE!2RMk$>3vh*Z^oOa=E5$X+QLkW zZ98&oZ>uaV_*6yaNMtNnVa8gyEl$<7?mfW0soHj4l(Ft6xtX$?fdv8s4DuJ~BhW{n zhrj@V0Rjt9!VeG%v!%h|<8_iic`FsLf&(0N%}Z|O7Z1@FOvh3L;I&230^L!p3{vIp zqOZL~9#zHvo{!tcXRA2rzpEMJmJ+_cZ08yV5&uKP%Fmi_;NQS(yo*+ZmS|=mC3S=~ zLD3c_DHPvE>?uA{u+om^N`W*>O-~?T`s+h1jK5&4K-q1j6+dHNee`EckhMl29u*Pc zWrH4KN~nxWwYHTl$7coh7KRCbE+4k6qzwL#dg69LilbuiXjrP_=)L2pshMS~uG4gm z<+C!osiUjdQq*&DHV97gd+yJ}m%G6WOc1Gb=L>~ zkWhw8NIUdkU|z`y@}OB+eh%pBI@q2}17Dh}5G~Xus@Tu(4ALif-O#0}#6pk@Z;h`? zFcj1^!)c$JHjW`8*$?1J-lU`aE3P(lk%<`;?|Tsfg7f^`r<|ml4Z)UPxJzKP$8ADx zrk~E>{&%m^p3vJ^Ig8%}et9vaq#6qjLt)|EE99yHFU(o}QJ{ zGD^!yLdx>M*#)k&AbWq_hGO37}$Co)gYM z1-yh8b!CtVBBu;~?_P1T_>Q1M08MK6o;D14#My@I*2nVN3OFCf`&4dq{qfvthx@g1 z)oNtL14*3`06R59x=;G}cW!)0?q^BsB#7RV)Prb=29Xk}Qw>a?OuR_5a(F{pq7;Kf zjQq7O8ldPJ`F3e*Yq7GUqca|ehhGQvNrDQfQ?rfo((^Ete@Vms-JrbyUWnrp-0tmG z8lPlZ6IzHNf-Se@O5DYgHI38NSPO0&t|O6T)z9$v&HkGqzq{`M98m`36mod&+d9^$ zX@a!TJ-n#1dH*76g9GjPUtR#ynJ!3R9jRlwU_~NSNw&A%ExNvMs0X`EbLD+X_>sez z`UvbIh<$om$iH<0FsQFQrf<9Z-_x$!E7ETU;BFXS1iRBnt(|D1$pwdl!C3evZ?wpj zDo7C8iDMSbzy=abr0oo{-DYX7FIcpMP};|y7+&wKA@g;bwSG=@sgI%eL6OO@nD{C^ zK%@c(_<&87sHiBtSG`KR_DCeFI+h#~5#jFrAN{g}FZQrn?g{w1tC;E${ZlM#d?i}g zrCleX3V)3?6`EQT7RQIZh%fkCXTf+ zvRdk|BAeZqRPnmlExvlcyv~bI%Q^e=t7A}EP^Q_QRm;(7Cb_9N)V(cF?>ctn5OnIv zJHjr5`v}l#1aX4h)i-CjG$?RJ!m0SZV7Xi~BdX5A@qcF|s21#)S1>rKpY*E1xSEAF zX+enn?qJ!(KoPm^E|8Bfvk^?>10;ySo0d2m+>1tBEe3+JiRiltnI?JS)|kWPe>`ftEh0zI3+__!pI=6vUUqF5J%_HtKtNfIlU+VH+uhrn%3sX} z2-ZRVus0$I@C1hH2#)O+C^Lji3O+gN9^u4W>>91~xl`U3Tz2U`j|uReS0i;&q&z&Z z#rwfz-L$IpuU+dc{2Y+`;IvKlAVf66DQJ%uw^c!^G{Z_W4muD+@md1_!g^x@v|Vsf zXaHvvHtp<|s?;w8`Hs^XiZ+7_KbG4rt zDppgqHmskzW6Sm#LEExK*22d_k8>bG1OQ77wQV7mf^H1TWmmbYz0JR!M@w731tpPU zHc?LX97DXN!K#4RUw!rL2Niqw*lxhT(2~FnIQR^*Ls^j3EH9?eHgYWaY!-&zGlphO z?dO4%e{4 z{xMn*<$~5GKp@AHKnET)4K|}ZI;<;cg+%S(pvaFTnr;9Fyx=93;Y+8x z?=J90O0?XTv6`Tku)#$$RSRS&5#n!kI!h*bV@2_F^Z}M^KJ4*POOKDymIDrg(lu0) zf?oY{{f%ukpyYOQjfe5*n(&Ej3UK4SflwyiVDasH)R{J7uJ}yEZxU;;-?6gF1_ztvV;DzzrqHb zW2XYWvO+fj*I_NQqy*W21m`4+xyTVwUHgmAt4F~5oSOB&UhcwaADJutzO3wTKB9CHJLUOuT_KWMPY{+#Z`76Q zRtCom}^|0gsU$?Eo$Z*(EgaWu4j3UkKU9J)QWTy!ET%dwQ&$d4s z5sj79g+0E}uUq)0;?TYtT9`rMkp<50QX}|ELgo5u@Dhc>4c?<|mMVxzvQ#%eH z-QI?le(}nZ<74GYyt4j$UUvHMmd9hYt*@Y;uel_1`S-(Ft3_#(|LbG_&&S(+VSeFF ztJ>}s=<@FfNKg9LD&8&{#jNkyE$#H zpTe_KdqF4cF&!>NYr(14pQrDOEj;UzNbWvC&jCLYhQ$;y-kM7B%?R%_+~`=dI*olX z{rm2h#&R3q5%mn0V=>+Lx6+5ChkXhJ4w*QiGpve>@j7(89-)9l!m|N7cOYElDMUWc z8kSPiuDkevqsMn$2b=A_izAu5za}ZXf=DmF zyuQo=r?fbte^NL3j`J|~eV?rl25<(<`y&M$P(0cThu{;&UYZ25U@iFp@E4&NEhRuc z{`)`vEZM}d+y|%%5V|#I!88}1%73!I4%%U{Aul%b7Q_1vxUsOoW7RuA-dQR`Xtf+R|_5iFup0V;En71 zFYIm)ic|;SXGDT>KZj)6$Z74M2ATZ&wr~^m*4At@83^uUz3X~PYXTuO93xsyJ0Wfbtjv8 z+*S=+?5-*QLO*u8y8*x^c0EZ&#Og%Asf_V#jI#U z#xl>?ytlI?8XTe+;xj1$&>qafDBW(Yt7hh-ui7d$H0TV0Mk@7t<=_LnN8X-iGZRLC z)}>loi02WNtB)$l(3HXm5*K@d?HFhkj)p!b#Tu9oFneCDBhD+yE13VO66+LJG}xwA zgv!vKg&Iutzv@yV3(1}v22|DVq7n`UDdWx6O|bLw7Tth&0%Fe&(ioBE<-Ugj^_AK22}$%0 zD>Zu9&T1V8h72btQKTde2MC?EQMy2fN-5Bo_&6Ho<#jgP2aS#m@9xu}cbk_RgR&l^ zY~XyWDa(o3Lt}ViTz$47TlhqL-3tk}c|UjDRADDD=Kj=%waSzP_8%1rmE~BxB&Q8L zNSrxRV$_Oi4N^;Uh~Y7Z0=}Db@)0ed5saHDN9t2Bb$Qu^_(IonV!B{mSM%UGkr(#p z4z-pWawF~T=Zn9~h9rsAOR%>YnsI;c!ad(YV=ivm-&P|Yyxn!(d7RUi%4h--T*ahk zq_F5t#EXSe2(FZz$wpx$w({{SK5lkOe~0uXkCQIRr$^_rYY`3QV#lhp{5s}uafp9+ z?_-<|3^}T8?)p*5nXQG|bF{U1IJv%;45vN(1Yx@DaCxP$$k5aAoOMchSU5P!OiWBr zvTQ}tJS!Z|hDU^iXf)zmIRC6WXYXQ0C3EG^MYODu1_PAzFk1Y6gFjyfetzbEeLdz3 z3#TFkc2Pw85IW@cW*B6cAi6dY!wW{N>VX`s5MC8{bM*v{OCq97TZ`xN%t+mDBH5Gt z5u<$z!QR!%nPz#FklO?jkGS*WsUQqkvj?eBZx3?vGgM)KI3|Wu2FloWjhX)>5=If^ zWXY+Tvg!@+C^|Q444=NT6QgYAm5b)*pI2b9b($3nK7H9WcP8dio_J0CEmCWa8=krI zK~^e!k?FbVvEy}o7_V?oA2vaLd(ElkeGG~6J$v-?JdGIb(Z(FpYcY92^I9(HZ+^M# zJ*Y^yBi?C0%!;zp?XUQyG|d;*8Mwk}6p|%KKa&*UU9ZfAU|uk3Q&7e+Y86&#N6c()Pn; z0+T@piTxo7fNX9d7%QkQ5~rECc0aXMS+E288vIqh&(}iuZiVR?U8qzJ;{rtuI7}Ew zrGhi02o$1@Gz-Od&U>ln>);r%R68Nwz*b`n?2^3@b3+4JkM1D3DokCzjZgrvbSSPZ!N@>}q9gYd z)8+il-ltzyo~_jWE;*&P>gLGNXWgPyq2%McKM4LBANLp9vQvBM_|ETPU8aSJPbKyD zgeh=Kd~7=^t6lQaV@cDaBPj97j)f=+c>`ku!a(H+-pp^X?1T0`v>Ir%PWxK}Fvo1G z)3aFq9Uzt)Z|vteG*HIF$X9BraD84w+g#Eq)lLB)eJ3KwhQ5#l0rw-P`0E*z>V>XL&YE*Fz(EO&a9eznd^J3&ihERS|5m=s&|4GC)hASpBw{$VXSNcZ z@^p0A3+BEnj5VZU^pyt~il zFxg$5Qyn=x48TpLEC7ihwPOZLB<9dPQ+_1jKXb)mmSaaj83XoZzid~}@cno%gX&-d z;}SbcOMJ)bBJo|!a)XfgJ%c`}C{w5)ap^%BQGbuZCAhm0sRS!|P~F;;6&!UN>3~uT z?hb%(t{BI^BksJ#GUnV+@PRVN-3Xmves$E0@-vE}HkyLpjrL`rT2SJ`n%hkEZEV38yKEH$heYS-#wi&dA9b zY0gIJ>auxkBAck-$8+= z?P{&89i`$#UFOBBM0S&no8?vg`P*r``4ZE_jw3yW!2Z0uEoSuprc(A|2b50LOB}0;oWLRgb^Or_SBx(Y zwm3ITsU5Epx*F>b=4JQXc+pkcX}wWX?(PV>c1lwW2Eus+6$Xe{`iGRhO>B|+@4Y9S zAf5`N{3z;@8@#;?aAO4sA~!N8nlP+=6>`$TTIoVwy)ZypQvF**BMcU? z9Q=(~+!=8qJ4j%6ZmCJr-<+w*){XfuoLhJCwQJ>GI` zb24A2>%EchBkH~OcLd-7iZU!*Hg{2@97cjzzU_rQLk{{A3AAR3f#*Qr$JHoy9NUeg z1HKmDf+@Z=w^0}OdNiz#vRS9>R09_zrSSIPV!}oUPt5S?H~4@eTU1ydjwv=#fWw*W z#MEg*mbpNU#ouEqm{MaH@WT!938^aQc2ZA;eJ^mE^07Rp#u3ISpbNFX!yaGCUX z!eQ1Xa}BGiwr|x8x{jY~q-NrAHpB|=&2~NrvD?kU3y0Vq_fXlVq&$$-*!eKIH6)Mt z6FV-RWsifs!SuVjp8wZKAG9ggGv?e{=&9GrWi z{Qsm~{}(*-I!yjHnNH+(HAJk=z+R%F&g~?xJu7Q-K=|QA5~Ve7Y^q zHkw2svE2i9zZ7TQ@RUI~5zK9=<>UQ5F(3fY>*acD{#>OpIn#;yG|}ADEPsxho`#Pk zvw?;hP_6tMPz`B;5q-AN>X>AwSa8s{`ij?c6uw2{0lL_<+`2ikcszeP6YnX1&>t5s zM)nES0@s>}kEGo)JEGW=f1udRXeG{cEU1w-XOiW@$Q!Mwe=UT&Rh!<%l{5oIKgYi_ zPl|99pmiSa)@j!+LD`uV?#E#$)Zc%+{);{ha=jmr!u|R>_R6pQ{Jip}=j}L?+^+MA z_2>Pf_Qo3NVk%?Q2{{K4aJQ7UV|O3eV|KDoiWQOLnNMugP<-BmTZ68vu$`E@AC(WM z@X~L~E-|#D1>wChqTYdJjxUd!{o`R{QwNW0U%+m-<8?-#$!#zBmJ@rj>f+2Zp@KF= zOF+s@Oe{(X94>nvb)=naqSea_-gevLJwX#76-J)0Kp1mzX^SOuI+(;J*5UNcT?xo? z;Q*r+7Ap|Pp2WWwaEkIS1W#fTqJ!@;b!Y)DG z?)$99qtW&J;wa>>8TjKwBn)z<$WkuTr{d)rZUSuSzVorY!890QZGJK;(t1uLtu=q{ zsEEM{B=_lc3~Ol$e%jW3f|l4U_L|SKzrk;=`>7X}HH?^Xq+&bg$w_*rl&M#Womoq9 zEmaX=C*P)*31^kQkF)Tfm9)d&xiA6k^P<&$gB^bLf#ym!Jr10_ttnDlHrD1%zlLtVbGY-mo|ir8?AR=}7#O zQGd=%&}TpVw@b47l}Ju`RyflCzO(&H1tVs{IoEK3hjq=bfQ=rb#oz$$Mh~CyqY>f5E|4GZy{s?@SM_{@rkI(VXLj9;rMVe7 z#Aibbou6qkM6tgG@nEe9w)on4x4E|d^DV>l+mr7rh0cB0xRh}z80!Ep8#~DEgyIN0($LLm3+n_= zwUMIvk)zq`@}1ZelHLE{kIsKS*8kGYs7CdyZ@a#x6M9(#1gFC2i>Ax6@m34Ea|{|> zVjv*ZW(eS2BB)bX&QDF@ZVR~JIGJ7tTk)=MiM<5GGrEZR|Lxywu@&g}JBif@1#-1m zu0poCxrr81h?W7|gA&C*3$euKtHL3k@8#> zrj7^C$ib%8`t82WRm>v>b;&O#^g0(h**@h`00s(>1=~o7=zyOma6+Es>Gko+S%dGPU*>aJX8R`vc^mKb_{SGqdNnX_Hn}@2;!|)1P1|w83%5c3 zu=w|hr%}w!q9*t;*o}B-4>h*S$oj6oU5%%HdUd%EzIR*@i4pxET1K+OuC-w7CgIXA zp5F-7S>Zrr=w*&>IAq4?#82(zj+dW>6GUAVN^jjaJA&u-z%;OFdl787?F`&XPj@F~ zab1cgl=QSf;#ZAsFIX-%G^-}-Q-BxsubY}rkElbwZi|of9lv@ZI4K$#t~4)FPGZF$ zdf4^FRQA_tGhX-YQ2O8GV-}Sk{S!DKJ0Vl=KNmn5e;_t&`eA`%uXTW|2Y*e75xd#$ zjZsJ!Bp-FU{hhIDRD#Y57F7;xwu(`~ZS)*=Vrnr%AW@02M{kC6wZfa8S~WWufoK|d zL|&R?rt_g`@92vPg)tUqET$I%@Fy!mFvG*^@^{iuV_P?ClR{0Z{TVLb>fH2pkHI>u zic=C6CVXAXy>f1O(5`SkH`}c^EJ)kO5xGwnch})$;B;6&yqZzJw=~N?&E?D=VC&Dz zmwJM-_&b}Q&R$bPCx^|6qqDmYehN0K<9_a;cc<`WOg0Ny#q>=k|G$d0f3;3G$U?d~l-`2)jerfREU zq1?uAvOfJ7i`fCYviW+r?e|mR{rMtWD$06r?ppke1chjA)*kbk{RDrp<0OBXwEAx> z6z0&91RAQxqCuWcVqD7o8d(C3;cTRzR7i03z{g831>x0Z%dsosQqyf%pnh%?IWkS4 zuaynF>naF4yt}n5zGOdY_Q2+cy1E>)8W$-g^CP^=S9htKXzi5*KP2^JNU3%n?_nS5;B_-qCctl1f_akvEwsTJ@yz zUBVs--C(8m@qj|B!#bm&C~k+L-Hdgy1=GR2qk*NH0nP16nK*W+utllG!Q?m{d7!8B zP~7z6OQJH>aW!iI>qoj!^F%vPhOxbcnT#Mwy6+G2n}EIE)352{1L|yM;O$5(8WVaF z@<-$+4KfxP8a-KR=A%(5gOOSAToi1?!v$~Utj^#bS(jE96TzGqw^P+Ij-k%ny$o4r zwExgh^|11Vk;<<$NeFo5SDOL4=b4{yzIhxck7+JP$ z)hz0ez9S_nNcXUuU`c6J>h$ z*HZdgj03S*)haDox96GJZceI>T;)JIuPjyx!<=Fp3zFy>ZxmE`o3a?rB!DiGI`EcaUM^znY~7atQl{Sa2xBdb29M>QrVs|-PP;2R6o1jJ1i zO8?B;E6?{m&o>YL*G(|IIMKZk0_z~cjB>g{gUjj_lj%{*30?{R);+2Ue>` zD>_H_V&e1@1DnABO-GV&H{3K^LQK?$hW|jGQBt|yR33@Vyce7r-t=I&Um!XcGCbYQ z<~%WHI6P=tjv@hke{j%Z=Bp|#Pr068&s9a$PbGkTkfLDW#i6{acI|DzTmESIZJ@&?sB#k_#UpZ?X><`BP;H*6rafW zIeu3|SBEfxTQy~|(zVMPGIzdiUm5w8ksZ!!G8E8+vpRZXa`_Uqs@r7stUm8ljm}K9 zUF5s$3#cq%kj9Fj&pFmKbTVGS;VLYna&eFGj=NsN8IFs#KOPh_h#K>!^5TM;?bs7# z`i~>Eya`-62rl@!H6fARq5;et(`4ovC9^OG*+_{`<6pq6WkB0yv?_h@`WOHRp>1Yb}$(a~gtdzu{?jt+o_g ztNH{b)^0eLEOf&y8q(sOo1(9Or-wcRNsqMvvaAp$r4QGFZ>=*Yjt?qXyUiDFfud_> zcznNavp}QNO)-l6`#9QT@AISX`+kqeIPM~a0+tm=hM=JtK*Z|UsRX&>m#ME@>K&AI zx!GCU=jqtz`Z^d`x3f(!mZxrw2~Qs*SoP&c94$z2O#&s2NoT#I;f_&tAsvw3(m*kG zC?!0|VLr$P<0K!xsoM0r9epM=7APSAZvydGk1`_I)?bQZFN77v765}v#W$5vM6WQ# zz~!f{7B7Fh?mU?rzfv!uZuucDd`pp!HkB8WJZDCKK3QW=Z{VtOhtChvyv!wcaX!vQ zd+&wTA`^Sc?N~e8StT^v^Fiog=b1CI+do{8<2&UZQ|KT$j4Z4~LJ3e-2$jKRLKUi& z$!^GNFPbwYf{S40l}4bC?dP@mW{iqc2pDHI2%!zX%;QxP?&n<-nwRCNAgCp3w~UX> z1bRbgRr*lJzm86E6(qxt*~}<7%nsuq?I{ynj|0cyla1+dlggauN-$iw67M$4ul8K4k`{e-^y{gmbqiWSc57a*G zzm?$sUUQ{E?07z}nk@nZJ@5oIUI1bMbk-93C{z@tmV5;jYK!MpH*aT8O~8UPU|%~F zsY-jlxPJ_LZjE03HCT9C0H1z`KD^@V%!&vO>=2d!QkSg5PKyaAxhivWP65Ol4Sb%$ z)`O`aRr6s##s%OThz2O$40H2URSzV7Z=c8(5}#jEp_o(XIOY!nCI(NVpWtDQLqqb; zg$Ur6_;49bkG{%<#XmkD#D-FVoGc%e1M-4n!{LdEDe;bi!oEP$`W}1TdCXyD+9F=I zaOi%H{nTtnf^H+|tpE@ikV#Rb$XsN&Ho4n%70;KBYb}S_#Q5!xBNmP44SV?X{+=i` z5E1=}Wf>$u?5wu@<&GmJ@ZX7X!HeM7Clk@^RCA5=?1k-vYCyx(?}+$#m@CiY>}0sK z9@ZRA}r3Xg7DuyC;Atr#zVjyN18L-Mi~qT(d=Zo)I3I}YrANQ(g9trD`88Ay0H*DBXvLg{*6Flw ztix$%yYvFc=t<`W8e9Q-1Ow!{c0gG|CPAEt50h#2m%)}sbCx8L&^y_kwwu5KA3 z7qd94izdiDvFG-Se4Q-dp}|AC)^UBs%&K=?UPKtaR9I7~QhbsJfwQS}GvzyV%kgm2 zsCqA8k$}ziyCBWGXWM>$tNn|kj!pxOwOO4_M2&fS45=$38WZof3mf0_WW#>i(|Lx& zo=;VR+s(u70k>XZe$dx4UU~ZHs&fBnKqRsisP%jFU{8p$}-^l<1_sOfJf7`%W@-wk+84CfJQJrYws?D@ilnvN4nsXkI{oD z#6m2n$Gl_s>r>f4d=~x|lAVwLJqhoF`{SIU5U10$llI&YK{S{LHNk%P-Z%d=%ewb?P?VYPWx!MHo3fAyMj&)gU z|Eyg)x-mY+8c18f!?Bk9I98|K^I0q*vO~fB_qm=p+@r0|#oFkkf|l)mg2DWx9NW6< z_B{9)t;`yT&rNH(Eo(Is+c|>E;h{_5(a;MwLUe6~f^8K>qfsMu1aT!Ii zbhftEC~3oL+uEoD6NGc2fAG!2&rH>A(x$A z-e3nDg3zb8$s*Y>8MVDJzhRr9Sp*@ny$Btw=N4_mq@iPZ4h*ttH1RxN3V5cz-xqmI z-g#vitwq1#9edSKaZz?21vCzC)zHn0Ow0Or5`jlE1n)4GHpw9gjr(;2@2D=|(3*E8 z0lrPbI3U&z(N z=UY`k1;vEsKb=1RsP8*Mz5u_Bp=xiybsY`bE0GS?m^I+m{}i~2E-2djDoR;*a1MJG zMDM;+1v9uUgIx!774lt8xMy|RPNos)OdPjKB$fmO?yB<#7lifMvB`k^b@4VpmB%~K zmP71Oq)q!%v`>b-FUJwjFKukUgD3r*j7 z8jc!E8cYw*h5_=UWkti;XZeYM$&g{8Iot!r-lAVwTzy$sJgp@ZpurZv3GNsjpd11o zMji&ZmXeYxeZOi|xnws;W)=16Mwqo8#SnzVnLo%Gi8ab3>9OxX^}CycA|_LzkpZ>P zM_HZm9jx635D<>nPD!^+D3fFEJcfsdFV7c=4!a76O)^%M8y;i*;?jLTz>Gm7v9g&6 zP>D|vAIw>`cm}A^@p=BP_PmSF=4{AgwKqj@;X|YgxI#zqQfU2|e`APrfBxD!>p*K4 zsj5(@B50)Pn&yWyRD!hq?5Je9D?t5wziTprEfYRfD>a(cFIQ~YA*x5qL@VeD};eLp!`koUI;RY!vd}#hT0&Mncy#D%^82k86~y-HpQ>s zSFmKxyVYHQY&+kr;Ao;QWvs$EQ{ze)@6BKEke1ru$t%h(`M$Muzkc^T7zsetiupqG z&12}x;Nb#Ng%md@ZNBaNykLRXnGNYTPme6Uj7PRNo5aEpT^``r3-exEm{`g0PjuYo zHvhzgN6V`!!9cTw?w{+Q+GukC=MX!eMXaHnozKWPW2nd)gp{1Wpv45{wEHBc$zmS) ze4rVIm9UqEglxM8=%(p(*PCsx_1Rpf@-4~t=+P0F-ZahxMPx@1EnrYPR&xl1rqPj zF~6y${QQ=os_atQ;o-;&VXtn*xS{n>l9^FLr;W|Rf~Ms zb?e)iIbKp9tkaKFHL6I1ib=V4bcSvlF1^`K?4^sZRi z-yDVCNHJ_ZCyT!WSRse!&F)<_7WpZZ(21(H>}j2CND<=nbzuHtvFMSIUXM_bPTrTATTt z8r24xMGLx=-dVp&-%eTb7hT3)Gc|bBftv_n{lWzcd=_nInrZ7*p8oXovc9dIQn|nU zIG*4Nc=>&~=kU8xnDKtbdizm=g~ak)M0>pT9)A0wne0A}WV1i*e|y;f;nGZI1VW*% zY`^ZB>U{5dbITB@K%HyyADrg8ndu~FkpC*QfL%o=v0k|#%yZZFO>b1=;^KO0V-lci z*RbtU4KM?G7V9jU)I7LNtgB2iZ;bMlr+F|OlPT1q7BY@&Ea0OY)ie5?1cGikN3nt} zGyZOROXRyRp|dsv?@|`HS#OD;9F5OYcE(4Eqsh`y>vSPFcrQ@ygFEEs_89JJF$W7P z8`?fk4Nalf7^ro|E4kQQK-l&f5yM_Dc~{ZGi`ArusV952Yg)2HP>8)v0M^gv7YTd2 zK?m_cL8j~s-t>MV!u@sIS|MuB$%N2DCzAcES?k@{oBs#?x6^0|KGS9gQXt+sh!|0V zx-ZxbE-_7HkYGB8pzjeG5i!Ebaeh&+*s95g)`1%GoU^bS66Z{a>-M8F0HbR2Vd$GN z^BL&0I$w$?_r`y5&hvc^G z=MK35Vnye3OocfK`fQJt>WCPfM<+h|zKKlWFWIp-5!D{RBd9mX# z*I6o}w3Il_I?LI1FKYhXoz;E2=e?o5!KM+yDZxbb(nMOC9;Eib@MRyN+q^G%7I$>I z>-X4Yr=TImB*uY_9d}{c{l|{w{sf4r7Q3-m!mt1xUGs^n1r7{^PNIsJse~WI_7i( zNKOg^2xa&nd(11>REDMMBPiA2Tx7roIy$x!ymKgmokbHwYA6Ob51XbCA*_s1kRNT zFb9i6;T>QgEtLXH#Dt9vLB z%0yVI5mT`jb%@h$$IS7af~~4OFt&ilD~GtuuI`i`j@U-lp5(|!btW1(8coiDF~?pe zIGxy|ggezpj|}Tpps!(ML+AeHeLWPW8)Ei62~1l90F^`<8O7vFH=1n`WaA7k`l$g)8gmWY6=g;J2+H zb}d?|YESVg%f@YL;=J9!PfQRgXDROK1QA`HreTB|Byl$CpWD@$P&eJBb6C+=`fIi9 z%wYK1F-X_Uq+iANqg~DS0y;p+;NZ!r&RGy+d1- zZouiQ?i-u1Rr*v~V6_J%&^;AkkC?}???ToIPXpH|xnSxdi@XrOf)yCI zTXNX){SwqJR%qF?W^KPZY^#2ReAKkTjk+O9wK}zFWkZZI5(9y#tO7 z6}Q6h9bOP-P$*?q+jaM|SEK8>G7}>s$yWU#>0AxU67e9Ac8CLa8mEhQs-;|>%xCjv zOi~9&9KGA!ylC*NNnTb<9F%FeCE zDqBwB+!fEX~Cv6jac79jlL7#+xz2qNn#%j#&y*o9Sb?B^BrR24nqqG*BW1_fty z!nbieyGV^5aXlQFfKDAoxj$UYMA7{_eO@ibcd04KzMLcyHp1Gys)g1RaZ-eg8i-6Z z(9^n`NQVb;#_FNP-J8&-4rhId#k4P8>(=7t4VrSpGL-1c@~;}(7SF}zF0bWJ(@;j) z)Ej&eA67fb+U0$GkNaGIRf<0DH~@axi1NM|{p zXTi`HtpG;dA<8+Y{g^p5KM<+@3WS#vq z=WjdLMn?EAchB*Q!q1I~gT>Ok--^A<_Uym2z8_1~JL$YvHx?#xNvfwP9upJ^RZ!v> z+@(gwPIRzbcGAGJJUE%~n-%qH^4g}ftA~d0RXPdyo*BJy7MT!Y=>2J`#{I4v4 z;^X^w)dfkJRg_7wnkB<)5cfW{u|N)!Xd;f0naZAGd$$+hykU#ambIBcyE$8Otg;8q z=#DAtOp!Yx*og5H)Cgl5#hMz~Hng(9SxhC$Lx%lPLfpt`FE5i9C zSe40_`K^;wVr!Tb>8~}zxLK=0sglvoA`3FAEthDDh%L=EoSCPCz=$`}1ncK-vY89v zwSI12ods6(!s8(VtC|zOu&qc4Ev|4fcV*T!@Y#5YAz5typA%#<1Q1HXz8Qz+x%v|p&rNV2-5Subq2;(^lsu169_gZ@cCW(ua+M5J zU>;Y)U!?=ynt%zJBhn457pGhZGe#068$RUj$%}DEI0>ZJ(O3c0wUS6=BwZmNsYio6 z4j;R4Q<9JbtZ-z;R}61v;wT)R+`q-eRMon}(ybvL9 zySE}NOXs;-Koox;eBYo{!n+rRE;(zjt!YLeu zDS+Gja0)KUPzRm&FLJ^0H+b#_X}w|_9Jvt>t%?1i<%=(pBRYP_*Q;PM41Ls(%?5JHkgYUNA<4D1c|(~q}Zg!-2Ij9 z?dl@Zq8$FC^oIq4#@tFm9#H{YtmrwK4x0s`yUrXh*qWYXK_q`@|Al69jVmyg4Qy>k^HyJJodAD+$ z_6&e$$mPf|CTS&M=7vS9vJjhhkz{%ER4q!sl{;QeUS?hLSnH^-s&o>E`(`{+RK7w* zrMT&A)7>q0I-5TpBMsW@7$~G|U&L_!0P8T*9lY&+yWfyQeIKx0V|?i^NN%w(vE1K2 zspgk6b5@6yLt%@2F;(9t`rmS#vMTt23s*Q}lODNMi1)!|bLwi2uNn)S8|UW#Bgp z_yTik79Yg z_Ia|BHIM!^8U2rq^@*TQ{MifkwfC~SvGvDNplrVV_EOw6i(9@^CsM!{FGj%mKEZ`O zAM;?AYS_9#uMr(Y3Ibz`52m3ky||uPv@4r9aW5*RXlxRQLY#WwgIF8|2{v?q5~3^t z>duwC#@xG`Iy@$TYc@@dBub%ONjn6a-%tfXJW7n1Xq`+l=B?^mnTHE=8IwjC?DVuH z#(<*A;jTng%f}Q!&rz$K-7}dEkf9a-&QNW<&ls%2L0+9tdpcjfUwaH5g;nesED^(K z1Cc-Pp$)8Bm7}nLUT_1_7@v;+LZti3J!5QT7@6EhZkDg%gWqQQ5Fbib z56wV*>pBV^cIK}hEADJY&qDrZT z(w$bB7PR0{0gR}e@(>D4`n{@;<_S&dR;It1Zm-H?dsInp6Y%xijl!=21EQM=z9A@Z zWT0T?WY}Pmh+^vfPYaxS(M-I3I1L z6GLXg^0|=OIWOT`6h9C~y8qciT8zT}4KI+PQKwWZFRR6cszi=j=!r;Y+1qmL<1y8Z z!@adyq%(|t-r{7K4?-nWL+@2F5|2XTauA=9ZM_;9zSrSC%YX5uH;26S@-<`=w!dAjE{&tGtB}-;34Hn~1)^5x-_odSmU8}!Wz6cJDpI+6YL9f{E zbpL)ah#u6%XT_Ua93q<{4?0_NH3_u9{w54oXtHi(R7;F3j3O{^v%-6D5`^b&HuVU8 z!0+Gn9Xs|#On~Ja#^t#AEK#M>mvUwGTU>$42z-#{F)%%!c+>fd8KXzy8A%~r)9!8By+ zK~J$wsm=2`z<1l%X^t+si6Mh?+y+z7&%>6?*(Rthz#>Q%^tmS0EKOn5G9bf0mmlxDW_Ai|SI7r_dAypZsF}!WETB0}kXIZXGseIPf-9kj=_zlRx z$YIBSW_(EIk(7b*|D**wX0YnJ5e9K-8_e~NLR=a94lzKoLg=BPbBlJxUJg(4&$HLq z46x6wc&qQwcpxY)f7vadECTG_!2fL7$(G;fn_qhcUPx7Zq=H*grOLOs%*~^;T)h>Kj`sOQi()I7=c4JG>$;UTR}_lLC0q47LTzXry&SY7E$L6)|KkLn$3F1`0W zb7?$)>s-&iK+Q|G>T-SRY{@#u>OGldYn0tf&*EtYB~VgQ8| z6skI>SKx+F*O=LYJ+!-xknw(-2iN$~h2V0O-K%K73U!sd*(Q%6xayzIW&B45g*F<* z!1rC$xOVQ4@fZ42_N7%!Hgxr(9uP1r5P}a9)>asWa!-6UMjBnZ^iS)gK{WBMr%9BX zKw?QkHmksz7E({pzz{WN8P`sMHUr0tL~db7j%8{~3r%8P$F4;kS~!g}pzz}@d`=!O z)7Fwb=*+|X{Y<5Jl+cUD3xk`P8hKswGqGi5|z>|=T{eV$B9zxm^>|J)`ZO1D=+u(#<7Of)W zHm5LykJ31^w>Czdel|76T~DOfrDU*{XMTd3vFgQNWy;@%1Gs+_V+L86NnWX|h=oCoOiW3}OVJ)-<$T?Z)x2+F-P-RfR zy!K;ev)nIL6i(0Smf!js2bwREzb#;p;1uE5KroA0k$~NL;dV1N__gweW0wJcueANYH4T<7Q!b3k6MQk!!e0 zMBBpsu>qYl3hWcY8$7@ZE*BX1oQm{J>2q)(!x#0{m<}Art|ZA`9|XiY-%tx}rH=gr zvA9Nx0|eoSI@6tX$tguMD{~_4*5so~j#3~VV>c$@bf6?IPc6~|K?y@I4QSb2g!}Fl ze;X}w%v83$QNFbMeFa)(2wFA8vex0wA?@&qnD&hLzTn&LLg<2uzW58uH%mvM5yZ9J z<3pa46T^Ih6x=%NlGQmk+&2bpx7=^a^qjvq-!5O4YtOn~+*iM}gRO0@z7!6hc*wCE zO#b6+_P@wmGRz=CG@rq}Z`zO1CO!0 zt|*|14T{p{0%XQQVmLgzGkLR`_?nK6ln_nJ3Ia?haQluKKnQE+paJg&Mht}Zia>1$b@Ao`he`nP4q$ioRJbGdZRXr@$WnN|Lg~AazI3@_D|T$hFpc4#Tye%^sLhgn5{CXG zx$S8y;Ou;DW0o&gyJJmsjCccsCj2xp0V5T(WXd6PuTrgM8LK$S+n>no{l+%DN83Ji z$GDx@-76v1P`_j01UR1@6$5gAf4|gs!5JZKh2-B)X=t@3I-3x&BE?P}x|Oz38EN7* zB@@*QpL~_pw(sb>?4ngWuD+RmEmt3GzVzV#s8R0BvhDnS`5akPse4Fft(n$?lZ6d( z^&L$1wcE#{^U|qQxfLygi~BmwuviOwgJ2D7h5b=E`ZnT8{MD;+k5R)T3Xg>Z3fui1Czl$mnFY5*m{x6s?_C#(A zEFseOBLVxUdEAr~I_zMY1*`x&)F{LT^4J+8+Qh1tS1u8ix(p$H-sCM-LBle(+ zkp~I%x2-X26!1T^5pqA`!AwdYMQwi}3OUf0s3R^b#Ro}Whn-g8aQyXQr`Gf)%g)^j z`>9tx1dVs@r`hNz0$S*pByI(^;ukJcZm4~YDyd8 zlnVwY$kfIYjkgeeo;$dVxt!|LH!z=h2GsY=J{pBTTTPIZg(273iRPYtf+W< z00hs|e9QWqFsjDNm5wds;)Br=c%p4fFBvTQ=fPY#o8tFTe5v8((0Nv-9O<(oj^VJW z?_)_Mqt{3r_mzCRO)T1>{?tXI17|fI;Kt~M+@*RO`Pe!bq1b|WsW%zH%_Q~a4r9jU zp+&OM`ux%n!HOxc6h*rA?1|NW5bN+ZJ7wpJR6*o)jLpy9Axz0SFvdz%>&{$)hu0vN zN$z7WY0u+f02g$o0RH6FZ>Fm7DRy{5{1y&jof@kBvqJtQUs%~?mEc33B z`H4>=s4`Hb&vGH`=A=GLKJK+2)HLyX&J=XwB&&2%l>~rh=qTvb!cZUYmNBVr$bKyL z_MbZkQpOg%I&C-5!97b`aXo>ye)ppd zgm?q$^g_9}{IAT~|EW|g{tdJg%>9tN*TegK2wjs0am^iBuxmFVi~+hMDj% zvl0{swCIY!PRW<>a1^#X@a)}St9LPSCO^S-tZ%|YFrPn>8af(jkWV&sQ)8JlI9WaSY}9;v+8%l|NA3w<+lshYcqTDjTbszb-!*nbN=GA+0L z6Uw5~Zu)+zlUxjfnX_od8@2qWos;t{K*b>AudN9wXO&#Dzj1N070WU2k1u@Q79nD1 z=vJP7)%h?n`(gt#eGHgC9oN>Zk0Q#)3-y6uhfRPPBJL*=%=`G(Gg|i2PEQn9X82|2 z^$+bPrZ32F#6o6l5eIZ4)=eRkP!qe$O-)QWi`7QS&!M{QNilMuIp~{#sL=|;VYVdS zd(vi}0k1v&0@+)g7f@` z5G*>;rb^4@eEysXULYo*uIMz{K>uK<*rNRv?EMn_#k8zxk3SV^`lKdlE)4@T%>)!Q z^QlQ}F~;&!)U(h4mnSWKS#Yo1fmyieD12Kc@f|*i@k;-8iiJyGPi?lJod>fJrJsHkDj=R^Q<9wu6>mJTS+>+5zic1sW^` zX`$INPV2(p)WBjunqU3bjW-MjBgICJda{K6Ty%FU|G8`V(uoGbtO?6TrTi2a`fTQN zxV!#Fb-xpS)5`=$jg9T^2&u-~msRkAut*h7dRF-Z ztco_9Mz*_=s*Ai-luYMYuhRR~W~=SGvkX4ByC##aVU!)h6lY93n_2{l({qw-kC+(= z)p_CY&dnaTbVMkD#Hc<191{qk@Q&4yvBvN$Z?|27{YN1o_HZi(skEh5G&{s9`}G_M z)A*2q8EepPf_6^}1k%wwqxCV{{GTi!eH9h-C~7w2k33^H?FtwZ=Im(m=)zt<@F^8W zGE!hIB3nVOkMf++9nFE>34Zwy=s=v#XMwI7<{{e}ZW#a9A9YKbt&0Q?D;pb|Z5(w@ z%reM-2*xF_eZ4)7Ioj)I&-R=k~Hg1mu;rq#g zkMZvGi$6c3DVHw=YL`$utOYGop(;7z=Sam5UUqx{W8u(NEh%?GW>282RxGcyo6I=7 zxB1Swd;azKnv4Eh$a%ka?zmQmjJqysAV7F4Ay0! z2p=;sc}JI5m^G-#8mqjYg;0Kqieq&18BnMarmpr^nR|Z_;?PFJSUqc%!vuP-{;s}Q zOHKH=5gIf-|L07qE$%a{kFeSZ4b8hVnw?cI<^-O%rv@3|HSiv`E|#pvNvZUv1WIDX z63v2Pc@xk3wG@L9%~f>@0K3e;L5gsq<09Lq+-7+qi{v9f3wOfnK-dvU%=2wFctUqZ z^gF|J>0O+C4$%7iY5<=jY3SV^6^Q?={gZ(zNiBtQcz`P45vvH5T?SB0! zt@-x$?edv?B@Imv{_mgRzxohXCd3?!60c)tFL3Cwb)M+K{dM8m z`7;3vY*`#NAro(}aKPOZoC}>^a93I-MgV*ki9TM2>eH^`yZjYI)yKR==+p8Z*$gU)0(BBtP4 z4M#?x3XbxgwFJ^9MN&l7ClYG#_PC3{1D43leO`6>=P4YJkodM4NvL$iz@Gd|& zL9@-;(GrJ}Ug>sv^nL0j7GVB?iET{u_&aZSO|hwT++MZ8S3hoKB2+t@2#7>Zz}hHy zu#!ObD(Ts9ouuUC@3|zy?}=_rtz`_Zk5mg3dxg?V$P5zYg!_+Ch3265>tLT3bHA@n zCslR5op}rOO*spq8~u3jr|E%KOFW~>=?DL*!Sg+Y@HnK@q0p^jgTQ96m`oukzRIep z7w!}L1(8OF_*(9q)zw++X2Rr@Yueir5Xu&Y_=n}sSVn99N+M4;qo-}(RL{1KXI#;k zSNiMtM+0BH<={L0+B$J0zmskA!Ktg$}l@>C2ARt@90hzz?l8t z(?T+imYvgG;#ik;7UMs^atr@n=9SRNxSB&-+86|~4Ujk+U_w_hyp5P-1SAN;nU-vT?&tB9Qi!?Sh0XE$8)PLa<1`hTanwPTgygjG2;wC0VWN>%~F-tzDfqZWi zyuVw?tbSq`cwW!6bl5!%k9w@plAw&iHevJK3rNR453^ePYR#W$xZGwj4Wc)jEnhya zv)awpThx|jac;2mDuQ6qsH2ajjLnQ0OUIjvd{-ug!vU&|aOkj8-a{Uf`-}XM;Vg{2 z`NreyiSn5{BO*`~j0}cpdR7+y6=+{G+w z6{u7%(+7d}_8SV#i-Nlv-*RBTM)1Vwj?C$Oo1;phi9pb#^^SnVr z<-kSKb9i=i$(oUf(9?)&Aq?Rk_N4IS?kwPfT^ySI2%M#fo7T$fty4g zS;L8)3>4YNy(|VG9}7`!8=akRQRGTX5WH&;7cB2iK7Z+?EqmvMaF$OkcR7ygFv5_( zWys4P_*7R)FvtSLTvY$NCEE`iXg--C<^v#PKQC`)%A#ZRR0YMM5}F_8j?5Spe*9rw z3)2BpZB2<1p~tJ3yO+!U(6jf=HIEl<)Bb2Po@w_DCwtT(JLGoc^TkMJHfQ_m*5$XN z2&RE(a(KJ>weR5g^!gv#(G3^;hp38sE>YQ}{84|jXN+N&=^hrO@EQTbt$lZ0G{b>D zrn-dNk;-2!SO+yJ9oas^P95VQquY4s#6cTSxNsTVWP*Q;Ofy@pV#kUFNsS@Lqe8yr z=1lA#o~X`J#CG;R)pAcEE48cnCl~_fd*u6-)mh=LazAo+A!J(ugT%m9SyU%ZQ1vqA zDI)rD`@9SMoPrk%cH}k!JtXREa8#9njiS!_%PT0?z}MoUO_T}_bIUZZDcXpw_lbcj zl@4G24_)sVommuRYga0+*v^|uQb{VdZQHhOqhi~(ZN0H=+qU(kyYIbY-0u7RJb%yF z=d88%nsYvR>thYquzPdyPCo?=QJn4wp4>&FQ4pVT*Bbhfhi+4qYhB0BI17_KQ%Z6G z-E}n$jC+KI9@6^8uPJeGNC4{MSaf4XBCFxqA)PGZ1qb@|6#j_0kk+}W;>1{hSrKzp<2XLjB8U&I&Q|BigRUjKc~xN?T@b=}OY z5Ahrxm&8QR%35MlKZ4sY@T=b1#^+0Lwuz|)6urrck&^2hz8i(t{TJj<%Yo9;&IYfx zpGMD4!AV%_zgov*-Rv1#`K_-_P?kkp48yp z)A)qZ80RxRXX~Ca{Pbg|=n2QS_;?)2;Z7xaX(|cU>FR~rTlA!Ef5{6xi)U@@@?$4m zw$qx+d8WD2t1+|H)J#43xu}RNrzMQ9`Xn}+w@Q!?r1ZbB4|H3v(?B#4fX_3NnL<5o zMTg1{6DFG#xQeo3rW$drMoqZVY7m)>TiO)n>26*femGFpA5gO>F5m-N{imAw6XIS^ z(``=i)m|4CX5G;Oly`$~&+gwy=7(qC>en%pARLuDP>ZJLvzw}g%`?*bjL4zYyfI_y z;h?=vtQ`ZkfC{GY#o-#6MW*h!9OBc)Zp>felijGa=F`3?8-P1)#2dPZwroq#uq3xhsN{UA*4UyQ+h%P&CdvAjs z6T0h_@k&zlb&C4u4Z)v{jUb4RP&OAcU46s4!GQ!wpp*UHfa7~D~Sx(9o|C1}# zUHTn9+umc|C;HfZ{!;->auCx(|JNU=wd-$&x%0$>ii@M8Dk!M`kS=9Bx)EDj0UA3# z|Fy~&qhE*Wa^Q6rZYWQU48ne97Ig!DVUHMzKVGB-8Da7|92Iug%O1^KH!UAJVlz^3 z!J_coQ~5|-i8JcJ@oa28UD76|B8uMXgoQ->Lhri5-4#U?jpySH#}K-V3YgP}NtiDx z!S7|p&l|wkO*V@n^ZMKVa@Ge909CYbGIE3vxmt<4{F_Uinkx|D5j@aQ&S63^<+cXb3G@yL6sjDmmgVXo3EyOTHC=Tu4JTydI{sirntF{EBJY|OA^u%V zKsv4-Yuifd(!k!uQ(8s~-x!e;nRZbl2GQ|)!pyPhr`Tgs|7DR&@7?*5oQhyt$(7yI zPD#PIH5TZ;SRB;u9HaX&+;Kp~I6vyLnw7+^{NM4N@0&wADN6q&uazCYR3cB)e(3lqj0K!>W+ z-7B(2>ySaL8A=uDG$kwZ!vE||MmcapDBr~?!2a8q$RXYaiV&w$3REA_{jW_dBm6EE zWwEKoH82xhc@@l!15UmgE{>stULj+ztt15F-#vwqBx0Nyxt(5%*}Ptd8Bzk?5cJW} zQR5)L!uQD`t@z*Kfqt93g9s=oyH~wwt-P>zoto9 zpl(iVPQy)>%uH1b)h>IC-iGn7i$r?rdl@UkL(Et}L-A|ywVJ5|1Zix*q+&sa6y0&#MNO(KThYFQtl9?Z^Q+EM-5Aqy91 zgItGwF8!W+9fh@0+-|4QtlFN*e@w+CnCxTKgtNNfejOOc8T#l=3$Sk%$Ic4Xf$o1y zHvE9Z>$e*Iv<&scZzRAS1K9$|!4Yb<$oswvxQ`hbmkX@OA)N0nmsEo#P0fTjcUar4 zRm-7TSRy;ixt8l$kIefK^ znjosiu+BUhxG8v%fua6Cu%X>DsD7%S;_Kh|sn>1YqeKF8o!ONYqux-A=bXrnBMy@D zh0rR?Ax-YY%6&Z284Aa%P!Ig&7TNMYEZS}dn>RW7aoK#)-RPW;Y1$0ufp9qMaz49N zkc;>n&+~&fGx=*$S~4u9^|L5D%UPr}>nU%$mqdC{j z5JsUi>`a|*j!*vSfQ~Dm$^q{xbx#pDO|K25+hm)0WsEqO+wzzpUuvRBO^zzOKHZO%vki9SSq>q=Y zIA?50TVA!Qt@YK_Fy5$X$$2-jg)N>k^+@kn?MPX4RBrryq!?19P=#_%YpoJ>%UMy-=j;NQdHWICx zV|THM>CCw2__$#>~-+;zuHh3h9IcNnE=n-ke(ITwmiFlA&VD1ryN9AYs77g!2gB1 zD-QhO^ZBpS!=?%7;j{A!yv*Vrhliz&MYJfGm0=n8c~Jz+Il^`BY;cX3=}Y+Cy#Ke zX?M~s)kP7eQ52-CN_ptwZoLaK&T|v1tuqXC5YDdEok%9lT=KcdZwJmKan8wu`ZDuo zK?dJ&gg%9SZ^;3W!X`!4+?@4Sy?qRj)zm@t>9^%^?n}BVriSCw4VAR%Bj+3*x^H;N zRb9K^$wo`GErXs7Q5`~I;|_T2%fIGc7%ABLMA zP8JX>C97~))(z(#8SLfJHL?q2`t^S>uu4Jdz7fmy=0kc$%*<>UdSiz7LXm%j8t97O z3MXKSt=F2k#)<20Tf4$h`t+fBs(%{{ zHIi5_Su)7N#1Nk&`a#uju-cV=xskqxTnd3*we-&5wRX@0DW92Uf02yBlO7oN*kVX%1KSWQpWt4EB8LLazAO7tct)&o9{6oyE?&SMZ!xwXmsx&!)HV2d3xR{;wbw;pL~ zDn2VTI%w*d*hza2kN=3@LRN--CNeZ$3Zu2ZP5REcKQ)-`-s`YcIig=(_8&PV#sZwg#ej{+nnlC@ehLdK1y;jSS81R}}G; z#eCR2?nJ2U^AV+g63sqFRcd3A$uJnc+Q6SdD!!4oJ*t5x7^1%k8Rul@yTQz>#Q${4 z5+SXasCzvsexpZEh$-u{8M?8MHsd=zCoTLeNlBBUm$34@-QV4i>y5IylZ7cKy5G9l z7n~uyKWd+tsF5O%9FMyTETcVRN!MV{rtAfm^6&E{w~N!Q5F!Vxaw^$U2zSM&^zt$? zFib8~Y2?)qpKmz1{Nwv4$4@ReNF499Ie<5GTYV>>*9KqRLH0-vK(2(szj3BMBtV@q zYarXUX#eAc0&YX>iBl0kVDM z2BobaQ#G37nJuTPR7#auT(u4GEP)SFXUyE2Ybz?Fkx_+DJ|{fRtS|%Nlst@SN0~1Z zk<~s6RYk!ES?|1O!P-P>)#eh>R~J0D7gt?SZJ~|21*%Fd^x6T_n*JKT`kfG8%g|JC ztqvsVuq@gR4_!KT8)J{-i59B$r~SNmm_iaQeBFz%Z6c%!(I02UTe4>J$~}MiSrpNiqHkkDBYZdU$*Qx|lW}cwwu}kq`mNoD^_5p{W9kbcu zu4|;1YwPTm>&Yj=+{K+a39Eb1bm^Wy1G&-9OP;!5$p8cCqv`?w8lMC50dV|VT^^7ygbw%CY zRbGc0p#J;5vo8=_j$e(-HQ%(C0z7o%yjii0kBIn=w36et+oxk#h9m4O*i%hrWhw@7 zj$fz!ZsW@P$whst|LVa^tOVwlUpDGbOGEPiI%(PDKeM0jhbBc+M=0!ROR!Ycg^%3F zYyR}=g1_Z5%U32YR$!~y=^8GS{oM)YEfpPmD%fk`lrlZ9Lv*WD`7JTQOIEkb-@@#}({N`S z54vBo@vXs8obSS)HyS7ZRm)9qhlm7kK9N%>89HSvwX$7%hyOcA@ z0cPl=Zxj1dM-wt5m zivoUl;A?KEI|Ng{abW3HI^Qn9n8bJx9^dnH3)v3{Vmkapa?rE48(YD(1zzDc6dOal zwpUzd)vzgoLV?it4lNM=$I(@*i1hOF)BD5^hd*&!(;2A4M)#vSj^1RxiSVb*zBP6w z{8hS58n>-v#W8B$UwwW~SXn8(JsN;>Sg!)ijNme27R8+4DT)kZ`k}X@@l=RRVrm7IB@es@SqSPXPlPO5gsL#+7 zN#XdPbm@uOc!itA(5)MX4j{dU{Yzwo5Nbmenhp%X+?z=GvPwjrb1YLbY;#z;Y7SMj zpR~)H^BJ|WuKvwf>ssC)7v3H0t`JlP+A17C%k`^Hzqu5PDQ?K!b26l=(Mo!;8U5_yS@_Nf4?Qn`OiD=EKsm-Moe^OtW04Q6BV9xlqavJwAbC<(VSILvm!kA++3<|hwBa*tMIRYqqgi3h@LkNzFY0yUwY-=$nA2K z&fCE^nCqXE<)Zl8ACnG8K&LC37PB>V)3zOXm!K`2fm}a*iUYajvf9f`boe6q%?}qZgA1##&p;OAkM7YUj)vCO zR-%uWD37*t$D{L^;;OOUrJIg#sC4epScS%2q(gPrXI7iS(jf*$&xcg^=cQ~&aGGy` zl2>(=M*DVa`~BtPGtS%?1)GC}CXT}>VD?!jE8iR|d}jwZ zOhvj^(!~h%K~Ql>rUe=MNkBBBJg{Rw8)A0^2J!LJ7|^jjzbvMmR8-j#V% z>%iW&%43C5wn@kAW9_3PY9&>4w#e`pQ$xKQYAxU8clsWA-~sRa*LF(NTjWs&p@wSv zLVtZ1Fyf!JZ4acWMdA|wdHOQY{nBlKE4`MZc-Lv^^-?%I_P51~@VF5HbmMACt(Mlt z6KPC)HI>`!oR8D=!MUcEwAOznO{8&5=l5jji88JGrY_C0c^2T@F>i5YB=OS&^w8*r zc@lAMyU%GpwQ<~k7F8D=9$2W;wUcG3v)ei;Rcmf9@{&-!`f1nr98mz;-Y8tvKU%VX z?SEhUplmMSxvbB$TqIS?bQ}h$;GT_CWE@K%;AxUk{`uz5wI`2CG-32=Bpz5qXlD3ds&K!0l{3>~CmvwOy6NmFslL zjlGVBmxWH~8NvG7r5}Yr#X+E`qlR<7-8Q6tI z+G@k~k-=VILNO%WLkF?arKb0rKJrHGwDJw35~*VQ62mxd;~V$1HB}p$|}KV6+#3*xPVfJYd{w1pWw&g))0+03{%!gd-b@VsA@J2%M%hV3lmmA(u zG4ACqJ>(WHrGr6;f%q&X#IkAu^X+it+qXdQFzK&BM3fyfv-DNK9Ln%0F>?I-m>tJ% z<81-%v^cvsfYi<#B+Gw>zX;@;5g?YZSWc_{y&ZEfw;W_N@|1VM!>lqFb@c?2g;~ow zpU-<_rKBtqp?L3j5>I-5gq?Zyy}=Uaf9v!Qs72*#-l1nYu>pcVgWz&olZx0ZwCZov z>zCZiQyJL>hS{z;^ZA58B5thJuTtB8T=`e0I~?U7`l7sWUq_in__h-HVOab@x$d?K zQ*;sEhq%l0s8N8eI>zYq-{_T|L1CE=aygWBKNtS{dq|E(AT~lCdy6hTwLn4O(=c4u zqsLHdMH|~mMRCk&IIu*?G^ouc%zdU*N@kpYy>WY+%iO~H2cbtkrMyZ?_xfCy?PJhHw6$il z9!7?Rj6gyV+%F2XR&VBO0z837cveuH?mTDFbaA?Fzwgv$VTN4%NR{iT8}1eBYXDjp zh8jtN5O===nERA90;A}Vp>YSna`UtGZ}fQF=w#98b2G`jns`;Y@XXj3Ass?FZFzhV zw-OiLP0jak)4sgHal`ZiYu_O`Hdh2I2=^fNj;p&jUf?gzvoxm}mRTy5euK`R!yn^O zO8T9uJle^^j%ujumIx7^WdvvAia8?Fp8atbAdR}7rnIt-C(BuKoSr7RmLYi_!uk2J z6_(ZoWz|+G3p!NADCIP-kqqZ}Hk>@qpI<9Wmm53#nlcJ8@%g0=fxiED=k_0u*E;wh ze|fy#7B$|y4;_?Giz7SQ0kdEme0X=Po!k5?$b~zy4RH!zPW5Zl2pp#I&*H_UlgP`ds)psU9qCS z;&fzPmNurd03?m-O(tXj8kuxCH@&C2)Jdf{n(ePOsZ)AlREVN-=*Y#T`MRRV>M3^E zgeui%TU#%UXLV6aT7zKEe>i5&*-XwlO|zNOH7H`?PpO-P7x@=61hQ68=OTpWWw2h9ZGv$fa zB{|jpDt-YO<*I)KDKtW=0oQE0_NE_bx)#4_9Zbd@!KQl!&KZb2iyTPO-2GBz88T7B zP}6cVbOH0=0x(1iqSKa2WoWgmT?BQh6{5X6q={VfGI5^pld$&@)0V3v1Zx`#Zs)_M zQ~kU00N1lY{`yiX*G&bb>Q*o&4Hr;cv?{?V>A-`n^MWh25n-a#Dkb5H-uIPjT34V# zwFyHeo{W1E_@!&e2z4y&K`uK~&9Zi8bZ8jqD8 zj;oINWqR7O@7j3;=4a|W;}F*%uK1s|lM@eQs=T5<+7ZD!$4sinCL6Y93!<;4x{?95 zv)10w5SJ$elVe&-26r`j&w}SLOFQHR#(NbJZhCKRwi`kq|LWPcPSF0ZxD*9yIEl{~ zolJyw7_I-L4CKz<9fH;0z=PzzGt{EN!p2j>>&(9B^ABWwo;}vzlQI|CTTmSrR#$04 z&_~?&2mtnF7JAz+6oWTycgNRliNmLfECA(6>11M?C<&ZJ1@q_W?)l_Jv=i5R<%Nmn z`}Sb2RANGMe@@b(KtVUN>pv?cZP?lfrx=-i42FYwz^hP~f=nNS8VO*May*VUcFyXe z?4yxut+*mo%O8*8QfHywo)fJA+0UXk6)htZoK|Y~eXPN(f#7&YLkuRsxJnO?hk|wCD-FYsC3ZP zZkgv$^Sb#8<54!)w08d@nYRxbHRD@7sH|w>G+{BD)9Vcc1=dA*7XI<}{kF4f50W1J zE+MZx>=_YNL!G39A4!}hKdyL_IM@ZGQ=ItHnMF73zBHf_94%<$>%X@iEO;Y^^pHDV zAE^=ba`LAN|Gfjh=H%b*!Lb(Qcv#u$85eV<(eGhB56W;y_Ctwd8SL+vKscS;)1#Y` zPQXx?a|Lxllp(L?yWfvg#wK=kh{Y4z7gVot{w-DD4+o5r{TXBb_pG}`D6Bln#3-t= z-waXLoibR{8b$7}Sd6Q=?lAm~py6*B${hJ&@Ech+?8g|Mj_MFMNnEW84t0T?;uQD) zodtmDbG`k{N-D*(1sWTVnDKJjSnh9lJtQ^Zg+~r90nyUlaGATA0!A5ymx*k`jcShG)Dnk}w>g&ryt0c*|)N0o~?aAXGlcECe;A~ZOIC4w=R z0(k*eId65AC<=`vuuB#VPZ`1a~2=lQCu&_15U;Q+t`#?{__As z`&-#s_9Q(e^@Pjz{WUu3-$%$7b_~FDqDi6tyKG832Bjo2asV4%|G~04_VXr_WyaLWK@@E2wv#?* zA@6FJi+Sb>3n7`U=R3^hx|4W~*1!&&2EYy;dhwSw+3dzcLYQ~s07Dd&j+vlN@`8`w z&!VmZIq9+ehVB<}x`5*5F?q_GC1$szIqkHFA*v_s1o{b1usTLWEQ^`g4UV=f&d0`^ z&RfZ4>elcddyXxSlOd5k+?wR*F|cSr^M-Qp|58c)*8ur{Hhg|ro*!rEI1LsV99gfo z*cwg&ff|ER8HG$4)SzJJ>U!Rd3Z;J{a|1xpp}^EfV?b15XD#Qtdo`tqq+}o@&=lrR zxj^wy2=6^@JE@u)%Z~^0Im|HM*Cl3b+OGuaT;iSTq^VJ2Ke#8BmzYg6^A_t~mMUdb z_Yk>Yi4D@1O6qvMk0Zrcy{{rzU(f_4`ry+CPg>0XleTHYO3Etp4L^se#txCMP1-JV z28Ne@NZ*mM3X6b}y5fFP!M}OyOFHyntqo6B*2gJuxLgK7a*@$VdoG0zbul-!Tn_eZ zFuM|)=F4ZsURQSFoI4nk^jDSiaN)r>VWcju`8+*cJr9d~LYNO-3mt2O032xZg10Gk zS}L8#`j;sTr@9}&sS_~pXkMl|7X3g3o31b8NZr*yX*0u9^?ArK-mk2P$k7Wf$)l9h&O|s#zoXKlc zN06xjg;MyO_MJex4Ht*Z4HzRxhG(y1AvuVohk)DNcSs0NoLZn9)X!thJ63P#*9{+i zA~R#GF=gUL1*rFaMA?ALY|I4m-`_3THstRgSLkO*v09h}&JfQBC*c9=7zmTe z$IE>Jt8>2DT9R@wWbHoyV-y5n;{#l>SYhV~90YiKooVB7MEn>Jcsn1$=P)=(-Ac{C z?%M4kLU`ZZX)V1wm)3HuK1H-P@iNR+cilVw$TzXN+^|0bFQ-XS&(=7aiNT+zMGOeR zfU%=v1?Hz?WVxLz_w+#mS?G9P>FZTYo3a+^oyBo+($V4asp~pZ*YlWM`XtSE!vq#S z5Nt*>J1w-#HwKGcdHy zlQm;p&ov~hpJ1-EyU+HJqUq$oGbD!~q0!Lf!fx`U_;G`~GA)25HNu(HXog3bJ;sWZ znhxeT`h)S3UN?!fu>KqE7u{pguB1nb=NXq_cG%}aI~ob zum5M^_rF_h&T2#`3WuXYr&|94!PP|C*GROHv4aE^Tauyi%38Wg{o-FU_v6R#BXhcj zyP%IhLeM=)+5oZbaIV`61iUev<~#VpD{&2C$gU^_YVI9@420ZNEXZ1WwJ-LYA$@in z_`KFcLULrNf}PqJ(iXQ>dMA1Dn>O-6!`*vznc}^=$ff@tzz#S? z-EEQnK=)<9`MO9|ue@6z++ZCD%WJ)C;TM<*gk{OS>1y2QdHu^EJz!ys9Z(;DSkKO4?|DOw0RDpawIULxXq zOar|^oIAJ2;)%(JZ<7ZSQxnY`Z9dl2pP*K|_$05{gz_|=PVcSIq@xzq^h}yPG)0dP zRI*8jTn9aTc5WeuyBO`-2zf7LzmF6=S&2J^WV{NnV>D^pYwfBjIr*BZzVbS8%u8KP ze4PEF#yz_Zrg`f{m1kwkeH2`%{ht$J4&pOSboYkKR^{2mteO;02YM9n7z{B&VmRpC zHv*;=rChVGl!+uLIjqo;IyrsP#aVe~$otmUYLaS}Pfzqn$(e=-0h%juRh? zZi|$v>zE0|bny5w-^Rp|H%-@f1#;1R*xe9jPdvf-e$g)L{gRbg=W0yylEw~qdGcpL z9+$K`3-sX(40w1Z*3`_JGU&lHFy%6Vw(dzav~+9qaht%e=TWAlx$$mLTG73fn9T*Q ztjm*9|74i2LHVA(A!!^@(cn>-1?UDv6_x8e9P5s~&+7Htw%K<->9GKO5KL4!h3rw{ zqe-Can-6T2PCILJ%kq(8=PyUwtk`J;7L--5#ySVo0C{-@eKtn)mA$*UB)$#TNu-!C zw00H;Cz9fglrhIZG}f+i86|71uftwKM_i1Y!Yy#Xk1ZFARaViBcjr5dgsuE@Y>((WG->ZcUEY;1BS?$!yzXWy6=COBchaN-Va27*%cJz*2Z87j6 z3bLnu5WDPK9^PIC!O&nX@DrIbnkyH|`Ga~lAJ1ogOwP)iTi>Q|d*2WD^Sg;TNEAx9 zU{voj-NZKFyiaLvA9!@!wiRhKI}LepTB(A!Y)JA}LrAmSM;>QC^B!^JhFuJN_zmqR z{V1;Aq3sj+Y6r*3^c_;odiVC$btnJFzn%Kc>D31R&zpy91-|XX>W(s$$7C3)G1zM& zNE{5|GIiRB>`6G_RgYQ%ceC}zY9A(6@I;Zn64x~v8UmMEFN*ii7lARD8FV**d8SBJ zYz(aRR}P$oRCu{_e|x+b_;zEC zQ5p)L3jEIzP+%J`eX(P7F%l=eCO{7=`lb>W&tTl+S6D$uxajhjsht*W)u95h;jJ?6 zFxtU(>JqO-!jzn|?&vxhifuluKrR%22knkns>l171>z+Vq@i@glmQl@H#!EbWi-@A zoZ>j=zBu17S|T(hE7!lHLlREbV%-$~1#wq`9O^bHx;9zt%0Ktb+?;pwGs;M{9@@eE zY+Vh95ws`X@L35>@t>2)1Y6*N^r3$bC^6Y}&7qKim}*_(?vq6UM1Rs3$6{OdSli&c zlxP*59i4oaHz;nk)Fd&{^>tfhU@MN%v^wz!=VFnQ;NloV8t;AK_263ia9HO47`9M{ zuGi7V9t17PG&Y9W{+y=A=Pn7`@fbQoU$EC=EOW}}YYBB&oPxgyP;icXX$?g6Qmt3I ziT<*r42Az4#QZoC;5Z*@1Si`>Qght{QQVN${dRSJf{f;h%A>4~ik1xKj68H>vLcx9 ziak6msd8&KQ>DiLTb@ie3C!RyxFL@qe1<*BnT{{rBx1CHaD=|ir)=u@L+In*3yI;w zGr^ZYJu5@~?Q*Vw)>=O8qm{9;0&wR4PCzkc^CJla?N3n5lwGFw z-Ob?4$VnvLT~{CovI}`~zi}S}OM;H?Pon`qmXK9awXZ5#F#wWK_jR2W5L2bc{+UU!>c<{ie!8=1Mw(pQ0vtyT6*}d?ZmSv5! z-cIMCwMl&7waS!e=Y5xsa>r48^t40L|Bvgy78m5ACzE4NI`5vnB&4d}2rcVo`pWeNL+wpk%TakZe3<&{Qma-3H2WWB*>C{Gfyz|RleeZAK=3)bm zxRm=Doj`*!TTKfHEzI}*JKFNvS)dWqvAG6KZv@6*c;P^* zc_XuqLo`0u>TJ^RX#YfUr?I8Dov%0lv6hLkHL|g5?v-m=swjG6(92Xk6Ip$x3#sh`}yVZzhY}{89eNJk@*Dotn88nJhBk}KB2ZIBNi!!6JrNFZ511vMjO{@ zwPv%qW3{y=t_HWYMabaADlS-3_+-?>BkMqlm`P7EWffRg`SX*N^vMH^pRVta3R=2u z9;Fv?VJeRoEhcqSyPWboxj#6gu0~WVVk;6WkdzVo!4M$f!5Wna3N(^+ybofPb@sh_ zXFt978NUCT*ZG9JWqJQg_1Vh59RR3M>Da|+CPDsABm`;7?3brqCC9BYA+AtR&}p>a zx1~89K;#i`B_xgTn3gp3(8d6tt-a$f4#&wgAl-UO@hTiZ! z!X6zKMVfc=(X(vCjCAui!5Zszw#Tua;~i_whuPd9PectikfOs=;ysY`u>f4JL)32% z1x049DIu4FwuQ2%Mqx;d%aMju=6cyEMXbiM9;|`-@ZbdGK z`?Jr(^D`r6l}Ti}AH);VhI)q0jIR0q1Mw61y_%+Bn~q)OE;zveuJ`Fc+6Lz{tXS1p zH7{bNk%bQ-J#cUV$^~&_rV?`k9u23;y4vmWEFLX9oN2iHm`0A#B=00x zNC51}ltEco@MSex?gu*BsN2IooB2qrw>3(X`a5KpANdE#zn4!#V>UN-sqohwl!-uc zea{R|&PZTqt7fLT+7~q?(QaY1;=8iW8z*y%&u3l5B)RE#7Rnx`?X)J$<{OKyf}|=- zJ=)syO5fJBI_ZA??hkwhLd~`z$l>;K4UG_Ui0*<|KBjn5K`!4z27QM7&EQTN(s#mK z&csSi+$Vx%&8^ISL+8U2nIXel+J@C)p+#I;)OMVC^b4nM6I}QC`alyj#mIYZoEzmU z>H|~!A2Z~81LCyv=JoDomHS>bZy5gJai+i4Xc6w6eFY#MIT@xumijwPJc(v*8FdKU zhdFFMOa#P_o~HUv&D)-pN(e?f7Da*RCrR*7M4umP077djv@{}kDEgicI&73ASO=w; zn_sD%x9^VhWob+DpP>?sLv#M39F;A1&`tk~8nd<4xFeRRZYDWh2eIa^Ko3V_pu#rw;Zw7QDE;kaBxm`SY={Pf5g9IVw z+((L;hew&Doqd8Wc5K8mkUBc3XIB$6)_ENO(|^5L|pG+Ogf4! z_q4Zpeo($6X<|0h#B>Js_Sl2zxDoA)qvF>@g89th;B}G2Y%*R)n|N~wJl@V`rzwHZ%htU&eG$+C z--hrKaCVpoZC+}FLUIe0%B?QrfwZ@~)JZNgj!uB#Wzdm3)^V+_%HX|;vpaA)py#24 zpcvEv6lNwUYw!_0D9V&jj3OO*B`QMH$WqTJhF#Jrrpsu+D0XGi)faJO`c~Fk@WTIT z+Ib&szjfW3t`u~tcFTT_H9Bp!KKd~X`jUDRAsICZ|3r?v39V?T1;3;2sRAr_t!T-$ zK~eIjUnnpUVU1&r4K%CIMNAXuxq@VPa_@YvRXYhWXDjZqp6@Do)T98 zNK8NKMw7x6w86{DqO9&RW2w5ocs)BknWeGzSqmDYd97sVq`F$AdmR?R|BY<-XZe12 zuQ*Xz>wg^c|BwLkm_W&P#1Sqw1D%G*hb)1=P!g5|3U1k;v3@7O5AfbvBKlxVb%xTBO2BBc&Z8VvCCY#{;K^+3R4Ct2>F$W*-DMAb|`Yg^`=K>^dUk5rbtp z1HD{Q{P`j_pzRAj2aw{mD%fnt*q!`lhPO zD9}o^nI9MUpmp`S*GUk4D~FcV1tpp|cLsDnNL|^P&o<(SZt{n#mS=U9VhwZw8Ub)>iB%TL(~;R zrb2xj0AH5Y5D-5q>3k0-=|0VS+YX}S=Pz_`dAz0Q6x&b0`!*!Qi|4EU`=vS_ zo*QBt+(~M>!e2TZc~}HkyyJ^Ao$hh|_xD{4M1M2P>1Q1GG{g`5I0d|q_1hmJ&pih( z44f?)+8loA!nu##4DR@QuI!t%4G7Uv(pbQ=f76k4tqE9Ux==eQa5K~8dVdsVA2FUb z6Qqq7laH{~Z6#s+#V%}|Kd)@O;l#Mp^&2q+@VaP`plsHh((CUQX{J85u0Hp;UMAQ5 zzC}p&H8m~nwKenL8s(yCVl~*kziAw&(#Rv-hR}-+2akr<)$@NjR1_ATGa3`;9n74e zCw)6m3*Jjt4E)iG)u$_Ti8CjwnPwl43pHpyU2T>f8q^#v20fWHbnYpO!_Ak7M@QjCM5><=WRrO1=i_Z)lF$L5jOWt_AHyLZE; z^_pW#@{_L7#F_hKpPOyE^)yLvqU02=lc6Havh&ou%D-^ohRN6NfdKXe10u;KwI(ey z>wvn)!3D`MkYJwR%3*~nC8t&(b;bloQ+#cxJF5WcC6QoEic~#;&a}hi2lv!6zzt*S zhe%IhrHWAhrPahj`O?zk#oACcJ`-88Xc@x)tzq!XM*G>-YCVBdgE(oUi%TOVLeS@6j*b7^W7t>l(@E8Cc@4Q78XnHgI~RJ!OJu(~*S5VWWYP zD=$~=5H6dK@UC|g>5@bQE+3u-CL8T|$>mj2J*s!O7@pq(H!JlzPPo?mth*B zyKQGL|DmJVf1RVf_8WxlkpjZK{EJp`eQ6wFOo7({nH%IWV#1`TVU#;#*9NaU^vLl- z`nuHw3Ur7J>(K8U-?`#nh>X27YDFlqq$JUh!f`OExa&tD_h}VOKomo^1sNF%Ah!Jm zrZyD){1;Lqp-)+vPcaqnJNO_TK?DW-nKN&P-C}T&?`IteJFg~Sy@r2WIZWSDPgzlG zI0i^E$^`k~KMaR(

    5(&APu?)Qw$9==BNE%r?j} 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 z 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%0DJzD+S`0-pouEU+Q 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

  1. 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

    c2_8p%!xXIr_inQwEg(Xu5EvqZd8|s17)IRd^ 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

    A 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�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

    9h?nW%V!vM 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 z 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�txc5 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
    rrM6Y3!_VGPi;Aj~!#>vB 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ⓈMiDRE+mF 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 z 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
    hApzs(%tO&ZZj2fs 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 z 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

    FXX2d6Ws1?$hkTC4u z3}UyP6C+G=5%+<15kG`_@8h)$!M=jsp)!FT$Jkg6#~>Je4LY}uY(EQpAb)_okn3tz zc%z}9fMl2&$!BuO3@9*LB^;ibWw4Yq4vf zfz*BwIU8OjO3>!koJbiX6R@i!_g>TKG40Z7sVnbW9Ow$|UHHDN)U5u*jvn|BepaE> zl*`_SawO1o`1~iP%_P$?7<>&3WJ^4g>&A5=yxO2KNIDsn9~g_NJDS?6 zmLRqZEXeFKHBX+iZgiP)V@QF>M_J}56_vZzzafr8s{Wi7jW+U4Hkgy`XDZpeb8pS# zP{)`QCe??zseuw|#=Gk&4T?+HVlZu{pL>Ive8A01O-yCjnT zyT1$ui~5EpzCo$ZmhrtG03gT9fL9`3sLLAYf2f3_;|XuMcsZ1MAor8S85s7sBzupdYK3<>O-Y(8QeLh%|*+NAD*Iv_2wZPonAe}K;mn^@} zV0_@NId=vXcVqMd%5D93e6gylGtW22)i&BY@>*j-1{U_*f z&DPARRIQS4#a4NtAs+ccUz=qhN`0$^9P}+=nGq5Uf8MXOM^=;xr@dehbWr#Xwh~qO zcU~VFf;S5h4g<#b3CS-I=={SHb=xEZm|n-KHV~s~WXNPkF-j(IoF|sQ(_y=T0^?^a z)6*kjKm!`}=$hB*2M2v*Wf3+w5TobvM$Npn;YMY#hBtffGx3{Pi<&gI2rfQiJF6KU1B%6_@cjgIHtN?- zCS+DvW%U@9PHeZ7U>Du8HT>LM_AHL#ptyP8&R)fA4aJMN*$lPEF@N8^ zD8EiECclZZsj-^nYjUq%x-qw|SJ}3!$Ypyy?DKAXHiE_ScD;EpH}0N>NdFTA9WdKK z(*9Pr%qcLf0;%aQegQZ5|6y_i1xhu_W``U*@u#NomZm*@`x<6K@Wt72)veqn#|nq) zH=_G!-A-oPEswfh)H!QavHn$@CToV4Vi=qG3-0OB_XNf0%gmSKmQ*8mi`&fiI+nC@ z)-I3uavC5!d2OsJnTMt%6y1pq+u})*q3Q`Yc7X_Q3T+>LWn9j41T5-OWC@q%xaCSA z4Ta_!;vG$WO5V6uZeNhri$6JYqO@bMOOm;=cF_6!{I-^h>f0w26Zcus3q#AO-|-}m zgI)B3y_pECu8g4nx2}l5bLKy8bBiBs{!l&z6?4ukhZTqfcLs9zwq#Ve9c{R6YKZJ6 zTGurTKaQ&ACwe_DEqnB1mcY0eATQ@3E@aS}CA9L&VTt_!ME+WahuBx(CbRw9Nmf?Q znj7#rEZ6IrV3b;NO^+S8rsGU-;c>-w8Mrsnt&Agn;d8;~7}oI{LXBO(KFLS`yl(-Y;h_-uvvE-iy7xbzx{;2wiWoAM_}-J5YXPFzgf3@Re^67Td;Xql2@g>+yOLGjvyXG*%(UNjXnPS?+{P<;too%+T z9`*2`oCdRU3KssDTjtR+vY*cd4;V>K54K2EhoYyYrU-hBI_@z#m}tL~a{F=gzziE< z(XADQhCeDxr!1w)4Yk_zCpPyRU^B6k``#xi7*bGyH}_DGQ^r`q=be4LlFB}5Wf@Qz?m`zRWBhcZLH=L zL_8rE>WECz$&QM?urEgDL?-Su!=wA_H z2cs5mA=DVz*dAO9v(BB`s7N4KbBQ}0Z$CS5el1!~{{*kG-{*OoHEQ=I!mI?~s3lmJ zs9XnUp~#V`ayxa@I4g}!>(-V7)SJwBff$#bSNzU6_!H7rR9Y55wM!RvnB!z*9$0=` z`}vJ@vx-}YoV=FRlmEH}j6Mp;hZ?%ofy{n^?&=DpBW&GC-{U^VAVotWYDg(OXC+)f zP#q4Sj<|wBnbN+0g^7G18_hE(p@we^fX?w2L~w_oiFO}E$mLU~H?nPx|LurPk8oq& zx-$UKWZUBUH`uq^PjhQRNpu zOE%73N6k%nfADfgj#=lIMnubLP=;&NZu(0(7|F?~a*==pvO@3Aa)^RuvuH_6qet`4 z{s25R{0y)~lrX3Ma|3zZ<4WqyOFQqZ$+DJ_w_+8}ht@37SHw^2Z^!_j%tuQzf>BcD zo@$zQFoWk3VwRP3K=4`Gd0%~Iz7 z^2pUB8op*XpGjl=SQ@Si`@d{+VcM3x%iADYa$mdyzO$Xa^Jd&zH)yG zMI!th6@J2dUxwnl&kd|6&5w@7<1?H%=ghglCb+qLIUc_3c75Lrr{*?u(wb8WR@pks zYp|ZI_ewSYL5imiA7j>Qn(e}t!mg*D`fVS$U+^|I@$b9{ZqiJdCw1F=+1O?f``k#u zQhK?{i$@Qu)`homwo!{aVN~SpeK5tf+D6-(BmN%siT`?g2@U=B612cj?ZIWTAOZCv zszjZPEG@Nms^fOOJxaugM^A1+r@A=zQnEaQr7zd?C2qdI*6?Mp=Quj7PH%Dj0N78R z(*4l;x0dVo7}mAI)*mLGRUSt?{UO0A%D2iK=kniFPs%RO zWoMPe#jYn8GIAUC8*KCU=q2V}7!pUC)q2^B&H#a@^zw&s;Q$NFgrU^gGxhQ;x4p>p zy4PA$FQc{@ZEpWIt@EY}?O&PN!X!jJ*#d3M5-J98jq8dm{mvqJ#s{}%Hngp?P6>%b z9{ElE>eA7kMcHMK5)^krMwKi{W0ukHL{=k2WB#=4;k+ZD%k{m%AyQ2gSZ`nrl8W#M zIZ_e~iVTgUKVb0Q!+T(0BQ6TfG%H(CseBOElNU{0Dc@R6@4!jE$PHt@B|`sIJ=`z> zk$UM~H=9pe^{^zDO2%+f=+eH5JJM)+COf@9kh6v_S;6<&u|@*za6|1xPawS#GFOO` zPZyX7cRtv){=vrrL!^2t1lsH(z?BU$tZW<}-dW@D$%3z-{zRVSMLycyBai#bp(Kzp z(aiO}N-tR4%eo|d2#A>wro<#tko7O$ih978%kOY%ESaeN@!PhupQs8C{p_0S7cmWz zoF!D7cBt*c43A!MmcvRWgBbw`&VA_(ioU$~8ca_;(%w>27ze(Zud%5PoQ`%*I)k~P zl)B9FkqQ3pXM7_X`4t|!Za=ii+r+2rK>Y4&ndy4 zG=W1UlJjMasML2_SDoLT_xBCr9hkMlmXvy!G!UzurXS>zAV%`FDFH^|cID$Ma^taK z<_YP~)uVzR@|OW#Pk{cYC+?z?2Brd`y$Z=%XdU;Pl{LlsxF`9OjCvT2!w%r(T4Ou* z7POviAk{=5c6qsP-yMa#FW<1Ae=JdR6mbk2V6!ni#0zX@)Zh>BH4++ZflF$pHOXm< zMz4^eC58u%t)+m2SvYMMy z;O5Y5d%zRf_8HI2!cd0Nv>TxAgLmjXk3=6>U?X>Ka41L_{xNtbYhz(f^+zAwp5j}? zJsEfZeMm;d>2pIFmkNnwJI?D$oS%dh%wxK$#b*?FHS^ha#}Xy#>qXf8xk!yoaRxgc zTnH8qj!lQPZL0r^vp%Txs3`HqX+tD#RpL2ZEg|crvLV5jyi~)CNz-ssnITY52{**> zzIR#(`TNR0 zJ~qxmyw2w%AJWBBx?Xj2b z?^Pz<%z1M-MFMul0t;Ad#N#G|YeDv*Ew~IeG#HtVZhqDU6Bk*1@kvXSXMDBo;v()y>nB|x7^-?wk%Um?0igi^xJ_9 z9lkR&@U$Zb331f6LLx<1Yr5h$9Zi%fVt=h&8$NESoxCo5=_-pnH@ss0BlpInu+)_|j(zANtN zlD`2~%MSCfCs5!`BaDz=28wP#6yd)e?`839(36`lc*rX51-;O%@1LIwsS3b{)Z`OZ zAzGLSgOqYGFj1mZRlU!h70u&7^VKigK`HUAt7svV25h;R*j!vqbYCfD-_vP7pRcWt z+-m*U&HxMZ#U%QilOnl^AG`0(uJyev{`%%UnD5u}6Jy{1@g~;C67c$Nmr`W4U0n+! zonwk4$-RamDp%;#iy1CO<>T>e|BID%h4RP(epo}8E4P?GV{W1g#k2`?}(3(9z=&_7aV zehT@Sie)zIh*u@!E?_GREApDNhOhx4nG1Pw8jj|Itthhnn%mf#nbBz`50x@x(p15m?h7``17rlO`-<9f_# z3JFflo#>8eiilGlw{vkGbfqE7)kP&cLl>3ar^ao>k40lX%CddXtw8vt*Ae+M?7zw# ziugz2rBZ12s###qlP;x8;*1DI_j*5l!Zj%Wl;IN&Xo9h;_}5{h*OvxCa1`rH<-~pP z09(QZnt_l7PGa&w^Fao^nKL@W3qu)m5uA|4Ffyi`9`c4NrVlU5`ExY=S0}Lu;C}QT z;nD8+C;M`DhYljN8ecdszmFt103>y+5}+miV#1%o3x?oCDtQd~0~#t5FKF-|Vs`%4 zHT)6cVwd1n3ULA@Wh9@$SX9)OXLz?J;F*neb}bE(m=p zyz^8Drfp7`A0)`4Ogm7((ukENVRi;PsX#~WLQM4<$s-=17S!J{PCL;JXxz;*h#QEk zQDA>1ib%Z1E@Hf&dX^kB-E57Wt>?Ar7%Ce!Yn=%$>pp*yCNJ(FAI+i>aA!nq1Gui~ zL^1orN0#=E=s*9>@`rMLOATkYSLDiDTbt^?7kBIPNqu6FciV(<=z3c{%VdtF@p;V5 zA8l0*g`A*-j2g`OrwG*e12R=%)XeTKq{pI6EXDz7Nif0vp%#HVt{HqQtiU0Lt$^om zgRsZ-i~Q!d@c?u5kW_-0`L^yKzexzhj*o2z`@}t-*#6pYd(H zsw#GqH!* z1xene#>UHV)czSea%8eR0w*2eJ~qKP#eriDo;l2P)f1fvyHDe`*e_VdkvzhfZ99w} zJ=u1w%ovaFPU;&TD}!*0-oza;GBJ+q;9R^nkgNbgcms+H@#Rd^}LA?{&>`JZ0NCY(dgcSTnToO~%CgCg`k-qH6oJ>R9S*7j+JhIJ}$ zRvmnQFMOmvk|*Hywie$r%65O&5|5GBMwSxi_PTuOzi_2)ZQYzGKrQs;Vmx=(eq8DQ zQ^G=LZ=pzuGUvE0fTPLI>SkQR zoME=j+|+P0L1nL)`)8Aon9v z#BppcspHB$0#Z_sRY$>#^x)(*Eu|{EWO4DKHheTAglk>vn^0GgG8JZICx*GC4k_fw zOiny)V2PJ3)NET~^;&o=**y%|&_{z@ORC8gny*+GI1HiwK3{`g!h*_Vg)t&YrV0@R zFfC8p2cRxr>0|Vo;INsy&6{8B*3~c|doFu2?6xs%rV`l;2gv|tLyp~jW`Z4B=x1jI z>;i6K@5qGoDOr+AF_-$*i;;&sJYPPG`s0?q#1 zKYAisrzpTLC73cLekqV$=(rzFb=zC$XhYN5D}vkA`;@YL?4O@+t=5`NRbL%9Vfs;7 zD1W6GTAUHe$3(#esQQE27&hL3^8d|af+88thLA>X|}>llj?g^OysW8=6Bie z;YH2xdW@mN4Ox>TpPcEOL$xyMFCEl%8!WNiSVw)P#gBNTZ;44(d7oK7txG(6vbsE$ zFc^0w0)*U>=zRNp@|Fa@V3V1c{gt7oNKdIkbgAxqcb~PvcW9ril}YB>0jTB_%`nJ8 z?cr(VDc6bdTDw|fwRlN55k90&YGV4B3@jzIcP-kumbs{{T}6sn9_`<2EYlEc77G7B zK!^t-wGJR!I|?&T2AMy6TL|Pg4l@nSb-Ft8B-&15!cB^9Nc7xhoTgjmX2>DRo_Rjj zlpZ0TNPS8$X=FVF@*RdZaEB*-6o)JCwOuX723R;qGd9V^$fZu{(~S;VE^+N1*UJrW zW;BRGD3Q)eIB499zzm!0fTIJT$92XZ!%gxncA(_c!+v;`tOm{#_ zRH+#d+00V3+`#sol*2G1!*pUBPn1betdhjT(~K{_d+XiHvvSc3%kumWczneGz7O?Q z{yj<_KEEMt-Kt#m8?$bxo(@4tNN~Y-U-vpEY-t0OMYrDFF7@6%zZ{0*eQ*;Dwp8VO zsYwR|dB=eTk|^k8D>z3Jm~TOLL-BvbNf;%3j-~&^oskcmKDgA@wU7h-$s|)3AY+m` z+I2)=4<0Utzcu&1awKN+Q%RP6EmV@Z=i_1W6*TeN z>(GX{iD9Ne;e_fUJOMUs3ggm9;{>zj;*7-1sx~UL?R#eMgS4J;3TGx^_|u zJ1Y2Sm<)yIG83Up^xm| za`W<`Jwf4L9jPFWj&@vUtL9H{rq(sQ{?*G%KBT?YGh&_^{HKdyMfDk{YB&1ZK)gNV zQbS%L-Z*ftc?{YlwqcG4Ds36iZS@I!{!;T;&nU@GYxc6xh;d@7xI1)8YbPaMI6T)f zTMC6?cmqV`7TG~i4P0Z}5*w}MX(xm;VsZuvP^N8tMXA5}ZL~_*yWZRvbvDTIMcFSs zJ_LKib?&4>PiH$`+!NjVAbTd-@kSrvcn({-b&4KABA3Vb{+>a@2VP;&djq{hVCZd} zGk+|A4`~Oa%{A-cs8_X!PWfYs@P(`v3o(FMPh%F0J;q%E^zYzVdXFY`*P1_@{j54KAS{$-ze^mXb5U6 zG7?`X)QFf`Qbq-n!z37DD=LbL|XhEsiyrf~(o?7-@n>qgksYO2zMmL3!!RpRhF zDsbHDtz-fVmx90|6>Y#wV%jyw^q*S|4RsQ$Qy>V+jHN51>oNu+c^wvx^6|{2^CIOYvgvUfd9Rku>!i&8xLsZtnvQC+VogK zvt&%UZZ;o%J*VsbOD=W=h`UZ*`aQHBCA;|?GJjpRdp#;!@_*FJvxt)~v{9?-YgE4U z_qV=QWh&i8d-5+`r5T=>x-1RCu@{q5xK;z~tB1qz0gevyj;V;w?t#E5@ zrfan@%{1bk_9OYaf8IxC^e-L$Lw_W|DqnL&`qK|WxguFOV?Vo4d4|fY)Ot3{Cs=7! zS$ce^S!1^KStwKXx5L%stjm;ji{H=H=ICx}Q>KxtijS9h^R_X$`cy@6ME1!GfqB8! z?N*JB_Snmnzs32$(5UHZ%h64y++|rb2l>3uHr}a9yNqzH-RNG*%BZTN)v|l5cKF^D zJ>uR`}NC%||Z+jpF) zdGB?msNp#Z>`axF)91KzK%h+q#Vpygm91!OsD#tvzM%#;W@=1_8S;>D1alr zIU>nFi!6p4(U4DcIc*=rJ5q{c{tXDbT?T-1g(9<3)VyoK0g}Cr4e9E7c469WR`4mw z*{j`lhUeS!d*f5O--ejDgU_U01SV{&%v=O^{KF^3*I)l2EDUjJKQ8SqGJS62-(q~X zh57GJ^foye>G&GmuDbFkli!qtP5kz^1B|y=7KcsUfK}(4dw<7`kE%T$X}6k}MD&{j zRc)NqwyH3BacA8Gr{Mn(9FhUG3I3LGaA2&1Z4s-8{-{d_n6FjfuvK-g(U_If5B!pwg#RQ<)a(^L3 zFe`VXeY*p$>vY&2(ChHJ_}P}Mc|6y8>5igzXjZHBmt9bLbRz{i$uB%q=}}o}al6H6 zPZm@xIG4FsYN$|fZ``}-@piu`rfN{=ueeqy*CEU@TEG1sHc(C!mV(L)rFPvB|ROCLvq*!p;H5npk(p2ot;gSG=1^o*P$yO7Qt`2|Fekflm00Da=Eut`Pa@7^)#=B(oV>vK3yjeBx3^^1f1!Jz&s7-K?Jdl20orG4wGboB5v|3OOqVvE4 zbrtwVND zZ|^3WUz1V09aG$pCJzUWSA)&sZh7EO*{w+f9uc@0?6P^bxqr9yW;wIr56EMpx~+UE z6?!s_2HUYogF%?z&#`Qw$xWi;-en|6oZl0}L=sARIP>`OiaTZjjypFe+pB8fjXB|~ znBD4pnao`;W*AuoLI5yvjJMo4bJ{arJ;vhqBliU)5yBAO;-Mx~l392#+w#6np&-AA zmfLjh;RGH5E3qF)X}%(23(IV;8vudBInFpsRHly!u+buC_@~eVU3wZrqR~0td#Kka zq*`K|U$1b0)Wp0I!UY>2nIW+yxFE}2_-@McxC%JG@Xg2|EPYE;)oYm z$?EEZaEm;C-EP_K5Psdrv4oZzf@+7`ACkEsMr0f)4JQD} zq#&<28L~T|3;Z5!h4|lT_*X7d_P`cuV4b2}ivs9s97v%J7-~5!87chzZb^epsq&hf zAsds#daAu_qYW6&1aZJ$Mgy>zb^m3eZUY@-DR-MUjH-W+tLQvoZ(#)do(Bcc$^3P$ zxb5tHDN~);-q-}=88*pN^?dez;yfHF&m^=mNM}Ev6#vTTrMeRJWbu$A+Vil4)_{WH2BrW)%`S%YKh@BeBDEc^=sk^VH}%rjsp-IZH++I&^Oo_ z=Qat2+$D(YdrrfknWK{8M^ammGHIys>SSk7)nZ9c{^HV)Xy-&dcjf)!Q{yrsVC14! zQ!!sy%?l4;z(mzxskkU|oJFvQ`>Gc9hlkujhMRZB=&BHs=upTM$>AQ|>b}oBqu(hC z`ti0r2tDw>R);9GNdBswqO$|be|TVi8F0(H;rsHtW{hO^+1Rg>6uFC+=}^M=PNQK0 zznrZ_LgwfMossBAAIuPOtY3I*{m-3*QPHYRMXt(CC@|HPX-!V22S=Bkt`B4OL{S3l z(jNuD&@x$!fms1YfrX&5*fOm)Jxa7PX=!PtjVh}Rr{kWn(ZnfPNV&0cI=n!(K}3b2A}VN=k1r6?A9>DyT@jYfXCR)^H!iYJ{zI$706#|^mEvM~x2$egp zZyz)*@2xktZtr{Z!_}c7OH-@L3w)jyGhLMmstL|ivB7j@1gBqGBM)_HW2U7%^{SLA zs=1=cCxb<_3cCNf%6VbR!YINEy*IRm>TuQ7!c zxQ#t&Y21}TU@-5f^KY+XovRn85d}BpL07c+pbBM_8w!ItwRT=DswCTq6L1kYT|LR4W(2TVftF;ZQ6OApz+0yy-ssa zEeusqm#?Mx{VS|%kIa)|HsVvI7uAc&v2GU+8{9?pM|Gk;<;sjrMa53h@ltuVnt9rk zri=JmU>-aN)fJ6(FXuAoiPEluK8WQYOL|ocdZnjBe-2(EeYP~l3K@Ha?*zsWxy)lT zO0Kl&a2&iW8X)3Cb7qSI1}e*qZ57gJAn?qC;28zR#Wp4X`GX{#{R^DO$I&$yK>$h2 z38+WZva_9a1Ny1T@hMb3W)YkJ&lU|u@*ggFc+2gWybFmhEEW#mY11|z`Ikn*KrlVL zx8`-Cu&?XL6|D9EA3$uwcYpX+AYlT)8H4SI%egWoz_NPQn)T+jjL+D5u1B^Ls%8L<2MDt+7%g_INt1|~}&Q#F%`Jd!AYy#>Jn z(=L2W_3dG%SZ!rrMGZ&4_DUi-f~U7_r&}&xKo`@-j2LKDXl;1hx~!vxdbh;p(16xV zU>^s}MqnOFQLyI_(=a`bk^YM}zZ*C2*3_JS2MK_S)LEnYa-I1@QGGo$X32ekUj)^Q z9gt>8H>75LKWU9D#i*mX+@twD2-nI7X9$zo?jsp77A5pRGO<5iQ;qKYh5s3XGdP?Y z#;?R2hQY02x^A~+Owh+hwAS0yuIQCw12t7ct8_+GAx;87BE@M!Z9@3eMM^xzK}E&? zB6_3bF@*p#40IhtIe13)suoD>A@ObULU})kuw|NCa|}1rz)*bK2cVSxL&&q+CkeI< z5yo6#ZGuRNm6-rF-0!u`d ziPA}v6i%pTCbBfUvuHhl#g3=n7r_}@vo`uAc|SAcj)m9<_x~~WPC=eTT^4V5+3d1y z+qP}nwr$(!vTfV8jV|L~#;tGSPTZK6I}_(2Ga?@|GWR}bueE-60v&BdxDTKMP0JEB zmMjlV@Fvzsxfpusr0xl?0lQ=0_)^vZ+{QTYt^Hi^r|ywSOn-WMuk9J-c_YjC2f(c*KN8V`~ zbud|iAR+Z-aDE|_eoVd$JPW_f475uVd^HFjnurx&yZ$9f>Ew|%-)E;8KQ9x3fB}FW z=5wD+gk&oNHJN~PWGPdVefD<0s#5o3fQ@ zR`m5VW>?9}-Kb~g=rMY|Uq1F>JHg`e)KRfe#;H^uYmrGRkr9)eR8NI0-Y=+jLYv`9 z99LhK^jJNSB1|E;<9iSeYD;JT48*smKHg!V!D6*;B$m(#yEZ^Ivov z7bvr+DSJstsl{HUqigzH)+4V*rD%U=*v;bb0tC6(+?rDzw0($^T;A|L_UfUxT}8c) zi>J#?D{~2LT%Kp@U1oO`rMrJ6)CISwWKHGvGBPf0tADRfoO~Qg-gKZ(Q%49kP&E9* zgt5m+=TxLOb|=irMBJ{XNeG-!#~m@9h8%kPms!_$910c3?2hgU6*>fxS`wNNEUbWT z2D8R&Z6e-uiAdfyZ}&@)CE5!LX4MwF=pX+hfTDhB8}zW2s6jIe8g$TFhzKEuaDh8$ zY4L1WJ6M!IQ_GfXNPtM%Tpk(ukday%mF4KV}ba|n!sv<4b!}}`RjD`Kl|FvRoF#N z=s^QF7Y~y{ohu$)yQUJfi_M=#ehu4htff!(~(b8@G3qEX~t_$~0 z503)&C0?(`mot{8gu#wtTuRvEFlwd;xlCBEsix5U9c^jU^_i;a!1zGY*lv3`B4u|pBdZYAu#IVNGq zP0sgfkg4%)HB_{z)(l#3(hR;hHH}iOHpi}~qowRK)ah#3>v0$@ifiE$*{Hmu*pL-S zxpi6AP04r;Nf}lc2A$O)Q21CM2hxw2{;z4^oJ~ZGC>|gf1VuaWKL0mS-IY+M1k*<9 z%4ee#pj^o7nKG;VLj)9TS!>+bl-DBqd;g8*q3jg1%-}*Cg5~>4F-QNUwp0D_5Su-4UC zSA8_lSDJ^A|^!xax&qi(k8bfLIk#N}+9xJ`B%vO&%}8C)J>x*Kr) zPfs(B`;j)}5P{^Mk}T%QzsI-u%A)MwqCUg`!Cz~(L@MUFVFvgjRZdl{>BRjVVvNrh zoJDC@X(m%o`bG;tspW|P!Z$yv0UGN;Z>;>M{Li+s_umjx)FQC67tvuipj)RLY#`K& ze~x3kN@Pmlsj$z`v*_jJB-q*N8TlDg{2N>~k(#51xt}yVa>X^}*F!rvNr}%CKeOwD z)8EB`*(yT9M8=*OBtbske-T1`C>UTdt!5}nkI19^&FHdTnZ7X34yX)ViWw0GV%fg( zZqylPM@M686JQ~M%vqa+yd!|x}Gz7bo0lp!^dT2qHpq_7PMhqx2V~6$!&0 z5%(#(p?az`MIMaGDB|AUH(rrIq}HQm?Ak_!fg=RuGdUA5GFhF1OrBig^UNAXge}=S zBp)D-j@zewyz+lE$p4@0;(y+`TOo!+Zrjo9I9UH|ubn}xpMfi7Z}o5&E(GT^_2v9-N;1DY=up5%c-c+n>cVx|$sL|Oq*|==W?P^Y_Ev#p=DNnHk z`3hWOaA^7*Z|e2#YH+wP?{dBOMAj3FKEO4F6nKlUV5_T1Q;S$(*d#Du656?lP%NWT z{3X+@cA2+c5`mNIFjdr;uU-)Wnj|*U@4d~+Lg*V&98q6U3v&<-t0$I+F1+v;wiF^+ z`^(67wh=(1J&jb8`zIb14X4@b@72mz5eE5SfT^*$ZxKuIY#8cafxAI;2<5tY@;{u3 zJuI5O=IMdwA-!`Te=@E45x}xjn`-C!1o;qPgL%+W@i$d9t26b+I}91Mkdww)0AsiP zcG(;3y&Mo0Vn%~8kj8FvbG+-$a#WPo=|lRN%Y%MM6`V%QaGl%>1s_RNCix_+wbVaZ0-FQjWy5*(bo01gY^}j zcj~_>xOlQ(4tsDqw?SK$wMN)aH~{1;SGV#-2fp=7uK1xNMSX92;N0#O}J$3Dk z?v{?1FU`*r$koo}%-nI_G&*w^=~(fC`G4iX%dR|?3O8q51rsx%DF*1GyeYf`fd(o> z?VXT8ZaAV#tgN)~uqX~g6n_vH%pXxWw&)(JgJMc{|G-p(Vly$fh&7R6($3ekjUTTC z?KD-VPU{h9iVYrUZ5jW^fVCAUw*9 z*BMo-7fr&1e;+irNu~+m;L`xRAa=%WZ+4V;?7Y%E$9UzIcupLC_y@fhV-BO6c=-^v z15@u?FhCYf@`!yU9Z!FZk|ea1hg7z;UNbb2JgYiA?ASzj!i39pk$}=i!5=X zV>W_3US60N;QkS3&_#JM{NWz#A{WzNfgw86lo>(O#;cc4izR$_l!*w*` zhA2sDiFZppo59z@(-V=w$B6=@2My+BTZQ_r7-hzA_5kPI0 zIK(l776>vc4zDuwu|w1#edKda6AkQ^;n+k#3-Vj6 z9|i`4BD2(T!=Se)pV05h$3;33pJ$72t!w%NE^ z{dO-MYb&ERQu!VSqR`-Iw$!PTCx~RwUA4)-I)qZB|1LH^$`U1%v*6tl<`g{~tva4X~(fagYs)JOAIhe54_#pcOq>1gaUMa_)Kb$Lo@7ZV%# zDaQ4=pSMBq)d0-g`E%B2&+47`nejBU64&dUOV`qArqTv*%x0Inz0ddBmn-4t^Y53( zWq?}mos-a0RL1;L1vwe30kL(zIYbaQHJ&5IV?L$g2IJTkP67m`p)-UO@;m)XOBP|y z1a#*`q-ix(sD3bJfWw4+e%lqRz`#hu2rL1n7MA=ItHCmPWKU9HeH&3CeeB}Gex>9b zBtCdG=BMY}ziSTGuP|_2_cLi3npQSj8nlN@1x9^ChWg7YIN%6nSm^2k;Gbh%XSGk;z=(eWs2k`L# zar$2ik|Ff?& zj7XkqP;aodRtH6sx(MdbzeK6qSVKJX6QRMoy+(iSW&d)pZ&W_{YG`FR8tvj>tlZ1W zTcbmnGVNKpDAQ5r*{n|uY;te2qCFY*PORc^w)!N8Qa5p|l0 zPuL1{O!4XPS(3#0jsBLxMZ_v0Ud@0-m+Pc&D!AFpiTDgN_LjAh1gj`-RL@*y-(T-$ zq0g9C$7mf={RDJXtTfHCwsiCYF%A-yBy4L@%j&9cTk|PmXL=aCir!$9ntdrYn#M%x z6DF~qo;+RF?4E7fOo|MGVf+p-atv4vidhDR2a)v64HZTK+NA-_Wh$(p&Lm2s)ANuA zCE!VL)>~?-_Tynmk|5WVdC1NUO#{Z3&UU9v$y2{57lO7eEmhCusi2TQC>d6@A80-2W`w|?m#5@evc^@@7Yxb786eEy`gI-(rV!7- zk5-35v=-?8Y~Fbq!<)qD#*+EenBMKMS-~s6G5*M%0w<);MxdIvPDFPp8H4a z!`a&t4=;eE{Na6n)~hN_aa^rpH}psh1Fj~CcKvz26kRe(kb^CKQ@r_%KHySrO8{Z$ zSp2F5nvem-Z=Zu$PHg=EcV1p%b=60j@+#7{mudmu8B_i`CAR;NL!u!W?RGB9p4dtB zSj>@Qe6=R#<~w{5-IORgz=hTEl4=i^Es+ZYEQgq5ATP29deAhTc+j;|2ZQw;igP)v z9#PAXpb~a~VZJx*6b9N_CXwMh+(h{Cgvr1oYjqG;bT95A+bra|*|9!#%<)VnZY+6>x}9heXl1RZn1bQeVziSc zY;k!$;5|v?f%{p&%!u2MmrMjSNFQ}{u2{a&CklE*f9>CjP(#g;p}GX6;Wv2lQ2EaAscCuOrs-ZKyK4geYeQa;%s=Au!f2g!t8T(UY7nhMj&d zV6q4QI%AKz>%&~?--h8oj^vXnwtbZQOMpY7otRv&@d85`z!X932Ft`P9hLF#Q zsorK29buhQPQ7vU1@R#lles1M@n)Eub;>t&3_M)3S5s%qS}?QGw_kC1+PdZc&q;-}Y~h z+*%fw|62#~pXWPei1X~;<`A=3#O-38BECAlX2 zbTiXCtdA#cU{`d}b++FC?RO!KW_fD`SSw|P(Inj+;+)NMEn-9@N??_d(>!Mi_uEVi)aAjReYg+Mt6dv=o7^iE%Z#VGy-L+owiR%|F)#ITiLhQK2}2wb zwZW6ItiwJy^566MA9LX|>{ekFuUb@4Ep3mF9%@LzBaveHHt7*v$@*Gali#57WYKwu{o9>zw>Fjw7ld>@;VHvhZXBB;UU^gZGb zL!nu=D=P4esVHgBaPId#S+D&PHeq(^VB~ffepVV@G;8Rr)yDB-H1N5u{7DqQ|2A~7 z`oxz`hLnF0bEXEi^+L5IC_5LtQsVB~se(KFoc}qhoA8pRYG>q3$df7s#MY3}vRvex z25)?13CIh%IP@n1O=qeqOTXPB6y1=0%yjT{xl{var}a2;VOHuj9iZ)lqy>$L&wkT~ z9Q?u{`VBl{EP~lFuN%mm2{fT`o^KO>`xAr=txiePWTPxxHt3-~la(s7emw@%|Dd%a zHthHgoK?M(;iq!ZeXAwt&DxOdC)a7P8Sy`?({VgN6Q$q7O5ZwM8s9d0S7boa(pdJL z*JJE_e|)oXBZ$1(I~6Q$8l)EaJe*;W%@BoFX=L;$%Y zZ&(3s&ew_Nwk-my!24)=!_JBMVxl;`TKj|xHQcYizva6!ipJO+i3=NUg!t5d97Xhc zRCL}{lOJzqV#>p7*OBNLScyI$)Y`!}2X$WJ-v-|v2+;Qn+>ZS(_rD9-#F zXb~`cQ=O8Gt)8O!pN`2q2y_q@lRD?pTIS?TItJ~H-5~e7F~|=2F(dFK@|90U?)k@_ za%k+idXRue*vRcPpr(|9Pk$-7UJyGdi?qEI=s}v65>^#Kf*L-y^V=`a0r;Pcwes;! zuquTM_%?wPy5X0tAJ_RQO*RMxsqT_QW=G>?OTvP6-wHNbiCN+M^gD>iKJUEaZ8;cz zX~>jG%v*67I+;kh^T-iHLo#qH2s|SvY0k@aZQ6v18ZzAedZUaLw}rrcpI63* zJ`4+MA}tM1zw%3v6Cv>N!NyuXx8ZP_yAW!Od91;Ji9eJG2E(OkpC{n<&y$;uZDxtl z02k_%kcq)3fA^xip7QFQ3*9lgrm74DB)8o!l_O~1TXeN4p-H3d?I+sUg(`P)h4}V& zo;?V`R^nFp4-sJ#4$81oMD%|Y%3a{X|K{x25rq#ZBu)%A;SmM7h-Tbl+Z<;f!l|d< ze)w8l)1LeQcUen)&DWhmJ>121a=%88z)e$eW0dVSD8xV()5blHht83X@#yqob{SRrYYSko*J#_4C8^=~| ztd9sv)J2r`-;mkrVsHk8lMs+;^blaP`#eV&W(^4jF-%o(`BB-Wk9ZG2r)`z`&S1-P zVq6I~*8*+03qgON(5O-YTVOvnGPahun;UsDW5&C#N25mDZ?5C16gL9@9~s}rX-Hpb_xrV%!snEk z>?eHQ*JG#OqBuI=H=tHWa%O5veIWf~BX?WKj8>PuwO3W=3Wtl+MQCwli3}Hyuk>8W z?8+9;HCW*|!%l~*&e^E4sezGg$-&0P_4!%`q2?h~LEENz%A;({RL{4@1BCc)V?z* z<^VRVy^X`B6u5G`*?Miv1rk8vibY)%)-R3fZMF4X?14A zR=cKJ+(i-#XE$KI6atxmN=!-AuO5A7eij4<7mZCX-3LBi?OLylT054Z3pe>h{% zu16kjqpB8chB|z9Mi28hQoS77q47B4u8VGDfj*s(8fQ{e&ggu7-9T#Tv*c{hf5XCG z@*hb;ud2_%?PI%P{lYmpsFGAuPRWnGmx(CL>-q9k%xTx%*UYFGP}#XCOF_Z<3skpL zoNAhM!hcF8lZ&|Mn6y4ITw?$Z3BNeAaJk>Hoj1I!1X|Hk?N0$QZ!)OH@^wHo+?yx- zByFcWLg0^Dz+k2k2cgmjG;~>?aQ=M_IYs(iqxNx93ox7Yd8G27`n+m4GxZUahmM;I zxbFV82P`+zegBiEC_YM*tXHnF{ff!k2Egm_y4}@lNlnWUD^_cb#>My`nr0XH`h6;; zs#bQ}I~q}1(6q(zalDZYxbGd8_BOw2k;!#8y!Q|tV@3XMCn&BIBESmuo(;-D3N4E+ zb)P$8P-H|9ssVj3afd;d=G+dtOg5Vnb`umC!=Ip@K`H12MdSme1gfB#FRDuatG` zeDkPqrQ7LntXs6%1zv88HF(>_#ii9-)06|uT5sTKXjkRBKL!l&DF>NOLWqy-?(cRn zG_BgQ@Yc0&$y;7YU4Oz~ztC2BhM}FP@k6PpY@R^1_iei^ehFBp%g$62;~ZzO}m+gh(x$&*-Ot+tx=evgRuu~`L9iAf+< zt}ALrcv81;64r63*LHyh`4XP^<%8h@7izS48KFZ2HqlLjPY(;kq`YYmY^-zN-7_M%oasKZbfTd`Fq)El1OxAOjZ_idB0)jk)92R1;NHl zsP(ZWL!#WA=JVub?cGk7U2liE`XB;p(n>`9!w(Dn$eD!YXk8+{v^24Um7&wy$+tym zd#c5=8IeapD=SliSFMa(MWycy!l=m(EfV3T6YXk){~jBi31zQzpiheP*HFuytm2z$ zOIPcPjfpIq9giBbh?^)f>t!@flVghw53^t4Jb9TN&?_iJgHL&3>^K&S1-fY#qXXY> zMN#viq0WFCh$g1=Wdjv3-XCHZgtb{vE?Y8OS437yw7c`)A4=soYlJ-byZe9at^d7l zX9V$Irgp#Y`96<&y|vduzvFb4kE820A%yXWh@T}A|MV~zKC=q=2Txta?q1^yQ|iAp ze2=M^i!&0h(-3;wKF?g>eq=$B!h(anh1azC8t6J-@RYq75)yd*-XA^10TE5aX#X_9 zUUXo?xw}5aDAC5T;#Y=S#C?mbAW0&s6+0U11TsLMayViaQX7e>1WWd<_k{D>Y0dhD zhi`)s-4+XnGd|AiN%Z2Cb-O{-{zv%9nKFPEbRmcTQ=ET%TR6Ln ziF5=~{Bgyr!~9hTQK2FNOT~AvVZT`kpWV)+*TkYr6XE<2axuMC82A_W zGrPYU{s}ea+@y^dIZpfNoYxnbX>-nXO$8=3ST<$0ZuyzpArsB8%a^nhs~69n=&hr0HT)lK^Rjcca1l3k_&iyAx_&vVd}QK%rFIn6%^RlWI$fV=tx6} z5K5YXziVul#80M9EF>%%bJG5P`dzR){4E}{#!hL}fr*F6X+z(OApiCge}|}xKzcaN zRm#4@;d>B>6Ry~-!~x%cL6$yxIzsF%1})^5!3U$JhYT<2_gQ2~TYP!y4e;#Xk$p`= zsQWRI0jJ)>^n(EDK&jpCJwrmz>R$xVJ$}t|aq_r>9+{Jq>hP{YYU_t1C1cy3ddsti7kc z!^8he%YerTb<%QMCvDB&? zdv~AiZUxC`DCzr;(e1ic)#hd)MU4rb$8%S-RBe9uxrfZ}5dM4b=%%WgT@2UD&f+eK zulXIi1z18my;XmGFVqj#+NI0M`S||0y&wjb%j;`P+r!GKap5AcD8eLqaok!B^1gG+ z*OGirQ)l?nLl{ml~$>#+H?4Aq1WeaeEle7oZz`g{8&FozEd$I{7t?B zXn>NsbFML9Ac;9G*yOhmIAMR{R4TDi9Gsdk>Ll`_yi&EQK<08Ch>ZsE0=~-=R$+Z} z1W7P(f`pk!F*Arm4QkVHC&Vg92pbJ#gU;x4);8y#Ze%G@hqJfl<(Smmac6iQ_is?S zAjNu13<0sbQ(9Wt<`cWG4`IUMlcA0=Fsi!NHF|i%SM^ua5`mP7Eor)GDrTHFLn9Lv zV?_&ecLU=)Px+IPg%*0$&QIKE7XK4%rj-84e^r4 z1(e(JIbWnzGaTf6WZtbz6@H&qtFc#GS$bPe`7hG7r8&#Zm!-4WoJZn@PGl2Sn&s7#5_vh*1i$k`wnp57Fey?6#N{`q@ zI}>kX`Q`FMuvaQ>cu!72D4YrTfFl-Zz4boHnDy!k*Tdqp8Xsrlq6S`0O^)6Uhu7|s zuUMcvZU&#U@`?OJ}@F2HyFGpT+e_GyaxQI3Y23xLOGO8R+=&6K@Oz#m@# zp@?{MSFw=Vr=R#u? z$DO)fHivpKKd-s_f%ZI&8>>dODWl@rzUT8XWwZjT5x^CD^OQv4AQ)elzyC|hFS12EAVmW}YfYnv%s>v(5W&Qi*eqn&F>B7b$ zY{i;%L+V1(riLT)7Va3v$xPHH-!c}$jKOUw;RarESw3!(akIMr_h!H%mY~BK6%D!b z>Na!bs@Yzhwi%N6FWfF?IH~#$3Pu^w&iVA+@b{*g@npm?O9W%cFpg;p@X^GorA4^_wCkxas)XjP-jU3o3Hw}FL~Iywo zzPr!uc`5*9vD+g|>}Iv8P$HSxoi%u(uD>dDS9t65Zoc~DUNl+roHmtJf>b!H0*Y>H zyqf1OW~EW!*0mcmW&o@@H0NLRmE)Z-CBWE+yvh@~ipZan%Yr zwS$Mzd6eu#<+F3CgJsk+5%U2(!jTRyZ~{EnWku>o%Euf^_b)iN-4Xt`5qcg+qno0yY&zo! zI1xKswD-JvQ|81J#nD4u%p7;69x2J#shm zEEnsvYILvlr7s@3ME?-whv>0n?~8c_+~*UL10~A6tVh|IlnGt_dgB8-g_se#AYt5f z!f^N6-$pa=h#Ii|aqZldAjtTKniA0?#{O_GV&l&q-h>f{+GE%@-fP6XMgyr}76Ak; ze22X+YJu1y+)oT}LaEsHlr)kAs$66sJmLcmH_9ZnN~bAvGD@I%q9HuC&9p<1fXfCF z8Ey+2@hB3M4hY|bf~aD=FTGD{V9+^iBa)fO67O)1=6%ct11bw)E&o#=zKo)7%Rb%2 zJ>nhi_U?ZVY==qVkjOeSu3BClo;@8g7(Q?_-vz~sPj^T+fkIKWxM+;rwLRym^Fc8i z4&in2Dq|vGs$46-jg5~FDH)f0uD?o=b>iaBP@Zkq@;e~ZUg=%2ybP!OQWa1d395XbB5s5}d&NGu3 z6kpz}qR4-V<~1=qWV_C~$;KZ8hWZLjq}}W2)rF+Xp$`avz`TUvAlx5X(PY)hY!}!L zf#apuF0fofG5qu|$fVY}c05ykA==N*T_~hQ{HmEp-iL%5sFYXI6@`YlfL+;aAT5k` z=MP_>wsKKX3KgtcfmWoc40vB18nTLHuq)e>16;@T zCNb}I7-iEp`Ml_v@fC96BAX6b9|ov-!0kKh`+m_CIchBVrp)i>a$@n95~79D86@37 zn`Equ2@^(gW~{Gyfl_DCw~$80lErmkiLk>n#KR_iAZDj2_h4u;?MqElPjzM?pQIMp z{N0vmWd~2Ga8xaMzQP{a-u}8R{-?UEAi8E_wf9~YwQr-!qMt12WwpN}mzXm&5yN^$ z|Eq?=5aeqHvCU-U?uNUUJ?KB3O|KJ(FC5bwUJ$sU=u3>>H}Gz&ZpK$e4wu)AN`+I1 zp@;2WU+!To3Yyj7xG~on6Nf!Vj+3-P&D?d>Ex!3}U4J`&EUUZ(0jCJselnq$5Mf!e zjE_-w3Y7O?b57Cs0CXCjwpLQ&wB_5vLZNR%Qz{nL=JD+35Sg5xL-W})-}lG5(nYc7 zj%B}A@oWaqXUuxRzM#vf{uf(m399d^C3K#w$&wgSsCU}oa)Is<6j>ba<4er>+YsQQ zcFXDLcE--5X-a(2wZ{IJfCe}w z&uwwv=jx{mks~v6%d6Wp)FY#Od*}qiQGnayQ-d@V93O(-N0u`m(qaM%28so0qv4+Jf%&Yl#mPKjZ!8d9XS*|^R*c4YJlvUr91 z&qxRuddS9cN`tmBzwWXRTo{fWYO8j1R{Sn3FL)OM-h1q~)Fz?Z5b@Zy=B;O4BQfq* zKrI|DM%BzJs#{Ge>Ju@{IhyOuG!CP)lT6}r_TD7Ls9Sy^Tyc3{z&C8LrQNUCQeQt$ zQ=h$!l;(tYJnuc0m(@h9;;7Fs_$OJ8ouc%Jc2nT~fJp?AWY1vIEjP1S?RBT4Go90=q0oe>6`R!*OjR*)XU+Bl zD!Q5<&&uqR(d5y(pnzIfXoJPN(!@f%xTuVW*TBb{_8iaGW4>;VP zW*>-l7Rlj^tr(1}Fib##sMX&lAvFAaRldrnjM}KA&s?o|$#{3@h!2Dp!S@6vxQzZ7 zQj6|7p?gL(4Mxa$I&HF3&zzVBM)6T9s@b|PAmv)0GWC88vw9FJRT^p#e$q9^O=N*b zvIP3FZe+x5hfV24e*MrO=k1w#Nhe5k)_C6BFwBf&SixhhS^*#D;ox(@H- zahuQfJm-6Io`za=@V?>t0$i0Ku&m|E!JVE4tmj>nP&1u#bd@%U1BwQz3End50_jRU|v=HsFZ^?(*|O~gQS1yVJ}6f*{8 z(*FyK?g+3%Q-yZuSZ$5$5c!9TgJFh0;)vu>bPF?KpFFjR>!H&JMv~ZOWdKeElhwhk z@kJfuLo{UpBYip_7CwbYz&=21DHko*0rD^YOr}YfdqT|kPg;-Ho<^ujP)z>6p(|A8 z=$Zx0BqjCR>Oj*-40L$tQwqaQn?_SCVQnm^jWvU)AFK|1!IbbBDTyIwoQS~43u>p* zo#Pw}C0iU`j$53! zD}EMh@ck6jBxN)9I|P%EJI1s0kfZipK+0wt+0VATk2i#?tD&a7H<8cbz#)g^@} zKm>0M9oh#QPtlc>l(iV|1lW@8Zg-wSesnr^_Qr+@aK=W!847)0uYoQ`;$2nFx~^!m z9{|w*^pR=Kt^0thmMRIk&iahLFXlhzqPe7;BV^<*XAA3PnrDa>K@_qcXfUjT!6N3` zXDd67XO+uC?iyr<;FTmBV9N|EY*5;w@1ykxO*lEvgx2f|!Z~{3I3OUE3+hpNSNNI_ zi}AQ$=6HWO9K)sGy?%Ys{J+HI?a~2luaEWaN*`|hM+ou7i}2FM%;?zq zX4U(&%lGlG9nDu&Nptx*htvLgAVf{}Mc%cAQ^4-;&OAKc_T3L1<1ng4FG#C6MB*zx z{TG;B+Lt&SHj)japcPwGXO6uO zUU{$G-$mLK@ZT?FeD_$1ih-Mrz~4V3vd+@=+3%z8hyCui$MeNc6jf_h^sygyjSZvR zYJs$IU|~dcKEbGztf1plf>|(^|JeRf(A1TMebsQ zDYLC|ffpzf*2^)+!mN9+@~|XzP3U_DddHV7(-=!~64nuts)st&LHtz##Fxv%=5u;;Eqama0W<9;WV-`PRdmCG3Bt)HuwE_QSeN$}Nn z${OE&Ypc!1fQOJS0RGrwPVsAsk*45FkWQ!DmQ@*xUB28KV^vdQlXAyw%jzh=c<%gM zg0Hcu=_8(+>M-^A%pQu;9?G?jrjCo7`<|+?@gWa_+d@zQ`3Jm6fRxwy(FYvoLqI`x z{rZMh?Xz>Q1U$I#sO__VtQ4f_!ARgD3>Vm2fMB(kCj~(1-f(;Wze4n_WWAUp#*$xZppUnf+Hm*zP@HB0y`fnacH; zb)Cx-U{+pBuoCOJ$rTH?H^m^Ua{Mn72nFJJeQaIV{ZZAWF<9f5Vl}k2R~xIAGw-8u zalYHAsG=3s<%2#xSAL;3-`ldau>w zZ7)q_VxO}eU zedk{Z3~KHZKnVaZVyl$B&c89_)e55z{(B1XpX=?8DF268UeB}HX2!`k%tEc95gLxC z9W>vKu0A_tY`WXc0sqY&`a3;nuz3~pkUQ|wAgx3klg=yG+jOukMigm^Y@&|)7vrY7 z&M20NxMk=)1sNHV00Y$i>y@ajLNpuh`Daeusc@I=mt8c9?p=MEhAK(TjLfVxnOJDB zZP&%2P8*F-f!89GtvV) zby`ATWJs>833@^oEXl-Vg9O6vFs1D?ozE+WeIpD)C!tQ(UjYfLabr1s;k&@Rh&#e( zCH%WY3)JDQADF|(&$mx<0V7CTJqjScM`{+>0m#yX_MDV66f}hB&@aJvb&I6R4>v zibtnCQF+3qoS_9N+~H`B69b{dSG$LZyWT++!B{QQ=JfnC6rVh zRjHtIO9^nS;17xDT3G5R)$T29!t47S%FR|@%oz)?%xLvI-)EdS5a44hB%~VDP=Kv<%D11Z^|0n&kzFoAJgq(t6*Q zY^64MOJ+Wn@IXX;q(-clxb?p$G#}uV=rb&tk!Z*tpv>|3enwh$mQwiBA8P5Rj)w%C z-+-K}OjdEBnzxVkE$UbH1!0%E;;P7&*ZH??EQ@cE=UyuPyU5C*^8x3{ebFhXa4lR) zqo8tL4%>9$Bi1gCUEs7|b`E103T8OfN~uMD_V>GPoJ~+`9h49mlFH6z zpAMayConFTlkgt?G?D+R>!4JE&b$%G?2J zUR6KQ0lvZnA`zZA&LrJ0X=C6E87DYDX8}YVp(-AT7x{xnpE3xDQd9oRJgL6{J^BeQtBO z(n8m5U9@3a-1T}-csS!yn*|tA^W#U;+%I;fQpjA~|HPa$+KmT5m95sm>d5+b93&?t zZVb>oUX>rL-7VVPSdc8AO;Sbn=(H^F#Y&X8WM3{~)tJZB(mo{9lv z>nEius<+i$*Y5yQJKA&(RNz`W3+3T{4njU@A5+J&s4qL9k+dMqlX!`#_3&ZP zYBQrfA0J9=5v#4A)g-@8HvLz{`E8g<0J)-FY8^*8;RnIJZYm-A@||zhK1wYQZ?`x+ zLZybqwwV2kA9};4K1fpzMy(H_gSa!GqC*BL*5?%j8uj^)P0a|wkDZ|FgG+_lFxVy= zOwUNKEMAjh2pmDb;4z-08b)v-+qx)SBO8B|t*yyxCWQZtqqvd-f6o$}rln%jG(@INd7?0uCE?|HHo>=2wV zg$S^=0l5xy{^94L1*-By^CK@(#il!yyyVgx ze(KnpuDml(I{*Xt()L|9)1ZQen_>Q72<{RSm^LaIe#-YaU9OCxtXzk*1ZRAWWPi}S zB7PGXHT?gC)mnM!%lz!i94E;ESKL{E7y~NTnd6RqU42CS6&wCRhE3N>edJ@+C zJOgq=t^+#)&+>O4GgmkA1;n`DuoC0(Y)P1x7H0UHchHeG^0dhxJBv`GX$GD1P5!Vqsljymzj@?b*-#wzBQg9$ zP$AG*WAPdkwE1vO>SO}cdxUsmLKA{)sUur$07HJgY}@&y^UHMp>9G;p$_Kc{D-DGpS^=1{RFc~GQrazaxW7765co7V3iS5C4xDTifvqVh^wHBR^LSQJ z7la-#9*TT|gq$sLOd+cj=doQPkEs6|H;qc@{^8uauMj~XEyx8OKS72%+y0F1NudJ{ zFne%|r)MGV1y=GtO2FZn+<+?iHv#gy#5_q(vuEpPH-d&2Piu1^4?xt|B%`;5x@7AQ zi7dP3G3K^Y^J`CL@J$TR-QI2)vtgGyfjTx;;Lx zJDs!J{&FTUa~Z2C8o+5RH0>xtZ_h8_FCF*{UhpDm62Ozalcf6Yp#|;@lT2r@ak$gz znx5?*>>g)nb>8_ANff2nF8FRrIYWdxu!k<4;*8&4=?>?}Q&Csexj`W)HDY>gLE`+j zWaSw-h}zgr@h62bzE+8$pdG1bjp#9xik@72TZsZyY+Rw>c4XF+O%0_;HaE9G&vWnO z@}vT3ECGjZV4j=Z$thE0QT@GcE3y46eqLN?mYVgd2OOd{>3zaR6(uzdM-{~(iYM2qU%W&*G>q}CJJI=f{&Uir=OZ&3g0G6cmez67&L|}2f*)&> zGBJ~9bA=4AREg$Gu}iitGT?UbVeY-yGv<~HYJZ>Cq1Lr=kZ8PacdB||FyjVfp-b2%qIaXHP6RedaA-B_Qaw?69gUR#b6l9tS;}MtD zfh&DlC33(=sT#6$%#G6ZWJ3`s;&rd+Zh5hmTwGL*n8|6o|GwK%BXbRzKu9V)g)Wio zUY@wPai&7^Rj+8LqHnSPe1?izoPBX+NDy#fFkXJDtqT$#wXI4~ukL#~)6|y)2dH&Z zmS^XmL#jAANe)gcJXt8TZ+uTYq6NS#b#{I3ge_~t7#ud;c$5T1TLo#g&)OK|Z*Iqf zp`EVTRMtl+32>lPvpP)KVcA=F!+&rY{X$tUNiX;Ze_(2N?5~IzT#;9hdVnJ5hf@le zIX%O-4sPPz@_@|?9)wMsTH1un7`5rS%&zqtF-ep*QiIT=M>B=3fNdRkWG{Hc4j<({S8CO4H6 zY;yc0uD-mV<=fY#*ZBfdZpj>x)vsgsvH3PPI>d-d0g2&`l&Xcy#o>d3{=U~#&8s(c z$Hc>7Vo}ojZ2usH&Ldx_zw+KGF;FxJcZ}B)RI|^$O;aSe7GxUBlMvrlY8}^~F+#}; zYP-W56vgER)9N`J$%m$bp)@N3MZCTDpHn*$;f&CCrqnI%8qaOF_r6XuYGc3h9DpE- zoRrJTJ-I(ziAv4l zV2J+F6(%$xfrbmaOF6jJqq!xp{XSsY#*gSAdiwEfXEXf^g)a%JV|2Ii+l84CFbedM zLnP?VqX`k&QyJS+2Hl?|2j0R@>p%ZK^wk)U`iUtWd^OK9ycLD@fY_0)U!Y^Dv~r&J zL;i^-Nfw3i5l$&HG(|!mv13xC;6(Hy{W{*nLhu5#k28oPMGSf#F|^>{lmqV4No4iq zyIV8h#r4V6&92^)PMCn7^oE99mkNcMr7mnO;X4fKg63t>Srq2i>~)NZey-K9ekBP; zdQr^^M!zRSc+cG`uC^0ifmIgCt^&7QePC;#t1Lk5-!HT2l7skOzZgj0LBT3=f+}UxSb^YCW1v6zrRlSTuvl(jvE>HH zIA9sUi*WkNa>ccN<`WL0$NZw^=5>dQ(tBab?a-Me%~nz`<4hT^$x`esUplLRO>|3p zjzvyx8Uek@HVY`|?0Nj_8=%HIej;nc8RN&2&CvIp?u0EtM7J8iyPU^s*by{#3h{4f&3ZE&GZ3-L9{S+(N7PNEWd` z#&@A7|2C#~rnP_c(4f0Trdx}Xy5bXRC@t}L#VVdc=xe_(q4c8ZRZ?&!YGgwWV1*fs zx&3v8r|Y=hvyN3MAhahHg$wpA!(hxm9kXxl4p`$xehJ@sf}6I92KM;*ArM2IxAip? zHesIoHGBrIc`;DxFZB(;g01|)FwWrtB^>SVR!EVKbS48_6(1( zap!B!-c!c;|FwSz1Fic=_rF{1D=+X*e?~gG;;(h@H+{sjx(B>T$?hiFRC5}jJ#c_{ zT1>3EgVj;bX$a4f>2*~A5s}k-yQGF_944gac=v&FP_lE^7^gaqwp#N{0VTdTh`|gy5)f(9*oE|FbwN{xlNl_SE+3Z`Abqno!ei!wUK!PU4FJqM) zP4JzVn469FV$|5km$gmJU9XVvkvMWO{K(btpsgGc??cgT}Qo}%kfV}TtcWE z*C=nj@Vzq<+9YSob7GidB6%Hj%`_2_2dAqUx_$;3Bv(ia3FTol%#2K~`d_|;*=EY% zhK{Y9-Y?=W%`6lY95#JlSJGKdv`>$?x|MY#9w)TgpYywIX{#)1JkDR6p^3S(J7ovz z;*R>P_Me(`b|(*|h|pO>3zEiS^uMVRe`_)=cnHXpBvpMALG|545aA~u9!@e9#cgzx zyUvn#)-FV07Yb^%YJ7|mJ>2nIp4Hi$4b4nFrhVrrhodjF^DIrgACj|M84L|NvUH6J)WZts8=R~V6j+f{EORaS~->iJuviOO&Bm^#KXo-fnc<;4u` zU&RND#h(Wf0m1Q@(#?y(OzVpm~%L-C(aL zFwbel$Up(aUym6>y@E+f*@7<-9^nvjO{1n<5-w+m8Y5>R(T}T1x7absH*(hR2W)IS zvkyT#wQ0q|G2OgruhX{V1;y5E(T1QC$s7n91b}>ejStilO2|@xO*`0A0v?El5GH>) zMQR5YT$L`(Jg-95X|kStNL9@i2!SBG3niw`2*y-<6nnOOj#t5=LCz<;t}af2?q-i| zUifN~YyGZZx^tXwzkDCQ_?UXIHyr713B*!**jM5+>G?gr7s#*2jijD-(TqN94jYy@ zI~kWkOUwE6XHspWFbu$lzCIBM+l)yBLb_C#bKb!Bw`2QV^aDI8`b*%54$A+Uw?U&{ z*oHRY>*{S{A?;Rd$jc8Uhpai&^(_A8=|2U+ryrp2fuB4dg(8=g#mQe}J|PrIiN15g z!2Pyr419~7Nf5n!7a5@2Q<3?s`|}g1G;(WH)YU8Ip9VZ{8DYW`S+yb+2RG*k=*@+w zU*&qmIDi4Yhzm1cL+G%XP zEe~JlF0>Gf%2U}05<9{zptTpq0pWoGm5sv#0`@A)#BJcuAtIN_1Hn@|DYr`}-=Wxh zTXuwUG|Ck*Sf@>51U>v{kz@b*bzt8c#_1U&q8N<;r`DdOfrs<;O$Z8dFZ=c z*ST_zl_4brFc4W3#q{US3^*z}#w3ao7D7g%ijC!>rXnRG! zxyX=tIdzAKHSo%MSKK(Q@32*5eYqT;1U?E!L#jHdQAw#hsTt;iJk3gFR~*5ehg^qm zS`(FW?q%d?Tn&vu5NE&xoHtM3QHW|6m#(LMkD1*z8dtZ-IL$d=Lkoq=aAp`oKP=A< z#5|c&PQMJ&9uoy)u|03E%@5FU{+NT>B1W(dN@zBkj*93FbV((fmfC28$f*lSiOBg| z7#?`AasuO+oEpoo1KM+$!;6kt^^ivJEb0YxSf z7@d{tvH(RM!xiv{-KpEwJ=a(+$?~x;u`CvfmUMVnzb*f7KXaOhTa>p|bB!@pBmWg& zd)_o-?$8!!A>>Zsg>)H_Y<-eGDad9k%m7;^K z=~cz7eEn8L)l5~~ib@p0)ZL|Qs@qo_s;Aa{>d4P^7DSjkH~?~}GL7f-B`y(Ekzeag z<7fOg{Mf~k{azS_$g!0IZ(C*@Zjds6WUN@;U0*XDaKitEa%TtgkIqE>lYEsZuwDy~ z08RWeK{yaQw>pM;hx{D1xoY#1pP%)Cp#V6KWzgsMC~w*LA~h?=6*E|?fs5~g%Kzj< z&yp!}LomleJF)(GqP#m9vTl9DIVm`kfzwF(567#CH`F3Iu7`HJi2Ckoq4}6^1$9h< z&jK1f)^MX(dD3-O?zG#)^-|7)hHn}Lq3V>h1~Kz759L?)-iA$9yUPuMSL6TDK>v3; z{Xf-pr{9mswEt~~-PVfk+3VGh{y_a=$bNb3>&JWbalT$@0a_?6o}`xg_j5SWT&%Ua z|1&6XwyJdar)%}^F^B4Bg^ZTg@6@a`;H-%S8Z!ml3;2E7rTg|i+x0yw|L|03RAREW*U5VS+ar9^iX_M~CE`V$ z6(#dU>VFS`JgeO*z+?Y2aT|77vLJtvzNMkkfU&xu5%x&>4Sagh>XjxYABCT0yr7)Z zf;@;|Y#G~}!rBC)8;hqD^YUCCtV)Yb24eIJbkiine{1q@(D=b(YVx7Ia9zlzgj zgpq3XOI8bGmDd|3Y%C||6~SC_IYli~Ukt3QuS8_hLg2+5z^zY)YYMRx3pIiY2}+4$ zg#WU}kKiayV2lp#z{=CAk9xqHmHrYRjo}Umk0Uz?V>oXG_@|!vkt88^kIjv`=^uUn z&1kOI51p@Vf#K{`vNt94v@M?dP(<$K`ROo`sEZDd-TkTh;>(Nf#ptnc7rHA)XelOidZH;DJuji48SX9)rxC#zo z`m4vMt18$o*mlk2VW&r}^+x;si4Vk%FRbY@Sn50BHH*aCCd-pN-G=F`OfIiIVNV;g zvLwo+pPLo%*eCm54A;)$el=iT6&Y7+{&Q6~p+#qx%305^2ZZ(vYA3Jggm=l_Hy2PM zB2e7vv?U*3`|&)_RGOxrk*TR!492wg)KuDHUyIFMH#WAF>XaCi`x9P`svS=J%gIh8 z3Y2&Ykyy<1T{k7)Y2zV!wvL7;dV?0!n>?)??F-A4tMTq`XR=*7?4D16JG`!|&zJai zX=()b%BeV$Xjk}CF#}Mv7Rs%MFNtbtMssk+3 zEjLeBJmq7&i(;}o8aM5P+KD6moMVWPa=D}3nn0AWyX6M@FWKKfs23x>W%2l9wufL^ zIa&UMN}ub3yF_$P_$}R0zkz0Cdt7 z6N+8k4wqXuH1L}mzE481ZmG?&HOo5ZZhG%3f_ZP9Z{speqE{UJBqo1C%%tk3Lv*oO zvw2L71KZUV7TBVS)+%c>xaz3R1HH@L=<-}8CiI7&z;o*t!JX?Kz-_vi*Cn`MtU09p z!j=L%@*Oy2#H#X;D#K=cPm98^<$f#I+7cK`w&S?44=Z!X;!0+S zMLNxVif^%hce6y;^`0;A=h+hE?7WqJbB-j2K7Lx#fYgF-aq9&w^cW5tCY(y>&(Iz7 z6tuD0PA^8Mo!yy)x$pSQZ+iC^_L@Gn@}}U6Z!$#V?!&2a$Xv(EOXYk1dr49TW0=!$ zm~s}zzXRPYUQl1P{uBukBNj$yuD)m)q=0GJP8i8F+7Rd+2Xe)fL-IY`N$Qx)**c{S z!G47sXl<{8R46qx2PsqoA+&Mq#Ec_YH-gx{G>7w6i1!*W)RmhWr@FYZ(-z^IQq0y{1;bOMh{;)9yK_^iSH z*WfUU+ZN`@+EVZw?3DrzMK_%0Gr`Z(=I6^l-DIBGhfGK%IRDi8xW$kDglL45mP{+K z<9dOK)&fTJ6AhAXZYL<*s#lBZ$sp-lP8n1AE+n$)1W$s2O+dIk+16tg1}cI31r3~b z1vqOA!ZxYK7V;Tu_(rO_!gu_r>1edz)BfCEagJJmuw%>_1hniB+Tx+ z)}t&S6Wfh}ZaBFV<15;DOMydNH(3)(cE|OiM7Bm}6T1dQ;%;k1`fs97l<%wZ|L^B| zO2o&g;(zx5*SNgfbHoIW-u+*Jz>j2myq2RBCi<@Y=1nuhDV+`nGaC~dn#86Ifwu-W zDZF);6NtO(z~ySr-BrNOrF(RT!|nd@{fwxUQ~+cX<^q~r4LHP`yB|JmGTf6OY!(j@ z;~Du$VRAMOu$@IAbEC6(uF5$sxr)pFdNvy1VFcV#Xf#j02sSdNB(0KJgbEgUO`ccl zB`zk&;74gf4kVN$bS{@rv=zI20B~GrcHi7SPi3Bt_4M@KPCVpzJN~Qu+OHjLRq49M zcD|HapubjwjlnmvES?lpGJp&z=fcl0o@0xtzN=8K=Zjd}xwp;Hl+0t?*A1jZ8`H4a z+}`ljZyeMlLs!X($_)OUzT;~WB^8VnlItMpgFnujp%^AsOL>tKs z#dmY&&1>9tc-;OKXA|i`pUXgUOS6kThr0ccymL*z-H?C^p=?UZi+@E&$S3HOPRtlH z$b^Om?kE7S>MgFvrN-);YiGE_whJ1LU(Ww0b8&+zogCZ3)6)0h*v783vtkc@`<@^_ zX-86M>)J9_oJ9@^KYj2HpMWORi@XA!#3HdU06{`ssCz?Glf&UCH`)2>BGas4SzZFJ zax1Y=`(k3%co?_iYo?LQy}mIPAYUj8y*Ana_i{i|@+<{IF+r91II*Q&`j?JK$=Wiu~$Y$IwIkR##_1!XZzdnPV6G8^Evfe6FHeK+OgU10Xsn2MV(4Hjrs6p zO2;8P|88J0?PltgX*JjTbrnOqQ}i^#J-ke@g1%wBoR4+m56~Cs`uS5z?e4Vae$wog zn~!>iIeX)&$FP&?)%)$ zPR@}6Ej z(f+BBWvT`T9%a0{Mffx&KfFt?jw8n~jD< z8h5s`0Kqsc-d;vluj60>fd=e}rj&kBm$NEL{{NVr^IfXdk`Z*rZM5PHgi~ zQ{`kMAAoccS3u=PbWO_*nT9~_h#doQEWDwrqPte=)>IUvE0=VEc~PiNN9p-P!2eVQ zw>Y3@B>JVUz%a8~xZQ{SgR|-z)`IzPCjy*LJ_vvAv}-?gxJM$)epn`N*%se-iT-hO z_83OLwr=NTL=nooNs2^7i!gPh&D>$Prt82S&l^Ld8frY_ZnrZE69W*q%)b$F@qHo7 zp@>Y)v}=I?^A6fyL|jCkfi#I1%g0JdA>9o#tOO3g%heiOZiP4$iGz4m@GuZk@%PQ& zgpoqWooi57t0%f0zRmhod69}G%GS#DAv1s>5N<`8nBN@V7C)#HOgIH%0`~b|P$vQT zOLQz0xDeQTo_!7+x#_^`KKdJ{e5cc(i)ZIa*0x61eb-rD*nOQcO!!|WA;OiSM+Pwe z=I6BrNaPQVdYB?At;{IhA`qEuqKiXw5k-3mFg)8yL~EFTWmU0K7mKW_zx*a_zgjV4cqc zh0>QMuqT~o*P-L>Fhd|fhy}zH1~ekf=X56^EV|rrPVl^MS*q08yD?ip_GLB0HW$`3 z+F-xjFy~_IK_I{ZK06C_oaW*8cGUV3hPp@m#RZxozj!^9J3h~Ql=R#b+T}hoh@u{4 zNas~~BOws*splInTx3mwzxv`jZrnuA8|gv?KKdA?a_3K=FPt=T?AIFtn^t}KxkmPU z35*&wVTx*NoGKaC9eCCTxksCU8<6PXBXQFqd4=yyD&EeMhh7ctc=mUGeYRJ5okVwOQfQNZy{uHlT8B`7uuOSgJQyz*Et|NJ{+BJ~KP@W%`3=nf zUvS{7*`V-n0O2(Y-}YRgH)_oi;TGoC`NSy{&$E}MiNk=;YlGwAM6*n)(IoDAYrQ5} z1S4##WaFl`vy-&sgl3za?bpV;d~cKD59YZ%|?N_Tev)@)CG>zU8#lM~dF1=&_* zxS#U|Zv4|){Uo!CV?kVMs8Cm%s|eCbX=WG_eX4Z zkwG(zx-CE0zS5scME)F{J79gZ>3&zHtihVE3^OU;4D$bdeR__LKAwf=h^T(i) z@dfi37;Oq|?+MvsjQcNE-cC)?H|3Z^jg`|d>R)yeO6qrsP*?6>2mQ|6Zk8@44UFwI zdJ~g8?sI z7aLv|tF_ncJ;leSr&Zo0h{s(n&KIr|%_Ul2S|28M=k)AMy%zBiHxDS`^ecl%4(i09 z`8ONu&pY{QmG@MMeE%%aEhA*vKt=KY;)HIwN9d)<&T2=0Uui7vl zTQ3u}>=|UDb=n+^fam823WakEl!!bY=YcnwWgAUZ2O`4_2Y7F_c%AphA_&tsY;F#h zGrs=ysO=<6L&MI^q|P!62)JwOK5Nf<^HfDD%E?hu(m$u44(&6WOv`MF#xA5aoNz|0 zbN|3gHO7-~UQ!lleDs4g`tJ0-M)_)Czd7S*QZO1(AML6Li^Lc9f0$CK`sgJ^S^7BE zTuZTvW1WYV7v4opXeHJBOdDjoMTs9%WW!-iv%@maCQk`KxLNEVYlNcZxNVq z&~+tC3Zu@;#X@W!Y$fUC-f;=k&*a~)iHO=yIE->c%GQ#7ODD1WfsOC;5vvvJmyLH^ zGmdN39HkKKsfX+j?Pz7?8G;wHg%g1QQu@t!WzlO|zL)m&lo=A8>~E`0%WJ+^Ly%lT zHQ)5r34Q<8cn-0ag{pX zXw9~O5LqT-hy+^-FEaz5Y;iA90#Q5G-CeF&=zpWN#b^AGesm2to!eu9>MPW+phyq? zh{=!^z1;WfV;T19Z>A=o-Q?%zq}~p_iCXR5)guF({T{+m{RN*!U_}VZjuh!xGm)+s z#+Dkt2TMcREG8b>3@41Q^+Q=*+e^HgyW16L%T^j^o)+Xb%OIL<7B2P^Ioy(X zk$_y5AOFP5Q1WcWQFhUaQ5?sN{;=J)T0$x$>l7+E6DzWkp zun(n?U;2E^@JPMG!2`4<9ln5-QT2NEsJfXHbQvp1iU*@@$CYUKHl1ou*9=)90^Hy$o?e zh1czjkykXZv3TC_e@q(rTUKm$c)0%oA9K$W5OU^m>ZEK+fhp z6)g6L_N`vfQ+}GziJU8$AgjoULYG4%Xd+ZNJRL1YlgcyI0l>>;T^||z<5IU0bOK+pTp(u4XqMx{BgMNjym3Zk4rOG@uVJW zMq4gN#Pl*+Ak<#|Fbb59?=cu7l*W=ncv)7*YJUfj{$cBfeQJzxx69|dE4NCmhh=30 zeLeq?+|X?7T>f42n{3DbvDEqBE1v&Tb$}tQY)Ib$WRqH;|JNyP9sR?V%LFBhlW_kA zpQUH%r?-prQ@%NCC;9eE_8lo{aR=U8D$s2g(fg&_R%8fqquV{1+w-uo{w>?{q%nRN zK|J|M=CR6kYv3NvxJa7&adx;11w87m?+)|wHZzGW+w!Ma7O!2mq=Mt>1E;@7;`Ika zOf9^bQt7Oz`=UfLO?Hi>#x0Jap5rL+t?kxLc#ggI*kEnq0i)~nwYAjyX0dw0E3aFp z5vN^|%XN4_Wsdw%v%TrI8kA)ggQ?l1^|FNOr{~VC`4-PpLu6yrjO6Ls)P4PQ#RY7D zSE1FkOB(orrThW0v0Ed8NE!^N1&G-OzGHuTej&=l%IfeTHh~8H4iY-HEIQ;4I$hYt ziBy4-e7k8aRTFqs1Gtg3sD-n&Utz8$`~}rOA$9CHl>h~B6@;Wjtx3~LzkCz)OomQ* zMsf+H6x(b7f2Qw`5CR2jAyv4hk*sP^o5pcLAI2iWJEe`JgbkYAoRh2})_@WutVOP% zgJt}|Jbsqn1biPQ^ybX&P85DjaUyP#JGlYjydx59Y<$ zFNBV)cQezRslRY6rf4-U-(qDvw&9$C@#@}>h1mHF_J=bMse`ss(=l_&>0(A}TwE`w z+uJtZ%>0JBl@F)SA+@vGw zqcXq!;u!~`axW^iyee7Q9A7rJdk~yktDRju4}WuHjaFv4-p{@jk&-OH52y8aYgHLI z5^{w2D>^wW` z%V&;M+}`FAvvBjP5Kb#KX%=hG%i>N-Iik6pPWuWaBm%J+l7-`LFI%%b>L5@8wp+4j z$0;~-Vrug8uO6``_tk-nSe$0VE zV}oQB`T&|i9 z)`-zjo6dkQC$cAjty;<*$Bg!)o{iI}l3zpyaV{V1KMSb-0Q+*F+jT^0$X6juqOHo~}xx|E&Y-Nd?DY7jsTJoZfY ze!+fUC6M`iz%8mJ=~Pot+p72}_?}eju0WE$t3ThZjSvD4R`fU6Z*a&uY1lcQ#2ZsY zkbuZ9WX$NOIF*i~#sfAyiVyAR*S1#)3JwJ<>Pc!J2@INl=!Id9n?gvGLzg4ZZ@574 zrOGojIMW~~-0Z9;(+bqW;j39Ug|T$9WI;`Y`CMBKMcgP3;(>87)10rpR5Dru8wHrq z7z*E(&8qZYfqY`v7eVON9UFqXkL)$1W~31M)IZt&x(t-r%HcPV6><`y+=AQQ-l_mIVD7bp^vz z&+L=We-`-n{4@_4_uInGqCLzKLE7))K-=?-E@T4_^AQL$!pL7<67>&hH{efE!SCzogjs6$r-rFS-wkM3B2jjO^iBFjr zHZeq_h8Ao=Sb;kCNdsCa!hqe(?SG{xifi&Iup|_HxSF(-ba}aQ`Hd9aQ2jAwd(wm` zv^9Y5k?>V$J{vsNyjb+7H0>6lI?xh53l$mbu^oay#(yUN&4JC0gk9b!L1uyHIAd7I zqYa~pZ{g4c0N67ql1Nwijwo;)tIQyTcsPr|<{+Gq0S=i_GuV)_2 z>v7A6dIG4_qdkwH%=EM&RWH}aHw$~7{|_do*)M?8$r@$q6M*NV7;{Sc%VFK&%f&MP z{iYyGO*U~~AT^_I%fj+_aBlbCuoY#f;u>>$5;aU<1H}UrfHb)BpF-dJdos=E0#D~# z-s(vQVt}bltRtB)$L`#zgOdrXjjk&dz7^8Z1qR~Nlrri|}rT0toz}|)VWfr&06r==x ztP_A+FlSIi$|yB!v>q~Jid)bxy()^!)RMWo37UoitvYw(qTiRQ?}p4L`;s3%oNsjP zk-nnkvi4(-d?~pm6*jJ9JD@<_Zwez$mRX|4h(q^49g2S(biAO}kmfM7b_d_~_Z$M~ z#K?rtRvx#V*_~NMa)p?+DurdL@;J-%%8ER(!>4!__CwS<(f?$6O=W zACD4PJqn|A0>JT7lCA7PkpyCDiGgCS+XuZnQL0!wDqo&n&C|53bZMbG%H6BS;XW^( z3Y%|Pz5tg^l`e1DCj*Gs#Kh|4yA)8-a#7tFTc6Tid1CiLSjYHak8mwhBR?ffVg<55 z9{^j{B|7smM$PB%zoYpM(YBp+16D6hY7F3Imi=Pgm(#ukVu4X#|I=vyzwZuY5I3%T zr1xuDuj3Epya(5DlgDiU()ic&8RX}-C-R@Lk?w88PN_{d>b56D*Pmj}e_o=uV1RJG zTmQ&)2T6wPR;HoP;F!SRz}a#Yb<4s7%LNqTegg`Uy)Q>NoW6j%L&px!UDl0=xK_Ds>2 z*|P5!_P!L-p(mBWVfAwc830Ar70@1V8A2w05?^O`pBeqLc?U^5dd;kyF#{0lBIohj z`R)ceGWL44LwXNpyXOr8xhDSxO&Gx;vKjkwo&lLWDcMwm{eF|rlT$Io>8|ezELwsA z1W*#AVd-%dU^qXU1p^N^5uaL(Rp*8uE2@VRFdKjLg+8)dzCc<#^a-YF+>tFhiSKUj z$C~8H5PXO$OOuVUo9C(+A;%H^+OX3|65RuR8s?Z+b3Fk^kW4(O&H*9!MmxcUybNp!7 z3QG9Ew7pfAZL@0y(e$T*4b?KJ8rp>2)={+s528k&mXt_U9QgsgnC?nruWcAIJzhoNb$u9`>V=ZYb)5-9laY87%!k40ptV&s@ihl|G^m4Luts21W~Zul7;F5KlxB(KZZi8mcoLP_eD~ z*G>Z$WLuRYXpRgU87fb=%uuZb!?l*G`)pd@CPmg%5;{~Dy= zRCws)%Qa(*qoS!sePB8Mevp;5?=43$eQ|cCvW!ZeZ^dpoB40_-Pq z55HJ?SiBd-JI)3XExB&{2lvl~AR9D26`c2Eaw>e@p7AGL^4xGeM1 z&dTC8|DHCM8BBsmfI#e<;7z87V!_seMXIPm;BQRikzQ`dQcYyBYn(DsvT{EMoEX>9 zRUxZVSvBYfKliYOjuPJ;6tL7}+~9nSC>K5^SpzW8*=L(k8oMdJnRHIUtU@m`5z)uQe6RlTsLR!*GzEz=rt8T+h_tko0hQAWG#?jAs^(`k3{BE9~Z+wjNP z>EgT+F?!^IP~@(#x2yNTZ1rRuTe-)zh!yUrp0E|z+tSJS7#;$qxR zhm#>+IOFO|YK%liRFc5uDHiF8Em=3rWRAdtK_e^2L9wQ@IOU46(HFyJW7n|@otBx^ zT$-$>^lFdC&)5dKiqI0MHQ%OD;r1L!kZXW}{Q=Qg${AJqk5OF9QS@qC#5Xd1Ul1%p z=qDP>!3+IzXFG1c5g&)XBmxu&`CVxlR&meF(y(3&9P>=Zb5!x$Q1%xtSN40wdzkqi zczOdIR&fK-jg*=ZK6$lGiyk@2CJ=c>3^o_4LChb=;^`-Ps1NuAjAQUu%;b9g(~)&Z z5NXhV3g*#iOtuI8CyD=jy92`al1k6b(zwvY=D&Czx4_2g_Bc_?)2}?)9J>+bx#s6n zaOnI&c)>v@ewd2y%B#=q$Bv*Q60aK@hAz1^mM^ZsCPhaj8eYwQ2h+z%nI@z8L-R@E z{{Y1y00YytyUe;g*`OUxukP-?Z0CyX{edrPiuH(b{aVz9-c{D7p!B7p!_*i6E@i3X z7xp{g0M>VPG{Th`Tl}<@l8+}|40`Y4weOwJ+|#M7o%?IPqT4Olq#7e3C+l$|jV2Vq zqKoD?NS+`CYc39EMZh~|lGRTalS@3i88mQWpz%2{2 zRT6kFtX*Xk%L`uHqe>fR%CpRWah`f2k#nR2ZBBPmDTBAV-qbYCHb_I{AqkPU)^oZb zUGb+do(Z;(mjq5FwReAKFm7p*71W^;O+gqD7wmv9c;1}(>99Rio|sQCjIOkI27JWR z1Bi}4zZ7b0=pYk8PJQZ_*)IzidZ6Tzn57b+M5v<@z*~NpHA_O#>lqsE5Q7KEk+*~F zP+bB`^mQ@AiZG;Mj=ZocKD0Y&%%&t__V{cF@G;^hALGC%259uycG_%BR1-(yy4K(K zcezQa4o!Ogbi)oYxk+$KO68^ClB&1SqMLG=33aBmZHWB}j7Q^pzzd4LQHCWG4TwvR z^L{v_EE@J_fl)q*z&R`SR?fQM)b??}Kfx(`2!$fbnC+O`07yCg(L9KRY?Ii>=`+hH zCmb$V`3qmr5%(Nkyq+fbYGUX>igc|`G0QFGg#nQ)7U*RT(4F`&8orRB_m}7xT?EY@G zdLiQvoAp1!kK+AVtMFKL$|S*Vk}b=^*{-5vw-dPEg9q#G*}bY|jkV#9oFbi>FwZXx ztgAtA(vQUl`jP)P3*cWX;WweUrsL?R;O?o?j{jcHRPcD_e*JDh6PqRYI_SvyrN~v8 z2QygkTGWZO9X*+)U#t|m40R4>wuELvqjoyE>4BEUd;xn`$|d|9WIujf;97J=TH!jy z`%Jo$YL*DrEFtr(036INrT#Ybia@SnU$+gNFY3xZNnd)-?T8|Gbmo$9e20d*bIDP1 zgBn+MFJ?*pLl?rBLD%-s-V2*fL+_OV#ykx%kR%uV-s9(ApBo`G=cx;t{#D)b1Cn zq@tLL@MTG|74+l~YQ%L3DWztTtMJDJyzf~yH1u`&YWixwTFv<^pRbFO>KOEE&uJa- zfyObLZhpPS&BeZSI=Y;U>@5$QzolvY?aJ_ZZgKh;*+O;T(vPMD{_29IE*4eVtloHY z+w@=7Ff}#UOdE?oRxF_N&}l1ZttCjD+Gx$HqLTQ!-5Wo1ZxSaJc_4wxDpHv#X4@{w z3Z4gN=atXPQs;HtH<<%&t$n^P2VQeFQA#~z=bNpuHPlkev!{=!l5D>?BCGdCl#GY6 za@~hX1o26L(b(YzJ^Pcq4G|Osa~o#)>(^+=$_X?Ep#@-fzvT){_bkvQH>gbw_ z4+TfLB&OJF5Z(;^f&)-c!cj97HZ^Xou>?w{5fJOpqomqy%Gj6!hC59By z!k{u@1!xClwb_>1W=T=4krmWs8RbVAl_VL#F6~7#RtdJ%g09z8?F~h}p_uQCXiHq$ zy-%g$yRHsqZ=Q;O%=J8ev~Q)&k+*fo61iO-2hw+6k$=BAr>>%-=y(bTnIL#dgTeV5 zOV?R{>(`^vp`xS9r_jxO0DASYiMqj*J>aBytlTwsI&8$eRNbFVYT1oCGuke!)NXny!3(9lBaV8tVvw zsk3-1kqhwHF4)wtXbE^CkcjOeAZ)5FC9ES3ViA!ya}u64bveY>W_xW+Zn}F|OD^6P zbA3q16v#Hf9L?Sk5RjZL*dfqaA;qv8wsg0mZfF>@6+Z_W3#GsCDmJ%wp3EhrK8V1s zP);yT_l!7p99{@fgvi^OnFvW1GJF8-2+AwU6htAMIGB#tU2uJL0diusq+qOD?zpZc zb2@Nod?kF0j65zYuuu7JA&!pxZ%Zipqi|(V4~O%OAE|~8Qq6L(mjX7ZE{Ko`Sufez zDwb_-YtL@WDMxMiSYY%`Ht9+(v1H+VZD`;DUL-su*2U1UKZD}V%d3$_vqJP>d% zO9G_?D6V$rVm1XbJT!jB5)8_~kLOUiZr=3+6w|L*o1opSM4l z-1Fb^GPiLLegwRN^1&ZIh1d-pVCt(k;Wvt_D1NmSkHTa4{o|a#R>ZFD=pMSgbPF}nAAm-I7(Bbubsnoc$sN~Rxaq*#l<5tbn(dim2Ey<@yp=;omt*n$%y2kNi89iQlfr&UpU5I(k^fbtt z0kR>g3i+d=qo}GrT}Y5lM%%;r!3R*J28dMVJ2n_##n=w^%Yz#d%Lg=a$5~^Gg$rG zsG^0&k2IBY)e*JwiHA@iVb8fUq{=9NWRBj3YTy@yo~?8L_FXc zJ>6-qD4wvx5#OPe@2vP!^2T+!;Ta3Fy7$>Y1zts$44vjL^RAZ^`4mC7JZSkM|0f;( zzWCk-%>}%_-T}@(sGBi?fUU`53|Cv{{PXiG``EYFEZb+-%@;c({cpA(<9BwSm4)#p zGN#&;*>D+&CoF|bIdEk%bCTXi@9Vbj$JY6&pN>40nb6qiY}QgBQj_sUElG2fGWTmr zn%ga{{Q``aJf1(c3~C>X5)Hd(={!y@gVy_>9rsYSh|N}FA<=M8(D^H} z5@+)k#`(>bpF3jzj?)|Nsl6L5TV7%uYE&_NB%kAa)IY`XDr(yJJiZ@G$sxicEnH?TRMA=GQZ98rbmbFa30eKd9<42$1IeI_c zw{W~2FU!S!ERP-aww|kX0yO_TTvdozW`*BVEOJqyh$!dMaH$z7QUeu|n+QW5q~!tL zSyBcL(0shdy z*el>lnZqEM0^5<0`nRB=q<3MqmR<=Sw*!q(Y8V*OpejU}u$R$>RuYMY$uS8%Kx5EN z0ASe0;yoFTht4m&@~+srw?DN1t7YO8_xkG7p1PFiH5r=sR@C#0ZDcBHAgY*ETY0+U zmgmi^EL!jt;ngXKG>Q$^O%1^BPH$UL!^6hIMJ0S_YA+qNXO6J9xPrb8po`nm-bL5(scx-Oo?C_J8SfxYqGI9B!-v zWvZv9E|Vd*Yj8Pz79aMtM^|O+L4jn_Dlqf7op)&XKCi2}xlg)ZWVMFK^=7pOL zbOW3K8B9Ra40V9i7>WynW?oB4i7_SzS>YS{-k;uui?z9zH*avWl8^Wz&TtXfOaQOL zEcc+M05(BQITTPB^HcC71tBJ#zP&ctZl7??6LqcY>iZN`wV^;6o`ZQt!Qhi1=S*?B201S5Mbh2!pZN zD|sf?WcXEBs?LH)Q-GnZF4Vid*BV>CbDh)i7sbYcsi{cDy}#=c)sMx{kQRHJT8Rl? z8%*8dZ`A|>?Lf1Z#LIy6_&u`-Aa51)o5mDgw#a(kZ0PfL&67YN|B9brAv_LoDFr6yj zETb)&qr5--1(O#4*3YwA|I;au8V{h(HMNMYiiX z+xPi5`gu5(K31C}0JQvB``=8-|MP!f z@des4O(ai`iX2Da4V-=*lR|XOEC>m&i;9i6Oe#E2+(g|@LYr#3#C)xQLO)J8?26!( zjD&{IU{3qvKen=Qb;aAo{48*=_j}iGt@FbTlm4{O7$-Kw@iC5s@?FK^&`y$^PHKSX zp{>^ivop%OajYZxNc_;qoW}0%Zh@9*MaQ~jY`bbUEg0ot_CA_HZu?wK8iS<(&ynB< z)5Z|95Kc_4)6y85%zKBIaD4nM0GLlg$y3)6(-7xa`rsI1Z)1xzIu^JWy&^n<-OPK> zGZW=5aE767A)+sh7}?##Pe!98T9(%cVlF0zSsk7ANCalxI1^Eh9`e|fWJfHpp=n4% z=mcf41OX;;7zne5r&?=x#J+=pUu+m<5765+4KdQe4gm?MMOO z=9piLSw%j=ohX7Dx(z)epn-z#t7x?~7%xW*;0)6VS*FI-TXUFia?m5`ycQb3x){;0 z2b5wj0|vlfF_}BCAQ~hR6>%#|y*Y}gq&J8YPyj^*@k0G_UY=Q5@Voa>``eeJwxFu- z!k8&=<(tClPo5*UcY7FLGC8oOka?cLC&-N=QJak;ii*@osRvndLsz{@)erDn*w8`m zLBN0HJ~Yn*%ITwh7gFt?dPr!B)e!GWvjBQ!?W`P+7e^u=7k(f7QdC&DN5t(1th{W&XKeuy^r;iZI^3;vzrfV7_b|c;GlVe$-J@Wb@o~S{h~ZZo-sk6W7s%j<(h8+MhNU;^e{vlt6g7CP zd4snlI|vzr_#!4oXi5H?e3X4_%k|6BoHfP6*|C+BBr(0-g9nM`s-ml2s*;!b*Y5JS zpRaA%M$DdEDIxFWb8T*U%Gk}{#A@^D>t_42vo=jL%%iECDv!E4DALn={h3xb&DV0X zb;6Xm)WvWe0hby87Yjs6J#aksVDJd$fF8xORKV_)OQ?Kxk!Kgi>bZporJINWTH46g?6pieYSOL>FKUG>_+O+x_0|nOJ3cC zw!gJ)^hfwm9jFqHsjXUzZ#t$1z;H81p*9YCOyA+>=-&SO9pCQ)eb?HEdu>;uB(<$0 ztx9F}n)~tn{&&Qtv(LxV%&ZFp@pS%vAN5W%RIU0aeD3h0ElR1?jBa_<%XexD<&P?- zL6~i(mnX&I^(!{?A+l$i$`T7b0CIAq*=MBjyYcU=xqJ6#Suewg+>ixS6X_NIza(XR zlyZZ~5JDudI2}ifk{gmsbqFt8*yq|rV&Bdh&) zR%4=FGK?cl%^)uJ*4I)d7TIJ=h1LZY;8)cZVX%fvmR87{KSFe{uCxf+p=@oB5#zhm zFfUsk@hJ%JYryl%tDw?K1_7X@nv+DjoC85Uvu;3z^VJ}_<#4%Xm^@k|)vr1o9IdII zVjJ>kQ?s#hw|3{5P963g2a(C<EFwc~L#8I;7z zH838~PpmUf^*o%?joYrW;jj51-x7XX_da3QbR!dBAMq)s8Ayt+2TxEnSI3>K;{Sw- zO8%}W$6xa}Z6>bID;8E>^p6me+AH)MQUD9%bj}&=8HEZO+x|Ek4~51HQr2yrcf^}F zKjli6CQLp1wt0R?IlhF3?{>+$mM2GntJ2fJ1Qb6M4DI2pGAKA7miBiFW&Ksftr&DK zEQ5Wv{&5WqW4lnyC(WRHxfccvC^q@5pcfIknOZL(H&H}h0w}qgiE6SoTi#sM)OlNZ z>)K^~Zc)*?b?5pQpL0RJ@%P7}sgrMijaN4`bVvXDCV=Y1{jil&8+*m^?3#_0c2%--Y> z_jKFie}2C4TVr1Onqp=ef)PPJ?%L(Qk&Aeh>XSb_+i^lBx#M;%VSf96D)`&q#Vv`1 zw&A{(G9O3)=O_}FlhmeJK0_KCB3Hr~iDGWFKW;A5JzKpk` zFqB+lWY~BmdL zbY+BJ)NkA3TD~ot8LKsEy8`W3o~g*dhtyDj?o5jD`O&kSjPm zDx|g15rOQG2#*Lg0r(*67qJ$*yd^VRk`XoX*u0FHMtz7m2|7#kz#i+!_$3+*A zS~1ali4i-0mV?qS+{uIl=wqYR4qXFLJdQY!ZMD-v)Tbt2DJL>B!~^#Zxye16ud#PY zDC;szf;bBwG1@PVh_b{A3H=4Ce|z5BZ6WayL|9IbVPqzn%zzwFn2lVeK1MYLQ?g{GZ6ZW8bn-vwQ0Z>g*-pN>U>oLjTGI zfpcEs7637xc+f#_c;9jcVmtC6Pn-8i{#WhWY{MGr7^px5%kq(n0uyj?0r>cf!3$69 zNq4XP;XLwg)3w-Z_L31vM8rlb1t6a%<_w+}eDI5j2R{GqBDTSD8jnxpBatcVFsc`p z$3`e=1E9>TB31zh@Q#Sa!|QBUl!qMMP{dDWG05K_cpZ31=2MK_6=@O7ANz?@^cO2S zs|w7Qn#0dUFj*-g#?DznSVxfx`0Kqmmfv3FLTqj;w9uxTt=$v08k@IVMZ^?06xmP` zut01M|K`op<0Gms!ykmE*^AfX>bCbTl>E*C;ElR_1pPmcmHq$L{6G+MGLBdO+qk!b z5qL>9>90IaV%Nu?o7WmHCA8d(<{T^MsNIzLMY*bIkJK$vXRRki8htqSa!W^pS(TfZ zx;{9@=XR=2@bO8Diha<@m$6fIv}uQn{P`Vq_+&NQiBb|pI(36H&Aw+794AwTB@q&6 z4QWNC; z<-R^XSFvEH0V)w8tHaTB5THVrPOfVGPOe~J`3y0Q#J4=v z=AXyS_&TaM?l4eb>4TNZ7n!}zs#7kk;ZYO#4Fd|~AP6r*hT0E-7>Fx{{sU}Q6_i?=--|LKF6npnPhUh+iA0ynLOTiP%s_b@@Q2!fJ_)KY}8;Z zuDf8?b#vENQzFA1=U44n{-3wyY`Z>UcT+DZYvgVQG2&|jq+%?C>SK}m^-mc-{och^ z+}XJ#N!^Ft^?J*AX{+m-3doXMz|WRu}y zBVr-PL5hA3&Um7h1Tmt6PX!zHwGXFgQ}IOxyP%YqRni1npuJNtt2v}_LEfE%mF|zo zvW@y3m$x$LwwT*`pPwfEw|?0!v2@WE;`g^!7uwQ&sp4wEhHq2Zzt8CDRkBUjxq4cc zehpfUFI^PXc6|ntZk-aGIQ?hb84w_UAK}>6iLxQ`( zDm}#Cuq=~$0!#X1@ogM9|6OAcgHR9`dz-H3dFqJ&8R$y4Y5CTq_=wwF@+|Zt#8cAG zOT$efRx-Zo-GwmF0YhScK9oenlF@{ro)aF46Hk4oTB@)_C81R>$#Yz*^zSh`3=t1$ z+ON3!CBy~e&Iyn}wN!}Tq40>YW$T{n!Y+}KB4-jNIgL>0*mrz{be-Op$iDr74H4`I(u6BrL4TD_n2_e zRcO4>pKo|tMK-N@W8c8#)Tm79O4TAeZ=dLAM23vN#S$AFCxBcW)EN$LG((axKeLAJ zjpdE1xEer(m8=~HzCcN3qcuAnvMfO-rb+0e+?L>v(_#wsMCcUrRd5`Ruf#|#w0naZ zoO2<=q6%qXJ+VRxh6B`hxFr(6J`_PW79{ctR+t$oAsXd!!Lt|HD`Ta0Um5&Tniacws($^xBsZl2R|2*A13x13foh zA9&HrSPe*OgV^C3EWH0R5CuUjuLKJ#m2Mmwknh?q#%C2O%w*8u(>KbL!5SdYTOF{; z>sP8|S#%9%&30V@o_Nn9Hex^MSiu<-_t}O|IVa_WP$39%eRwvr{j+U#E%pupM;jp) z^Mtod>F}Nz?hThzSQ^0oAYJ0+v?N#5`6X5L)naZ~LSc>YI>E0W5pe%xRzu8hSljM~ znn%d!fasa6UjSn=jVM5l_kk*be~}iR3AQWPK8zY({37U>ki=b@cu@9B#Kexcaqca! zZ>5n@yT+w*&FXbX^i>>Dk*HLuV4xCT5vv$lgpF9?g7dcTKJTV~pYtWwD?B~O9o*MU zWf(w8Pu}SV>`vSI*N^};7<`|xJK{#s)SEcmlU3-Zu-n* z4mxu6K53x2On|=`5+Z?@x5MrFg64m%JT0`TF$h-D*e$p@1S=vkHa3wU%H{JmE$Y;x zY}RV2t#mQ6JMDews64-Cm8JUJecPD2V3z-TeADsTaMM(!LgT87iSzKBI?Ar^bH4N= z<~+9aSDfrbqyx{R7jA$CBH0_#%q>Vp2wxHHL|dDs_K22-=I8jrtGGsjvTd^!FJbW` z{x*|NJu9|#&hDb@))FtqY%gTPsnp4*d)|UCXnv-MtK z7E}8`BC@QZM2f*4vqQJ1QwD8oR?SAT26`9~gxrvTnPIkV2ukz1)^^~<9mNzTSxkp2 zMmfdRTs!0o<+P~D^^kr&JW=&*t31h?RqYU#D@Hw1F+&C$F}Y>yG0q_=>=i?yClD7%Silm+D0}!;aMG zrE(NNYx-Ci)S!=R?f#0k*+1G3^oWWSf1~f` z_UzR*x7K4&*i{#;4Z9BbM?Y{h!Z?Fy7(I8Y8z+q$p#j<>-q5;7GYrR%2%Nth3E=2?4V4EE&Qzc^Qs zUjVyJww12$*8S>P-p?o5Fvr#P{l*wdu&Fz0BUDh6`5e8_M!lqWE5(%puNx#=jXCi@ z!fm2b(b5Y?p2}YFKz- zhPYAo73Flx__(ehRjYgp*ASpIEaQLTG>mjhNv7G*yL;U%&A!SS({K1(rjoAH6UzE0 zN?N2g>nf;N#xh{&x{CV!u0LBg9we&$C|g{;KJg)jK5)C-Ppy0D@k1}tbb31T?AWP0 z+?pPbH#$?Ch9S{|@eUJKh#;sh}31AUeSg!KjG#vx)~0*mo8_FoQD z9sSdpX#NcGEbTJ|m&GZl( zM7y^HHv^@5A^aKGE(aNA8ZE$VTg>5gud>;1T|(3QXe`U~g~AXG{!hpAALB|pC_vr6 zcbWe0*0hWOyVDlSfJADs47Z~h#!i2L+hO5-ARpYtwD z=-?+TDusSTIEjLm-2x^GHR7adl(6}lU66msMiYC|B7dky%_(ShTDDaT?7_+{bo%2} zZZOD2UOj|*5Bc}k9{=`EEq6z>@#Ir5XQOM3?{LYr`+GEsPNO&t~Z1@lIH4 z59S@^-W0tP8<(Ar2lNXhV&6%I zS0!fMgD8gfOtU+H@h7|yd1-|aV&n^IsdZpWw&G8XNo;>B>8=ZI<)*D!uHI$Zy4$rs zvTM(gF*mU$y9{e$cM+9S>0-q#qxX0BiC0$8(Pqg>G(}>sfYMQcId=rkp+g=!6*v{* zT$5rLQlkAk1gFhs2qPyPCz2eWWp5~V5P)sTs*N!RI20G69-*ATk=;k0BM{9o`YB7f z;H>0)c1oY*v33F~O;Py9pE@Q;eoa+|@?s)P4U!o4v+#Lr^7v#Uj>IuYeyH?8BA7@O zyk&B(Ag$D1RunKjjt>tIwUx1`c3z@Ugpn_nGuZ z{`5E#GRqsz(_6hNb}Kfx$o5g_^)>{LKc~<^r6)!H5rvX9U zlZ=yiIAoU0}mcC z>VF&v&gTy!*zFkT1AjkUKl-1PzW>nt{_D!;7cqhyu*yEjNUQ$C-v85gAyir3UqQav&#PjZuF^`~XROOEuSv#Oy^j#Ju8zmM zox!AT$L-9V|9jeayDgvNTO9xEde?IkzwEIyTLQ8!k3zTIt5lQYWnpp?Jw0T;wDd)! zYb1LJ~Fnd-BZVzGT~aVxop7ed>IG$Z!FzY)wfGaa)l=a_VX` zp4Yz`r6hd!`{xh!8Mz_z0*L}+e9xWC^9*`^t$ojR-TcPSP$;P^w$XMg(bJ~s^L~A+ z_)M<<-cq6Pgj-|E4NndUB@(Px_$4fQmG!}vYfv?L0ekHZjQ zy=GzQXgP1je(?fb!?9KvX(|^s{lMB(R{LfcA}Z7X!M~`3Bpl4D@qkcZ_qDC`OokgT zBRE5JjcU!%3r6UNAxfQK2dX2@d{j_nsXwjd!B5m|W@@XpjLHaqh?Bn`G~DozboJ`J zzgGEQ60^CjU3onYB0Gq4<$iZ%?biL6vd`D5{=_+jqbjjz?4^{1R^NC`Wg&`_9jE#* z?F$`G{rN1ey0v%3|2Xl_X@AVSt{xE@R2BReOs845xp>^+X=!9AczY85QNHW6+G?yl z`px%vT8MBwzE+3v!f_TCm~`ohB~vI#5u138D8}C0J7-Wu(=7Yg*vwUw$I19x+3{XF z{qz*~VcRCl(_>ow@-{u4ntvP6;{W1eJhi~XT~Y!0c~`h8zx9$fQTjfze6@A;kBIGk zwNx1`4pZB}$JP05@rUDH{n+R*7}6AU@(mY79@uIzga&5RL^(8wHI-`Qwo9@snC5%g z9%pyu0=?P2$NSP#GdJ|5J1Dm?)vl@a&Vi18n||C1>c#%TnT-Te<{Il^?t`*T0XX4mV_K7DE!6m7-gR37{F^2%e!6f-oW0*Cu$qP7W`R3SFL{&~pJNcjD8k7}G*d)n~f!2#e&4==kCy+cn7?zJn^G!eydl zvu-mKk-W0m`6F~Nuk93^F-sNmmmE_U|7g+&kjkyO!s!H0bX1Qa{urx2y^VMXaSH;J z98r)ggz?%9gfx?j@i+8(rXWxtW;%Az08l`rp2Qxf943kq9;O* zETej%9~SLWhyxRm2m_d~XM3K)^7KQ#vc9{imk8 z1*V85BY%yInh4Wr*^)@w?rDM@wBbDEf)ci_gB`(ydP=0P5?2I@b2Z|bO$ zFCfwOB>QszWx442H^$)tg2kb?Q2SyA^peKU;dy!0G&JJ;JOtEv>DQhSv7cWMzhZ~t zb*uwM3Xw0#TUW_JY-}1Bbk=_SLOeb$qu4OwJ3ffSE+-cJA-ugZi(fImx@Fn8z!#W$ zdbQ_bkgG|YJ~Ac_ut$tOV=u@`2>@PI4zWRkoo&J}FDTRuRuBI4d(>A-0eMO5<=0}1 zS=&DAbh)$@TbJ!>p17@M=o_oz31be}b~Yavi|0(A%xbnZf%`oiyh`7V>1Vlk`FqeCfz~Tkr6nx41YxLO@}!; z9iFCj&Gs(5O=j3*YAgM{VMjb z=$Zm=l+^w5DGyIcHqNqqRe4E+>~(;e#iFxUKFSDZ%$@kGgGqdtE2l z&94)6e4jgt9bqu`ti^wR1^fScFZqA(zAOj?kOTjzl5dJa28%4;{aCKHf3Tmwg*|>e z>vMifzpJd6N$J-^m)KZyG1l$8YkwJYQO!*>v1w5!PjcP2`~qXNQzws`@l_Vp>WfuY zR;Gv#*PnH}$m_svbZ^!VHzLXNK59Sx?)9%U=u;QSB9;*D<{5YM237n=TRNF&M2al3 zf|kx*l9r`}1Fhn9Dp$y|{@Mv5sowdyHb@tSlaSbGN^wnyG%Dj|)s#VJijCQjbHfVr zy*~`zJf70UV22fU7A$0)MCDDGk^Ot<2#*&2eH~vL|I#{sz}^0-veT?hv20@N(aSqZ-Oj@rydU`m>M2@XAt2Vve_H|fxH1)N!qgB?FMW@qu7;(9o z+?xH~!p--3=}7li4JboN))x0!Ng}wj)t0Lk29kUCDLmxr+^XUBYFnHT#BFPGpM9&8 z2}4CKU7SV#F4tu*@9=YcdaHcY&+OCse4gL`uCC&s((k_8TDr*{x^$P{<@-GI|8isW zIB|#n(zr)yqBOub9atKT&qgtvCZs0HR2hE~BbyH(g%TwrUo0$Qg|T8N9fW_oWw6*} zSXonwt8K&N=H`Z8%$sc%Nvf9U2m<_5J0i9Sn2iUhxD<@kC_pvofI^;o-+q<_(^_FC z5e_QqN-oi)RSU)xFcBt2S!T`9KXga!f$N1mO67rzacq%&c}I5E>VdzZQ-KH8rInnS z)By>iADgK~=uptxvvLknt4DAYrM-6K^8WRv;>nm$8ah&%nr?{qdA;DUZyhuzaT#W+ zl>0;wrdRFyQWIcUXSuSG*R#oYzOl2ZGxk~O)uRUrK^>Vw2rd z^)I+x%SMt7=BG1Bkvdfh=@Z_)$@5uI^gdm7F>?;)oi?ysD3qqswM+1z(jGs1qs97H zI99E#!&&}aP0_BaD#sm5mD)H+^yll5{<}SGysg!4m(~06XVYwSOzJu{)l5ir7 z<6_EuChyZ!HRZMMd8VtEM`cFyc)!pU5^Cey4|V02&1Mp}{|a(0cvM^{)Kd}Bd%NbX zUp;S=yQ8+*=_oC?x)<7ix@YTBmF~>)7B~iz3}Q!cMLMdA*1IX5mus8f`J(sSuq6fN zq6qrkn<+!eK=_Wf+5WDcn%xNQ#+xSgBGDYZPRI0FFCR5bsvINPtmDhr+}9=nnI>`!qirV)T)EP$Q9UDS=6LBK}vN-C+7J41+>UPqpepGzdiKo_mWD@A^_AT&XL;@PX_zMO-npl!x5`Pzw zG5M_^2R3mutad~VP{_UQs!?~_^q`dwdnkTL;3c;UnAKLG{+2Rmpd$i32~5Lg!FmZ} zY!oxp;GS95#BxH7)F~)!0t{Gf3z-~iKM^n|eNMo5p8$iivJT6S2$3R}#TQBSHY%Bc zkcSq6Y$$Xq{$AX;adP+eW`}TdVsM6*iXAHYLz$0)OPf~Et-MVjYUflkDLc!7)-HOx z7d;XGlvC%ag@9KNO*EQN@&H@vFy&0g(zRXBEwpF9&G!5cHTXNv|5J_L_XeH+Mbr9f z1wm{a-CHBLgYzhc$V5hDaKv5&pl$r(PF|LL|E3K4jDlrBu}p&nE@57}20 z2?q(GAIN?h$isr%kW=ApADzS}_W?)g<(>6UKjgN`dgM4RF1vWdqk4t6vY;RM&9hI> z4l^E$JPJYK^(2F}@M{BBZdOw42spgoeN(PfXqz-G2gD{CDQ<|K0D2qX#;m zJ&UvZJI?$}i4s(8`V4Yce?NPNjr#nR$n+Jhw3DwmA#c*0r$Ko>R;kK++xyq?@toYF z&bl_z+QRW{6zy6?eq0@2coe&~ELqWJ>Rsc z{XUQJ=lKf-Q6Ymk7>XA7@{{6s>)32ek{>dv!T_#u{yOn_wsy!oyE!l8R9vpZT zZaXnSOZV*i;Y%*PvRvIL2+clMzXv^zheA`os;$(HTKuz6tV{E{&3=E}w{4qG^S`x; z-&!t{6szFy8@l^i?iMU$PRkZ7y4(@^UPWc({YR`k$<07 z+OkvLzmIxiPLn2i`+_sY1&@el&c)vSe2_f$bal?Z{($_R4z7KZv>yhs4Hd(|Ft$H- zjk^UARTMZ71+le0h+ymmB*sKRdWhFb1-D!x00EB^-M5Mmbv0cykp_^HAR)XD5$21r zJna=9dpxQ^xM|$k3>OWJsfSn&U`mHEE@WCg7a?*XV50Fd(N7ZlCl%_cV-q)R;&|O* z#nh?+P8bohV0;_}YkYiM6wcitKPKa8%TV^(jcs##px3c#VtP7IKqC8Q{G}#YHZ{n} zaq2g3>S@%wC)1l%wE<*z#o)-hM%kX<_VWPW^x;^IiI$C7vn5#$Rd&kgV7fFj(WsKb zL@CoBKJ`-G;zP@^-Qp+Qh|w9fdn*alj@#CF^M=fCLqg^y-}l2~(lzBgIQ;mrwD6hB zEeK6C!k(Jz;WRsmJ~ek)mHqx8I+y3sE^E7~%f<0@X3(qG#&i3plqTj;TI1T`cquYD zKVabJiuZNLY35PO+XQs4zv$XX-g&LA!I%!EY1!~K)cCKtT6#arGh z89Yq6Q_r(6xYV-9%oX@x)jwcn5gDOSB8>+Hw>^ag8|k|>JTEVA&v)8J?{?^h)$x~p zOw1`?;NMzbQU;J!wY7*^&n9vGjSa5n@lUvuT%Ze(71e$gI8-YYq7pc=)4*k}4~Tmp z+^-I`UIpAC?vgsciv=p`7#L>cFkewL!LIbss_s}?@55MC>ruwZA7=5Jb$2#a8m%6^ z#y>8q8uBLCZPk%d%n)u;No|{-59&W(hqoS|as19XKbVU)EDMs~*MWy;KyEQ&IY5{y z6CW`bag(T7T%`MC7E$qB>2;kQ(B$}>XBz4;x}Q+-lUBK{S>d#b!IX^Tt)J)ipWE;M z=3QyfE4fRxMmkoRyDTSMnTj@*Tm}Z!;j?v$VRVmjTl-E<9PF$>20-361T)unAU1$X z{*J&YqgL&cZNTQiPoEOn6c({lS}Jmc5K@vWMH7fiZJPW(_b48jII){0tnMA@ zti^Nuz)k5%^9nj0axAlW`0{se)z>nBrE}nIydar4xgY&asp{t|o`Tr$)rHbd_6_!+ zG^&7AV1_kU%qQQF{c}XnO0$;U5Q2wf9Sx94fST}f8YT`Xl~cEk-76Up&0xTa@w#TVS1@;G21@e}~KReVwO z+%tZ9;qc`y5>_-v)p-n{A3}gHb%n*K8=+N?ebMRHSvc^EQHqBzY%Hjd3@}mk$ zdxw>`Ga{Kusq_F%D|hQaz-$cIxX;6P+_p5wih_v3R}Mlees^#M3i}V(QuBJ7^~Sr=8zlEK<({& zehe)qg5N|J^6wKpx4^@`)KMpA2h8VFp9UYrq> z@JtD(>^OLQ!%ENH20~{i#sB^A1Hrp?AI(Z7fGrfSgigkwtE-9ynjn$8AchfXj1NU( zQ>v+|iaNG=c}}GC-z_fJvBNwL3CHR0k(OMcJDpN73!|)8q*bY!LudtB^RFJ?0j(fq5f)Bvt}iQbF11wL$!T} zC9%s#513I!hf^l4w9wV7cB#GX`&jaM@x)!r&X$`5*|&034+7Qjg8tP1-LeOA*?O|3 zuE?n^WAj!^Xsz91m%n&m{?_#2ykZaOv}@Yhw4eRl0%z;!X|12fdE}8-Y7&)^aK_ZQ z&1559eVZFvYLjcuOn%ePvJ(pl%}gKco-S%o-F~8@$edzTqs11TH&i}Xhn&XcF=Oyh$NYXSc;Yz zoA+fs!mXVargGD21>0LXZE9)@eGNU(zh2eBW2740b@Ou>UTb*V`%+N%Wq1HPGS=%L zekpwHmaJmw$XoinnxNgdz1i?$8WU$kACWD6fRia8aK#TyOGnOp$H!r>dSCu&CWe3} zL%J5({}*AQjLalE?9(I}^0kE?J7`)*XiO1~<|;x|au%!p8#sP4S2CgNUOd9q<}If` zjGYXWI`a73C{+ctyDDUO*IwbO;+Cn$ID&A&hThrZu?&4%t26L4_^d0D#SQvCyLHI@ z;&QEstTd#m?5cx-Lsb+h2zAd=?`t9UpT-m)8`#4Gkg`HPk4F-sj+peXLZ1-VCn|nD z?NFcGO?FT4&=GMv4yFR0a#$Nnaoqj|kg(B}giKX*ly;Uz50auRjB2rJXmzw&RvK|5 z!};oGOXbYTCjS1Rd|i#j*&PJfniv^!&!|EENeVExAV|Uj z$E;3X?#zk!JCU=&Si^Tbh|Agn+~Z8oH5|1dh2TQ9L&QKV9sqzZy3s!<1~My4TdEsE zv!Z>@yNK)bi;Up(&mXa~hBNRD4blq3QR&8|DR=mec6_(_3O2hSieRxlH2;P3R{1j< zKXbg}E2x@XRpny0NPQAxn;@Ye8)T`l4G_{FE@n!~{NLl|C_amz#}@|eMs&2-%lv7i z%e5I%crtDpnue+C==q*CTPIndRno<-3C1)2G5WAw0~n1F&8=iP`FdF!9^9 zHltZ=L+v*H-LP}A=pq8Qlo5V73A=@Jd}seNz6KR3Sit<~tZ0m;ALAOYj*G6R)++u} z;G@`;%*)K6ci1^iJ8CK4#jk$g>=>xF8Z&m#^gI8l01`@>b_|&ZaU%L$KaGLZDRF01 zg5m##3M<|Q$T!t;I@?#@5ADFnNBt@6d?;EY&U`Fv;dSW+b;rb?&uqY65dv|d%`h@QhM<>K zr(0D|6gJfjA8Z|TL1R<9s7{n!GwI#R2%1NNn;=_)In*f*r@a>JJjI|MAhyUwIw!sh zWV!K>JaE)jPCadti=^1ie;0KVbq;*D`i$qh69R?8tPoND$ai(~;%*e!WT!gvc9?6B zMK6C#Vo0JL5;!|f-NZhp>8DV!!5_b0fhUMdjdmDrvoT4Zo8hHk?{7&XYsXnQ$Rx2B z@wkh`lZ74(VkXJXv>;?uYA@y#`w~R~ykQz$%j}@uxgx6QYGcrKp%9h%`;NrChXCgS zKr7A$gUYp?LVg}P0$H(Mw~>0>AML;)xwerH;9(Yl zO~f@+ZYgfO2~|Lace>)$zP7Vl?>-w1BCZk@TVsFEcOr zK_JOMoa$u7v7Nxxfcm%mpQSB1RDa=BCu8B|$Cn{SzQZmtMpQMIGEBQpsA0$2N)=5_ zcY7cFDKNBX{B=Qsb`NxZvG62=G93< z)-Ek84HFn5oGrwRu4E+1N0UhS*$$=shYO)yWdQFR$ zZZxh0A!6v5}axOIGX>}F6=4NtU$JJ>}|sCs5^Z{|{=4aEw$be`3@Y@2RX8gkW&Sop@PBJ(`n z-B;BpS1iQ~GJNg4D-=R^d)|471EYTYBm5>f0V^NfU%ii>uv4NVWS&SpVr>M}|&4+guh zlc@`215_gg#v$V4M1?BTOK{)-1>`cTT#a1X&KrtYn|r3n`CWti%6MmxqKef;Thavv zm2@L-30P92q?r0{nQHs!`oYhz?IH54;7P{UYp)pCaQl;2?F97QVTvs)N0@uCBia(n zV25@4LN7bS3s>XRX#7_H^=mJxqdS|75g=*LP{(BP3reCVnAB$+f4lV1v!pJ|Ub1W@Gdq+tuOsT9p{Zy{YPvA~*?V*-FIDk8%UVKBwh>I} z;Fo|T)MG;|c%V&Yxp&RzI%gHQ_x(5h)4j_z#7B(*hupuI1XtMHbWpq}CmGS&uyR4( zL8+Vx?tB(}vhrE2De;blzHZf8=nINziP9m&Yu4agIVVrBMDaW)v!x6};}q{UT7=kI zy`Qs5i}hf9(02YXK#b!`Zd+a#m*+MH&Dct8-#{@$!Vr^!6_w;P!b}=_x zJtQkBg)iRq%a_Gu!$l!ou|$i?yO zD%y?fv+8V#78UKh#?9?wy_dwO+7{nfB(OGWDZu%eB}c~Lnv)0m<5lApJDy|aV<1UL znZQGiAZqii2k1+afG}3JraOQ#d-RRYo{)&J*1M|%^rZMz=LAY|ER6y=SGN^oPAbV!^Kt)dGJHT+V;%aP6{>B9LOj6tPVi7AZmFg8)=nu~rLm0SpamR6zI9pGzG@~evEfgi`AbKZ ztu%_nxOqI^AclparpI5SGNAs7_i*j|g-VG^@+uy+zq)OE;`s(g8sOXS9tk5Zx#jAx z_aJrtXZPog;Mwkm3+=C0_8}Z7WmgeOfi*S3z#oFHtpSMdq|)L>CEt<^C9yv+ry*Q! zs5Y#g=FBOn<`@xSwlH?G9q!gGQ3ZHOqUN7ilVOdW>nfGJF)N&$XD=Y@xce*kpziQF z#`(;1r4|{7k4&o2%L}!B*gwe53X>n?#UcqO5G1uf5gHaLQj5om1LEP8mkQ7?VV_1p zC-m(^S7dyRvF{?D?O2P%OM9wbb3E&zg{SiL+1H7R>{!|Xf7z(zxYV6s?vC94@yI$- z^L$mszW>>QCR);poS0>eB1KVXk3rkrVB{+98P?_w_`m7^jjdm3MiT>^q=oX}RY zY(t()rezS6{CT?KTb*S`A2#*Rl`b=N<9`*8L?m?jr&x2SIs>fmga*r17i%DPA#iyl z0c19;pQjRt+sb`8@7w#YvSY+;wZ1Y+=>1r-2BhP^2u&9>C@o=0S-I#7f+g$JH!P@6 zP8hmtMmUvtdO~U7x1*ndU{&8{bkl6q^_*mniamn9PZ>w-~W=_LlT_2SK`CPwZY3s|zPh3_E@a{J2FW5C6t zPat=mh!}8;B&XN)S#}_gCfhwjcRyM6)AzaAQ8LKydsQ%w(+9NGiKRBkXg z(*g=Nq`hF4kE#MesT-tEMW(!ub<-Cm*gOAUeDKVO-l_Pzo-&H43D6fbL@A+Y!A+l; zciLH8uMUC7Qx`|rUin!kwf#C%R2AQEb%MiM!Lx+HmU-akv}@O;V+uquDT0QMT%5En ziW9W5@G2Y=({&~eJ{w?*v^R%B|EF$n86|kk59x6IQkM=HYaeqTyCy|kx$=xQ+nvKp zevXyhAR>&gK2#@TJ7!Ef!iL&Sj5-1{3Afj?wKuU4SNd*`SBICrP)W7oV(XunZ&@@G z&1t;>1GQKNXR6%`=5Xyc*m+KLGy(G)mCg+jDLE@#F7@qgwIjwl7Y}2!$S#^WnhdEM zFJ9N22cU;td5a}SJQZPA17mv7s!0KJS2H^_A@Krz$~=iF9++(Hd^O}YV`CMB!nKp- ziXyK0*%({T3pLIiQk7~(nUX03k0Q+>Z=2!Fp+lE$kL$?cG!62BbpV6?B3M)oo1V}EJ7z!ul@cD3sTJ+&s=mm6^R1e^aBemnMixiy*i+KG-O-6gYn zC&;U&%swmKu8K6pJVj}xx*CH}O*N7F%18~!JplhM2jIPu9f?~K9-cZ@H#DPjZ%X63 z8ydp@%rs>HJzi&Jd0bD{e00o-Ek%w{HSjQ8)bI;v1);)2aearPEY*!9Qm%Pth)QST zkB3DRWzd968w^d>PO+D_AU*zr`z#L5L5?iHrT{XdM?x4@ufZC;#^_+yGi0;Sd4@*a zJgqP6Uv<*>tI>nBfr;BVIvQaTV7CD!-Dvas1+@;Ja;SH7SU_MRl+&@nu)(4VGO(r} z>fStsA3vp)2%$xus@T{Zm7&&&j6B`zr)R^ug3CCLR{M!eEWI=P6AhLIkt<>M;$~+3QYBY^+g8NN9$7N?Ym}joR^v=|AM> zRc@<~_g+?pJW)sl=zZ3%m^zH7SUdpIFx_aaR`Vr%F!@3%xNrWDa>VFtf9S$fyT;tp z<$fXHlG6-cmR0TDX5$WVAyL=5p2cxa;PL zH1oI~V)S;mICvkjUE|76Hg+TgBH=p+d+c$RX3D!uqL9-WXM>sJpX(`)$ma#LvmuP3 zyoSJWQLEmkG57LUvsy z(Mj6hEZSF(MG#s0^RrPxGpE|K-`68ckSnXJfy9|f-JIP0Dc-&c{_LFLnR_fyh#ZYV zcB33K3i6m})iAOZDsNjx317Ur%=#`%-#Hq4bygEU=zuu-$*U<5u+$t1L z?XfSt(S$0_7uGA3kaGcZIakpz7%G3HhUD&r_4# zv}?$JEg!^ulCKBUO|erXo6Se`hoRkAn8ZUq@h?`szBAR%mQAqGKfP|2z7t*D==pEf zDqqVg+TYXbau21=Cr*PRNS;GJgzr4yZ&6Q@xW<2>I)xjW=j%oCijNz5@}FX}I47aZRL{v*Z?=z18c{RR3w@ab`q zK3p1wbZ!N83a^+USF_F!|K#WAF0%gy7nsv2?X??M3%A(|5ZeZz%l8LJmw7x8+jErUf(`8fTG|wkdru=4f2h*|2DsQBwLNkr*^T_}BD4YDrOF z@j&JKvz-f$e8T}b<;z~$q2LQQR|6rt(yIc-nAea>x1weTeUr1-H^4wlQ;QujBJotH zE^L@Fyo#TgUBYiZL2GN~CW5EN1F|KEBXIrq4{&U=V&zXn07_HT^$M z9UQ*;X>tf%&-mL8=qT3vvTG0`R_A}jm;Wc!ymv^5QRXim9)UQ;(QU!Px0xSikfy^!qUS@wzKG zIJ{1J03>?EyzGCJBnrg;Y5j&cIYwHCx}%bD%`Q0-7OxBHQvz6_n=ED@04;JM=uo{SdO6r~qB zB^@ely@CO$^1ZMYf`Ug^+;Vbd`9kK&d`3w+E~uxYD_*sxYdv#uDw^$*i)ow7=gSP) zV*l90`v+T>tDAsJtjp&`Xbw@^*IXSVk_@LUZAyJ+^7y>2grt?zdNEjmjQ3a02Va{y z$Cpr+yr+?!y1T04gWhp))XsYClSk#VoZ1Q!u@U{XLb~ z`*iBfW4aUg@9)~BC9~t`_4P8Q0JwUa;KwEZHVwsG7>{JfZ4W5nqEc4*_*S{sHLlsx z*tq(-zJ*LM*_NeiBD;{dS^e`T3c#gqn2q}8*1u_q#j`kV9062*v30pLF+HtG(ZmHP zYCGfcoNnrnwJV?QZz|ni z@Sn~pD0o)vGYxy+rHSmcDvM|<*Hl*{I0lz1QNI*JL97V__#Md7x(|>_9v2;t@28qq z910;S83&sJ#O2x{26s%NLYnK~YMqz5-SsctSGp!eaa_+sv~0ZT?l+&xn9}BD8}-39 z6`(5=@_$jWuHMD!n;TqD4nTj<(dLd$RW8H%b@Y&f`%PhrwiinIhhcNu{YhEP(^N6wsSHK5pki%38kO@{<{A$`HRw6AopNv*uOd&i=rg^a`xR^wrkh)kEa}t$?_Z;E_f#} zk-+!Ltxmh;1}{XhHE;<4P=qx6C4B}5bIwT)%H&aM{a5}PZZW(WilF84XL6*ChussH z`cEUJ^ApVEmGYdhPZ5 zhGW(Su*tro|KFLYsX_d`yn%{Of%4~{;L^$XUlXe5F=4KAIpZH{BB#ZlXeJ`iv!RV6 zah>8Hb+f^5{MoFh!~l3d9+`4s{$oF!O>5BVuqL9B0XA)I+Nn_R;fkMElz2W5XhfVo z!{d6-UYLDT^1PW4G(M`wZ-(^v!`yCT!&-Q;m(d2QRWTLq=+$FP@ei9atunX z^eaNwV>gVM-hhRcZXLZ6;;>*w;t2v}UMDIjXf3Zd>41dtK?yJ}<-JHZ;zGO@e2vcw z>N7*Q$9aK2`10rpa^&wE>du{=0$j|NH>c|YgN-{8Q?w3*G+|=TPNR-noAIodg}fEA zAy&fL+@Y~SC1+TBIQoGO70<3KIR%yKbWr3fc=s=&LDyWu#M=38dNT@}hXEd&cO8Tw zwSa4MCdx@Nuh~qoZ~0DL_Sfvj+)C za+{wH=)W@0P2V{9GlU~;lPK4Q^(!%az-EF(~af1uSngyqrKAb6nIXx(BkKFVfi;Msd0>Xv^ad|r$=04dPP zOe*;_3VF82nVb=VExy#Tbq(Q}0U^L3$@eXE+MkJs&p^|_vv7>)!AJf2wQ`+#vr^ewuj~H+L)sq)uzFNVHT7E2#JD;!{89TsBeVn&8;vkS&%p zH>vHW{K9Zflsk^uPGEntbx!Cd_w#wg_X{Eh`2IU8Km6%Gjrjlb$@c&?Y*^-N7@L`4 zR}UYebjrZ)75ZO5T18AW=I_|p?ylGH8Qo*CYr>Co|9r*nr*2QI6RcyT!apfFj7+8; z9w!m`Fta`Z&CR5%#cPSRn{>lhp4BIf{NGuAeOmi#i-RBVQb|NW2ZC8;GCb%4Bn}JN ze12BBmXfqj{pt;3hHjenb|Ihftak|8~Eq^W^l)V ze_dn-nwp%7&6Z{p8CESX|66zXzkkNY=U+>@ueOl8OUpA8yK<`9kxB#zah97A4j>26 zMJoOoUqS~GVuAN3JoQieP56+Ve z!}VORhs#qTTLKk|DlnOopcwX{oH_8zlw;0m%_`j<=HJ{)<~Sd#M*S+z5X`L#d^ zYKfdpLp(@Vlja01_0p^H<7eM))Ao1yuH{uez8-BlMDh;aB!5O7jnTD``6ZBqeU~B* z%FKInyO8g?x7iar6<$T>woR|!4&rEY`DMK#?@&E%vIbF7rUo7qFT4p6PFAnZQC_Dt zg_Ja1^e+u&f%f3@`VAvERxR;fzNBsgn16ykBIciZNN2z|9X4_o1Hgc42Z?)uaSB|4 z)r@{N#nyzsLPXSctubUs<0n<@`p+Q&n`XqcQ%wjTIBD=5RJB|j}K7yFeNbpG{i2A_hc98|p% z*qUTQdDysAdO>n|ze@@~)s~)qW>PW)7o5*iXIKeEVL9f!fS(dCZ@bybn({4}tE?$+ zSr?UD<1=S&&SA|A@$0!kPba4p7*B|eQDt1Cs`_NSzyXfDMv{}9tCIL~D?8%;{(5=& zPvfNFR6V)xaFNl)&BU4Mje4VECLAgzG0T!&V<*Wq5z$LOD;#j})esB_%uL^cW^2@fcTCKV*jd}Wg^}^Ufwom$)F3qpn<8N zp^PnIMgb}KCP8s}ZJY_e*oBXFs1TLgItU*Z|AK0lJzr2Ck4_&ILbljp-bY1k2R}OZ zJ8KW_vu2-bz(AD=3f$X?^T5>~ggZ#^)=e;Lqw_>8F3!3q-T5NsLp&z7$apIm% z+1D3XoQUcGJxJV&uq>sCnN{D2{7@lK)M){A#idi{WJkHKE;1i+He5WE6NLWQ#}Epe zaYm@#e=Fah1=)Fe`qYuS{J~gkP`bfK`R|5#MrCGEP(Dwg$zmIUuBVAmC8z0+dPoO_ z@v_e)uYJcJX|qv6NN7kE_!mXZTfC~4OOG50nL~xX%D+d?AF`kme}_%VT$)Ak?S0_L zXSK`^zkeTu4*wq4wnVNx{!88LHjS7tN@7n#c;iLSwS~l8$}`VRCu&;w(54)n)P4c# zM~pt%kWDH^$9Exh(+6H;N7TV6Z1ko-qy^}mZZ1r`RKHLU&?On4XjY_sH}4Uo>qdC^ zgZiy7{j1~PVYiY}^}!&vD7C?DuT@rRi{|XTMs~9@w9zk(DV59zMuYdC<&sP7%=HjPWfUK zIFr@s@&VbeIK7mOc~@BE!azRj4l9-c$!JWAjxEGNOJosrY zRiW$Ps3c4EPk1=GPu->#ub2VyrM*^7O--Xu&{_id>~20&(Z&Scmi}OeR_o>LycqJ` z=J;-3O;=^R9Zd!{|L_KOZ`po+G}d=GUyqj+Fqj%G(>Urj=x$_6a;1YqQ{_NPtj7Zm ztvYm~jx&EIfcev`|y~c5E2Iv<7 zhFOosHG?UtCse(5jl(WUDYy$m{0BJoLz811q>H0JLg6WFNr^Uceg=w1g>li-QcNK0 zeLNF0eA=}fq)_}w+$vr2!7>_MKu_fI)jwXp6mRitX6BsF^c+YG>?uFQDpX~O=YH8A zcXj2Wn=_Y;>!=gG=JjFry{tyvaZt@kd(=Wj|um%5-O$H3*bV z86g&GVjGz^qUe+0^5=H*A&$yJ1O@m`ZT|>*XpiIU@ z0vBg0QT~P1K)C;Iq%znWe)6w;r$OoV4b^I-8a?X*U7fpk8c&;RFrj4EBonP4({Kx>3UKna%wlrRKw=yt=Qz*Il>TK_YaAfdDui;+f;Og+?a%T)aWN<^)Hy5h z(FV353lik}0z*qBE-F4ivC@f&jTIIi%XO|(6ylf*XL|hJ;a_S-zC=bN+HBPWhSf<* zf=mul6QM9L-(~-Zmpg~2=&NRHL!s&UnFvAF+_7Wi^L79d;!2GS(81To=k`1nA?Yr< z(98AW$>;4d5a{tGz)g5xK1XNaxYDW9x$DF+tzp#|rQC7$v)ju#k6m$Nv%}H}kcNr4 z;Gm+A6cr7+jZd7>3iha=Ile19>Vi&Wyk1LGuTs6dg+IY|jY^TSB#EhsmMuJwDBp0Y zDZA?i<)59G)7`t;=Ud^%4B&cXf{i}0w)y|G&th`QO(kzg1Fr}sHO$;Iqk-k@mzxZ~~mDHO}i+cvv+f~2Fz@xg^2 z`~j4{fway`f5>?Ol@OU+=(T^B1+lhV2WFQV9Wm`u!Uj@?6BIW5{cO zsL(PCEYPF^KXU0Bu#-*E<#Zjb4J&HI9y0ula`yAI2Sujte9d$pAv3`Sq7OL%_bE(Y z_caVHyuA|{jiG5fkYOr<`(z_Sqt}{NAS4Ngjm)~XEVI4l)(`4lfnyF&I>7=p01L!P z2V4;vbgR$df{WkW7fIbl@!q{;`ihu>Y@< z)xYy5T|BejHlLEwOJu*qHkf=(R&qW%C@7LI@h&2u2z>>nxm9#*zE(|^Dl(iw0BLgo zZK;~d&bfh0l&ukzi;iYF&Xe@D1+UsT4rHY;1DZ%70m8LR_Q1x^wgUdwSugwDn+yql`ou-~jX;i|Ug`mMsu+vw}&rZ0Fp zA8QI&;D00wy)TiVcyXhZbtqJN5lC(w^&k}4kS>D$S&=$}^PW->Me-)$?zH2m9%5_B zv0wGo4PbTtlAa3|B)hZ1^pQX(ys}bW)**#$s>{ITHa{>vh`nr6_S>TBo#Dm94DfW1 z3LGMh7PZ{b23jV4Ud7Oa5iB3Tea!v}_D1~0dV}?uM>ZSF$lLv9)BVUa>YLXnqj!3$ zKmtrVj^r(!F>+dQs%;M@pbQ>=*pfZ`CxVcKo#LamODwVRUIUfhcB0s(FK_}Aug9Yr&V=GKVqVI&831#unhhdd^I6&L2no8XYN$WE?8Kp zS(MrO-JkVpB}`uA?d$zWEOxbLBFPr}`mxp7u5!}Ke>*Sw(Z{rt#u_8B3nR8^-iYW_ z(|aqUAIwhNY7{rqSM8fW>yQIVS@G2tcv(1wN7KaV>BoVjc2LSCwzhx|sBH=g{aB9YTzOi2F()3jQi5Y>;*x? z$pu-ruk4(kasM07e&Z?vfvQD5&OhH2d`jO3Qz-@66p|M-f1kP*gc7+?ahsD0<(b7w z&smtMS4B>lC}J;$UV8!zJV!jZv3de&*eE#|^JaSJ;1a&q*|19+iykU;k&)x!s;Gz$ zBW(zz(UO`PGMjb0n#D18-oN$;d^@C8{woGW?bG-RI{`V`#IUv6mZ$oBlC zNd&-dMux!MSz;!r7-xHlIH2D}L}|OLBeN1X61?84S`aop@C)523ucSC6#N&Y;t|%b zHGxJWJ!WC4(;{99y!DD3;Rc-2EauIIqh>h5tYB<&ZcxfF_V>UE33n;8B(|FY=WV5}3jfyKV6M*wv=tpHtI3ZF{kD zbXux8d{)`EU1VIuV(K%;+ZJnC}ic@ zAaI?0pD3>4<5nj+CE!!dxqnu{!Elqnz+7p@DAT;Ms92%}FRFhyyKsyIm(TZ(B|Y*T zIui%-`T!3h2Q<5WP_8z4@xDPVO#4go?(%&ln?CUiu)p~~bstdZ)coDsFU*yP_E2MF z?0k6hy(#m*t9|_tDlk8gvGslr)K4?<=#p_axgPff2wN5Yb{KG!pl>(hM3SbjRqKWL zmd`32Vn9ae`5j}}yL5&hbk6%^IiumZp4|}qc1^3R%CaJ#5R*Q4*G!4&Q8LZrOgzI@ zC=}|ddrFG9!r15VrXqb841C0|;lHYTa6HvNl$@oSu=z>H7F^>{Ueii8eEC zSe!kHqMT8jj$qj>3<{D-NX zwDUiZeUnyvFr%M?7SYet>MXt%`AXZ@Hx_!nS+ggr86cLDL@^Pc&kYpg+Is)~Qk0D< zAEGgU3gDT{)A<$-FEkW>o$7l$LiJdclSx1$K513+`zN(wn>C@bJdS=Z*AoDYG9axg zaPi8InZA!5f|O^{!yzxs+q-E%-NCO&Sy72~RbRm*Fsvd{Mf-xV((62f4jhx2X*xHFx}!XRDK;NMF`@syBmP5#JZ zA@KcW0OMfx^oGx`k9F&s6&kleZ~ACSw5H+3y|FNZguI(AQ|8*j70*Nv6OGBX$9%!M zI?Bi;$4PtQ1^~BX{)wAg zF^iYPcYpn;&GxMEaw}rLno4>1p+dn)bwwx9n{Se-7ja;}JPg2oo< z+ua{ME+%GX^A^rzP13VmpOKA!`OTVt-CoOPydUj1LVmJu=)ZJ!H5-l?=se!*E#Dz# zCN2{NTQ$ONR|DC9hk-!?`-|?6l9Q7!4`TURNvP!Qkr>6ZqRLP>>B6C+!pKXH0-^g~ zz6-3S_QB5hh0*VJCH(!vh9y?5o9?S`d%b?;Uf@ng>^i8(#uL@?eo-yGQI@<|CQqpmO%~lt4G0yet#7rv-QHD`P*4+e|X+Mf#LqXJ{*H1Cj9-8j~IV=QNE;MJBh4sDZ5Z59?&!2VCIA$ z5$?f{@sqJ>ukDbaS#)rP1uAt^ECYKH(OgRg=t>r+ujWU1{35RU`X1 z4U>5MuY>;jV<3dsDJrVNe{58b*D9hfS1N?fB6bE0qA(`M%LX|8tYR7|#Jn`bq)AP; zGMYh|h(6kl#jq>Twn??3rPa#L_>5Ap`g!8w3%yrHF7O%d7Y-Tq(C*)E9w;w;zQ;C! z3kv+n%^rPv@LCzodD-NlE`xC1cZv=eh;A*wu@wn^mEGex=aRn-E5{#}Ym$peYDYhH zCti0=OLiF2zoXYFd4(NV&^RrXC0*H}JjHw2qQNAz>e%Qf!SVQ|1u;W{SZb+spYQ(C ziOC$7C-c|mSG4e|p<;f{IZiWA2Xjj0Mo8(m|6&2Sb_HEI;39mNFe5~}DPYfch{v&e zAb`9w<-%tFCVKdE!BOs$7xj9K6Y@LFAiWY=kiLu*{Wg2wlSl9=8)oCf7}>4_!G@z< zjC|{p+xk`$oY?8ZL<(lYIdUgcK}5l4!26#~{l0l=+l+xHzA1b$TlLqi|G1Rho{ujV ziHKV}QPg}M56ePXku2qluZ37F&##fzf}erW#}O4Q8(;D-7PoWYrQP=A1M%xu!kO?E{5jNj}Ob14WMyFErAC-Z+Xc22>W zMcuki$9Bi=*fu)o*tTukPCB;HvH8WeZGEwA=j7&`{qJ+JYuBh+HLKR`oNJ9a#yg%D zOJPmnN8ldMM@Lg%=_gee2pBJ#NMNxOiQ~KoE{T&7K&TOIpUNMprC<_mIC~9Lr^M%3 zw#W?}WyPWp9 zkc@Oh7*bQY$jcifp9-xX@CPnu^z1*TgS$23Vt+1qpZrjm#$?N0%b)l}(oW&RV{< z@A(l&o9(WBm9&7B9M9Hqs;~*^Ox&}_y zLi}*tw1Hk6bE^6R4`=ji;adIXO^@G$p3TXJiiMNYT=4t)>M+q+yE6e;uM!Ij3tJv` zgOBLg=3WH6{;n#9EA!4&Qv`hRvZu=-#2%i@uJhH`Z7o$conEfL{JtBj`AmhmNJc~B zxkYf0R|k#e9A(!sR|}k))4=M<+b-@y-WNLIu06Ka_(7ZoA&gl%y^VVW8JZ6J=w3@& zSIFG|Q@sFTj{^P}K2j_)n4BJ|PL!ip6$jDkUSBW%Fxaa=@1uyJ}6aHiZG6DLoHOyyxq4m4s3abM)74P)%i_SGn&7#r7)2}|&wb+F z-Y>E0DgJIbrH83#?6;k0K%>XK?$!NlJF%qg$;=joAni$65JZOT}F zq{PMA4HtqU6;q=T)j#@)Qp7?b0fRwjdCw{FD7F(#Zk3Dla)>b_Uxwao+I)`IeIN|H z-;V3v7e0#rZa>6g4t=+y6TQ$V_+Kf2is#v%JYsMvBS!_FJ-GI*pcNc~oc3O{nTq;( zXZg}AGw!`-wITb*A8 zmaYg=#KOt~-(~xAax_}qBvQyJYAK#Y<^SBs{kMNWj~)c*eeZGSm$02rX?oRr4n>^<98mC{j>bsC;4PbE!Gkq#@8a%wQ|S>1^Pv zvCtAs?$u`h=vVyfEw7(UnMbTJjo^$B%Iglu%6q5$<(Z+3ZQvuqCE9t*n!akR6h@xL z9!}aMYOjKKLNRHst~EfDC}U#aj@Y zF@p<&>~78$`z*Uq$lm4MF1yV#rik}Vkh({W5MfD{=1{Z*?bMqh=vy;+O&>RUoSQR- zfs+vYi(9EgNn;dGs<`mjBZDv&dUl^AWc{OY#e_EG!_X9*N_lcKD;4^>=pJS@Q~l2ivH!olaR1K-=*=X#a)7Vcizuegn<8*$ z39v3~?X}4tp3{5*=j{I|y-X&(ud=-Vz5^kyk)B;1B=+mTRX23y9%yQI;?-$YDK3MgUD!vsOZ$u zTx*1!stbx3nPm~PYAx)N3ymo`a}9FQX(lF~F`3%?(RN7=x#fzYw5H2dxVbc^Oa}Y{ z^a9MN)7r==D4oc8903i+$EL6T| z37H2I;4Oc@*0z}NgD&{^matD4+pGX=5G7?s7d0$N^fizgsk7YfMrhd%q4D4j&>r3) z}GZ+&)|qq?K9-tq8?@AFv8?|f}SXm_p%_p4A*Lx9qj!8*T4WHA?B%}NJ z5K*^5rjCsNH{jp6`r1)7VQ}YaH>*!hQ}%Ro5y1|`vL_oqQJAGHYjFy5gC4!cCF!Q4 z_@?5(@%2*IF6N9rG*JAv7v=Y5?+ky~Aze#L&VXh=TH&1gX#I{PCj zX!{zm&)2X{O_$#VxWBONSe8|-)5gfMa?*N!e3P#dpw$dv9@amx+p9{Js4+u!7RgZf zlS}Ez=MSsq-ucAnh={^BI?etfCxIU?{E15$`xISZfJ7L5$U(iY~& zUu@w`9Ju*^Z2f5xkz+Z(Amu;$JfgE}uD%Vj5sRH{T}$&~3c=+RQTcRLr6~enU|_E* z3PI@&&~(7SZ73!7u&4st{9Ei1j9s;z4Av!?HWfA6*A3fj>V-57sM5na!@~{%1J&j2 zoi7tRDxD?elPMj6D$Ypzk!yq2IG%bV9tMmmPu_caRVtW|&6Ljc`f2rtIx|7 zXSFn~i#Ryi=c-SHb@~?uX)x(cAd0S~ZRWk2c(tE<+pqW^9e`>dYO=aMXPys>@1H?~ zQo>+dEUB{9mJ&vtW>t}qyYY7a#bc=dQBD|1 z^RKplE5V3dSCnGO@LuR+7ZoH+hN`Tx=Kx3!hMX(D)`qy%tg#}qX`j~uLM#B!U_>Ba zhJgxm@ISoTd!d8PU{6mI7qo{Q!=isU3+d1Rw}=#OQNf5nR2<<^e(%H?8St!`2`m)a zT4Qb+79OTkzx?us2JP3|f>^@$(Q3A*E}eFAy@5CVu<}E2ItA<1>JaW>=1$+fX4+i4 z#ryr229|>5BTOhr$f0F1u`QjK3Bsyw3+IGxRlIuYR0ak);r<$~y8id>#8yBMFZv74 z1E4=;F+owH%Z6u(Ff;ow&V~o5wW>`xJ9pc6e>qyCE^0Y5uz(9Zr$SAE+7A9#K?=3Z zzNDrrV~Pq!pw_N6e~*^@aEiEmA1fDq<<;wAVq;r=nxf_Z0O)wFqC2@@ zUm4K$5Zx8;{KS_cxV1q*VkFQ!e*c?L5>#u~oA-gIJXqu0j?;LKy{wXty#gq zH|Mmz7ZZPn_iKG;v9%(L*X>sXuP3*gtzA_{WAKZP{UIF#0&GYl(wEWZUuJ zIpF_F)@#E;_CVqAAyj&Ags`v+f#$Lo&lwAi{n);@qr zO4~eO6v2qi)ki`yk)U@=lv z8sQsW;iSZ-@eAUX6!a|au6S_FoQ+bN1pyb zn_-(mAfjFM5ouwAVs2ge(DK)t@)u$*v66WxjpVzKk+@^m%+Luh>~7j2NaForl*$D> zyP9C`P+UJywx3OXg{|#!fQKk9@6p;b^iAt($C*j3WjkPYp$9{0pu5amWAw>1&}iB) z8o$k&WHBGk+G{4uA=kDx=Hh491sq^hC)>ewh<5=EKX&!2_p zy4@cJ#lG9Qr`g{vfmkC;trR23VB4sZd>j35K)u+NUd9amOG#+xDXf0p*E*vf;ZX~6 zBjJYdru-*(2LtK5QX5sQ-Dr2LK?Am-)!z<0Beeix=47=F*0W~-T?c|zcWIASQIi9CRF1LYnV`M)tWypsOwvT=9 z+g94pul}bV;(xsp0uKxr!HU8P;0M2CE%hD;Xz%tXN>aaEKPy)_JZ(xgskYyA7tP1K z+W>ExjySuATdQG~sGhsA;=gPn3eY0Q9-|1IaZx!1%Bw5iM z1C~@Cp4%#5%Ey+XMTgVpoVQ1TC7*WHN`LX}ocB070R4=d#ZX6ia%a;^)Q_4Y&O$g> z?bc^}(q!I5LUIF4ICMk{66%kwTCt*bUk{zCC{D%1x~!Dv%K z;n2W%Hh&464^I#!jcKT5E7<<>)=ccLu&5nyYgDqio$6+T_;QtDaX7Kn zczfa`{Bg3R4P*9%TXAubq>zo!zbRFD*P``NZx@r*uihJ%&wdJlcY&^tNw11G@{c3X zIX09Un?_1K<&_~%giyZdv zNIVM5_k*ei2qF5r?YB)@-B};cs#*1w$+VuvL&)wWoAGZ6XiX^@z-dT_Mlzn=42!4O z9PFtE(?{UUL1ZCG^=i&OhexlS;m!f~NR>|76;&?dz^b~s8f`;S`PE4$V(#>zIz5CX zgPHwNQLn7e`$(!{IvB;2-Z|x}_DzXGT2W5502mtZ4Up8F!VocOJ-a*4b@nA=CMr9n zTYgp3%-zk&)OE%os4h_3qzUxd>DwKi%4)s2iXkBQn)R0WJc{J(@ZHmF*uA|ta@2Sc zb86Mb7tv{$Wtxjp^2#ob>+;SgA!i+ulS%PlTV;lV>cp_ls@S|d-8gnX$q}MgaN6Xq zT(IF!?&XDu2xD!qc9#xOPa<)*?aOU#OA9jO5a{GscBqux-6b>9GvS)W!3I7#7ua^{ zXH>n$w?8UdWlmBoV^n;}U$J8l$35ge5}?!b-wb6}v?)EXv#0#bVc<$-;9z9>_p#Y8 z%rm{=WLMpHw@g-GCQPR7s&5b!g29T6#UXh8SZB$T!yB6@VqChM$>Dq_B#7%hUYhEL z+2v?5m*IDbASQLlIjIFL!NOQwa4IMfW`NG>LNSR!Lyo@2$DSq^cnCD9k9`%Q35VWX zAmGh_1`(#l78`ws_0l_rl0%|0WqZc2Bs(|F%@#0&?>u=H`!?s5uUM?2XI69fH86M~ zbnw0TGb~OhMe5Np))@Wn4{WLg_;XeNc(-CnzaOXAC>tA7_Ixzli6csv|95GkT^w{z zKWUYI8e)31U{vS^EBHD?r||sfCKKWb=b7!kW%?eIA~|KoIubQ z$ux3b%vqX548L8yk8IaIk&Wwk5#?)q%5wpZJ@8TP-C+_vI3*Npq%p8g*eM=a+yqoB zWoz_r>^tX2VqVErS!#7p@w%nng({j2R&|#h+{gP#QD;xdavQS~w$9ol5DRUlXSI`oryOaJpW7xNw6%jDK9Qdfeqdb-u7tL zq$X>(8!whe;1}zP!;C6<_CH(a*Kw=Y@yt`W9~=l&FY>PoEpFU?VNd=424u?!KVEeW zuD)h)39XGQx}#&RWh<=%rzP$+o7ze52VY8@7P?P>Bqp{bN3#z+Ty2rqYrSqvC;}1Q zMOT@ ze~;Qj7ya-+&kprJg}P;XA?~9|#;xqm6F{y)CIjPyNDOX}-KZ{rs_?*YMf*F zP0duIjYn;UZV8^R`h1Oi;SOsal6#1d#S~vdTvsn==}ic%heFBI{Ubdvw4r<$Pzo$% zOPgi;JtLNy86<#%)QA2xLVPCZ7g1Xnjdv0B7`g}Ic3u_}ZY*<=(&o8;j3YkBU+$k6 zS4>N~GP7MPph^&A?=QLOt4MihE~lW>6(KE2x*YB-brDC7O+xNRwlLBgWKJNkJ0eHb!VIzary8VbMUEIm zEyVo7#83G8#!Q9mcF%W~{tS7V;ScmY`MY;$aJ|t{%-alDro6~}lMnEE>zEeU5vDN} z%)_b3&yTTarMX`(cocpbg?OXXmN(b|_>XkB;5W=^2&+=3LlL}uk8FK_VKJP(sxu%D zxG&JZc9AHzdl;b2s^skWWPEJnhJB6nsU;=`+!36}pe$xjv1z-1aF%#z4 zbtXFC&*N>s9lnL6oxzg(LT4MxSyptPr+0ljsWSiX#2*C98 zdw-1!T9MYEM{2t>@b)uofv$g*DR31u%Fny6>w^SGMn|BqDZjbU9;riATJ;!SB<8*w zqs{*L3~JfS{V(9h|FjaI1MSs6%w@O7yR@SPU7)wc4kw`g7~q*(UGS1D@-9k}yUIwz zF%=f}g(97a%pej>sWw~Fsco#%C(4E##2$%a)bV$=A?~UQuwM}}FU^7{WDQ0vU{Ema z%|?$Wh*F~$9Vv1+nyYxYIf&M6)pUy7eqbl`dtXWK6&!T_z@bH@3O^_`pqp8_b)*wu z;c2hYwcGFMKNu4I`!{7?nlxd1Dc{vShT1iY(4-ZOS^;l(S5$aO2btew1&Y?sYRjOVZe8`>a_H*Iwr8ud9-ry z7n2$+Cv$4Ut=sM6+2N_6BPn=_Q`&p2r=_pNL><8(A>^@s`KPs7Sjeb@OanrQg}ju_ zd@A@coA6LZC5<>fo*Y`!50Z+jWF5EWlJbM8;jimeFOkuUt_z-==gsu-hFINh&(D?H z+uJV1GV>#;A-Ni5*(*XkEG;`5S6^({w!7i0trtSa)^l<5q~rAJ&5%jK18a5L@Ci#U zS19KhuFfAp7-f>z%QQEFi}*ee+v_e zSt+XxL>Cuuc!hoL(W`t|anHP`PWrY!WK0TrDoB;qwAW93j$c0QZbj^&kR4WCHD5o~E)m_^UVOt-STsCg_y>nP17R5lrhz#i%S5-CrkucRPAMN4tVV=GhPc$5eEkNf&|4YOYibLy2&^KSzBp!$*Gy4ILPDmN)gvt;u>AUQ6k3Sb z?@iXC0SfTM!VPlvAYg{(-r1N0Miggn9hgToH|ZZdo2Q{OY!^Ze$_p3SiG5Ext@e+U zN6w##Morv0ov(!CkzfL}UXK|?Zjk5-;=g4i=Z#0l1x2~21ohw{O;JLb70WRO;g43@ zmaVJ%6)9h_>Gtf5C1vTfd|mC0mrHCb7YHw1Ux2so8?kK!&u@HJRWZwl$)p5Ky{^2~ zN9ea6110^Jw&Lazd^ty6i~^? z6X!B^>#S#&B>58n6~Y(Qlr$@-WaGLL6`KY638+;d)N!UD5^>-tkUj8>L8B~ox>Hx1 zc(1OPTUS?amlK(SM1#NH!WA*?^`5G#tE*p6YjU(6{2o-e=FJycbG)14!-o-MS=C%G z2)OmiRQ*KkupN1A>3-ICRZ~~V*&FI;>M?vV<87%=Aj<`H(0CEi(K4iLh+thno(G$=ct^tw#mFDY7oEZPELXo?bky5M7E1j?L|4fLg8u!$(Xe7&dQsdHcFr?St_F7{5E+5Jco z376&M>FFt3e(=T5q*crJF04Hub>v)cS5D{MkM%w7DN2m-fp=*DyC?gM|9M$#hX(**ZhMc?3tun^iz=1*pauc@I_LX9*R24 z%G#E;Mr}*hhg?eIf#I_Q69aeJ&csxF;iRCZBS77cfN(Zs^#fw8E?X7)M$5@XckMbT z@~h?Umyo-!(VLcnq9kvu8VSt5DO9gM{E;Pg3>0n zT`?~{<_ea1!4L2zJVKPck@vo|Q*oeNwh^}F`qH`#^Pqoe=Hp5gUdr}}6UOg!YGL-r ze`0VYjJOkPppHh&NRL$)R^y}EGs*YMnY|iJC`+jnYgP*-<4%}T*4HCK_w3Ygyu;l6 zJ5tciF6q*JX*(EJXQ_nqx$^Df5w72!^mKK6YyT>Gr$R=_7J6zmcxj`ZTZi5RJsmgV z#c}eWv~7^zKTPKgorgiLW%)NYQ1_-(IwJ!Y8NhHL(;*xsE6lWl!OX#!WzI=1T!3p| zj7^(w7U_^#7C3VOL%!=zIE24)1-BPx`)!P7ER6yu-vG+O%{4K?6qVSoT3~=$v<{jw z)Cn|L2_%x1c_?X9YEMd~j#^)-JO!P!VVNAk5W|2JzoHUF(EZR#`qxn0&jbtkx<>AAhX#b$p zC1YnzR&$0=5+hy5XUeAliu( z=$U(v?7P(ptSD9a8rc;Rm%ZP?`YXrm2zDaD1J+pdAI;edGQj>BI>{s4gKHc!j(_%Z z#LjNFAr}U{a{e++mZp4a)u~Uc>yvw-cKVah&?oY@#hYi)a7dMIWW>7#`iHZD+*}8% zKHZAMx)i|x5)u}S68{;QeANmA-_n5AKNCNG&AjD=Z=o}upz_D&L>!UtKm;_W#~yTNd)E(BMYvgoztq2Jb!e8TDu_Crff(Njse>edWRFXcJ0m+Uv(z{kYqQCckZ9 z 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 z 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

  2. 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 Iaecr40~l`Y_5c6? literal 0 HcmV?d00001 diff --git a/HDVF/doc/HDVF/fig/lower_star_filtration_z.png b/HDVF/doc/HDVF/fig/lower_star_filtration_z.png new file mode 100644 index 0000000000000000000000000000000000000000..e971e109083be8a74b07070f21298a1313d2f721 GIT binary patch literal 187504 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 X1+h!yUcF{e{wsNDAtm(U4j-D+J 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 SYD9y8GskZ;4O< literal 0 HcmV?d00001 diff --git a/HDVF/examples/HDVF/main_dual_hdvf.cpp b/HDVF/examples/HDVF/main_dual_hdvf.cpp index da0be54f778e..73a400b624b1 100644 --- a/HDVF/examples/HDVF/main_dual_hdvf.cpp +++ b/HDVF/examples/HDVF/main_dual_hdvf.cpp @@ -30,7 +30,7 @@ using namespace CGAL ; using namespace HDVF ; template -void mesh_complex_output(const MeshType& mesh, const ComplexType& L, const SubChainComplex& K, const Options& options) +void mesh_complex_output(const MeshType& mesh, const ComplexType& L, const Sub_chain_complex_mask& K, const Options& options) { if (options.with_output) { @@ -82,10 +82,10 @@ void dual_HDVF_pair (Hdvf_duality& dual_hdvf, cons } template -Hdvf_duality& dual_HDVF_comput (const ComplexType& L, SubChainComplex& K, const Options &options) +Hdvf_duality& dual_HDVF_comput (const ComplexType& L, Sub_chain_complex_mask& K, const Options &options) { using HDVFType = Hdvf_duality ; - using SubCCType = SubChainComplex ; + using SubCCType = Sub_chain_complex_mask ; HDVFType& hdvf(*(new HDVFType(L, K, options.HDVF_opt))); @@ -156,7 +156,7 @@ void main_code (const Options &options) using ComplexType = Simplicial_chain_complex ; using HDVFType = Hdvf_duality ; using ToolsType = Duality_simplicial_complex_tools ; - using SubCCType = SubChainComplex ; + using SubCCType = Sub_chain_complex_mask ; // MeshObject Mesh_object mesh ; @@ -203,7 +203,7 @@ void main_code (const Options &options) { using ComplexType = Cubical_chain_complex ; using HDVFType = Hdvf_duality ; - using SubCCType = SubChainComplex ; + using SubCCType = Sub_chain_complex_mask ; using ToolsType = Duality_cubical_complex_tools ; Cub_object mesh ; diff --git a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp index 8285370851ac..b7c0bab199f4 100644 --- a/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Abstract_simplicial_chain_complex.hpp @@ -45,7 +45,7 @@ template class Duality_simplicial_complex_tools ; \cgalModels{AbstractChainComplex} - \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model). + \tparam CoefficientType a model of the `Ring` concept. */ @@ -53,11 +53,11 @@ template class Abstract_simplicial_chain_complex { public: /** - * \brief Default constructor (empty simplicial complex). + * \brief Default constructor (empty simplicial complex of dimension q). * - * Builds an empty abstract simplicial complex. + * Builds an empty abstract simplicial complex of dimension q. */ - Abstract_simplicial_chain_complex() ; + Abstract_simplicial_chain_complex(int q = 0) ; /** * \brief Constructor from a Mesh_object. @@ -217,6 +217,10 @@ class Abstract_simplicial_chain_complex { */ std::ostream& print_complex(std::ostream& out = std::cout) const; + /** \brief Get (unique) object Id. + * For comparison of constant references to the complex. + */ + int get_id () const { return _complex_id; } protected: /** \brief Dimension of the complex */ @@ -252,11 +256,36 @@ class Abstract_simplicial_chain_complex { * \param[in] tau The simplex inserted. */ void insert_simplex(const Simplex& tau); + +private: + /** \brief Static counter for objects ids. + * Initialized to 0. + */ + static int _id_generator ; // Initialisation 0 + /** \brief Unique object id (for comparison of constant references to the complex). */ + const int _complex_id ; }; -//constructor +// Initialization of _id_generator +template +int Abstract_simplicial_chain_complex::_id_generator(0); + +//constructors +template +Abstract_simplicial_chain_complex::Abstract_simplicial_chain_complex(int q) : _complex_id(_id_generator++) { + // Initialize attributes + _dim = q; + + // Initialize vectors of Simplices and cell counts + _ind2simp.resize(_dim + 1); + _simp2ind.resize(_dim + 1); + _nb_cells.resize(_dim + 1, 0); + // Initialize boundary matrix + _d.resize(_dim+1); +} + template -Abstract_simplicial_chain_complex::Abstract_simplicial_chain_complex(const Mesh_object& mesh) { +Abstract_simplicial_chain_complex::Abstract_simplicial_chain_complex(const Mesh_object& mesh) : _complex_id(_id_generator++) { // Initialize attributes _dim = abs(mesh.dim); @@ -468,6 +497,7 @@ class Simplicial_chain_complex : public Abstract_simplicial_chain_complex const std::vector Simplicial_chain_complex::VTK_simptypes({1, 3, 5, 10}); + // Simplicial_chain_complex_to_vtk template void Simplicial_chain_complex::Simplicial_chain_complex_to_vtk(const Simplicial_chain_complex &K, const std::string &filename, const std::vector > *labels) diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index 2808adcf7fdd..dfe8c6b53ed2 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -19,7 +19,7 @@ #include "Cubical_chain_complex.hpp" #include "Hdvf_core.h" #include "Hdvf_persistence.h" -#include "sub_chain_complex.hpp" +#include "Sub_chain_complex_mask.h" #include "tools_io.hpp" #include "CGAL/OSM/OSM.hpp" @@ -108,14 +108,14 @@ template class Duality_cubical_complex_tools { public: typedef Cubical_chain_complex _ComplexType ; - typedef SubChainComplex _SubCCType ; + typedef Sub_chain_complex_mask _SubCCType ; // Constructor Duality_cubical_complex_tools() {} - /** \brief Build a CubComplex L and SubChainComplex K from a CubComplex. + /** \brief Build a CubComplex L and Sub_chain_complex_mask K from a CubComplex. * L : full bounding box - * K (SubChainComplex) : CubComplex + * K (Sub_chain_complex_mask) : CubComplex */ // Tools @@ -138,7 +138,7 @@ class Duality_cubical_complex_tools { } _ComplexType& L(*new _ComplexType(tmp, _ComplexType::PRIMAL)) ; - // Build the SubChainComplex corresponding to _CC + // Build the Sub_chain_complex_mask corresponding to _CC _SubCCType& K(*new _SubCCType(L, false)) ; // Visit all cells of _CC and activate the corresponding bit in K for (int q=0; q<=_CC.dim(); ++q) @@ -166,6 +166,12 @@ void Per_Cub_output_vtk (Hdvf_persistence, DegType, FiltrationType> ; using ComplexType = Cubical_chain_complex ; using PerHole = PerHoleT ; + + // Export the filtration + string out_file_filtration = filename+"_filtration.vtk" ; + vector > filtr_labels = per_hdvf.get_filtration().export_filtration(); + ComplexType::Cubical_chain_complex_to_vtk(complex, out_file_filtration, &filtr_labels) ; + // Iterate over persistence diagram (iterator over non zero intervals) // Batch informations are stored in file filename_infos.txt std::ofstream info_file(filename+"_infos.txt") ; diff --git a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp index 05d25b3bb542..686461dd1ceb 100644 --- a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp @@ -106,7 +106,7 @@ class Cubical_chain_complex { * * Builds an empty cubical complex. */ - Cubical_chain_complex() {} ; + Cubical_chain_complex() : _complex_id(_id_generator++) {} ; /** * \brief Constructor from a Cub_object (builds PRIMAL or DUAL associated complex depending on `type`). @@ -286,6 +286,11 @@ class Cubical_chain_complex { } } + /** \brief Get (unique) object Id. + * For comparison of constant references to the complex. + */ + int get_id () const { return _complex_id; } + /** \brief Get the coordinates of the ith vertex */ Point get_vertex_coords(int i) const @@ -486,6 +491,12 @@ class Cubical_chain_complex { std::vector _d; private: std::vector _visited_cells; // Internal flag + /** \brief Static counter for objects ids. + * Initialized to 0. + */ + static int _id_generator ; + /** \brief Unique object id (for comparison of constant references to the complex). */ + const int _complex_id ; /// Protected methods protected: @@ -589,9 +600,13 @@ class Cubical_chain_complex { template const std::vector Cubical_chain_complex::VTK_cubtypes({1, 3, 8, 11}) ; +// Initialization of _id_generator +template +int Cubical_chain_complex::_id_generator(0) ; + // Constructor implementation template -Cubical_chain_complex::Cubical_chain_complex(const Cub_object& cub,typeComplexCube type) : _dim(cub.dim), _size_bb(_dim+1), _P(_dim+1,1), _base2bool(_dim+1), _bool2base(_dim+1) +Cubical_chain_complex::Cubical_chain_complex(const Cub_object& cub,typeComplexCube type) : _dim(cub.dim), _size_bb(_dim+1), _P(_dim+1,1), _base2bool(_dim+1), _bool2base(_dim+1), _complex_id(_id_generator++) { // Initialize _size_bb and _P diff --git a/HDVF/include/CGAL/HDVF/Filtration_core.h b/HDVF/include/CGAL/HDVF/Filtration_core.h new file mode 100644 index 000000000000..2c60affb6860 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Filtration_core.h @@ -0,0 +1,335 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_FILTRATION_CORE_H +#define CGAL_FILTRATION_CORE_H + +#include +#include +#include +#include +#include + +namespace CGAL { +namespace HDVF { + +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Filtration_core` implements data structures and methods required by the `CGAL::Filtration` concept. + + By definition, a filtration over a chain complex `K` is a sequence of sub complexes \f$\{K_t\,;\, t\in[d_1, \ldots, d_N]\}\f$, where \f$d_i\f$ are scalars, such that: + + - \f$\forall d\leqslant d'\f$, \f$K_d\subseteq K_{d'}\f$. + - \f$|K_{d_{i+1}}| = |K_{d_{i}}|+1\f$. + - As a consequence, any cell \f$\sigma\in K\f$, is "added" at a given *time* \f$i\f$ and the corresponding \f$d_i\f$ is called its *degree* (denoted by \f$\mathrm{deg}(\sigma)\f$). + - \f$K_{d_1}\f$ is an empty complex. + - \f$K_{d_N} = K\f$. + - For any cell \f$\sigma\in K\f$, if \f$\tau\f$ is a proper face of \f$\sigma\f$, then \f$\mathrm{deg}(\tau)\leqslant \mathrm{deg}(\sigma)\f$. + + In consequence, a filtration associated to a complex `K`: + - maps each cell to a scalar called its degree + - orders the cells of `K` (each cell has a unique index along the filtration called *time* along the filtration) such that: + - the index of a cell is larger that the indices of its faces, + - the degree map is increasing along the filtration. + + The class `Filtration_core` provides elementary constructors and methods used in derived filtrations. + + \cgalModels{Filtration} + + \tparam CoefficientType a model of the `Ring` concept (ring used for homology computation). + \tparam ComplexType a model of the `AbstractChainComplex` concept (type of the underlying chain complex). + \tparam DegreeType the scalar type of degrees. + */ + +template +class Filtration_core +{ +public: + /*! \brief Type for indexing uniquely a cell. + * - First element of the pair: index of the cell. + * - Second element of the pair: dimension of the cell. + */ + typedef std::pair CellDim ; + + /*! \brief Type of value returned by the iterator. + */ + typedef struct { + CellDim cell_dim ; + DegreeType degree ; + } FiltrationIterValue ; + +protected: + /** \brief Constant reference to the underlying chain complex. */ + const ComplexType& _K ; + /** \brief Vector of cells of the filtration (full ordering of cells). */ + std::vector _filtration ; + /** \brief Vector of degrees of cells along the filtration. */ + std::vector _deg ; + + /** \brief Map from cells to their index in the filtration. */ + std::map _cell_to_t ; + + /*! + Type of column-major sparse matrices + */ + typedef OSM::SparseMatrix CMatrix ; + + /*! + Type of row-major sparse matrices + */ + typedef OSM::SparseMatrix RMatrix ; + /*! + Type of column-major chains + */ + typedef OSM::Chain CChain ; + + /*! + Type of row-major chains + */ + typedef OSM::Chain RChain ; +public: + /*! \brief Filtration_core default constructor + * + * Builds an "empty" filtration with `K` as underlying chain complex. + * + *\param[in] K A chain complex (a model of `AbstractChainComplex`), the underlying chain complex of the filtration. + */ + Filtration_core(const ComplexType& K) : _K(K) + {} + + /*! \brief Constructor from a vector of cells (ordering of cells) and an associated vector of degrees. + * + * The constructor check that the filtration is valid (a cell is introduced in the filtration after its faces and the degree vector is increasing) and throw an exception if not. + * \param[in] K A chain complex (a model of `AbstractChainComplex`), the underlying chain complex of the filtration. + * \param[in] filtration An ordering of the cells of `K` encoded as a vector of its cells. + * \param[in] deg The (increasing) vector of cells degrees. + */ + Filtration_core(const ComplexType& K, const std::vector& filtration, const std::vector& deg) : _K(K), _filtration(filtration), _deg(deg) + { + if (!is_valid_filtration()) + throw ("Invalid filtration, Filtration_core constructor failed"); + } + + /** + * \brief Constructor by copy. + * + * Builds a `Filtration_core` by copy from another. + * + * \param[in] f An initial `Filtration_core`. + */ + Filtration_core(const Filtration_core& f) : _K(f._K), _filtration(f._filtration), _cell_to_t(f._cell_to_t) {} + + /** \brief Iterator over a filtration. + * + * Iterate the cells of the filtration by increasing index (and hence increasing degree). + */ + struct iterator + { + // Iterator tags + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = FiltrationIterValue; + + /** \brief Iterator constructor + * + * \param[in] f Constant reference on the `Filtration_core` iterated. + * \param[in] i The initial index. + */ + iterator(const Filtration_core& f, int i=0) : _i(i), _f(f) {} + + /*! \brief Iterator dereference + * + * \returns A `FiltrationIterValue` structure containing the information of the current cell and its degree. + */ + value_type operator*() const + { + FiltrationIterValue res ; + res.cell_dim = _f._filtration.at(_i) ; + res.degree = _f._deg.at(_i) ; + return res ; + } + + /*! \brief Get the time (or index in the filtration) associated to current iterator. + */ + int time () const { return _i ; } + + /*! \brief Get the cell (identified by its index and dimension) associated to current iterator. + */ + CellDim cell_dim () const { return _f._filtration.at(_i); } + + /*! \brief Get degree associated to current iterator. + */ + DegreeType degree () const { return _f._deg.at(_i); } + + /*! + * \brief Prefix incrementation. Moves to next cell in the filtration. + * + * \returns The reference to the current iterator. + */ + iterator& operator++() + { + ++_i; + return *this; + } + + /*! + * \brief Postfix incrementation. Moves to next cell in the filtration. + * \returns The pre-incremented iterator. + */ + iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } + + /*! + * \brief Equality check. + * \returns True if the indices are equal. + */ + friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; + + /*! + * \brief Inequality check. + * \returns True if the indices are different. + */ + friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; + + private: + int _i ; // Index along _persist + const Filtration_core& _f ; // Filtration_core iterated + }; + + /** + * \brief Iterator to the beginning of the filtration. + * + * \return The iterator to the beginning of the filtration. + */ + iterator begin() { return iterator(*this, 0) ; } + + /** + * \brief Iterator to the ending of the filtration. + * + * \return The iterator to the ending of the filtration. + */ + iterator end() { return iterator(*this, _filtration.size()) ; } + + // getters + /*! \brief Get the filtration size. + */ + int get_filtration_size () const { return _filtration.size();} + + /*! \brief Get the cell (that is cell index and dimension) at the index `i` of the filtration. + */ + CellDim get_cell_dim (int i) const { return _filtration.at(i); } + + /*! \brief Get the degree of the `i`th element of the filtration. + */ + DegreeType get_degree (int i) const { return _deg.at(i); } + + // Output filtration + /*! \brief Overload of the `<<`operator for filtrations. + */ + friend ostream & operator<<(ostream & out, const Filtration_core &f) + { + const int N(f._filtration.size()) ; + for (int i=0; i (" << f._filtration.at(i).first << "- dim " << f._filtration.at(i).second << " , " << f._deg.at(i) << ") " << std::endl ; + } + return out ; + } + + /** + * \brief Export the filtration time indices. + * + * The method exports the time index of every cells in each dimension. + * + * \returns A vector containing, for each dimension, the vector of labels by cell index. + */ + vector > export_filtration () const + { + vector > labels(_K.dim()+1) ; + for (int q=0; q<=this->_K.dim(); ++q) + { + for (int i = 0; i_K.nb_cells(q); ++i) + { + const CellDim cell(i,q) ; + const int t(_cell_to_t.at(cell)); + labels.at(q).push_back(t) ; + } + } + return labels ; + } + + /*! \brief Check that a filtration is valid. + * Checks that cells are ordered in increasing degrees and all cells have indices larger than their faces. + * \returns `true` if the filtration is valid, `false` otherwise + */ + bool is_valid_filtration() const ; + +protected: + /** \brief Sets _cell_to_t from the initial vector o cells. */ + void build_filtration_structure() ; + + /** Friend class: Hdvf_persistence. */ + template + friend class Hdvf_persistence ; +}; + +template +void Filtration_core::build_filtration_structure() +{ + for (int i = 0; i<_filtration.size(); ++i) + { + const CellDim c(_filtration.at(i)) ; + // c : filtration index i, index in the basis reordered by filtration : j + _cell_to_t[c] = i ; + } +} + +template +bool Filtration_core::is_valid_filtration() const +{ + bool valid = true ; + for (int i=0; i<_filtration.size() && valid; ++i) + { + if (i>0) + valid = valid & (_deg.at(i) >= _deg.at(i-1)) ; + CellDim c(_filtration.at(i)) ; + cout << i << " -> " << c.first << " dim "<< c.second << endl ; + const int q = c.second ; + if (q>0) + { + CChain dc = _K.d(c.first, q) ; + cout << "bnd : " << dc << endl ; + for (typename CChain::iterator it = dc.begin(); it != dc.end() && valid; ++it) + { + // Faces of c + const CellDim face(it->first,q-1) ; + // Check if the face c belongs to the filtration + auto it_face(_cell_to_t.find(face)) ; + valid = valid & (it_face != _cell_to_t.end()) ; + if (!valid) + cout << "face not found" << endl ; + if (it_face != _cell_to_t.end()) + valid = valid & (_cell_to_t[face] < i) ; + if (!valid) + cout << "face " << it->first << " at time : " << _cell_to_t[face] << " with i : " << i << endl ; + } + } + if (!valid) + cout << "check failed : " << i << endl ; + } + return valid ; +} + +} /* end namespace HDVF */ +} /* end namespace CGAL */ + +#endif // CGAL_FILTRATION_CORE_H diff --git a/HDVF/include/CGAL/HDVF/Filtration_lower.h b/HDVF/include/CGAL/HDVF/Filtration_lower.h deleted file mode 100644 index f9c83b5adf23..000000000000 --- a/HDVF/include/CGAL/HDVF/Filtration_lower.h +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright (c) 2025 LIS Marseille (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Alexandra Bac - -#ifndef CGAL_FILTRATION_H -#define CGAL_FILTRATION_H - -#include -#include -#include -#include -#include - -/** - * \class Filtration_lower_star class - * \brief Implementation of the filtration. - * - * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam ComplexType The type of complex - */ - -namespace CGAL { -namespace HDVF { - -template -class Filtration_lower_star -{ -public: - typedef std::pair CellDim ; - typedef struct zFiltration_iter_type { - CellDim cell_dim ; - DegreeType degree ; - } FiltrationIterValue ; - -protected: - const ComplexType& _K ; - std::vector _filtration ; - std::vector _deg ; - - // Cell -> (filtration index, basis index according to the filtration) - std::map _cell_to_t ; - - typedef OSM::SparseMatrix CMatrix ; - typedef OSM::SparseMatrix RMatrix ; - typedef OSM::Chain CChain ; - typedef OSM::Chain RChain ; -public: - // Constructor of an empty filtration - Filtration_lower_star(const ComplexType& K) : _K(K) - { - } - - // Copy constructor - Filtration_lower_star(const Filtration_lower_star& f) : _K(f._K), _filtration(f._filtration), _cell_to_t(f._cell_to_t) {} - - // Constructor from a filtration on all cells - Filtration_lower_star(const ComplexType& K, const std::vector& filtration, const std::vector& deg) : - _K(K), _filtration(filtration), _deg(deg) - { - check_filtration() ; - build_filtration_structure() ; - } - - // Constructor from the vector of degrees of vertices - Filtration_lower_star(const ComplexType& K, const std::vector& deg) : _K(K) - { - star_filtration(deg); - } - - // Constructor from a function over vertices - Filtration_lower_star(const ComplexType& K, std::function& deg_fun) : _K(K) - { - star_filtration(deg_fun); - } - - // Build lower-star filtration - // From the degrees of vertices - void star_filtration(const std::vector& deg) ; - // From a function over vertices - void star_filtration(std::function& deg_fun) ; - - // iterator (iterate a filtration) - struct iterator - { - // Iterator tags - using iterator_category = std::forward_iterator_tag; - using difference_type = std::ptrdiff_t; - using value_type = FiltrationIterValue; - - // Iterator constructors - iterator(const Filtration_lower_star& f, int i=0) : _i(i), _f(f) {} - - // Operators - value_type operator*() const - { - FiltrationIterValue res ; - res.cell_dim = _f._filtration.at(_i) ; - res.degree = _f._deg.at(_i) ; - return res ; - } - - int time () const { return _i ; } - CellDim cell_dim () const { return _f._filtration.at(_i); } - DegreeType degree () const { return _f._deg.at(_i); } - - // Prefix increment - // Find next hole of positive duration - iterator& operator++() - { - ++_i; - return *this; - } - - // Postfix increment - iterator operator++(int) { iterator tmp = *this; ++(*this); return tmp; } - - friend bool operator== (const iterator& a, const iterator& b) { return a._i == b._i; }; - friend bool operator!= (const iterator& a, const iterator& b) { return a._i != b._i; }; - - private: - int _i ; // Index along _persist - const Filtration_lower_star& _f ; // Filtration_lower_star iterated - }; - iterator begin() { return iterator(*this, 0) ; } - iterator end() { return iterator(*this, _filtration.size()) ; } - - // getters - int get_filtration_size () const { return _filtration.size();} - CellDim get_cell_dim (int i) const { return _filtration.at(i); } - DegreeType get_degree (int i) const { return _deg.at(i); } - - // Output filtration - friend ostream & operator<<(ostream & out, const Filtration_lower_star &f) - { - const int N(f._filtration.size()) ; - for (int i=0; i (" << f._filtration.at(i).first << "- dim " << f._filtration.at(i).second << " , " << f._deg.at(i) << ") " << std::endl ; - } - return out ; - } - - bool check_filtration() const ; - -protected: - void build_filtration_structure() ; - - template - friend class Hdvf_persistence ; -}; - -template -void Filtration_lower_star::build_filtration_structure() -{ - for (int i = 0; i<_filtration.size(); ++i) - { - const CellDim c(_filtration.at(i)) ; - // c : filtration index i, index in the basis reordered by filtration : j - _cell_to_t[c] = i ; - } -} - -template -bool Filtration_lower_star::check_filtration() const -{ - bool valid = true ; - for (int i=0; i<_filtration.size() && valid; ++i) - { - if (i>0) - valid = valid & (_deg.at(i) >= _deg.at(i-1)) ; - CellDim c(_filtration.at(i)) ; - cout << i << " -> " << c.first << " dim "<< c.second << endl ; - const int q = c.second ; - if (q>0) - { - CChain dc = _K.d(c.first, q) ; - cout << "bnd : " << dc << endl ; - for (typename CChain::iterator it = dc.begin(); it != dc.end() && valid; ++it) - { - // Faces of c - const CellDim face(it->first,q-1) ; - // Check if the face c belongs to the filtration - auto it_face(_cell_to_t.find(face)) ; - valid = valid & (it_face != _cell_to_t.end()) ; - if (!valid) - cout << "face not found" << endl ; - if (it_face != _cell_to_t.end()) - valid = valid & (_cell_to_t[face] < i) ; - if (!valid) - cout << "face " << it->first << " at time : " << _cell_to_t[face] << " with i : " << i << endl ; - } - } - if (!valid) - cout << "check failed : " << i << endl ; - } - return valid ; -} - -template -void Filtration_lower_star::star_filtration(const std::vector °) -{ - if (deg.size() != _K.nb_cells(0)) - throw "Star filtration error : deg should provide one value by vertex" ; - - // Create filtration and degrees for all cells according to deg - // -> lower star: maximum degree of vertices - // -> upper star: minimum degree of vertices - std::vector tmp_filtration ; - std::vector tmp_deg ; - std::vector tmp_perm ; - // Init tmp_perm (for vertices) - // cout << "vertices degrees : " << endl ; - for (int i=0; i " << deg.at(i) << endl ; - } - // For all other cells - for (int q=1; q<=_K.dim(); ++q) - { - for (int i=0; i<_K.nb_cells(q); ++i) - { - tmp_filtration.push_back(CellDim(i,q)) ; - - // Compute corresponding degree - // Vertices of the cell - // TODO : bottom_faces should produce a set - std::vector verts(_K.bottom_faces(i,q)) ; - // cout << "cell " << i << " dim " << q << " : " << verts ; - // Compute the degree of the cell - DegreeType d = deg.at(verts.at(0)) ; - for (int j=1; j d) - d = tmp_d ; - } - else // upper - { - if (tmp_d < d) - d = tmp_d ; - } - } - tmp_deg.push_back(d) ; - tmp_perm.push_back(tmp_perm.size()) ; - // cout << " -> " << d << endl ; - } - } - // Sort filtration - - // Create sorting function : lexicographic order over (deg, dim) - // Test if cell i < cell j - auto f_sort = [&tmp_filtration, &tmp_deg] (int i, int j) - { - // degree of i is lower than degree of j or (they are equal and the dimension of i is lower than the dimension of j) - return ((tmp_deg[i] < tmp_deg[j]) || ((tmp_deg[i] == tmp_deg[j]) && (tmp_filtration[i].second < tmp_filtration[j].second))) ; - } ; - // Sort -> create the right permutation - std::sort(tmp_perm.begin(), tmp_perm.end(), f_sort) ; - // Insert cells in the filtration and degrees accordingly - for (int i=0; i -void Filtration_lower_star::star_filtration(std::function& deg_fun) -{ - std::vector deg ; - for (int i=0; i<_K.nb_cells(0); ++i) - { - deg.push_back(deg_fun(i)) ; - } - star_filtration(deg) ; -} - -/* Standard functions for lower star filtration */ -/* DegType = double */ - -//std::function deg_fun_x = [&complex](int i) -//{ -// std::vector Xi(complex.get_vertex_coords(i)) ; -// return (Xi.at(0)) ; -//} ; -// -//std::function deg_fun_z = [&complex](int i) -//{ -// std::vector Xi(complex.get_vertex_coords(i)) ; -// return (Xi.at(2)) ; -//} ; - -std::function&)> f_x = [](const std::vector& v) -{ - return (v.at(0)) ; -} ; - -std::function&)> f_y = [](const std::vector& v) -{ - return (v.at(1)) ; -} ; - -std::function&)> f_z = [](const std::vector& v) -{ - return (v.at(2)) ; -} ; - -template -std::function deg_fun (const ComplexType& complex, std::function&)>& f) -{ - std::function deg_fun_f = [&complex, &f](int i) - { - const std::vector Xi(complex.get_vertex_coords(i)) ; - // cout << "deg_fun_f, i: " << i ; - // cout << " Xi : " ; - // for (double c : Xi) - // cout << c << " " ; - // cout << " - degree: " << f(Xi) << endl ; - return f(Xi) ; - } ; - return deg_fun_f ; -} - -} /* end namespace HDVF */ -} /* end namespace CGAL */ - -#endif // CGAL_FILTRATION_H diff --git a/HDVF/include/CGAL/HDVF/Filtration_lower_star.h b/HDVF/include/CGAL/HDVF/Filtration_lower_star.h new file mode 100644 index 000000000000..84ab6f0bc411 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Filtration_lower_star.h @@ -0,0 +1,236 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_FILTRATION_LOWER_STAR_H +#define CGAL_FILTRATION_LOWER_STAR_H + +#include +#include +#include +#include +#include +#include "Filtration_core.h" + +namespace CGAL { +namespace HDVF { + +/* Standard functions for lower star filtration */ +/* DegType = double */ + +//std::function deg_fun_x = [&complex](int i) +//{ +// std::vector Xi(complex.get_vertex_coords(i)) ; +// return (Xi.at(0)) ; +//} ; +// +//std::function deg_fun_z = [&complex](int i) +//{ +// std::vector Xi(complex.get_vertex_coords(i)) ; +// return (Xi.at(2)) ; +//} ; + +/** \brief Function mapping coordinates to x */ +std::function&)> f_x = [](const std::vector& v) +{ + return (v.at(0)) ; +} ; + +/** \brief Function mapping coordinates to y */ +std::function&)> f_y = [](const std::vector& v) +{ + return (v.at(1)) ; +} ; + +/** \brief Function mapping coordinates to z */ +std::function&)> f_z = [](const std::vector& v) +{ + return (v.at(2)) ; +} ; + +/** \brief Degree function from a coordinates to scalar map. */ +template +std::function deg_fun (const ComplexType& complex, std::function&)>& f) +{ + std::function deg_fun_f = [&complex, &f](int i) + { + const std::vector Xi(complex.get_vertex_coords(i)) ; + return f(Xi) ; + } ; + return deg_fun_f ; +} + +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Filtration_lower_star` implements the lower star filtration on a given complex implementing the concept `CGAL::AbstractChainComplex`. + + A filtration associated to a chain complex `K` associates to each cell of `K` a scalar value (called degree) such that the degree of a cell is larger than the degrees of its faces. + + Let `DegreeType` be a scalar type. The lower star filtration is a filtration obtained from a map \f$\mathrm{deg}\,:\, K_0 \to \mathrm{DegreeType}\f$ (where \f$K_0\f$ denotes the set of vertices of \f$K\f$) associating a degree to each vertex of the complex \f$K\f$. + + The map is extended to cells of any dimension by setting, for a cell \f$\sigma\f$: + \f[\mathrm{deg}(\sigma) = \max_{\substack{v\in K_0\\v\text{ face of }\sigma}} \mathrm{deg}(v) + \f] + + For geometric complexes, standard lower star filtrations are obtained by taking as a degree function the \f$x\f$, \f$y\f$ or \f$z\f$ coordinate of vertices. The image below illustrates such a filtration ((left) lower star filtration with a \f$z\f$ degree map on vertices, (right) lower star filtration with a \f$y\f$ degree map on vertices). + + + + + The `Filtration_lower_star` class provides constructors taking as input: + - either the vector of vertices degrees + - or a function mapping each vertex to its degree. + + \cgalModels{Filtration} + + \tparam CoefficientType a model of the `Ring` concept (ring used for homology computation). + \tparam ComplexType a model of the `AbstractChainComplex` concept (type of the underlying chain complex). + \tparam DegreeType the scalar type of degrees. + */ + +template +class Filtration_lower_star : public Filtration_core +{ +private: + /*! Type of parent filtration instance. */ + typedef Filtration_core FiltrationCoreT; + /*! Type of cell identifier (cell index and dimension). */ + typedef FiltrationCoreT::CellDim CellDim; + /*! Type of value returned by the iterator. */ + typedef FiltrationCoreT::FiltrationIterValue FiltrationIterValue; +public: + /*! + * \brief Constructor by copy. + * + * Builds a filtration by copy from another. + * + * \param[in] f An initial lower star filtration. + */ + Filtration_lower_star(const Filtration_lower_star& f) : FiltrationCoreT(f) {} + + /*! \brief Constructor from vertices degrees. + * + * The constructor computes all cells degrees as the minimum of the degrees of their vertices and sorts all the cells of the complex to fulfill the filtration ordering constraints. + * + * \param[in] K Constant reference to the underlying complex. + * \param[in] deg Vector of vertices degrees. + */ + // Constructor from the vector of degrees of vertices + Filtration_lower_star(const ComplexType& K, const std::vector& deg) : FiltrationCoreT(K) + { + star_filtration(deg); + } + + /*! \brief Constructor from a function mapping vertices to degrees. + * + * The constructor computes all cells degrees as the minimum of the degrees of their vertices (obtained through `deg_fun`) and sorts all the cells of the complex to fulfill the filtration ordering constraints. + * + * \param[in] K Constant reference to the underlying complex. + * \param[in] deg_fun Function mapping vertices of `K` to their degree. + */ + Filtration_lower_star(const ComplexType& K, std::function& deg_fun) : FiltrationCoreT(K) + { + star_filtration(deg_fun); + } + + +protected: + // Build lower-star filtration + /*! \brief Function building the filtration from the vector of vertices degrees. + */ + void star_filtration(const std::vector& deg) ; + + /*! \brief Function building the filtration from a function mapping vertices to their degree. + */ + void star_filtration(std::function& deg_fun) ; +}; + + + +template +void Filtration_lower_star::star_filtration(const std::vector °) +{ + if (deg.size() != this->_K.nb_cells(0)) + throw "Star filtration error : deg should provide one value by vertex" ; + + // Create filtration and degrees for all cells according to deg + // -> lower star: maximum degree of vertices + // -> upper star: minimum degree of vertices + std::vector tmp_filtration ; + std::vector tmp_deg ; + std::vector tmp_perm ; + for (int i=0; i_K.dim(); ++q) + { + for (int i=0; i_K.nb_cells(q); ++i) + { + tmp_filtration.push_back(CellDim(i,q)) ; + + // Compute corresponding degree + // Vertices of the cell + std::vector verts(this->_K.bottom_faces(i,q)) ; + // Compute the degree of the cell + DegreeType d = deg.at(verts.at(0)) ; + for (int j=1; j d) + d = tmp_d ; + // If upper star filtration (for cohomology) + // if (tmp_d < d) + // d = tmp_d ; + + } + tmp_deg.push_back(d) ; + tmp_perm.push_back(tmp_perm.size()) ; + } + } + // Sort filtration + + // Create sorting function : lexicographic order over (deg, dim) + // Test if cell i < cell j + auto f_sort = [&tmp_filtration, &tmp_deg] (int i, int j) + { + // degree of i is lower than degree of j or (they are equal and the dimension of i is lower than the dimension of j) + return ((tmp_deg[i] < tmp_deg[j]) || ((tmp_deg[i] == tmp_deg[j]) && (tmp_filtration[i].second < tmp_filtration[j].second))) ; + } ; + // Sort -> create the right permutation + std::sort(tmp_perm.begin(), tmp_perm.end(), f_sort) ; + // Insert cells in the filtration and degrees accordingly + for (int i=0; i_filtration.push_back(tmp_filtration.at(tmp_perm.at(i))) ; + this->_deg.push_back(tmp_deg.at(tmp_perm.at(i))) ; + this->_cell_to_t[tmp_filtration.at(tmp_perm.at(i))] = i ; + } +} + +template +void Filtration_lower_star::star_filtration(std::function& deg_fun) +{ + std::vector deg ; + for (int i=0; i_K.nb_cells(0); ++i) + { + deg.push_back(deg_fun(i)) ; + } + star_filtration(deg) ; +} + +} /* end namespace HDVF */ +} /* end namespace CGAL */ + +#endif // CGAL_FILTRATION_LOWER_STAR_H diff --git a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h index 950667df880c..04326363e0ad 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h @@ -20,7 +20,7 @@ #include "CGAL/OSM/OSM.hpp" #include "CGAL/HDVF/SubSparseMatrix.hpp" #include "CGAL/HDVF/Hdvf_core.h" -#include "CGAL/HDVF/Filtration_lower.h" +#include "CGAL/HDVF/Filtration_lower_star.h" namespace CGAL { namespace HDVF { @@ -42,13 +42,13 @@ namespace HDVF { // Types for persistent homology / cohomology -/** \brief Type to store persistent intervals filtration indices (birth/death indices) +/*! \brief Type to store persistent intervals filtration indices (birth/death indices) * * For "infinite" intervals borne at index i, the interval is set to (i,i-1) */ typedef std::pair FiltrIndexPerInterval ; -/** \brief Type for indexing uniquely a cell. +/*! \brief Type for indexing uniquely a cell. * - First element of the pair: index of the cell. * - Second element of the pair: dimension of the cell. * @@ -56,7 +56,7 @@ typedef std::pair FiltrIndexPerInterval ; */ typedef std::pair CellDim ; -/** \brief Type for describing the pair of cells associated to a persistence interval: +/*! \brief Type for describing the pair of cells associated to a persistence interval: * - First element of the pair: cell entailing the birth of the hole. * - Second element of the pair: cell entailing the death of the hole. * @@ -64,14 +64,14 @@ typedef std::pair CellDim ; */ typedef std::pair CellsPerInterval ; -/** \brief Template for persistent intervals degrees (birth/death degrees) +/*! \brief Template for persistent intervals degrees (birth/death degrees) * * For "infinite" intervals borne at degree d, the interval is set to (d,d-1) */ template using DegreePerIntervalT = std::pair ; -/** \brief Template for (full) persistent interval data: +/*! \brief Template for (full) persistent interval data: * - First element: persistent interval filtration indices * - Second element: persistent interval cells * - Third element: persistent interval degrees @@ -79,7 +79,7 @@ using DegreePerIntervalT = std::pair ; template using PerHoleT = std::tuple > ; -/** \brief Overload of the `<<` operator to display persistent intervals (that is PerHoleT). +/*! \brief Overload of the `<<` operator to display persistent intervals (that is PerHoleT). * * Format: */ @@ -229,7 +229,7 @@ class Hdvf_persistence : public Hdvf_core class Duality_simplicial_complex_tools { public: typedef Simplicial_chain_complex _ComplexType ; - typedef SubChainComplex _SubCCType ; + typedef Sub_chain_complex_mask _SubCCType ; // Constructor Duality_simplicial_complex_tools() {} - /** \brief Build a SimpComplex L and SubChainComplex K from a SimpComplex _K. + /** \brief Build a SimpComplex L and Sub_chain_complex_mask K from a SimpComplex _K. * L : complex built out of _K and a closing icosphere meshed by tetgen - * K (SubChainComplex) : SubChainComplex identifying _K inside L + * K (Sub_chain_complex_mask) : Sub_chain_complex_mask identifying _K inside L */ /** \brief Build the bounding box CubComplex of _CC */ @@ -122,7 +122,7 @@ class Duality_simplicial_complex_tools { // Build the associated SimpComplex _ComplexType& L = *new _ComplexType(tetL, tetL.nodes) ; - // Build the SubChainComplex encoding _K inside L + // Build the Sub_chain_complex_mask encoding _K inside L _SubCCType& K(*new _SubCCType(L, false)) ; // Visit all cells of _K and activate the corresponding bit in K for (int q=0; q<=_K.dim(); ++q) @@ -167,6 +167,12 @@ void Per_Simp_output_vtk (Hdvf_persistence, DegType, FiltrationType> ; using ComplexType = Simplicial_chain_complex ; using PerHole = PerHoleT ; + + // Export the filtration + string out_file_filtration = filename+"_filtration.vtk" ; + vector > filtr_labels = per_hdvf.get_filtration().export_filtration(); + ComplexType::Simplicial_chain_complex_to_vtk(complex, out_file_filtration, &filtr_labels) ; + // Iterate over persistence diagram (iterator over non zero intervals) // Batch informations are stored in file filename_infos.txt std::ofstream info_file(filename+"_infos.txt") ; diff --git a/HDVF/include/CGAL/HDVF/Simplicial_complex_toolbox.h b/HDVF/include/CGAL/HDVF/Simplicial_complex_toolbox.h new file mode 100644 index 000000000000..94ca98992605 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Simplicial_complex_toolbox.h @@ -0,0 +1,35 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_FILTRATION_CORE_H +#define CGAL_FILTRATION_CORE_H + +#include +#include "tools_io.hpp" +#include "Simplex.hpp" +#include "Abstract_simplicial_chain_complex.h" + +namespace CGAL { +namespace HDVF { + +typedef int CoefficientType; +typedef Abstract_simplicial_chain_complex ComplexType; + +template +ComplexType& generate_Q_acyclic_complex(int n, std::set subset_A) +{ + int q = subset_A.size(); +} + +} // end namespace HDVF +} // end namespace CGAL + +#endif //CGAL_FILTRATION_CORE_H diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp index a10700b39db2..4059582136ec 100644 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -12,7 +12,7 @@ #define __SUB_SPARSE_MATRIX__ -#include "CGAL/OSM/SparseMatrix.hpp" +#include "CGAL/OSM/Sparse_matrix.h" #include "CGAL/OSM/Bitboard.hpp" namespace CGAL { @@ -43,7 +43,7 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { public: /** \brief Constructor with sizes and Bitboard describing subchains. */ - SubSparseMatrix(const int _rowCount, const int _columnCount, Bitboard subChain) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->chainsStates & subChain) + SubSparseMatrix(const int _rowCount, const int _columnCount, const Bitboard& subChain) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->chainsStates & subChain) { } diff --git a/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h new file mode 100644 index 000000000000..e862d02258d3 --- /dev/null +++ b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h @@ -0,0 +1,297 @@ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac + +#ifndef CGAL_SUB_CHAIN_COMPLEX_MASK_H +#define CGAL_SUB_CHAIN_COMPLEX_MASK_H + +#include +#include +#include +#include +#include "CGAL/OSM/OSM.hpp" +#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/HDVF/SubSparseMatrix.hpp" + +namespace CGAL { +namespace HDVF { + +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Sub_chain_complex_mask` is a technical class implementing a sub chain complex. A sub chain complex \f$A\f$ of a chain complex \f$K\f$ is a subset \f$A\subseteq K\f$ such that the restricted boundary operator \f$\partial_A = \partial_K|_A\f$ still satisfies \f$\partial_A^2 = 0\f$. + + The `Sub_chain_complex_mask` class is used to compute reduced homology. This class is based on a set of bitboard masks (one in each dimension) used to define sub chain complexes and their associated reduction encoded in sub-sparse matrices (`Sub_sparse_matrix` class). Technically, `Sub_chain_complex_mask` are used to partially screen chain complexes and chains in associated boundary matrices, and hence compute homology "locally". + + \warning For efficiency reasons, when a `Sub_chain_complex_mask` is used to screen sparse matrices (with the `screen_matrices` method), screening is **only** performed on the major direction of matrices (thus column-major matrices are restricted over columns and row-major matrices are restricted over rows). Iterators are restricted accordingly. But chains themselves are not restricted.
    + However, if `A` is a proper sub-complex of `K` (that is, closed with respect to faces), chains automatically comply with the screening. Indeed, for any \f$q\f$-cell \f$\sigma\in A\f$ (thus the corresponding bit is on in the mask), all the faces of \f$\sigma\f$ also belong to \f$A\f$. Thus for any \f$q-1\f$-cell \f$\tau\f$ "in the boundary of \f$\sigma\f$" (that is, such that \f$\langle\partial_k(\sigma),\tau\rangle\neq 0\f$), \f$\tau\f$ belongs to \f$A\f$ (and thus the corresponding bit in the mask is also on). + + \tparam CoefficientType a model of the `Ring` concept. + \tparam ComplexType a model of the `AbstractComplex` concept (type of the chain complex screened by `Sub_chain_complex_mask`). + */ + +template +class Sub_chain_complex_mask +{ +protected: + /** \brief Dimension of the underlying complex. */ + int _dim ; + /** \brief Vector of bitboards coding masks in each dimension. */ + std::vector _sub ; + /** \brief Number of cells in the mask in each dimension. */ + std::vector _nb_cells ; + /** \brief Constant reference to the underlying complex. */ + const ComplexType& _K ; + /** \brief Is full sub_complex. + * This boolean flag is true is all bits in the bitboards are on. */ + bool _full ; +private: + /** Load a set of cells and close the enumeration down. + * + * The method activates bits corresponding to the set of cells encoded by `cells` and recursively activates all bits corresponding to their faces. + * + * \param[in] cells A vector containing, in each dimension, a vector of cells indexes. + */ + void down_closure (const std::vector > &cells) + { + std::vector > faces(cells.size()) ; + bool rec_needed = false ; + for (int q = 0; q < cells.size(); ++q) + { + for (int i : cells.at(q)) + { + if (!_sub.at(q).isOn(i)) + { + _sub.at(q).setOn(i) ; + ++_nb_cells.at(q) ; + if (q>0) // Then faces must be considered + { + // Add all its faces to faces.at(q-1) + OSM::Chain bnd(_K.d(i,q)) ; + for (typename OSM::Chain::const_iterator it = bnd.cbegin(); it != bnd.cend(); ++it) + { + const int c(it->first) ; + if (!_sub.at(q-1).isOn(c)) + { + faces.at(q-1).push_back(c) ; + rec_needed = true ; + } + } + } + } + } + } + // Call recursively + if (rec_needed) + down_closure(faces, _K); + } + + /** Load a set of cells (without closure). + * + * The method activates bits corresponding to the set of cells encoded by `cells`. + * + * \param[in] cells A vector giving, for each dimension, a vector of cells indexes. + */ + void set_cells (const std::vector > &cells) + { + for (int q = 0; q < cells.size(); ++q) + { + for (int i : cells.at(q)) + { + _sub.at(q).setOn(i) ; + ++_nb_cells.at(q) ; + } + } + } + +public: + /** \brief Constructor from a complex. + * + * Build a `Sub_chain_complex_mask` associated to `K` with all bits set to 1 in the masks if `full` is true, and all bits set to 0 otherwise. + * + * \param[in] K A constant reference to the underlying complex. + * \param[in] full Build full / empty masks (default: full). + */ + Sub_chain_complex_mask(const ComplexType& K, bool full=true) : _K(K) + { + _dim = K.dim() ; + _sub.resize(_dim+1) ; + _nb_cells.resize(_dim+1) ; + // Create Bitboards + for (int q=0; q<=K.dim(); ++q) + { + if (full) + { + _sub.at(q) = OSM::Bitboard(K.nb_cells(q),false) ; // all cells to 1 + _full = true ; + } + else + _sub.at(q) = OSM::Bitboard(K.nb_cells(q),true) ; // all cells to 0 + _nb_cells.at(q) = K.nb_cells(q) ; + } + } + + + /** \brief Constructor from an enumeration of cells. + * + * Build masks associated to the underlying complex `K` with all bits corresponding to `cells` (and their faces if `close` is true) set to 1. + * + * \param[in] K A constant reference to the underlying complex. + * \param[in] cells A vector containing, in each dimension, a vector of cells indexes. + * \param[in] close If this boolean is true, the faces of `cells` are also set to 1. + */ + Sub_chain_complex_mask(const ComplexType& K, const std::vector > &cells, bool close = true) : _K(K) + { + _dim = K.dim() ; + _sub.resize(_dim+1) ; + _nb_cells.resize(_dim+1) ; + _full = true ; + // Create Bitboards + for (int q=0; q<=K.dim(); ++q) + { + _sub.at(q) = OSM::Bitboard(K.nb_cells(q)) ; + } + + // Set bits + if (close) + down_closure(cells, K) ; + else + set_cells(cells, K) ; + + for (int q=0; q<=K.dim(); ++q) + { + _full = (_full && (_nb_cells.at(q) == _sub.at(q).size())) ; + } + } + + /** + * \brief Constructor by copy. + * + * Builds a `Sub_chain_complex_mask` by copy from another. + * + * \param[in] otherToCopy An initial `Sub_chain_complex_mask`. + */ + Sub_chain_complex_mask(const Sub_chain_complex_mask& otherToCopy) : _K(otherToCopy._K) + { + _dim = otherToCopy._dim ; + _nb_cells = otherToCopy._nb_cells ; + _full = otherToCopy._full ; + _sub = otherToCopy._sub ; + } + + /** \brief Affectation operator + * + * \warning The operator argument must provide a sub chain complex mask over the *same underlying chain complex*. It not so, the affectation will throw an exception. + * + * \param[in] otherToCopy A `Sub_chain_complex_mask` copied into `this` (`otherToCopy` and `this` must have the same underlying chain complex). + */ + Sub_chain_complex_mask& operator= (const Sub_chain_complex_mask& otherToCopy) + { + // Check that otherToCopy and current mask share the same chain complex + if (_K.get_id() != otherToCopy._K.get_id() ) + throw("Error, operator= can only copy mask over the same chain complex."); + + // Perform affectation + _dim = otherToCopy._dim ; + _sub = otherToCopy._sub ; + _nb_cells = otherToCopy._nb_cells ; + _full = otherToCopy._full ; + return *this; + } + + /** \brief Complement the mask. + * + * The method computes the complement of the current mask (0 and 1 bits in the mask are exchanged). + */ + Sub_chain_complex_mask complement() + { + Sub_chain_complex_mask cSub(*this) ; + // Complement bitboards + for (int q=0; q<=_dim; ++q) + { + cSub._sub.at(q).bit_not() ; + cSub._nb_cells.at(q) = _sub.at(q).size() - _nb_cells.at(q) ; + cSub._full = ~_full ; + } + return cSub ; + } + + /** \brief Get a bit of the mask (bit i in dimension q). */ + inline bool get_Bit(int q, int i) const + { + return _sub.at(q).isOn(i) ; + } + + /** \brief Set a bit to 1 (bit i in dimension q). */ + inline void set_BitOn(int q, int i) + { + if (!_sub.at(q).isOn(i)) + { + _nb_cells[q]++ ; + _sub.at(q).setOn(i) ; + } + } + + /** \brief Set a bit to 0 (bit i in dimension q). */ + inline void set_BitOff(int q, int i) + { + if (_sub.at(q).isOn(i)) + { + _nb_cells[q]--; + _sub.at(q).setOff(i) ; + } + } + + /** \brief Getter for the bitboards of the sub chain complex. + * + * Returns a constant reference to the vector of bitboards in each dimension. + */ + inline const std::vector& get_BitBoard() const + { + return _sub ; + } + + /** \brief Getter for the bitboard of the sub chain complex in dimension q. */ + inline const OSM::Bitboard& get_BitBoard(int q) const + { + return _sub.at(q) ; + } + + /** \brief Screen a sequence of Sub_sparse_matrix (in each dimension). + * + * Given a sequence of matrices (vector of `Sub_sparse_matrices`) sets the masks of `Sub_sparse_matrices` in each dimension to the current `Sub_chain_complex_mask`. + * + * \warning For efficiency, screening is performed on the major direction of matrices (so along columns for column-major matrices and along row for row-major matrices). + * + * \param[in] matrices A vector of Sub_sparse_matrix (in each dimension). + */ + template + void screen_matrices(std::vector >& matrices) + { + for (int q=0; q<=_K.dim(); ++q) + { + matrices.at(q).set_sub(_sub.at(q)) ; + } + } + + /*! \brief Overload of the `<<`operator for `Sub_chain_complex_mask`. + */ + friend std::ostream & operator << (std::ostream & out, const Sub_chain_complex_mask & sub) + { + for (int q = 0; q <= sub._dim; ++q) + out << "dim " << q << " : " << sub._sub.at(q) << std::endl ; + return out ; + } +}; + +} /* end namespace HDVF */ +} /* end namespace CGAL */ + +#endif /* CGAL_SUB_CHAIN_COMPLEX_MASK_H */ diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp index 11e138855e4e..b1476db790ce 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -14,7 +14,7 @@ #include "CGAL/OSM/OSM.hpp" #include "CGAL/OSM/Bitboard.hpp" #include "CGAL/HDVF/Hdvf_core.h" -#include "CGAL/HDVF/sub_chain_complex.hpp" +#include "CGAL/HDVF/Sub_chain_complex_mask.h" #include "CGAL/HDVF/SubSparseMatrix.hpp" namespace CGAL { @@ -48,7 +48,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain const _ComplexType& _L ; const int _hdvf_opt ; // Subcomplex K - SubChainComplex<_CoefficientType,_ComplexType> _KCC, _subCC ; + Sub_chain_complex_mask<_CoefficientType,_ComplexType> _KCC, _subCC ; public: // Critical cells of perfect HDVFs std::vector > critical_K, critical_L_K ; @@ -67,38 +67,29 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain * \version 0.1.0 * \date 28/08/2024 */ - Hdvf_duality(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt = OPT_FULL) ; + Hdvf_duality(const _ComplexType& L, Sub_chain_complex_mask<_CoefficientType, _ComplexType>& K, int hdvf_opt = OPT_FULL) ; - /** \brief find a valid PairCell for A in dimension q */ + /** \brief find a valid PairCell in the sub complex for A in dimension q */ virtual PairCell find_pair_A(int q, bool &found) const; - /** \brief find a valid PairCell containing tau for A in dimension q */ + /** \brief find a valid PairCell in the sub complex containing tau for A in dimension q */ virtual PairCell find_pair_A(int q, bool &found, int tau) const; - /** \brief find all the valid PairCell for A in dimension q */ + /** \brief find all the valid PairCell in the sub complex for A in dimension q */ virtual std::vector find_pairs_A(int q, bool &found) const; - /** \brief find all the valid PairCell containing tau for A in dimension q */ + /** \brief find all the valid PairCell in the sub complex containing tau for A in dimension q */ virtual std::vector find_pairs_A(int q, bool &found, int tau) const; - /** \brief Set _DD_col to _subCC */ - inline void screen_DD_col () - { - for (int q=0; q<=_L.dim(); ++q) - { - this->_DD_col.at(q).set_sub(_subCC.get_BitBoard(q)) ; - } - } - /** \brief Set _subCC to complex K and screen _DD_col accordingly */ inline void set_mask_K () { _subCC = _KCC ; - screen_DD_col() ; + _subCC.screen_matrices(this->_DD_col); } /** \brief Set _subCC to cocomplex L-K and screen _DD_col accordingly */ inline void set_mask_L_K () { _subCC = _KCC.complement() ; - screen_DD_col() ; + _subCC.screen_matrices(this->_DD_col); } /** @@ -137,12 +128,12 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain // Print K out << "----> K" << endl ; _subCC = _KCC ; - screen_DD_col() ; + _subCC.screen_matrices(this->_DD_col); print_reduction_sub(out) ; // Print L-K _subCC = _KCC.complement() ; - screen_DD_col() ; + _subCC.screen_matrices(this->_DD_col); print_reduction_sub(out) ; // Set back _subCC to K @@ -212,7 +203,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain ostream& print_bnd_pairing(ostream& out = cout) { - SubChainComplex<_CoefficientType, _ComplexType> subPair(_L, false) ; + Sub_chain_complex_mask<_CoefficientType, _ComplexType> subPair(_L, false) ; for (int q=0; q<=_L.dim(); ++q) { for (int i=0; i -Hdvf_duality<_CoefficientType,_ComplexType>::Hdvf_duality(const _ComplexType& L, SubChainComplex<_CoefficientType, _ComplexType>& K, int hdvf_opt) : +Hdvf_duality<_CoefficientType,_ComplexType>::Hdvf_duality(const _ComplexType& L, Sub_chain_complex_mask<_CoefficientType, _ComplexType>& K, int hdvf_opt) : Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain, OSM::SubSparseMatrix>(L,hdvf_opt), _L(L), _hdvf_opt(hdvf_opt), _KCC(K), _subCC(K) {} /** \brief find a valid PairCell for A in dimension q */ @@ -511,7 +502,7 @@ void Hdvf_duality<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() // Set _subCC to K _subCC = _KCC ; // Restrict _DD_col accordingly - screen_DD_col() ; + _subCC.screen_matrices(this->_DD_col); // Compute perfect HDVF over K std::vector tmp = this->compute_perfect_hdvf() ; std::cout << tmp.size() << " cells paired" << endl ; @@ -523,7 +514,7 @@ void Hdvf_duality<_CoefficientType,_ComplexType>::computeDualPerfectHDVF() // set _subCC to L-K _subCC = _KCC.complement() ; // Restrict _DD_col accordingly - screen_DD_col() ; + _subCC.screen_matrices(this->_DD_col); // Compute perfect HDVF over L-K tmp.clear() ; tmp = this->compute_perfect_hdvf() ; @@ -545,9 +536,9 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::computePairin std::cout << endl << "==== Compute pairing" << endl ; - // Create a full SubChainComplex - _subCC = SubChainComplex<_CoefficientType, _ComplexType>(_L) ; - screen_DD_col() ; + // Create a full Sub_chain_complex_mask + _subCC = Sub_chain_complex_mask<_CoefficientType, _ComplexType>(_L) ; + _subCC.screen_matrices(this->_DD_col); // Copy the HDVF before computing the pairing -> otherwise we loose it... std::vector pairing = this->compute_perfect_hdvf() ; return pairing ; diff --git a/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp b/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp deleted file mode 100644 index 9e28f88a1348..000000000000 --- a/HDVF/include/CGAL/HDVF/sub_chain_complex.hpp +++ /dev/null @@ -1,207 +0,0 @@ -// -// hdvf_duality.hpp -// HDVF -// -// Created by umenohana on 27/08/2024. -// - -#ifndef SUB_CHAIN_COMPLEX_H -#define SUB_CHAIN_COMPLEX_H - -#include -#include -#include -#include "CGAL/OSM/OSM.hpp" -#include "CGAL/OSM/Bitboard.hpp" - -namespace CGAL { -namespace HDVF { - -/** - * \class SubChainComplex - * \brief Implementation of the sub chain complex relation (for duality) - subcomplex and cocomplex - * - * The SubChainComplex class contains all functions to build sub chain complex (for HDVF). - * - * \author Bac A. - * \version 0.1.0 - * \date 22/08/2024 - */ - -template // !!! change everywhere -> CoefficientType -class SubChainComplex -{ -public: - int _dim ; - std::vector _sub ; - std::vector _nb_cells ; - bool _full ; -private: - // Load a set of cells and close the enumeration down (faces) - void down_closure (const std::vector > &cells, const ComplexType& K) - { - std::vector > faces(cells.size()) ; - bool rec_needed = false ; - for (int q = 0; q < cells.size(); ++q) - { - for (int i : cells.at(q)) - { - if (!_sub.at(q).isOn(i)) - { - _sub.at(q).setOn(i) ; - ++_nb_cells.at(q) ; - if (q>0) // Then faces must be considered - { - // Add all its faces to faces.at(q-1) - OSM::Chain bnd(K.d(i,q)) ; - for (typename OSM::Chain::const_iterator it = bnd.cbegin(); it != bnd.cend(); ++it) - { - const int c(it->first) ; - if (!_sub.at(q-1).isOn(c)) - { - faces.at(q-1).push_back(c) ; - rec_needed = true ; - } - } - } - } - } - } - // Call recursively - if (rec_needed) - down_closure(faces, K); - } - - // Load a set of cells (without closure) - void set_cells (const std::vector > &cells, const ComplexType& K) - { - for (int q = 0; q < cells.size(); ++q) - { - for (int i : cells.at(q)) - { - _sub.at(q).setOn(i) ; - ++_nb_cells.at(q) ; - } - } - } - -public: - /** \brief Constructor of a full sub CC from a complex. */ - SubChainComplex(const ComplexType& K, bool full=true) - { - _dim = K.dim() ; - _sub.resize(_dim+1) ; - _nb_cells.resize(_dim+1) ; - // Create Bitboards - for (int q=0; q<=K.dim(); ++q) - { - if (full) - { - _sub.at(q) = OSM::Bitboard(K.nb_cells(q),false) ; // all cells to 1 - _full = true ; - } - else - _sub.at(q) = OSM::Bitboard(K.nb_cells(q),true) ; // all cells to 0 - _nb_cells.at(q) = K.nb_cells(q) ; - } - } - - - /** \brief Constructor from an enumeration of cellId of the sub chain complex (close the complex down if necessary). */ - SubChainComplex(const ComplexType& K, const std::vector > &cells, bool close = true) - { - _dim = K.dim() ; - _sub.resize(_dim+1) ; - _nb_cells.resize(_dim+1) ; - _full = true ; - // Create Bitboards - for (int q=0; q<=K.dim(); ++q) - { - _sub.at(q) = OSM::Bitboard(K.nb_cells(q)) ; - } - - // Set bits - if (close) - down_closure(cells, K) ; - else - set_cells(cells, K) ; - - for (int q=0; q<=K.dim(); ++q) - { - _full = (_full && (_nb_cells.at(q) == _sub.at(q).size())) ; - } - } - - /** \brief Copy constructor. */ - SubChainComplex(const SubChainComplex& _otherToCopy) - { - _dim = _otherToCopy._dim ; - _nb_cells = _otherToCopy._nb_cells ; - _full = _otherToCopy._full ; - _sub = _otherToCopy._sub ; - } - - /** \brief Complement of a sub chain complex. */ - SubChainComplex complement() - { - SubChainComplex cSub(*this) ; - // Complement bitboards - for (int q=0; q<=_dim; ++q) - { - cSub._sub.at(q).bit_not() ; - cSub._nb_cells.at(q) = _sub.at(q).size() - _nb_cells.at(q) ; - cSub._full = ~_full ; - } - return cSub ; - } - - /** \brief Check for a bit (bit i in dimension q). */ - inline bool get_Bit(int q, int i) const - { - return _sub.at(q).isOn(i) ; - } - - /** \brief Check for a bit (bit i in dimension q). */ - inline void set_BitOn(int q, int i) - { - return _sub.at(q).setOn(i) ; - } - - /** \brief Check for a bit (bit i in dimension q). */ - inline void set_BitOff(int q, int i) - { - return _sub.at(q).setOff(i) ; - } - - /** \brief Getter for the bitboards of the sub chain complex. */ - inline const std::vector& get_BitBoard() const - { - return _sub ; - } - - /** \brief Getter for the bitboard of the sub chain complex in dimension q. */ - inline const OSM::Bitboard& get_BitBoard(int q) const - { - return _sub.at(q) ; - } - - // template - // friend ostream & operator << (ostream & out, const SubChainComplex<_CoefficientType,_ComplexType> & sub) - // { - // for (int q = 0; q <= sub._dim; ++q) - // out << "dim " << q << " : " << sub._sub.at(q) << endl ; - // return out ; - // } - - friend std::ostream & operator << (std::ostream & out, const SubChainComplex & sub) - { - for (int q = 0; q <= sub._dim; ++q) - out << "dim " << q << " : " << sub._sub.at(q) << std::endl ; - return out ; - } -}; - -} /* end namespace HDVF */ -} /* end namespace CGAL */ - -#endif /* SUB_CHAIN_COMPLEX_H */ diff --git a/HDVF/include/CGAL/OSM/Chain.hpp b/HDVF/include/CGAL/OSM/Chain.h similarity index 99% rename from HDVF/include/CGAL/OSM/Chain.hpp rename to HDVF/include/CGAL/OSM/Chain.h index 022fa1e75cd1..76a49bbed667 100644 --- a/HDVF/include/CGAL/OSM/Chain.hpp +++ b/HDVF/include/CGAL/OSM/Chain.h @@ -13,7 +13,7 @@ #include "__base.hpp" -#include "SparseMatrix.hpp" +#include "Sparse_matrix.h" #include #include #include diff --git a/HDVF/include/CGAL/OSM/OSM.hpp b/HDVF/include/CGAL/OSM/OSM.hpp index 64aade86e820..0c33a30d271f 100644 --- a/HDVF/include/CGAL/OSM/OSM.hpp +++ b/HDVF/include/CGAL/OSM/OSM.hpp @@ -14,7 +14,7 @@ //#define DEBUG #include "__base.hpp" -#include "Chain.hpp" -#include "SparseMatrix.hpp" +#include "Chain.h" +#include "Sparse_matrix.h" #endif diff --git a/HDVF/include/CGAL/OSM/SparseMatrix.hpp b/HDVF/include/CGAL/OSM/Sparse_matrix.h similarity index 99% rename from HDVF/include/CGAL/OSM/SparseMatrix.hpp rename to HDVF/include/CGAL/OSM/Sparse_matrix.h index acf60f612e4d..67bd35d9c083 100644 --- a/HDVF/include/CGAL/OSM/SparseMatrix.hpp +++ b/HDVF/include/CGAL/OSM/Sparse_matrix.h @@ -12,7 +12,7 @@ #define __OSM_SPARSE_MATRIX__ -#include "Chain.hpp" +#include "Chain.h" #include "Bitboard.hpp" #include #include From 184305fff6503531af407589cc53c214afef4b44 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Tue, 20 May 2025 06:29:53 +0200 Subject: [PATCH 017/343] Concept SparseMatrix -> Concept SparseMatrix OK -> Starting Sparse_matrix rework --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 2 +- HDVF/doc/HDVF/Concepts/Filtration.h | 4 +- HDVF/doc/HDVF/Concepts/HDVF.h | 9 +- HDVF/doc/HDVF/Concepts/SparseChain.h | 34 +- HDVF/doc/HDVF/Concepts/SparseMatrix.h | 2629 ++--------------- .../HDVF/fig/Sparse_matrix_example_col.pdf | Bin 0 -> 16750 bytes .../Abstract_simplicial_chain_complex.hpp | 8 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 2 +- .../CGAL/HDVF/Cubical_chain_complex.hpp | 8 +- HDVF/include/CGAL/HDVF/Filtration_core.h | 4 +- HDVF/include/CGAL/HDVF/Hdvf.h | 172 +- HDVF/include/CGAL/HDVF/Hdvf_core.h | 58 +- HDVF/include/CGAL/HDVF/Hdvf_persistence.h | 8 +- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 2 +- HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 18 +- .../CGAL/HDVF/Sub_chain_complex_mask.h | 2 +- HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 24 +- .../CGAL/OSM/{Bitboard.hpp => Bitboard.h} | 4 +- HDVF/include/CGAL/OSM/Chain.h | 32 +- HDVF/include/CGAL/OSM/Sparse_matrix.h | 560 ++-- HDVF/include/CGAL/OSM/__base.hpp | 43 +- 21 files changed, 646 insertions(+), 2977 deletions(-) create mode 100644 HDVF/doc/HDVF/fig/Sparse_matrix_example_col.pdf rename HDVF/include/CGAL/OSM/{Bitboard.hpp => Bitboard.h} (99%) diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h index 48217fa8598c..4bda2f88edd6 100644 --- a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -39,7 +39,7 @@ typedef OSM::Chain RChain ; /*! Type of column-major sparse matrices (used to store the boundary operator) */ -typedef OSM::SparseMatrix CMatrix; +typedef OSM::Sparse_matrix CMatrix; /// @} diff --git a/HDVF/doc/HDVF/Concepts/Filtration.h b/HDVF/doc/HDVF/Concepts/Filtration.h index 7ce48f58c656..f6434ca62313 100644 --- a/HDVF/doc/HDVF/Concepts/Filtration.h +++ b/HDVF/doc/HDVF/Concepts/Filtration.h @@ -46,12 +46,12 @@ class Filtration /*! Type of column-major sparse matrices. */ - typedef OSM::SparseMatrix<_CoefType,OSM::COLUMN> CMatrix ; + typedef OSM::Sparse_matrix<_CoefType,OSM::COLUMN> CMatrix ; /*! Type of row-major sparse matrices. */ - typedef OSM::SparseMatrix<_CoefType,OSM::ROW> RMatrix ; + typedef OSM::Sparse_matrix<_CoefType,OSM::ROW> RMatrix ; /*! Type of column-major chains. diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h index cebc001a437b..dd9121fa4307 100644 --- a/HDVF/doc/HDVF/Concepts/HDVF.h +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -47,7 +47,7 @@ That is, for all \f$q\in \mathbb N\f$, if - compute the full reduction (option `OPT_FULL`): to get the full homological / cohomological information \cgalHasModelsBegin -\cgalHasModelsBare{`Hdvf_core`} +\cgalHasModelsBare{`Hdvf_core`} \cgalHasModelsBare{`Hdvf`} \cgalHasModelsBare{`Hdvf_persistence`} \cgalHasModelsBare{`Hdvf_duality`} @@ -56,7 +56,7 @@ That is, for all \f$q\in \mathbb N\f$, if \sa `AbstractChainComplex` \sa `Ring` \sa `SparseChain` - \sa `SparseMatrix` + \sa `Sparsematrix` *How to describe constants declared in the namespace HDVF and used everywhere? FlagType, options, exporttype* @@ -68,6 +68,11 @@ class HDVF /// \name Types /// @{ +/*! + * \brief Type of coefficients stored in the matrix (a model of `Ring`). + */ +typedef Ring CoefficientType; + /*! Type of column-major chains */ diff --git a/HDVF/doc/HDVF/Concepts/SparseChain.h b/HDVF/doc/HDVF/Concepts/SparseChain.h index 022fa1e75cd1..ba914f78cd50 100644 --- a/HDVF/doc/HDVF/Concepts/SparseChain.h +++ b/HDVF/doc/HDVF/Concepts/SparseChain.h @@ -13,7 +13,7 @@ #include "__base.hpp" -#include "SparseMatrix.hpp" +#include "Sparse_matrix.h" #include #include #include @@ -43,12 +43,12 @@ class Chain { typedef typename std::unordered_map::iterator iterator; typedef typename std::unordered_map::const_iterator const_iterator; - // Add these lines to allow the SparseMatrix class to access other templated + // Add these lines to allow the Sparse_matrix class to access other templated // SparsedMatrix private members. template friend class Chain; template - friend class SparseMatrix; + friend class Sparse_matrix; protected: /** \brief The chain inner representation and storage of data. */ std::unordered_map chainData; @@ -64,8 +64,8 @@ class Chain { public: /** - * \brief Create new Chain for SparseMatrix object. - * + * \brief Create new Chain for Sparse_matrix object. + * * Default constructor, initialize an empty Chain as a Z integers column chain. * The default chain size is 128. * @@ -86,8 +86,8 @@ class Chain { } /** - * \brief Create new Chain for SparseMatrix object. - * + * \brief Create new Chain for Sparse_matrix object. + * * Constructor with size, initialize an empty Chain as a Z integers column chain with boundary check. * * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) @@ -123,8 +123,8 @@ class Chain { size_t dimension() const { return upperBound ; } /** - * \brief Create new Chain for SparseMatrix object. - * + * \brief Create new Chain for Sparse_matrix object. + * * Copy constructor, initialize a Chain based on the same type of chain. * The resulting chain will be a copy of the passed chain. * @@ -327,7 +327,7 @@ class Chain { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + friend Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); /** * \brief Perform matrix multiplication between two chains. @@ -350,7 +350,7 @@ class Chain { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + friend Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); /** * \brief Perform dot product between two chains. @@ -844,11 +844,11 @@ class Chain { * \date 08/04/2024 */ template -SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - SparseMatrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); +Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + Sparse_matrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); for (std::pair pair : _row.chainData) { - OSM::setColumn(matrix,pair.first,_column * pair.second) ; + OSM::set_column(matrix,pair.first,_column * pair.second) ; } return matrix; @@ -875,11 +875,11 @@ SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Cha * \date 08/04/2024 */ template -SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - SparseMatrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); +Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + Sparse_matrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); for (std::pair pair : _column.chainData) { - OSM::setRow(matrix,pair.first,_row * pair.second); + OSM::set_row(matrix,pair.first,_row * pair.second); } return matrix; diff --git a/HDVF/doc/HDVF/Concepts/SparseMatrix.h b/HDVF/doc/HDVF/Concepts/SparseMatrix.h index acf60f612e4d..529ff5b81055 100644 --- a/HDVF/doc/HDVF/Concepts/SparseMatrix.h +++ b/HDVF/doc/HDVF/Concepts/SparseMatrix.h @@ -1,2627 +1,354 @@ -/** - * \file SparseMatrix.hpp - * \brief Namespace file for describing library. - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - * - * Define everything for the SparseMatrix class - */ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept + +The concept `SparseMatrix` describes the requirements for sparse matrices optimized for topological computations. +Traditionally, sparse matrices data structures encode non zero coefficients of (sparse) matrices in order to optimize either matrices memory footprint, or linear algebra operations (which usually comes to optimize iterators over non zero coefficients and access to coefficients). However, topological operations require slightly different features: + - fast access to row or columns of matrices (which are actually the images under the application encoded by the matrix) + - fast block operations (especially along row or columns) + + The `SparseMatrix` concept describes requirements for such sparse matrix. It relies on the model of `SparseChain` which encodes sparse row or column vectors. Matrices are either column major or row major (hence they either store column sparse chains or row sparse chains). + + The following constants encode the major direction of both sparse chains and sparse matrices. + - `OSM::COLUMN` for column-major chains and matrices (which is the default), + - `OSM::ROW` for row-major chains and matrices. + + For instance, given the \f$3\times 4\f$ matrix: + \f[ + A = \left(\begin{array}{cccc} + 1 & \cdot & \cdot & \cdot \\ + -1 & \cdot & 2 & \cdot\\ + \cdot & \cdot & 1 & \cdot \\ + \cdot & \cdot & \cdot & \cdot \\ + \end{array}\right) + \f] + where \f$\cdot\f$ means \f$0\f$. + - A column-major representation of \f$A\f$ is: \f$[0\mapsto c_0, 2\mapsto c_2]\f$ with the column-chains: \f$c_0 = [0\mapsto 1, 1\mapsto -1]\f$ and \f$c_2 = [1\mapsto 2, 2\mapsto 1]\f$. + - A row-major representation of \f$A\f$ is: \f$[0\mapsto c_0, 1\mapsto c_1, 2\mapsto c_2]\f$ with the row-chains: \f$c_0 = [0\mapsto 1]\f$ and \f$c_1 = [0\mapsto -1, 2\mapsto 2]\f$ and \f$c_2 = [2\mapsto 1]\f$. + +\cgalHasModelsBegin +\cgalHasModelsBare{`OSM::Sparse_matrix`} +\cgalHasModelsEnd + + \sa `Ring` + \sa `SparseChain` +*/ -#ifndef __OSM_SPARSE_MATRIX__ -#define __OSM_SPARSE_MATRIX__ - - -#include "Chain.hpp" -#include "Bitboard.hpp" -#include -#include -#include - -// DEBUG : matrix output for SparseMatrices / no DEBUG : chain output for SparseMatrices -//#define DEBUG - -namespace CGAL { -namespace OSM { - -/** - * \class SparseMatrix - * \brief Vector implementation of sparse matrices. - * - * The SparseMatrix class contains all algebraic functions that are related to OSM matrices (optimized sparse matrices). - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template class SparseMatrix { public: - typedef Chain<_CoefficientType, _ChainTypeFlag> MatrixChain; - - // Add these lines to allow the SparseMatrix class to access other templated - // SparsedMatrix private members. - template - friend class SparseMatrix; - -protected: - /** \brief The inner chain storage. */ - std::vector> chains; - - /** \brief A bitboard containing state of each columns. */ - Bitboard chainsStates; + /// \name Types + /// @{ - /** \brief The matrix size as a (row, column) pair. */ - std::pair size; - - /** - * \brief Get a chain from a matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The reference to the chain stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Type of coefficients stored in the matrix (a model of `Ring`). */ - MatrixChain& operator[](const int _index) { - if (_ChainTypeFlag == COLUMN && _index >= size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); - } - if (_ChainTypeFlag == ROW && _index >= size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); - } - - chainsStates |= _index; - return chains[_index]; - } + typedef Ring CoefficientType; -public: - /** - * \brief Create new SparseMatrix object. - * - * Default constructor, initialize an empty Matrix as Z integers column chains. - * The default matrix size is 128x128. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Matrix and chain type (either OSM::ROW or OSM::COLUMN). */ - SparseMatrix() { - chains = std::vector(0); - chainsStates = Bitboard(0); - size = {0, 0}; - } + typedef int ChainTypeFlag; - /** - * \brief Create new SparseMatrix object. - * - * Constructor with size, initialize an empty Matrix as Z integers column chains. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _rowCount The number of rows to preallocate. - * \param[in] _columnCount The number of columns to preallocate. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief A data structure storing indices of non empty chains. */ - SparseMatrix(const int _rowCount, const int _columnCount) { - int mainSize = _ChainTypeFlag == COLUMN ? _columnCount : _rowCount; - int secondarySize = _ChainTypeFlag == COLUMN ? _rowCount : _columnCount; - - chains = std::vector>(mainSize); - for (int i = 0 ; i < mainSize ; i++) { - chains[i] = Chain<_CoefficientType, _ChainTypeFlag>(secondarySize); - } - - chainsStates = Bitboard(mainSize); - size = {_rowCount, _columnCount}; - } + typedef unspecified_type NonZeroChainIndices; - /** - * \brief Create new SparseMatrix from other SparseMatrix object. - * - * Copy constructor, initialize a SparseMatrix (not necessarly based on the same type of matrix). - * If types are different, the constructor performs conversion. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _otherToCopy The matrix we want to copy. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Type of the chains stored in the matrix. */ - template - SparseMatrix(const SparseMatrix<_CoefficientType,CTF> &_otherToCopy) { - // *this = _otherToCopy; - if (_ChainTypeFlag == CTF) - { - chainsStates = _otherToCopy.chainsStates; - size = _otherToCopy.size; - // Copy of chains as such - chains.resize(_otherToCopy.chains.size()) ; - for (int i = 0; i<_otherToCopy.chains.size(); ++i) - { - const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; - Chain<_CoefficientType,_ChainTypeFlag> res(tmp.dimension()) ; - for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) - { - res[it->first] = it->second ; - } - chains[i] = res ; - } - } - else // Copy coefficient by coefficient - { - size = _otherToCopy.size; - int vec_size = (_ChainTypeFlag == OSM::COLUMN)?size.second:size.first ; - int chain_size = (_ChainTypeFlag == OSM::COLUMN)?size.first:size.second ; - chains.resize(vec_size) ; - chainsStates = OSM::Bitboard(vec_size) ; - for (int i=0; i(chain_size) ; - } - - for (int i = 0; i<_otherToCopy.chains.size(); ++i) - { - const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; - for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) - { - chains[it->first][i] = it->second ; - chainsStates.setOn(it->first) ; - } - } - } - } + typedef unspecified_type MatrixChain; - /** - * \brief Assign to other matrix. - * - * Assign to other matrix coefficient-wise, equivalent to copying it. - * - * \pre The matrices must have the same type. - * - * \param[in] _otherToCopy The matrix we want to copy. - * - * \return The reference to the modified matrix. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - SparseMatrix& operator=(const SparseMatrix& _otherToCopy) - { - chainsStates = _otherToCopy.chainsStates; - size = _otherToCopy.size; - chains = _otherToCopy.chains; - - return *this; - } + /// @} - /** - * \brief Clean a SparseMatrix (set everything to zero) - * - * Empty all structures of the sparse matrix. - * - * \warning Will raise an error if the other matrix is not the same chain type. - * - * \see \link OSM::SparseMatrix \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - void nullify() { - std::vector coefs ; - for (OSM::Bitboard::iterator it = begin(); it != end(); ++it) - { - coefs.push_back(*it) ; - } - *this /= coefs ; - } + /// \name Creation, filling + /// @{ - /** - * \brief Displays a SparseMatrix in the output stream. - * - * \param[in] _stream The output stream. - * \param[in] _matrix The matrix to display. - * - * \return A reference to the modified stream. - * - * \see \link OSM::Matrix \endlink + /*! + * \brief Create an empty new SparseMatrix object. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Default constructor, initialize an empty Matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType`. + * The default matrix size is 0x0. */ - friend std::ostream& operator<<(std::ostream &_stream, const SparseMatrix &_matrix) { -#ifndef DEBUG - bool empty = true; - - _stream << "["; - for (int index : _matrix.chainsStates) { - empty = false; - _stream << index << ": " << _matrix.chains[index] << ", "; - } - - if (!empty) { - _stream << "\b\b"; - } - _stream << "]" << std::endl ; -#else - for (int i=0; i<_matrix.size.first; ++i) - { - for (int j=0; j<_matrix.size.second; ++j) - { - - //_CoefficientType tmp = _matrix[j][i] ; // get_coef(i,j) ; - _CoefficientType tmp = _matrix.get_coef(i,j) ; - - if (tmp == 0) - _stream << ".\t" ; - else - _stream << tmp << "\t" ; - } - _stream << std::endl ; - } -#endif - - return _stream; - } + SparseMatrix() ; - - /** - * \brief Adds two matrices together. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrixs have the same chain type. - * - * \warning Will raise an error if the other matrix is not the same chain type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. + /*! + * \brief Create a new SparseMatrix object with given rows/columns sizes. * - * \return A new matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend SparseMatrix operator+(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { - SparseMatrix newMatrix(_first); - newMatrix += _second; - - return newMatrix; - } - - /** - * \brief Substracts two matrices together. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrixs have the same chain type. - * - * \warning Will raise an error if the other matrix is not the same chain type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return A new matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend SparseMatrix operator-(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { - SparseMatrix newMatrix = _first; - newMatrix -= _second; - - return newMatrix; - } - - /** - * \brief Apply factor on each coefficients. - * - * \warning Will raise an error if _lambda is 0. - * - * \param[in] _lambda The factor to apply. - * \param[in] _matrix The matrix. - * - * \return A new matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Constructor with sizes, initialize an empty Matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType` and a given size along rows/columns. */ - template - friend SparseMatrix operator*(const _CT& _lambda, const SparseMatrix<_CT, _CTF> &_matrix) { - SparseMatrix newMatrix = _matrix; - newMatrix *= _lambda; - - return newMatrix; - } + SparseMatrix(const int rowCount, const int columnCount) ; /** - * \brief Apply factor on each coefficients. - * - * \warning Will raise an error if _lambda is 0. - * - * \param[in] _matrix The matrix. - * \param[in] _lambda The factor to apply. + * \brief Create a new SparseMatrix from another SparseMatrix object (with possibly a different `ChainTypeFlag`). * - * \return A new matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Copy constructor, initialize a SparseMatrix of same sizes, containing the same coefficients (but not necessarly of the same `ChainTypeFlag`). + * If types are different, the constructor performs conversion. */ - template - friend SparseMatrix operator*(const SparseMatrix<_CT, _CTF> &_matrix, const _CT& _lambda) { - SparseMatrix newMatrix = _matrix; - newMatrix *= _lambda; - - return newMatrix; - } + SparseMatrix(const SparseMatrix& otherToCopy); - /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. + /*! + * \brief Assign to other matrix. * - * \see \link OSM::Chain \endlink + * Assign to other matrix coefficient-wise, equivalent to copying it. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The matrices must have the same type. */ - template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + SparseMatrix& operator=(const SparseMatrix& _otherToCopy); /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. + * \brief Clean a SparseMatrix (set all coefficients to zero). * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink + * Empty all structures of the sparse matrix. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + void nullify(); - /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + /// @} - /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + /// \name Matrix informations and iterators + /// @{ /** - * \brief Perform multiplication between a column-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink + * \brief Gets the matrix size. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The matrix size as a row/column pair. */ - template - friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second); + std::pair dimensions(); /** - * \brief Perform multiplication between a row-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \brief Iterator to the beginning of the chains indices (visited by increasing indices). * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The function returns an iterator to the beginning of the (non zero) chains indices. */ - template - friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second); + inline NonZeroChainIndices::iterator begin() const noexcept; /** - * \brief Perform multiplication between a row-based chain and a row-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. + * \brief Iterator to the ending of the chains indices (visited by increasing indices). * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The function returns an iterator to the ending of the chains indices. */ - template - friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) ; + inline NonZeroChainIndices::iterator end() const noexcept; /** - * \brief Perform multiplication between a row-based chain and a column-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink + * \brief Reverse iterator to the beginning of the chains indices (visited by decreasing indices). * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The function returns a reverse iterator to the beginning of the (non zero) chains indices. */ - template - friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) ; + inline NonZeroChainIndices::iterator reverse_begin() const noexcept; /** - * \brief Perform matrix multiplication between two chains. + * \brief Reverse iterator to the ending of the chains indices (visited by decreasing indices). * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The function returns a reverse iterator to the ending of the chains indices. */ - template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + inline NonZeroChainIndices::iterator reverse_end() const noexcept; - /** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + /// @} - /** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + /// \name Output + /// @{ /** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \brief Displays a SparseMatrix in the output stream. */ - template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + friend std::ostream& operator<<(std::ostream &_stream, const SparseMatrix &_matrix); - /** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - SparseMatrix& operator+=(const SparseMatrix &_other) { - if (this->size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); - } - - for (int index: _other.chainsStates) { - this->chainsStates |= index; - this->chains[index] += _other.chains[index]; - - if (this->chains[index].isNull()) { - this->chainsStates.setOff(index); - } - } - - return *this; - } + /// @} - /** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ - template - friend SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + /// \name Linear algebra operators + /// @{ /** * \brief Add a matrix and assign. * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 + * Adds each coefficient of the matrix together and stores the result in `this`. + * Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. */ - template - friend SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + friend SparseMatrix& operator+=(SparseMatrix &matrix, const SparseMatrix &other); /** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink + * \brief Adds two matrices together. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Adds each coefficient of the matrices together and returns a new matrix (of the same type as `first`) representing the result (when possible, prefer `+=` for efficiency). + * Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. */ - SparseMatrix& operator-=(const SparseMatrix &_other) { - if (this->size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); - } - - for (int index: _other.chainsStates) { - this->chainsStates |= index; - this->chains[index] -= _other.chains[index]; - - if (this->chains[index].isNull()) { - this->chainsStates.setOff(index); - } - } - - return *this; - } - + friend SparseMatrix operator+(const SparseMatrix &first, const SparseMatrix &second); - /** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ - template - friend SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); /** * \brief Substract a matrix and assign. * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 + * Substracts each coefficient of the matrix together and stores the result in `matrix`. + * Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. */ - template - friend SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + SparseMatrix& operator-=(SparseMatrix &matrix, const SparseMatrix &other); /** - * \brief Apply factor on each coefficients and assign. - * - * \warning Will raise an error if _lambda is 0. - * - * \param[in] _lambda The factor to apply. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink + * \brief Substracts two matrices together. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Substracts each coefficient of the matrix together and returns a new matrix (of the same type as `first`) representing the result (when possible, prefer `-=` for efficiency). + * Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. */ - SparseMatrix& operator*=(const _CoefficientType& _lambda) { - if (_lambda == 0) { - *this = SparseMatrix(); - return *this; - } - - for (int index: this->chainsStates) { - this->chains[index] *= _lambda; - } - - return *this; - } + friend SparseMatrix operator-(const SparseMatrix &_first, const SparseMatrix &second); /** * \brief Compute the negative of a matrix (unary operator). * * \return The resulting matrix. - * - * \see \link OSM::SparseMatrix \endlink - * - * \author Bac A. - * \version 0.1.0 - * \date 07/09/2024 - */ - friend SparseMatrix operator-(const SparseMatrix& _matrix) { - SparseMatrix res(_matrix.size.first, _matrix.size.second) ; - - for (int index: _matrix.chainsStates) - { - const MatrixChain& tmp_chain(_matrix.chains[index]) ; - for (typename MatrixChain::const_iterator it = tmp_chain.cbegin(); it != tmp_chain.cend(); ++it) - res[index][it->first] = -it->second ; - } - return res ; - } - - /** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 */ - template - friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + friend SparseMatrix operator-(const SparseMatrix& _matrix); /** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 + * \brief Apply factor on each coefficients and assign. */ - template - friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other); + SparseMatrix& operator*=(const CoefficientType& lambda); /** * \brief Multiply a matrix and assign. * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 + * Multiply each coefficient of the matrix together and stores the result in `matrix`. + * Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. */ - template - friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + friend SparseMatrix& operator*=(SparseMatrix &matrix, const SparseMatrix &other); /** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \brief Perform multiplication between matrices and returns a new column-major matrix. * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 + * Perform standard linear algebra product between matrices and returns a new column-major matrix (when possible, prefer `*=` for efficiency). Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. Efficiency of the product depends of `ChainTypeFlag` (when possible, prefer row-major by column-major products). */ - template - friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + friend SparseMatrix operator*(const SparseMatrix &first, const SparseMatrix &second); /** - * \brief Get a chain from a const matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The chain stored at given index. + * \brief Perform multiplication between matrices and returns a new row-major matrix. * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Perform standard linear algebra product between matrices and returns a new row-major matrix (when possible, prefer `*=` for efficiency). Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. Efficiency of the product depends of `ChainTypeFlag`. */ - MatrixChain operator[](const int _index) const { - if (_ChainTypeFlag == COLUMN && _index >= size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); - } - if (_ChainTypeFlag == ROW && _index >= size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); - } - - return chains[_index]; - } + friend SparseMatrix operator%(const SparseMatrix &first, const SparseMatrix &second); /** - * \brief Set a given coefficient. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _i The row index. - * \param[in] _j The column index. - * \param[in] _d The value. + * \brief Perform multiplication between a matrix and a column-based chain. * - * \see \link OSM::Chain \endlink + * Generates a column-based chain from the matrix multiplication and returns it. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The matrix and the chain must have the same coefficient type. */ - void set_coef(const int _i, const int _j, const _CoefficientType _d) { - if (_i >= size.first) { - throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); - } - if (_j >= size.second) { - throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); - } - - - if (_ChainTypeFlag == COLUMN) - { - (*this)[_j][_i] = _d ; - } - else - (*this)[_i][_j] = _d ; - } + friend Chain operator*(const SparseMatrix& first, const Chain& second); /** - * \brief Get a given coefficient. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _i The row index. - * \param[in] _j The column index. - * - * \return The value of the given coefficient. + * \brief Perform multiplication between a row-based chain and a matrix. * - * \see \link OSM::Chain \endlink + * Generates a row-based chain from the matrix multiplication and returns it. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The matrix and the chain must have the same coefficient type. */ - - _CoefficientType get_coef(const int _i, const int _j) const { - if (_i >= size.first) { - //std::cout << "Provided _i index should be less than " << size.first << "." << std::endl; - throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); - } - if (_j >= size.second) { - //std::cout << "Provided _j index should be less than " << size.second << "." << std::endl; - throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); - } - - - if (_ChainTypeFlag == COLUMN) - return (*this)[_j][_i] ; - else // ROW - return (*this)[_i][_j] ; - } + friend Chain operator*(const Chain& first, const SparseMatrix& second); /** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink + * \brief Transpose a matrix. * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * The function returns a new matrix where the chain type flag is changed. */ - template - friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + SparseMatrix transpose(); - /** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ - template - friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index); - /** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ - template - friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + /// @} - /** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ - template - friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + /// \name Access and blocks operations + /// @{ /** - * \brief Get a const reference over a column from a column matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A const reference over the column stored at given index. - * - * \see \link OSM::Chain \endlink + * \brief Get a chain from a const matrix. * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * If the matrix is column-major, returns the `i`th column, and if the matrix is row-major, returns the `i`th row. */ - template - friend const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + MatrixChain operator[](int index) const; /** - * \brief Get a const reference over a row from a row matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A const reference over the row stored at given index. - * - * \see \link OSM::Chain \endlink + * \brief Set a given coefficient. * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * Assign the scalar `d` to the coefficient on row `i` and column `j`. */ - template - friend const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + void set_coef(int i, int j, const CoefficientType d); /** - * \brief Get a reference over a column from a column matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the column stored at given index. - * - * \see \link OSM::Chain \endlink + * \brief Get a given coefficient. * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * Returns the coefficient on row `i` and column `j` of the matrix. */ - template - friend Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + CoefficientType get_coef(int i, int j) const; /** - * \brief Get a reference over a row from a row matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the row stored at given index. + * \brief Get the value of the column at a given `index` from the matrix (whatever the `ChainTypeFlag` of the matrix). * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * For column-matrices, it is equivalent to `operator[]`, for row-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - template - friend Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index); - - + friend Chain get_column(const SparseMatrix &matrix, int index); + /** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. - * - * \see \link OSM::Chain \endlink + * \brief Get the value of the row at a given `index` from the matrix (whatever the `ChainTypeFlag` of the matrix). * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * For row-matrices, it is equivalent to `operator[]`, for column-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - template - friend void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); - + friend Chain get_row(const SparseMatrix &matrix, int index); + /** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * \brief Get a constant reference over the column of index`i` from a column matrix. */ - template - friend void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + const Chain & cget_column(const SparseMatrix &_matrix, int i); /** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * \brief Get a constant reference over the row of index`i` from a row matrix. */ - template - friend void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + const Chain & cget_row(const SparseMatrix &_matrix, int i); /** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. + * \brief Set a column in the matrix (whatever the `ChainTypeFlag` of the matrix). * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 + * Set the `i`th column of `matrix` to `chain`. + * For column-matrices, it should be equivalent to an affectation, however, for row-matrices, a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - template - friend void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + void set_column(SparseMatrix &matrix, int i, const Chain &chain); /** - * \brief Get a submatrix from the matrix. - * - * Removes all indexes provided in the vector from the matrix and returns it. - * - * \note Will return a copy of the matrix if given vector is empty. - * \note The submatrix will be rectangular. - * - * \param[in] _matrix The matrix to process. - * \param[in] _indexes The indexes to remove. - * - * \return A new matrix representing the result. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link std::vector \endlink + * \brief Set a row in the matrix (whatever the `ChainTypeFlag` of the matrix). * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Set the `i`th row of `matrix` to `chain`. + * For row-matrices, it should be equivalent to an affectation, however, for column-matrices, a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - friend SparseMatrix operator/(const SparseMatrix &_matrix, const std::vector &_indexes) { - SparseMatrix res(_matrix); - res /= _indexes; - return res; - } + void set_row(SparseMatrix &matrix, int i, const Chain &chain); /** * \brief Get a submatrix from the matrix. * - * Removes index from the matrix and returns it. - * - * \note Will return a copy of the matrix if given vector is empty. - * \note The submatrix will be rectangular. - * - * \param[in] _matrix The matrix to process. - * \param[in] _index The index to remove. - * - * \return A new matrix representing the result. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Nullifies the chain of index `i` along the major direction of a copy of the matrix returns it. */ - friend SparseMatrix operator/(const SparseMatrix &_matrix, const int _index) { - SparseMatrix res(_matrix); - res /= _index; - return res; - } + friend SparseMatrix operator/(const SparseMatrix &_matrix, int i); /** * \brief Get a submatrix from the matrix and assign. * - * Removes all indexes provided in the vector from the matrix and returns it. - * - * \note Will not alter the matrix if given vector is empty. - * - * \param[in] _indexes The indexes to remove. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Removes (along the major dimension) all indexes provided in the vector `indexes` from the matrix and returns it. */ - SparseMatrix& operator/=(const std::vector &_indexes) { - for (int index : _indexes) { - *this /= index; - } - - return *this; - } + SparseMatrix& operator/=(const std::vector &indexes); /** * \brief Get a submatrix from the matrix and assign. * - * Removes index from the matrix and returns it. - * - * \note Will return a copy of the matrix if given vector is empty. - * \note The submatrix will be rectangular. - * - * \param[in] _index The index to remove. - * - * \return A new matrix representing the result. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - SparseMatrix& operator/=(const int _index) { - chains[_index].nullify(); - chainsStates.setOff(_index); - - return *this; - } - - /** - * \brief Get a submatrix from the matrix and assign. - * - * Removes all indexes provided in the vector from the matrix and returns it. - * - * \note Will not alter the matrix if given vector is empty. - * - * \param[in] _indexes The indexes to remove. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - SparseMatrix& delColumn(int _index) { - std::vector tmp_id{_index} ; - if (_ChainTypeFlag == OSM::COLUMN) - { - (*this)/=tmp_id ; - } - else // OSM::ROW - { - for (int index : chainsStates) - { - MatrixChain &tmp(chains[index]) ; - tmp/=tmp_id ; - // If the row index has become empty: update - if (tmp.isNull()) - *this /= std::vector({index}) ; - } - } - - return *this; - } - - SparseMatrix& delRow(int _index) - { - std::vector tmp_id{_index}; - if (_ChainTypeFlag == OSM::ROW) { - (*this) /= tmp_id; - } else // OSM::COLUMN - { - for (int index : chainsStates) { - MatrixChain &tmp(chains[index]); - tmp /= tmp_id; - // If the column index has become empty: update - if (tmp.isNull()) - *this /= std::vector({index}) ; - } - } - - return *this; - } - - SparseMatrix& delCoef(int _index1, int _index2) - { - - if (_ChainTypeFlag == OSM::COLUMN) { - std::vector tmp_id({_index1}) ; - MatrixChain &tmp(chains[_index2]); - tmp /= tmp_id; - if (tmp.isNull()) - chainsStates.setOff(_index2) ; - } else // OSM::ROW - { - std::vector tmp_id({_index2}) ; - MatrixChain &tmp(chains[_index1]); - tmp /= tmp_id; - if (tmp.isNull()) - chainsStates.setOff(_index1) ; - } - - return *this; - } - - /** - * \brief Iterator to the beginning of the chains indices. - * - * \return The iterator to the beginning of the chains indices. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::begin \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - inline Bitboard::iterator begin() const noexcept { return chainsStates.begin(); } - - /** - * \brief Iterator to the ending of the chains indices. - * - * \return The iterator to the ending of the chains indices. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::end \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Removes (along the major dimension) the chain of index `i` from the matrix and returns it. */ - inline Bitboard::iterator end() const noexcept { return chainsStates.end(); } + SparseMatrix& operator/=(int i); /** - * \brief Reverse iterator to the chains indices. - * - * \return The reverse iterator to the chains indices. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::begin \endlink + * \brief Nullifies a column from the matrix. * - * \author Bac A. - * \version 0.1.0 - * \date 08/04/2024 + * Removes column of index `i` whatever the `ChainTypeFlag` of the matrix. For column matrices, it just comes to the `\=` operator and for row matrices, it entails a traversal of the matrix. */ - inline Bitboard::reverse_iterator reverse_begin() noexcept { return chainsStates.reverse_begin(); } - inline Bitboard::reverse_iterator reverse_begin(size_t index) noexcept { return chainsStates.reverse_begin(index); } - - /** - * \brief Reverse iterator to the ending of the chains indices. - * - * \return The reverse iterator to the ending of the chains indices. - * - * \see \link OSM::SparseMatrix \endlink - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * \see \link std::vector::iterator \endlink - * \see \link std::vector::end \endlink - * - * \author Bac A. - * \version 0.1.0 - * \date 08/04/2024 - */ - inline Bitboard::reverse_iterator reverse_end() noexcept { return chainsStates.reverse_end(); } + SparseMatrix& del_column(int i); - /** - * \brief Transpose a matrix. - * - * \return A new matrix where the chain type flag is changed. - * - * \see \link OSM::SparseMatrix \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { - SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transposed(this->size.second, this->size.first); - - for (int index : this->chainsStates) { - transposed.chains[index] = this->chains[index].transpose(); - } - - transposed.chainsStates = this->chainsStates; - - return transposed; - } + /// @} - /** - * \brief Gets the matrix size. - * - * \return The matrix size as a Row/Column pair. - * - * \see \link OSM::SparseMatrix \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 06/05/2024 - */ - std::pair dimensions() const { - return this->size; - } }; - - - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - - // Perform col-col matrix multiplication with linear combination of columns. - for (int index: _second.chainsStates) { - Chain<_CT, COLUMN> column(_first.size.first); - - for (std::pair colRight: _second.chains[index]) { - if (_first.chainsStates.isOn(colRight.first)) { - column += colRight.second * _first.chains[colRight.first]; - } - } - - res[index] = column; - } - - return res; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - - // Perform row-col matrix multiplication with dot products. - for (int colRight: _second.chainsStates) { - Chain<_CT, COLUMN> column(_first.size.first); - - for (int rowLeft: _first.chainsStates) { - _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; - if (coef != 0) { - column[rowLeft] = coef; - } - } - - res[colRight] = column; - } - - return res; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - - // Perform row-col matrix multiplication with dot products. - for (int colLeft: _first.chainsStates) { - res += _first.chains[colLeft] * _second.chains[colLeft]; - } - - return res; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); - - // Perform row-col matrix multiplication with dot products. - for (int i = 0 ; i < _second.size.second ; i++) { - Chain<_CT, COLUMN> column(_first.size.first); - - for (int rowLeft: _first.chainsStates) { - _CT coef = _first.chains[rowLeft] * getColumn(_second, i); - if (coef != 0) { - column[rowLeft] = coef; - } - } - - if (!column.isNull()) { - res[i] = column; - } - } - - return res; -} - -/** - * \brief Perform multiplication between a column-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second) -{ - // Perform col-col matrix multiplication with linear combination of columns. - Chain<_CT, COLUMN> column(_first.size.first); - - for (typename Chain<_CT, COLUMN>::const_iterator it = _second.begin(); it != _second.end(); ++it) - { - column += it->second * _first.chains[it->first]; - } - - return column; -} - -/** - * \brief Perform multiplication between a row-based matrix and a column-based chain. - * - * Generate a column-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second) -{ - // Perform row-col matrix multiplication with dots - Chain<_CT, COLUMN> column(_first.size.first); - - for (int index : _first.chainsStates) - { - _CT tmp(_first[index] * _second) ; - if (tmp != 0) - column[index] = tmp ; - } - return column; -} - -/** - * \brief Perform multiplication between a row-based chain and a row-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) -{ - // Perform row-row matrix multiplication with linear combination of rows. - Chain<_CT, ROW> row(_second.size.second); - - for (typename Chain<_CT, ROW>::const_iterator it = _first.begin(); it != _first.end(); ++it) - { - row += it->second * _second.chains[it->first]; - } - - return row; -} - -/** - * \brief Perform multiplication between a row-based chain and a column-based matrix. - * - * Generate a row-based chain from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The matrix. - * \param[in] _second The chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) -{ - // Perform row-col matrix multiplication with dots - Chain<_CT, ROW> row(_second.size.second); - - for (int index : _second.chainsStates) - { - _CT tmp(_first * _second[index]) ; - if (tmp != 0) - row[index] = tmp ; - } - return row; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - - for (int i = 0 ; i < _first.size.first ; i++) { - Chain<_CT, ROW> row(_second.size.second); - - for (int colRight: _second.chainsStates) { - _CT coef = getRow(_first, i) * _second.chains[colRight]; - if (coef != 0) { - row[colRight] = coef; - } - } - - if (!row.isNull()) { - res[i] = row; - } - } - - return res; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - - // Perform row-col matrix multiplication with dot products. - for (int rowLeft: _first.chainsStates) { - Chain<_CT, ROW> row(_second.size.second); - - for (int colRight: _second.chainsStates) { - _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; - if (coef != 0) { - row[colRight] = coef; - } - } - - res[rowLeft] = row; - } - - return res; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - - // Perform row-col matrix multiplication with dot products. - for (int colLeft: _first.chainsStates) { - res += _first.chains[colLeft] % _second.chains[colLeft]; - } - - return res; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); - - // Perform row-row matrix multiplication with linear combination of rows. - for (int index: _first.chainsStates) { - Chain<_CT, ROW> row(_second.size.second); - - for (std::pair colRight: _first.chains[index]) { - if (_first.chainsStates.isOn(colRight.first)) { - row += colRight.second * _second.chains[colRight.first]; - } - } - - res[index] = row; - } - - return res; -} - -/** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { - if (_matrix.size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); - } - - for (int index = 0 ; index < _other.size.second ; index++) { - Chain column = getColumn(_other, index); - if (!column.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] += getColumn(_other, index); - - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); - } - } - } - - return _matrix; -} - -/** - * \brief Add a matrix and assign. - * - * Adds each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { - if (_matrix.size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); - } - - for (int index = 0 ; index < _other.size.first ; index++) { - Chain row = getRow(_other, index); - if (!row.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] += getRow(_other, index); - - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); - } - } - } - - return _matrix; -} - -/** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { - if (_matrix.size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); - } - - for (int index = 0 ; index < _other.size.second ; index++) { - Chain column = getColumn(_other, index); - if (!column.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] -= getColumn(_other, index); - - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); - } - } - } - - return _matrix; -} - -/** - * \brief Substract a matrix and assign. - * - * Substracts each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _matrix The matrix to reassign. - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { - if (_matrix.size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); - } - - for (int index = 0 ; index < _other.size.second ; index++) { - Chain row = getRow(_other, index); - if (!row.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] -= getRow(_other, index); - - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); - } - } - } - - return _matrix; -} - -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::SparseMatrix \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { - _matrix = _matrix * _other; - return _matrix; -} - -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other) { - _matrix = _matrix % _other; - return _matrix; -} - -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { - _matrix = _matrix * _other; - return _matrix; -} - -/** - * \brief Multiply a matrix and assign. - * - * Multiply each coefficient of the matrix together. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _other The other matrix. - * - * \return The modified matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 - */ -template -SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { - _matrix = _matrix % _other; - return _matrix; -} - -/** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { - return _matrix.chains[_index]; -} - -/** - * \brief Get a column from the matrix, even if matrix is a row-chain matrix. - * - * \note For column-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { - Chain<_CT, COLUMN> column(_matrix.size.first); - if (_matrix.size.first > 0) - { - for (int i : _matrix.chainsStates) { - if (!_matrix.chains[i].isNull(_index)) { - column[i] = _matrix.chains[i][_index]; - } - } - } - - return column; -} - -/** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { - Chain<_CT, ROW> row(_matrix.size.second); - if (_matrix.size.second > 0) - { - for (int i : _matrix.chainsStates) { - if (!_matrix.chains[i].isNull(_index)) { - row[i] = _matrix.chains[i][_index]; - } - } - } - - return row; -} - -/** - * \brief Get a row from the matrix, even if matrix is a row-chain matrix. - * - * \note For row-chain matrixes, it is equivalent to operator[]. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { - return _matrix.chains[_index]; -} - -/** - * \brief Get a const reference over a column from a column matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A const reference over the column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) -{ - if (_index >= _matrix.size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); - } - return _matrix.chains[_index]; -} - -/** - * \brief Get a const reference over a row from a row matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A const reference over the row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) -{ - if (_index >= _matrix.size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); - } - return _matrix.chains[_index]; -} - -/** - * \brief Get a reference over a column from a column matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index) -{ - if (_index >= _matrix.size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); - } - return _matrix.chains[_index]; -} - -/** - * \brief Get a reference over a row from a row matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Bac A. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index) -{ - if (_index >= _matrix.size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); - } - return _matrix.chains[_index]; -} - -/** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { - if(_matrix.dimensions().first != _chain.dimension()) - throw std::runtime_error("setColumn dimension error") ; - _matrix[_index] = _chain; - if (_chain.isNull()) - _matrix.chainsStates.setOff(_index) ; -} - -/** - * \brief Set a column from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new column. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { - if(_matrix.dimensions().first != _chain.dimension()) - throw std::runtime_error("setColumn dimension error") ; - for (int i = 0 ; i < _matrix.size.first ; i++) { - if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { - _matrix.chains[i] /= _index; - - if (_matrix.chains[i].isNull()) { - _matrix.chainsStates.setOff(i); - } - } - - if (!_chain.isNull(i)) { - _matrix.chainsStates |= i; - _matrix.chains[i][_index] = _chain[i]; - } - } -} - -/** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { - if(_matrix.dimensions().second != _chain.dimension()) - throw("setColumn dimension error") ; - for (int i = 0 ; i < _matrix.size.second ; i++) { - if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { - _matrix.chains[i] /= _index; - - if (_matrix.chains[i].isNull()) { - _matrix.chainsStates.setOff(i); - } - } - - if (!_chain.isNull(i)) { - _matrix.chainsStates |= i; - _matrix.chains[i][_index] = _chain[i]; - } - } -} - -/** - * \brief Set a row from the matrix, even if matrix is a row-chain matrix. - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * \param[in] _chain The new row. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { - if(_matrix.dimensions().second != _chain.dimension()) - throw("setColumn dimension error") ; - _matrix[_index] = _chain; - if (_chain.isNull()) - _matrix.chainsStates.setOff(_index) ; -} - -} /* end namespace OSM */ -} /* end namespace CGAL */ - -#endif diff --git a/HDVF/doc/HDVF/fig/Sparse_matrix_example_col.pdf b/HDVF/doc/HDVF/fig/Sparse_matrix_example_col.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ff6befb8d97c2bb975b05f2ed464e9d4ffdbd710 GIT binary patch literal 16750 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%0DJ}d}cK~w&Hd!7BeRKL8C7*%`wlpa&{uP=V_OK#} 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 RChain ; /** \brief Type of column-major sparse matrices */ - typedef OSM::SparseMatrix CMatrix; + typedef OSM::Sparse_matrix CMatrix; /** @@ -108,7 +108,7 @@ class Abstract_simplicial_chain_complex { CChain d(int id_cell, int q) const { if (q > 0) - return OSM::getColumn(_d[q], id_cell); + return OSM::get_column(_d[q], id_cell); else return CChain(0) ; } @@ -128,7 +128,7 @@ class Abstract_simplicial_chain_complex { RChain cod(int id_cell, int q) const { if (q < _dim) - return OSM::getRow(_d[q+1], id_cell); + return OSM::get_row(_d[q+1], id_cell); else return RChain(0) ; } @@ -356,7 +356,7 @@ void Abstract_simplicial_chain_complex::calculate_d(int dim) co } // Insert the chain into the corresponding column of the delta matrix - OSM::setColumn(_d[dim], i, chain); + OSM::set_column(_d[dim], i, chain); } } } diff --git a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp index dfe8c6b53ed2..a350b1038a17 100644 --- a/HDVF/include/CGAL/HDVF/CubComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/CubComplexTools.hpp @@ -38,7 +38,7 @@ namespace CGAL { namespace HDVF { -template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix> +template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::Sparse_matrix> void Cub_output_vtk (Hdvf_core, _ChainType, _SparseMatrixType> &hdvf, Cubical_chain_complex &complex, string filename = "test") { typedef Hdvf_core, _ChainType, _SparseMatrixType> HDVF_type; diff --git a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp index 686461dd1ceb..511f7610a346 100644 --- a/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp +++ b/HDVF/include/CGAL/HDVF/Cubical_chain_complex.hpp @@ -130,7 +130,7 @@ class Cubical_chain_complex { /** \brief Type of row-major chains */ typedef OSM::Chain RChain ; /** \brief Type of column-major sparse matrices */ - typedef OSM::SparseMatrix CMatrix; + typedef OSM::Sparse_matrix CMatrix; /** * \brief Affectation operator for cubical chain complexes. @@ -166,7 +166,7 @@ class Cubical_chain_complex { CChain d(int id_cell, int q) const { if (q > 0) - return OSM::cgetColumn(_d[q], id_cell); + return OSM::cget_column(_d[q], id_cell); else return CChain(0) ; } @@ -186,7 +186,7 @@ class Cubical_chain_complex { RChain cod(int id_cell, int q) const { if (q < _dim) - return OSM::getRow(_d[q+1], id_cell); + return OSM::get_row(_d[q+1], id_cell); else return RChain(0) ; } @@ -770,7 +770,7 @@ void Cubical_chain_complex::calculate_d(int dim) { CChain boundary = boundary_cell(i, dim); // Insert the chain into the corresponding column of the boundary matrix - OSM::setColumn(_d[dim], i, boundary); + OSM::set_column(_d[dim], i, boundary); } } diff --git a/HDVF/include/CGAL/HDVF/Filtration_core.h b/HDVF/include/CGAL/HDVF/Filtration_core.h index 2c60affb6860..6f8e8c74a9a5 100644 --- a/HDVF/include/CGAL/HDVF/Filtration_core.h +++ b/HDVF/include/CGAL/HDVF/Filtration_core.h @@ -81,12 +81,12 @@ class Filtration_core /*! Type of column-major sparse matrices */ - typedef OSM::SparseMatrix CMatrix ; + typedef OSM::Sparse_matrix CMatrix ; /*! Type of row-major sparse matrices */ - typedef OSM::SparseMatrix RMatrix ; + typedef OSM::Sparse_matrix RMatrix ; /*! Type of column-major chains */ diff --git a/HDVF/include/CGAL/HDVF/Hdvf.h b/HDVF/include/CGAL/HDVF/Hdvf.h index f9fd05f9da36..e64d23a55f17 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf.h +++ b/HDVF/include/CGAL/HDVF/Hdvf.h @@ -18,7 +18,7 @@ #include #include "CGAL/Hdvf/Hdvf_core.h" #include "CGAL/OSM/OSM.hpp" -#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/OSM/Bitboard.h" namespace CGAL { namespace HDVF { @@ -44,12 +44,12 @@ Using appropriate combinations of such operations, one can change a HDVF until c */ template -class Hdvf : public Hdvf_core { +class Hdvf : public Hdvf_core { public: /*! Type of parent Hdvf_core class. */ - typedef Hdvf_core HDVF_coreT ; + typedef Hdvf_core HDVF_coreT ; /** * \brief Default constructor. @@ -68,7 +68,7 @@ class Hdvf : public Hdvf_core(hdvf) { } + Hdvf(const Hdvf& hdvf) : Hdvf_core(hdvf) { } /** * \brief HDVF destructor. */ @@ -262,7 +262,7 @@ class Hdvf : public Hdvf_core -Hdvf::Hdvf(const ComplexType& K, int hdvf_opt) : Hdvf_core(K, hdvf_opt) { } +Hdvf::Hdvf(const ComplexType& K, int hdvf_opt) : Hdvf_core(K, hdvf_opt) { } @@ -284,7 +284,7 @@ PairCell Hdvf::find_pair_M(int q, bool &found) con // Search for +-1 in _F - iterate over rows for (OSM::Bitboard::iterator it_row = this->_F_row[q].begin(); (it_row != this->_F_row[q].end() && !found); ++it_row) { - const typename HDVF_coreT::RChain &row(OSM::cgetRow(this->_F_row[q],*it_row)); + const typename HDVF_coreT::RChain &row(OSM::cget_row(this->_F_row[q],*it_row)); // Iterate through the entries of the row for (typename HDVF_coreT::RChain::const_iterator it = row.begin(); (it != row.end() && !found); ++it) { @@ -330,7 +330,7 @@ PairCell Hdvf::find_pair_M(int q, bool &found, int // If tau is critical, search for pi such that =+-1 if (this->_flag.at(q).at(tau) == CRITICAL) { - const typename HDVF_coreT::RChain& row(OSM::getRow(this->_F_row.at(q), tau)) ; + const typename HDVF_coreT::RChain& row(OSM::get_row(this->_F_row.at(q), tau)) ; for (typename HDVF_coreT::RChain::const_iterator it = row.cbegin(); (it != row.cend() && !found); ++it) { if (abs(it->second) == 1) @@ -357,7 +357,7 @@ std::vector Hdvf::find_pairs_M(int q, bo // Search for +-1 in _F - iterate over rows for (OSM::Bitboard::iterator it_row = this->_F_row[q].begin(); it_row != this->_F_row[q].end() ; ++it_row) { - const typename HDVF_coreT::RChain &row(OSM::cgetRow(this->_F_row[q],*it_row)); + const typename HDVF_coreT::RChain &row(OSM::cget_row(this->_F_row[q],*it_row)); // Iterate through the entries of the row for (typename HDVF_coreT::RChain::const_iterator it = row.begin(); it != row.end(); ++it) { @@ -405,7 +405,7 @@ std::vector Hdvf::find_pairs_M(int q, bo // If tau is critical, search for pi such that =+-1 if (this->_flag.at(q).at(tau) == CRITICAL) { - const typename HDVF_coreT::RChain& row(OSM::getRow(this->_F_row.at(q), tau)) ; + const typename HDVF_coreT::RChain& row(OSM::get_row(this->_F_row.at(q), tau)) ; for (typename HDVF_coreT::RChain::const_iterator it = row.cbegin(); it != row.cend(); ++it) { if (abs(it->second) == 1) @@ -485,7 +485,7 @@ PairCell Hdvf::find_pair_W(int q, bool &found, int // If tau is critical, search for sigma such that =+-1 if (this->_flag.at(q).at(tau) == CRITICAL) { - typename HDVF_coreT::CChain col(OSM::getColumn(this->_G_col.at(q), tau)) ; + typename HDVF_coreT::CChain col(OSM::get_column(this->_G_col.at(q), tau)) ; for (typename HDVF_coreT::CChain::const_iterator it = col.cbegin(); (it != col.cend() && !found); ++it) { if (abs(it->second) == 1) @@ -561,7 +561,7 @@ std::vector Hdvf::find_pairs_W(int q, bo // If tau is critical, search for sigma such that =+-1 if (this->_flag.at(q).at(tau) == CRITICAL) { - typename HDVF_coreT::CChain col(OSM::getColumn(this->_G_col.at(q), tau)) ; + typename HDVF_coreT::CChain col(OSM::get_column(this->_G_col.at(q), tau)) ; for (typename HDVF_coreT::CChain::const_iterator it = col.cbegin(); it != col.cend(); ++it) { if (abs(it->second) == 1) @@ -598,12 +598,12 @@ PairCell Hdvf::find_pair_MW(int q, bool &found) co for (OSM::Bitboard::iterator it_pi = this->_H_col[q].begin(); (it_pi != this->_H_col[q].end() && !found); ++it_pi) { const int pi = *it_pi ; - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col.at(q), pi)) ; typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; for (int sigma = 0; (sigma < this->_H_col.at(q-1).dimensions().first && !found); ++sigma) { - typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; @@ -644,7 +644,7 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in { const int pi(tau) ; // Col pi of H_q and proj_P(d(pi)) must at least be non empty - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col.at(q), pi)) ; typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; @@ -654,7 +654,7 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in // Search for sigma with col_sigma(H_q-1) non empty for (int sigma = 0; (sigma < this->_H_col.at(q-1).dimensions().first && !found); ++sigma) { - typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { // and proj_S(cod(sigma)) non empty @@ -681,7 +681,7 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in // cout << "secondary" << endl ; const int sigma(tau) ; // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty - typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; if (H11q1.isNull() || projS_cod_sigma.isNull()) @@ -692,7 +692,7 @@ PairCell Hdvf::find_pair_MW(int q, bool &found, in { const int pi(*it_pi) ; - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col.at(q), pi)) ; typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; // proj_P of d(pi) must also be non empty @@ -729,12 +729,12 @@ std::vector Hdvf::find_pairs_MW(int q, b for (OSM::Bitboard::iterator it_pi = this->_H_col[q].begin(); it_pi != this->_H_col[q].end(); ++it_pi) { const int pi = *it_pi ; - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col.at(q), pi)) ; typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; for (int sigma = 0; sigma < this->_H_col.at(q-1).dimensions().first; ++sigma) { - typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; @@ -777,7 +777,7 @@ std::vector Hdvf::find_pairs_MW(int q, b { const int pi(tau) ; // Col pi of H_q and proj_P(d(pi)) must at least be non empty - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col.at(q), pi)) ; typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; @@ -787,7 +787,7 @@ std::vector Hdvf::find_pairs_MW(int q, b // Search for sigma with col_sigma(H_q-1) non empty for (int sigma = 0; sigma < this->_H_col.at(q-1).dimensions().first; ++sigma) { - typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; if (!H11q1.isNull()) { // and proj_S(cod(sigma)) non empty @@ -816,7 +816,7 @@ std::vector Hdvf::find_pairs_MW(int q, b // cout << "secondary" << endl ; const int sigma(tau) ; // Row sigma of H_q-1 and proj_S(cod(sigma)) must at least be non empty - typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; typename HDVF_coreT::RChain cod_sigma = this->_K.cod(sigma, q) ; typename HDVF_coreT::RChain projS_cod_sigma = this->projection(cod_sigma, SECONDARY, q+1) ; if (H11q1.isNull() || projS_cod_sigma.isNull()) @@ -827,7 +827,7 @@ std::vector Hdvf::find_pairs_MW(int q, b { const int pi(*it_pi) ; - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col.at(q), pi)) ; typename HDVF_coreT::CChain d_pi = this->_K.d(pi, q) ; typename HDVF_coreT::CChain projP_d_pi = this->projection(d_pi, PRIMARY, q-1) ; // proj_P of d(pi) must also be non empty @@ -866,8 +866,8 @@ void Hdvf::R(int pi, int sigma, int q) { std::cout << "R of " << pi << "(dim " << q << ") / " << sigma << "(dim " << q + 1 << ")" << std::endl; // Extract the relevant row and column chains from this->_H_col - typename HDVF_coreT::RChain H12 = OSM::getRow(this->_H_col[q], sigma); // H12 is the row chain from this->_H_col[q] at index sigma - typename HDVF_coreT::CChain H21 = OSM::getColumn(this->_H_col[q], pi); // H21 is the column chain from this->_H_col[q] at index pi + typename HDVF_coreT::RChain H12 = OSM::get_row(this->_H_col[q], sigma); // H12 is the row chain from this->_H_col[q] at index sigma + typename HDVF_coreT::CChain H21 = OSM::get_column(this->_H_col[q], pi); // H21 is the column chain from this->_H_col[q] at index pi // Get the coefficient at the intersection of H12 and H21 CoefficientType H11(H12[pi]); // H11 is the coefficient at row sigma and column pi @@ -881,24 +881,24 @@ void Hdvf::R(int pi, int sigma, int q) { H21 /= std::vector({sigma}); // Remove row sigma from H21 // Remove the corresponding row and column from this->_H_col - this->_H_col[q].delRow(sigma); // Remove row sigma from this->_H_col[q] - this->_H_col[q].delColumn(pi); // Remove column pi from this->_H_col[q] + this->_H_col[q].del_row(sigma); // Remove row sigma from this->_H_col[q] + this->_H_col[q].del_column(pi); // Remove column pi from this->_H_col[q] //---------------------------------------------- Submatrices of F ----------------------------------------------------- // Extract the relevant column chain from this->_F_row - typename HDVF_coreT::CChain F11 = OSM::getColumn(this->_F_row[q], pi); // F11 is the column chain from this->_F_row[q] at index pi + typename HDVF_coreT::CChain F11 = OSM::get_column(this->_F_row[q], pi); // F11 is the column chain from this->_F_row[q] at index pi // Remove the column pi from this->_F_row - this->_F_row[q].delColumn(pi); + this->_F_row[q].del_column(pi); //--------------------------------------------- Submatrices of G ------------------------------------------------------ // Extract the relevant row chain from this->_G_col - typename HDVF_coreT::RChain G11 = OSM::getRow(this->_G_col[q + 1], sigma); // G11 is the row chain from this->_G_col[q+1] at index sigma + typename HDVF_coreT::RChain G11 = OSM::get_row(this->_G_col[q + 1], sigma); // G11 is the row chain from this->_G_col[q+1] at index sigma // Remove the row sigma from this->_G_col - this->_G_col[q + 1].delRow(sigma); + this->_G_col[q + 1].del_row(sigma); //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -908,24 +908,24 @@ void Hdvf::R(int pi, int sigma, int q) { this->_F_row[q] -= (F11 % H12) * H11_inv; // Set the row pi of this->_F_row[q] to (H12 * (-H11_inv)) - OSM::setRow(this->_F_row[q], pi, H12 * (-H11_inv)); + OSM::set_row(this->_F_row[q], pi, H12 * (-H11_inv)); // Update this->_G_col[q + 1] // Subtract the product of (H21 * G11) and H11_inv from this->_G_col[q + 1] this->_G_col[q + 1] -= (H21 * G11) * H11_inv; // Set the column sigma of this->_G_col[q + 1] to (H21 * (-H11_inv)) - OSM::setColumn(this->_G_col[q + 1], sigma, H21 * (-H11_inv)); + OSM::set_column(this->_G_col[q + 1], sigma, H21 * (-H11_inv)); // Update this->_DD_col // Compute the temporary matrix product F11 * G11 this->_DD_col[q + 1] += (F11 * G11) * H11_inv; // Set the row pi in this->_DD_col[q + 1] to (G11 * H11_inv) - OSM::setRow(this->_DD_col[q + 1], pi, G11 * H11_inv); + OSM::set_row(this->_DD_col[q + 1], pi, G11 * H11_inv); // Set the column sigma in this->_DD_col[q + 1] to (F11 * H11_inv) - OSM::setColumn(this->_DD_col[q + 1], sigma, F11 * H11_inv); + OSM::set_column(this->_DD_col[q + 1], sigma, F11 * H11_inv); // Set the coefficient at (pi, sigma) in this->_DD_col to H11_inv this->_DD_col[q + 1].set_coef(pi, sigma, H11_inv); @@ -947,17 +947,17 @@ void Hdvf::R(int pi, int sigma, int q) { if (q > 0) { // Update this->_DD_col[q] with projections and this->_F_row[q-1] typename HDVF_coreT::CChain c1(this->_F_row[q - 1] * proj_P_pi + this->projection(bnd_pi, CRITICAL, q)); - OSM::setColumn(this->_DD_col[q], pi, c1); - OSM::setColumn(this->_G_col[q], pi, this->_H_col[q - 1] * proj_P_pi); + OSM::set_column(this->_DD_col[q], pi, c1); + OSM::set_column(this->_G_col[q], pi, this->_H_col[q - 1] * proj_P_pi); } // Update this->_F_row[q+1] with this->projection and this->_H_col[q+1] - OSM::setRow(this->_F_row[q + 1], sigma, proj_S_sigma * this->_H_col[q + 1]); + OSM::set_row(this->_F_row[q + 1], sigma, proj_S_sigma * this->_H_col[q + 1]); if (q + 2 <= this->_K.dim()) { // Update this->_DD_col[q+2] with projections typename HDVF_coreT::RChain c4(this->projection(cobnd_sigma, CRITICAL, q + 1) + proj_S_sigma * this->_G_col[q + 2]); - OSM::setRow(this->_DD_col[q + 2], sigma, c4); + OSM::set_row(this->_DD_col[q + 2], sigma, c4); } // Update flags @@ -988,8 +988,8 @@ void Hdvf::M(int pi, int gamma, int q) { throw("M operation in max dimension !!!") ; // Extract row and column chains from this->_F_row - typename HDVF_coreT::RChain F12(OSM::getRow(this->_F_row[q], gamma)); // F12 is the row chain from this->_F_row[q] at index gamma - typename HDVF_coreT::CChain F21(OSM::getColumn(this->_F_row[q], pi)); // F21 is the column chain from this->_F_row[q] at index pi + typename HDVF_coreT::RChain F12(OSM::get_row(this->_F_row[q], gamma)); // F12 is the row chain from this->_F_row[q] at index gamma + typename HDVF_coreT::CChain F21(OSM::get_column(this->_F_row[q], pi)); // F21 is the column chain from this->_F_row[q] at index pi // Get the coefficient at the intersection of F12 and F21 CoefficientType F11(F12[pi]); // F11 is the coefficient at row gamma and column pi @@ -1003,23 +1003,23 @@ void Hdvf::M(int pi, int gamma, int q) { F21 /= std::vector({gamma}); // Remove row gamma from F21 // Remove the corresponding row and column from this->_F_row - this->_F_row[q].delRow(gamma); // Remove row gamma from this->_F_row[q] - this->_F_row[q].delColumn(pi); // Remove column pi from this->_F_row[q] + this->_F_row[q].del_row(gamma); // Remove row gamma from this->_F_row[q] + this->_F_row[q].del_column(pi); // Remove column pi from this->_F_row[q] //--------------------------------------------- Submatrices of G ------------------------------------------------------ // Extract the relevant column chain from this->_G_col // G11_q is the column chain from this->_G_col[q] at index gamma - // HDVF_coreT::CChain G11_q(OSM::getColumn(this->_G_col[q], gamma)); - this->_G_col[q].delColumn(gamma); // Remove column gamma from this->_G_col[q] + // HDVF_coreT::CChain G11_q(OSM::get_column(this->_G_col[q], gamma)); + this->_G_col[q].del_column(gamma); // Remove column gamma from this->_G_col[q] //---------------------------------------------- Submatrices of H ----------------------------------------------------- // Extract the relevant column chain from this->_H_col - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col[q], pi)); // H11 is the column chain from this->_H_col[q] at index pi + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col[q], pi)); // H11 is the column chain from this->_H_col[q] at index pi // Remove the column pi from this->_H_col - this->_H_col[q].delColumn(pi); + this->_H_col[q].del_column(pi); //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ @@ -1027,16 +1027,16 @@ void Hdvf::M(int pi, int gamma, int q) { // Extract the relevant row chains from this->_DD_col // DD_q+1 (corresponds to the row matrix of this->_DD_col) - typename HDVF_coreT::RChain D11(OSM::getRow(this->_DD_col[q+1], gamma)); // D11 is the row chain from this->_DD_col[q+1] at index gamma - this->_DD_col[q + 1].delRow(gamma); // Remove row gamma from this->_DD_col[q + 1] + typename HDVF_coreT::RChain D11(OSM::get_row(this->_DD_col[q+1], gamma)); // D11 is the row chain from this->_DD_col[q+1] at index gamma + this->_DD_col[q + 1].del_row(gamma); // Remove row gamma from this->_DD_col[q + 1] //--------------------------------------------- Submatrices of DD ------------------------------------------------------ // DD_q (corresponds to the column matrix of this->_DD_col) - // HDVF_coreT::CChain D11_q(OSM::getColumn(this->_DD_col[q], gamma)); + // HDVF_coreT::CChain D11_q(OSM::get_column(this->_DD_col[q], gamma)); // D11_q is the column chain from this->_DD_col[q] at index gamma if (q > 0) - this->_DD_col[q].delColumn(gamma); // Remove column gamma from this->_DD_col[q] + this->_DD_col[q].del_column(gamma); // Remove column gamma from this->_DD_col[q] //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -1046,17 +1046,17 @@ void Hdvf::M(int pi, int gamma, int q) { this->_H_col[q] -= (H11 * F11_inv) * F12; // Set the column gamma of this->_H_col[q] to (-1 * H11) * F11_inv - OSM::setColumn(this->_H_col[q], gamma, (-1 * H11) * (F11_inv)); + OSM::set_column(this->_H_col[q], gamma, (-1 * H11) * (F11_inv)); // Update this->_F_row // Add the product of (F21 * F11_inv) and F12 to this->_F_row[q] this->_F_row[q] -= (F21 * F11_inv) * F12; // Set the row pi of this->_F_row[q] to F11_inv * F12 - OSM::setRow(this->_F_row[q], pi, F11_inv * F12); + OSM::set_row(this->_F_row[q], pi, F11_inv * F12); // Set the column gamma of this->_F_row[q] to F21 * (-F11_inv) - OSM::setColumn(this->_F_row[q], gamma, F21 * (-F11_inv)); + OSM::set_column(this->_F_row[q], gamma, F21 * (-F11_inv)); // Set the coefficient at (pi, gamma) in this->_F_row[q] to F11_inv this->_F_row[q].set_coef(pi, gamma, F11_inv); @@ -1067,7 +1067,7 @@ void Hdvf::M(int pi, int gamma, int q) { // Update this->_DD_col[q + 1] this->_DD_col[q + 1] -= (F21 * F11_inv) * D11; // Subtract the product from this->_DD_col[q + 1] - OSM::setRow(this->_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in this->_DD_col[q + 1] + OSM::set_row(this->_DD_col[q + 1], pi, D11 * F11_inv); // Set the row pi in this->_DD_col[q + 1] // Update this->_G_col (for dimension q) and this->_DD_col (for dimension q) if (q>0) @@ -1078,13 +1078,13 @@ void Hdvf::M(int pi, int gamma, int q) { typename HDVF_coreT::CChain projection_c = this->projection(c, CRITICAL, q-1); // Project boundary chain to CRITICAL // Set the column pi of this->_G_col[q] to (-1 * this->_H_col[q-1]) * projection_p - OSM::setColumn(this->_G_col[q], pi, (CoefficientType(-1) * this->_H_col[q - 1]) * projection_p); + OSM::set_column(this->_G_col[q], pi, (CoefficientType(-1) * this->_H_col[q - 1]) * projection_p); // Update this->_DD_col // Extract projections and perform updates typename HDVF_coreT::CChain tmp(this->_F_row[q - 1] * projection_p + projection_c); // Compute the product of this->_F_row[q - 1] and projection_p // Set the column pi of this->_DD_col[q] to cc - OSM::setColumn(this->_DD_col[q], pi, tmp); + OSM::set_column(this->_DD_col[q], pi, tmp); } // else: if the dimension is 0, no change for this->_G_col[q] and this->_DD_col[q] @@ -1112,8 +1112,8 @@ void Hdvf::W(int sigma, int gamma, int q) { throw("W operation in dimension 0 !!!") ; // Extract row and column chains from this->_G_col - typename HDVF_coreT::RChain G12(OSM::getRow(this->_G_col[q], sigma)); // G12 is the row chain from this->_G_col[q] at index sigma - typename HDVF_coreT::CChain G21(OSM::getColumn(this->_G_col[q], gamma)); // G21 is the column chain from this->_G_col[q] at index gamma + typename HDVF_coreT::RChain G12(OSM::get_row(this->_G_col[q], sigma)); // G12 is the row chain from this->_G_col[q] at index sigma + typename HDVF_coreT::CChain G21(OSM::get_column(this->_G_col[q], gamma)); // G21 is the column chain from this->_G_col[q] at index gamma // Get the coefficient at the intersection of G12 and G21 CoefficientType G11(G12[gamma]); // G11 is the coefficient at row sigma and column gamma @@ -1127,41 +1127,41 @@ void Hdvf::W(int sigma, int gamma, int q) { G21 /= std::vector({sigma}); // Remove row sigma from G21 // Remove the corresponding row and column from this->_G_col - this->_G_col[q].delRow(sigma); // Remove row sigma from this->_G_col[q] - this->_G_col[q].delColumn(gamma); // Remove column gamma from this->_G_col[q] + this->_G_col[q].del_row(sigma); // Remove row sigma from this->_G_col[q] + this->_G_col[q].del_column(gamma); // Remove column gamma from this->_G_col[q] //---------------------------------------------- Submatrices of F ----------------------------------------------------- // Extract the row chain from this->_F_row - // RChain F11(OSM::getRow(this->_F_row[q], gamma)); // F11 is the row chain from this->_F_row[q] at index gamma + // RChain F11(OSM::get_row(this->_F_row[q], gamma)); // F11 is the row chain from this->_F_row[q] at index gamma // Remove the row gamma from this->_F_row - this->_F_row[q].delRow(gamma); + this->_F_row[q].del_row(gamma); //--------------------------------------------- Submatrices of H ------------------------------------------------------ // Extract the row chain from this->_H_col - typename HDVF_coreT::RChain H11(OSM::getRow(this->_H_col[q-1], sigma)); // H11 is the row chain from this->_H_col[q] at index sigma + typename HDVF_coreT::RChain H11(OSM::get_row(this->_H_col[q-1], sigma)); // H11 is the row chain from this->_H_col[q] at index sigma // Remove the row sigma from this->_H_col - this->_H_col[q-1].delRow(sigma); + this->_H_col[q-1].del_row(sigma); //--------------------------------------------- Submatrices of DD_q+1 ------------------------------------------------------ // Extract the row chain from this->_DD_col[q+1] - // RChain D11_q_plus1(OSM::getRow(this->_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from this->_DD_col[q + 1] at index gamma + // RChain D11_q_plus1(OSM::get_row(this->_DD_col[q+1], gamma)); // D11_q_plus1 is the row chain from this->_DD_col[q + 1] at index gamma // Remove the row gamma from this->_DD_col if (q < this->_K.dim()) - this->_DD_col[q + 1].delRow(gamma); + this->_DD_col[q + 1].del_row(gamma); //--------------------------------------------- Submatrices of DD_q ------------------------------------------------------ // Extract the column chain from this->_DD_col[q] - typename HDVF_coreT::CChain D11_q(OSM::getColumn(this->_DD_col[q], gamma)); // D11_q is the column chain from this->_DD_col[q] at index gamma + typename HDVF_coreT::CChain D11_q(OSM::get_column(this->_DD_col[q], gamma)); // D11_q is the column chain from this->_DD_col[q] at index gamma // Remove the column gamma from this->_DD_col - this->_DD_col[q].delColumn(gamma); + this->_DD_col[q].del_column(gamma); //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -1171,17 +1171,17 @@ void Hdvf::W(int sigma, int gamma, int q) { this->_H_col[q-1] -= (G21 * G11_inv) * H11; // Set the row gamma of this->_H_col[q] to (-1 * H11) * G11_inv - OSM::setRow(this->_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); + OSM::set_row(this->_H_col[q-1], gamma, (-1 * H11) * (G11_inv)); // Update this->_G_col // Subtract the product of G11_inv and (G21 * G12) from this->_G_col[q] this->_G_col[q] -= (G21 * G11_inv) * G12; // Set the row gamma of this->_G_col[q] to G11_inv * G12 - OSM::setRow(this->_G_col[q], gamma, -G11_inv * G12); + OSM::set_row(this->_G_col[q], gamma, -G11_inv * G12); // Set the column sigma of this->_G_col[q] to G11_inv * G21 - OSM::setColumn(this->_G_col[q], sigma, G21 * G11_inv); + OSM::set_column(this->_G_col[q], sigma, G21 * G11_inv); // Set the coefficient at (gamma, sigma) in this->_G_col[q] to G11_inv this->_G_col[q].set_coef(gamma, sigma, G11_inv); @@ -1192,7 +1192,7 @@ void Hdvf::W(int sigma, int gamma, int q) { // Update this->_DD_col (for dimension q) this->_DD_col[q] -= (D11_q * G11_inv) * G12;// Subtract the product of (D11_q * G11_inv) and G12 - OSM::setColumn(this->_DD_col[q], sigma, D11_q * G11_inv) ; + OSM::set_column(this->_DD_col[q], sigma, D11_q * G11_inv) ; // Update this->_F_row (for dimension q) and this->_DD_col (for dimension q+1) if (q < this->_K.dim()) @@ -1203,12 +1203,12 @@ void Hdvf::W(int sigma, int gamma, int q) { typename HDVF_coreT::RChain projection_c(this->projection(c, CRITICAL, q+1)); // Project boundary chain to SECONDARY // Set the row sigma of this->_F_row[q] to (-1 * projection_s * this->_H_col[q]) - OSM::setRow(this->_F_row[q], sigma, (-1 * projection_s) * this->_H_col[q]); + OSM::set_row(this->_F_row[q], sigma, (-1 * projection_s) * this->_H_col[q]); // Set the row sigma of this->_DD_col[q + 1] to projection_s * this->_G_col[q + 1] + projection_c typename HDVF_coreT::RChain tmp(projection_s * this->_G_col[q + 1] + projection_c) ; - OSM::setRow(this->_DD_col[q + 1], sigma, tmp); + OSM::set_row(this->_DD_col[q + 1], sigma, tmp); } // else : if the dimension is maximal, no update of this->_DD_col[q+1] and this->_F_row[q] @@ -1241,15 +1241,15 @@ void Hdvf::MW(int pi, int sigma, int q) { // H_q extractions - typename HDVF_coreT::CChain H11(OSM::getColumn(this->_H_col.at(q), pi)) ; + typename HDVF_coreT::CChain H11(OSM::get_column(this->_H_col.at(q), pi)) ; // H21 -> delete H11 this->_H_col.at(q) /= std::vector({pi}) ; // H_q-1 extractions - typename HDVF_coreT::RChain H11q1(OSM::getRow(this->_H_col.at(q-1), sigma)) ; + typename HDVF_coreT::RChain H11q1(OSM::get_row(this->_H_col.at(q-1), sigma)) ; // H21_q-1 -> delete H11q1 - this->_H_col.at(q-1).delRow(sigma) ; + this->_H_col.at(q-1).del_row(sigma) ; // d(pi) @@ -1275,15 +1275,15 @@ void Hdvf::MW(int pi, int sigma, int q) { // F_q extraction - typename HDVF_coreT::CChain F11(OSM::getColumn(this->_F_row.at(q), pi)) ; + typename HDVF_coreT::CChain F11(OSM::get_column(this->_F_row.at(q), pi)) ; // F12 -> delete col F11 - this->_F_row.at(q).delColumn(pi) ; + this->_F_row.at(q).del_column(pi) ; // G_q extractions - typename HDVF_coreT::RChain G11(OSM::getRow(this->_G_col.at(q), sigma)) ; + typename HDVF_coreT::RChain G11(OSM::get_row(this->_G_col.at(q), sigma)) ; // G21 -> dele row G11 - this->_G_col.at(q).delRow(sigma) ; + this->_G_col.at(q).del_row(sigma) ; // ----------- Update of the reduction @@ -1292,12 +1292,12 @@ void Hdvf::MW(int pi, int sigma, int q) { typename HDVF_coreT::RChain tmp1 = projS_cod_sigma * this->_H_col.at(q) ; this->_H_col.at(q) -= (H11 * xi) * tmp1 ; - OSM::setColumn(this->_H_col.at(q), sigma, H11 * xi) ; + OSM::set_column(this->_H_col.at(q), sigma, H11 * xi) ; // F_q this->_F_row.at(q) += (F11 * xi) * tmp1 ; - OSM::setColumn(this->_F_row.at(q), sigma, F11 * (-xi)) ; + OSM::set_column(this->_F_row.at(q), sigma, F11 * (-xi)) ; // G_q+1 // note: G_q+1 is not be modified if the Hdvf is perfect @@ -1314,12 +1314,12 @@ void Hdvf::MW(int pi, int sigma, int q) { typename HDVF_coreT::CChain tmp3(this->_H_col.at(q-1) * projP_d_pi) ; this->_H_col.at(q-1) -= (tmp3 * xip) * H11q1 ; - OSM::setRow(this->_H_col.at(q-1), pi, xip * H11q1) ; + OSM::set_row(this->_H_col.at(q-1), pi, xip * H11q1) ; // G_q this->_G_col.at(q) -= (tmp3 * xip) * G11 ; - OSM::setRow(this->_G_col.at(q), pi, xip * G11) ; + OSM::set_row(this->_G_col.at(q), pi, xip * G11) ; // F_q-1 // note: F_q-1 is not be modified if the Hdvf is perfect diff --git a/HDVF/include/CGAL/HDVF/Hdvf_core.h b/HDVF/include/CGAL/HDVF/Hdvf_core.h index b558f20af271..663d86709bd1 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_core.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_core.h @@ -17,7 +17,7 @@ #include #include #include "CGAL/OSM/OSM.hpp" -#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/OSM/Bitboard.h" namespace CGAL { namespace HDVF { @@ -77,11 +77,11 @@ inline std::ostream& operator<<(std::ostream &out, const std::vector& \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. \tparam ComplexType a model of the `AbstractChainComplex` concept, providing the type of abstract chain complex used. \tparam ChainType a model of the `SparseChain` concept (by default, `OSM::Chain`), providing the type of sparse chains used (should be coherent with `SparseMatrixType`). - \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::SparseMatrix`), providing the type of sparse matrices used. + \tparam SparseMatrixType a model of the `SparseMatrix` concept (by default, `OSM::Sparse_matrix`), providing the type of sparse matrices used. */ -template typename ChainType = OSM::Chain, template typename SparseMatrixType = OSM::SparseMatrix> +template typename ChainType = OSM::Chain, template typename SparseMatrixType = OSM::Sparse_matrix> class Hdvf_core { public: /*! @@ -354,7 +354,7 @@ class Hdvf_core { throw "Error : export_homology_chain with dim out of range" ; if (_hdvf_opt & (OPT_FULL | OPT_G)) { - CChain g_cell(OSM::getColumn(_G_col.at(q), cell)) ; + CChain g_cell(OSM::get_column(_G_col.at(q), cell)) ; // Add 1 to the cell g_cell[cell] = 1 ; return g_cell ; @@ -376,7 +376,7 @@ class Hdvf_core { throw "Error : export_homology_chain with dim out of range" ; if (_hdvf_opt & (OPT_FULL | OPT_F)) { - RChain fstar_cell(OSM::getRow(_F_row.at(dim), cell)) ; + RChain fstar_cell(OSM::get_row(_F_row.at(dim), cell)) ; // Add 1 to the cell fstar_cell[cell] = 1 ; // Compute the cofaces @@ -564,7 +564,7 @@ PairCell Hdvf_core::f // Iterate through columns of _DD_col[q+1] for (OSM::Bitboard::iterator it_col = _DD_col[q+1].begin(); (it_col != _DD_col[q+1].end() && !found); ++it_col) { - const CChain& col(OSM::cgetColumn(_DD_col[q+1], *it_col)) ; + const CChain& col(OSM::cget_column(_DD_col[q+1], *it_col)) ; // Iterate through the entries of the column for (typename CChain::const_iterator it = col.begin(); (it != col.end() && !found); ++it) { @@ -588,7 +588,7 @@ PairCell Hdvf_core::f PairCell p ; // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible - const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), gamma)) ; + const CChain& tmp2(OSM::cget_column(_DD_col.at(q), gamma)) ; for (typename CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) { if (abs(it->second) == 1) @@ -601,7 +601,7 @@ PairCell Hdvf_core::f } // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible - RChain tmp(OSM::getRow(_DD_col.at(q+1), gamma)) ; + RChain tmp(OSM::get_row(_DD_col.at(q+1), gamma)) ; for (typename RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) { if (abs(it->second) == 1) @@ -625,7 +625,7 @@ std::vector Hdvf_core_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) { - const CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + const CChain& col(OSM::cget_column(this->_DD_col[q+1], *it_col)) ; // Iterate through the entries of the column for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { @@ -651,7 +651,7 @@ std::vector Hdvf_core pairs; // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible - RChain tmp(OSM::getRow(_DD_col.at(q+1), gamma)) ; + RChain tmp(OSM::get_row(_DD_col.at(q+1), gamma)) ; for (typename RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { if (abs(it->second) == 1) @@ -665,7 +665,7 @@ std::vector Hdvf_core invertible - const CChain& tmp2(OSM::cgetColumn(_DD_col.at(q), gamma)) ; + const CChain& tmp2(OSM::cget_column(_DD_col.at(q), gamma)) ; for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) { if (abs(it->second) == 1) @@ -694,8 +694,8 @@ void Hdvf_core::A(int // cout << "A of " << tau1 << "(dim " << q << ") / " << tau2 << "(dim " << q + 1 << ")" << endl; // Extract submatrices from _DD_col - RChain D12(OSM::getRow(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 - CChain D21(OSM::getColumn(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 + RChain D12(OSM::get_row(_DD_col.at(q+1),tau1)); // D12 is a row chain from _DD_col[q+1] at index tau1 + CChain D21(OSM::get_column(_DD_col.at(q + 1),tau2)); // D21 is a column chain from _DD_col[q+1] at index tau2 CoefficientType D11(D12[tau2]); // D11 is the coefficient at the intersection of tau2 in D12 // Assert that D11 is either 1 or -1 (check invertibility) @@ -709,8 +709,8 @@ void Hdvf_core::A(int D21 /= std::vector({tau1}); // Remove tau1 row from D21 // Delete rows and columns from _DD_col - _DD_col[q + 1].delRow(tau1); // Remove row tau1 from _DD_col[q+1] - _DD_col[q + 1].delColumn(tau2); // Remove column tau2 from _DD_col[q+1] + _DD_col[q + 1].del_row(tau1); // Remove row tau1 from _DD_col[q+1] + _DD_col[q + 1].del_column(tau2); // Remove column tau2 from _DD_col[q+1] //---------------------------------------------- Submatrices of F ----------------------------------------------------- @@ -719,10 +719,10 @@ void Hdvf_core::A(int if (_hdvf_opt & (OPT_FULL | OPT_F)) { // Extract the relevant submatrix from _F_row - F11 = OSM::getRow(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 + F11 = OSM::get_row(_F_row.at(q),tau1); // F11 is a row chain from _F_row[q] at index tau1 // Delete the row tau1 from _F_row - _F_row[q].delRow(tau1); + _F_row[q].del_row(tau1); } //--------------------------------------------- Submatrices of G ------------------------------------------------------ @@ -730,10 +730,10 @@ void Hdvf_core::A(int if (_hdvf_opt & (OPT_FULL | OPT_G)) { // Extract the relevant submatrix from _G_col - G11 = OSM::getColumn(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 + G11 = OSM::get_column(_G_col.at(q + 1),tau2); // G11 is a column chain from _G_col[q+1] at index tau2 // Delete the column tau2 from _G_col - _G_col[q + 1].delColumn(tau2); + _G_col[q + 1].del_column(tau2); } //--------------------------------------------- Update matrices ------------------------------------------------------- @@ -748,10 +748,10 @@ void Hdvf_core::A(int _F_row[q] -= (D21 * D11_inv) % F11; // Set the column tau1 of _F_row[q] to (D21 * (-D11_inv)) - OSM::setColumn(_F_row[q], tau1, D21 * (-D11_inv)); + OSM::set_column(_F_row[q], tau1, D21 * (-D11_inv)); // Remove the row tau2 from _F_row[q+1] - _F_row[q + 1].delRow(tau2); + _F_row[q + 1].del_row(tau2); } // ---- Update _G_col @@ -763,10 +763,10 @@ void Hdvf_core::A(int _G_col[q + 1] -= (G11 * D11_inv) * D12; // Set the row tau2 of _G_col[q + 1] to (D12 * (-D11_inv)) - OSM::setRow(_G_col[q + 1], tau2, D12 * (-D11_inv)); + OSM::set_row(_G_col[q + 1], tau2, D12 * (-D11_inv)); // Remove the column tau1 from _G_col[q] - _G_col[q].delColumn(tau1); + _G_col[q].del_column(tau1); } // ---- Update _H_col @@ -781,10 +781,10 @@ void Hdvf_core::A(int _H_col[q] += (tmp) * D11_inv; // Set the row tau2 of _H_col[q] to (F11 * D11_inv) - OSM::setRow(_H_col[q], tau2, F11 * D11_inv); + OSM::set_row(_H_col[q], tau2, F11 * D11_inv); // Set the column tau1 of _H_col[q] to (G11 * D11_inv) - OSM::setColumn(_H_col[q], tau1, G11 * D11_inv); + OSM::set_column(_H_col[q], tau1, G11 * D11_inv); // Set the coefficient at (tau2, tau1) in _H_col[q] to D11_inv _H_col[q].set_coef(tau2, tau1, D11_inv); @@ -797,10 +797,10 @@ void Hdvf_core::A(int // Remove columns and rows from _DD_col as necessary if (q > 0) { - _DD_col[q].delColumn(tau1); // Remove column tau1 from _DD_col[q] + _DD_col[q].del_column(tau1); // Remove column tau1 from _DD_col[q] } if (q + 2 <= _K.dim()) { - _DD_col[q + 2].delRow(tau2); // Remove row tau2 from _DD_col[q+2] + _DD_col[q + 2].del_row(tau2); // Remove row tau2 from _DD_col[q+2] } // Update flags @@ -976,7 +976,7 @@ std::ostream& Hdvf_coresecond << ".(" << it_col->first << ") + "; } @@ -996,7 +996,7 @@ std::ostream& Hdvf_coresecond << ".(" << it_row->first << ") + "; } diff --git a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h index 04326363e0ad..80b0f259076a 100644 --- a/HDVF/include/CGAL/HDVF/Hdvf_persistence.h +++ b/HDVF/include/CGAL/HDVF/Hdvf_persistence.h @@ -410,7 +410,7 @@ class Hdvf_persistence : public Hdvf_core_hdvf_opt & (OPT_FULL | OPT_G)) { // Get g(cell, dim) with per indices - CChain g_cell(OSM::getColumn(this->_G_col.at(q), cell)) ; + CChain g_cell(OSM::get_column(this->_G_col.at(q), cell)) ; // Add 1 to the cell g_cell[cell] = 1 ; // Compute the chain with _K indices @@ -443,7 +443,7 @@ class Hdvf_persistence : public Hdvf_core_hdvf_opt & (OPT_FULL | OPT_F)) { // Get fstar(cell, dim) with per indices - RChain fstar_cell(OSM::getRow(this->_F_row.at(q), cell)) ; + RChain fstar_cell(OSM::get_row(this->_F_row.at(q), cell)) ; // Add 1 to the cell fstar_cell[cell] = 1 ; // Compute the cofaces of the chain with _K indices @@ -709,7 +709,7 @@ Hdvf_persistence::Hdvf_pe for (OSM::Bitboard::iterator it_col = this->_DD_col.at(q).begin(); it_col != this->_DD_col.at(q).end(); ++it_col) { const int j(*it_col) ; - const CChain& col(OSM::cgetColumn(this->_DD_col.at(q), j)) ; + const CChain& col(OSM::cget_column(this->_DD_col.at(q), j)) ; for (typename CChain::const_iterator it = col.begin(); it != col.end(); ++it) { const int i(it->first) ; @@ -741,7 +741,7 @@ PairCell Hdvf_persistence if (q >= 1) { // Compute bounded max while iterating over the Chain - const CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), sigma)) ; + const CChain& tmp2(OSM::cget_column(this->_DD_col.at(q), sigma)) ; std::size_t tmax = _t_dim.at(q-1) ; std::size_t i ; for (typename CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) diff --git a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp index 8b8232c97ab1..34d5bebb7be2 100644 --- a/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp +++ b/HDVF/include/CGAL/HDVF/SimpComplexTools.hpp @@ -31,7 +31,7 @@ namespace HDVF { /** \brief vtk export for SimpComplex */ -template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::SparseMatrix, typename VertexIdType = int> +template typename _ChainType = OSM::Chain, template typename _SparseMatrixType = OSM::Sparse_matrix, typename VertexIdType = int> void Simp_output_vtk (Hdvf_core, _ChainType, _SparseMatrixType> &hdvf, Simplicial_chain_complex &complex, string filename = "test") { typedef Simplicial_chain_complex ComplexType; diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp index 4059582136ec..ce48936756ba 100644 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -13,7 +13,7 @@ #include "CGAL/OSM/Sparse_matrix.h" -#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/OSM/Bitboard.h" namespace CGAL { namespace OSM { @@ -32,7 +32,7 @@ namespace OSM { * \date 02/10/2024 */ template -class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { +class SubSparseMatrix : public Sparse_matrix<_CoefficientType, _ChainTypeFlag> { protected: /** \brief A bitboard describing subchains restriction. */ @@ -43,12 +43,12 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { public: /** \brief Constructor with sizes and Bitboard describing subchains. */ - SubSparseMatrix(const int _rowCount, const int _columnCount, const Bitboard& subChain) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->chainsStates & subChain) + SubSparseMatrix(const int _rowCount, const int _columnCount, const Bitboard& subChain) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->chainsStates & subChain) { } /** \brief Constructor with sizes (Bitboard describing subchains set to full Bitboard). */ - SubSparseMatrix(const int _rowCount=0, const int _columnCount=0) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount) + SubSparseMatrix(const int _rowCount=0, const int _columnCount=0) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount) { if (_ChainTypeFlag == OSM::COLUMN) _subChains = OSM::Bitboard(_columnCount,false) ; @@ -58,10 +58,10 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { } /** \brief Copy constructor. */ - SubSparseMatrix(const SubSparseMatrix& otherToCopy) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(otherToCopy), _subChains(otherToCopy._subChains), _subChainsStates(otherToCopy._subChainsStates) {} + SubSparseMatrix(const SubSparseMatrix& otherToCopy) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(otherToCopy), _subChains(otherToCopy._subChains), _subChainsStates(otherToCopy._subChainsStates) {} - /** \brief Copy constructor from SparseMatrix. */ - SubSparseMatrix(const SparseMatrix<_CoefficientType,_ChainTypeFlag>& otherToCopy) : SparseMatrix<_CoefficientType, _ChainTypeFlag>(otherToCopy) + /** \brief Copy constructor from Sparse_matrix. */ + SubSparseMatrix(const Sparse_matrix<_CoefficientType,_ChainTypeFlag>& otherToCopy) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(otherToCopy) { if (_ChainTypeFlag == OSM::COLUMN) _subChains = OSM::Bitboard(otherToCopy.dimensions().second,false) ; @@ -111,7 +111,7 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { /** \brief Operator=. */ inline SubSparseMatrix& operator=(const SubSparseMatrix &other) { - (dynamic_cast&>(*this)).operator=(other) ; + (dynamic_cast&>(*this)).operator=(other) ; _subChains = other._subChains ; _subChainsStates = other._subChainsStates ; return *this ; @@ -119,7 +119,7 @@ class SubSparseMatrix : public SparseMatrix<_CoefficientType, _ChainTypeFlag> { /** \brief Operator<<. */ friend std::ostream& operator<<(std::ostream &_stream, const SubSparseMatrix &_matrix) { - _stream << static_cast&>(_matrix) ; + _stream << static_cast&>(_matrix) ; _stream << _matrix._subChains << std::endl ; return _stream ; } diff --git a/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h index e862d02258d3..c3c20cdd1ae9 100644 --- a/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h +++ b/HDVF/include/CGAL/HDVF/Sub_chain_complex_mask.h @@ -17,7 +17,7 @@ #include #include #include "CGAL/OSM/OSM.hpp" -#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/OSM/Bitboard.h" #include "CGAL/HDVF/SubSparseMatrix.hpp" namespace CGAL { diff --git a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp index b1476db790ce..591bb5625596 100644 --- a/HDVF/include/CGAL/HDVF/hdvf_duality.hpp +++ b/HDVF/include/CGAL/HDVF/hdvf_duality.hpp @@ -12,7 +12,7 @@ #include #include #include "CGAL/OSM/OSM.hpp" -#include "CGAL/OSM/Bitboard.hpp" +#include "CGAL/OSM/Bitboard.h" #include "CGAL/HDVF/Hdvf_core.h" #include "CGAL/HDVF/Sub_chain_complex_mask.h" #include "CGAL/HDVF/SubSparseMatrix.hpp" @@ -167,7 +167,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { out << "g(" << i << ") = (" << i << ")"; // Iterate over the ith column of _G_col - typename HDVF_type::CChain col(OSM::getColumn(this->_G_col.at(q), i)) ; // TODO cget + typename HDVF_type::CChain col(OSM::get_column(this->_G_col.at(q), i)) ; // TODO cget for (typename HDVF_type::CChain::const_iterator it_col = col.cbegin(); it_col != col.cend(); ++it_col) { out << " + " << it_col->second << ".(" << it_col->first << ") + "; } @@ -187,7 +187,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain if ((this->_flag[q][i] == CRITICAL) && (_subCC.get_Bit(q, i))) { out << "f*(" << i << ") = (" << i << ")"; // Iterate over the ith row of _F_row - typename HDVF_type::RChain row(OSM::getRow(this->_F_row.at(q), i)) ; // TODO cget + typename HDVF_type::RChain row(OSM::get_row(this->_F_row.at(q), i)) ; // TODO cget for (typename HDVF_type::RChain::const_iterator it_row = row.cbegin(); it_row != row.cend(); ++it_row) { out << " + " << it_row->second << ".(" << it_row->first << ") + "; } @@ -276,7 +276,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain if (this->_hdvf_opt & (OPT_FULL | OPT_G)) { // Get g(cell, dim) with per indices - CChain g_cell(OSM::getColumn(this->_G_col.at(dim), cell)) ; + CChain g_cell(OSM::get_column(this->_G_col.at(dim), cell)) ; // Add 1 to the cell g_cell[cell] = 1 ; // Keep cells of the chain belonging to _subCC @@ -306,7 +306,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain if (this->_hdvf_opt & (OPT_FULL | OPT_F)) { - RChain fstar_cell(OSM::getRow(this->_F_row.at(dim), cell)) ; + RChain fstar_cell(OSM::get_row(this->_F_row.at(dim), cell)) ; // Add 1 to the cell fstar_cell[cell] = 1 ; // Compute the cofaces @@ -331,7 +331,7 @@ class Hdvf_duality : public Hdvf_core<_CoefficientType, _ComplexType, OSM::Chain } // // Get fstar(cell, dim) with per indices - // RChain fstar_cell(OSM::cgetRow(this->_F_row.at(dim), cell)) ; + // RChain fstar_cell(OSM::cget_row(this->_F_row.at(dim), cell)) ; // // Add 1 to the cell // fstar_cell[cell] = 1 ; // // Keep cells of the chain belonging to _subCC @@ -366,7 +366,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &f // Iterate through columns of _DD_col[q+1] for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); (it_col != this->_DD_col[q+1].end() && !found); ++it_col) { - const typename HDVF_type::CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + const typename HDVF_type::CChain& col(OSM::cget_column(this->_DD_col[q+1], *it_col)) ; // Iterate through the entries of the column // Check that the row belongs to the subchaincomplex @@ -395,7 +395,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &f // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible // and tau' belongs to _subCC - const typename HDVF_type::CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), tau)) ; + const typename HDVF_type::CChain& tmp2(OSM::cget_column(this->_DD_col.at(q), tau)) ; for (typename HDVF_type::CChain::const_iterator it = tmp2.cbegin(); (it != tmp2.cend() && !found); ++it) { if (_subCC.get_Bit(q-1, it->first) && abs(it->second) == 1) @@ -409,7 +409,7 @@ PairCell Hdvf_duality<_CoefficientType,_ComplexType>::find_pair_A(int q, bool &f // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible // and tau' belongs to _subCC - typename HDVF_type::RChain tmp(OSM::getRow(this->_DD_col.at(q+1), tau)) ; + typename HDVF_type::RChain tmp(OSM::get_row(this->_DD_col.at(q+1), tau)) ; for (typename HDVF_type::RChain::const_iterator it = tmp.cbegin(); (it != tmp.cend() && !found); ++it) { if (_subCC.get_Bit(q+1, it->first) && (abs(it->second) == 1)) @@ -434,7 +434,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A( // Iterate through columns of _DD_col[q+1] for (OSM::Bitboard::iterator it_col = this->_DD_col[q+1].begin(); it_col != this->_DD_col[q+1].end(); ++it_col) { - const typename HDVF_type::CChain& col(OSM::cgetColumn(this->_DD_col[q+1], *it_col)) ; + const typename HDVF_type::CChain& col(OSM::cget_column(this->_DD_col[q+1], *it_col)) ; // Iterate through the entries of the column for (typename HDVF_type::CChain::const_iterator it = col.begin(); it != col.end(); ++it) { @@ -464,7 +464,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A( // Search for a q+1 cell tau' such that <_d(tau'),tau> invertible, ie <_cod(tau),tau'> invertible // and tau' belongs to _subCC - typename HDVF_type::RChain tmp(OSM::getRow(this->_DD_col.at(q+1), tau)) ; + typename HDVF_type::RChain tmp(OSM::get_row(this->_DD_col.at(q+1), tau)) ; for (typename HDVF_type::RChain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { if (_subCC.get_Bit(q+1, it->first) && (abs(it->second) == 1)) @@ -479,7 +479,7 @@ std::vector Hdvf_duality<_CoefficientType,_ComplexType>::find_pairs_A( } // Search for a q-1 cell tau' such that <_d(tau),tau'> invertible // and tau' belongs to _subCC - const typename HDVF_type::CChain& tmp2(OSM::cgetColumn(this->_DD_col.at(q), tau)) ; + const typename HDVF_type::CChain& tmp2(OSM::cget_column(this->_DD_col.at(q), tau)) ; for (typename HDVF_type::CChain::const_iterator it = tmp2.cbegin(); it != tmp2.cend(); ++it) { if (_subCC.get_Bit(q-1, it->first) && (abs(it->second) == 1)) diff --git a/HDVF/include/CGAL/OSM/Bitboard.hpp b/HDVF/include/CGAL/OSM/Bitboard.h similarity index 99% rename from HDVF/include/CGAL/OSM/Bitboard.hpp rename to HDVF/include/CGAL/OSM/Bitboard.h index 285667961126..187ad2e4d7f0 100644 --- a/HDVF/include/CGAL/OSM/Bitboard.hpp +++ b/HDVF/include/CGAL/OSM/Bitboard.h @@ -6,7 +6,7 @@ * \date 23/05/2024 * * Define everything for the Bitboard class. - * Bitboards are used with SparseMatrix to quickly find and set non empty columns. + * Bitboards are used with Sparse_matrix to quickly find and set non empty columns. */ #ifndef __OSM_BITBOARD_HPP__ @@ -61,7 +61,7 @@ namespace OSM { * \class Bitboard * \brief Bitboards are long bitset with specific operations. * - * Bitboards are used with SparseMatrix to quickly find and set non empty columns. + * Bitboards are used with Sparse_matrix to quickly find and set non empty columns. * * \author Fedyna K. * \version 0.2.0 diff --git a/HDVF/include/CGAL/OSM/Chain.h b/HDVF/include/CGAL/OSM/Chain.h index 76a49bbed667..ba914f78cd50 100644 --- a/HDVF/include/CGAL/OSM/Chain.h +++ b/HDVF/include/CGAL/OSM/Chain.h @@ -43,12 +43,12 @@ class Chain { typedef typename std::unordered_map::iterator iterator; typedef typename std::unordered_map::const_iterator const_iterator; - // Add these lines to allow the SparseMatrix class to access other templated + // Add these lines to allow the Sparse_matrix class to access other templated // SparsedMatrix private members. template friend class Chain; template - friend class SparseMatrix; + friend class Sparse_matrix; protected: /** \brief The chain inner representation and storage of data. */ std::unordered_map chainData; @@ -64,8 +64,8 @@ class Chain { public: /** - * \brief Create new Chain for SparseMatrix object. - * + * \brief Create new Chain for Sparse_matrix object. + * * Default constructor, initialize an empty Chain as a Z integers column chain. * The default chain size is 128. * @@ -86,8 +86,8 @@ class Chain { } /** - * \brief Create new Chain for SparseMatrix object. - * + * \brief Create new Chain for Sparse_matrix object. + * * Constructor with size, initialize an empty Chain as a Z integers column chain with boundary check. * * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) @@ -123,8 +123,8 @@ class Chain { size_t dimension() const { return upperBound ; } /** - * \brief Create new Chain for SparseMatrix object. - * + * \brief Create new Chain for Sparse_matrix object. + * * Copy constructor, initialize a Chain based on the same type of chain. * The resulting chain will be a copy of the passed chain. * @@ -327,7 +327,7 @@ class Chain { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + friend Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); /** * \brief Perform matrix multiplication between two chains. @@ -350,7 +350,7 @@ class Chain { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + friend Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); /** * \brief Perform dot product between two chains. @@ -844,11 +844,11 @@ class Chain { * \date 08/04/2024 */ template -SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - SparseMatrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); +Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + Sparse_matrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); for (std::pair pair : _row.chainData) { - OSM::setColumn(matrix,pair.first,_column * pair.second) ; + OSM::set_column(matrix,pair.first,_column * pair.second) ; } return matrix; @@ -875,11 +875,11 @@ SparseMatrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Cha * \date 08/04/2024 */ template -SparseMatrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - SparseMatrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); +Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { + Sparse_matrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); for (std::pair pair : _column.chainData) { - OSM::setRow(matrix,pair.first,_row * pair.second); + OSM::set_row(matrix,pair.first,_row * pair.second); } return matrix; diff --git a/HDVF/include/CGAL/OSM/Sparse_matrix.h b/HDVF/include/CGAL/OSM/Sparse_matrix.h index 67bd35d9c083..a10986577147 100644 --- a/HDVF/include/CGAL/OSM/Sparse_matrix.h +++ b/HDVF/include/CGAL/OSM/Sparse_matrix.h @@ -1,19 +1,21 @@ -/** - * \file SparseMatrix.hpp - * \brief Namespace file for describing library. - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - * - * Define everything for the SparseMatrix class - */ +// Copyright (c) 2025 LIS Marseille (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Alexandra Bac +// Kevin Fedyna -#ifndef __OSM_SPARSE_MATRIX__ -#define __OSM_SPARSE_MATRIX__ +#ifndef CGAL_OSM_SPARSE_MATRIX_H +#define CGAL_OSM_SPARSE_MATRIX_H #include "Chain.h" -#include "Bitboard.hpp" +#include "Bitboard.h" #include #include #include @@ -24,33 +26,51 @@ namespace CGAL { namespace OSM { -/** - * \class SparseMatrix - * \brief Vector implementation of sparse matrices. - * - * The SparseMatrix class contains all algebraic functions that are related to OSM matrices (optimized sparse matrices). - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -class SparseMatrix { +/*! + \ingroup PkgHDVFAlgorithmClasses + + The class `Sparse_matrix` implements the concept `SparseMatrix`, that is, sparse matrices optimized to topological computations. It provides standard linear algebra operators and fast iterators and block operations (set, get and nullify) which are required to implement efficiently HDVFs. + + The implementation is based on mapped sparse matrices. Hence matrices of the `Sparse_matrix` class are either column of row major (the `ChainTypeFlag` parameter determines the type). A column-major (resp. row-major) `Sparse_matrix` is a vector of `Sparse_chains` which encode columns (res. rows). Moreover, in order to efficiently iterate over non empty columns (resp. rows) the `Bitboard` data structure implements the concept `SparseMatrix::NonZeroChainIndices`. A bitboard is basically a bucket of bits recording the indices of non empty chains. However, this data structure has been designed in order to efficiently remove or add indices, as well as provide efficient iterators to visit non empty chains. + + For instance, let us consider the \f$3\times 4\f$ matrix: + \f[ + A = \left(\begin{array}{cccc} + 1 & \cdot & \cdot & \cdot \\ + -1 & \cdot & 2 & \cdot\\ + \cdot & \cdot & 1 & \cdot \\ + \cdot & \cdot & \cdot & \cdot \\ + \end{array}\right) + \f] + where \f$\cdot\f$ means \f$0\f$. + + If the matrix is stored column-major, following data structures are created: + + + + \cgalModels{SparseMatrix} + + \tparam CoefficientType a model of the `Ring` concept (by default, we use the `Z` model) providing the ring used to compute homology. + \tparam ChainTypeFlag an integer constant encoding the type of matrices (`OSM::COLUMN` or `OSM::ROW`). +*/ + +template +class Sparse_matrix { public: - typedef Chain<_CoefficientType, _ChainTypeFlag> MatrixChain; - // Add these lines to allow the SparseMatrix class to access other templated - // SparsedMatrix private members. + /*! + Type of chains associated to the matrix. + */ + typedef Chain MatrixChain; + + // Allow the Sparse_matrix class to access other templated Sparse_matrix private members. template - friend class SparseMatrix; + friend class Sparse_matrix; protected: /** \brief The inner chain storage. */ - std::vector> chains; + std::vector> chains; /** \brief A bitboard containing state of each columns. */ Bitboard chainsStates; @@ -74,10 +94,10 @@ class SparseMatrix { * \date 08/04/2024 */ MatrixChain& operator[](const int _index) { - if (_ChainTypeFlag == COLUMN && _index >= size.second) { + if (ChainTypeFlag == COLUMN && _index >= size.second) { throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); } - if (_ChainTypeFlag == ROW && _index >= size.first) { + if (ChainTypeFlag == ROW && _index >= size.first) { throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); } @@ -87,13 +107,13 @@ class SparseMatrix { public: /** - * \brief Create new SparseMatrix object. + * \brief Create new Sparse_matrix object. * * Default constructor, initialize an empty Matrix as Z integers column chains. * The default matrix size is 128x128. * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) * * \see \link OSM::Chain \endlink * @@ -101,19 +121,19 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix() { + Sparse_matrix() { chains = std::vector(0); chainsStates = Bitboard(0); size = {0, 0}; } /** - * \brief Create new SparseMatrix object. + * \brief Create new Sparse_matrix object. * * Constructor with size, initialize an empty Matrix as Z integers column chains. * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) * \param[in] _rowCount The number of rows to preallocate. * \param[in] _columnCount The number of columns to preallocate. * @@ -123,13 +143,13 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix(const int _rowCount, const int _columnCount) { - int mainSize = _ChainTypeFlag == COLUMN ? _columnCount : _rowCount; - int secondarySize = _ChainTypeFlag == COLUMN ? _rowCount : _columnCount; + Sparse_matrix(const int _rowCount, const int _columnCount) { + int mainSize = ChainTypeFlag == COLUMN ? _columnCount : _rowCount; + int secondarySize = ChainTypeFlag == COLUMN ? _rowCount : _columnCount; - chains = std::vector>(mainSize); + chains = std::vector>(mainSize); for (int i = 0 ; i < mainSize ; i++) { - chains[i] = Chain<_CoefficientType, _ChainTypeFlag>(secondarySize); + chains[i] = Chain(secondarySize); } chainsStates = Bitboard(mainSize); @@ -137,13 +157,13 @@ class SparseMatrix { } /** - * \brief Create new SparseMatrix from other SparseMatrix object. + * \brief Create new Sparse_matrix from other Sparse_matrix object. * - * Copy constructor, initialize a SparseMatrix (not necessarly based on the same type of matrix). + * Copy constructor, initialize a Sparse_matrix (not necessarly based on the same type of matrix). * If types are different, the constructor performs conversion. * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) + * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) + * \tparam ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) * \param[in] _otherToCopy The matrix we want to copy. * * \see \link OSM::Chain \endlink @@ -153,9 +173,9 @@ class SparseMatrix { * \date 08/04/2024 */ template - SparseMatrix(const SparseMatrix<_CoefficientType,CTF> &_otherToCopy) { + Sparse_matrix(const Sparse_matrix &_otherToCopy) { // *this = _otherToCopy; - if (_ChainTypeFlag == CTF) + if (ChainTypeFlag == CTF) { chainsStates = _otherToCopy.chainsStates; size = _otherToCopy.size; @@ -163,9 +183,9 @@ class SparseMatrix { chains.resize(_otherToCopy.chains.size()) ; for (int i = 0; i<_otherToCopy.chains.size(); ++i) { - const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; - Chain<_CoefficientType,_ChainTypeFlag> res(tmp.dimension()) ; - for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + const Chain& tmp(_otherToCopy.chains.at(i)) ; + Chain res(tmp.dimension()) ; + for (typename Chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { res[it->first] = it->second ; } @@ -175,19 +195,19 @@ class SparseMatrix { else // Copy coefficient by coefficient { size = _otherToCopy.size; - int vec_size = (_ChainTypeFlag == OSM::COLUMN)?size.second:size.first ; - int chain_size = (_ChainTypeFlag == OSM::COLUMN)?size.first:size.second ; + int vec_size = (ChainTypeFlag == OSM::COLUMN)?size.second:size.first ; + int chain_size = (ChainTypeFlag == OSM::COLUMN)?size.first:size.second ; chains.resize(vec_size) ; chainsStates = OSM::Bitboard(vec_size) ; for (int i=0; i(chain_size) ; + chains.at(i) = Chain(chain_size) ; } for (int i = 0; i<_otherToCopy.chains.size(); ++i) { - const Chain<_CoefficientType, CTF>& tmp(_otherToCopy.chains.at(i)) ; - for (typename Chain<_CoefficientType, CTF>::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) + const Chain& tmp(_otherToCopy.chains.at(i)) ; + for (typename Chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { chains[it->first][i] = it->second ; chainsStates.setOn(it->first) ; @@ -213,7 +233,7 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix& operator=(const SparseMatrix& _otherToCopy) + Sparse_matrix& operator=(const Sparse_matrix& _otherToCopy) { chainsStates = _otherToCopy.chainsStates; size = _otherToCopy.size; @@ -224,13 +244,13 @@ class SparseMatrix { /** - * \brief Clean a SparseMatrix (set everything to zero) + * \brief Clean a Sparse_matrix (set everything to zero) * * Empty all structures of the sparse matrix. * * \warning Will raise an error if the other matrix is not the same chain type. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * * \author Fedyna K. * \version 0.1.0 @@ -246,7 +266,7 @@ class SparseMatrix { } /** - * \brief Displays a SparseMatrix in the output stream. + * \brief Displays a Sparse_matrix in the output stream. * * \param[in] _stream The output stream. * \param[in] _matrix The matrix to display. @@ -259,7 +279,7 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - friend std::ostream& operator<<(std::ostream &_stream, const SparseMatrix &_matrix) { + friend std::ostream& operator<<(std::ostream &_stream, const Sparse_matrix &_matrix) { #ifndef DEBUG bool empty = true; @@ -279,8 +299,8 @@ class SparseMatrix { for (int j=0; j<_matrix.size.second; ++j) { - //_CoefficientType tmp = _matrix[j][i] ; // get_coef(i,j) ; - _CoefficientType tmp = _matrix.get_coef(i,j) ; + //CoefficientType tmp = _matrix[j][i] ; // get_coef(i,j) ; + CoefficientType tmp = _matrix.get_coef(i,j) ; if (tmp == 0) _stream << ".\t" ; @@ -316,8 +336,8 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix operator+(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { - SparseMatrix newMatrix(_first); + friend Sparse_matrix operator+(const Sparse_matrix &_first, const Sparse_matrix &_second) { + Sparse_matrix newMatrix(_first); newMatrix += _second; return newMatrix; @@ -344,8 +364,8 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix operator-(const SparseMatrix &_first, const SparseMatrix<_CoefficientType, _CTF> &_second) { - SparseMatrix newMatrix = _first; + friend Sparse_matrix operator-(const Sparse_matrix &_first, const Sparse_matrix &_second) { + Sparse_matrix newMatrix = _first; newMatrix -= _second; return newMatrix; @@ -368,8 +388,8 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix operator*(const _CT& _lambda, const SparseMatrix<_CT, _CTF> &_matrix) { - SparseMatrix newMatrix = _matrix; + friend Sparse_matrix operator*(const _CT& _lambda, const Sparse_matrix<_CT, _CTF> &_matrix) { + Sparse_matrix newMatrix = _matrix; newMatrix *= _lambda; return newMatrix; @@ -392,8 +412,8 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix operator*(const SparseMatrix<_CT, _CTF> &_matrix, const _CT& _lambda) { - SparseMatrix newMatrix = _matrix; + friend Sparse_matrix operator*(const Sparse_matrix<_CT, _CTF> &_matrix, const _CT& _lambda) { + Sparse_matrix newMatrix = _matrix; newMatrix *= _lambda; return newMatrix; @@ -420,7 +440,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second); /** * \brief Perform matrix multiplication between two matrices. @@ -443,7 +463,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second); /** * \brief Perform matrix multiplication between two matrices. @@ -466,7 +486,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second); /** * \brief Perform matrix multiplication between two matrices. @@ -489,7 +509,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second); /** * \brief Perform multiplication between a column-based matrix and a column-based chain. @@ -512,7 +532,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second); + friend Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second); /** * \brief Perform multiplication between a row-based matrix and a column-based chain. @@ -535,7 +555,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second); + friend Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second); /** * \brief Perform multiplication between a row-based chain and a row-based matrix. @@ -558,7 +578,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) ; + friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) ; /** * \brief Perform multiplication between a row-based chain and a column-based matrix. @@ -581,10 +601,10 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) ; + friend Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) ; /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two matrices. * * Generate a row-based matrix from the matrix multiplication and return it. * @@ -604,10 +624,10 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second); + friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second); /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two matrices. * * Generate a row-based matrix from the matrix multiplication and return it. * @@ -627,7 +647,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second); + friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second); /** * \brief Perform matrix multiplication between two chains. @@ -650,7 +670,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second); + friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second); /** * \brief Perform matrix multiplication between two chains. @@ -673,7 +693,7 @@ class SparseMatrix { * \date 08/04/2024 */ template - friend SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second); + friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second); /** * \brief Add a matrix and assign. @@ -694,7 +714,7 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix& operator+=(const SparseMatrix &_other) { + Sparse_matrix& operator+=(const Sparse_matrix &_other) { if (this->size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } @@ -732,7 +752,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other); /** * \brief Add a matrix and assign. @@ -755,7 +775,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); /** * \brief Substract a matrix and assign. @@ -776,7 +796,7 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix& operator-=(const SparseMatrix &_other) { + Sparse_matrix& operator-=(const Sparse_matrix &_other) { if (this->size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } @@ -815,7 +835,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other); /** * \brief Substract a matrix and assign. @@ -838,7 +858,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); /** * \brief Apply factor on each coefficients and assign. @@ -855,9 +875,10 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix& operator*=(const _CoefficientType& _lambda) { + Sparse_matrix& operator*=(const CoefficientType& _lambda) { if (_lambda == 0) { - *this = SparseMatrix(); + std::pair p(this->dimensions()) ; + *this = Sparse_matrix(p.first, p.second); return *this; } @@ -873,14 +894,14 @@ class SparseMatrix { * * \return The resulting matrix. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * * \author Bac A. * \version 0.1.0 * \date 07/09/2024 */ - friend SparseMatrix operator-(const SparseMatrix& _matrix) { - SparseMatrix res(_matrix.size.first, _matrix.size.second) ; + friend Sparse_matrix operator-(const Sparse_matrix& _matrix) { + Sparse_matrix res(_matrix.size.first, _matrix.size.second) ; for (int index: _matrix.chainsStates) { @@ -912,7 +933,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); /** * \brief Multiply a matrix and assign. @@ -935,7 +956,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, ROW> &_other); /** * \brief Multiply a matrix and assign. @@ -958,7 +979,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other); + friend Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other); /** * \brief Multiply a matrix and assign. @@ -981,7 +1002,7 @@ class SparseMatrix { * \date 31/04/2024 */ template - friend SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other); + friend Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other); /** * \brief Get a chain from a const matrix. @@ -999,10 +1020,10 @@ class SparseMatrix { * \date 08/04/2024 */ MatrixChain operator[](const int _index) const { - if (_ChainTypeFlag == COLUMN && _index >= size.second) { + if (ChainTypeFlag == COLUMN && _index >= size.second) { throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); } - if (_ChainTypeFlag == ROW && _index >= size.first) { + if (ChainTypeFlag == ROW && _index >= size.first) { throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); } @@ -1024,7 +1045,7 @@ class SparseMatrix { * \version 0.1.0 * \date 08/04/2024 */ - void set_coef(const int _i, const int _j, const _CoefficientType _d) { + void set_coef(const int _i, const int _j, const CoefficientType _d) { if (_i >= size.first) { throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); } @@ -1033,7 +1054,7 @@ class SparseMatrix { } - if (_ChainTypeFlag == COLUMN) + if (ChainTypeFlag == COLUMN) { (*this)[_j][_i] = _d ; } @@ -1058,7 +1079,7 @@ class SparseMatrix { * \date 08/04/2024 */ - _CoefficientType get_coef(const int _i, const int _j) const { + CoefficientType get_coef(const int _i, const int _j) const { if (_i >= size.first) { //std::cout << "Provided _i index should be less than " << size.first << "." << std::endl; throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); @@ -1069,7 +1090,7 @@ class SparseMatrix { } - if (_ChainTypeFlag == COLUMN) + if (ChainTypeFlag == COLUMN) return (*this)[_j][_i] ; else // ROW return (*this)[_i][_j] ; @@ -1093,7 +1114,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + friend Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index); /** * \brief Get a column from the matrix, even if matrix is a row-chain matrix. @@ -1113,7 +1134,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + friend Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, const int _index); /** * \brief Get a row from the matrix, even if matrix is a row-chain matrix. @@ -1133,7 +1154,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + friend Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index); /** * \brief Get a row from the matrix, even if matrix is a row-chain matrix. @@ -1153,7 +1174,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); + friend Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index); /** * \brief Get a const reference over a column from a column matrix @@ -1171,7 +1192,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index); + friend const Chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index); /** * \brief Get a const reference over a row from a row matrix @@ -1189,43 +1210,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index); - - /** - * \brief Get a reference over a column from a column matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ - template - friend Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index); - - /** - * \brief Get a reference over a row from a row matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ - template - friend Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index); + friend const Chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index); /** @@ -1243,7 +1228,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + friend void set_column(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); /** * \brief Set a column from the matrix, even if matrix is a row-chain matrix. @@ -1260,7 +1245,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); + friend void set_column(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain); /** * \brief Set a row from the matrix, even if matrix is a row-chain matrix. @@ -1277,7 +1262,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + friend void set_row(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); /** * \brief Set a row from the matrix, even if matrix is a row-chain matrix. @@ -1294,7 +1279,7 @@ class SparseMatrix { * \date 17/04/2024 */ template - friend void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); + friend void set_row(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain); /** * \brief Get a submatrix from the matrix. @@ -1309,15 +1294,15 @@ class SparseMatrix { * * \return A new matrix representing the result. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link std::vector \endlink * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ - friend SparseMatrix operator/(const SparseMatrix &_matrix, const std::vector &_indexes) { - SparseMatrix res(_matrix); + friend Sparse_matrix operator/(const Sparse_matrix &_matrix, const std::vector &_indexes) { + Sparse_matrix res(_matrix); res /= _indexes; return res; } @@ -1325,9 +1310,9 @@ class SparseMatrix { /** * \brief Get a submatrix from the matrix. * - * Removes index from the matrix and returns it. + * Nullifies a chain along the major direction of a copy of the matrix returns it. * - * \note Will return a copy of the matrix if given vector is empty. + * \note Will return a copy of the matrix. * \note The submatrix will be rectangular. * * \param[in] _matrix The matrix to process. @@ -1335,15 +1320,15 @@ class SparseMatrix { * * \return A new matrix representing the result. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link std::vector \endlink * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ - friend SparseMatrix operator/(const SparseMatrix &_matrix, const int _index) { - SparseMatrix res(_matrix); + friend Sparse_matrix operator/(const Sparse_matrix &_matrix, const int _index) { + Sparse_matrix res(_matrix); res /= _index; return res; } @@ -1359,14 +1344,14 @@ class SparseMatrix { * * \return The modified matrix representing the result. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link std::vector \endlink * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix& operator/=(const std::vector &_indexes) { + Sparse_matrix& operator/=(const std::vector &_indexes) { for (int index : _indexes) { *this /= index; } @@ -1386,14 +1371,14 @@ class SparseMatrix { * * \return A new matrix representing the result. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link std::vector \endlink * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix& operator/=(const int _index) { + Sparse_matrix& operator/=(const int _index) { chains[_index].nullify(); chainsStates.setOff(_index); @@ -1401,26 +1386,24 @@ class SparseMatrix { } /** - * \brief Get a submatrix from the matrix and assign. - * - * Removes all indexes provided in the vector from the matrix and returns it. + * \brief Nullifies a column from the matrix. * - * \note Will not alter the matrix if given vector is empty. + * Removes column of index `_index` whatever the `ChainTypeFlag` of the matrix. For column matrices, it just comes to the `\=` operator and for row matrices, it entails a traversal of the matrix. * - * \param[in] _indexes The indexes to remove. + * \param[in] _index The index to remove. * * \return The modified matrix representing the result. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link std::vector \endlink * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix& delColumn(int _index) { + Sparse_matrix& del_column(int _index) { std::vector tmp_id{_index} ; - if (_ChainTypeFlag == OSM::COLUMN) + if (ChainTypeFlag == OSM::COLUMN) { (*this)/=tmp_id ; } @@ -1439,10 +1422,26 @@ class SparseMatrix { return *this; } - SparseMatrix& delRow(int _index) + /** + * \brief Nullifies a row from the matrix. + * + * Removes row of index `_index` whatever the `ChainTypeFlag` of the matrix. For row matrices, it just comes to the `\=` operator and for column matrices, it entails a traversal of the matrix. + * + * \param[in] _index The index to remove. + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Sparse_matrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Sparse_matrix& del_row(int _index) { std::vector tmp_id{_index}; - if (_ChainTypeFlag == OSM::ROW) { + if (ChainTypeFlag == OSM::ROW) { (*this) /= tmp_id; } else // OSM::COLUMN { @@ -1458,22 +1457,39 @@ class SparseMatrix { return *this; } - SparseMatrix& delCoef(int _index1, int _index2) + /** + * \brief Nullifies a coefficient from the matrix. + * + * Removes coefficient at row `i` and column `j` and update (if necessary) the status of corresponding chains (null or not). + * + * \param[in] i Index of the row + * \param[in] j Index of the column + * + * \return The modified matrix representing the result. + * + * \see \link OSM::Sparse_matrix \endlink + * \see \link std::vector \endlink + * + * \author Fedyna K. + * \version 0.1.0 + * \date 08/04/2024 + */ + Sparse_matrix& del_coef(int i, int j) { - if (_ChainTypeFlag == OSM::COLUMN) { - std::vector tmp_id({_index1}) ; - MatrixChain &tmp(chains[_index2]); + if (ChainTypeFlag == OSM::COLUMN) { + std::vector tmp_id({i}) ; + MatrixChain &tmp(chains[j]); tmp /= tmp_id; if (tmp.isNull()) - chainsStates.setOff(_index2) ; + chainsStates.setOff(j) ; } else // OSM::ROW { - std::vector tmp_id({_index2}) ; - MatrixChain &tmp(chains[_index1]); + std::vector tmp_id({j}) ; + MatrixChain &tmp(chains[i]); tmp /= tmp_id; if (tmp.isNull()) - chainsStates.setOff(_index1) ; + chainsStates.setOff(i) ; } return *this; @@ -1484,7 +1500,7 @@ class SparseMatrix { * * \return The iterator to the beginning of the chains indices. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink * \see \link std::vector \endlink * \see \link std::vector::iterator \endlink @@ -1501,7 +1517,7 @@ class SparseMatrix { * * \return The iterator to the ending of the chains indices. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink * \see \link std::vector \endlink * \see \link std::vector::iterator \endlink @@ -1518,7 +1534,7 @@ class SparseMatrix { * * \return The reverse iterator to the chains indices. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink * \see \link std::vector \endlink * \see \link std::vector::iterator \endlink @@ -1536,7 +1552,7 @@ class SparseMatrix { * * \return The reverse iterator to the ending of the chains indices. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink * \see \link std::vector \endlink * \see \link std::vector::iterator \endlink @@ -1554,14 +1570,14 @@ class SparseMatrix { * * \return A new matrix where the chain type flag is changed. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * * \author Fedyna K. * \version 0.1.0 * \date 08/04/2024 */ - SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { - SparseMatrix<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transposed(this->size.second, this->size.first); + Sparse_matrix transpose() { + Sparse_matrix transposed(this->size.second, this->size.first); for (int index : this->chainsStates) { transposed.chains[index] = this->chains[index].transpose(); @@ -1577,7 +1593,7 @@ class SparseMatrix { * * \return The matrix size as a Row/Column pair. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * * \author Fedyna K. * \version 0.1.0 @@ -1611,8 +1627,8 @@ class SparseMatrix { * \date 08/04/2024 */ template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { + Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); // Perform col-col matrix multiplication with linear combination of columns. for (int index: _second.chainsStates) { @@ -1651,8 +1667,8 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, con * \date 08/04/2024 */ template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { + Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); // Perform row-col matrix multiplication with dot products. for (int colRight: _second.chainsStates) { @@ -1692,8 +1708,8 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const * \date 08/04/2024 */ template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second) { + Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); // Perform row-col matrix multiplication with dot products. for (int colLeft: _first.chainsStates) { @@ -1724,15 +1740,15 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, con * \date 08/04/2024 */ template -SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { + Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); // Perform row-col matrix multiplication with dot products. for (int i = 0 ; i < _second.size.second ; i++) { Chain<_CT, COLUMN> column(_first.size.first); for (int rowLeft: _first.chainsStates) { - _CT coef = _first.chains[rowLeft] * getColumn(_second, i); + _CT coef = _first.chains[rowLeft] * get_column(_second, i); if (coef != 0) { column[rowLeft] = coef; } @@ -1767,7 +1783,7 @@ SparseMatrix<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const * \date 08/04/2024 */ template -Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second) +Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second) { // Perform col-col matrix multiplication with linear combination of columns. Chain<_CT, COLUMN> column(_first.size.first); @@ -1801,7 +1817,7 @@ Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, COLUMN> &_first, const Chai * \date 08/04/2024 */ template -Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second) +Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second) { // Perform row-col matrix multiplication with dots Chain<_CT, COLUMN> column(_first.size.first); @@ -1836,7 +1852,7 @@ Chain<_CT, COLUMN> operator*(const SparseMatrix<_CT, ROW> &_first, const Chain<_ * \date 08/04/2024 */ template -Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) +Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { // Perform row-row matrix multiplication with linear combination of rows. Chain<_CT, ROW> row(_second.size.second); @@ -1870,7 +1886,7 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, * \date 08/04/2024 */ template -Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) +Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { // Perform row-col matrix multiplication with dots Chain<_CT, ROW> row(_second.size.second); @@ -1905,14 +1921,14 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const SparseMatrix<_CT, * \date 08/04/2024 */ template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { + Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); for (int i = 0 ; i < _first.size.first ; i++) { Chain<_CT, ROW> row(_second.size.second); for (int colRight: _second.chainsStates) { - _CT coef = getRow(_first, i) * _second.chains[colRight]; + _CT coef = get_row(_first, i) * _second.chains[colRight]; if (coef != 0) { row[colRight] = coef; } @@ -1947,8 +1963,8 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const * \date 08/04/2024 */ template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, COLUMN> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { + Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); // Perform row-col matrix multiplication with dot products. for (int rowLeft: _first.chainsStates) { @@ -1988,8 +2004,8 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const Spa * \date 08/04/2024 */ template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second) { + Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); // Perform row-col matrix multiplication with dot products. for (int colLeft: _first.chainsStates) { @@ -2020,8 +2036,8 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, COLUMN> &_first, const * \date 08/04/2024 */ template -SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const SparseMatrix<_CT, ROW> &_second) { - SparseMatrix<_CT, ROW> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { + Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); // Perform row-row matrix multiplication with linear combination of rows. for (int index: _first.chainsStates) { @@ -2060,16 +2076,16 @@ SparseMatrix<_CT, ROW> operator%(const SparseMatrix<_CT, ROW> &_first, const Spa * \date 31/04/2024 */ template -SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { +Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } for (int index = 0 ; index < _other.size.second ; index++) { - Chain column = getColumn(_other, index); + Chain column = get_column(_other, index); if (!column.isNull()) { _matrix.chainsStates |= index; - _matrix.chains[index] += getColumn(_other, index); + _matrix.chains[index] += get_column(_other, index); if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); @@ -2101,16 +2117,16 @@ SparseMatrix<_CT, COLUMN>& operator+=(SparseMatrix<_CT, COLUMN> &_matrix, const * \date 31/04/2024 */ template -SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { +Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } for (int index = 0 ; index < _other.size.first ; index++) { - Chain row = getRow(_other, index); + Chain row = get_row(_other, index); if (!row.isNull()) { _matrix.chainsStates |= index; - _matrix.chains[index] += getRow(_other, index); + _matrix.chains[index] += get_row(_other, index); if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); @@ -2142,16 +2158,16 @@ SparseMatrix<_CT, ROW>& operator+=(SparseMatrix<_CT, ROW> &_matrix, const Sparse * \date 31/04/2024 */ template -SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { +Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } for (int index = 0 ; index < _other.size.second ; index++) { - Chain column = getColumn(_other, index); + Chain column = get_column(_other, index); if (!column.isNull()) { _matrix.chainsStates |= index; - _matrix.chains[index] -= getColumn(_other, index); + _matrix.chains[index] -= get_column(_other, index); if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); @@ -2183,16 +2199,16 @@ SparseMatrix<_CT, COLUMN>& operator-=(SparseMatrix<_CT, COLUMN> &_matrix, const * \date 31/04/2024 */ template -SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { +Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { if (_matrix.size != _other.size) { throw std::runtime_error("Matrices must be the same size."); } for (int index = 0 ; index < _other.size.second ; index++) { - Chain row = getRow(_other, index); + Chain row = get_row(_other, index); if (!row.isNull()) { _matrix.chainsStates |= index; - _matrix.chains[index] -= getRow(_other, index); + _matrix.chains[index] -= get_row(_other, index); if (_matrix.chains[index].isNull()) { _matrix.chainsStates.setOff(index); @@ -2216,14 +2232,14 @@ SparseMatrix<_CT, ROW>& operator-=(SparseMatrix<_CT, ROW> &_matrix, const Sparse * * \return The modified matrix representing the result. * - * \see \link OSM::SparseMatrix \endlink + * \see \link OSM::Sparse_matrix \endlink * * \author Fedyna K. * \version 0.3.0 * \date 31/04/2024 */ template -SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { +Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { _matrix = _matrix * _other; return _matrix; } @@ -2248,7 +2264,7 @@ SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const * \date 31/04/2024 */ template -SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, ROW> &_other) { +Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { _matrix = _matrix % _other; return _matrix; } @@ -2273,7 +2289,7 @@ SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const Sparse * \date 31/04/2024 */ template -SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const SparseMatrix<_CT, ROW> &_other) { +Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { _matrix = _matrix * _other; return _matrix; } @@ -2298,7 +2314,7 @@ SparseMatrix<_CT, COLUMN>& operator*=(SparseMatrix<_CT, COLUMN> &_matrix, const * \date 31/04/2024 */ template -SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const SparseMatrix<_CT, COLUMN> &_other) { +Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { _matrix = _matrix % _other; return _matrix; } @@ -2321,7 +2337,7 @@ SparseMatrix<_CT, ROW>& operator*=(SparseMatrix<_CT, ROW> &_matrix, const Sparse * \date 17/04/2024 */ template -Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { +Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { return _matrix.chains[_index]; } @@ -2343,7 +2359,7 @@ Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int * \date 17/04/2024 */ template -Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { +Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { Chain<_CT, COLUMN> column(_matrix.size.first); if (_matrix.size.first > 0) { @@ -2375,7 +2391,7 @@ Chain<_CT, COLUMN> getColumn(const SparseMatrix<_CT, ROW> &_matrix, const int _i * \date 17/04/2024 */ template -Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) { +Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { Chain<_CT, ROW> row(_matrix.size.second); if (_matrix.size.second > 0) { @@ -2407,7 +2423,7 @@ Chain<_CT, ROW> getRow(const SparseMatrix<_CT, COLUMN> &_matrix, const int _inde * \date 17/04/2024 */ template -Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) { +Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { return _matrix.chains[_index]; } @@ -2427,7 +2443,7 @@ Chain<_CT, ROW> getRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) * \date 17/04/2024 */ template -const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, const int _index) +const Chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { if (_index >= _matrix.size.second) { throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); @@ -2451,55 +2467,7 @@ const Chain<_CT, COLUMN> & cgetColumn(const SparseMatrix<_CT, COLUMN> &_matrix, * \date 17/04/2024 */ template -const Chain<_CT, ROW> & cgetRow(const SparseMatrix<_CT, ROW> &_matrix, const int _index) -{ - if (_index >= _matrix.size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); - } - return _matrix.chains[_index]; -} - -/** - * \brief Get a reference over a column from a column matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the column stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, COLUMN>& rgetColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index) -{ - if (_index >= _matrix.size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); - } - return _matrix.chains[_index]; -} - -/** - * \brief Get a reference over a row from a row matrix - * - * \warning The matrix will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return A reference over the row stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Bac A. - * \version 0.1.0 - * \date 17/04/2024 - */ -template -Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index) +const Chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { if (_index >= _matrix.size.first) { throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); @@ -2522,9 +2490,9 @@ Chain<_CT, ROW>& rgetRow(SparseMatrix<_CT, ROW> &_matrix, const int _index) * \date 17/04/2024 */ template -void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { +void set_column(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { if(_matrix.dimensions().first != _chain.dimension()) - throw std::runtime_error("setColumn dimension error") ; + throw std::runtime_error("set_column dimension error") ; _matrix[_index] = _chain; if (_chain.isNull()) _matrix.chainsStates.setOff(_index) ; @@ -2545,9 +2513,9 @@ void setColumn(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain * \date 17/04/2024 */ template -void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { +void set_column(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { if(_matrix.dimensions().first != _chain.dimension()) - throw std::runtime_error("setColumn dimension error") ; + throw std::runtime_error("set_column dimension error") ; for (int i = 0 ; i < _matrix.size.first ; i++) { if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { _matrix.chains[i] /= _index; @@ -2579,9 +2547,9 @@ void setColumn(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_C * \date 17/04/2024 */ template -void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { +void set_row(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { if(_matrix.dimensions().second != _chain.dimension()) - throw("setColumn dimension error") ; + throw("set_column dimension error") ; for (int i = 0 ; i < _matrix.size.second ; i++) { if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { _matrix.chains[i] /= _index; @@ -2613,9 +2581,9 @@ void setRow(SparseMatrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_C * \date 17/04/2024 */ template -void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { +void set_row(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { if(_matrix.dimensions().second != _chain.dimension()) - throw("setColumn dimension error") ; + throw("set_column dimension error") ; _matrix[_index] = _chain; if (_chain.isNull()) _matrix.chainsStates.setOff(_index) ; @@ -2624,4 +2592,4 @@ void setRow(SparseMatrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, } /* end namespace OSM */ } /* end namespace CGAL */ -#endif +#endif // CGAL_OSM_SPARSE_MATRIX_H diff --git a/HDVF/include/CGAL/OSM/__base.hpp b/HDVF/include/CGAL/OSM/__base.hpp index 972f68efd9f7..79c230d48efb 100644 --- a/HDVF/include/CGAL/OSM/__base.hpp +++ b/HDVF/include/CGAL/OSM/__base.hpp @@ -24,48 +24,17 @@ const int ROW = 0b10; /** \brief The default type for signed integers. */ typedef int ZCoefficient; -/** - * \class SparseMatrix - * \brief Vector implementation of sparse matrices. - * - * The SparseMatrix class contains all algebraic functions that are related to matrix. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ +// Class Sparse_matrix template -class SparseMatrix; +class Sparse_matrix; + +// Class Chain -/** - * \class Chain - * \brief Allow to create row/column sparse vectors. - * - * The Chain class contains all algebraic functions that are related to vectors. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ template class Chain; -/** - * \class Bitboard - * \brief Bitboards are long bitset with specific operations. - * - * Bitboards are used with SparseMatrix to quickly find and set non empty columns. - * - * \author Fedyna K. - * \version 0.2.0 - * \date 23/05/2024 - */ +// Class Bitboard + class Bitboard; } /* end namespace OSM */ From c1363e19cfbcbee3f44302dbe6e414d885c69c52 Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Wed, 21 May 2025 08:16:22 +0200 Subject: [PATCH 018/343] Sparse_matrix Documentation of Sparse_matrix ongoing --- HDVF/doc/HDVF/Concepts/SparseMatrix.h | 22 +- HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp | 14 +- HDVF/include/CGAL/OSM/Sparse_matrix.h | 899 ++++++++------------- 3 files changed, 377 insertions(+), 558 deletions(-) diff --git a/HDVF/doc/HDVF/Concepts/SparseMatrix.h b/HDVF/doc/HDVF/Concepts/SparseMatrix.h index 529ff5b81055..b72beecaa52a 100644 --- a/HDVF/doc/HDVF/Concepts/SparseMatrix.h +++ b/HDVF/doc/HDVF/Concepts/SparseMatrix.h @@ -192,17 +192,33 @@ class SparseMatrix { * Substracts each coefficient of the matrix together and returns a new matrix (of the same type as `first`) representing the result (when possible, prefer `-=` for efficiency). * Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. */ - friend SparseMatrix operator-(const SparseMatrix &_first, const SparseMatrix &second); + friend SparseMatrix operator-(const SparseMatrix &first, const SparseMatrix &second); /** * \brief Compute the negative of a matrix (unary operator). * * \return The resulting matrix. */ - friend SparseMatrix operator-(const SparseMatrix& _matrix); + friend SparseMatrix operator-(const SparseMatrix& matrix); /** - * \brief Apply factor on each coefficients and assign. + * \brief Apply factor on each coefficients into a new matrix. + * + * This method creates a new matrix obtained by multiplying the matrix by a scalar factor `lambda`. If `lambda` is zero, the function comes to nullify the matrix (when possible, prefer `*=` for efficiency). + */ + friend Sparse_matrix operator*(const CoefficientType& lambda, const Sparse_matrix &matrix); + + /** + * \brief Apply factor on each coefficients into a new matrix. + * + * This method creates a new matrix obtained by multiplying the matrix by a scalar factor `lambda`. If `lambda` is zero, the function comes to nullify the matrix (when possible, prefer `*=` for efficiency). + */ + friend Sparse_matrix operator*(const Sparse_matrix &matrix, const CoefficientType& lambda); + + /** + * \brief Apply factor on each coefficient and assign. + * + * This method multiplies the matrix by a scalar factor `lambda`. */ SparseMatrix& operator*=(const CoefficientType& lambda); diff --git a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp index ce48936756ba..29e82c022bc8 100644 --- a/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp +++ b/HDVF/include/CGAL/HDVF/SubSparseMatrix.hpp @@ -43,7 +43,7 @@ class SubSparseMatrix : public Sparse_matrix<_CoefficientType, _ChainTypeFlag> { public: /** \brief Constructor with sizes and Bitboard describing subchains. */ - SubSparseMatrix(const int _rowCount, const int _columnCount, const Bitboard& subChain) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->chainsStates & subChain) + SubSparseMatrix(const int _rowCount, const int _columnCount, const Bitboard& subChain) : Sparse_matrix<_CoefficientType, _ChainTypeFlag>(_rowCount, _columnCount), _subChains(subChain), _subChainsStates(this->_chainsStates & subChain) { } @@ -54,7 +54,7 @@ class SubSparseMatrix : public Sparse_matrix<_CoefficientType, _ChainTypeFlag> { _subChains = OSM::Bitboard(_columnCount,false) ; else _subChains = OSM::Bitboard(_rowCount,false) ; - _subChainsStates = this->chainsStates & _subChains ; + _subChainsStates = this->_chainsStates & _subChains ; } /** \brief Copy constructor. */ @@ -67,7 +67,7 @@ class SubSparseMatrix : public Sparse_matrix<_CoefficientType, _ChainTypeFlag> { _subChains = OSM::Bitboard(otherToCopy.dimensions().second,false) ; else _subChains = OSM::Bitboard(otherToCopy.dimensions().first,false) ; - _subChainsStates = this->chainsStates & _subChains ; + _subChainsStates = this->_chainsStates & _subChains ; } @@ -87,18 +87,18 @@ class SubSparseMatrix : public Sparse_matrix<_CoefficientType, _ChainTypeFlag> { inline void set_sub (const Bitboard& new_subChains) { _subChains = new_subChains ; - _subChainsStates = this->chainsStates & _subChains ; + _subChainsStates = this->_chainsStates & _subChains ; } - /** \brief Set a bit on in subchains and update chainsStates accordingly. */ + /** \brief Set a bit on in subchains and update _chainsStates accordingly. */ inline void set_bitOn (int index) { _subChains.setOn(index) ; - if (this->chainsStates.isOn(index)) + if (this->_chainsStates.isOn(index)) _subChainsStates.setOn(index) ; } - /** \brief Set a bit off in subchains and update chainsStates accordingly. */ + /** \brief Set a bit off in subchains and update _chainsStates accordingly. */ inline void set_bitOff (int index) { _subChains.setOff(index) ; diff --git a/HDVF/include/CGAL/OSM/Sparse_matrix.h b/HDVF/include/CGAL/OSM/Sparse_matrix.h index a10986577147..80e50a50854f 100644 --- a/HDVF/include/CGAL/OSM/Sparse_matrix.h +++ b/HDVF/include/CGAL/OSM/Sparse_matrix.h @@ -70,147 +70,117 @@ class Sparse_matrix { protected: /** \brief The inner chain storage. */ - std::vector> chains; + std::vector> _chains; /** \brief A bitboard containing state of each columns. */ - Bitboard chainsStates; + Bitboard _chainsStates; /** \brief The matrix size as a (row, column) pair. */ - std::pair size; + std::pair _size; /** - * \brief Get a chain from a matrix. + * \brief Get a reference on a chain from a matrix and change its state (for affectation). * - * \warning The matrix will perform boundary check. + * Used only internally. + * + * \warning The operator changes the status of the chain and the matrix will perform boundary check. * * \param[in] _index The coefficient index. * * \return The reference to the chain stored at given index. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ MatrixChain& operator[](const int _index) { - if (ChainTypeFlag == COLUMN && _index >= size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); + if (ChainTypeFlag == COLUMN && _index >= _size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_size.second) + "."); } - if (ChainTypeFlag == ROW && _index >= size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); + if (ChainTypeFlag == ROW && _index >= _size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_size.first) + "."); } - chainsStates |= _index; - return chains[_index]; + _chainsStates |= _index; + return _chains[_index]; } public: /** - * \brief Create new Sparse_matrix object. - * - * Default constructor, initialize an empty Matrix as Z integers column chains. - * The default matrix size is 128x128. + * \brief Create an empty new SparseMatrix object. * - * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Default constructor, initialize an empty Matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType`. + * The default matrix size is 0x0. */ Sparse_matrix() { - chains = std::vector(0); - chainsStates = Bitboard(0); - size = {0, 0}; + _chains = std::vector(0); + _chainsStates = Bitboard(0); + _size = {0, 0}; } /** - * \brief Create new Sparse_matrix object. - * - * Constructor with size, initialize an empty Matrix as Z integers column chains. + * \brief Create a new SparseMatrix object with given rows/columns sizes. * - * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _rowCount The number of rows to preallocate. - * \param[in] _columnCount The number of columns to preallocate. - * - * \see \link OSM::Chain \endlink + * Constructor with sizes, initialize an empty Matrix of type `ChainTypeFlag` with coefficients of type `CoefficientType` and a given size along rows/columns. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \param[in] rowCount The number of rows to preallocate. + * \param[in] columnCount The number of columns to preallocate. */ - Sparse_matrix(const int _rowCount, const int _columnCount) { - int mainSize = ChainTypeFlag == COLUMN ? _columnCount : _rowCount; - int secondarySize = ChainTypeFlag == COLUMN ? _rowCount : _columnCount; + Sparse_matrix(const int rowCount, const int columnCount) { + int mainSize = ChainTypeFlag == COLUMN ? columnCount : rowCount; + int secondarySize = ChainTypeFlag == COLUMN ? rowCount : columnCount; - chains = std::vector>(mainSize); + _chains = std::vector>(mainSize); for (int i = 0 ; i < mainSize ; i++) { - chains[i] = Chain(secondarySize); + _chains[i] = Chain(secondarySize); } - chainsStates = Bitboard(mainSize); - size = {_rowCount, _columnCount}; + _chainsStates = Bitboard(mainSize); + _size = {rowCount, columnCount}; } /** - * \brief Create new Sparse_matrix from other Sparse_matrix object. + * \brief Create a new SparseMatrix from another SparseMatrix object (with possibly a different `ChainTypeFlag`). * - * Copy constructor, initialize a Sparse_matrix (not necessarly based on the same type of matrix). + * Copy constructor, initialize a SparseMatrix of same sizes, containing the same coefficients (but not necessarly of the same `ChainTypeFlag`). * If types are different, the constructor performs conversion. * - * \tparam CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _otherToCopy The matrix we want to copy. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \param[in] otherToCopy The matrix copied. */ template - Sparse_matrix(const Sparse_matrix &_otherToCopy) { - // *this = _otherToCopy; + Sparse_matrix(const Sparse_matrix &otherToCopy) { if (ChainTypeFlag == CTF) { - chainsStates = _otherToCopy.chainsStates; - size = _otherToCopy.size; - // Copy of chains as such - chains.resize(_otherToCopy.chains.size()) ; - for (int i = 0; i<_otherToCopy.chains.size(); ++i) + _chainsStates = otherToCopy._chainsStates; + _size = otherToCopy._size; + // Copy of _chains as such + _chains.resize(otherToCopy._chains._size()) ; + for (int i = 0; i& tmp(_otherToCopy.chains.at(i)) ; + const Chain& tmp(otherToCopy._chains.at(i)) ; Chain res(tmp.dimension()) ; for (typename Chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { res[it->first] = it->second ; } - chains[i] = res ; + _chains[i] = res ; } } else // Copy coefficient by coefficient { - size = _otherToCopy.size; - int vec_size = (ChainTypeFlag == OSM::COLUMN)?size.second:size.first ; - int chain_size = (ChainTypeFlag == OSM::COLUMN)?size.first:size.second ; - chains.resize(vec_size) ; - chainsStates = OSM::Bitboard(vec_size) ; + _size = otherToCopy._size; + int vec_size = (ChainTypeFlag == OSM::COLUMN)?_size.second:_size.first ; + int chain_size = (ChainTypeFlag == OSM::COLUMN)?_size.first:_size.second ; + _chains.resize(vec_size) ; + _chainsStates = OSM::Bitboard(vec_size) ; for (int i=0; i(chain_size) ; + _chains.at(i) = Chain(chain_size) ; } - for (int i = 0; i<_otherToCopy.chains.size(); ++i) + for (int i = 0; i& tmp(_otherToCopy.chains.at(i)) ; + const Chain& tmp(otherToCopy._chains.at(i)) ; for (typename Chain::const_iterator it = tmp.cbegin(); it != tmp.cend(); ++it) { - chains[it->first][i] = it->second ; - chainsStates.setOn(it->first) ; + _chains[it->first][i] = it->second ; + _chainsStates.setOn(it->first) ; } } } @@ -226,35 +196,21 @@ class Sparse_matrix { * \param[in] _otherToCopy The matrix we want to copy. * * \return The reference to the modified matrix. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - Sparse_matrix& operator=(const Sparse_matrix& _otherToCopy) + Sparse_matrix& operator=(const Sparse_matrix& otherToCopy) { - chainsStates = _otherToCopy.chainsStates; - size = _otherToCopy.size; - chains = _otherToCopy.chains; + _chainsStates = otherToCopy._chainsStates; + _size = otherToCopy._size; + _chains = otherToCopy._chains; return *this; } /** - * \brief Clean a Sparse_matrix (set everything to zero) + * \brief Clean a SparseMatrix (set all coefficients to zero). * * Empty all structures of the sparse matrix. - * - * \warning Will raise an error if the other matrix is not the same chain type. - * - * \see \link OSM::Sparse_matrix \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ void nullify() { std::vector coefs ; @@ -266,250 +222,162 @@ class Sparse_matrix { } /** - * \brief Displays a Sparse_matrix in the output stream. + * \brief Displays a matrix in the output stream. * - * \param[in] _stream The output stream. - * \param[in] _matrix The matrix to display. + * \param[in] stream The output stream. + * \param[in] matrix The matrix to display. * * \return A reference to the modified stream. - * - * \see \link OSM::Matrix \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ - friend std::ostream& operator<<(std::ostream &_stream, const Sparse_matrix &_matrix) { + friend std::ostream& operator<<(std::ostream &stream, const Sparse_matrix &matrix) { #ifndef DEBUG bool empty = true; - _stream << "["; - for (int index : _matrix.chainsStates) { + stream << "["; + for (int index : matrix._chainsStates) { empty = false; - _stream << index << ": " << _matrix.chains[index] << ", "; + stream << index << ": " << matrix._chains[index] << ", "; } if (!empty) { - _stream << "\b\b"; + stream << "\b\b"; } - _stream << "]" << std::endl ; + stream << "]" << std::endl ; #else - for (int i=0; i<_matrix.size.first; ++i) + for (int i=0; i - friend Sparse_matrix operator+(const Sparse_matrix &_first, const Sparse_matrix &_second) { - Sparse_matrix newMatrix(_first); - newMatrix += _second; + friend Sparse_matrix operator+(const Sparse_matrix &first, const Sparse_matrix &second) { + Sparse_matrix newMatrix(first); + newMatrix += second; return newMatrix; } /** - * \brief Substracts two matrices together. + * \brief Substracts two matrices together into a new matrix. * - * Substracts each coefficient of the matrix together. + * Substracts each coefficient of the matrix together and returns a new matrix (of the same type as `first`) representing the result (when possible, prefer `-=` for efficiency). * - * \pre The matrixs have the same chain type. + * \pre Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. * - * \warning Will raise an error if the other matrix is not the same chain type. + * \warning Will raise an error if the other matrix is not the same `CoefficientType`. * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. + * \param[in] first The first matrix. + * \param[in] second The second matrix. * * \return A new matrix representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 */ template - friend Sparse_matrix operator-(const Sparse_matrix &_first, const Sparse_matrix &_second) { - Sparse_matrix newMatrix = _first; - newMatrix -= _second; + friend Sparse_matrix operator-(const Sparse_matrix &first, const Sparse_matrix &second) { + Sparse_matrix newMatrix = first; + newMatrix -= second; return newMatrix; } /** - * \brief Apply factor on each coefficients. + * \brief Apply factor on each coefficients into a new matrix. * - * \warning Will raise an error if _lambda is 0. + * This method creates a new matrix obtained by multiplying the matrix by a scalar factor `lambda`. * - * \param[in] _lambda The factor to apply. - * \param[in] _matrix The matrix. - * - * \return A new matrix representing the result. + * If `lambda` is zero, the function comes to nullify the matrix (when possible, prefer `*=` for efficiency). * - * \see \link OSM::Chain \endlink + * \param[in] lambda The factor to apply. + * \param[in] matrix The matrix. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \return A new matrix representing the result. */ template - friend Sparse_matrix operator*(const _CT& _lambda, const Sparse_matrix<_CT, _CTF> &_matrix) { - Sparse_matrix newMatrix = _matrix; - newMatrix *= _lambda; + friend Sparse_matrix operator*(const _CT& lambda, const Sparse_matrix<_CT, _CTF> &matrix) { + Sparse_matrix newMatrix = matrix; + newMatrix *= lambda; return newMatrix; } /** - * \brief Apply factor on each coefficients. - * - * \warning Will raise an error if _lambda is 0. + * \brief Apply factor on each coefficients into a new matrix. * - * \param[in] _matrix The matrix. - * \param[in] _lambda The factor to apply. + * This method creates a new matrix obtained by multiplying the matrix by a scalar factor `lambda`. * - * \return A new matrix representing the result. + * If `lambda` is zero, the function comes to nullify the matrix (when possible, prefer `*=` for efficiency). * - * \see \link OSM::Chain \endlink + * \param[in] matrix The matrix. + * \param[in] lambda The factor to apply. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \return A new matrix representing the result. */ template - friend Sparse_matrix operator*(const Sparse_matrix<_CT, _CTF> &_matrix, const _CT& _lambda) { - Sparse_matrix newMatrix = _matrix; - newMatrix *= _lambda; + friend Sparse_matrix operator*(const Sparse_matrix<_CT, _CTF> &matrix, const _CT& lambda) { + Sparse_matrix newMatrix = matrix; + newMatrix *= lambda; return newMatrix; } /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. + * \defgroup MatrixProdCol Matrix product (with column-based result). + * \ingroup PkgHDVFAlgorithmClasses + * @brief Perform multiplication between matrices and returns a new column-major matrix. * - * \see \link OSM::Chain \endlink + * Perform standard linear algebra product between matrices and returns a new column-major matrix (when possible, prefer `*=` for efficiency). Matrices must have the same `CoefficientType` but can have different `ChainTypeFlag`. Efficiency of the product depends of `ChainTypeFlag` (when possible, prefer row-major by column-major products). * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * @param first The first matrix. + * @param second The second matrix. + * @return The result of the matrix multiplication, column-based. + * @{ */ + + //* COLUMN x COLUMN -> COLUMN */ template - friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, COLUMN> &second); - /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + //* ROW x COLUMN -> COLUMN */ template - friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, COLUMN> &second); - /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + //* COLUMN x ROW -> COLUMN */ template - friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, ROW> &second); - /** - * \brief Perform matrix multiplication between two matrices. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ + //* ROW x ROW -> COLUMN */ template - friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second); + friend Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, ROW> &second); + + /** @} */ + /** * \brief Perform multiplication between a column-based matrix and a column-based chain. @@ -518,7 +386,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -541,7 +409,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -564,7 +432,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -587,7 +455,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -610,7 +478,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -633,7 +501,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -650,13 +518,13 @@ class Sparse_matrix { friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second); /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two _chains. * * Generate a row-based matrix from the matrix multiplication and return it. * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -673,13 +541,13 @@ class Sparse_matrix { friend Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second); /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two _chains. * * Generate a row-based matrix from the matrix multiplication and return it. * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -702,7 +570,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _other The other matrix. * @@ -715,16 +583,16 @@ class Sparse_matrix { * \date 08/04/2024 */ Sparse_matrix& operator+=(const Sparse_matrix &_other) { - if (this->size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); + if (this->_size != _other._size) { + throw std::runtime_error("Matrices must be the same _size."); } - for (int index: _other.chainsStates) { - this->chainsStates |= index; - this->chains[index] += _other.chains[index]; + for (int index: _other._chainsStates) { + this->_chainsStates |= index; + this->_chains[index] += _other._chains[index]; - if (this->chains[index].isNull()) { - this->chainsStates.setOff(index); + if (this->_chains[index].isNull()) { + this->_chainsStates.setOff(index); } } @@ -738,7 +606,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -761,7 +629,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -784,7 +652,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _other The other matrix. * @@ -797,16 +665,16 @@ class Sparse_matrix { * \date 08/04/2024 */ Sparse_matrix& operator-=(const Sparse_matrix &_other) { - if (this->size != _other.size) { - throw std::runtime_error("Matrices must be the same size."); + if (this->_size != _other._size) { + throw std::runtime_error("Matrices must be the same _size."); } - for (int index: _other.chainsStates) { - this->chainsStates |= index; - this->chains[index] -= _other.chains[index]; + for (int index: _other._chainsStates) { + this->_chainsStates |= index; + this->_chains[index] -= _other._chains[index]; - if (this->chains[index].isNull()) { - this->chainsStates.setOff(index); + if (this->_chains[index].isNull()) { + this->_chainsStates.setOff(index); } } @@ -821,7 +689,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -844,7 +712,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -882,8 +750,8 @@ class Sparse_matrix { return *this; } - for (int index: this->chainsStates) { - this->chains[index] *= _lambda; + for (int index: this->_chainsStates) { + this->_chains[index] *= _lambda; } return *this; @@ -901,11 +769,11 @@ class Sparse_matrix { * \date 07/09/2024 */ friend Sparse_matrix operator-(const Sparse_matrix& _matrix) { - Sparse_matrix res(_matrix.size.first, _matrix.size.second) ; + Sparse_matrix res(_matrix._size.first, _matrix._size.second) ; - for (int index: _matrix.chainsStates) + for (int index: _matrix._chainsStates) { - const MatrixChain& tmp_chain(_matrix.chains[index]) ; + const MatrixChain& tmp_chain(_matrix._chains[index]) ; for (typename MatrixChain::const_iterator it = tmp_chain.cbegin(); it != tmp_chain.cend(); ++it) res[index][it->first] = -it->second ; } @@ -919,7 +787,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -942,7 +810,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -965,7 +833,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -988,7 +856,7 @@ class Sparse_matrix { * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -1020,14 +888,14 @@ class Sparse_matrix { * \date 08/04/2024 */ MatrixChain operator[](const int _index) const { - if (ChainTypeFlag == COLUMN && _index >= size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.second) + "."); + if (ChainTypeFlag == COLUMN && _index >= _size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_size.second) + "."); } - if (ChainTypeFlag == ROW && _index >= size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(size.first) + "."); + if (ChainTypeFlag == ROW && _index >= _size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_size.first) + "."); } - return chains[_index]; + return _chains[_index]; } /** @@ -1046,11 +914,11 @@ class Sparse_matrix { * \date 08/04/2024 */ void set_coef(const int _i, const int _j, const CoefficientType _d) { - if (_i >= size.first) { - throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); + if (_i >= _size.first) { + throw std::runtime_error("Provided _i index should be less than " + std::to_string(_size.first) + "."); } - if (_j >= size.second) { - throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); + if (_j >= _size.second) { + throw std::runtime_error("Provided _j index should be less than " + std::to_string(_size.second) + "."); } @@ -1080,13 +948,13 @@ class Sparse_matrix { */ CoefficientType get_coef(const int _i, const int _j) const { - if (_i >= size.first) { - //std::cout << "Provided _i index should be less than " << size.first << "." << std::endl; - throw std::runtime_error("Provided _i index should be less than " + std::to_string(size.first) + "."); + if (_i >= _size.first) { + //std::cout << "Provided _i index should be less than " << _size.first << "." << std::endl; + throw std::runtime_error("Provided _i index should be less than " + std::to_string(_size.first) + "."); } - if (_j >= size.second) { - //std::cout << "Provided _j index should be less than " << size.second << "." << std::endl; - throw std::runtime_error("Provided _j index should be less than " + std::to_string(size.second) + "."); + if (_j >= _size.second) { + //std::cout << "Provided _j index should be less than " << _size.second << "." << std::endl; + throw std::runtime_error("Provided _j index should be less than " + std::to_string(_size.second) + "."); } @@ -1379,8 +1247,8 @@ class Sparse_matrix { * \date 08/04/2024 */ Sparse_matrix& operator/=(const int _index) { - chains[_index].nullify(); - chainsStates.setOff(_index); + _chains[_index].nullify(); + _chainsStates.setOff(_index); return *this; } @@ -1409,9 +1277,9 @@ class Sparse_matrix { } else // OSM::ROW { - for (int index : chainsStates) + for (int index : _chainsStates) { - MatrixChain &tmp(chains[index]) ; + MatrixChain &tmp(_chains[index]) ; tmp/=tmp_id ; // If the row index has become empty: update if (tmp.isNull()) @@ -1445,8 +1313,8 @@ class Sparse_matrix { (*this) /= tmp_id; } else // OSM::COLUMN { - for (int index : chainsStates) { - MatrixChain &tmp(chains[index]); + for (int index : _chainsStates) { + MatrixChain &tmp(_chains[index]); tmp /= tmp_id; // If the column index has become empty: update if (tmp.isNull()) @@ -1460,7 +1328,7 @@ class Sparse_matrix { /** * \brief Nullifies a coefficient from the matrix. * - * Removes coefficient at row `i` and column `j` and update (if necessary) the status of corresponding chains (null or not). + * Removes coefficient at row `i` and column `j` and update (if necessary) the status of corresponding _chains (null or not). * * \param[in] i Index of the row * \param[in] j Index of the column @@ -1479,26 +1347,26 @@ class Sparse_matrix { if (ChainTypeFlag == OSM::COLUMN) { std::vector tmp_id({i}) ; - MatrixChain &tmp(chains[j]); + MatrixChain &tmp(_chains[j]); tmp /= tmp_id; if (tmp.isNull()) - chainsStates.setOff(j) ; + _chainsStates.setOff(j) ; } else // OSM::ROW { std::vector tmp_id({j}) ; - MatrixChain &tmp(chains[i]); + MatrixChain &tmp(_chains[i]); tmp /= tmp_id; if (tmp.isNull()) - chainsStates.setOff(i) ; + _chainsStates.setOff(i) ; } return *this; } /** - * \brief Iterator to the beginning of the chains indices. + * \brief Iterator to the beginning of the _chains indices. * - * \return The iterator to the beginning of the chains indices. + * \return The iterator to the beginning of the _chains indices. * * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink @@ -1510,12 +1378,12 @@ class Sparse_matrix { * \version 0.1.0 * \date 08/04/2024 */ - inline Bitboard::iterator begin() const noexcept { return chainsStates.begin(); } + inline Bitboard::iterator begin() const noexcept { return _chainsStates.begin(); } /** - * \brief Iterator to the ending of the chains indices. + * \brief Iterator to the ending of the _chains indices. * - * \return The iterator to the ending of the chains indices. + * \return The iterator to the ending of the _chains indices. * * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink @@ -1527,12 +1395,12 @@ class Sparse_matrix { * \version 0.1.0 * \date 08/04/2024 */ - inline Bitboard::iterator end() const noexcept { return chainsStates.end(); } + inline Bitboard::iterator end() const noexcept { return _chainsStates.end(); } /** - * \brief Reverse iterator to the chains indices. + * \brief Reverse iterator to the _chains indices. * - * \return The reverse iterator to the chains indices. + * \return The reverse iterator to the _chains indices. * * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink @@ -1544,13 +1412,13 @@ class Sparse_matrix { * \version 0.1.0 * \date 08/04/2024 */ - inline Bitboard::reverse_iterator reverse_begin() noexcept { return chainsStates.reverse_begin(); } - inline Bitboard::reverse_iterator reverse_begin(size_t index) noexcept { return chainsStates.reverse_begin(index); } + inline Bitboard::reverse_iterator reverse_begin() noexcept { return _chainsStates.reverse_begin(); } + inline Bitboard::reverse_iterator reverse_begin(size_t index) noexcept { return _chainsStates.reverse_begin(index); } /** - * \brief Reverse iterator to the ending of the chains indices. + * \brief Reverse iterator to the ending of the _chains indices. * - * \return The reverse iterator to the ending of the chains indices. + * \return The reverse iterator to the ending of the _chains indices. * * \see \link OSM::Sparse_matrix \endlink * \see \link OSM::Chain \endlink @@ -1562,7 +1430,7 @@ class Sparse_matrix { * \version 0.1.0 * \date 08/04/2024 */ - inline Bitboard::reverse_iterator reverse_end() noexcept { return chainsStates.reverse_end(); } + inline Bitboard::reverse_iterator reverse_end() noexcept { return _chainsStates.reverse_end(); } /** @@ -1577,13 +1445,13 @@ class Sparse_matrix { * \date 08/04/2024 */ Sparse_matrix transpose() { - Sparse_matrix transposed(this->size.second, this->size.first); + Sparse_matrix transposed(this->_size.second, this->_size.first); - for (int index : this->chainsStates) { - transposed.chains[index] = this->chains[index].transpose(); + for (int index : this->_chainsStates) { + transposed._chains[index] = this->_chains[index].transpose(); } - transposed.chainsStates = this->chainsStates; + transposed._chainsStates = this->_chainsStates; return transposed; } @@ -1600,43 +1468,26 @@ class Sparse_matrix { * \date 06/05/2024 */ std::pair dimensions() const { - return this->size; + return this->_size; } }; - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 +/** @ingroup MatrixProdCol + * @brief COLUMN x COLUMN -> COLUMN */ +// COLUMN x COLUMN -> COLUMN template -Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { - Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, COLUMN> &second) { + Sparse_matrix<_CT, COLUMN> res(first._size.first, second._size.second); // Perform col-col matrix multiplication with linear combination of columns. - for (int index: _second.chainsStates) { - Chain<_CT, COLUMN> column(_first.size.first); + for (int index: second._chainsStates) { + Chain<_CT, COLUMN> column(first._size.first); - for (std::pair colRight: _second.chains[index]) { - if (_first.chainsStates.isOn(colRight.first)) { - column += colRight.second * _first.chains[colRight.first]; + for (std::pair colRight: second._chains[index]) { + if (first._chainsStates.isOn(colRight.first)) { + column += colRight.second * first._chains[colRight.first]; } } @@ -1646,36 +1497,20 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, c return res; } -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 +/** @ingroup MatrixProdCol + * @brief ROW x COLUMN -> COLUMN */ +// ROW x COLUMN -> COLUMN template -Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { - Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, COLUMN> &second) { + Sparse_matrix<_CT, COLUMN> res(first._size.first, second._size.second); // Perform row-col matrix multiplication with dot products. - for (int colRight: _second.chainsStates) { - Chain<_CT, COLUMN> column(_first.size.first); + for (int colRight: second._chainsStates) { + Chain<_CT, COLUMN> column(first._size.first); - for (int rowLeft: _first.chainsStates) { - _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; + for (int rowLeft: first._chainsStates) { + _CT coef = first._chains[rowLeft] * second._chains[colRight]; if (coef != 0) { column[rowLeft] = coef; } @@ -1687,68 +1522,36 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, cons return res; } -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 +/** @ingroup MatrixProdCol + * @brief COLUMN x ROW -> COLUMN */ +// COLUMN x ROW -> COLUMN template -Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second) { - Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &first, const Sparse_matrix<_CT, ROW> &second) { + Sparse_matrix<_CT, COLUMN> res(first._size.first, second._size.second); // Perform row-col matrix multiplication with dot products. - for (int colLeft: _first.chainsStates) { - res += _first.chains[colLeft] * _second.chains[colLeft]; + for (int colLeft: first._chainsStates) { + res += first._chains[colLeft] * second._chains[colLeft]; } return res; } -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The matrix have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _first The first matrix. - * \param[in] _second The second matrix. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 +/** @ingroup MatrixProdCol + * @brief ROW x ROW -> COLUMN */ +// ROW x ROW -> COLUMN template -Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { - Sparse_matrix<_CT, COLUMN> res(_first.size.first, _second.size.second); +Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &first, const Sparse_matrix<_CT, ROW> &second) { + Sparse_matrix<_CT, COLUMN> res(first._size.first, second._size.second); // Perform row-col matrix multiplication with dot products. - for (int i = 0 ; i < _second.size.second ; i++) { - Chain<_CT, COLUMN> column(_first.size.first); + for (int i = 0 ; i < second._size.second ; i++) { + Chain<_CT, COLUMN> column(first._size.first); - for (int rowLeft: _first.chainsStates) { - _CT coef = _first.chains[rowLeft] * get_column(_second, i); + for (int rowLeft: first._chainsStates) { + _CT coef = first._chains[rowLeft] * get_column(second, i); if (coef != 0) { column[rowLeft] = coef; } @@ -1769,7 +1572,7 @@ Sparse_matrix<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, cons * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -1786,11 +1589,11 @@ template Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Chain<_CT, COLUMN> &_second) { // Perform col-col matrix multiplication with linear combination of columns. - Chain<_CT, COLUMN> column(_first.size.first); + Chain<_CT, COLUMN> column(_first._size.first); for (typename Chain<_CT, COLUMN>::const_iterator it = _second.begin(); it != _second.end(); ++it) { - column += it->second * _first.chains[it->first]; + column += it->second * _first._chains[it->first]; } return column; @@ -1803,7 +1606,7 @@ Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, COLUMN> &_first, const Cha * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -1820,9 +1623,9 @@ template Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Chain<_CT, COLUMN> &_second) { // Perform row-col matrix multiplication with dots - Chain<_CT, COLUMN> column(_first.size.first); + Chain<_CT, COLUMN> column(_first._size.first); - for (int index : _first.chainsStates) + for (int index : _first._chainsStates) { _CT tmp(_first[index] * _second) ; if (tmp != 0) @@ -1838,7 +1641,7 @@ Chain<_CT, COLUMN> operator*(const Sparse_matrix<_CT, ROW> &_first, const Chain< * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -1855,11 +1658,11 @@ template Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { // Perform row-row matrix multiplication with linear combination of rows. - Chain<_CT, ROW> row(_second.size.second); + Chain<_CT, ROW> row(_second._size.second); for (typename Chain<_CT, ROW>::const_iterator it = _first.begin(); it != _first.end(); ++it) { - row += it->second * _second.chains[it->first]; + row += it->second * _second._chains[it->first]; } return row; @@ -1872,7 +1675,7 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The matrix. * \param[in] _second The chain. @@ -1889,9 +1692,9 @@ template Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { // Perform row-col matrix multiplication with dots - Chain<_CT, ROW> row(_second.size.second); + Chain<_CT, ROW> row(_second._size.second); - for (int index : _second.chainsStates) + for (int index : _second._chainsStates) { _CT tmp(_first * _second[index]) ; if (tmp != 0) @@ -1901,13 +1704,13 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT } /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two _chains. * * Generate a row-based matrix from the matrix multiplication and return it. * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -1922,13 +1725,13 @@ Chain<_CT, ROW> operator*(const Chain<_CT, ROW> &_first, const Sparse_matrix<_CT */ template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { - Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); + Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); - for (int i = 0 ; i < _first.size.first ; i++) { - Chain<_CT, ROW> row(_second.size.second); + for (int i = 0 ; i < _first._size.first ; i++) { + Chain<_CT, ROW> row(_second._size.second); - for (int colRight: _second.chainsStates) { - _CT coef = get_row(_first, i) * _second.chains[colRight]; + for (int colRight: _second._chainsStates) { + _CT coef = get_row(_first, i) * _second._chains[colRight]; if (coef != 0) { row[colRight] = coef; } @@ -1943,13 +1746,13 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, cons } /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two _chains. * * Generate a row-based matrix from the matrix multiplication and return it. * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -1964,14 +1767,14 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, cons */ template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, COLUMN> &_second) { - Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); + Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); // Perform row-col matrix multiplication with dot products. - for (int rowLeft: _first.chainsStates) { - Chain<_CT, ROW> row(_second.size.second); + for (int rowLeft: _first._chainsStates) { + Chain<_CT, ROW> row(_second._size.second); - for (int colRight: _second.chainsStates) { - _CT coef = _first.chains[rowLeft] * _second.chains[colRight]; + for (int colRight: _second._chainsStates) { + _CT coef = _first._chains[rowLeft] * _second._chains[colRight]; if (coef != 0) { row[colRight] = coef; } @@ -1984,13 +1787,13 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const S } /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two _chains. * * Generate a row-based matrix from the matrix multiplication and return it. * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -2005,24 +1808,24 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const S */ template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, const Sparse_matrix<_CT, ROW> &_second) { - Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); + Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); // Perform row-col matrix multiplication with dot products. - for (int colLeft: _first.chainsStates) { - res += _first.chains[colLeft] % _second.chains[colLeft]; + for (int colLeft: _first._chainsStates) { + res += _first._chains[colLeft] % _second._chains[colLeft]; } return res; } /** - * \brief Perform matrix multiplication between two chains. + * \brief Perform matrix multiplication between two _chains. * * Generate a row-based matrix from the matrix multiplication and return it. * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _first The first matrix. * \param[in] _second The second matrix. @@ -2037,15 +1840,15 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, COLUMN> &_first, cons */ template Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const Sparse_matrix<_CT, ROW> &_second) { - Sparse_matrix<_CT, ROW> res(_first.size.first, _second.size.second); + Sparse_matrix<_CT, ROW> res(_first._size.first, _second._size.second); // Perform row-row matrix multiplication with linear combination of rows. - for (int index: _first.chainsStates) { - Chain<_CT, ROW> row(_second.size.second); + for (int index: _first._chainsStates) { + Chain<_CT, ROW> row(_second._size.second); - for (std::pair colRight: _first.chains[index]) { - if (_first.chainsStates.isOn(colRight.first)) { - row += colRight.second * _second.chains[colRight.first]; + for (std::pair colRight: _first._chains[index]) { + if (_first._chainsStates.isOn(colRight.first)) { + row += colRight.second * _second._chains[colRight.first]; } } @@ -2062,7 +1865,7 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const S * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -2077,18 +1880,18 @@ Sparse_matrix<_CT, ROW> operator%(const Sparse_matrix<_CT, ROW> &_first, const S */ template Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { - if (_matrix.size != _other.size) { + if (_matrix._size != _other._size) { throw std::runtime_error("Matrices must be the same size."); } - for (int index = 0 ; index < _other.size.second ; index++) { + for (int index = 0 ; index < _other._size.second ; index++) { Chain column = get_column(_other, index); if (!column.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] += get_column(_other, index); + _matrix._chainsStates |= index; + _matrix._chains[index] += get_column(_other, index); - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); + if (_matrix._chains[index].isNull()) { + _matrix._chainsStates.setOff(index); } } } @@ -2103,7 +1906,7 @@ Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, cons * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -2118,18 +1921,18 @@ Sparse_matrix<_CT, COLUMN>& operator+=(Sparse_matrix<_CT, COLUMN> &_matrix, cons */ template Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { - if (_matrix.size != _other.size) { + if (_matrix._size != _other._size) { throw std::runtime_error("Matrices must be the same size."); } - for (int index = 0 ; index < _other.size.first ; index++) { + for (int index = 0 ; index < _other._size.first ; index++) { Chain row = get_row(_other, index); if (!row.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] += get_row(_other, index); + _matrix._chainsStates |= index; + _matrix._chains[index] += get_row(_other, index); - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); + if (_matrix._chains[index].isNull()) { + _matrix._chainsStates.setOff(index); } } } @@ -2144,7 +1947,7 @@ Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Spar * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -2159,18 +1962,18 @@ Sparse_matrix<_CT, ROW>& operator+=(Sparse_matrix<_CT, ROW> &_matrix, const Spar */ template Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, const Sparse_matrix<_CT, ROW> &_other) { - if (_matrix.size != _other.size) { + if (_matrix._size != _other._size) { throw std::runtime_error("Matrices must be the same size."); } - for (int index = 0 ; index < _other.size.second ; index++) { + for (int index = 0 ; index < _other._size.second ; index++) { Chain column = get_column(_other, index); if (!column.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] -= get_column(_other, index); + _matrix._chainsStates |= index; + _matrix._chains[index] -= get_column(_other, index); - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); + if (_matrix._chains[index].isNull()) { + _matrix._chainsStates.setOff(index); } } } @@ -2185,7 +1988,7 @@ Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, cons * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _matrix The matrix to reassign. * \param[in] _other The other matrix. @@ -2200,18 +2003,18 @@ Sparse_matrix<_CT, COLUMN>& operator-=(Sparse_matrix<_CT, COLUMN> &_matrix, cons */ template Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Sparse_matrix<_CT, COLUMN> &_other) { - if (_matrix.size != _other.size) { + if (_matrix._size != _other._size) { throw std::runtime_error("Matrices must be the same size."); } - for (int index = 0 ; index < _other.size.second ; index++) { + for (int index = 0 ; index < _other._size.second ; index++) { Chain row = get_row(_other, index); if (!row.isNull()) { - _matrix.chainsStates |= index; - _matrix.chains[index] -= get_row(_other, index); + _matrix._chainsStates |= index; + _matrix._chains[index] -= get_row(_other, index); - if (_matrix.chains[index].isNull()) { - _matrix.chainsStates.setOff(index); + if (_matrix._chains[index].isNull()) { + _matrix._chainsStates.setOff(index); } } } @@ -2226,7 +2029,7 @@ Sparse_matrix<_CT, ROW>& operator-=(Sparse_matrix<_CT, ROW> &_matrix, const Spar * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _other The other matrix. * @@ -2251,7 +2054,7 @@ Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, cons * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _other The other matrix. * @@ -2276,7 +2079,7 @@ Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Spar * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _other The other matrix. * @@ -2301,7 +2104,7 @@ Sparse_matrix<_CT, COLUMN>& operator*=(Sparse_matrix<_CT, COLUMN> &_matrix, cons * * \pre The matrix have the same coefficent type. * - * \warning Will raise an error if the two chains are not the same coefficient type. + * \warning Will raise an error if the two _chains are not the same coefficient type. * * \param[in] _other The other matrix. * @@ -2338,7 +2141,7 @@ Sparse_matrix<_CT, ROW>& operator*=(Sparse_matrix<_CT, ROW> &_matrix, const Spar */ template Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { - return _matrix.chains[_index]; + return _matrix._chains[_index]; } /** @@ -2360,12 +2163,12 @@ Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const i */ template Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { - Chain<_CT, COLUMN> column(_matrix.size.first); - if (_matrix.size.first > 0) + Chain<_CT, COLUMN> column(_matrix._size.first); + if (_matrix._size.first > 0) { - for (int i : _matrix.chainsStates) { - if (!_matrix.chains[i].isNull(_index)) { - column[i] = _matrix.chains[i][_index]; + for (int i : _matrix._chainsStates) { + if (!_matrix._chains[i].isNull(_index)) { + column[i] = _matrix._chains[i][_index]; } } } @@ -2392,12 +2195,12 @@ Chain<_CT, COLUMN> get_column(const Sparse_matrix<_CT, ROW> &_matrix, const int */ template Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { - Chain<_CT, ROW> row(_matrix.size.second); - if (_matrix.size.second > 0) + Chain<_CT, ROW> row(_matrix._size.second); + if (_matrix._size.second > 0) { - for (int i : _matrix.chainsStates) { - if (!_matrix.chains[i].isNull(_index)) { - row[i] = _matrix.chains[i][_index]; + for (int i : _matrix._chainsStates) { + if (!_matrix._chains[i].isNull(_index)) { + row[i] = _matrix._chains[i][_index]; } } } @@ -2424,7 +2227,7 @@ Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _in */ template Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { - return _matrix.chains[_index]; + return _matrix._chains[_index]; } /** @@ -2445,10 +2248,10 @@ Chain<_CT, ROW> get_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index template const Chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix, const int _index) { - if (_index >= _matrix.size.second) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.second) + "."); + if (_index >= _matrix._size.second) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix._size.second) + "."); } - return _matrix.chains[_index]; + return _matrix._chains[_index]; } /** @@ -2469,10 +2272,10 @@ const Chain<_CT, COLUMN> & cget_column(const Sparse_matrix<_CT, COLUMN> &_matrix template const Chain<_CT, ROW> & cget_row(const Sparse_matrix<_CT, ROW> &_matrix, const int _index) { - if (_index >= _matrix.size.first) { - throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix.size.first) + "."); + if (_index >= _matrix._size.first) { + throw std::runtime_error("Provided index should be less than " + std::to_string(_matrix._size.first) + "."); } - return _matrix.chains[_index]; + return _matrix._chains[_index]; } /** @@ -2495,7 +2298,7 @@ void set_column(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Cha throw std::runtime_error("set_column dimension error") ; _matrix[_index] = _chain; if (_chain.isNull()) - _matrix.chainsStates.setOff(_index) ; + _matrix._chainsStates.setOff(_index) ; } /** @@ -2516,18 +2319,18 @@ template void set_column(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT, COLUMN> &_chain) { if(_matrix.dimensions().first != _chain.dimension()) throw std::runtime_error("set_column dimension error") ; - for (int i = 0 ; i < _matrix.size.first ; i++) { - if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { - _matrix.chains[i] /= _index; + for (int i = 0 ; i < _matrix._size.first ; i++) { + if (!_matrix._chains[i].isNull(_index) && _chain.isNull(i)) { + _matrix._chains[i] /= _index; - if (_matrix.chains[i].isNull()) { - _matrix.chainsStates.setOff(i); + if (_matrix._chains[i].isNull()) { + _matrix._chainsStates.setOff(i); } } if (!_chain.isNull(i)) { - _matrix.chainsStates |= i; - _matrix.chains[i][_index] = _chain[i]; + _matrix._chainsStates |= i; + _matrix._chains[i][_index] = _chain[i]; } } } @@ -2550,18 +2353,18 @@ template void set_row(Sparse_matrix<_CT, COLUMN> &_matrix, const int _index, const Chain<_CT, ROW> &_chain) { if(_matrix.dimensions().second != _chain.dimension()) throw("set_column dimension error") ; - for (int i = 0 ; i < _matrix.size.second ; i++) { - if (!_matrix.chains[i].isNull(_index) && _chain.isNull(i)) { - _matrix.chains[i] /= _index; + for (int i = 0 ; i < _matrix._size.second ; i++) { + if (!_matrix._chains[i].isNull(_index) && _chain.isNull(i)) { + _matrix._chains[i] /= _index; - if (_matrix.chains[i].isNull()) { - _matrix.chainsStates.setOff(i); + if (_matrix._chains[i].isNull()) { + _matrix._chainsStates.setOff(i); } } if (!_chain.isNull(i)) { - _matrix.chainsStates |= i; - _matrix.chains[i][_index] = _chain[i]; + _matrix._chainsStates |= i; + _matrix._chains[i][_index] = _chain[i]; } } } @@ -2586,7 +2389,7 @@ void set_row(Sparse_matrix<_CT, ROW> &_matrix, const int _index, const Chain<_CT throw("set_column dimension error") ; _matrix[_index] = _chain; if (_chain.isNull()) - _matrix.chainsStates.setOff(_index) ; + _matrix._chainsStates.setOff(_index) ; } } /* end namespace OSM */ From 40c2864b8c3d5fa6bc65c90f3b90fd489c1a6c3e Mon Sep 17 00:00:00 2001 From: Ume no hana <50943607+umenohana13@users.noreply.github.com> Date: Tue, 27 May 2025 08:35:58 +0200 Subject: [PATCH 019/343] Sparse_chain -> Finished Sparse_chain documentation --- HDVF/doc/HDVF/Concepts/AbstractChainComplex.h | 4 +- HDVF/doc/HDVF/Concepts/Filtration.h | 4 +- HDVF/doc/HDVF/Concepts/HDVF.h | 4 +- HDVF/doc/HDVF/Concepts/SparseChain.h | 1121 +++-------- HDVF/doc/HDVF/Concepts/SparseMatrix.h | 25 +- HDVF/doc/HDVF/PackageDescription.txt | 2 +- .../HDVF/fig/Sparse_matrix_example_row.pdf | Bin 0 -> 14166 bytes HDVF/examples/HDVF/main_dual_hdvf.cpp | 8 +- HDVF/examples/HDVF/main_hdvf.cpp | 11 + .../Abstract_simplicial_chain_complex.hpp | 16 +- HDVF/include/CGAL/HDVF/CubComplexTools.hpp | 6 +- .../CGAL/HDVF/Cubical_chain_complex.hpp | 18 +- HDVF/include/CGAL/HDVF/Filtration_core.h | 4 +- HDVF/include/CGAL/HDVF/Hdvf.h | 36 +- HDVF/include/CGAL/HDVF/Hdvf_core.h | 12 +- HDVF/include/CGAL/HDVF/Hdvf_persistence.h | 20 +- HDVF/include/CGAL/HDVF/SimpComplexTools.hpp | 6 +- .../CGAL/HDVF/Sub_chain_complex_mask.h | 4 +- HDVF/include/CGAL/HDVF/hdvf_duality.hpp | 39 +- HDVF/include/CGAL/OSM/Chain.h | 981 ---------- HDVF/include/CGAL/OSM/OSM.hpp | 2 +- HDVF/include/CGAL/OSM/Sparse_chain.h | 774 ++++++++ HDVF/include/CGAL/OSM/Sparse_matrix.h | 1728 ++++------------- HDVF/include/CGAL/OSM/__base.hpp | 4 +- 24 files changed, 1529 insertions(+), 3300 deletions(-) create mode 100644 HDVF/doc/HDVF/fig/Sparse_matrix_example_row.pdf delete mode 100644 HDVF/include/CGAL/OSM/Chain.h create mode 100644 HDVF/include/CGAL/OSM/Sparse_chain.h diff --git a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h index 4bda2f88edd6..e71ec03bfdd9 100644 --- a/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h +++ b/HDVF/doc/HDVF/Concepts/AbstractChainComplex.h @@ -29,12 +29,12 @@ class AbstractChainComplex /*! Type of column-major chains (returned by the boundary operator) */ -typedef OSM::Chain CChain; +typedef OSM::Sparse_chain CChain; /*! Type of row-major chains (returned by the co-boundary operator) */ -typedef OSM::Chain RChain ; +typedef OSM::Sparse_chain RChain ; /*! Type of column-major sparse matrices (used to store the boundary operator) diff --git a/HDVF/doc/HDVF/Concepts/Filtration.h b/HDVF/doc/HDVF/Concepts/Filtration.h index f6434ca62313..8a30a1aef87b 100644 --- a/HDVF/doc/HDVF/Concepts/Filtration.h +++ b/HDVF/doc/HDVF/Concepts/Filtration.h @@ -56,12 +56,12 @@ class Filtration /*! Type of column-major chains. */ - typedef OSM::Chain<_CoefType,OSM::COLUMN> CChain ; + typedef OSM::Sparse_chain<_CoefType,OSM::COLUMN> CChain ; /*! Type of row-major chains. */ - typedef OSM::Chain<_CoefType,OSM::ROW> RChain ; + typedef OSM::Sparse_chain<_CoefType,OSM::ROW> RChain ; public: /** diff --git a/HDVF/doc/HDVF/Concepts/HDVF.h b/HDVF/doc/HDVF/Concepts/HDVF.h index dd9121fa4307..be06001c396c 100644 --- a/HDVF/doc/HDVF/Concepts/HDVF.h +++ b/HDVF/doc/HDVF/Concepts/HDVF.h @@ -76,12 +76,12 @@ typedef Ring CoefficientType; /*! Type of column-major chains */ -typedef OSM::Chain CChain; +typedef OSM::Sparse_chain CChain; /*! Type of row-major chains */ -typedef OSM::Chain RChain ; +typedef OSM::Sparse_chain RChain ; /*! Type of column-major sparse matrices diff --git a/HDVF/doc/HDVF/Concepts/SparseChain.h b/HDVF/doc/HDVF/Concepts/SparseChain.h index ba914f78cd50..6a0ad9491bfc 100644 --- a/HDVF/doc/HDVF/Concepts/SparseChain.h +++ b/HDVF/doc/HDVF/Concepts/SparseChain.h @@ -1,981 +1,300 @@ -/** - * \file Chain.hpp - * \brief Namespace file for describing library. - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - * - * Define everything for the Chain class - */ +/*! +\ingroup PkgHDVFConcepts +\cgalConcept -#ifndef __OSM_CHAIN__ -#define __OSM_CHAIN__ +The concept `SparseChain` describes the requirements for sparse vectors (called *sparse chains* in homology) optimized for topological computations. More precisely, `SparseChains` provide all the operations on chains required by the `SparseMatrix` concept. + `SparseChains` encode non zero coefficients of (sparse) chains. + + `SparseChain` can be either row or column vectors. The following constants, called `ChainTypeFlag`, encode the direction of sparse chains (and sparse matrices). + - `OSM::COLUMN` for column-major chains and matrices (which is the default), + - `OSM::ROW` for row-major chains and matrices. + + +\cgalHasModelsBegin +\cgalHasModelsBare{`OSM::Sparse_chain`} +\cgalHasModelsEnd -#include "__base.hpp" -#include "Sparse_matrix.h" -#include -#include -#include -#include + \sa `Ring` + \sa `SparseMatrix` +*/ -namespace CGAL { -namespace OSM { - -/** - * \class Chain - * \brief Allow to create row/column sparse vectors. - * - * The Chain class contains all algebraic functions that are related to vectors. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -class Chain { +class SparseChain { public: - typedef std::pair pair; - typedef typename std::unordered_map::iterator iterator; - typedef typename std::unordered_map::const_iterator const_iterator; + /// \name Types + /// @{ - // Add these lines to allow the Sparse_matrix class to access other templated - // SparsedMatrix private members. - template - friend class Chain; - template - friend class Sparse_matrix; -protected: - /** \brief The chain inner representation and storage of data. */ - std::unordered_map chainData; + /*! + * \brief Type of coefficients stored in the matrix (a model of `Ring`). + */ + typedef Ring CoefficientType; - /** \brief The chain coefficient type. */ - typedef _CoefficientType coefficientType; + /*! + * \brief Matrix and chain type (either OSM::ROW or OSM::COLUMN). + */ + typedef int ChainTypeFlag; + + /*! + * \brief SparseChain iterator type. + */ + typedef unspecified_type iterator; - /** \brief The chain type flag. */ - int chainTypeFlag = _ChainTypeFlag; + /*! + * \brief SparseChain constant iterator type. + */ + typedef unspecified_type const_iterator; - /** \brief The chain boundary. */ - int upperBound; + /// @} -public: - /** - * \brief Create new Chain for Sparse_matrix object. + /// \name Creation, filling + /// @{ + + /*! + * \brief Create new empty SparseChain. + */ + SparseChain(); + + /*! + * \brief Create new empty SparseChain of given size. * - * Default constructor, initialize an empty Chain as a Z integers column chain. - * The default chain size is 128. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Constructor with size, initialize an empty SparseChain. */ - Chain() { - upperBound = 0; - chainData = std::unordered_map(); - } + SparseChain(int chainSize); - /** - * \brief Create new Chain for Sparse_matrix object. + /*! + * \brief Create new SparseChain by copy. * - * Constructor with size, initialize an empty Chain as a Z integers column chain with boundary check. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _chainSize The upper bound of the Chain. - * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Copy constructor, initialize a SparseChain from an existing SparseChain of same `ChaintypeFlag`. */ - Chain(const int _chainSize) { - upperBound = _chainSize; - chainData = std::unordered_map(); - } + SparseChain(const Sparse_chain &otherToCopy); - /** - * \brief Size of the chain + /*! + * \brief Assign to other chain. * - * \return Size of the chain (upperBound) + * Assign to other chain coefficient-wise, equivalent to copying it. * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink + * SparseChain must have the same `CoefficientType`. + */ + SparseChain& operator=(const SparseChain &otherToCopy); + + /// @} + + /// \name Matrix informations and iterators + /// @{ + + /*! + * \brief Dimension of the basis (that is, size of the chain). + */ + size_t dimension() const; + + /*! + * \brief Iterator to the beginning of the chain. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The function returns an iterator to the first non zero index. */ - size_t dimension() const { return upperBound ; } + iterator begin() noexcept; - /** - * \brief Create new Chain for Sparse_matrix object. + /*! + * \brief Constant iterator to the beginning of the chain. * - * Copy constructor, initialize a Chain based on the same type of chain. - * The resulting chain will be a copy of the passed chain. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the other chain is not the same coefficient type. - * - * \tparam _CoefficientType The chain's coefficient types (default is OSM::ZCoefficient) - * \tparam _ChainTypeFlag The type of vector the chain is representing (default is OSM::COLUMN) - * \param[in] _otherToCopy The chain we want to copy. - * - * \see \link OSM::ZCoefficient \endlink - * \see \link OSM::COLUMN \endlink - * \see \link OSM::ROW \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * The function returns a constant iterator to the first non zero index. */ - Chain(const Chain &_otherToCopy) { - upperBound = _otherToCopy.upperBound; - chainData = _otherToCopy.chainData; - // *this = _otherToCopy; - } + const_iterator begin() const noexcept; - /** - * \brief Assign to other chain. - * - * Assign to other chain coefficient-wise, equivalent to copying it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the other chain is not the same coefficient type. - * - * \param[in] _otherToCopy The chain we want to copy. - * - * \return The reference to the modified chain. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Constant iterator to the beginning of the chain. + * + * The function returns a constant iterator to the first non zero index. */ - Chain& operator=(const Chain &_otherToCopy) { - upperBound = _otherToCopy.upperBound; - chainData = _otherToCopy.chainData; - - return *this; - } + const_iterator cbegin() const noexcept; - /** - * \brief Displays a Chain in the output stream. - * - * \param[in] _stream The output stream. - * \param[in] _chain The chain to display. - * - * \return A reference to the modified stream. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - friend std::ostream& operator<<(std::ostream &_stream, const Chain &_chain) { - _stream << "["; - for (const_iterator i = _chain.chainData.begin() ; i != _chain.chainData.end() ; ++i) { - _stream << i->first << ": " << i->second << ", "; - } - - if (_chain.chainData.size() > 0) { - _stream << "\b\b"; - } - _stream << "]"; - - return _stream; - } + /*! + * \brief Iterator to the end of the chain. + * + * The function returns an iterator to the ending of the chain. + */ + iterator end() noexcept; - /** - * \brief Adds two chains together. - * - * Adds each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _first The first chain. - * \param[in] _second The second chain. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator+(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { - Chain newChain = _first; - newChain += _second; - - return newChain; - } + /*! + * \brief Constant iterator to the end of the chain. + * + * The function returns a constant iterator to the ending of the chain. + */ + const_iterator end() const noexcept; - /** - * \brief Substract two chains together. - * - * Substract each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _first The first chain. - * \param[in] _second The second chain. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator-(const Chain &_first, const Chain<_CoefficientType, _CTF> &_second) { - Chain newChain = _first; - newChain -= _second; - - return newChain; - } + /*! + * \brief Constant iterator to the end of the chain. + * + * The function returns a constant iterator to the ending of the chain. + */ + const_iterator cend() const noexcept; - /** - * \brief Apply factor on each coefficients. - * - * \param[in] _lambda The factor to apply. - * \param[in] _chain The second chain. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator*(const _CoefficientType& _lambda, const Chain<_CoefficientType, _CTF> &_chain) { - Chain newChain = _chain; - newChain *= _lambda; - - return newChain; - } + /// @} - /** - * \brief Apply factor on each coefficients. - * - * \param[in] _chain The second chain. - * \param[in] _lambda The factor to apply. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - template - friend Chain operator*(const Chain<_CoefficientType, _CTF> &_chain, const _CoefficientType& _lambda) { - Chain newChain = _chain; - newChain *= _lambda; - - return newChain; - } + /// \name Output + /// @{ - /** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Displays a SparseChain in the output stream. */ - template - friend Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + friend std::ostream& operator<<(std::ostream &stream, const Sparse_chain& chain); - /** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink + /// @} + + /// \name Linear algebra operators + /// @{ + + /*! + * \brief Adds two chains together. * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Adds two chains together and return the result in a new matrix. + * Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. */ - template - friend Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row); + friend Sparse_chain operator+(const Sparse_chain &first, const Sparse_chain &second); - /** - * \brief Perform dot product between two chains. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _row The row chain. - * \param[in] _column The column chain. + /*! + * \brief Subtract two chains together. * - * \return The result of type _CoefficientType. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * Subtract two chains together and return the result in a new matrix. + * Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. */ - template - friend _CT operator*(const Chain<_CT, ROW> &_row, const Chain<_CT, COLUMN> &_column); + friend Sparse_chain operator-(const Sparse_chain &first, const Sparse_chain &second); - /** - * \brief Add a chain and assign. - * - * Adds each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _other The other chain. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator+=(const Chain &_other) { - if (this->upperBound != _other.upperBound) { - throw std::runtime_error("Chains must be the same size."); - } - - for (pair pair: _other.chainData) { - this->chainData[pair.first] += pair.second; - - if (this->chainData[pair.first] == 0) { - this->chainData.erase(pair.first); - } - } - - return *this; - } + /*! + * \brief Apply factor on each coefficients. + */ + friend Sparse_chain operator*(const CoefficientType& lambda, const Sparse_chain &chain); - /** - * \brief Substract a chain and assign. - * - * Substract each coefficient of the chain together. - * - * \pre The chains have the same coefficent type and the same type flag. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * \warning Will raise an error if the two chains don't have the same type flag. - * - * \param[in] _other The other chain. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator-=(const Chain &_other) { - if (this->upperBound != _other.upperBound) { - throw std::runtime_error("Chains must be the same size."); - } - - for (pair pair: _other.chainData) { - this->chainData[pair.first] -= pair.second; - - if (this->chainData[pair.first] == 0) { - this->chainData.erase(pair.first); - } - } - - return *this; - } + /*! + * \brief Apply factor on each coefficients. + */ + friend Sparse_chain operator*(const Sparse_chain &_chain, const CoefficientType& lambda); - /** - * \brief Apply factor on each coefficients and assign. - * - * \param[in] _lambda The factor to apply. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator*=(const _CoefficientType& _lambda) { - if (_lambda == 0) { - this->chainData.clear(); - return *this; - } - - for (pair pair: this->chainData) { - this->chainData[pair.first] = pair.second * _lambda; - } - - return *this; - } + /*! + * \brief Perform matrix multiplication between two chains (COLUMN x ROW) and return a COLUMN matrix. + * + * Generate a column-based matrix from the matrix multiplication and return it. + * Chains must have the same `CoefficientType`. + */ + friend Sparse_matrix operator*(const Sparse_chain &column, const Sparse_chain &row); - /** - * \brief Get a coefficient from the chain. - * - * \warning The chain will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The coefficient stored in the chain. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - _CoefficientType operator[](const int _index) const { - if (_index >= upperBound) { - throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); - } - - return chainData.at(_index); - } + /*! + * \brief Perform matrix multiplication between two chains (COLUMN x ROW) and return a ROW matrix. + * + * Generate a row-based matrix from the matrix multiplication and return it. + * Chains must have the same `CoefficientType`. + */ + friend Sparse_matrix operator%(const Sparse_chain &column, const Sparse_chain &row); - /** - * \brief Set a coefficient in the chain. - * - * \warning The chain will perform boundary check. - * - * \param[in] _index The coefficient index. - * - * \return The reference to the assigned coefficient. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - _CoefficientType& operator[](const int _index) { - if (_index >= upperBound) { - throw std::runtime_error("Provided index should be less than " + std::to_string(upperBound) + "."); - } - - return chainData[_index]; - } + /*! + * \brief Perform dot product between two chains (ROW x COLUMN). + * + * Chains must have the same `CoefficientType`. + */ + friend CoefficientType operator*(const Sparse_chain &row, const Sparse_chain &column); - /** - * \brief Checks if a coefficient is null. Should be used instead of operator[] for that case. - * - * \param[in] _index The index to check. - * \return True if the data is null at given index. - * - * \author Fedyna K. - * \version 0.2.0 - * \date 29/05/2024 + /*! + * \brief Add a chain to `this`. + * + * Add a chain to `this`. + * Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. */ - const bool isNull(const int _index) const { - return chainData.find(_index) == chainData.end(); - } + Sparse_chain& operator+=(const Sparse_chain &_other); - /** - * \brief Checks if the chain is null. - * - * \return True if the chain is null. - * - * \author Fedyna K. - * \version 0.2.0 - * \date 29/05/2024 + /*! + * \brief Subtract a chain from `this`. + * + * Subtract a chain from `this`. + * Chains must have the same `CoefficientType` and the same `ChainTypeFlag`. */ - const bool isNull() const { - return chainData.size() == 0; - } + Sparse_chain& operator-=(const Sparse_chain &_other); - /** - * \brief Get a subchain from the chain. - * - * Removes all indexes provided in the vector from the chain and returns it. - * - * \note Will return a copy of the chain if given vector is empty. - * - * \param[in] _chain The chain to process. - * \param[in] _indexes The indexes to remove. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Apply factor on each coefficients of `this`. */ - template - friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes); + Sparse_chain& operator*=(const CoefficientType& lambda); - /** - * \brief Get a subchain from the chain. - * - * Removes the index provided from the chain and returns it. - * - * \note Will return a copy of the chain if given vector is empty. - * - * \param[in] _chain The chain to process. - * \param[in] _index The index to remove. - * - * \return A new chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Transpose a SparseChain. + * + * The result is a chain with `ChainTypeFlag` switched between COLUMN and ROW. */ - template - friend Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _indexes); + Sparse_chain transpose(); - /** - * \brief Get a subchain from the chain and assign. - * - * Removes all indexes provided in the vector from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _indexes The indexes to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain& operator/=(const std::vector &_indexes) { - for (int index : _indexes) { - this->chainData.erase(index); - } - - return *this; - } + /// @} - /** - * \brief Get a subchain from the chain and assign. - * - * Removes the index provided from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _index The index to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /// \name Access and modifications + /// @{ + + /*! + * \brief Get the value of a coefficient of the chain. + */ + CoefficientType operator[](int index); + + /*! + * \brief Get the value of a coefficient of the chain. */ - Chain& operator/=(const int _index) { - this->chainData.erase(_index); - - return *this; - } + CoefficientType get_coef(int index) const ; /** - * \brief Set all coefficients to zero. - * - * \author Fedyna K. - * \version 0.3.0 - * \date 31/04/2024 + * \brief Set a given coefficient of the chain. */ - void nullify() { - this->chainData.clear(); - } + void set_coef(int index, CoefficientType d); - /** - * \brief Iterator to the beginning of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The iterator to the beginning of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::iterator \endlink - * \see \link std::unordered_map::begin \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Checks if a coefficient of the chain is null. */ - iterator begin() noexcept { - return chainData.begin(); - } + bool is_null(int index) const; - /** - * \brief Constant iterator to the beginning of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the beginning of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::begin \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Checks if the chain is null. */ - const_iterator begin() const noexcept { - return chainData.begin(); - } + bool is_null() const; - /** - * \brief Constant iterator to the beginning of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the beginning of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::cbegin \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Get a subchain from the chain. + * + * Return a new chain where all coefficients of indices provided in the vector are removed. */ - const_iterator cbegin() const noexcept { - return chainData.cbegin(); - } + friend Sparse_chain operator/(const Sparse_chain &chain, const std::vector &indices); - /** - * \brief Iterator to the end of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The iterator to the end of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::iterator \endlink - * \see \link std::unordered_map::end \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Get a subchain from the chain. + * + * Return a new chain where the coefficients at a given index is removed. */ - iterator end() noexcept { - return chainData.end(); - } + friend Sparse_chain operator/(const Sparse_chain &chain, int indices); - /** - * \brief Constant iterator to the end of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the end of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::end \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + /*! + * \brief Restrict the chain to a sub-chain by removing indices. + * + * Removes all indices provided in the vector from the chain. Return a reference to the modified chain. */ - const_iterator end() const noexcept { - return chainData.end(); - } + Sparse_chain& operator/=(const std::vector &indexes); /** - * \brief Constant iterator to the end of the chain. - * - * \warning The chain is stored unordered for speed reason. - * - * \return The constant iterator to the end of the chain. - * - * \see \link OSM::Chain \endlink - * \see \link std::unordered_map \endlink - * \see \link std::unordered_map::const_iterator \endlink - * \see \link std::unordered_map::cend \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 + * \brief Restrict the chain to a sub-chain by removing a given index. + * + * Removes the index provided from the chain. Return a reference to the modified chain. */ - const_iterator cend() const noexcept { - return chainData.cend(); - } + Sparse_chain& operator/=(int index); /** - * \brief Transpose a Chain. - * - * \return A new chain where the chain type flag is changed. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ - Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> transpose() { - Chain<_CoefficientType, COLUMN + ROW - _ChainTypeFlag> chain; - - chain.upperBound = this->upperBound; - for (pair pair: this->chainData) { - chain.chainData[pair.first] = pair.second; - } - - return chain; - } + * \brief Remove all coefficients from the chain. + * + * The function comes to set all coefficients to zero. + */ + void nullify(); - /** + /*! * \brief Checks if chain is a column. - * - * \return true if chain is represented as a column, false otherwise. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 */ - bool isColumn() const { - return _ChainTypeFlag == COLUMN; - } + bool is_column() const; - /** + /*! * \brief Checks if chain is a row. - * - * \return true if chain is represented as a row, false otherwise. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 17/04/2024 */ - bool isRow() const { - return _ChainTypeFlag == ROW; - } + bool is_row() const; + /// @} }; - - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a column-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, column-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Sparse_matrix<_CT, COLUMN> operator*(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - Sparse_matrix<_CT, COLUMN> matrix(_column.upperBound, _row.upperBound); - - for (std::pair pair : _row.chainData) { - OSM::set_column(matrix,pair.first,_column * pair.second) ; - } - - return matrix; -} - -/** - * \brief Perform matrix multiplication between two chains. - * - * Generate a row-based matrix from the matrix multiplication and return it. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _column The column chain. - * \param[in] _row The row chain. - * - * \return The result of the matrix multiplication, row-based. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Sparse_matrix<_CT, ROW> operator%(const Chain<_CT, COLUMN> &_column, const Chain<_CT, ROW> &_row) { - Sparse_matrix<_CT, ROW> matrix(_column.upperBound, _row.upperBound); - - for (std::pair pair : _column.chainData) { - OSM::set_row(matrix,pair.first,_row * pair.second); - } - - return matrix; -} - -/** - * \brief Perform dot product between two chains. - * - * \pre The chains have the same coefficent type. - * - * \warning Will raise an error if the two chains are not the same coefficient type. - * - * \param[in] _row The row chain. - * \param[in] _column The column chain. - * - * \return The result of type _CoefficientType. - * - * \see \link OSM::Chain \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -_CoefficientType operator*(const Chain<_CoefficientType, ROW> &_row, const Chain<_CoefficientType, COLUMN> &_column) { - // Get indexes (avoid adding double indexes). - std::unordered_map indexes; - for (std::pair pair: _row.chainData) { - indexes[pair.first] = 1; - } - for (std::pair pair: _column.chainData) { - indexes[pair.first] += 1; - } - - // Perform dot product - _CoefficientType result = _CoefficientType(); - for (std::pair index: indexes) { - if (index.second == 2) { - result += _row.chainData.at(index.first) * _column.chainData.at(index.first); - } - } - - return result; -} - -/** - * \brief Get a subchain from the chain and assign. - * - * Removes all indexes provided in the vector from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _indexes The indexes to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const std::vector &_indexes) { - Chain newChain = _chain; - newChain /= _indexes; - return newChain; -} - -/** - * \brief Get a subchain from the chain and assign. - * - * Removes the index provided from the chain and returns it. - * - * \note Will not alter the chain if given vector is empty. - * - * \param[in] _index The index to remove. - * - * \return The modified chain representing the result. - * - * \see \link OSM::Chain \endlink - * \see \link std::vector \endlink - * - * \author Fedyna K. - * \version 0.1.0 - * \date 08/04/2024 - */ -template -Chain<_CT, _CTF> operator/(const Chain<_CT, _CTF> &_chain, const int _index) { - Chain newChain = _chain; - newChain /= _index; - return newChain; -} - -} /* end namespace OSM */ -} /* end namespace CGAL */ - -#endif diff --git a/HDVF/doc/HDVF/Concepts/SparseMatrix.h b/HDVF/doc/HDVF/Concepts/SparseMatrix.h index b72beecaa52a..65621bdc1a2c 100644 --- a/HDVF/doc/HDVF/Concepts/SparseMatrix.h +++ b/HDVF/doc/HDVF/Concepts/SparseMatrix.h @@ -9,17 +9,18 @@ Traditionally, sparse matrices data structures encode non zero coefficients of ( The `SparseMatrix` concept describes requirements for such sparse matrix. It relies on the model of `SparseChain` which encodes sparse row or column vectors. Matrices are either column major or row major (hence they either store column sparse chains or row sparse chains). - The following constants encode the major direction of both sparse chains and sparse matrices. + The following constants, called `ChainTypeFlag`, encode the major direction of both sparse chains and sparse matrices. - `OSM::COLUMN` for column-major chains and matrices (which is the default), - `OSM::ROW` for row-major chains and matrices. - For instance, given the \f$3\times 4\f$ matrix: + For instance, given the \f$5\times 4\f$ matrix: \f[ A = \left(\begin{array}{cccc} 1 & \cdot & \cdot & \cdot \\ -1 & \cdot & 2 & \cdot\\ \cdot & \cdot & 1 & \cdot \\ \cdot & \cdot & \cdot & \cdot \\ + \cdot & \cdot & \cdot & \cdot \\ \end{array}\right) \f] where \f$\cdot\f$ means \f$0\f$. @@ -27,7 +28,7 @@ Traditionally, sparse matrices data structures encode non zero coefficients of ( - A row-major representation of \f$A\f$ is: \f$[0\mapsto c_0, 1\mapsto c_1, 2\mapsto c_2]\f$ with the row-chains: \f$c_0 = [0\mapsto 1]\f$ and \f$c_1 = [0\mapsto -1, 2\mapsto 2]\f$ and \f$c_2 = [2\mapsto 1]\f$. \cgalHasModelsBegin -\cgalHasModelsBare{`OSM::Sparse_matrix`} +\cgalHasModelsBare{`OSM::Sparse_matrix`} \cgalHasModelsEnd \sa `Ring` @@ -94,7 +95,7 @@ class SparseMatrix { * * Assign to other matrix coefficient-wise, equivalent to copying it. * - * The matrices must have the same type. + * Matrices must have the same type. */ SparseMatrix& operator=(const SparseMatrix& _otherToCopy); @@ -251,7 +252,7 @@ class SparseMatrix { * * The matrix and the chain must have the same coefficient type. */ - friend Chain operator*(const SparseMatrix& first, const Chain& second); + friend Sparse_chain operator*(const SparseMatrix& first, const Sparse_chain& second); /** * \brief Perform multiplication between a row-based chain and a matrix. @@ -260,7 +261,7 @@ class SparseMatrix { * * The matrix and the chain must have the same coefficient type. */ - friend Chain operator*(const Chain& first, const SparseMatrix& second); + friend Sparse_chain operator*(const Sparse_chain& first, const SparseMatrix& second); /** * \brief Transpose a matrix. @@ -301,24 +302,24 @@ class SparseMatrix { * * For column-matrices, it is equivalent to `operator[]`, for row-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - friend Chain get_column(const SparseMatrix &matrix, int index); + friend Sparse_chain get_column(const SparseMatrix &matrix, int index); /** * \brief Get the value of the row at a given `index` from the matrix (whatever the `ChainTypeFlag` of the matrix). * * For row-matrices, it is equivalent to `operator[]`, for column-matrices a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - friend Chain get_row(const SparseMatrix &matrix, int index); + friend Sparse_chain get_row(const SparseMatrix &matrix, int index); /** * \brief Get a constant reference over the column of index`i` from a column matrix. */ - const Chain & cget_column(const SparseMatrix &_matrix, int i); + const Sparse_chain & cget_column(const SparseMatrix &_matrix, int i); /** * \brief Get a constant reference over the row of index`i` from a row matrix. */ - const Chain & cget_row(const SparseMatrix &_matrix, int i); + const Sparse_chain & cget_row(const SparseMatrix &_matrix, int i); /** * \brief Set a column in the matrix (whatever the `ChainTypeFlag` of the matrix). @@ -326,7 +327,7 @@ class SparseMatrix { * Set the `i`th column of `matrix` to `chain`. * For column-matrices, it should be equivalent to an affectation, however, for row-matrices, a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - void set_column(SparseMatrix &matrix, int i, const Chain &chain); + void set_column(SparseMatrix &matrix, int i, const Sparse_chain &chain); /** * \brief Set a row in the matrix (whatever the `ChainTypeFlag` of the matrix). @@ -334,7 +335,7 @@ class SparseMatrix { * Set the `i`th row of `matrix` to `chain`. * For row-matrices, it should be equivalent to an affectation, however, for column-matrices, a traversal of the matrix is required (in \f$\mathcal O(n)\f$). */ - void set_row(SparseMatrix &matrix, int i, const Chain &chain); + void set_row(SparseMatrix &matrix, int i, const Sparse_chain &chain); /** * \brief Get a submatrix from the matrix. diff --git a/HDVF/doc/HDVF/PackageDescription.txt b/HDVF/doc/HDVF/PackageDescription.txt index 9f0a5dfcad7a..a6d57356f69f 100644 --- a/HDVF/doc/HDVF/PackageDescription.txt +++ b/HDVF/doc/HDVF/PackageDescription.txt @@ -18,7 +18,7 @@ \cgalPkgPicture{pkg-small.png} \cgalPkgSummaryBegin -\cgalPkgAuthors{Alexa Bac} +\cgalPkgAuthors{Alexandra Bac} \cgalPkgDesc{ The package provides ... } \cgalPkgManuals{Chapter_HDVF,PkgHDVFRef} diff --git a/HDVF/doc/HDVF/fig/Sparse_matrix_example_row.pdf b/HDVF/doc/HDVF/fig/Sparse_matrix_example_row.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bc69bc24d4ba476a28a1febe55f526310ce2eca3 GIT binary patch literal 14166 zcmc(`WmH_-(l&}agar4-9lCJ~?t$RJAq_O{PH+hXx8T9uAwYt=6Ceb4hu|(jzh-Bj zea;?tzvsQkX*m%)s*VaeJG0`{yK!BZ*C7O^B zyR?P1GsF?VE^Q5VhDbt;?Mxs5b_Iy7nX@?n!~yvGi(M50HZie=D1*%);$UMdGe%vj<1J=#TeKRnT$Lzk!IJ*Tl-@R|yGAEF?YZ$mO<}`x>-;xOJS0xp*y* zuBq+7w3oX7!=x0p%ABKJW+yQJ1wD0SNZf6UY>()}l+h!L@ZnWzW=3LqE6#0OceLk> zWKPlw7Szs+?}h|NRabj$=T~U z>K~WTGbY#7`tQf5)SMO$C=w+xHA{CEq?KqsTIT1wej&NovLU1*=6+Fp?Tb@_BB&os zN3Zt9uFnGeshhNLl5}Bm-d$HFl-q^nQuTc?$!EIy-2hu?z3$a{~2 zUY_S<3Llmt39MW}Q*kY|fB4vpLlF~cbhS(tN8syw6y$povb-Atxw?^|5A9uOebKb; zP$hzuus&aL`)b;`pvVb>l@GS(Q_o?D;7RGsqxz7QYf|D!7M(K5Qi@%_2pY|V5ngkO z54-))7h)B4#)UTkorhMyEedDqX8t1Z*KmBuN-7CTDSCgTc^-S6D|ML&!I4z86*)mu zALp~Su%>)Tuj{*FsXCdfYrE*H4;y<9=KFflhMwxk)BS#JO#$nh44?fl4 zqk7h3UnJe?y`I2kik0+Q1uVaV7!X^i83?5n8*8o9{RQK5x5S@J&-LEJRHG2etpSwZ zA*QsepauqtN<@h<(6cH!h_r?&hBak`STQ8xq>Asp=3|~)3sUU!fFB6vOi-VqZb{@c zySe&Fbm{yOCKhtwQ@gD`8q$F1`bip_V|=kw^XE1#6M$um3I-5SL>OXe*}c{*FRG44 zkn@9|30ABKL6VjT0gSyXN6mEMj*v~h+{3i$claY*u+bpby3U%BPA-$T$_RunNgol* z)MJpVnHqly9L*Wcc8_E)8CiS2g!2qj_Y+cyAgzl$0lcTwSkVg`_>u_N6ID;7JQeI% zWrj%y23QL!3Dx2il8+4VG|#d&de@QjWyO*fReL=YZ%q(ghUc0pblA`f`!W=8PTkzp z+g?c9-AwB3&QXhYRUWAXsn`|g8t_IMD8wGaw^??M%KIaWY2TMnzv$GkY~g3{qq(j- z9;-}1ZZ*f9XE@$N&CmFHgZBp4oqGAZ!G1}c!ga>aId===;d8=o3z0l2OMO*Z)htFr z(ZUkm811%S#BlXLw4{Q>-sL4vbI_r)alImmZ30~XBzY^Yx%CZk43}8bqIdt>jjIQ?kVj0g4FNCyQ z@UmD**FGCX{6mGa?Q3=u%ay9 z58iDq9jV2Ppf|Z`E1Ix!HjdhtODe<0%Q|PXZ}lQ99oL3qu~DhOrY=StJu9JGknE1o zA)GI&bUIG2xAiSlbOtHfL+HkTA=&iLb%uDQol`QFvf#XP@`?4$@KE`j;8tOR6FTTj zB|u9sRrB1asj3wutmVw(2N(9W7>sXg>m5Ag!!A)L$H1ht z->sES>YDz8N=dq&8K+BKeIQr(SJr1LH8I+p@hwon*HDeA5)8r>K{R65D#Xd){em86 zbzO+|w~FSD6*K{QK?0}PI`NuG8VoI)Q4Znt#o&1adtohWbB6TxgDO9`!EfM^GVegh z7Ti$}7WQ$kgu$m2?hP>~^78UEdY2+qgYV&3-#tQSUhP=JszSS#U< zyK;I^ccG@n&+DYjt3Y&9hMH-#b3s+7C4{%QfG_Q*S?}d_b>9y=6G#)Evf*`-VA^~< zMecYrX5JqyEum}9)m-#xYHyaZL8JJC!MAJ&INoE)xbc^x9DZ zTH?|t!%|g@tp;!e1rRQ3bs+l<>sw%cHtNhU=HcLH4k9Za!54)Bf#<=Y0zKq!$nqw= z>^As0@#>vUAa0$oWlrgJ`HYr;f)4I6}su(Y#b@6z?&-#oKo-|7*ls-TLNWyTHz zIy^)J!bKdn?pcZ?lh?9~fFeR(m!YE2zcI1p^OGBy#bH&~3B*P~wVT|qaX#kJnRTMt zgr)Sds_?4U%`N|Y30I!3KcZc5mUj2ZOQirX7=t;>fIi9L+1>BHoq?v#VmT8r( z>hOA?ux(~0{)ZoU-amifb=l=4B*ei^5EB3&v`JO}N%oH<oz7aYeq7mFxQBZkdM|K>y072}v0<^aVB1$sO%Y_S zCE+IST3)846v_71TpqIdnKaF_v?w#M z7(7p4cNeDZl`6Qw+at(`8$Sa!BD49fqF5!JvHX=5Kby3jf7#o&n=t zV73v45GrR>@O(PiV)JLe>CH)v+Akvz^T#g5)er6pqvy34Q9uH}O1nfUSXynH6!X}F za?*nX?WryEUv0C?44 zZmyOo9RXlY5n*bVKAn*VTN}i6uVK)mhwtxOJHcjJu`&PTz0C};8*B^aze*W8ynQ2B zKp^5zEr-Vmk=iUMEO;gP?HdMG(x}P(753wLJHN&7Ko`rW%yxp4_dhjMettv^3N>$f zFXXQk!)AgOpU%6fmx!>+3j0812jjhN#IPX1OY!F(1 zYqNQIY^75)$GeB^8wzy2FxyoHF)FpKON?j}N7@_~qTJ;m>khaVG04tYXk7kmKsc7S zn52H3_V7ypm>@q{Z1_ZYHd#0eQH0N8!ZR>vVxSpV*FZ~qm!$ zh>$6;BwIrHUttZCG-iBYyu?t`9pa;f+i zDLGRGV|#S#88KEz&4@M2kWSF_BFqJgQ$n7heWtjvG{nt$B+72#ae+m$Q+PNhBxna zJbtI=oZ@H8IVyw}qPxkkNxDhASu?1L)Cqih&8bS19}yqX6cK&Kwbd}XK041+X<_i# z%$V?t$(G40fhxf?0X8AJL_x!D5_dAa#HK`P0%%ER3AUWIyq#n#jT|i;b;}q{H{^QU zxC_~>Y7Bi>e`9&kwfk~6o;a1bm6(WFgE)z+mzyZnHgzC%Gj*G*uhv`#y$(TVQ)j!* z0GN<+_)XoEwkDiEyS(C{kabKrZ?W`cxp7gAmRauWnh_lRI5u5gv9Eex)!f9DUa@Pj z8&;|uWeclhmS^U*$+YSE4z_;>%)Jd4OY11g4$E!>XMl58jj2mwOUIaUb#euJ`Ha6f zgq;Yl>(W()rpv|2MGh#c%}gw*zik|?9mTNPGN9e)wukmZ0yjdhQOLYq+=QOl-wx9X;At~=FA-`Kk^*mB*tW~5+otFFA5 zb=kG;z*{g?ziJV`>2=fSCDtX?E!`~$`DKWENDJ20jI%34Q;_%M^Sz&|^&=+{>&Wz; z^wr~Xh0E#MBa9=MBf01p1jhsutb~qZ4y*N~jUZm z(VM`B6Tg#ieJ_N{jiHZs<3z~D!c|7M?@_Pe?&I!;z-lBVDbd{|8{Pk-UnV>f{}sNQ z^ngr{)TE4}l&4gZ)T<;d7VVl1=?I+&K*39V3KBd|8dt~Ss~?N6Le}@!(AE#xIQ0^1 z_U9byHj9TwD`E^gpi5hF5(=_q?8i`?&f-mligUvTw@rlU_@G@pfSm$Zv9YWxe7Tvxpg=tvAPwP&xWV|8^s@EKISrV7LOGVTLjf!*N%(Rg2Sqq z^*LYCx3G6{NRtNZqg7bF|ef-XN~B+QK@bi)Gzojc0wZXj)TlIiEyjFm_=y zv=+9eM7t2Tx2)~0`D^jpWza!O{$>8H+lniS+rr{b5ejIZo@SKA0_|ETHiIrQ3i(4tVfu4$qxN}=H-{~I$=85 zQwvj}U-Eb?JQX~bcl^fF$wtUnMbaL<&Lb{UQfmgyUX8|%;C)Kt&vf%S74Ln25*|tr zBB1Fk+*rHuBfX-kVrj@fsnX!2!LfM0<@Qb^sno23UtiEW-Mi%=_&#!qyeT8maNoyb zr|!t6WyikeK5@M~suj_D`$qqked)5%do$`WodiA{>E@8F)$`F{;pL9^()}26@iPOF zZ}0f-&F_u(*K_F6l$bI~M9S|cucu9mTh8~hrr(a%d@zd+u9skcO!!r))P*=&JjyIx zE4?dIE;AbOD`N3o^?A?nP(;%B`ujG-RW#hx0bJh&Tju9 zbLIbcUiy@`N<;V20PJE6r-L$~w5f69PBJOFkz7b9m6duRfz?&tzh z|NZHYd?f4%=%@^>o_4=>>9{oiE%eeHje z{A)DezeoP9<|Cc1R9SC^RmK)j!Dy#pL#Q$qq@P~Q+wJvZnhHha3czJ

zqqy)ZIt< zuNs~S0OidAh9n`OR2efu&xNPM&$|mcX51X?6@}Sk> z+ke83kG_4wKA7eRwRw)7wpgB)DA|gmTCzCyM89hYIR1)zH&bEky8HO0;>w(C!hX`l zDc7bD`}?;iwdz475UlUtFA8kSq55Qk=`wifQ9_TO=Ff)S!{MbKxa)b(?h!7=u#9hK zoz~)PQA8p8PT?VPqyv}v@E(3V#1H^CW@r8^@rFdI*^@`kl*S8ML)Af@1W>9|ek#0Wn#KPagS)ZvyJu#U+^;$w(XS4H&I7j^b$4%= zxKZLKbJ-vD(aZ#r2Cggt*GE&TQFcT$q#q#A1Irf2lzIe2z{hp>7Veh-Sn^xr%rIUI z=3dko4*<^#mXr2DvzdtRmBo_d_VKZXI22Y)eVrD3=OrY~CKs|bsP~ym=Wtfj_g(yN#$q1$_cY0p>|zAD`|5ZP@5)2){FVoXOhBz zn|P*dg%IHX2UVYIP0Sh4Fw0Gx74Sos6)%M+!2$|0F!A~=`Xv#vDPH#w2or{bXe7kD z!xCxtc^2VA0fTFfjLhVgQH|^o1E}_&omI|W^0l@O#ESNtgskO9)oWDCBi^cG4Ek*l4cmCmA z{0SluKCba8uAhNa&BuzbzfX|hskw@Rr$P*;s>g=1W7AhaqdFc_!7=biqbm*@>%mtY zk1G!cQr3bgcO7N_Nn()#2q}yY9tFJxFFKv+kS-<78NGMNqi+Jd zK*=9T4-c1*V?=XW$--`#d|wd9C;ipOnOe9_!1|s_T1yw=J+`fK-KV9k-ZVTedvYjM z_P*l$OuM9W&}#$K%h$#+l4Sg>%S+Bm!8X-V)>>xse*ob?9>3GA8PqLoFia+sA<1Ms z@uC+V_yBwveE=}iC%`Zn2!vrg2n-Av=m7+nz@%YNOEa?RnZ8x^t*TC)dtM`w-|xTN zBO>$UIaPfs^IW%Q#@@c&moHzw{O-$rc?Io+i)OCo68!qyxlpI&ucovEkMEHKBL^;t z1HHem^(yPC{r-|`X;QcOb{Jz_++rgpyHxN$WEg=9|H9`%y%&RUt1-dKQ#bH2_VrHz zomb{mJvV-lT%K`!zg!^s%lL~IZIfDLq?wo-y|@!)NW8qLM@(-J2dbP}A}t5}X`wK> zDO8iOvxU>&MnS2uca@%$HLekQa=^7{lsWsa8U5H6n_!(&W{pFwPEPoY0Du47D4Oee zoLyv%WH#(hZZlil{;hG3=4v=F3aYP$uP=<1E2_sld13C20Y?s89S0nsDWvWbva5?} z#QZWj;J`;=HEr+9jCPFcE#m;%P=;@O;~RhSmL+RU&MV-+Y-{$Uge=aHoOEpvQ8P0f zoIsVo>j|uwXX4gj6#_b(WEqhK^x1ICLdN2Ry96gJSfCJ>|qT!aY_U znSya5mC0MCf==}O8Grj_av0%b7m^f6e**bjV|tRL_U^z=Bz3Qdy6gD9Y7S%qF5k`P z%Jp7^&P5GS^2ZmJXLOgfAON!912$m{tA$^47r9Om9L5U|1i-Z}zyeiP+N!KjbTLF| zaLTz0SO$);dK+PpWye3t`;>P0=92?RZNjiHad7fzSj>Mm3^y0U%||~(jVbyDh~rc>;i+$`v`4k63;QhGgHVDn zE|gSSlPqbDrF`-9|En1{rHD`H9!9=&)7|5G86O&!`X0cZ*RDBob~> z10x46n*;Xh^!sk2q#ma#r(#myTK%@>xvsUf#inJhk5^#5&|d}cKvP#8Q+)Bfl(-W`8@qv7{?RUUyFTX;E@AY%7IM4t~7=b`OD^j1MjOEe823p zjPboX4xm1M`SUdYTR6bI&j%64ksv2rPPx|8t#vBvWNA&PT(3~{(I;ay zNvpd}=L&#MZw!aa15_6)bVFdh^%!}L>UI?Ydcyg7CTmmV)u&NonrR>(#;l-YZTdoF z2&+f)TtlsF62EC0zD=jm{t`G~hO9D0I~n6F-2CZzoOkouAgO}!Y_c^4wmEGfOoV6+ znDBvZc;d|>LM?b%$`qzahL2kGDqPZ0r8k&D*G9k0Vq3|k6<}iLq;roVY5@5#UKH@M z8pnbcDwChw|6+Lf`LBoR18z1xIplQMz2W}RuZPc0J|6D;!R|1>iJVysJ8xHC2ctUHZBd+7)t8gGZWRuF#!2_}x z%?);zuyujk4(-Ox>2*%m44;1$TqDfLftSevnvZ`)e19YDQ?*tXM^Aa4(hj*H|L4E> z`SAX&+X$+!T^zzTgkS1K+SD~l+oIm)tX)Uj$bpdqUzY=|OD{Ckv-IbFVUOWeeLN!p zER&26aK!&)pHtC#(r0CiX$O|EfPgK0VOc+oqx~kioEO+0W)1bVY{)*^+_cD$ls#Ml=_JD#Y1QO=FwMh=V|7&$O< zVC2B7;Q;qb{-eM9cmHk^<-8gi##rAD4qV@v@8?AI#{6ov=-1~>ee%V(i-JzvBA6fy zd*5LM9!NU;W1}#u>D)uTxW#EvPJo?qf^>?|8aP9u0GtWmZcbpkD|yNtyxw2t>DATZ zg}98HN8;O*qI?%Pqe#- zPmWN@?M8U;Z_QPmjNlrTyr&4H2g>yvf#T{JpSeI@bok8 zI7XGJ>Z7mm+uP>8Yt@7k6L(x6Eba|IpZxRTTZeyjm>+Hrvuw7vmQX*q>)jLI)9GVm z>bt2ql?doGF=FwR9smop{Vv9!3DU#0ilY0b>D49}zJ|oaYs2k_=2{Eb0X}I-6B(6#Esxqlp__~R^ z;ac+;2mEzj)e-CsaUn1~ztj&QBe)I`Rti9&lkyab_zZ4Oj>oXztcDD<2S~HR>MhFh z7TSR(tWMj1u>B~IvPYOQ&{QkcI#x3E=-vf1J}=+^I!aOumZzv;KiVI*7nD`hv!9@f z|IYmV;SS{z^W=h{qtnQNSIPm_7XQrCmG-y2J+k&!dzn^h)f(8h>vH$*=XtBSA>#&9 zpa;gV3c%8q(1wY-yW{15+MslYJy0OV$H;+^17DW|)~{9-Q=c6!_V2=7l`sdcamW~h zvB9ZVII&UL@w8W|tV4;QFw{`N81%-C|F~sLg1h6C23tTc_S~emRDYwj$cQqLZ8!yr z8}A-%++HlsG1ObY0rEf7Ba5tslg+Jrx4iNxgY@)iDMA)ue=#-p>BZKuw3|H>9{bXb zpBmvUUzp4lTnE7(_{>F{cRIG|@X_?c;pT929P@=^SMwMJ)mOvU7sfiCsD5GAjR8jv zj2sv_@Io9w$XEm97YaQF8acqC%yjw>M?Q=kxC{==wzm!Vn4>O%1kmeNX*77>S8%~6sFflvg&R*0RpG@{qtNWM*$DKhH;0pb` z2X@LGy{d_eYOF*AA)uQuLsURin04wl32nq~+M2g(4K>-r!E^xQvxlygkac*xM{@}r zND(0a!uw3FD<9;3i~zB=cU#D=1tap>EYUySJiy^%w-TFzaq(L?0Qs%TVVm)vMxvaU zf~4ng2_T`1MX#uvSB>*Zl{26nSA>H^>OZu4xB7feI0VZJ%IE3wcv!F#V=+A*j!vHp zhmRf&C#ZBg;eO2%RC@1zQkhnHXSRkATDF?j`_H9`xL9pmsz(k<%Cn1Ar#Z%H=P!w=i-*`nJ?op9dINZEn zQmd-hZfKHI7=B?wP)g)B=}`ijO)x(Z-?Uc>?0sl~v?0JeB- zb4`Y)|Cf}@t=Zl%Jdl^Ce?GYr)esj2AKgX{yfO}KPq%-D+MLvV+oe_8w4$h56i+t# zvrUM~;MP#-n=a4xr-#9DL3^8f?y)azd)*t;!x)J1XkI2I!>7R#r#^+={&0Fc8SZS|JHTl) zSHyu)P<=&=eNnVjlG+0Oq6o%tBL_wfj2sv_@Rc~=z{Q>5H*VZOSTi=gUx{fW(1jd0 zIXU^iFZ384M-Kds9AFZE6!8UfEhkRSqs|+J#U;=H25V+yz&Y{qJBtiG9N#W7Y|VBv z?N{J^qOh7p_Y)S~r_+Ze070lYL8a*ym%z?gh|hhgEJz3s#=PBBygY$IaCY=HC2SOS zM?dv=$_UUsGEFQ9<4D*|1WyGX9e!61w7fG|%1Oe*WBylOTA1N?fpgxTp6CK-y?d5n zS^2L@Kqra?fZ#HKVf?1RWP7`d0v61IjXNrjmz23B_q=-glbgoyP6^HefsigJoFI%o zJ~?261zG?W+_BE7W{!kV5T)6BdJ$BEN454x$NQzyjT5&XyPhaWI=Mc~XE%r4tq&1a z^Ja136uI*$I8JvDhbK3F!yQB?l4Dn{)~Ivr`s;E zRXSH`l}0iI#V~@LlHDRjX|imHm|4fZ3Kz61NdQk zv>DBF>^<0XK;k8d`B6M9B1N-2ZtliO#<+22I-3vMd#Gh+qk=^s%%JSnS=T~PnjnI@ zrL!n@b3}yHn;R25kv%elb+@%;TyZ0Ipj)`5WVtUyUrVD#4% zKrAcnx{#*OIv_4F7pyA6H3=$Tbe9ewZ1We#Y}{Z2#x%kv;ea5FC(ISn3)fJ#cvq2& zb~Ml7z~Rxs@MQl1Z9u7;v9d_-y6=hh$^Y=2;G@^bfmgh2fY!FX5_%gflJ`PN*MQ5aJ4apW1jhoyR*e-L^G_LPl=dvg zzZV(nG5_M>KcgAv1#HrCoF&e4`;-LbsmIFMySp#pCL*H4^`Pjcd$r8x8? zK_(hXh{M0MC64))biR!H6Q|DNGpu;rI2eR{<7}|eyk#6nIV58(%Vw}$nAwhIt!#eA zo_VLqX6`q!Ojr&qBbGZqQV*POa<4URY9Mkx!9-ZMT0P!kpr&@2P~5aqtXe!CM1nyTmlCi zsLbc{U^0(KGjiZXIB;}y^vR2a8^eqoIM0Eb!;VXTHA!lonJ_s?>)#3|;O zeD3H3LAI;)1cjuw9@$BYTbj~Nu5TPNDGbGxwvd;{D(GmrY!1kKc$_?Hyw2iID>s>h zn^|^!DO0|HC*KPWcl;HarGE^ZNG*FB{1U$2u`6WLEe3nyB8&^$E#6aB1QrOOPnz)A z6#}9K28fNaE!+uey^oGjw~G+^=wzSuga;{OTb%mmd@Ynv7KzTgVzan_-TT+G7=N&f z3hx_0+~j>{*gd*6>^;1OAa9#ujR5@ME>WKjN7o+=iy7+;)V%2dLZ?U5;pov~_|5Xi z!>v<<-;Z{O-JSP`55N6;Mg^JFvc}KUFleuZ5d7qqY0tw%{ch&s5F#s|l|Pm>pN)Sb zo)!3}WB121wDs?ecLT3{!ad&`IL?1>1by22tVqs7n&(7i0pPzv8PVESr+0v(ZJKd{ z!sC6O|^Q5X2vVgsbwd z)qF4JSH3@uCjlC6?VA3suk{o6L{6<))gjB8L8z0Y+cyd24Pd}|hc=VVX-I@d5h5jy zO0#Nu-HaKv>V%OOhA~*ce2?b295_N#gDSuG?(C)t>c3p+*G}8Q&Y#IC+DEQ$4ZGju8i5B0qtGU@q&;zi zmP#GKkfx6Fl-T&QJte&B{I*MK7*O4?dIdl=nvnw|2d;tx)Wxr2YV1vYv`*%aQ861k zhq>bd>M(1X+y{j=1hF|F5U|Du`8G_(H{~C1=Y+U9ZU#EIGd{_e4#GB*@jS2!3`K2F z$1aXh6jV3Z%nfNv#HrJi@!ZzwHG|(65V*#@f}DciwENwro7%_|BJu zm&t$(#x97^g+K+=huj5+FpBlDu}`{yO>d-A7L+sKc_YamiGEEuK-=-lAO7%%wF2~- z&@__qMst8OpBu(DO2J{xuQFNkgq*@S-*qwum?pT$bV>wF-ZJgaVu5orrd|od9lOh0 zoIG6&N1Qr6Mg8~I9;d?w7T{5Byi}zrOOj6ZvPR%yK)O8_95``$aLB@?0>TY*hTx5l zX3hLia3_GcWnm(dLFb$`@!JTsfjEKAefzn>c!A#wI;{xU#N8b?-JXa4BDjv@e7N(l z@E4G0L9auf54Rbph3+pGmGtI2V;u4_n-AiEhrG`s5;$8qF=JQbA)FNmD){PZl`{r1 zjQMBTIAeqrmyY7*)O7o{ECz4zaRQpt(fdb__&sLR#68O6qYCCC0vZ4ms?~yl_>7;j z$_9%G!s)H)-Z1Ch==tK>usuN)^n}f3z@I=@U&EuccZQGl|MGC}!+$b7-1>M}evUx;@Xm1b7)=A5PMt2M!@YZ-41e*nzZh=Z{Pys- z-~W$M`%5}htISyN)YT5hgh`Vx;;^!`^q=R>IaaMc&5pCCJD7HS_^i^ghHB2uVFO-Z z^QFY$bXq-=U*R_sq`mPbh#G9lvbdWO^U7?vC+x}ti+=4VwW6=E zlmZ(|4UY9!pLq%t`h7QR;^{G`wv-16H+%p^nH4rGX$g;dPF6DQCtPB~u<&+58*fkr z)l2T0-DXp!b8Fjm#8d*1T;C1A{bh>?S`xpU|&z zx~#?ndEsx%QthjK^O8-AOWGJWF6M+9`bheCF384)<#j9$BTerT2k5A(d#?(fG4(d5 zNm*wsAgbG*D7_owf(P3Yq++6d}nMODb9;n&)u9g_|tiTu|PQS%mof^UsH0{_>a1?=}W<&%rl(y%`*^eR0t} z1L_O%{>@0mNad^M0IK8vvsX>S82?+vfnygFoNOefpaL8pTg?xVP}g|r7To#accVT)uOf*tbUS3OqfarFY~+;Ojf31O)d z!UZ%bBbw&^Rq17M1QpH4PY#Cd9Tq@cEZsEubi%ml2fxm!j;f3mhN3{3FirbbHn<~YvD_KXLUvNsNFOOEK7J#icVpeJQJ~t zKK_NSMu3y$I$5uPN*MTvB~xhLr^9}g4^W82QsF(%GBM+8?fjw!n-j)m#HsR5=qYdB zBClVjDOk1VWT`t6GVGLrqJ=UbEji6knM8QJ zHATHM`bp>fazZv?zze@zT=!g;r={hO0yxzy>#BgdgvQdsH;=8P0}4YTpv@2^lUzcCyga?1K}pK|$_v?1u@gz98(d-&e(|7FIAd&6g6{Al>SZ~yhs zf3j46IB_{HB$KRz{w=9fyuy#r6P{GQg>8ICcn{4IB&V$>rlDmkHorEEX{^9F3cL0< zw+r5P`L4XnDeh+<6>9DFOu#h=wv?H#26`skb3aJ?;;`BaRl!d@6`VGL^Ly~sHpS}( zW-PAeG&RVU$7;c$O(Oqj9;3>A@Ay09A)9b!-qj2*EpjpqfB9-r2k|-$rlYg5zzSA) z;qbQdS(Y?bSJR(Qkfn{*Q#ac>@mcqLlP8lbYGG~Rbv6; zuR3I#+1rD(U!+?Ksa2dZ0nVzDaA+_M zVv~3s5(tVd|}VIops!aX~)$^qQrb!zDZRgYXoz0a1!-CZ<5u+Tq2GsE`&9vdZK z{Os|lRp-sh{db1ilcPtEW_z}$6ldCi^w|iSJcwq=Us~_&gYlm+7UPzffgNBusb+h! zGO-#0LxZ@azdWHoop@D@PX6iL+b!WnGjd?$z$@W^)!I7g7$7EZ>nJ@M&f9EWJ7H|K zaGZOt&N?>8rc}dhgiAelFhqapcsv_jt@DB7#b4so?FvkxO@u@V9V@zVa~$q>C;1BE zA5p$q4w&;9>$bOZFUx`RK#O`hqAH&4gBKpvk1-Q1 z!|rX?JLvnk`D|^#YZ23|RDY**J1?iKO(*}le8=ZiabPn$t}2cZ@9)3?ItFyujm8tz zQP0*}h>;~D2fhLaEHlqC4!G{!yH_3BYGC79&2;$m(@%$A{Nfj}pAT<1Pg5Tp9OPv6 z?c2A9y*<>Y(%EH@bUwiN{l;+MgAYC!zWL2>CLhPVd}FfhwIbAVgX;Ky{8|w;67!~W zAo`>tGjKB0rdX>)wTV+EWjH!aa(8fPeEvI_b0s;$>+_%dGy)3*Rq4|wF zdAZ+rF~vTAOjs7+@pH!J{l635lR2S1orgdsi};|f38Irjes;ahiY;!Dec)!?#w%D) zP3}d5q6vZ*Hu4v3mEZ(lJy;MieQN^}O%hnvFMVzzSm9b(D)?%Wi@Ur^G@+WPq(S0) z7$?U1X>{xEamb^hZ0?+VEOb8GFAfTqTX^2nSusLxRRHrYj83>D8N}YZ?60s3tyGR* zjA4U3VQRAg)&MtpgforszD`LSFJYG6VJ_aHX@US(!J&)VY>fy!K)6v>P}}VZ497>R zzwP(jRXGC(_?Ik*AMEc3cb(*yG|E(j%&KbEZu;P7PXC)0eA!4bud(QtPr&1AZyA_D9&TMzVu~F#KCuO<^2$ z2WV9cb;d6xI&mk6j+l6s^|gPt^o34S13%NAR_d$JO^5ycN5jMWpAFj|SWc__c@4&s zyPP83AtQF)d-&QXbtLeelApw?{K_VC2B7f;}BYP%N)<9q9B4Jp5hB$d@{@e7W{GRO+|JF7WCyljYsNwTZ5&=nRuYf z&w_}{_;^b=(2CqDHR)@5LEQ9=oriDBv@pDduQGayp!)uB#Qb#c!|TJ|2iMRl$GFao z(5tf4?Dly*jv(~YO`g=B)7hV`h#4(c!humxeI;ytaimNl$2@_3o1Nv0b8`&&HgdqS zaZ&m3wDWI%^P32jFYD8Sf8y}1D)611o&0K2c2TI& z?RDqCwQJV~Hy&J6US4Ic33y@6cAD@i16{6^2G|9|r_$%ar7o3%v+E zpqPO1qX}TbBv^`Z%+Ir-!~SG zDrWo<{zc%7N^RwUOH^W)y5e>`9^v1TJIojD=c#L;82=oyXMr*x&bIDV(kt^t+WY}Z zTIQ#>$#Vo@5l(w{*fQ6I)xP0{X;K*M{kn#Upa=oAZ?mD3Uj4Mx2e}boYj$4x2gX48 ziLLp|a=z*lHwAY&ic1*m3dg70d&3T8eT#CxwWMC0>~JUTBht$WYtkEmJa^`O@#rsx zVC1Gd$jVkb~XJ;$=V5Q z{;k}#@{^u7!APd%H7C+Jm0snl(qlSgp+#zj@FXf~TcUcM)6XzrcsQVOae;P}E+7|0DZVIR#A3RRKY@6F_hE<{JxNXPj@WIVH!)J$&hWktEKm^s* z7X@Dr)Z$1)<74E&$bpy6fz|MY3U9yffWY1=T46Xm6nY6;%^HMGs^IdCV9*HFJ7`@R9|3 zXLQaHv+KS`>%s=B9{G!>V88-52GSC72qzBB?%1o1+xR2Fj(2g?mA{Sg?4Ng)GTf%$cC85?-ajlp#((Z*#iXpZ2W? zpoy7;FT4}8Q%af@CR#ppiy&7wz9KCXF5mL0cw;^k-2swxOoeDJ>(`2A(Mb(lJH-cusYbo+qbwQNa&5_!g)~KRvlOJbe6!`~4ma2lJ1H zTRR^@E#pVhYyC7{7wzk)NgH#LF4N+@@5X6T^9J6}q6^E0kq6H*Ri4T>P&|rfV(Q_} zr1n{;UN3i;k@^DZNq_i-ojbvIZlIcPzSd-v^qSOEO?ggUo98n6j9K$UUTX>_F?0vs zop0r|`V1`w(j6GyM$w^tcP~A(cRxd1rb#><;&B`==h2c>%Lb2IgfDzF)D+GlU>I3 zhm7@)?AxmEx9_Xok-(W}Se3E2ie1?Ga2x<){~Uuc(5DgMr~4(Fj#0{-7rRd{#_`Yw*V=BzY@d6K%%8>+k; zfS+|Eh25YHNpo{kCw?F6Gn%X8z$mD`I^MnzW+szkp1cs}#z1cp2V68!z57Mx;lqc+ zC!c&W{OOMx31G??x6aO4PwVERDf_Y<#aVFVV4X^QEty7Bz+uz(=AS$A}pHC z5ojpL$SGS-;fc>5F}aAzLWOr@dk3|G)cPyMyr#g#5l_+9RuPW0lWxylUFXL08{)0i}1z|jRDgh8|l{}{Ba?NKPSotjC(-^f%qg6^_hC- z5dPK?r<&f8c&E4uMDc^I`2%AWieiX_Yt?i8b%~>4N$NYsurld zI!u4#oP1HmaemOLBtMx9kVv7a@{clG$NzDbr=|*_9sUZUJb`w=-LyxisKw{|n78Vs zk4_#SxI(@8;p5@v&IiNp{08`Hudyo2!;8dMwGW5Hns_(LmhRSJDeC5;B*t&kV>3Vx z_$I%rpeO(3v+F@gA_c^;|84};#i-P@@YV!Zy~_rf)D!ZMzZI*1^Uor=Y0ead?g32P zJ8t4W7py^6IX#k zYt;d6c3|P|aQ_K+SkH%@UG9kAq3%n8Krz5nI4Pv}VCJIew3!qfls zFaDEXEGNg`b4Q!48Y8e(8*8;r-A-Me3`cDI|H;4k>G0^UJ!(8l%VQH0lX_13a%*6t zBUf}dmRQj4Y$??iM{5(x(nGbt<7?!=$bpx`0jgfrT;C1@sF>-zYs}R9X*CIlDVj!aCW3eVCX_9U!+M<0r z9);E6%UkoX+_k@yJIbvpxKjXACV8a1S|YJ)eEC@qEgADp89x`SVJxqfngCWv=V<=; zb5n<7L3>RDrM|FmVE-SH^*hB}G>j-H3v`_OJi|KmbWZK~(t5I6x;b=E;{a zY4m?>IG{lIqSM3*aJ}>Sh=q^Uz-EJL-M{$a3p#=76gIpfY&QHwYPyAU5ONXDO&l-7 zE)7o3?%utdQ`M;d9o~EIz1N1mm%)QEj*$cJItOS6{_A(02V?p#oddZEItvVK_0S1Z zgbsbu<=Q#X#$D)q^r_j?{i>6&T%`-3+FsL#CYTdFRC^t^F|A$r;yGTT9+gv;6HcctsUv%+0^gc&;u8K@K1AJ5j;~Uw#b1lc=sL-< z^H{;^aOR_do+FdngiLu;c%lo0OB#C^tw)c-r{JYcfSJy*wPYP!AbFwR2E1 z+PvP|x;FgV-~NN)`!~M-Z(j3cj^w@L9QfXiZ~g0EZh!ne$7vQ`uj5>%O{g{`RT&=n zUa;xkwT)xeYW((BpaiP_l>Z$%xZv>wru7Ctjl)3Q4Jh{J9KZ1~a$w}ZOX5K9+%gWR zdTCwWG&K%FiI(T&++R6o6mMN-PN!yt8f&!>4Nv;XO(fc_h!Nqd;Q)Ew%b0zOV^_+WeT@GxDHg44w3lIOUa%gOPLN+1UgMl% z)AS9Vt2Gx8q;G5G-#J~bf0<4`+YC3_FP{UWQ1tS7`n51pkw(?uUyFld;1}UQCK#&$ z$Qpx!SXFR8OAYt^`}Z#tMhpMzU;jEn=j_T`qfBS9DX328vEi@vS@fI(do4ayIc|DY zS1#T2IVX`ub>Oc>-aL;8^GZR)RiD0p9u1@4o6iC2`~Ugor(#UOYsLZQM@+p~1awaB zRI1OxLT7gqMiq|84fW5QEEa7o1lG9YqQDNM%8w%yQc|2bzd~5Nwx>6dBTv|c&gr^i z`ZVsURxsgYZJSj`Y1(p#>d9IK)!tPNu1LOfIy#tFQP&Ap7CjMEA3@}{3#16EXTFIz zo6ZRCGN!n7TTdfJT&AU@e>TSpUC+Y!1=tF*S&T|P=o6>rp6@WEg`F7Zl*>4BA71~(AYbVm=&wS+h`Tm2S;+{n9Xm;oN7R|db<|V6S;XKpI)Xh@l>DWNG=gEfC>uR;`%s9;x6S_&0>EvM@Iy%@NzWDSv;q~e1UNH;*&I+w!z)R#n>yTR??>HbPT^x_rf6v@q;%;WvFc<>Onc(T21zzfwmr^&)ONI*DqJ=ZBfeL{ zfy(=O+PhfRQr;{B~i~cW*U7>EZ1-RPCJ(q&uE_KTGxZIj}e4(*c^Nz*PtCsp{+3uSa055cGLGcq0<` zmJ(^cbU}3=V85kF9g}s19QgkCzyH%KL_eZ_H#xA}V!>eMVgY|E0gRI}_@NrAoD>CS z;#OeXv-7u4&D!irXeU;ldd{xnY|L?Dhsg0nVJm(SVjw!>uF@Go&YkUB*-3wL@(8ui z+~Kt3zUoM^p=XMUM~0}1E;7keEjR)^@7l>zRso+zq8HJx7G=V19W)Ak zVkbRLYB_D2?-jnylc1z0c*v_9Usq+Acs!j@s?fob$i(4KVgAWtA9d3E!{Nyjevc83 zuu(wO>gKWF<`w_u!}e@1LiCV?z{FdFwmJQ~Gr5NFg!`j8JuLq#?Vd6qcJes1lLrb} z*jfioMVYoKs@!vjG?B!IM+E9b5;dXZv(xkC33*QXB_<~q0&Mz91RDXpG-IYYtzG5T zZ=nnm8{vwlQekAqCo-YxWyx6C^@_pL7u!}&y794sDco6P!$U8{+t#HOP=}R?3aH}6 zTdQl3~8}^qEhyBGp^64HMGSNW5=7N1T20S@>4BVsP##~k4 z*9niHyPb3o?~FZ}R`l_SA%ac9<95+QI870rP@&y#zRvR`u&@8aI=YRjX;rkRt&#Vn z%d)7p0M$`{_Q}V??)&B=cY!C(mE__@@uNzaVg2S8Jf^?wy$v*PYq7TY-oZL|4G|VM z2cy%Rx~PS{!&!EXseofyKRVFb~{MjaQqW{TVHY7ic_K79^*Oc~maZFyYkpIz*oB!q2(>TU3a^UN6 z;171b^RqvG^5fwVeV6rf>bQ`NCzkp=u~>hzNrfw0uHC%OI!^U}>-tO>J4795XX|v=Ze>V_YkT;>?gIUV=9 z0s2T`GwZ|7G1YeCSc0KL!iubqA++nYih%Keo7psrljvhw4J`ySy1)yNFW(J`o||ro z$WXZE)iK2BJhG5b>Fe{g1~a}GjQ=(m&^F1bfi4HHsR*| z!ePNK(E2uP^^JuvqrocsnJc={3*BUUTm5c~0vn%~&Vf--ed#RydI+f?W1f6H7QVBg z)3`n(^$tor`FoMD`q86D!!LjN%R!;DcRX(zaXt^P0&Y(aXK`X9;Pb+4fW1{#)2v`x z!M;CLfq(STN6);A`>jg+n3$0R?-&Pc^QiNWNj8$a(Tp6pR1TcZ=|6T(cF|aJ0AdB5 z7$;Jzi5iov2niJKoQ-?^Spi&f_b&^J^iz>5FfW^M6edE$tU<7Ffyb7@xl=Y;P2TtL zGpdbI9nB5Blf8!#kY-}XqQ>d+8u(E6&2D>w6V{Dso|NX_-RuNjaObs)`u2@3UM^Vl zKSG!{;UxBg6WbBEGk!2p3ZK{Rh~k5@lY;wQgIcJ={r0|edgj}PTG1Gv?p#C@(do?hAiAD z2%I$TZ0}}_rfN(7N!geS9h4l~G-AEw=CZ<1ihJe6y zaM2WQ@6bADqEphk?kAw*?1m>$F>EwO|9Ipe2g3j3vYUvS* zc%a9GsIkE0)TWw~;mL#h!}afe0Gv}~eOzFooCL`1sy3uHb2J82VF`Fn0lNTe{@1{Tjga_Qc5u<@rI;Rnd;1E#lvinxn0S!_8-ln6L_q2W zysl~%&~oHy0)$PN%8$b*r~_vc@{D$So0C^tE^G@UY~r=nVG^H~*W5t2r$Ea{yH^@e z#-QJ}9fpy##c==LuZJgWO4+(ayUsWU`p0F|H;geywy)|mpdCjwVBo8(9Cx7YV z`EV0~@~0`+M?18i)ZdJ|(0H@7E@QT4)a~8v;nDmzTp{v!I6cIDYiBq`sEwKyDu#8P zI$~Q*+u;@u$9H_Bx6Wu4m?`z-m<=yF_8JDzXhsf<9C%qAu&SPmtGe~g8p+s(I?C`E z!vg^IFge#d-kqR5h%pm~mX>Y4n6XWe8h~F0NfoX~mH7hh(UjwWn*XWohI0vkGEQ?` ztuUOpGq7gY*MxawAB5C=(z!-mSu{gC)d~GEU&Pwu6C0+z9NW1$S3!HmB;BK+#^)Q( z0n4d|+m~uiNd7tpwp&V(;FY3a_EY|HW0fBCQ|Y3j{)0LAA>%fBF6R?ldv3hP+qDYH zju;JV?hn`)~g)tBPodP%xfJBa^=fPMZ+h#RkUvYOty^BD-| zoEj&vskQ5>>v!nTuco@8K^h4VzvhhKd4JeHxZ6-6ob(itLi?yRSI}E-x!*03>ZU-t zgq{;7%~O_wI0Ma}6Jv8>Hf$|e43-duv=W1>?lVuY=OjDO?qv%nlmLuUwkGL@5q>E7+ z(FBVyXN_=j#HYRqm%>cg#AodKh{Si#$g_CXUo9MEX^KG2#fPZ9PeE*W01jp0HyEMQ zZx_dMN=&*flk&}X;Gqv(v-vg3z5blChJQD9Sdd2p!O@gc@CfkPo{%zk=w^fi?hHq$ zWj&>E^5i=X>-rNH4_o&YKphOn|0)GG z$?YR=1W*e!2rSvyyx5wv7)=|6@Y=kJkq+^^F{TqMUrZ?Pu%O(hB>HflQ>fJAYqxHu zUtUs|z03RPfDUqd@{>0vsUxB9EC)_cw|=|igrh=b7v>#rRU1*2+v-~z*=TpE(_7bQ zlhKr8pH~n*{q_1%)@oBXT^n2i<#9F)U!xg0Fmm8!aA2dZuA;NvuRfZEF@$amV0vF~ zf9_oHbcZ_ZT#^3%#NEqnJe;<}(2lEW;Nyobv=UYCYd)u49FE782>M-{aU%>g4B>0; zBcwPA4;Ik7agpG{1aJ9^C1A1m(TwzLgzwJd`z_#rS>NY|t<0JI5iCatU1_ZRcPwmq zs)wUw%h*0+xzB(7Nj4Q%DeDEOK|B7%ny6aXUYzt2kMA2>w}&6FmtT<4Tpb4-s*L6} z;s6cum?y7Meq049cDgH7l;nb2R7Lv<8FJqGB{E6{HPJm?=Rf`H44|xA^n{P!$ zt+eGEcxP39Zj23di2#Vj2nE&I;jTabo?e}Ef_JgFlLdkkRYtQYe}Y=-2^Uy^7hWPVX}*2fj!1HEap#H+;A)NDFW-$1&bY?B$Ygb8>gy4=AO?9_bE$O zU5`OJT*Sz)oeGe1(_bFXz@=__;rk`=f?-1l^gwg1k>Wio(Xa?3U9t=q;opqhfkJ!5eQA;jdw(= zDpP^AYBS+FczinvPK4MhJw>uKx?t1XLV4wF;>@?9@h3@PUlK_;{F0I3K?`pj(yUMh zI!)X}mEZ|u0G*2G!JxZ%{R27M4-$vS#h7xL6zbQJ;Nyuzk>#mP=rXYtQ&R>*QuoZe zw}^{o!zWKc~>Vzk132)kljjSjxc8X_1}9tzl>Ddg_Ba z^i7OW^N%$Mu@SHCan&bI`O+#}FBg7mDty^jfbH|OdYQze^DI@_FoQq@rdM8&Al33E zWxnw8w8PGgT@LoK;WHaxtasd<$R(>2PWJ&)#W{IfK{una?z@SmHsw&>EgNB0<6dJm zA!CYEo}p>evDu|jtC@vK@Q$OLnq#~#?UCe3R>#=NbN{a7OB^npo)v7jG!I|mYV|*L zpEkH9tS1dL0{P@GLCGh=WP=VG1ZF3kux3+L1lDdmGB+T^dS!iUEDAZrb&xa?M6EgZ zS&lE`*&{YCX^}L}3xq7Lou1NuopPPR$?=iB@vy_3!Hqg;^AFjigzZ-aST*|AKP8#Z?Oy_*VTI-SuTV;HIIyTd4ltWl7RuNsN`F*;1+b5Y{@5vzuu2 zZXoe1=tZP@1^{)mxzTO%RBxg6X7rSMy);4;X zD1elU3|K9DjRm~j{Qt#o(SpUC!opK)A8Qt+H%mb_P{(Dt;?s#ALq1kDhFg2Ls1mMh zjOHpiFbYMllDjW}n?gUHsD1&yy^0_X&Yx#IQLAd~O=B1v)Qg18!YQQw&2N4){NfkC z*bElCVZ8%c72fBKeqTn<`7q=6%i)0e<(;G{ zyhpc@17FI4Elv>a?Cku%UkW$^j2w6Y4osKR&u5F_I};}M5eP70az^CAw=HH}nRp>w zo2r`1wQ`3e3Lf=vY;tDK=7$q9UKqWR+O;Vd)Bnu16g;pZN%+b12mvb#mGc|)RdY^D zZ!?zpbU5JzwF~shRj+^ZbU1o28xHQG1o|QO@*;db;iUEA=w#Tw$zsIuE`n->)hsP+ zUmK2|phA*%cXyW!LU-Qd#Lg|!f}jZjz^P$4`8q||F#)+ra3Mr8yNSJ}Ng9sW{53NT zj(q^iB5BfJ!V$woFzM0;YP#GowpbiP0|ID_Li$qi3iDv90^r5+{;+>|Z+No*fc_eK z!*PI#w@^FILdeb})wHaH-w>d%d3)I7aGgH{YDhJv2yGPDS32sMk7kvQ!qXB~QlOUd zHPG5-h?IiDsR!v_;eaLu{$0Isk1Kb~HQWR+Q2xYb!g6AmvQ$)W+LO503lJ!A z1z#YO_rd9jeVn{=H+5kH1|Z5wSM!ZWi!=f`>sXLNF?>3@e;1)A!qFWCr`O5+Yi#Ve zMftfs9Bkbk9?gC`>>qjJUbTgfP#Mg9)<^qcq?iiCTX4yT;>(|GcR z>WZIf<9_?cY?8t5*jd%fx-HpMGDS!|Lp8o_K^jN70^d&AbP+c2@Sb6{7)&^|E&tSP z(CbKOluqD`In^WqC4%3kV<#BLfY62{oG__B;;B5;zb7B-rJ2NQd@Hl@Avr4=1t`CA zO2}2Hl|_=PfRWx%U0$&#IXpz=gFYyyRtRKSH5|M=X2I`R?HY`U=4{B_W^+yqmCSZA zG_9h?V(`$0Mda}_pAFRjO;=ue+O_aQ&?`WsN|CLuLvKp0v? zPUwH;+)@3l<(;39zOxhktD$nlI&$D^ao~8iynm9bT2$6u#&@f6)IaK58bFFTed_i1 zZqdInegdH2d#DQAhLi1sevu7XQjXX9}_LQ4~6<4p0u-?<_%8L!&EG1og{&BA$Lz&m`(X?;|= zZalU=R7p)A>2itV+B-Y9|76UCtLMNdsJ?n0|4uQ`@UwMkG;ab2JPBk+dy%n``{_@A zIy`vrpgR5rB)r1rKlzhCN!SbuE<*4ew`axqoFJpuYrp~3tN;AxKOb(~xRI09-eGMS z8qLe+fCFqd4P11;`pc(gjPXt6fNl48zVn@5zlpSuG{62FU_SmilcVpn`Ozg1>;x>! z0&85Elhw38yWQJFO_xmhT%_Ox^!AL?H>W$Gw|Q?JWCPy6{G#5-yHtRxBk6hetl;+yzd>yEIx48@BB8ZW9bXM zyIGa8#^2|TMJ&Q4CYXJ)=&o zA4PTdf)lPQ0WIOBWqbNQn+O$xdzW-Avd&nf*+S8gC!psDVCL{bH~WwXG24QT{BxIe zR6HX*QwZ(}>BikP&(GOv47ko4Q}C2I%M6p4_>)gbGa;nMfJuu>$mD=8OiyQh)l>TM zk$LzBVNKczrwK*yyypb$DFf)5W}HM*51tKALDn<=%>f<-jqhI8I$p5|%eQ`Y0-D7I z;re&8*S+V!Qa+VWM!?qa1P4wR8p&%OqS6!_s?3y{!s1=`PuzU;aAHW_vk7&{=0i_m zN9{2Sc{4UA>}=l&U9;&Pn;tk_J+O&`MGaN19&uOs!NKF<@yXrc_TERsjXC#MbHZ9h zTF2t+i+`c4E#g&9NJe-QLK-nG34uQIFrClzJOg>9ALil8tQfem6z>5DKjUm>7XNz! zsw_~C%xg0nMx+#hI^TvTh(eZiCItc?<6pLSp zK(E%;3%iwpMLgSsT3m)xQ4iefp}a|}n>1G4DK3YnG@6HQrapZN0h(Re;cvGm~sc*}KIR z7ihXzI`*Q1`j-y3wE@;t)rdQ8JAT4A?^mA=v-dw3W?s(#Y{CU2;YKrZVC2AS%z^ZP zjXwK6nuInlu-)4x_Z?6m0l%JpR8}Fxi zT{7e?ql0CEx&)bYt*2jKGm#=%&&L`v9NlrOpX-(`PGFpv>7>BH6Qk4Rjo}ElrFWC^ zR-k*riL;~m{o(QP7Xw!sg60O|Sx#XameqyD&ZA*}=d>h0AJI;35(#4bX{Qzoj$?TMgTrt$piHmBJY zkV7-LJ&8UGUGOXn)KMn7z|!6kyy-7rD@DGaHo6th&-z^es}KdCoFaAt9@G`K1bRJ; z{H#;L!qll}W6@4HV@%+)G4`+GwZPpaA+m5(SekqMftCm1Lx=Zm7>s;u{wpES%B?_( zFmVXJ0dKgL=HSVqM1@IOuvRi!T|z2Wc(;T`35amoozf_YE-Y`T>=v6TY)8GQ#_^EwG0+!%vpuAS52k$uij(r6Y zOHhGuvo1ZSTAdC2I(&6rkiKkc>BJ{ZczUWGd-4;%UXLZ+e3h3ye=8^(i)hEay$>;0 zPQ7~q#ZA_AB8qmE9P-cifvnQaRW0TX9gI|#l zGkg8=Lbs3y(wjlnoy#OjUk* zfr;idccC-qs15bl`}lvw&4$Zw%OfV^(~i&i3T2YjgFh?Z@p+XT7zNc=$=w&gO=a-n zn9*D^2hzw~fK!#s_wV1&$>;NeV+G3IE$r{SaiZ?&SWiqp%hcVAt(7|mG@hhA$B=jE z(+v=oN6VKBHwps0zq+dhe}`D{%97d_P+u7VW5jPX2duxe;s5y?orsb6*O~(e20jmg zl(m|8W#;u_G&{ip&qXF96#eOogvou?0n{gAqNuT+Om1cu@pAEGI7T>kfGY390TtQv zyWGqB#jw0S8xD66*iAVZ8Wr2aaInWc*0&#^GVbB9$9>hm{nx)7{`5!xY`A&r&hUqS z>u;l0au;E>YE)UEnE5^+4#I~h$wAnSAX*`F?u>T10$Nr5eX@KQe+9883aUK?tq_`p z4CkHI#(PS7p3~5-luj4iJ<4fkS2`3v&!(tu9(J;GIs$9`jC)H2^2^C=|M}@|Y8F>K z+3Ca>`T%J2;YM^@&W&SMXMxd(&LDaDJZ}u&ap-pzX7ekgnP)=jkq7VOvmtSmZYR`j zQqEeC9%c0N&v2`-&9A>2DZYBJPM=}Bkhi!3noJq&( zqms4$gx{9cq`+6DMgK}lV&W^2c1OLN>9lwMwYwqBvQCcgE}%=O#;e+dU^wEYd|Kuf z@}7`W7ENZ8>r|&})CIyptY{JA%8j4uUL1QPLxLN7TtG@Zjr}frT z6KnzqJCg4%T#{J)l4Mz+dVdf$7aWQii9P#9J==zkb+(X zYoBk->r8zP)r}uA&nC`?`K2FjsT0=0)MMPv@w!5L($cFI><_r>SylPbLPoo5MuJa$ zQXQwL{jg=Of8S!t=en$vQ`|4*A-)h%@m1TZChuB2R};tGyC2iX><{y6ltWJ6c;CF` zZN{bu3g)Q(@lrBkMDh|iaAcq2=DU=6%e_|KR)aEpSjSV(PlwO%eKy?Pxi@_C4jOc# z_P@imdP(26vojy|u3sOXJoua{TkW;YdHPbv9c$$4z@u&Cz{r8uhy#7RWz)cjD0No1 zvz6De*cKe z-o2Eu+qZ8IH*emID(WvQb6+uv5$qWpkiQO6Mm|4-L8J4Rav+1&$>g7WDc}e&a^M9y zfLP$(DyS1L+N~EenO-q9>)~C5+(4Ik7Z2RBIGIVFuuRlkKuAbWigFh(G$@-rJUkfo zm!BhuzBe3SdxSU6Wq9YFOdV8dHpU%6-ETzwRwfE0aZ{_Dy1rk>A+>g2{RJkqiKj6{C;#&ptG3j+H2Q%G%}+TSAWzZKOD0a)~^$LbYN zah*+Dr7PSiD{!HjcjHIn#mYNA=N`lte_&T>2uOWx#tC%|^Tu0(R}pA&Q3NL!)xtAM zm8ba;T2DD$J=@-a7YMRY6+dNhf3~ao{O#e%5p{;Us!urmKS6-ESgHnme|WI`EsG`J zANJS`qRRLwnI9}jmw z{pm35><>HifobC?cP9r3;#onP&lkVEEK){1BL}XS1ILbyrd%~a2?M_h7{kZWz`H@5jX-@>G@6`q6=-v7KUx57AP<;C0|ZEBws^!U6=4vd28tK{wr z;HE;n^MdM{m_E(Cs13_WinD$S{Qmfl|2RUwvp)4DKJSIT2(NDammM}2AsF384qPDz zEPo2DRWbj;2Oo?ltFMsPqPCu2XZN@7i`s-Mj($Y{mT-Xk&Bv28Z%JOhj>$kawH8!= zEdm|mWU5vZHmsSHox|zGuNL9i$b+!VJ9S-bOdH94DcSUM@;8k_bFF4698X$@Ckv9UjS$e zy!M8t1kmOOzWfYp-`V|pA`P4Wp4N&GN*c~k6_8GPTvloF%e0&^g(T085B#}{d;|7; zsC?t!gKVNqe1@u_)q8vLvi)h*T_QLx3v0LqJH##7T%)S+er1nPpf zXQHJGOWUV%f;hgF8BY(Qyftg@6e_01G5U9|{BT1==ydJxTbSxid!;=6vy zVe0Ob)8|`kNy(k4X=g~Rw{oOjughPB$4`X8g*AMs=UEmJxAgR1^Yqg|(%n!rpN&`i zH@;tUYn7@ZGMq>v*F?9PlJ+fpH~;)`qKd{KC#7vC46A!K4`8p8o4U5v_84Kc>OwjF zGM&>e_@h1FwmnI7#cb*Eum0h4cnuYJhrYmG)`OVruc(9eJJrTnpKbH_5#i$G!LauM z_s?JF?%ibi6hSrp++1pIKfEkTMm!@2u9ySMIU7Z`sB={}slS%z{I|F5Ddj%(fI9Kn z=bsIa(TcOT%h<=&dB;=`nIF}}ZB^Ik>uyAI2-*gaT15j6{aW__0SM-b=ZX_Iq8~Xh za^P|};5=yE+uBFg&#^!od3jQcd0CB3t@ovslnS45m%*+4wkxzLjuX5_s#*h_)J_5> zx>&WXEFUh}0Q~^LBO8*VYsI#SAGpc@8#@6Sj^;7G-Zc(b#2ja~aiN-e78A#8G9r&~ z#Nv|Dlk({J(Rpi)+n2ev>14S1(Km)$-})ecDcJ@O3d>uKJ^iktjGG7@8hWqw*6D8& z(fGJh4vd28D`oEsA%CY;e>*sKcjnK2_OqN;u1TW}%Oq;HJprwK)7Y4JSG1?5FEaW+ z@3i$rVMe!+123Bcs-ge%(@#_G@7%c)b>KDdd)bt{{qdb|L*D)rk14!N4tT%(x4!kQ z)g8i@iF?E~av&UFShM29xiQbm{i|4}(&`!o`CKit~7!*Q8EvxsuPF1&Ef@<4K z1=Zdad(4UF&mMd{On>ia*uI7Ecn?9`9;ZjWzq3iu9CP{S#8A1>@|Z8?kvoT6bFq&= z=@7x($9ISO_dXe}zlZYe`R;If_;{F~+!%IFJ^c)gjZ7zq;&Za7uy}^5IO*V69x%F? zB1H_{)HgEQggfQF(bEYhwt-nXQ6;P=`EnkJc>3EoCrox_bx}_c)h`oo(%j zJ)OTv7c}Rsui*ji?tH~w=_+^gVk*v_)*epaMBa$#bciE<>qj7ZnpVz@C;dA_7ZPIb zuI+8Y)^5SqAvWUOu;S|%kWa;{7k>PFnf8QhZWXSA^5nDP?J$9k6Xjihgw&=)RrT)n zpHN;;tQ#`~U7SKu9r*U-+VFVtDW|LNagyYKI)@7IC4y_zw4Y4(u^)2p=M4nhs$2CW zah1asgRvBiv7LK>OFBZIUMtHvxR>!M54&0ASLJh^^vA!!gm=JDOL5YjfTa6ye?Qj@ zOxXyNO#r?A0ibxAGwg&>lfn*m)c>1*!CCE(DdsPFA z+Y_#BSkfkY3Nxy~Ibmg7S(GNOiZ@7FoE=a5ywsQR5F`D-(zc%kb4%Ij(f=%S1B3I$bpdqUzY>x9u`|Z zYMf;Kt?^i^$ML3TRBHm2{)EkD1M@kLRj1#EkUp-eVHke)<2cR`NXOtIc4uwdnM>fx ze8MZEW~yfvQ^LfWCM4}jLIp$f&@S%0{4k`C(Y);(pjg?@WV~vA^NW2m-S$O#*%zf> zN}%ER@Mw7a@cytkIvnO~KHR;Hwm9YvVyIs$Kqd?PU}ef$bmPR18k=Hf2fm)-bOQW;A%K9nN98oGvl3%crFygNmIVW?Oa@m=7Jwgf>hu25r^AQ0cZT^*1k^hS7!-CQZR^5IDb8YL zi_`hu_Vumd_{kEXwt{Vh04#EBU7HMhx0xtTZm>vkGHflcqfYClk%GZkF%V^VKAX|P z=0gO~4I+NU9te&lgbRk*29Bu?!6KlpMB>1 zK&%@diEtHZfL8t;EN>rY;Y8X&3cLQe;aEN$UWbiei!;7HC|)8e^0DAwe{p67gL1;( zgtzzatcU|M)B^HR=Ou4J)NI;(8r?mzw$+Mp+o z9}W-h-^Fe|(dEk1{27D|E5-p|rf7SZWU+~F{fSerSd9OvIiggUnV}{&!Plnywp^=@b)UQ~h4SdgDV zpLflhhU0zY)3f1!zAO?(JR=8Q1_!nm+kZi0_=m%s@so8l9Sa3Ibr%XO-1+fhH8R)c z(KlK3+~|i?I{sFf1)x^(De!*xu~EmRcPf3_fqaaQkpm+KUS|$erG-K&bWD49_q?m; zSMZz-FMuefb`BRUR))>^uHNak>E9>JMI2St+|ag!4Ql){p5~KT9e&K#7B_IZ7Py@3 z2F=8Vin!g>md$dV9{hBdq9U!o%e~StKHnA&WTZ|7P?~b1>yYH^CQSkJ$jfH|bPf)88xf|~l7|qCmx0wS9tS$G4hlj(hTeqTN zKrI8~edw2$>$Wdhn7=%fBc^wV1E~G}2k%gF$E3aj4xBEQ4>spuS3!akvod8{t=Bu% zi}1PD5SXrIqNku}F&qxZv;ATF#@;Z$hEPHEZFJAV-Vl72 zum!=HWEg~(Z-bP94$^*+pt>k;LaD_D-GQh$^ay2XX@TJ^Z48$Yw2CXg*Tx38TA89&cLTPi^w6B5AgfJav9eR=r zzroJ(bQzPa<^u)BS2cyfGmcyM@^GJ>Xm)Kx3IJK{99Cr-H~l(Yg*nO<@-yQ?EMW&SQE z`ODHRtuNa=O;g$z7ccouIYpaFB)>GiX-^cSc=F-iXP>e<1n;PW-ihi`Q56DO0NSK1 zj&cH4-X=d*(Um1tq}K~SdVvajV!VKtD{b~?5YWkNcpI&STJDtpj?c;B; zz4!y{G%^mhK`~{{Hf0RBICV7bL=8XMA+guIv$SeC9dTSzEz&A>phojnaKQ1H12tZm z>nnV=6zE2g&^c2v%K+ax;KL&U_!gQl%*zcKRc|?SqFq4xEx7+~bU zo6G?hXWXc9_wL9{f{%dD(T&MJmlT&VGv5vRY&fa(WvTyz}eaOTDAI zZx#`p?zuX^+Cj8mGm%T%%E#%6r$*U-d>s|O4{F2V_RZ~K&dKVX_fLj@@sIzn;q#x| z9sd3Q=7!6d4%If*wuu#eP-f{ear3A#tEF^D=zWGLGf57ta$KGf)$)K!Fup+=2s## zf);IAjlIZ-hhMSqIO9{!;){FxY_BP*r2Q$t&q>h)P2xavE`)+3O-p-tQ!aUCJt=u? zIvXsn6&CH_)U1=V@-4J2>HziB#jWz-j5q#;4xAk!0Kxzr6ct-N<8u~)7+O?4M1A&W zoiuMSmd$Pw$;P)J4Xo10hs1>s(q1toweiA6a2L#cXSvLW0xefZ8vmrKht zaRPXX5ROU#$JLZ`W4Mm6`o`9`hr0*=a@arqg7F^Z9uQ_#}D`{41T z;nDqj!}Sl~WEPoxb(qTk;C;%x4p-jlgxe7&_;;hyPQW$Y!Yn@=C?v}PmEDtDR(ZeyICol zwOCO9t3UW_!w-f(_?MRx|A=Mez{}yl*3RxPwh>M*xN0JTpp^BBJGCG?@Txw$frt{H zagepyzZ!+D;d9rupH%oh7AZ)d-H3TKBL_wfyfqx4a;Ju8EWlimaoluw9u3MUyP~gD z3j?EEL>ebt?~y*8^~?FSYqS%L`M48m>v+kSm<_}9^-be<#u3@X=$IPZv_8S(^v*tb z)AX;^yU}Dn?R+r9lduV32=11i#39_ZquayLuZQ7_pD1%j0KMx`9qx-hIm*Jst#4c(uD`#VzHPZboEQKN^EXM0%M{*Sk$q zEVSML06+jqL_t)r6Hh$?o5dXYQvasVfO#f*KVzDk-$h>0te@%3pHY=(@u|u|g6nJ& z8ot;Kla+x$JojPH^CoVE=#1Bz`b}pdUZrKz9een6&dtxwNE7@F@v8u~<#j^0oa99% zw!SM=5LCIqf3+}T{UUx(O2;HUYkTn%K8jMj6#a$5F6zwmgvvsBjQ}q1>2PQIm(a#~ zYj|>mHl5=~uF4VT@o=(yfZINceGgdl+a2aJ_Ve$2o8ZPT3xHE(ZakquE?Rchn;MPZ zv?On_2v_+m<@&U+jr=&2bFAVvfL8GO>t#sG#=;X?EO@)QL!p_f zMrRQopKa?qEr#vJyf#<0}|o|Gyx^ro)#Y?;aW(C9c79x-HLr#OF9iiqUw^Z`eG~uZeP#CG$Kc66o3D zk2n2He8=QMZ~7lM;Fk4;a9uMg^yVM;(gT(LC%#Nel<1%AhZfF>4czoP66Jy!%bM|t zUyrLXqkd5S)*I(~)-S5T+T=A+cGo|TV1~yn#x>rxP7y0$2xk+>8d|nk*QlfSNz+Q! znCDD^Mo|5n3H+qsKltE-p(=kHW8VRzltFKc9ax?wt?H2NkQ&oa;8mf3_1#Sxs>Jv0 z=^TaCssnG#lTo1dDcjqg#$!sdF+q7UNKNQhl>*k8uYK)n`TpQnl?Y9~pF0J12ZN*C zF86eKVlz&~x}ahaZ@$KV-QDMgTThpae-`bvS8=Z0VcZ9+ zkU^$HNT6Y7BB=H>*_<(GdW0Rk#3JCkT=SHvAMBKGjoB@KxSiU^+o^ScfZ+gPH^S*w zm($JNWtz_R(*l*?s}t^udN57Lw~X#suY9GucaIA~sifg!9yivT1nnIL3B!bt>w@hx2gppjw`dpc$q8Ia-aBd2fF zyco_Ul+%r%k*69dV*3cB3mk9^rZA77WxR7-pQmZZSH`V)2fSjBg>MXBBOC&!Df*z!sz-|N>?)1{$+m~ZQ zj%OHTa|S%MH`r!yna2qpp^=D8sI|dPAL*umoNMW&wT7!mfvfewyj3T{35ry*n`LX< zV!|2)oE>V^jUYAX%kj<`3i>=U4;!R;WQJ-a-kG7S1CeYxK^!|A%GQkm@y#25%UoL+ z+}+?18--{u-p63uTOwRrsh*hO!Mmb8>1^F+J5i2CQZ;!Z;Kr{2^((AC)`22gJZfuE z&w({|$yl^xL)G!gZTJo!D!p`km2#skd z&`{ulP{77s$5}dvSgXbQ1;H{Km1F#-PndJOI_7Au?HJcXEjT@io1neYrW5@`p^4oK zztF%!2(KHkJF;U5!L{ibCQr&rr2NuZ&$t$k#kgQ!1z#u9_?vVp-XYT9Uri>qp)QdRoo*{IPTWrP{mVRSqH@1y)1w`Wg* zMo|6iY5G(UfAW)`^pB5^p9;oBjI5wq6BA%M3Wavj30=g@HhF3&@CXXHQ}E>EB#p=8 zsQU`5J%QESUHu4RHBJo$o)ZOVbN?sIm&_e~PH8k?8wzle`6w1!g%l4joMJsz$;6x} z7>@Cs8H(Y5CQuFhS?@=rB2$3s9;YKoWHw!;qx-1RR`|;zQGUgI;{DWw5slLElM}F>ro*oJLcGac^_}dS^?CRmj{z>le*$bLS`3_{>jh~AsHsxd8?v(#mUSS3)z4ot@!aMgy36go(tGG5tR8L z(q2%p(B(m>93Hob$|L)m9*bUuFM$Iug9?(rtfE^#OaU0L>=Jn9GzhP79M8xDQH-@l zGXvBmJP1`FeD*6s60tH&_1QJi zHYbX?>>UBN_XTFKzzd-oU!_cC3x=Og;-Y&-EWV>ISue!B#968J*(T(ylovO zSkhgC@;kfP=d9a;Zr~n*_ca=d_#q8{=s6)?9+q={$a4ut%nT>eD+%eSzwd|5+PwfM z0kbntE%Ed5NmD_8(&rU&p}cB!iR$k|huTQ!oAaOrwfJ9CQo97SKP`1N-%ZZ_?dS(x zxw~UP&4KZ4KQEIq>Wid}gm_U&qW?EJ{@l0`^(X*aUra66K7bGiAvh=SLo)&2`kU6t zKL~(*jUHK>dihSIxWZ- zbBRJmoK4^UC-*_cVckhx0CG23SW_T0%2C7}H0`*l!7^VLby#wpj5(h^{9DId9mINz zv8sa>r!Gq;*XJ9f**c9+vsnG)D|FlafAVQz8uw>QfksgMZ0Y&b&>lQ^(6@0ls(sIr zQkq=3awT25bSXijP=)Nk*O-O^uNnnx3-|8bONWPt$&`*4-FrGeeKX#8VWoo3ZNv79g8mfAH9rnJ?3)Ug?lX2;zL)B%lvH4 zEaHmWr@xHl!VRVZ31^Tj0$JqATxfSZ#krjZX)jGCsP8^ToIYT|x5dx9cTd`BjsRM< zyhGG-4N&GiLr6Sb9J8USpH{@F&3^wY>cSyYE#m zuAt3@r{Xp8CIOTslpWJG&q}O92+d`_p(fV(ptJ~~v!SGm3si*X3Pt#i9EDf*&y>wH z4t2x%m?vRLGe{8$mog~y5RTCe6|jlV+Xb^YN8nN>5r&=H9wN*}pvCrZ!4{a|i(kNs zkKz%pQ~T-01OrvL6r0^4I{<-s8u^WnV^ASi5g_u)qFKZ zCHBp9GQCT-hrJ;4L&a;3k|U8dMzPT{AgH&Rr5~IAS<_mmzySM~H1_feLZ(RL%HohUP9Yu@73W z=`IxUU+K)`IXPub{R%z>l_cDF$H{vtLY_lfU#JvOF=A%Nrh2rKQa`$^uLfvp>aa0* zU8x?2s@6f)7Oc{K_&C9vFi%f`Mo|6qG<+}m1cL?<%zdJzPtK_lb~Hre0twlm%By# zZ?Gsl=%ppX?GZxlZ+x?p-hAgD)+dZ*2aIbn988(r_}n|Y;;M_4@4$(( zlkU{#r%)oulRa2Gmi({t2aL!%i&%x&3Pdmwibo`&06r`wpViZdxQBqg2vTzFHSn;6 z0NkL=OS3S)rs0AaV8SchTzv|P1xWEPU-2rq6l{!{l6 zkFY$%DeSz1*<^ssZz?Iu1Sr;uU;Qr5ui7ij`|asD@rT^W)H9oYJvfMqAFo!=6D2r+~yyYxH#)k>ZhI)nJvF zk^I{6G-zYnpg^Vfnx2(lnbMV(3ZY}%u?%D?Qy09>BH9af|Kb#NjZR&S%}nk~;#!BO zCaN8VG2ZHNLW{VLf6=T84(qxNj0}dSbNCHON;^kWtz_Yb^HWX+m@bXfi@)%Y3ZNrW^77e{L`N){U zYS(CU!mL_o;L<;Y#t4tu-{qDADtMvfgWWd_j&2`#9Z@?tJaEPUP{X*2VmeK?vT2wdwe9A1yiiQE%L2 zFB>6mgnT?wStmPOhsIutpFUoUCe+hXpb=C*Ed`%(d=_WT#j~G5Qx~s27Nedd)vlm! zI%RigV;Ty)Via)V=Y7@Ie;MZ9ZLb<|g|Wdvf5qtWIN7!D7;w^0+65!*aUwNg8VYPs zfK4Gk+W2g&4F#SH1<;r=5wJ_}ybwEGjBh4bmS`Jm^%B~Ze*Uk^xXoyvVTZA>5l{HC z6=Vo>xR-Nh`&#-6{pkCvTih@GARQw-8!ZryjbJ2jVmkFmUuHp4Wh8w?DEyu(#g?Dx^wFmr`7i24&DW0*$qgJE$tTR_0%XD~F#Or=+x&{hx#Zs8ZiDhpeq0WZVVDosx#XBfbZG!0j*wX|de z*Mx+Hdtgz@BwPww;k|y;NX65F*fil?!aU@aGo~LN5wF536o~L=BN?p3$XW5r=<75$ zKFp+aFLBmEUNy@pae{bjDz7b-Aeoj?ZKB-y-V7rx4N7&67XoN1I^U|Z<3tL-c4x$0 zxZTu4lfemk>L#^1>?xPDqzex0oXIU=T{h?rT33|Z{HVfk@{~loO0rEM!SlD1detQF>^C^9@R%1&XCOEgFg}?-H6bq|o3iaXv8xDuTV3bw|2L~ars|($W zm)j;s4Fx`(0y5gYx7uI5v%0S;JQ+5RJ^Fq+{EOt%^br@SG+%sPXiswe*^b$mh62x* z0`nb?vV^GGbWWG$>r?;-LHNFLivHaNT3NgqtXhL1unzpVEB3O`BVIj)ChWWuUPeI& zrsNjtz6a^8)-RER zxDv4nHN-|nYQ9UGkQ?KnrvO5A81STHq~tw|0$PWQukbgWJf3PJjbQXftiUyoE!od> z!$hQPEr83%<}0VM=@RfCa?U6fxDnU@o8N)Pr?_S4mT4^J3)&ecKGx{wL@U(H2*@CH z+x*TDn`cm<66_J=u-s(g<+@V>K;}%#Oz$WM)Ost1vtF;})Jaqr%1G%TBpdd&QXir9 zar=O>LM5>g2*02$El^GD(bDnqV~!E4@^Fq|8{t}eD;RqjwVY0FAGNsg$I8$lezvj)g+4}p4hKcS6eF67r1 zw2JZxKYa@gYsCy|;iiBXCbt7h6;_8A4^LA^X;MGDmR*0xr}^}RAK$Edyt}Z=8mQBC zqg3wSWAl^s-7>6|&Gh-x87Ki)JoR6~Soc0^`}Hmxv=#`e?LW8SJ^aaE_*&W zsd+aPcv&cLWw>*+wb)JvsGR6fpV!9bh>0GQ2I1$5wzi<(wf|MyM|8>IW4zp(!ieKK z7_NC4pml(@V$&+1GK_%9qcIHy8VXz(3gjLjkD1Zl?K5zUK46_oGz2j>8;rIYPbc_s zH!$Pq@?@NP(@DD49;Tn&zMlHb|K0pC>X zH+a;E25-k~e`n`r5vh5+!P&U?k zKec{p zk^-00<>^Q1DAr!Fm~zEs&2u3}U5o`7pVrG*kjDbeRadT_`6=icQv2tasM?&^$95M|DGmz~YWi`4$+4b(^C7lMbp2sLq&kF1MZ{tvuV@1}{o zd-_hng>UAB3NNYMB2!it4$d>c2%i4@FeWHRS@bImJ^Oot8T$C@yeMnV^6yiP6Q zTpf#FymI*9%&fn2em6sD&oG6-&sU`V5X=C_Bb*=d%Q1Q4O^{O|dpKqI0r#|CWgjCH z8);VS+OM(X`YG){L7ZGyq}tjm%1ENwipmFc&2^IcjKFOf0s&5$Of4wE!mLw5(BjmZ z>z&b7x-__&4kowKWO|=wddNmyv=By%?yOy>Z2T})1a+pI zanj~bv&J%PxwNZa4)HY44Js5c1q<7tE*nXOkXlFF*8Q6T#^{%%t2C2+;azbfelS82 z(APf8h|y*W%&@N;Cc!j*uiNlu?z4AAD5!NNZb7V2sfMoaoMcJ3I=-UsTCUMY$A@$- zn+YTlzo2H2i$^UF=@tG^Uk)|>y5$v2>{1qW^OUfo{kX5eXfVUsZ^Ts+jzx?=2&}!s z+Kw+aUlHDuTPAGTnxra4^I5G7Wa-9_=>txaJ|KP6?YG!5MjQp`*1h3n+UH`i-bR*F zZk`PV&OZfqd%NT94jKvFO!$zoJ=i|=ai-_Dr>Un3tLcB8JLu_4i!E8xVLsU7FE?M? zlriyh+zPwFKbc-cZXOK<8VbBr6o~Ph=50G?#tQEA1<}5v)t9^wzzt`ULpEA6Ub1Oy z!T`RcPq=mSX8Pfe-cLV1>ZGfG=3h_OFJFy~nf5F(#u8OwpjS#UoJYSBeUJVgv*sQB z)H=PJuk&oQ^Gg$LJOH0vq?C`7jA0V+S)3U>L-cagl#AQud?0#9~wF|6nH@t z2z`s|wHS%I49kluUo5WZ>qDp`<2{5p#aS91ac>&$z@KNvUkfhe$J3VzCr;^B7rDmI;R3!e`DLdJFDH`21mN(rEOg5u^Q(qm z=O9OlvZ?Vu`91^ZjCX}|#_>}>&W6tTWrmNc(26gK)xS(Vz?Cdiz?B~LyLlH1NJ3~8 zlsrr92p}1yZT8|>>1ss|yLBta&!^puMl0hOi5ouDmbkF~u_>e7hpEDPr-Qo0HXA*5 z`0j8FU`$)^)M(txhc<%M@&wiT_tV|uY1$rKK}FpzGB!?UbE}lM0_OV!3nCjY@mQOR zo=6sVU;avzbZ5VcC|x^$ZO*XjcgvWt0O&KV=^!r&@-!v}T+OwfGxwqA9_Utm#PmC1Xy6lL_hO z4+L#3+Kgk0ZKaxufuo*2{(FBW=Sb7t{rA(+;-fV0@28I+{4?q%n?7i3v;C9wU;OU> zp8lzg?kRA2>z$MB!{0~n9JjR4hvnM83iSlGS0zKX z1=@?p%#M%KYG<70UHEM?t{CgVq^EKA(Keu&(Js3L-yv$3HWnM9>|3L)5x}`=V;TxH z6gbxuh$)rr)PS~b?#uZ8O1)NJ-r>L)aGo+Doy^1>6LuVChv%_>azEFfc$C+sa z)#tBpniJJeSSAii-dU}x<6|b(3hAOVdqOx(@P+~xg#t47>d(R3%^a!&S5W(^whi-b zAEEHRF%1R22nA?Mzx74pHE|jWd;tn%3C*WPEc}GEK$d>qCDrEh)1rR5dtH=qDw#i_ zMKbYl(a(Y{BnYO`O1nE>Ww-ogPI$ha4!Qej-aSg)vQv4%g08iT8rBo~+kR@Zm02`F~aKov^bijz1QC0J~PyVv+FtM1q>8Wn6eJx$_uw(P{<68 zMP&^Gei5+57T1Vp+)YFH9A(pSZI4_R{{pEXAp9CE!#E4ZuM(h!%N(E_Y3-JS73vm% zc&>r1Eyb_C2oo?K;r|FHW4Xi*FKJf52ts%NGkNi;p1!NSgb#;si^K~KYtL8PQb_VB zBIvayB^K=wTv=J+p+)-*$GkDb`V|Zk{H@Dw4pGfDk~Y*I(k{7wH=zc6z`93fio%2w zgwWI35#c6;R(<^#Mj)rGC)@{*kZ!=q>Opr0b>NjLL;EciIk&GsAR`wDZymUiVs$cajF@x4YOF~)ZmA>}-w1xOluTPC-1O)xPBU5fApVl6u zu8X9=F)f>7-P)jS)t;y0`EA1mwipCXfD_Tah6NS`KnQ1rvaRUW&Hu~cZ;klB+ zb7`@8B!ocpw|vsnQqT5V+F?M$E%()7$uQ3$JsOl63N#cr9UmV}i_@_={Au8I#C5~3 zCO@++#_ZDK+X((*9!vKj6h>tF2?c_abh5mk{^@()W3%(Mbhy1wIA*j+rBG->Y~s zQ$PWns=)mzpz~z)Qne$EX(;dtQ(z90QnmOyJ3DcbSRt(f>pED!N~CdO>!uck)lJ{< zDwX`R$*Vgr-+AYq_n!^421-ML&!s>t?PUVGUdoGZY#WOvAp{cu$GFG2`UUeKViBS` z8v650jg!-?F@5WkOXlyl`JYEPmTq&ZdKUMD4!Bo0brB zH$)+)gaTK^ADFT@j!5Nk>a+>vOo)w-4WQx5_bGsla2W@mC6j@;Br%nMQbEGcS9W^|pPQK!eexaTz+GlXWUoAQ4|;x*7>|+hEF3!O9D0?Rq9-vQGK?und|uBkkXLL?pe z+weORsNh!JPEids?RQ8q?7lbqm2d>_;+Zp2;bhl~^E6)%(Po|RnoIo)tux6e)6F>8 zV+~Shl*>k{@)zYx03B;2!sTSG1GWmwLWVb51z=Qq&4XM=qv|G%1#QJRjt%0QPhlA^ z!^+$N!Y$_M-oXbra_X8>qj9)~b~0{#fEJMZY0(}t9#P&MuC}0_wYOL4jbFZ;-aGi6 z^p9>0{=IklqyG_*{|mpyG!!`Z6!>xa@mvnP8Y>)6xTu;oVFRJ9@Qc<#BMB?*ue}Yw zV5oS>u=v`>BACz8=CtBrA8G3>u?>}tP7$d(H1CE24F%2<1)M@HW0L0>T$^h&>@}Lv zwrR_88%J&CzG>XXv5oub$Q#bsdq@QBW;`YBA?aR+!!nG~ZBAPEMr^V?yq|vOJO4*& zU2CPmn~utk?Di~-?fgPm81p+5z<{G@I#sBD&N ztoegMQcBtRVlD8fkWnil*IxIcch;ts!?ocv7~VRQ$3DYX0NP8v3JCepUU1C?C$rfd z``HHxHsUnar=vh4sD3*7J?q%Dg*C#yPYO`iRzJA&-m=S) zu~{2crkv_>*@QzZ)U%*O0T%ZMB8*bF+hO;*=P6}E#xmUnowG_;Xpdv!lww_~on40o z7#4B)PX;9ngH8_9;-u%5%kOaVjFZ#t2dTFWvjJQ@(Y88B>8Ov;xjjsaaVJfgr*R+@ z0X6E`5H@!a0$jSWn`Yxx`uN=+r^Vqcz4gx5WB2^@_#`bj6)HyUQ4ax|yPQ=C?75zb z3*O{!#ofMZ1F|uh_6;{fy4i*|jc)n>)IAGHa;Q^RzAL;&f2MDb{;_hm~_0@pz8Uj48Kv7^#8>J$&J>?QiK6((Ci{eBhM)-|7SNet3!k>9i ztujKrg6Zk&l(J@_=EE4lP$bXRr*P-t{c*t^BG2o4vx7jeC{34;cR&6qOwHr8_d2-R zzQsYoV*pvO>CjEdchU)cM{79(<}qHfHDo|d!JDuc^JkwCj4d6aK5NkgFwulweEF$= z;ALFCYkN>luAI|wBuME4B64w#!?hVmI1~FzGg0p!nYzfHdgRSRr{8PaMwo~|zE1l{ z+fSuereUFE0c~A%%%bncBlp8t3QS^WyD*f1@syr6yV@44A2vBpO*@{nIo{b~qp1}s z7Xk1Tv{~HIHf^7@9T919<_|bcI_HG`gx`vYhljV*Z~oo?EUmbj zVsw?OfvykI)@uX&DC;4cTN$5v2O~LM8eq!X`424t&M3Y&`{vqQo#9~3c79kwpp96&DORYZJW2w z_77d!xZ`;=>lldbGxE5*z|j?(Vje7oB4Vy<#0FH(oI^7dGbs8+k@ak#C+20Wnyk0F@5Ct4^^N++DW^s-P@$w z)U2S=^MAOaYs@*JfQ{TO9sbWuA`>So{Ri{sr|AqpeLxKPLbNn0ch62x;0ykNfy~VOD{wnaiRO5@qm#R(I zCyHYc=jvQToLJ3a4Nl>ctg9X!cAaj(H%tx}_dt0EF2bTTM?j=3K_Lz}EVQvEF<>ZRHs~2%^C``{@2d2dc!COj`yUTQNa5sJU-YQ+Y`X+H;iw@mYk3fC`i~(W? zV7Q=k@fpU&rQ4xvUW;?EP9opM;W1u0H-OUeDeKViTEof=m{YnG+u1;f7by}#vMi7k{ zF7i8@_R}0;-5jB^8$vueI+-6Lz~;0ln|ODJZ=|i^6*MAv9gJ}`brG1|MT zo=qQo6qwt;h>b+D8;H#_;VORSMYnkP=?4#tQSu|+qIt$^18$CJ_(vNd2Dq?W{r+kmPQze?}ys6d+X@@Lra zw5}O0yG34vt8mP^Xc)r+Y~`4OFxq%-j>>ST*ZfVXzsHlq^zjGprlUJ|)9M(NqsIs7 zgLmKOeV95!+Qs%^>NC!)*!ZwwQ&r1xCXxr9Z%$f=i6jx$DX<%ma&O7zki+&*7w`S& z`2UAFQ1fgkaIPr;7l5V{eJ>SSW4*Q=*{@R7Yisu7tv~Yhbd`-wQ?6lX53@G5=>3gq zd*fwzf3{V}qfRuQ?1yvl3|sSPD9}*g98$n3SN>tKF=O(ElxXHQ^;kwa_j8_QAL8j8@b ze^%TmWhRScLr{^)3X}dF5r;vI@(# zVDP&;Sk{3Hv9)of_FRptKhu=Ki4~Pt?HOu?IpN(#K%wfkIK_s5d1s5$(5QU#{#;cP zPrQSgv8U4~oF~DD?B$1{u_EmBV4UvXogwf}>DudWrT%Cb+HpKF9jB(rm%{m2n38aP z=QXN}N>`Qs>r?z6mkyB;7p1`pc_@|y6=r!y*hoF+-_UyHhil<#)v+-z9R*J7POe+e zIRjB|bA5`Gs7rAQ)rz#?EO&58`=YgYJb)jJ7pHHWIPJFC?a|q#4RpCPbepzzgrM$- zt3}6b44D#iiQ7q<(Y)F%)YoAKy=?>wv`+-xNH0js#1uu?wxt1SfJ3VloJZ0P_T_1v zk1#^oFq`;>vkuWXc;&WbJ9Q&UY$R5oYS(3u(yl_-h=H9hhnd(;y; zVk$<8t^EtS)W&C8%ymt}^!Pu;n|PW?uAmkHaI2r;?_+Jq$0zc(_B>w}G7){@Be2SO z-pI&9*@_a{BtnH@xQJXGd_(m*>=>sAo83H-D`rV2>JT{LoPU;$@ihpC*Z!8E9s6iRUr()_1*fGsr9YsqczT;(80%88=5L;Sw;8*-qjs8)kJ3N5^Be!c5AXc& zKl-_AKewMFHP40u=avHQ^@yP(Ftk&&Li?t!uiH1@cFWyegwtp-@C3GP%b_NkZNw{4 z^NS~KkA~@AZrZ}OHTu)un1%uk1=sxH0FX)AkXKidseAh153TjH8Ltp&Nc4Vn+0nnuPk%I>fEz8 z8l)~)jcIodYrMQk(r8910Qt%=Q`&8F)mhs6K?dABUjzjjLG_EEa+AiFLV>NVtzb}i zigYrW#A(tm1(7Dvh63k|0=5a&fvX{PO1%k;4SrcQTssXJYX)qF@@dD@<2xuX%q%I%-sP!tE}0TfhsL~o6sXL$N0jmN%1qR-b$z4a zSvPP9}6W1Lzb)Fzz$#ikoKc`Yuk=SPb)@^UI?iq6DJDWn5s0c@I>y%9*v-uI5 z6KQjyMx0aC^Lw1Go~A)(D-F3%erM|jT?cBwZO@T5?FmUmJG2$(=qVRYSHsn5A>=MC zBFIr{d)VV)e9dMcKWqMc+m>Kn`ZiDDrM1Q-ZPj%T23`6O)q3Lr8tRqIZA`W7Zdg&E zLRf_?rs-240g#u1)0$5B*N4cR8W~wKX9MSO)&WZf8ZayK_B7Ucw^ign2Ty1fd9T6F zlBT)_J?dtmD9fNvA(8;Ft{I4KETDM9=pN+*D`6g?}IuwhAX_`hDEhORiuMr2Ip=m{@`V05w zaUm&?3%wM!IV_c;&e@_?5GW?@EBFows?`wX{E@#7+T6TW#`$B^B7;^!;SkW`QDGpc zZe2>dY4681So41V6let1&!5ImlES);JV~S`?59(JdqvY*Z@ra1_~3&^SpDf_YJ6Tn z3OMQWRP{$6ad#m?>MK{Sq|28tGZ~E``@&IVIArlmJ}+wiE?j|~qYS~!`S{H@-)vNK zoTD;%6;MGa^nN{A=sOlzG76%L&i%Bfi#rN|XW2hi_7bP|+lsVYO%Fg*llLxc(A6BdmKtQS)l65hMZoz>kD=XGWs)O^o5V>eIl z{^a-5n=CHh`P$E>d#G$($r&*PIVv?PxUizd>GrhsjWLW}aN?I&=sBx`AImiRM7kjfM(h{HN9;aksg zjmoJR&U>Y)_srkC^AGg|+~EvM5doa1-#jfXtZt`|I`C0CYTrvM+D3;vtCt+7o}m(a zF&(Fq`55g6ZSJ(@RE15D{gKU&%poR2aGLu9?a7H{ab0#ou$rRJB?oJr_LB5_L7ac-eHag zke$nHVr4VbA&DF&G)|#%zSeQ!ug8->Du1hxz|9jgG!;D9N66he`73xgg6cw}=5>B4 zz#fkG<|p%SE~n0!Xg3~{#<%C?JAyD+a#%oMNfrbL-l>!deZ3bXlYW(O6RO`(Mn;mTS_~;kIw@o_& z@}L`uK)88LQ*;b=4(wFhT5)QX!E%B2lH=(z?^>oUz<}`zt2Cqqb6?@Q-W9Vv}QDJLP$6_A`pr3Mka;3~vo5{Ic7SxoW@FeZTrO z@8?f}Mo|6yY22jnB~qX+puMyD?%lg_XSKq)+<|?Gh&4$!6gVdokf~&wxOeYf8jr{6 z>eZ`pvbt#_=cIrdG|mGB{>$@#M1#YtMFEyZADqcCi?CRSu}H(Otkd~$5hk;COQk@mQ!g3^+jXv{v|uZB{g!EBy{ZA? z(|TrYqumg885=clq20B(ueZes>K4*F&XXdj?x$_OdoT+piw88NqqIbO!D=<3jj|R( z$emi_bm#CVoUFctD)1dnS#M{iO)zzGO0p+CNga5RX7oc~7I=x1#tcLza!$gnJ~qNc zdlh%?wKsyQypfmynzRV#>2Uj#`GgbTZorWq;F95+U;7nsSh4YN*$uCJs+M@cHMI{y zU{6N|sum^tF zJweS$&;YrF0WI@;j-YtXhK9wGy5fod`191vm~c7l;$%OB&pkGBbSG?tf(hQgw3Yf> zBQ{9E25WQW1nIPw)Ir7$agfjM7!oAlA>2#`+#LG&Qbl;D4|AO#_4eC2ug$Ze!1<=Y zPH*tR*3RBHyI%J|TMQGz>fD-hU&{%!?g`o~`sw@s_`B)BZ~Qp@#XtY=q&}L-x(Kkt zDA+a%eRG%bW^eCu+COH~#_>towohkcA|V>nP@ti}d8dHmADaT*SQ7V6BZc-}UPd|g z|8hl(wiuF`FP28lP?;7ux)jvEPq;nioIA|xI4hmDcuyEC|MuVeo9Tz|ekY}^ak_c$ z`)M^~BUztKh+8;a8>Hc7=BKCtcN}%VZ5_;GBU(p|K{!<-E{?+@5-8aBI5vZO^kO<< zcUGY`2>%vkzEEK_?~6bI%b!2WI@SiIK0chY@QaG!RFXijlKqIJr{xp7)6iSnNk|<5s$Dx3#jlHAR_ly$-hul>a z%#O#2+=OW;aKS0yfNs06O#~x~L0dK1+uJZK@oP*&fmf9R)_+dp|E*Uw|4qKXJPL4v z7%AJE2Tvq@x$fKQd)C)2wK{?Kr+Lg?3>AmHBOB+L-LrKhvqkfJb7 z1WYdrHbampXxw>WiKn&*w($z5(}yji2t8qp8mmAcUdbe|mYjB7dQzOct8!WazGNVi z5w5#JCHRWdxVRZB@Ch6;M3D%TjNwhF1S2VsmG1>>h-jc?t=gcskwrJry6e(mwi z>8Fk-uk!|kCD%i^*}$KI=LO$$Gy%+us&6CZ`o@X+;y0U9XIIu^0E?1i2?+(Wn$yw4 zE8C(KjB72!A#DJ4@||rqO|dDeGgsyPH1!s=6;F2uf*>l=ZhX=z+=q<#dn$E$s78b3 zZ$0GQd^Qv~mlPOvh97M2UZzf?lLFzA+A`Ec;62pz%DEe79;MC-+v)xLchmgCySW{Z zqiDmt-LMgc_R;V5(`z@rlEy!sGFq^Cqj;8{v;=Hk4FwtsoJR^c#4Q}-_&Ei$jnf^Z z9v=hlTH0!};gNUSaTx!l^R^i0iNbe>a4g?ALET9^tnqdT@9EQHHp2YE?)CKU@+5ut zyT6qVTem{1$fF@|k>f^H z$w3TDW%e(x!~E8(xDiPk+aK=eWY)|$002M$NklQa5q-5XR(2}PcAHgzPgH5(!wPT3*o6#hE$Uj)(ltrLGSg%(Cc zEZN3hD@Soz!u4MH^V+bBP9#`pg7(=2}TmP|@7S17%e!B76 zjdbVEEjAl+ZA1sn1;(_o*j4ywOhbWZP66vF^=rNM$=~^z6MIz6TW`9{u|KtTZobnw@#)H!H?#NT(BB4r$mgTp$>bwpuC z=ylRLC{M<1Td+S(eqv#a^J=AbXv)gzpyVoz7#p{l|Lw79@j4@9kG_I^UED#9K$yOw zM|gGjxIx%HWPu>t&0h+Pog!?Z#{19yu|J;n(~r~d{K0Rg!8Nu{UgEdcOIue5sWXx< z7igjNB;z;k-c9@c_tSv1`}0fgb9N~iS@IgGtOY{MGxph*?Izl%FOn1sPGonxJvL;z zUR+bDMk9V>UPcOpiuh4K&rd1VJjUdaDB4V^3gJ$uy<^@rp5mdh*LO*6QHiyPMM+(?6d8%6V#&_=ANk>P`wWH6G z+zsfLlmfOBwGOzMLrnyGs{3-6;!AAYq+;7Y%iw*9Gt{8|q9`za?X}mMf#O9`yGdtF z0VafZV!|S4$zi=)}mO>49K*uT4I!`*t0UqLt2U?b>T zED!)r5n3aZlQr3Gb4nVutz87fN9}Dke6(QVp+!d+J%n}$^X8mlo-fc~;61;iIYR2J z`cVd?9K$p1i3D@ofKsAT&=eODawbkB% zXE{imx5X2O$bUTeE=c&Y-4=iGEIt|FI*v4|J{d+l*O|$|Uz(@+lq09nPCjzkWrxU? zj}oqCQ-{!e5q`x#0tKW@W6Ryj=G(C*2&G#I!)u8UcgZPu9X**zz#Kj#zn=0y%M*GA6-T7sq*KjKFF| z)w5HMx|YWv><&Hr(dp+(s5RHdyhg&=XqteLttCY9i#XT~fT`iV%el+=Hgl{|y*-1D zV+8x9xJ`vn{<9`iz}jjvHvt*3%TLB3VA*cmROs9$-wls&mrYWkKn8#3d@bf;0#kmy z;Ai>@j~yBvPFsH19s!j%@Zm=r4o}nelPA_lPr)xOJ&n+k!!}`r&Y>$O!g&eHb!@i! zwj0c1u1DU`ezhk^^alZye7AYP$vvh0!ZhGt1zmgU`N{;ci zMS$7Xaq3L^s3|8M`XIU*-qJQ3$7bgRZfJ9!+ktO+c<(;*T+4wl&WZ3NQjFsfD=H0X zWP)Wt&GVd6fO2KS)TM8{&PGHVMQ+uxE~5Nm^C{(N^U8b(H$37_9c?ovt=QzgqD^)< z!LPvE$`@D5Fh8Ug8!%>`QCF;2wl(WZ%%vG2xjtrbyf`?g#JP}Y(b5}pjwsM{lP{n! z9K;m5?e4NT#VC-A1^f$0yGf#-UDrVuH?vL7&K(6-lllEvfyY9=pjQ{wd^%yYj(W(ci9KBM#DcAm#|FOsXyxP;5bbW7-Kxy)9JE^ z?9O0#kS~}R!z-MaWU+X1dzK#Dy#t(nx_s?A=?N2{1+Xtsiu_{n9VYzi$78+&$VS+Q z2pF&}6Ia6~+L(($0gCdp?Y!7>Jx%u!q}-^(QTJdF=J0;mo_t}CVahhAFAPzHe=YB# zmgxwCWwqdBG^bXUo_OIj@^=4q)a-MDl)I~sCbs~h(1N%yKUcKL{gd12czP5kt4ICI zsCQKzxF;E85Sd00EYcE($_UQ5l(rEF=RE0elc~n`TidW|XLCGWFoqOBwm6js^3ktF z){Gl%PD`5;;@mL|(-qbep=1C{3yGn~rO<`1h{iii;GL1k&$UPK=Y>a&BeZPJhOVyX z^{tS)1Cu#tCYOwKmBvw>@*~?Hm5B&ibI-e2qyLWno^nwbtX-Pdpaqs|2TxcjG@hgO z)05E)-t*O%pp=+QLw?p-%XT4ykUrger~_C=HJI2k6fMsVszLkQnM+X<#5!uC{0JKx zru5J*1CshAgVGbz)BC8h@1y3MdvxcEX*#@n91Qm5c$tpxAEo;Tf0*XGxLumSJm-FD znCpEubhJ<#P6okAWOBw#Q_W1%qj@^Ib&`6M-Sij!#9#XF{@9IQzMn%h&xQi$n*!A8 zTlS-~<0(vk1V$lPDiyrebJ|smA<<{hj%d%HWuhh8;4rysvF|DKFkoh%@NOOr1)h!q zRHjb!{k2}jOe7BrRy$2pI6kO*R_Umd;Zft15B-Xj5v$npc$w!a*{!$`nY4(oWNgTr z25lF{Bpk`b{tc`VmvC*Q*=^=)3))x~HalJl0KqO}o!dFGJACQ(QO31ku?VTO&3iYK*@%otn8Y%JbCJV+;~)?P9s&j-si?jEO)_CHMb z4(_IdqX%is+_A&SR|WBh$M@3S+gH(!wV!${`MM+UBAwV27xO)Z*38);XFgdCZT9Y_ zo6CQkuD|yu(&*$Wcrh0}?tvQ#LTFITM&!dt_+l&X4tctC<#IZL&ws)iGv=K75l4HT zLzwRzuX(-%6ewjEg=Tv!W&JSbv9<_D0vLzN)utV8UAdI5ee+6OGnOkHfoKd4UseNu zwg}%9xb2(T5^V;a;IUqfc`+1d1l2Ew&X1MK_rCYNXcvzaxC!)B6tDyHgr%oNH45VL zfb~>ho5&3XE))f96RH6Br%G_&s?hf*v*u-KGcOCC7pn4HkjyYn{I3@zD@`_DHVSO@ z_J<$0(pb4rmf6JG%!#7+3dZ8vRa!6zdDj(NUTL}7^8dM*5HiT_@TjzcY0_M@9w2Py zuFrHCl=9-=xt5HFz*je!H2$+oet}vzSt!FEn+CUA>1cWj)x$7DkY7x>f3(Yv=^l*K z?blJ=Iy*?SljC&o;A1kiNL$R^LO>s<=-BHY%oJz>)58;_D+L~=g~r|v``I$e5H!s zcm#g=6)xe94fiO|;HAP6MMxLiTr#Zi&pQA+p0I8YX-i!giw9`}bCDaXgCVovRP}^7 z3si%9cXe+uN~7MDwAH^_XeC`pCNv~q@!zyP<`O?Sw>o5VCW{5<-2RF`a8wJes>a#f z2jB}oh!fL@D1l3Cg(iS>Q;wPyLcO#oL=u@{mD#Vr!!6wL&t=ZL;E`6p!lwZ2=^JNqqbDPgj2KU=8Al`(@ZyD@{r!Q7$Wf=NlPpB;TsZQQ|qP^$5 z1tVR-)&fB_0Yf+(_f6yPebU~a9```wXZjt~bDEz{4|Y4_iOj^%0$_QEk&8&V; z(=g&tPgZxR%lXuOKCPypdVD}F-sg_%DfNEB)nD94-QOCL&UWg}srP6XSb)dT+l8k+AuO@I@%#sL+Wy2Q`$B_(ks=-F60P1uRuHkIVVfxK>8rRb6=4!#zKY zs)=#EhSdQ;F%~ijS-O#lF$fpjZ8MB%G2O`(zE=B{!d=3cVjG-8TLJSKuVqq-UgX2G!y3+}2#p0#J`_VOUTdmq8`_%5fS5%RK$*pt*^ zIOVkW5q$Fna{&90RbQWRI+)x`Cr5d$HlMK(W+kr>Q4?#x?bj})?Sq}P8fGm&lGLSR z8=-#|T7w&DgJ8__(r}he_I{L3?!1+DW^78tt9LRC+IyXi$hw&(pQbJSQ@EebX@u3~ z3XmbEaLwcNgsTilRGLRRJ_J?huB|aI2?b)Hioyfo{I1U^Ui@>dpl)OP_~v`*=wP4w z(0gh7+Fsreflt&0+JWu3fZ=5=Hy(ds1u~YXUhJEHNhow7&}; z_%7+2N9oGeZd&YfcP?7BIDE&lk|id=`Ut8AJDdi6eJdT_8mBSp;HEH0Qv2<+vwI2n z2sui=>phFAL7xLR3&kZAzgW4Nx?rVKS#*jDe*UCq5HLc0#=~G6-r3I6WH$VCH^q7% zUe0}vm@(M^Vz@I<&-%THuXR3hR!H&`%kawqUIZ%7FpW~yKwOtQEh!u7Epz@V+>Cm_ zR|vf#>rr~~9UC$N#wJw?m}l~O0^&w}Er}W}gbOu(IFLj0;jh#|Eo}afVY6(_@n`uT za1h`j3?2@55CYyK{4GMK($zs1R?@dbD#i9w6B6!F=p^vYL=GI<4D) z!&K&NX3vHrNe3Rm`HeuOu17>81(K?cT+okrFY5l?kKzPw3xTvO)__X_E3XCsu@2V; zoSYyaMFpqKVEcfq#2m(K^eu8+fp5b6=!Hm=^<7Th6pP8N(&r)?ZwW8+S3#-&#IGlZ z*U^RT2f?dZ`{D7BR|LuQ$)Tm$Y24G8nSS_LMRBfulN?>`ig2Dw9RJC|t?{Cf*ST3={%~yM1u(+ifS_`6##8O+cpQZ^1@}Il|}p zavZ%LZ5ad<9+J4egz^8BgjDjAI8W`(QU6cyifr@x$&(@Rp~o$O1u7E9x(o z%SsjAz*@{0ZzgE#m;zf^;s!o$ZW?mxdikK8X16&tIwmgTPItPM`iskHu(h2=+bB5g zkJ4gG7;Ms@F3tB3saw`{vPiaPCu#!WZeEd?XF;8Gn&W=-(McLjucvSA{HgRS*Z%CE zd%e{<2U~_9=~NDDXTeP-|9H)-!c8yTovi#}CHG)6p&0Ov8k!VE8bU^?vPFf;gmBH`f%- zaF(jQW?iB1H_tt&?F0(ZsS)^hSoS7~04sdP73XEK!Im+rLj>Xabj)cd_*4#fm{3l| z*vPHW=?e3+*AY}-6&Ptw06Yax)AnR}4F5uMjzHWF38}K*4P#@qo`|t)G>%l?JiMRA zY(P}OF(6pJIS#w2%(0Jl?s!UD`M zjt}AN^Rn@sX=UfB2IhrK9_I)837(*jy1sZ*YFj zP1~WXKgYL~=XzzG$ZmEfrMjSqzA-O~0(PN|IVTiAkWyO1IYH2WoFYUL+nXlzKF02)W7wuZ!wuZ zzc{`KIy7l~F$!G1eEH@Vi`m3#DDZR?xRGv5el)nrG6`-w#=bVMrCnKN*q>Oi>7b{t zFa}(I6t@@oDrvjIlcU0CUO?tWp9@4o$l%%Dx{_LBHVty!ME~jl1_n$8?iO1joak>4 zQ~!|rb2-g68y~0JAH0{YzV_|ZN2TjALWVv9i1~@Civw5)FRGkIx`lg@(gbrtMu#R) z5-C55o7TrRvQ>;1Ddbm_!3KcxeabA;uY})-8ctsXg^i@XxK(@#oxV7bCguyIK&e3+ zrAFnUomF>HsdY2lsE141lWnRsgHhUNlL?zh;G6=ZpSB0rQ13n9&fu+dFusj^n0pA> zBs1d{=;ahUL67Hb6girutHT?p1iwrQF#kAJqso4np$f;B+*^o(Jy3zEDR(y78n~7A z7u+8E0{aBrqW$>tTV^Pyb2yFD+Zmwl8Fs8f$S~lKeH9yuQPYgtNjbXVhJV&FksDBL z^R_vgpQ+?_pCOrKG)q17^*`*)6G=Z%itijg`~)qm_`oy1Ga#9)5xn#(eno%12EXy0 zL1th)<1Rh9wPAfLui<zJ;AtO8(&g2iYEUFIW zFKL#9TObURscb##jW`uHx|F(GaKdqmYat>sfrFOftC~@O6n?m~cA3kv;6r$=dQgPa zZSKrn+*_vo4-eD99ZvjDIeXUIPCIDYc;l<@q^n!~^x6#s%bch_K04-<^d4$R2b`j& zrtfS;a^iOV?XRX^`%8a0{lnk*Yw6=#KPE5jbmz`K_h_P0p3__NV};=``eC3iscw^d z^R)ldar(D^_0OeWx$&p}<8SqT@i#%SF%1P?8Vb-K?As^UH`qDY^z1`?+dV`dfmIQY zS1`EAJFa`sKROcvZ5ZR_AHCkX{|l%&{Mq0eF&k?`fhVVcCuk=MO^KSH8HUx&x=R<& z@Z$KQNE1OS8eL4bIdBpsityCZ7IJPSnOWYyjQG{&EZ#u)2bWzL+)QLfE~HZ^qX z<|*H~V=zGd<0fSU%8VhNp0+K47Iz6f@0myV@e zf25DBtG-&PMk!W;s^H#r_ZFMPR?dM4zH0Xw+eVDZ%*TMWLXh6$nwA0UDNsq1!90D` zIZA)$5B`37|KLZ!K1stp=77Crnj9Z6r<;(M0pleb66p)vOcvKkL8Ao+RNQP9TRMTS zmXS6>XjOE*p-wF8@q=@G+S~h4*06N*_+X zg8-fDH;EE+C}rLV&mkkH$HVAF0{JvhKp~zkKa#x_|o)a~J>%ql5`akg74~n*tPbNX73gQs=s# zlk>nY7#m{G91B(gPKqM(cNa#>05#xFzh=i{m=WymhshChG)~$LcL%}DI6`1DJ~>Js zz4vaq`udxkk{hM*gL`SPjS6v~&e4ve@T@!Fv^9SrtRWdy^~v=So{U#<2}6R}9;@5z z_C(LJxGgX9nN6KX)^tj#g}-h&T<~^l+$T!+*#?#_fl}aC^H6ZES$VceHqf4w0+fw^ zx$06VQEzam0)kSlqV&S9O@G^%KOZn*;B$te0essqG-XmQaA>c#(g;RmufLU!Pf+q>`oR`E2s^@iZIEm{{A8pv(2Th%^@K0TVI@m>0S?vtLL%+vO0 zH(k5_m2_?UTDtZ&Vcvje?>(IeBswtY_jazKBh<|flQf&6o^;-2Gt-n4)u_AQ83yy) z(_S4ow8qJii+eGW64(Ma{AewpG$x0 zSO0YS`PY8&-~HL{FZ}oBt1%4)UM31GmaF}R8g8Ny+9TPRA2P*BEe9P0M>6}PtI@sm zIW>k(`A3gW-)O%YeQSYH!!_@Q0? A*i&T0nlHr%DFC|Ry+E3<_aE^bmTL1gr&AR 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 z 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ℜ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 literal 0 HcmV?d00001 diff --git a/HDVF/doc/HDVF/fig/simplicial_complex.png b/HDVF/doc/HDVF/fig/simplicial_complex.png new file mode 100644 index 0000000000000000000000000000000000000000..345bacc6313ce3cac32a45d3ec85a58f4385b1ee GIT binary patch literal 177090 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%0A*SDNk{cm6 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