From 1711b9377d296a92ea751494099f2ebdf09ce6a7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 12:59:35 +0000 Subject: [PATCH 1/3] chore: plan linear recurrence O(1) optimization Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/7561d51a-8aa8-46c7-b22d-375c51c05ad0 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- source_.jar | Bin 378338 -> 378338 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source_.jar b/source_.jar index bde6b0655527ce183d346e015796534860f99317..7af7553c2a56e0927e054f35a32366d710a69292 100644 GIT binary patch delta 13588 zcmahvd0dU@_xHZvlynbW@j{Go3V^BW2Esr=R9w>-rFC)`}w^0x%cePIp;ag_WqLGHK)P|^iBTfbR=dtl=e(~d`sVNS}wS8VNvOic-P8ouk^g$6pE!C%Qsa6{aC`EBHz z4Ukx$O2pPmtb>ix*8#QU2RJx3M_fpUe)xA&havUw?<3#$@vm>^Q;qSje??24GnO?} zW)G^b_zWV>K7(W;Rizq~*~3v%e)8~<_8K0Can1<$92a4S@XYW}@b4etyOEve1j)^n zqe~mw%eoq80sPg+;Etzr+aQZiOcy0Jvc57rk~|X}nT^obkpU=Z$UJvFw$q~~Qv36K ze`=i;PN6n>kq5TQhUibRc^-Wgo07#tkg55ShJ^Hq`2e8{V)kRxK6Wf3lVVE<+4Dpf zo<4;&urN{CvXmorulViQ+>Kv}4Y*42UFfXj7#rf>0wW@M-fIK)vWb$K-~#{iw-ivJJIc zQpRBm0UwBDLsHWm#NRGFdls{{lco;50UEV=HaBu z?#uSre%WIy{q4D}88MeE?!wp4WwsWo^0#cCXoI@y?+?Q!eE%QVRQoLX0QxL{(}82; zh0ue8@b9jJ57ob2d8hfz%0i}c`|w{VM?U&!1nx$Yjl zfn4b6K8sj=rLvf^+WJ_1VsCi7EwT4JF&L#Lo)|;m+b8qUmi)D+x>0-P`=LZ8;@Ch5 z_|Xy3AwRkjIP_o_{$vTWu~43W^7I*o+S5xv#^$%u*Vt5)4MXO4&J85ynDb*0dinfs z*c`hMgiZ5{=zgXCB|mHiUrNKqTi=rB#n%n2=!&JVaueaVk1_aebrSA3A`=PU0b zw*J)~6cYc60r+=$#Yq|4q4z&T;(X=7a|5)fLkX=gC~qp6lJ}T=Rs7hqJ{6tO1vBOx zlytgC8>LmGb2S++UdEjA-T$Uw=HGnznml&BauKzk{`b2?%s1OFPEFNA#WE;&=9-x^ zlbDTZfnL83jo^;5{%vfbM*3nKA?v$i3q_&>4_(fz_*I$8qv^h^|G*khCLcTfcUWLd z|2XSytVz?FOBeQ@wAShR`|z+r$(8$h>Fb#~x$AEbgRPg|5qoNC(NTZ3y(+yg0(yR; zPa#o1jMckfEi>JmtzUrw#OmeALl^0-n`z5eN^rjuT{;BFI^9J_?t2N8A(5#xN*|8i zHT7PkAAw#stxnL7M1PoWFVk0$`tMfi|8zx2(H8x5EBx`+Zv7yfB205G>2DBZ_$~c2 zEa}|;k^UXTEO?~vkJZ&w^iqEjU1rL7rB5PxP2cFlsDm+9($~b@(@A=pbWU@YT45w1 z6`J!tMUoBAYbiA(Um0KLuj<`Vr@Q$l@4Q>@$|HtK^-WJ&N@K~8fT5BNF@|(d8IMnq z?0NDi38AJhMoE)V!J#0j4cYKkh!jPtH%yVb5Tqnr>VuWgWWQ7@!`f%MlP=9CmyF&Z zHA8n}ls$RrW~m;}-Yf*~*(~K!H^=Ui94G)plU^WU;V^A2kgUOHx<*5mYX@(T_z}C8{H) zPB)~N1o65pWzmoCevxSSbB7A)cN9}qAvGpUqkGa(3i^dVrPHMKxwIVH_J2va*g`+L zA&0{YX?qI)+$@(n9;S@EN@-#XOO=?*mF8FAn; z^brbzDgl`}|0->&lS6pFWd%5PA8r(W`DN)B&*bH4hpWX=6TWP_y% zK7-`RI4hYlN6A(cG#E?oA>dk&+=4n>87#LX~zkI2t+$IDNVWMZh?hyaVjGX-RJ^hHDBzL4A+b64#LsMiIVmdQbz5`5r-!%CVGH;wN*CWK%aQP+zmd%iN z5U=+v*@-azv*q)MX*@@!X~k3+ArByuH*;m0@=VR=$w_+hVAuDr9X|p|=cng+1u*oX z`_{ZPN-iU;L;ma5mjIio=Vj;2*!l7^!fsgd$M=1p8t#?R`>jk*7s&t9+u_PCr)&B1 zi@=x5=axxLc}}cs!y^~T_pm2pqva|zFKDssLavL5k!dMliiwqJLNg`C$s&6V@p2Ec zysuFXpw6Wv2=3(1RF@rICfgF`yF@ty<&H^`TM$q5a=9n{IJiRi%ye|6>_Cv8SAlz} z4`*&YkGcbv%95xZ)c=?R%$a+p2#-6hmT8f}`=rV*M8B_O*_Q*)=c-pc@|hifJX-i`?ETgoIY_MFWr=d@%ysfE?8%;W z@)=6o#T(^ZDvRy6%U_5QzY*DgZwd$4b$gm<;$oImO9OOP8{R|aJiTZX8vW_ zghSgj^R9fFI@IG=nU=Grtlwm+M>U*JiZ=stsy=Fwjs)sI8+6-nig5U6^H9fU6Hv!1so;R2Q3HF(^ok zOW6;xefiozxp$|^a0mZ?`=8+#XvvK<>TiEjX8~)v^TzNux#)^5+e0dsyRrFX&42CL zmHHsSbfq)fN3~{E4@Rp+)06&e9u=KQLs_K_Y@c}8r>q;c>po?E*k1jV(ZT@W&3aV% zuZOtLi=5~)D{T5~pFmimxyWJ{h64$3I#{gG$4+f^I!9d<4;jU%ZpMvb&EzWor%IXB zi06%BXfZDaprOjYwO$!1x!P-m@~qK>98E~tukqfa1>X=v6&Tl;QMgO0X6Pn?G&f6W zx2CgZ`l`$^4EK1v=NJ-jNa7h|Su16aWTjNXrf}yNAwOgmss6`apkZ&986+_FLB#0i zKo~wOh_yv||7DN1G$EDZR^qa#z@dH1D?(rU604J{vMXeToXJY>}i%!EU?cmf;T5*@Ph=Zo*6zw+SG#K(A#AD_T_DSZ|<=P?t7ZL20yG`?93 z8e1#Fme|(O_*>iYdvPw`1ZMU!YsA6vW+Dr~aAWMCF0_e38GQ95=1l#o_|!OI5-`NV zqluj{+)Qbuft@XNN&tA z)~n;j&%#UBjRnKz!Q)eHA+!aV)1ZKZ2&WU&>%au%PEH#oEulVNHBHTw@6+~|J_p(m zi2R7!yvB7k)VHTG+z3&rg5u^oopmSQ>^Rspeh0+Pndx+cHOzgMk+n;fwYQ9bIvNA` z$Z*!7PFEi0j2N^XBn=0t@70#bM})H>Xv2nZ@>KeAh@huZy4->P9xej-N?=M>sF((P z;0#8ahL9P=W4j75JZA=@9q3O2x++xy+}I~ z7<5ME0C5-2W3(9A2lG2HKAXpSq3gV(NJaKRzCVh2@`xzb3c)JX-Y7x!2&m)&;{~1< z#X2c&g?5%17dW4Ka=MUorO#(AQObUV78u=&s-e!x?4p*Iyqy;iRr!(HR1KA0Upv)t zDa6Q}c{LLWW?tz6HVjp^Tu8z$A0=Vn(t!w7>-M2yg5ntH9Iq(7pWH+IH-F-cl^sv6Zuxqiygobu@cef;}sv=1`jvJO(!j?Z1f z+ST!E=JG+eN1UW#4&QrKGgZyjY4v1;(oyBE`F`Deo66#0-liG38}s z&+1r_+`AB3VDvgy4RzrE#6o z6TcD1TCPL*tBa6r zX$zNq02H6XQ?oimQ~O*(N@c+%XUn07`y40++3~EdHaCqn!)3lXp1Ja>c!tMs+{s8L z`>Ei8M&^m&Spqz*oT!zJ<<50-4aHW^9!|A&@LNXK8ihPOM7esB-!U>5W%hk5-aA1= zeMkb;p~@P}X9=tc@~FFxZWYSNiguRWdQC2KMhb;VC-*n%*N4L6Sy2{k8) z(fNVzTFS3|Nn(kE8zLw|8~Oeu)?A$BH(SnZX)QlI-@Vrh*k^TrTc_)4R*LC+-AvvN ztzNa9dfCQ~w@PC!bg(Z(on9`KJ`n_uoGl4_R~6VD^8Q52MCTt)tH{Q$$7*p_{MA@}6MlM?n&IEshV|=yGV%0OJ*HV@^t|=CYU8#^P&XcOHWbz zd_3_*lMEPK_h4{ocK5~$%W5&%CFxAGp0=#!iExw+snFr#6 zR})Lq-L-IhHET&D@#x!Ls}x8*Z`e?2E9b;ZW_lYQn93OccQtEDIn=o5^|I{^bUK^& zEf!qdCsk~7=B84%cjINL%(YG#?A+`R2L{I)lVM-cs&>Bfl2rAurp3!e;T&p{5&TnA z`>{5)NMrAi6_4%TS~d{SlN;%DHA`_MnVrVE63K;^S*P8sVGjd4Q_WJGA4^mB2WjM- z2rF*Pgb|fvCAsmz>1u$E`b{Z*3`VSh6w(-B^mY>TAx@Gb|Du}yZ@XRBE`neDKGErX zYxm0->@4V0oTU~d9|ME69%dkq43RJaa9#zK`fy8b+{oZOt|eUIz)e&me&%!49@nSc zZhi;yle_42?KJZJhSp+QI8<`rPcuYz;wc!^=YUay0Pe3GxZfIvr?7n38q&C0#l^1? zhU^jGzs8tZT=?@fVt3p?A(o~gW}H0_P{b&oA#iC^%s3BTtOzsC2;4W}0!N*D6)rWd z>74H8-lJB)q<9xjGc@ZkqqMXZ(|b!L7h<9Sw>|uEd1u&X{L#U}BYe~63~yQZ)z8V` zfDN@|IIk5;CM?n5n`xUxaOetd+FG@CM1FN?-fT$HZ{Vm;n_d}f)t%mh(z`={f($$g zD?n{LM(nF4^37U?hwU8I!4we6<1?9CJIyjECHVAPj?v%2M4SfeV9k`s<1$$f8mpC8 z-u*cq!oCBZw>07Z(uC@o@u!($c5A??(^C!$FkA#S^}mhl@M7q{I*Ss=FIYG7Ls-m?L?nT`XbV4FEkTRjdBPVWTi1U``Qy$JuG5@|D2oX_C3t4lrJX@w>I`^bYBqlgc;I^02Sb{+o)nBb zFBA;BBsJh!=i%%6dZFc^AaK28CUE8NZBWPad-rrjrO**as4v=jF}z&R$8BJ5k#qZm zD2*q9OTr;Nv_})iH>gJwvBS?)<^o9&lylA56K}PV`H_^s@AQ-Kc*zz>v^gEOQ7xHg zwk%(71vae!=W0nxs!96a=)Is7XBF79 z<~%)%HKJ&a-5ITqgQ8{+Nug0_w7w^ta5GEYV|@R#S)Wvp_8&YR8mT}0DM)>?)uWt& z*XFz&3M8W}NqJZ{>rBo_o|xD%9MDVQ(T=!%+2Te5#{mr3GkiaY<)NEk4)oY0;_AJL z0x!Q1;~a3bKvOHqZfD+k4@@U?Cv9;cSt>a1)*|6eU1Ue@zC|6N)=lcq3jybyfe>iZ z&Ob+_U3?B{AKcWerU5^i!{{2nRN&gRHsk7XxYoAkt~sjwT)V;DZbBXfwz4Q&yx(R~ zG#76s`I~%e$++k%JCO{``!Ye$rE4t$>n&ov(Qykgd-OEpTr5k-QbE$Hmzks|Q_p%oJ!8V4kmGCzL+;4(l>A79i?2_L!>Ko9P0Gc($z&LKAAYHv(glpe+ zQaWpr06*N$+{kuchorV=K*C9op!Ll9$%6F#uf+Z{_$!jIYl;B#uhcsie%JK*W{`k~ z+L}6HJU&&B{_&MMTwT(x>$d_~b5Pb1+UidMZ@GiveKa4pgOsFC7o6*M2+!vU@VamT zezZfi-eKGQPbPpc1B@Z9=NHWoqyu(}ML^h265M*0aBS92)|kpe!nOQPYru{>@M!Xm zm+n*#-5nQ|Wru;1P*9@npv@eiQNP`hj_c*fV1rCe!;NE-Gb6NA79AK-~&K`?|IA11$f!e2HNUR zfpJ8%ApHyKDdvGqE_rhJVgddjS2#FWfG5QWFgVPG@6J^n{AftbpEwvMf^_XVEh1LX z?~Ik}oa;L5B~8(Bf@H{E)`Sw{s|z`!pMbQ>AWgGS<#Bt(fnl-W>|zw0GmLUm{v=mF1Crvz7~-?S9sbH0lmc_@w~E;KHjr zwAG&is@N^Ee}nnO8_P6rmnP^F@mK`Uudop;Qko`yd*=mv7FWd3y9NajUY)bP($$hzauL)Ku@C$mLW(`1nG?e zQH)**36s|faQ0g0UY~=adqWSB^jVn#mvm61NVWif&qe*ZdQgm$rvjX_4yj#vTbL** zdncTpadReYi7UEUmbH*WtUHm6c`$M0uV8LtSiET}Ki_|d;k&f7bA=7UhdWTX3*Wax zu5am!&L*;UX$?u; z2dFGnh3ZnOhgZ*~M)2koSd(jC2`Mhryb=<2S(uV_S+=rt)%YUP@KrTQ5o=E!yMCje z(*o$!HAtJ9w*c^1F!XMXG;V)Hyv^f%gv7l4Yb{*FuX0_tdv-s5pg+hhfoTg4M$DfA zo_B=x$3EkUGMr2}e9hja1IjlUQzo2(|Lip87RwOS#kk$cJZ_ z!|oygBB8xCF8f;C8oM7QGpFmg-!ay1ZLYzdzo%}=mI_p&fl&NMgTa}{9aCN1_?3HL z3s?uP8)tDs$o0kI{wuJUB+qRk*fWd8dqBkkeBM)lo4jRkB#mV6)76VwhJn-{LoB8C zIVPm093!dgMhW)oqYQ5RF&Kq@dJQ-@MgC!yfuDG7Xvv3OF*M)~vkkW9GoJCsiNf!D zl_Kl7y1ej|?Pd>#sjkIAi-R{_dR)AXgs%#)D*vsoiM2f+bAs8n!ZYe^ImX#5APQ&U zd0!Ka->Yf&onT%>yXfD$za;_933&QxXfIZ&ay?F}N5e_I=QmppG&ogiXnE*K7Kr^- zPprMf#(oVx? zZ5b~+2?rP%--tT6_ZxEC5;qlo58xE9D`8XQ)v$Mof^%ZcmYKKwmiZIOg@x|=X;8Wb zG_qVv#(pc-l1IKJ>2W<&=?8nThGZu3r@OU$+z3+mI2?}jukAAKbBcXLB+pLFYkSZ} Qr^|*c*Yt#MI>p}qKPnr9o&W#< delta 13586 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 From b0c60e2ad9192cf65539e9bb6de9e4cfd00ef29a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 13:00:25 +0000 Subject: [PATCH 2/3] refactor: make linear recurrence formula path constant-space and composable Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/7561d51a-8aa8-46c7-b22d-375c51c05ad0 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- CHANGELOG.md | 7 ++ VERSION | 2 +- src/main/java/cod/range/NaturalArray.java | 43 ++------ .../formula/LinearRecurrenceFormula.java | 101 +++++++----------- 4 files changed, 57 insertions(+), 96 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b29c870..d9f20b93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to Coderive are documented in this file. +## [v0.8.4] - Formula Lock-In - April 12, 2026 + +### ✨ Major Updates +- **LinearRecurrenceFormula moved to constant-space evaluation** — Removed range-sized recurrence precomputation tables so recurrence evaluation no longer allocates memory proportional to covered range size. +- **Linear recurrence composition in NaturalArray** — `addLinearRecurrenceFormula(...)` now composes newly added formulas with existing recurrence formulas (newer-over-older), mirroring the optimized conditional formula path. +- **Recurrence lookup cache cleanup** — Removed per-index recurrence-formula index caching to avoid linear growth of recurrence metadata with random index access. + ## [v0.8.0] - Fancy Machine - April 07, 2026 ### ✨ Major Updates diff --git a/VERSION b/VERSION index a3df0a69..b60d7196 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.0 +0.8.4 diff --git a/src/main/java/cod/range/NaturalArray.java b/src/main/java/cod/range/NaturalArray.java index 2ef9b447..91519054 100644 --- a/src/main/java/cod/range/NaturalArray.java +++ b/src/main/java/cod/range/NaturalArray.java @@ -63,7 +63,6 @@ public class NaturalArray { private List sequenceFormulas = new ArrayList(); private List conditionalFormulas = new ArrayList(); private List linearRecurrenceFormulas = new ArrayList(); - private Map linearRecurrenceFormulaIndexCache = new HashMap(); private Map computedCache = new HashMap(); // Pending updates for lazy assignment @@ -1427,7 +1426,14 @@ public void addLinearRecurrenceFormula(LinearRecurrenceFormula formula) { ArrayTracker.recordFormulaApplication(this); } - linearRecurrenceFormulas.add(formula); + if (linearRecurrenceFormulas.isEmpty()) { + linearRecurrenceFormulas.add(formula); + } else { + int lastIndex = linearRecurrenceFormulas.size() - 1; + LinearRecurrenceFormula current = linearRecurrenceFormulas.get(lastIndex); + LinearRecurrenceFormula merged = LinearRecurrenceFormula.compose(formula, current); + linearRecurrenceFormulas.set(lastIndex, merged); + } clearCache(); } @@ -1435,9 +1441,6 @@ public void clearCache() { if (computedCache != null) { computedCache.clear(); } - if (linearRecurrenceFormulaIndexCache != null) { - linearRecurrenceFormulaIndexCache.clear(); - } clearRecentCache(); lastIndex = null; lastValue = null; @@ -1507,32 +1510,6 @@ private Object evaluateConditionalFormulas(long index) { private Object evaluateLinearRecurrenceFormulas(long index) { if (linearRecurrenceFormulas.isEmpty()) return null; - Integer cachedFormulaIndex = linearRecurrenceFormulaIndexCache.get(index); - if (cachedFormulaIndex != null) { - int idx = cachedFormulaIndex.intValue(); - if (idx >= 0 && idx < linearRecurrenceFormulas.size()) { - LinearRecurrenceFormula cachedFormula = linearRecurrenceFormulas.get(idx); - if (cachedFormula != null && cachedFormula.contains(index)) { - try { - Object cachedResult = cachedFormula.evaluate(index); - if (cachedResult != null) { - if (computedCache == null) { - computedCache = new HashMap(); - } - computedCache.put(index, cachedResult); - return cachedResult; - } - } catch (ProgramError e) { - throw e; - } catch (Exception e) { - throw new InternalError( - "Linear recurrence formula evaluation failed at index " + index, e); - } - } - } - linearRecurrenceFormulaIndexCache.remove(index); - } - for (int i = linearRecurrenceFormulas.size() - 1; i >= 0; i--) { LinearRecurrenceFormula formula = linearRecurrenceFormulas.get(i); if (formula == null) { @@ -1547,10 +1524,6 @@ private Object evaluateLinearRecurrenceFormulas(long index) { computedCache = new HashMap(); } computedCache.put(index, result); - if (linearRecurrenceFormulaIndexCache == null) { - linearRecurrenceFormulaIndexCache = new HashMap(); - } - linearRecurrenceFormulaIndexCache.put(index, i); } return result; } catch (ProgramError e) { diff --git a/src/main/java/cod/range/formula/LinearRecurrenceFormula.java b/src/main/java/cod/range/formula/LinearRecurrenceFormula.java index fea973bb..d0bc02be 100644 --- a/src/main/java/cod/range/formula/LinearRecurrenceFormula.java +++ b/src/main/java/cod/range/formula/LinearRecurrenceFormula.java @@ -12,7 +12,8 @@ public class LinearRecurrenceFormula { public final AutoStackingNumber[] seedValues; public final long seedStartIndex; private final boolean hasConstantTerm; - private final AutoStackingNumber[] precomputedValues; + private final LinearRecurrenceFormula newerFormula; + private final LinearRecurrenceFormula olderFormula; private static final AutoStackingNumber ZERO = AutoStackingNumber.fromLong(0L); private static final AutoStackingNumber ONE = AutoStackingNumber.fromLong(1L); @@ -34,19 +35,51 @@ public LinearRecurrenceFormula( this.seedStartIndex = seedStartIndex; this.order = coefficientsByLag != null ? coefficientsByLag.length : 0; this.hasConstantTerm = !this.constantTerm.isZero(); - this.precomputedValues = buildPrecomputedValues(); + this.newerFormula = null; + this.olderFormula = null; + } + + private LinearRecurrenceFormula(long start, long end, + LinearRecurrenceFormula newerFormula, + LinearRecurrenceFormula olderFormula) { + this.start = start; + this.end = end; + this.recurrenceStart = 0L; + this.order = 0; + this.coefficientsByLag = null; + this.constantTerm = ZERO; + this.seedValues = null; + this.seedStartIndex = 0L; + this.hasConstantTerm = false; + this.newerFormula = newerFormula; + this.olderFormula = olderFormula; + } + + public static LinearRecurrenceFormula compose(LinearRecurrenceFormula newerFormula, LinearRecurrenceFormula olderFormula) { + if (newerFormula == null) return olderFormula; + if (olderFormula == null) return newerFormula; + long mergedStart = Math.min(newerFormula.start, olderFormula.start); + long mergedEnd = Math.max(newerFormula.end, olderFormula.end); + return new LinearRecurrenceFormula(mergedStart, mergedEnd, newerFormula, olderFormula); } public boolean contains(long index) { + if (isComposite()) { + return (newerFormula != null && newerFormula.contains(index)) + || (olderFormula != null && olderFormula.contains(index)); + } return index >= start && index <= end; } public Object evaluate(long index) { - if (precomputedValues != null) { - if (index < start || index > end) { - return null; + if (isComposite()) { + if (newerFormula != null && newerFormula.contains(index)) { + return newerFormula.evaluate(index); } - return precomputedValues[(int) (index - start)]; + if (olderFormula != null && olderFormula.contains(index)) { + return olderFormula.evaluate(index); + } + return null; } if (order <= 0 || seedValues == null || seedValues.length != order) { @@ -98,60 +131,8 @@ public Object evaluate(long index) { return result[0]; } - private AutoStackingNumber[] buildPrecomputedValues() { - if (order <= 0 || seedValues == null || seedValues.length != order) { - return null; - } - - long total = end - start + 1L; - if (total <= 0L || total > Integer.MAX_VALUE) { - return null; - } - - int size = (int) total; - AutoStackingNumber[] table = new AutoStackingNumber[size]; - java.util.HashMap values = new java.util.HashMap(); - - for (int i = 0; i < seedValues.length; i++) { - values.put(seedStartIndex + i, seedValues[i]); - } - - long computeStart = Math.min(start, seedStartIndex); - for (long idx = computeStart; idx <= end; idx++) { - AutoStackingNumber value = values.get(idx); - boolean hasIndex = values.containsKey(idx); - if (value == null && !hasIndex) { - if (idx >= recurrenceStart) { - AutoStackingNumber sum = hasConstantTerm ? constantTerm : ZERO; - for (int lag = 1; lag <= order; lag++) { - long prevIndex = idx - lag; - AutoStackingNumber prev = values.get(prevIndex); - boolean hasPrev = values.containsKey(prevIndex); - if (prev == null && !hasPrev) { - sum = null; - break; - } - AutoStackingNumber coeff = coefficientsByLag[lag - 1]; - AutoStackingNumber safeCoeff = coeff != null ? coeff : ZERO; - if (prev == null) { - sum = null; - break; - } - sum = sum.add(safeCoeff.multiply(prev)); - } - value = sum; - } else { - value = null; - } - values.put(idx, value); - } - - if (idx >= start) { - table[(int) (idx - start)] = value; - } - } - - return table; + private boolean isComposite() { + return newerFormula != null || olderFormula != null; } private AutoStackingNumber[][] matrixPow(AutoStackingNumber[][] base, long exp) { From a5f40752ba484809730e6dded882a34f13174145 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 13:01:07 +0000 Subject: [PATCH 3/3] chore: bump to v0.8.4 and align visible version strings Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/7561d51a-8aa8-46c7-b22d-375c51c05ad0 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- README.md | 2 +- docs/partials/drawer.html | 2 +- docs/partials/home.html | 2 +- install.sh | 2 +- source_.jar | Bin 378338 -> 377971 bytes .../__StaticModule__.codb | Bin 0 -> 35008 bytes 6 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 src/main/cod/demo/src/bin/test.linearrecurrenceoptimization/__StaticModule__.codb diff --git a/README.md b/README.md index 565f523d..cb89660e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@
-[![Version](https://img.shields.io/badge/version-0.8.0-536af5?style=flat-square&logo=github)](https://github.com/DanexCodr/Coderive/releases) +[![Version](https://img.shields.io/badge/version-0.8.4-536af5?style=flat-square&logo=github)](https://github.com/DanexCodr/Coderive/releases) [![Java](https://img.shields.io/badge/requires-Java%207%2B-ed8b00?style=flat-square&logo=openjdk&logoColor=white)](https://adoptium.net/) [![License](https://img.shields.io/badge/license-MIT-f5de53?style=flat-square)](LICENSE) [![Stars](https://img.shields.io/github/stars/DanexCodr/Coderive?style=flat-square&color=7289da&logo=github)](https://github.com/DanexCodr/Coderive/stargazers) diff --git a/docs/partials/drawer.html b/docs/partials/drawer.html index 6892bd52..5f16ed32 100644 --- a/docs/partials/drawer.html +++ b/docs/partials/drawer.html @@ -41,6 +41,6 @@

External Links

diff --git a/docs/partials/home.html b/docs/partials/home.html index 69c653d8..ce760442 100644 --- a/docs/partials/home.html +++ b/docs/partials/home.html @@ -149,7 +149,7 @@

Parameter Skipping