From 9fd22a4f68385dfaa3559fbb504daed714ef8f77 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 06:31:32 +0000 Subject: [PATCH 1/9] Plan: add array literal scan/zip/isEmpty methods Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/d041c95d-62d9-47f6-b0ee-a71fe3d10a62 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- source_.jar | Bin 355505 -> 355505 bytes .../src/bin/test.array/__StaticModule__.codb | Bin 44493 -> 44494 bytes .../src/bin/test.broadcast/Broadcaster.codb | Bin 0 -> 49899 bytes .../demo/src/bin/test.lambda/LambdaSuite.codb | Bin 0 -> 19107 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/cod/demo/src/bin/test.broadcast/Broadcaster.codb create mode 100644 src/main/cod/demo/src/bin/test.lambda/LambdaSuite.codb diff --git a/source_.jar b/source_.jar index 8869b7514bd0b41b88567e3021ddd10109fd68d3..f9adaff99fb75691aaef888587e1a7949fc81df1 100644 GIT binary patch delta 13598 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 B)xZD% delta 13596 zcmai52V7KFv){d!L$3;mbdaKgG{r8sii#plR8&wYYAlIj?`0Fa*m9%CSTP~Q5?e^J zF^QrnYSf5+L8G6M1WmIb`to7Sv*gXpx$LsL@BQBXe(PE0%=~B0%$zypUXR`II(Ea$ zIV(-Janxw+?KQJwHaka3@NZ%o{`-2UR1&kfA`<_tj)H%c>>5AimgJxWYn}1W7;PtP zbW&TTRO^mEcWd_wN>^yOev*v*fv&Q~q@*OK@=Gb1}V8)S=8o4oqspI5z3 zdE=kDHEp@O9dlINI@l`J(I`=QD_SPjlDX7pqquhTLwZ!lY*&<7q8o;PUez5$Hhwu# z>!<8W4aBY!sYys8o6-lhQep?TL~_c&-PrsxaIkAhOlkhIFA}}ZXf&D|T1C4cg4a7T zSDxj-T$H7QE(2d>c3QC(+fN4TsQo*A0=0#i!PqKqWDUpWX4b#4Nm`u1lbo5euek$C z^M8vNd-!uuvqz{w9z{2#24qYIZpyJ!vU12#V{(omoX5~SXey@;ttMT`!v`XD?Qo7w zo7@U)F66GkMzKBV_8``atxtt@@lJG-s+?T|C{`3J0jH+mWCwDD|eOfBwaW z*$rBaro>jM+Ytd|$I45kwoPn&PXKeY7=#kM@jr;-y(t?(Cv7@ThJ?Mjmkc?pjKbbF zZ{5Nsd3b`dbc>UcyafkZnZ9KtG4I=&h$SZnNA4cVn1#B^>DzsXXWfoe z6uG+NB17bN_YTG8@4e5l`Rko@?Ck&U0OH+PJ`$<-%74S=tdgJ~JLKW>fG?H_+BV>{+}f0C{E>`xmM0#(YRDy!VMQWa*0?0=nkO1^pg?Q?1yF3zKN zQuPCBbN_XoOlVURjcD05anSG!)1)x|D2CZ8hiYh)CsO@*#$m|;iLOdL5i6h7^m9NR zeQM8Om8f+5)sg=8erSgSs0@1QjwV*dKi}34TBsZ*5L;dnr?uxV!l?opoFcT4CnYh4 zx1+TOah!(!aoW`w8mv9tkl@r=%c-Zln>G{i4UK)Z**FM8YJcr7sL2qMragl-&+w#B zJINk@6i(Kr;xsiJ+@ifjl(oCHkDY+R7a!1eq^ynit#@NC8qN4_Jlk9HFguh66`s%Mp{fg{nklK=*KsuQYikw=!Ws5+a${b=3yJ8cTo1+2I;s&MzpGK zA9ELq%PhvVDPY7V9dqZ;bj-!@^=9c$f<3NC{^YeEwn&xqqjZ}@6Tq-?hqQ|*;kzZ8 z)_m$7=>clUFO$55hP?grwM(2d8rKvazgr40?0QFfi&CZIVd*?t`_Ex%6}GF7NQbb6 zp@;F<{*3X0qr$sWk4hD|ObW-xeGh)>T`jsYs--U|ZqDCJ6=d#5HPS768r#YH-+k?7 ztI>Su#XUk~AC7{C6St&DniRj?kwPi-jt`{G1hK0@dO)#T*C_o1>I|h%r1O-0F*$X9+u z$@=3Dudc3v95}>(PLe};gP;5dj`N1UT#e`l0%U)ZJQpat(vRywauoewAu7cyRQ4p$ zs5WvP3cH5M_fhy+m~5*hM|4*5D>-PX*YIVxZG1SH85berx^1`xa6}= z@(VQTc%p1C63e-IWY;R-Ox23irBOZVBIBxNsO~D;k;&J)$+PH3Mi03w{aD>o9*jTu zwO#`9Y7+RA%w4{J{<^OLa;|D_Z}}%=bl1t75%gW194M?T?%T1k5g4y(#oR^RhDUv5 z7t-)gU+_E%*!7d$=!Z{#5hO#*05yJjsWR;$_^N?&Bl0d8B-1X9m!-*1Q0unA@_n)@ zcJkrP9^kAo{K^`sHATR#UjIWnLK83itygUY7*UeUvS9@_-!q z2UPVWN4_Xi9E#3QseRQ!qxmI~Yg@`ehK5}EbqDGhdAB(GR{-(0#R&Nub`;A0pdMII z{glzQ4*XQHjC)kW)neI~rqAOEGHp9~r-^b;GW_d@*DrnpUYd^XY|RUn$<91>EEMFU z6DhxOAJ-2t&P|eM&=S*gnLHGypyACG@();aVPoXSgF|EoUQoz9jg|b^M%fXIh~dO` znbumvnw>Ijehm+I$y6~-l5rPgPm6WK@Xa1MgeLGGhvgrs44g5@zO*LX{#>3x0~%f> ze?&^0FUSQ{-KSocX9S?y+l}&G5?{e=V#xB3{cP3^C(qS=SNQ!J4~=GO77q!9vQzL1 z^END+VWZG$;<4OjRVYBEXeUA?O!2}3 z5M+3G(`Gpp!CAL$Xg6xO@xW##xgn#`=9wcLu(qVJL~LGXy|MY4;T{Hv{=9{j;pT~V z&@x|bJx|rLz#y}Q7b4yQzT)GqsndyOudyF?u)gX^=6LXG^R#uLVxj@BlQ( z^|}#A4QQ7I8&OYL90pOJ?mvG|F97k$@C`S@Xf)+KQ)0OGHpwS)oy-DU&E@%NX9Ayw zo$al_Ju(jbUIVL^jZUM^c)$YUgV z#jM+%AB65;%NVsY4hvm>ErG0c?dWD{jk_&j26b#=;3I(&UF^K_9S|SJ|<6gja+380Fi*so9Qq zvsZ`uURUp1*&r|lzVSkm{)NB{R6ORiQQ`*L@(uRP+iD~+Ms8Gf+MXqo?@Xs}ji!f@ z1@cWFF-R#)i^HQhO^hiH2FAS+yb9w&Qfo0%mbdDrg zpH6Ta9T`r3en?P4Y(0wu@fOzQx8As#OS)= zB~t5k2ebLHAQrAX$adg^;IL1lHC+N&j`pu+?B&i3uQ(_UfaH_|mWL{va_qT-3v;4j z|1w-(G!E=r3}3T2@OT&2$IAI8&!F=+xd_kv>_YYz4OK#hCi7mdEE=`?2UGTR}Pa~=66H{rD1qPxo29gadc z1EK5%yR$Cjs5d5G-j)ZzGvOO6Gzc~NO(Vz~mqxhpeeMGC=T}JhiaW#O7kBm`1D1^> z#*-ss`9crDs8))fM=83zNPbDB{wVmv^MIOW9|;SC*Mt0XAg7^4-nM zqJ_Mq1#7RI8r{NjlDoAeOXiK?(_651%84cIA`A(26p1cFk-JswUO%FL`x&6@fw|JZ2@TqE zUggPh$?r&QDh}qQ?AAC04pRcg+gT2Cnir{#7;ofIUK{UhHJ<+)+c1kll{DLt`+GAd zvSjX?Sx3u3BojQ)5k=Kcxn46{pm)WBA( z#s4$LadQ!w_x6DU$HG?XoE@^lW!DN&j{EU}O;$i#u0LdASK=1fE6?ZpSh!}Z4_WZ` zye8ZZ7^-Q4dUt*k)d9p?@bf;Z#>-)gSMLA~7%Ov)o(r3c*z>a1u-L`4W*_xDj zFS6pHd9Bu^gvD6LxSKC)Mc%mEIBcggtpAO$+V?OU-V!6HlX7mc)e5%RmwbL_71p_E zWy9*$RuR85I-N$9~(e6 zcy4UsXk%4jO(}{M_NM@rLM*{=SGc7?27d{YYDjYr@ZN!}m{<-4cIXfbEO&urxEaf- zK=z7N#$xdmA6%6_SJ011R#RPfDnL5{*mlD=Pvys^oF5KiuVS`fnTIL!3{~SpK_iQDwbC@>PvS}EKY{1TaEIcbKjc} zLQi3nY!-F?I8%v(&`aCXzghMOHppppI$x1NPXgcQa=?K=5Sl-(>cX>bP!o)P~;4qIo zB3ZH(irK+~zZS_Ntyuic6dj9XR1$xVBnxx)@sdd9qa4|9tE}JGg2%KKsnoMAbuZlC z)ZLQ0tia)bsD5x1hubnb6zV5|biMBC0p&3q|D4*XWj66t&Aq1%aIA{dXu_K0pe@(C z9wg2o?N}>xpIVqwKSnCta=Tb2O%YwirTh16IJlgLa7PioH+ ziDgE6-(!_F8qE`TOO{Q*VwE*!KGtolQtGOF_>16qCMZ%VyIiA3IEPT(%Lzid7(tQppLF4 z>KoC_ldP_7w_w8t7`qJ&F4(9O9h~+r;;fEl-XkrKJg!DgoE5F$B5&r5;@H;;Cryo= zTsWsN)_lS?yP5_$vlB8;>cHBddH?jFt=y6hteurNO?IKSBQ=Wdxi626VfOrP2i18Q zl>t2(?KPUt(Hc!Bqj5Nl1|xf00ogN?1RnTV6d`@*S`+ZwF~Y2qG33jaznHpS zLKo%4o7ZX%e+jwS2R6U$n(O3Au?(Ng@CC6X-SR0)D+8Z;SVW3n5e(tafgy_f#;K!0 zFvtY@1gouv?g^^Gxi%55gYanzFNkBFWXVT+x9dB>nBoI88dG(_3a~j&RF|LQ$ddKZ z&BW=ENpQS6nlsLY$z7p1dqD1*d5{;xGrX(fcw~hs`Ze5`C9*(^+V?1)6#PS-0X!;! z1yj}~5P4fSlHqGq@4>d$u5d8(zCb>q7kGckj=hFRy^R634z4Cm{Z^6Wktw&w3})L2WuOOJqJ)E2-&G zkwz0@j5EeWPTsGVSVyPf218m8t_&)n6pJl@H%*jVYSdkB8po{}f=Qy5xo z7<=X`NY_PS7H;8Fd$4YlKC!pwthfeIy6j`YqCYrXK;8!Tp=DTrVRoO*N3ti!hkRD~ zI^+FoGpE9%&9Ay!Bo{B}sqRE*U25DKHp4ekq9z_&_DI zWOX~TYvmtZK8G}TIKy(Uk(8`%M}A0I-$MuBDeyHf9Gj9^0wu?P581g5A2huLV<10_ zAGic+LMdFdZw0czdobn>n+@=t`4`>3-Ti! zV{Og0$EEqNzPPr36o5^EFRatXPdN|Lv0mtsF*+&&U+@qe3*<*POLn|Wryhb$4{R-p zt$yxiqs}lId$->;pIruv-68YMi%)zXrX!YKV-)Xk;F`&hVWx8-mfnqh)N|qDjEm0> z0m~?uVrKVS{81m)o7|IiMmuf{us8#Yd9_`zgYWGNg=tD(_3(4?omJcI!KT&VY%^BA zyRSNT`rPUq`~i3+#nRclp|2YF>IW@nT!-%eg4I6M=s+}Em!ei)(_?2#MVnJtCo=o& zBi~*dK>8(ogPWu1BM%E#zD!|W6U(~d6;YF+dntU)Hm-b0 zKh~8LLeKv(DWZ<5^#&h%H}n%T<3&H38AYbPw#`bEV>S0kWxkessXhHksE_F7^Qxg{ zKS))tpdDJ-%^U-My9nMlPd)bmBK0x{kodkD0_U|glB1Od!LsU>V1WnfuDnN+hC?m` z6Kf%vvO+8ipKGdGjNLw1G-xmwumyHEW(%(V<$VF!=>e1ygv8;N!64zpvbjO@T~8G| znEw{!rHz7|Fp&8ocLub;z3d5+{ovs$^P}iAcfHxMgjWq@k#udkd*$12gt=)nr4VHE z!udKsJrF8Z;2^O^^uQfpx&Ceo{y2mA@PL-G8(%g^SgX$eKfQSN5SY8?2dQ_2i|&_2 z{Rp0a2#Z1l8l!&7^)cRpH7;Ie+$W9UQ$ikMu6=tGX!u{ z1_3*S3WNz6qP*$_IjD``K9Qkr{XIASs4WLzKLCzu@-4LG{9y*`iQ|gSq?+2mAEAq0 z$rNgq0u@5}SGZ6E??kxs^O>sW+}`_RSP=l)K(e-P4yyklLh!psLg-J95}u38A}oDd z(KjWFwW8E}{bpr{H$l7(zGea7d$QE^#eLqD-G!j305qAeFO%8}v=-USi(L5RTIhto z07(n=7Iv)0Pr2SXTCnzumc99cY;_Q63!WVO9=O(7dPYB_gW!i(CY<=CY>{|%*))i$ z@Sf5L7Q%yvFb^7p=`|0_>XtD?t!~D5JwTILanV1CGp4w^)h5UEDu`uHcqa%0;pGq~ z-Zn?AVWt;EEPTbYbJRPC#@07pJqcsR2Ow>X9>UYY;Z6ebs~q*VHhv$GT7v`n8 z=MN3a#^l$Xdj^o-kx#gcXL&TYCbNy{Sm<6 z#;h~6O`mf8pM3>?bc*a}oO^jA2 zJ#VFniFIU@SW7Mna_L|JXqP9V5R^yU^V0=+RG!Ge>4JPQLy$knQ*U+)FC@Qv7S#6x z_2vnGBulW`kPB53kLKhm(~CtG^PMjn&G21aIugSfY*R6xK8E>OY(KV+p#gj=I=7CKovqGi zTY7(aQVX7_hp*Y3=2OS08%RtiD4_HSR9m`Q;-|*2STy3X&@*8ouPcJQfY+92e}T_h z!M53x1o>!z^}T!=1MKc!u`&jjA=Y{*-;ulbB>fm5#x>U!~6t~O-$+HSn{;rYT zm+IkmVgl^W;kar1z$2m+Mt<5Bs#m{bHwtq7cG;c>7m9ilQ%EMg*SzoUM%jz6@2<|b zA8#dl%mIJh1lvq+6QEtkwi^L`d4mf0LI5t_Y3#G-eT!HSML4YUsSo=ARyC|&xaNWoA3vT&pvLurTy$NKE3U&P0#PZAMBlYWRpS#_o16Ob zCJ@|w#vf0Hy9Rho&5NI8Hh#ReSO{Mb4Etf9h79l`nJagCg@qt+%qt|^d4{nsl$>Aj zYe7ygI1{ZqVsUxL_q@XJf3$FX2LV!eLxn1dZ{-C}RL^JcmFcIhh6sEI-@eTw!Lui_ zp|qCF`}@vsE1~N&eDU3ircb%P>iuSrwfk%wdBa5YUUg;9*}kiQ6BkJ{As#zPyo{kf z`dGOiG5q*vlhn-I^J2iS`<*qKgD_ppvPoa1vOd`l@3bzOqVk*Gkh5Hh4W9^TcwLU} zdKOP67mhz8$UD#2xDgEb@kZeUc|9CtX2E5$`QiEDWN~vBKZV2%H-$L7Q`dsT(Z_2= z-^AOZZ_jPDkDxdC2R-zH96kl7pFU0AgSMQ%oWgR5Q z{LO294XkOya)r&o$zM3sA0My}w_jGB0Mf)Pa!An3XUkbWkwa0Hb(i2QLO z!1EAX)1I6dF7;WDI^JgZ$d`aLi5F)9nryf@Wb>@5 z+05!swI{vGc6;#zq@lfC$+i1o{OPWCCB7qbYbE@m|-Shsp zEXoC>LEZGw1+BGJ%vz?0W~a`tiC0yAc2;-4rBp%AG_VbK`Zlwuud#FvKhTxj2Ga19 z=iNIq1K*|>JnxoPGI`&7E_Lc#T2;i%N33ta8n~vcVNrkU$6@;BY2!bThPm$=4~0}) z9iH&6u~XX9X8!yiOYa8cR9rc}sRgXTaOPrW_0J+q{=|UcD VFE*ZeZ4YI1!pgxG7|)x<4*()v2s8iy delta 639 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 YT13vecxGr*hh9#Oo68gU|D}-s1Bt-y#Q*>R literal 0 HcmV?d00001 From b5723b253bfe6675384d2f139c603ca5fb8c7158 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 06:32:17 +0000 Subject: [PATCH 2/9] Add array literal scan/zip/isEmpty methods Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/d041c95d-62d9-47f6-b0ee-a71fe3d10a62 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- .../src/main/test/broadcast/Broadcast.cod | 18 ++ .../interpreter/registry/LiteralRegistry.java | 160 +++++++++++++++++- 2 files changed, 176 insertions(+), 2 deletions(-) diff --git a/src/main/cod/demo/src/main/test/broadcast/Broadcast.cod b/src/main/cod/demo/src/main/test/broadcast/Broadcast.cod index ac70fc3b..e6586c97 100644 --- a/src/main/cod/demo/src/main/test/broadcast/Broadcast.cod +++ b/src/main/cod/demo/src/main/test/broadcast/Broadcast.cod @@ -40,6 +40,24 @@ Broadcaster { out("reduced = " + reduced + " (expect 10)") out("reducedNamed = " + reducedNamed + " (expect 10)") out("reduceResult = " + reduceResult + " (expect 10)") + + scanned := [4, 5, 6].scan() + out("scanned[1] = " + scanned[1] + " (expect 5)") + + zipped := [1, 2, 3].zip([10, 20, 30]) + out("zipped[0][0] = " + zipped[0][0] + " (expect 1)") + out("zipped[0][1] = " + zipped[0][1] + " (expect 10)") + out("zipped[2][0] = " + zipped[2][0] + " (expect 3)") + out("zipped[2][1] = " + zipped[2][1] + " (expect 30)") + + zippedCombined := [1, 2, 3].zip([10, 20, 30], \(left, right) left + right) + out("zippedCombined[0] = " + zippedCombined[0] + " (expect 11)") + out("zippedCombined[2] = " + zippedCombined[2] + " (expect 33)") + + emptyArr := [] + nonEmptyArr := [1] + out("emptyArr.isEmpty() = " + emptyArr.isEmpty() + " (expect true)") + out("nonEmptyArr.isEmpty() = " + nonEmptyArr.isEmpty() + " (expect false)") } } diff --git a/src/main/java/cod/interpreter/registry/LiteralRegistry.java b/src/main/java/cod/interpreter/registry/LiteralRegistry.java index c5d2abb4..eb81ae8c 100644 --- a/src/main/java/cod/interpreter/registry/LiteralRegistry.java +++ b/src/main/java/cod/interpreter/registry/LiteralRegistry.java @@ -110,6 +110,26 @@ public Object handle(Object literal, List arguments, ExecutionContext ct NaturalArray.class, List.class ); + define("scan", + new MethodHandler() { + @Override + public Object handle(Object literal, List arguments, ExecutionContext ctx) { + return handleArrayScan(literal, arguments); + } + }, + NaturalArray.class, List.class + ); + + define("zip", + new MethodHandler() { + @Override + public Object handle(Object literal, List arguments, ExecutionContext ctx) { + return handleArrayZip(literal, arguments, ctx); + } + }, + NaturalArray.class, List.class + ); + define("has", new MethodHandler() { @Override @@ -194,10 +214,10 @@ public Object handle(Object literal, List arguments, ExecutionContext ct new MethodHandler() { @Override public Object handle(Object literal, List arguments, ExecutionContext ctx) { - return handleStringIsEmpty(literal, arguments); + return handleIsEmpty(literal, arguments); } }, - String.class + String.class, NaturalArray.class, List.class ); define("isBlank", @@ -524,6 +544,22 @@ private Object handleStringIsEmpty(Object literal, List arguments) { return target.isEmpty(); } + @SuppressWarnings("unchecked") + private Object handleIsEmpty(Object literal, List arguments) { + requireArgCount("isEmpty", arguments, 0); + if (literal instanceof String) { + return ((String) literal).isEmpty(); + } + NaturalArray naturalArray = asNaturalArray(literal); + if (naturalArray != null) { + return naturalArray.size() == 0L; + } + if (literal instanceof List) { + return ((List) literal).isEmpty(); + } + throw new ProgramError("isEmpty is not supported on " + literal.getClass().getSimpleName()); + } + private Object handleStringIsBlank(Object literal, List arguments) { requireArgCount("isBlank", arguments, 0); String target = requireStringTarget(literal, "isBlank"); @@ -773,6 +809,30 @@ private Object handleArrayReduce(Object literal, List arguments, Executi return accumulator; } + private Object handleArrayScan(Object literal, List arguments) { + requireArgCount("scan", arguments, 0); + NaturalArray naturalArray = asNaturalArray(literal); + if (naturalArray != null) { + return new LazyNaturalArrayMapView(naturalArray, new NaturalArrayMapper() { + @Override + public Object map(long index, Object value) { + return value; + } + }); + } + return asConcreteList(literal); + } + + private Object handleArrayZip(Object literal, List arguments, ExecutionContext ctx) { + if (arguments == null || arguments.size() < 1 || arguments.size() > 2) { + throw new ProgramError("zip expects (otherArray) or (otherArray, callback)"); + } + ArrayZipSource left = toZipSource(literal); + ArrayZipSource right = toZipSource(arguments.get(0)); + final Object callback = arguments.size() == 2 ? arguments.get(1) : null; + return new LazyArrayZipView(left, right, callback, ctx); + } + private interface NaturalArrayMapper { Object map(long index, Object value); } @@ -781,6 +841,58 @@ private interface NaturalArrayPredicate { boolean test(long index, Object value); } + private interface ArrayZipSource { + long size(); + Object get(long index); + } + + private ArrayZipSource toZipSource(Object obj) { + NaturalArray natural = asNaturalArray(obj); + if (natural != null) { + return new NaturalArrayZipSource(natural); + } + if (obj instanceof List) { + return new ListZipSource(asConcreteList(obj)); + } + throw new ProgramError("zip expects list or NaturalArray as source"); + } + + private static final class NaturalArrayZipSource implements ArrayZipSource { + private final NaturalArray source; + + private NaturalArrayZipSource(NaturalArray source) { + this.source = source; + } + + @Override + public long size() { + return source.size(); + } + + @Override + public Object get(long index) { + return source.get(index); + } + } + + private static final class ListZipSource implements ArrayZipSource { + private final List source; + + private ListZipSource(List source) { + this.source = source; + } + + @Override + public long size() { + return source.size(); + } + + @Override + public Object get(long index) { + return source.get((int) index); + } + } + private static final class LazyNaturalArrayMapView extends AbstractList { private final NaturalArray source; private final NaturalArrayMapper mapper; @@ -813,6 +925,50 @@ public int size() { } } + private final class LazyArrayZipView extends AbstractList { + private final ArrayZipSource left; + private final ArrayZipSource right; + private final Object callback; + private final ExecutionContext ctx; + private final int size; + + private LazyArrayZipView(ArrayZipSource left, ArrayZipSource right, Object callback, ExecutionContext ctx) { + this.left = left; + this.right = right; + this.callback = callback; + this.ctx = ctx; + long zippedSize = Math.min(left.size(), right.size()); + if (zippedSize > Integer.MAX_VALUE) { + throw new ProgramError( + "Zipped array size exceeds Integer.MAX_VALUE (" + Integer.MAX_VALUE + "): " + zippedSize + ); + } + this.size = (int) zippedSize; + } + + @Override + public Object get(int index) { + if (index < 0 || index >= size) { + throw new ProgramError("Index: " + index + ", Size: " + size); + } + long idx = (long) index; + Object leftValue = left.get(idx); + Object rightValue = right.get(idx); + if (callback != null) { + return invokeArrayCallback(callback, "zip", ctx, leftValue, rightValue, Integer.valueOf(index)); + } + List pair = new ArrayList(2); + pair.add(leftValue); + pair.add(rightValue); + return pair; + } + + @Override + public int size() { + return size; + } + } + private static final class LazyNaturalArrayFilterView extends AbstractList { private final NaturalArray source; private final NaturalArrayPredicate predicate; From 2dba5cea52cb753943b43c84753c84d78ea347d5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 06:37:13 +0000 Subject: [PATCH 3/9] Refine zip method messaging and pair allocation Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/d041c95d-62d9-47f6-b0ee-a71fe3d10a62 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- .../java/cod/interpreter/registry/LiteralRegistry.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/cod/interpreter/registry/LiteralRegistry.java b/src/main/java/cod/interpreter/registry/LiteralRegistry.java index eb81ae8c..b82981ff 100644 --- a/src/main/java/cod/interpreter/registry/LiteralRegistry.java +++ b/src/main/java/cod/interpreter/registry/LiteralRegistry.java @@ -825,7 +825,7 @@ public Object map(long index, Object value) { private Object handleArrayZip(Object literal, List arguments, ExecutionContext ctx) { if (arguments == null || arguments.size() < 1 || arguments.size() > 2) { - throw new ProgramError("zip expects (otherArray) or (otherArray, callback)"); + throw new ProgramError("zip expects (list or NaturalArray) or (list or NaturalArray, callback)"); } ArrayZipSource left = toZipSource(literal); ArrayZipSource right = toZipSource(arguments.get(0)); @@ -955,12 +955,9 @@ public Object get(int index) { Object leftValue = left.get(idx); Object rightValue = right.get(idx); if (callback != null) { - return invokeArrayCallback(callback, "zip", ctx, leftValue, rightValue, Integer.valueOf(index)); + return invokeArrayCallback(callback, "zip", ctx, leftValue, rightValue, index); } - List pair = new ArrayList(2); - pair.add(leftValue); - pair.add(rightValue); - return pair; + return Arrays.asList(leftValue, rightValue); } @Override From cf1c310ca3882dd6b78aa1f5242689abcd642adf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 06:46:59 +0000 Subject: [PATCH 4/9] Implement unified conditional formula core and merge behavior Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/e9013e40-5c5d-4ff0-bb9c-61f0042fc483 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- .../ConditionalFormulaOptimization.cod | 38 ++ src/main/java/cod/range/NaturalArray.java | 9 +- .../cod/range/formula/ConditionalFormula.java | 529 ++++++++++++++++-- 3 files changed, 542 insertions(+), 34 deletions(-) create mode 100644 src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod diff --git a/src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod b/src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod new file mode 100644 index 00000000..23ceb217 --- /dev/null +++ b/src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod @@ -0,0 +1,38 @@ +unit test.multiarray + +local isUnderThreshold(value: int, threshold: int) :: ok: bool { + ~> (ok: value < threshold) +} + +share main() { + out("=== Conditional formula optimization ===") + + optimized := [0 to 60] + for i of [0 to 60] { + if i % 2 == 0 { + base := i * 3 + optimized[i] = base + 1 + } elif i % 5 == 0 { + shifted := i + 7 + optimized[i] = shifted * 2 + } else { + optimized[i] = i - 1 + } + } + + out("optimized[10]=" + optimized[10] + " expected=31") + out("optimized[25]=" + optimized[25] + " expected=64") + out("optimized[7]=" + optimized[7] + " expected=6") + + fallback := [0 to 40] + for i of [0 to 40] { + if isUnderThreshold(i, 12) { + fallback[i] = i + 100 + } else { + fallback[i] = i - 100 + } + } + + out("fallback[5]=" + fallback[5] + " expected=105") + out("fallback[20]=" + fallback[20] + " expected=-80") +} diff --git a/src/main/java/cod/range/NaturalArray.java b/src/main/java/cod/range/NaturalArray.java index 9de0903b..3917784e 100644 --- a/src/main/java/cod/range/NaturalArray.java +++ b/src/main/java/cod/range/NaturalArray.java @@ -1407,7 +1407,14 @@ public void addConditionalFormula(ConditionalFormula formula) { ArrayTracker.recordFormulaApplication(this); } - conditionalFormulas.add(formula); + if (conditionalFormulas.isEmpty()) { + conditionalFormulas.add(formula); + } else { + ConditionalFormula current = conditionalFormulas.get(conditionalFormulas.size() - 1); + ConditionalFormula merged = ConditionalFormula.compose(formula, current); + conditionalFormulas.clear(); + conditionalFormulas.add(merged); + } clearCache(); } diff --git a/src/main/java/cod/range/formula/ConditionalFormula.java b/src/main/java/cod/range/formula/ConditionalFormula.java index cccc443e..9099dccc 100644 --- a/src/main/java/cod/range/formula/ConditionalFormula.java +++ b/src/main/java/cod/range/formula/ConditionalFormula.java @@ -1,7 +1,8 @@ -// In ConditionalFormula.java package cod.range.formula; +import cod.ast.ASTFactory; import cod.ast.node.*; +import cod.error.ProgramError; import cod.interpreter.Evaluator; import cod.interpreter.context.ExecutionContext; import cod.interpreter.handler.TypeHandler; @@ -11,10 +12,17 @@ public class ConditionalFormula { public final long start; public final long end; public final String indexVar; - public final List conditions; - public final List> branchStatements; - public final List elseStatements; - + + private final Expr unifiedExpression; + private final boolean usesUnifiedExpression; + + private final List conditions; + private final List> branchStatements; + private final List elseStatements; + + private final ConditionalFormula newerFormula; + private final ConditionalFormula olderFormula; + public ConditionalFormula(long start, long end, String indexVar, List conditions, List> branchStatements, @@ -25,44 +33,500 @@ public ConditionalFormula(long start, long end, String indexVar, this.conditions = conditions != null ? conditions : new ArrayList(); this.branchStatements = branchStatements != null ? branchStatements : new ArrayList>(); this.elseStatements = elseStatements != null ? elseStatements : new ArrayList(); + this.newerFormula = null; + this.olderFormula = null; + + Expr built = tryBuildUnifiedExpression(); + this.unifiedExpression = built; + this.usesUnifiedExpression = built != null; + } + + private ConditionalFormula(long start, long end, String indexVar, + ConditionalFormula newerFormula, + ConditionalFormula olderFormula) { + this.start = start; + this.end = end; + this.indexVar = indexVar; + this.newerFormula = newerFormula; + this.olderFormula = olderFormula; + + this.conditions = new ArrayList(); + this.branchStatements = new ArrayList>(); + this.elseStatements = new ArrayList(); + this.unifiedExpression = null; + this.usesUnifiedExpression = false; + } + + public static ConditionalFormula compose(ConditionalFormula newerFormula, ConditionalFormula 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); + String mergedIndexVar = newerFormula.indexVar != null ? newerFormula.indexVar : olderFormula.indexVar; + return new ConditionalFormula(mergedStart, mergedEnd, mergedIndexVar, 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, Evaluator evaluator, ExecutionContext context) { - TypeHandler typeSystem = new TypeHandler(); // or get from somewhere - - // Create base context with index variable + if (isComposite()) { + return evaluateComposite(index, evaluator, context); + } + ExecutionContext evalCtx = context.copyWithVariable(indexVar, index, null); - - try { - // Try each branch in order - for (int i = 0; i < conditions.size(); i++) { - Object condResult = evaluator.evaluate(conditions.get(i), evalCtx); - if (typeSystem.isTruthy(typeSystem.unwrap(condResult))) { - // Execute branch statements in sequence - return executeStatementSequence(branchStatements.get(i), evaluator, evalCtx); + if (usesUnifiedExpression) { + try { + return evaluator.evaluate(unifiedExpression, evalCtx); + } catch (ProgramError e) { + return evaluateLegacy(evalCtx, evaluator); + } catch (Exception e) { + return evaluateLegacy(evalCtx, evaluator); + } + } + return evaluateLegacy(evalCtx, evaluator); + } + + private boolean isComposite() { + return newerFormula != null || olderFormula != null; + } + + private Object evaluateComposite(long index, Evaluator evaluator, ExecutionContext context) { + if (newerFormula != null && newerFormula.contains(index)) { + return newerFormula.evaluate(index, evaluator, context); + } + if (olderFormula != null && olderFormula.contains(index)) { + return olderFormula.evaluate(index, evaluator, context); + } + return null; + } + + private Object evaluateLegacy(ExecutionContext evalCtx, Evaluator evaluator) { + TypeHandler typeSystem = new TypeHandler(); + for (int i = 0; i < conditions.size(); i++) { + Object condResult = evaluator.evaluate(conditions.get(i), evalCtx); + if (typeSystem.isTruthy(typeSystem.unwrap(condResult))) { + return executeStatementSequence(branchStatements.get(i), evaluator, evalCtx); + } + } + return executeStatementSequence(elseStatements, evaluator, evalCtx); + } + + private Expr tryBuildUnifiedExpression() { + if (conditions.isEmpty() || branchStatements.isEmpty() || conditions.size() != branchStatements.size()) { + return null; + } + if (indexVar == null || indexVar.isEmpty()) { + return null; + } + + List indicatorExpressions = new ArrayList(conditions.size()); + List branchExpressions = new ArrayList(conditions.size()); + + for (int i = 0; i < conditions.size(); i++) { + Expr condition = conditions.get(i); + if (condition == null || !isPureExpression(condition)) { + return null; + } + Expr indicator = buildNumericIndicator(condition); + if (indicator == null) { + return null; + } + indicatorExpressions.add(indicator); + + Expr branchExpr = extractPureBranchExpression(branchStatements.get(i)); + if (branchExpr == null || !isPureExpression(branchExpr)) { + return null; + } + branchExpressions.add(branchExpr); + } + + Expr elseExpr = extractPureBranchExpression(elseStatements); + if (elseExpr == null || !isPureExpression(elseExpr)) { + return null; + } + + Expr unified = cloneExpr(elseExpr); + for (int i = indicatorExpressions.size() - 1; i >= 0; i--) { + Expr indicator = cloneExpr(indicatorExpressions.get(i)); + Expr branchExpr = cloneExpr(branchExpressions.get(i)); + Expr inverse = simplifyExpr(ASTFactory.createBinaryOp(one(), "-", indicator, null)); + Expr leftTerm = simplifyExpr(ASTFactory.createBinaryOp(indicator, "*", branchExpr, null)); + Expr rightTerm = simplifyExpr(ASTFactory.createBinaryOp(inverse, "*", unified, null)); + unified = simplifyExpr(ASTFactory.createBinaryOp(leftTerm, "+", rightTerm, null)); + } + return simplifyExpr(unified); + } + + private Expr extractPureBranchExpression(List statements) { + if (statements == null) return null; + Map tempExpressions = new HashMap(); + Expr finalExpression = null; + + for (Stmt stmt : statements) { + if (stmt instanceof Var) { + Var var = (Var) stmt; + if (var.name == null || var.value == null || !isPureExpression(var.value)) { + return null; + } + Expr resolved = substituteIdentifiers(cloneExpr(var.value), tempExpressions); + if (!isPureExpression(resolved)) { + return null; + } + tempExpressions.put(var.name, resolved); + continue; + } + + if (stmt instanceof Assignment) { + Assignment assignment = (Assignment) stmt; + if (assignment.left instanceof Identifier && assignment.isDeclaration) { + Identifier id = (Identifier) assignment.left; + if (id.name == null || assignment.right == null || !isPureExpression(assignment.right)) { + return null; + } + Expr resolved = substituteIdentifiers(cloneExpr(assignment.right), tempExpressions); + if (!isPureExpression(resolved)) { + return null; + } + tempExpressions.put(id.name, resolved); + continue; + } + + if (assignment.left instanceof IndexAccess) { + IndexAccess indexAccess = (IndexAccess) assignment.left; + if (!(indexAccess.index instanceof Identifier)) { + return null; + } + Identifier idx = (Identifier) indexAccess.index; + if (idx.name == null || !idx.name.equals(indexVar) || assignment.right == null) { + return null; + } + Expr resolved = substituteIdentifiers(cloneExpr(assignment.right), tempExpressions); + if (!isPureExpression(resolved)) { + return null; + } + finalExpression = resolved; + continue; } } - - // No branch matched - execute else statements - return executeStatementSequence(elseStatements, evaluator, evalCtx); - - } catch (Exception e) { - throw new RuntimeException("Error evaluating conditional formula at index " + index, e); + + return null; } + + return finalExpression; } - - private Object executeStatementSequence( - List statements, Evaluator evaluator, ExecutionContext ctx) { - + + private Expr substituteIdentifiers(Expr expr, Map replacements) { + if (expr == null) return null; + + if (expr instanceof Identifier) { + Identifier id = (Identifier) expr; + Expr replacement = replacements.get(id.name); + return replacement != null ? cloneExpr(replacement) : expr; + } + + if (expr instanceof BinaryOp) { + BinaryOp op = (BinaryOp) expr; + return ASTFactory.createBinaryOp( + substituteIdentifiers(op.left, replacements), + op.op, + substituteIdentifiers(op.right, replacements), + null + ); + } + + if (expr instanceof Unary) { + Unary unary = (Unary) expr; + return ASTFactory.createUnaryOp(unary.op, substituteIdentifiers(unary.operand, replacements), null); + } + + if (expr instanceof TypeCast) { + TypeCast cast = (TypeCast) expr; + return ASTFactory.createTypeCast(cast.targetType, substituteIdentifiers(cast.expression, replacements), null); + } + + if (expr instanceof ExprIf) { + ExprIf exprIf = (ExprIf) expr; + return new ExprIf( + substituteIdentifiers(exprIf.condition, replacements), + substituteIdentifiers(exprIf.thenExpr, replacements), + substituteIdentifiers(exprIf.elseExpr, replacements) + ); + } + + if (expr instanceof EqualityChain) { + EqualityChain chain = (EqualityChain) expr; + List args = new ArrayList(); + if (chain.chainArguments != null) { + for (Expr arg : chain.chainArguments) { + args.add(substituteIdentifiers(arg, replacements)); + } + } + return ASTFactory.createEqualityChain( + substituteIdentifiers(chain.left, replacements), + chain.operator, + chain.isAllChain, + args, + null, + null, + null + ); + } + + if (expr instanceof ChainedComparison) { + ChainedComparison cmp = (ChainedComparison) expr; + List copiedExpressions = new ArrayList(); + if (cmp.expressions != null) { + for (Expr item : cmp.expressions) { + copiedExpressions.add(substituteIdentifiers(item, replacements)); + } + } + List copiedOperators = cmp.operators != null ? new ArrayList(cmp.operators) : new ArrayList(); + return new ChainedComparison(copiedExpressions, copiedOperators); + } + + if (expr instanceof BooleanChain) { + BooleanChain chain = (BooleanChain) expr; + List expressions = new ArrayList(); + if (chain.expressions != null) { + for (Expr item : chain.expressions) { + expressions.add(substituteIdentifiers(item, replacements)); + } + } + return ASTFactory.createBooleanChain(chain.isAll, expressions, null); + } + + return expr; + } + + private Expr buildNumericIndicator(Expr condition) { + Expr numeric = simplifyExpr(convertBooleanToNumeric(cloneExpr(condition))); + return numeric != null ? numeric : null; + } + + private Expr convertBooleanToNumeric(Expr condition) { + if (condition == null) return null; + + if (condition instanceof BoolLiteral) { + return ((BoolLiteral) condition).value ? one() : zero(); + } + + if (condition instanceof Unary) { + Unary unary = (Unary) condition; + if ("!".equals(unary.op)) { + Expr inner = convertBooleanToNumeric(unary.operand); + if (inner == null) return null; + return ASTFactory.createBinaryOp(one(), "-", inner, null); + } + } + + if (condition instanceof BinaryOp) { + BinaryOp binary = (BinaryOp) condition; + if ("&&".equals(binary.op) || "and".equals(binary.op)) { + Expr left = convertBooleanToNumeric(binary.left); + Expr right = convertBooleanToNumeric(binary.right); + if (left == null || right == null) return null; + return ASTFactory.createBinaryOp(left, "*", right, null); + } + if ("||".equals(binary.op) || "or".equals(binary.op)) { + Expr left = convertBooleanToNumeric(binary.left); + Expr right = convertBooleanToNumeric(binary.right); + if (left == null || right == null) return null; + Expr sum = ASTFactory.createBinaryOp(left, "+", right, null); + Expr prod = ASTFactory.createBinaryOp(cloneExpr(left), "*", cloneExpr(right), null); + return ASTFactory.createBinaryOp(sum, "-", prod, null); + } + } + + return new ExprIf(condition, one(), zero()); + } + + private boolean isPureExpression(Expr expr) { + if (expr == null) return false; + + if (expr instanceof Identifier + || expr instanceof IntLiteral + || expr instanceof FloatLiteral + || expr instanceof BoolLiteral + || expr instanceof TextLiteral + || expr instanceof NoneLiteral + || expr instanceof ValueExpr) { + return true; + } + + if (expr instanceof BinaryOp) { + BinaryOp op = (BinaryOp) expr; + return isPureExpression(op.left) && isPureExpression(op.right); + } + + if (expr instanceof Unary) { + Unary unary = (Unary) expr; + return isPureExpression(unary.operand); + } + + if (expr instanceof TypeCast) { + TypeCast cast = (TypeCast) expr; + return isPureExpression(cast.expression); + } + + if (expr instanceof ExprIf) { + ExprIf exprIf = (ExprIf) expr; + return isPureExpression(exprIf.condition) + && isPureExpression(exprIf.thenExpr) + && isPureExpression(exprIf.elseExpr); + } + + if (expr instanceof EqualityChain) { + EqualityChain chain = (EqualityChain) expr; + if (!isPureExpression(chain.left)) return false; + if (chain.chainArguments != null) { + for (Expr arg : chain.chainArguments) { + if (!isPureExpression(arg)) return false; + } + } + return true; + } + + if (expr instanceof ChainedComparison) { + ChainedComparison chain = (ChainedComparison) expr; + if (chain.expressions != null) { + for (Expr item : chain.expressions) { + if (!isPureExpression(item)) return false; + } + } + return true; + } + + if (expr instanceof BooleanChain) { + BooleanChain chain = (BooleanChain) expr; + if (chain.expressions != null) { + for (Expr item : chain.expressions) { + if (!isPureExpression(item)) return false; + } + } + return true; + } + + return false; + } + + private Expr simplifyExpr(Expr expr) { + if (!(expr instanceof BinaryOp)) return expr; + + BinaryOp op = (BinaryOp) expr; + Expr left = simplifyExpr(op.left); + Expr right = simplifyExpr(op.right); + + if ("*".equals(op.op)) { + if (isZero(left) || isZero(right)) return zero(); + if (isOne(left)) return right; + if (isOne(right)) return left; + } else if ("+".equals(op.op)) { + if (isZero(left)) return right; + if (isZero(right)) return left; + } else if ("-".equals(op.op)) { + if (isZero(right)) return left; + if (sameLiteral(left, right)) return zero(); + } + + return ASTFactory.createBinaryOp(left, op.op, right, null); + } + + private boolean isZero(Expr expr) { + if (!(expr instanceof IntLiteral)) return false; + return ((IntLiteral) expr).value.isZero(); + } + + private boolean isOne(Expr expr) { + if (!(expr instanceof IntLiteral)) return false; + return ((IntLiteral) expr).value.longValue() == 1L; + } + + private boolean sameLiteral(Expr a, Expr b) { + if (a instanceof IntLiteral && b instanceof IntLiteral) { + return ((IntLiteral) a).value.equals(((IntLiteral) b).value); + } + if (a instanceof BoolLiteral && b instanceof BoolLiteral) { + return ((BoolLiteral) a).value == ((BoolLiteral) b).value; + } + return false; + } + + private Expr cloneExpr(Expr expr) { + if (expr == null) return null; + if (expr instanceof Identifier) return ASTFactory.createIdentifier(((Identifier) expr).name, null); + if (expr instanceof IntLiteral) return ASTFactory.createLongLiteral(((IntLiteral) expr).value.longValue(), null); + if (expr instanceof FloatLiteral) return ASTFactory.createFloatLiteral(((FloatLiteral) expr).value, null); + if (expr instanceof BoolLiteral) return ASTFactory.createBoolLiteral(((BoolLiteral) expr).value, null); + if (expr instanceof TextLiteral) return ASTFactory.createTextLiteral(((TextLiteral) expr).value, null); + if (expr instanceof NoneLiteral) return ASTFactory.createNoneLiteral(null); + if (expr instanceof ValueExpr) return new ValueExpr(((ValueExpr) expr).getValue()); + if (expr instanceof BinaryOp) { + BinaryOp op = (BinaryOp) expr; + return ASTFactory.createBinaryOp(cloneExpr(op.left), op.op, cloneExpr(op.right), null); + } + if (expr instanceof Unary) { + Unary unary = (Unary) expr; + return ASTFactory.createUnaryOp(unary.op, cloneExpr(unary.operand), null); + } + if (expr instanceof TypeCast) { + TypeCast cast = (TypeCast) expr; + return ASTFactory.createTypeCast(cast.targetType, cloneExpr(cast.expression), null); + } + if (expr instanceof ExprIf) { + ExprIf exprIf = (ExprIf) expr; + return new ExprIf(cloneExpr(exprIf.condition), cloneExpr(exprIf.thenExpr), cloneExpr(exprIf.elseExpr)); + } + if (expr instanceof EqualityChain) { + EqualityChain chain = (EqualityChain) expr; + List args = new ArrayList(); + if (chain.chainArguments != null) { + for (Expr arg : chain.chainArguments) { + args.add(cloneExpr(arg)); + } + } + return ASTFactory.createEqualityChain(cloneExpr(chain.left), chain.operator, chain.isAllChain, args, null, null, null); + } + if (expr instanceof ChainedComparison) { + ChainedComparison source = (ChainedComparison) expr; + List copiedExpressions = new ArrayList(); + if (source.expressions != null) { + for (Expr item : source.expressions) { + copiedExpressions.add(cloneExpr(item)); + } + } + List copiedOperators = source.operators != null ? new ArrayList(source.operators) : new ArrayList(); + return new ChainedComparison(copiedExpressions, copiedOperators); + } + if (expr instanceof BooleanChain) { + BooleanChain source = (BooleanChain) expr; + List items = new ArrayList(); + if (source.expressions != null) { + for (Expr item : source.expressions) { + items.add(cloneExpr(item)); + } + } + return ASTFactory.createBooleanChain(source.isAll, items, null); + } + return expr; + } + + private Expr zero() { + return ASTFactory.createIntLiteral(0, null); + } + + private Expr one() { + return ASTFactory.createIntLiteral(1, null); + } + + private Object executeStatementSequence(List statements, Evaluator evaluator, ExecutionContext ctx) { Object lastResult = null; - - // Create a new scope for temporary variables ctx.pushScope(); - try { for (Stmt stmt : statements) { lastResult = evaluator.evaluate(stmt, ctx); @@ -70,7 +534,6 @@ private Object executeStatementSequence( } finally { ctx.popScope(); } - return lastResult; } -} \ No newline at end of file +} From f1dcd7b17dde9b431871e6ef98fa6b2dddd5fb95 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 06:51:47 +0000 Subject: [PATCH 5/9] Polish unified conditional formula conversion and cloning Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/e9013e40-5c5d-4ff0-bb9c-61f0042fc483 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- .../cod/range/formula/ConditionalFormula.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/cod/range/formula/ConditionalFormula.java b/src/main/java/cod/range/formula/ConditionalFormula.java index 9099dccc..ee757f3c 100644 --- a/src/main/java/cod/range/formula/ConditionalFormula.java +++ b/src/main/java/cod/range/formula/ConditionalFormula.java @@ -305,8 +305,7 @@ private Expr substituteIdentifiers(Expr expr, Map replacements) { } private Expr buildNumericIndicator(Expr condition) { - Expr numeric = simplifyExpr(convertBooleanToNumeric(cloneExpr(condition))); - return numeric != null ? numeric : null; + return simplifyExpr(convertBooleanToNumeric(cloneExpr(condition))); } private Expr convertBooleanToNumeric(Expr condition) { @@ -337,8 +336,12 @@ private Expr convertBooleanToNumeric(Expr condition) { Expr left = convertBooleanToNumeric(binary.left); Expr right = convertBooleanToNumeric(binary.right); if (left == null || right == null) return null; - Expr sum = ASTFactory.createBinaryOp(left, "+", right, null); - Expr prod = ASTFactory.createBinaryOp(cloneExpr(left), "*", cloneExpr(right), null); + Expr leftCloneA = cloneExpr(left); + Expr rightCloneA = cloneExpr(right); + Expr leftCloneB = cloneExpr(left); + Expr rightCloneB = cloneExpr(right); + Expr sum = ASTFactory.createBinaryOp(leftCloneA, "+", rightCloneA, null); + Expr prod = ASTFactory.createBinaryOp(leftCloneB, "*", rightCloneB, null); return ASTFactory.createBinaryOp(sum, "-", prod, null); } } @@ -460,7 +463,13 @@ private boolean sameLiteral(Expr a, Expr b) { private Expr cloneExpr(Expr expr) { if (expr == null) return null; if (expr instanceof Identifier) return ASTFactory.createIdentifier(((Identifier) expr).name, null); - if (expr instanceof IntLiteral) return ASTFactory.createLongLiteral(((IntLiteral) expr).value.longValue(), null); + if (expr instanceof IntLiteral) { + long value = ((IntLiteral) expr).value.longValue(); + if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) { + return ASTFactory.createIntLiteral((int) value, null); + } + return ASTFactory.createLongLiteral(value, null); + } if (expr instanceof FloatLiteral) return ASTFactory.createFloatLiteral(((FloatLiteral) expr).value, null); if (expr instanceof BoolLiteral) return ASTFactory.createBoolLiteral(((BoolLiteral) expr).value, null); if (expr instanceof TextLiteral) return ASTFactory.createTextLiteral(((TextLiteral) expr).value, null); From 5095e513c58b4b4ffa730095deef8302eb0c8ef9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:03:37 +0000 Subject: [PATCH 6/9] Plan follow-up conditional formula optimizations Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/40be63ba-f796-4997-9cd7-22680da225c2 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- source_.jar | Bin 355505 -> 370344 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/source_.jar b/source_.jar index f9adaff99fb75691aaef888587e1a7949fc81df1..b1585a23fa4ac15398d7518c8fe92a59b7401fa8 100644 GIT binary patch delta 41937 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 From c45d428a08e2def9af59de53dfc29d11f9d72a5d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:05:31 +0000 Subject: [PATCH 7/9] Extend conditional simplification and lazy map/filter fusion Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/40be63ba-f796-4997-9cd7-22680da225c2 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- .../ConditionalFormulaOptimization.cod | 30 +++ .../interpreter/registry/LiteralRegistry.java | 92 +++++++ .../cod/range/formula/ConditionalFormula.java | 230 +++++++++++++++++- 3 files changed, 351 insertions(+), 1 deletion(-) diff --git a/src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod b/src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod index 23ceb217..abb82ef1 100644 --- a/src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod +++ b/src/main/cod/demo/src/main/test/multiarray/ConditionalFormulaOptimization.cod @@ -35,4 +35,34 @@ share main() { out("fallback[5]=" + fallback[5] + " expected=105") out("fallback[20]=" + fallback[20] + " expected=-80") + + constantTrue := [0 to 12] + for i of [0 to 12] { + if true { + constantTrue[i] = i + 9 + } else { + constantTrue[i] = i - 9 + } + } + out("constantTrue[3]=" + constantTrue[3] + " expected=12") + + constantFalse := [0 to 12] + for i of [0 to 12] { + if false { + constantFalse[i] = i + 9 + } else { + constantFalse[i] = i - 9 + } + } + out("constantFalse[3]=" + constantFalse[3] + " expected=-6") + + fusedMapped := optimized.map(\(x) x + 3).map(\(x) x * 2) + fusedFiltered := fusedMapped.filter(">=", 40).filter("<=", 150) + out("fusedMapped[0]=" + fusedMapped[0] + " expected=8") + out("fusedMapped[1]=" + fusedMapped[1] + " expected=6") + out("fusedFiltered[0]=" + fusedFiltered[0] + " expected=54") + + zippedFused := optimized.map(\(x) x + 1).zip(optimized.map(\(x) x + 2), \(left, right) left + right) + out("zippedFused[0]=" + zippedFused[0] + " expected=5") + out("zippedFused[1]=" + zippedFused[1] + " expected=3") } diff --git a/src/main/java/cod/interpreter/registry/LiteralRegistry.java b/src/main/java/cod/interpreter/registry/LiteralRegistry.java index b82981ff..a34c5405 100644 --- a/src/main/java/cod/interpreter/registry/LiteralRegistry.java +++ b/src/main/java/cod/interpreter/registry/LiteralRegistry.java @@ -659,6 +659,9 @@ private Object handleArrayMap(Object literal, List arguments, ExecutionC if (arguments == null || arguments.isEmpty()) { throw new ProgramError("map expects a callback or (operator, operand)"); } + final LazyNaturalArrayMapView sourceMapView = literal instanceof LazyNaturalArrayMapView + ? (LazyNaturalArrayMapView) literal + : null; final NaturalArray naturalArray = asNaturalArray(literal); List source = naturalArray == null ? asConcreteList(literal) : null; @@ -666,6 +669,14 @@ private Object handleArrayMap(Object literal, List arguments, ExecutionC final String op = String.valueOf(arguments.get(0)); final Object operand = arguments.get(1); final TypeHandler typeHandler = ctx.getTypeHandler(); + if (sourceMapView != null) { + return sourceMapView.compose(new NaturalArrayMapper() { + @Override + public Object map(long index, Object value) { + return applyOperator(typeHandler, value, op, operand); + } + }); + } if (naturalArray != null) { return new LazyNaturalArrayMapView(naturalArray, new NaturalArrayMapper() { @Override @@ -685,6 +696,14 @@ public Object map(long index, Object value) { throw new ProgramError("map callback mode expects exactly one argument"); } final Object callback = arguments.get(0); + if (sourceMapView != null) { + return sourceMapView.compose(new NaturalArrayMapper() { + @Override + public Object map(long index, Object value) { + return invokeArrayCallback(callback, "map", ctx, value, Integer.valueOf((int) index)); + } + }); + } if (naturalArray != null) { return new LazyNaturalArrayMapView(naturalArray, new NaturalArrayMapper() { @Override @@ -704,6 +723,9 @@ private Object handleArrayFilter(Object literal, List arguments, Executi if (arguments == null || arguments.isEmpty()) { throw new ProgramError("filter expects a callback or (operator, operand)"); } + final LazyNaturalArrayFilterView sourceFilterView = literal instanceof LazyNaturalArrayFilterView + ? (LazyNaturalArrayFilterView) literal + : null; final NaturalArray naturalArray = asNaturalArray(literal); List source = naturalArray == null ? asConcreteList(literal) : null; @@ -711,6 +733,15 @@ private Object handleArrayFilter(Object literal, List arguments, Executi final String op = String.valueOf(arguments.get(0)); final Object operand = arguments.get(1); final TypeHandler typeHandler = ctx.getTypeHandler(); + if (sourceFilterView != null) { + return sourceFilterView.compose(new NaturalArrayPredicate() { + @Override + public boolean test(long index, Object value) { + Object comparison = compareWithOperator(typeHandler, value, op, operand); + return isTruthy(comparison); + } + }); + } if (naturalArray != null) { return new LazyNaturalArrayFilterView(naturalArray, new NaturalArrayPredicate() { @Override @@ -851,6 +882,12 @@ private ArrayZipSource toZipSource(Object obj) { if (natural != null) { return new NaturalArrayZipSource(natural); } + if (obj instanceof LazyNaturalArrayMapView) { + return new LazyMapZipSource((LazyNaturalArrayMapView) obj); + } + if (obj instanceof LazyNaturalArrayFilterView) { + return new LazyFilterZipSource((LazyNaturalArrayFilterView) obj); + } if (obj instanceof List) { return new ListZipSource(asConcreteList(obj)); } @@ -893,6 +930,42 @@ public Object get(long index) { } } + private static final class LazyMapZipSource implements ArrayZipSource { + private final LazyNaturalArrayMapView source; + + private LazyMapZipSource(LazyNaturalArrayMapView source) { + this.source = source; + } + + @Override + public long size() { + return source.size(); + } + + @Override + public Object get(long index) { + return source.get((int) index); + } + } + + private static final class LazyFilterZipSource implements ArrayZipSource { + private final LazyNaturalArrayFilterView source; + + private LazyFilterZipSource(LazyNaturalArrayFilterView source) { + this.source = source; + } + + @Override + public long size() { + return source.size(); + } + + @Override + public Object get(long index) { + return source.get((int) index); + } + } + private static final class LazyNaturalArrayMapView extends AbstractList { private final NaturalArray source; private final NaturalArrayMapper mapper; @@ -910,6 +983,16 @@ private LazyNaturalArrayMapView(NaturalArray source, NaturalArrayMapper mapper) this.size = (int) sourceSize; } + private LazyNaturalArrayMapView compose(final NaturalArrayMapper nextMapper) { + return new LazyNaturalArrayMapView(source, new NaturalArrayMapper() { + @Override + public Object map(long index, Object value) { + Object current = mapper.map(index, value); + return nextMapper.map(index, current); + } + }); + } + @Override public Object get(int index) { if (index < 0 || index >= size) { @@ -983,6 +1066,15 @@ private LazyNaturalArrayFilterView(NaturalArray source, NaturalArrayPredicate pr this.fullyScanned = false; } + private LazyNaturalArrayFilterView compose(final NaturalArrayPredicate nextPredicate) { + return new LazyNaturalArrayFilterView(source, new NaturalArrayPredicate() { + @Override + public boolean test(long index, Object value) { + return predicate.test(index, value) && nextPredicate.test(index, value); + } + }); + } + @Override public Object get(int index) { if (index < 0) { diff --git a/src/main/java/cod/range/formula/ConditionalFormula.java b/src/main/java/cod/range/formula/ConditionalFormula.java index ee757f3c..c7bea794 100644 --- a/src/main/java/cod/range/formula/ConditionalFormula.java +++ b/src/main/java/cod/range/formula/ConditionalFormula.java @@ -311,6 +311,11 @@ private Expr buildNumericIndicator(Expr condition) { private Expr convertBooleanToNumeric(Expr condition) { if (condition == null) return null; + Boolean constant = evaluateConstantBoolean(condition); + if (constant != null) { + return constant.booleanValue() ? one() : zero(); + } + if (condition instanceof BoolLiteral) { return ((BoolLiteral) condition).value ? one() : zero(); } @@ -425,6 +430,11 @@ private Expr simplifyExpr(Expr expr) { Expr left = simplifyExpr(op.left); Expr right = simplifyExpr(op.right); + Expr folded = foldNumericConstants(op.op, left, right); + if (folded != null) { + return folded; + } + if ("*".equals(op.op)) { if (isZero(left) || isZero(right)) return zero(); if (isOne(left)) return right; @@ -432,14 +442,232 @@ private Expr simplifyExpr(Expr expr) { } else if ("+".equals(op.op)) { if (isZero(left)) return right; if (isZero(right)) return left; + if (structurallyEqual(left, right)) { + return ASTFactory.createBinaryOp(ASTFactory.createIntLiteral(2, null), "*", left, null); + } + Expr factored = tryFactorCommonTerm(left, right); + if (factored != null) { + return simplifyExpr(factored); + } + Expr branchCollapse = tryCollapseEquivalentBranchMix(left, right); + if (branchCollapse != null) { + return branchCollapse; + } } else if ("-".equals(op.op)) { if (isZero(right)) return left; - if (sameLiteral(left, right)) return zero(); + if (sameLiteral(left, right) || structurallyEqual(left, right)) return zero(); } return ASTFactory.createBinaryOp(left, op.op, right, null); } + private Expr foldNumericConstants(String op, Expr left, Expr right) { + if (!(left instanceof IntLiteral) || !(right instanceof IntLiteral)) { + return null; + } + long l = ((IntLiteral) left).value.longValue(); + long r = ((IntLiteral) right).value.longValue(); + if ("+".equals(op)) return ASTFactory.createLongLiteral(l + r, null); + if ("-".equals(op)) return ASTFactory.createLongLiteral(l - r, null); + if ("*".equals(op)) return ASTFactory.createLongLiteral(l * r, null); + if ("/".equals(op)) { + if (r == 0L) return null; + if (l % r != 0L) return null; + return ASTFactory.createLongLiteral(l / r, null); + } + return null; + } + + private Expr tryFactorCommonTerm(Expr left, Expr right) { + if (!(left instanceof BinaryOp) || !(right instanceof BinaryOp)) { + return null; + } + BinaryOp leftBin = (BinaryOp) left; + BinaryOp rightBin = (BinaryOp) right; + if (!"*".equals(leftBin.op) || !"*".equals(rightBin.op)) { + return null; + } + + if (structurallyEqual(leftBin.left, rightBin.left)) { + Expr sum = simplifyExpr(ASTFactory.createBinaryOp(leftBin.right, "+", rightBin.right, null)); + return ASTFactory.createBinaryOp(leftBin.left, "*", sum, null); + } + if (structurallyEqual(leftBin.left, rightBin.right)) { + Expr sum = simplifyExpr(ASTFactory.createBinaryOp(leftBin.right, "+", rightBin.left, null)); + return ASTFactory.createBinaryOp(leftBin.left, "*", sum, null); + } + if (structurallyEqual(leftBin.right, rightBin.left)) { + Expr sum = simplifyExpr(ASTFactory.createBinaryOp(leftBin.left, "+", rightBin.right, null)); + return ASTFactory.createBinaryOp(leftBin.right, "*", sum, null); + } + if (structurallyEqual(leftBin.right, rightBin.right)) { + Expr sum = simplifyExpr(ASTFactory.createBinaryOp(leftBin.left, "+", rightBin.left, null)); + return ASTFactory.createBinaryOp(leftBin.right, "*", sum, null); + } + return null; + } + + private Expr tryCollapseEquivalentBranchMix(Expr left, Expr right) { + Expr[] leftParts = splitProduct(left); + Expr[] rightParts = splitProduct(right); + if (leftParts == null || rightParts == null) { + return null; + } + + Expr leftCoefficient = leftParts[0]; + Expr leftValue = leftParts[1]; + Expr rightCoefficient = rightParts[0]; + Expr rightValue = rightParts[1]; + + if (!structurallyEqual(leftValue, rightValue)) { + return null; + } + if (isComplementIndicator(leftCoefficient, rightCoefficient)) { + return leftValue; + } + return null; + } + + private Expr[] splitProduct(Expr expr) { + if (!(expr instanceof BinaryOp)) return null; + BinaryOp op = (BinaryOp) expr; + if (!"*".equals(op.op)) return null; + return new Expr[] { op.left, op.right }; + } + + private boolean isComplementIndicator(Expr a, Expr b) { + if (!(b instanceof BinaryOp)) return false; + BinaryOp bOp = (BinaryOp) b; + return "-".equals(bOp.op) && isOne(bOp.left) && structurallyEqual(a, bOp.right); + } + + private boolean structurallyEqual(Expr a, Expr b) { + if (a == b) return true; + if (a == null || b == null) return false; + if (!a.getClass().equals(b.getClass())) return false; + + if (a instanceof Identifier) { + return ((Identifier) a).name.equals(((Identifier) b).name); + } + if (a instanceof IntLiteral) { + return ((IntLiteral) a).value.equals(((IntLiteral) b).value); + } + if (a instanceof FloatLiteral) { + return ((FloatLiteral) a).value.equals(((FloatLiteral) b).value); + } + if (a instanceof BoolLiteral) { + return ((BoolLiteral) a).value == ((BoolLiteral) b).value; + } + if (a instanceof TextLiteral) { + return Objects.equals(((TextLiteral) a).value, ((TextLiteral) b).value); + } + if (a instanceof NoneLiteral) { + return true; + } + if (a instanceof BinaryOp) { + BinaryOp x = (BinaryOp) a; + BinaryOp y = (BinaryOp) b; + return Objects.equals(x.op, y.op) + && structurallyEqual(x.left, y.left) + && structurallyEqual(x.right, y.right); + } + if (a instanceof Unary) { + Unary x = (Unary) a; + Unary y = (Unary) b; + return Objects.equals(x.op, y.op) && structurallyEqual(x.operand, y.operand); + } + if (a instanceof ExprIf) { + ExprIf x = (ExprIf) a; + ExprIf y = (ExprIf) b; + return structurallyEqual(x.condition, y.condition) + && structurallyEqual(x.thenExpr, y.thenExpr) + && structurallyEqual(x.elseExpr, y.elseExpr); + } + return a.toString().equals(b.toString()); + } + + private Boolean evaluateConstantBoolean(Expr expr) { + if (expr == null) return null; + + if (expr instanceof BoolLiteral) { + return Boolean.valueOf(((BoolLiteral) expr).value); + } + if (expr instanceof Unary) { + Unary unary = (Unary) expr; + if ("!".equals(unary.op)) { + Boolean inner = evaluateConstantBoolean(unary.operand); + return inner != null ? Boolean.valueOf(!inner.booleanValue()) : null; + } + } + if (expr instanceof BinaryOp) { + BinaryOp op = (BinaryOp) expr; + if ("&&".equals(op.op) || "and".equals(op.op)) { + Boolean left = evaluateConstantBoolean(op.left); + Boolean right = evaluateConstantBoolean(op.right); + if (left != null && right != null) { + return Boolean.valueOf(left.booleanValue() && right.booleanValue()); + } + return null; + } + if ("||".equals(op.op) || "or".equals(op.op)) { + Boolean left = evaluateConstantBoolean(op.left); + Boolean right = evaluateConstantBoolean(op.right); + if (left != null && right != null) { + return Boolean.valueOf(left.booleanValue() || right.booleanValue()); + } + return null; + } + + Object leftConst = constantValue(op.left); + Object rightConst = constantValue(op.right); + if (leftConst == null || rightConst == null) { + return null; + } + + if ("==".equals(op.op)) return Boolean.valueOf(leftConst.equals(rightConst)); + if ("!=".equals(op.op)) return Boolean.valueOf(!leftConst.equals(rightConst)); + + Integer cmp = compareConstants(leftConst, rightConst); + if (cmp == null) return null; + if (">".equals(op.op)) return Boolean.valueOf(cmp.intValue() > 0); + if ("<".equals(op.op)) return Boolean.valueOf(cmp.intValue() < 0); + if (">=".equals(op.op)) return Boolean.valueOf(cmp.intValue() >= 0); + if ("<=".equals(op.op)) return Boolean.valueOf(cmp.intValue() <= 0); + } + return null; + } + + private Object constantValue(Expr expr) { + if (expr instanceof IntLiteral) { + return ((IntLiteral) expr).value; + } + if (expr instanceof FloatLiteral) { + return ((FloatLiteral) expr).value; + } + if (expr instanceof BoolLiteral) { + return Boolean.valueOf(((BoolLiteral) expr).value); + } + if (expr instanceof TextLiteral) { + return ((TextLiteral) expr).value; + } + return null; + } + + private Integer compareConstants(Object left, Object right) { + if (left instanceof cod.math.AutoStackingNumber && right instanceof cod.math.AutoStackingNumber) { + return Integer.valueOf(((cod.math.AutoStackingNumber) left).compareTo((cod.math.AutoStackingNumber) right)); + } + if (left instanceof Boolean && right instanceof Boolean) { + boolean l = ((Boolean) left).booleanValue(); + boolean r = ((Boolean) right).booleanValue(); + return Integer.valueOf(l == r ? 0 : (l ? 1 : -1)); + } + if (left instanceof String && right instanceof String) { + return Integer.valueOf(((String) left).compareTo((String) right)); + } + return null; + } + private boolean isZero(Expr expr) { if (!(expr instanceof IntLiteral)) return false; return ((IntLiteral) expr).value.isZero(); From f27040a9ff0dfed278a2fa30b9d5fc3c847abf20 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:07:52 +0000 Subject: [PATCH 8/9] Polish conditional simplification and restore source jar baseline Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/40be63ba-f796-4997-9cd7-22680da225c2 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- source_.jar | Bin 370344 -> 355505 bytes .../interpreter/registry/LiteralRegistry.java | 2 +- .../cod/range/formula/ConditionalFormula.java | 30 ++++++++++-------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/source_.jar b/source_.jar index b1585a23fa4ac15398d7518c8fe92a59b7401fa8..f9adaff99fb75691aaef888587e1a7949fc81df1 100644 GIT binary patch delta 27093 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 delta 41937 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 Integer.MAX_VALUE) { throw new ProgramError( - "Zipped array size exceeds Integer.MAX_VALUE (" + Integer.MAX_VALUE + "): " + zippedSize + "Zipped array size " + zippedSize + " exceeds Integer.MAX_VALUE" ); } this.size = (int) zippedSize; diff --git a/src/main/java/cod/range/formula/ConditionalFormula.java b/src/main/java/cod/range/formula/ConditionalFormula.java index c7bea794..5340b8a4 100644 --- a/src/main/java/cod/range/formula/ConditionalFormula.java +++ b/src/main/java/cod/range/formula/ConditionalFormula.java @@ -155,9 +155,9 @@ private Expr tryBuildUnifiedExpression() { for (int i = indicatorExpressions.size() - 1; i >= 0; i--) { Expr indicator = cloneExpr(indicatorExpressions.get(i)); Expr branchExpr = cloneExpr(branchExpressions.get(i)); - Expr inverse = simplifyExpr(ASTFactory.createBinaryOp(one(), "-", indicator, null)); + Expr complementIndicator = simplifyExpr(ASTFactory.createBinaryOp(one(), "-", indicator, null)); Expr leftTerm = simplifyExpr(ASTFactory.createBinaryOp(indicator, "*", branchExpr, null)); - Expr rightTerm = simplifyExpr(ASTFactory.createBinaryOp(inverse, "*", unified, null)); + Expr rightTerm = simplifyExpr(ASTFactory.createBinaryOp(complementIndicator, "*", unified, null)); unified = simplifyExpr(ASTFactory.createBinaryOp(leftTerm, "+", rightTerm, null)); } return simplifyExpr(unified); @@ -465,15 +465,15 @@ private Expr foldNumericConstants(String op, Expr left, Expr right) { if (!(left instanceof IntLiteral) || !(right instanceof IntLiteral)) { return null; } - long l = ((IntLiteral) left).value.longValue(); - long r = ((IntLiteral) right).value.longValue(); - if ("+".equals(op)) return ASTFactory.createLongLiteral(l + r, null); - if ("-".equals(op)) return ASTFactory.createLongLiteral(l - r, null); - if ("*".equals(op)) return ASTFactory.createLongLiteral(l * r, null); + long leftValue = ((IntLiteral) left).value.longValue(); + long rightValue = ((IntLiteral) right).value.longValue(); + if ("+".equals(op)) return ASTFactory.createLongLiteral(leftValue + rightValue, null); + if ("-".equals(op)) return ASTFactory.createLongLiteral(leftValue - rightValue, null); + if ("*".equals(op)) return ASTFactory.createLongLiteral(leftValue * rightValue, null); if ("/".equals(op)) { - if (r == 0L) return null; - if (l % r != 0L) return null; - return ASTFactory.createLongLiteral(l / r, null); + if (rightValue == 0L) return null; + if (leftValue % rightValue != 0L) return null; + return ASTFactory.createLongLiteral(leftValue / rightValue, null); } return null; } @@ -547,7 +547,9 @@ private boolean structurallyEqual(Expr a, Expr b) { if (!a.getClass().equals(b.getClass())) return false; if (a instanceof Identifier) { - return ((Identifier) a).name.equals(((Identifier) b).name); + String leftName = ((Identifier) a).name; + String rightName = ((Identifier) b).name; + return leftName != null ? leftName.equals(rightName) : rightName == null; } if (a instanceof IntLiteral) { return ((IntLiteral) a).value.equals(((IntLiteral) b).value); @@ -658,9 +660,9 @@ private Integer compareConstants(Object left, Object right) { return Integer.valueOf(((cod.math.AutoStackingNumber) left).compareTo((cod.math.AutoStackingNumber) right)); } if (left instanceof Boolean && right instanceof Boolean) { - boolean l = ((Boolean) left).booleanValue(); - boolean r = ((Boolean) right).booleanValue(); - return Integer.valueOf(l == r ? 0 : (l ? 1 : -1)); + boolean leftBool = ((Boolean) left).booleanValue(); + boolean rightBool = ((Boolean) right).booleanValue(); + return Integer.valueOf(leftBool == rightBool ? 0 : (leftBool ? 1 : -1)); } if (left instanceof String && right instanceof String) { return Integer.valueOf(((String) left).compareTo((String) right)); From 7eef7346cf853f484d6c487544b3b0dba6f12b2e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:09:35 +0000 Subject: [PATCH 9/9] Refine structural equality safety and conditional merge update Agent-Logs-Url: https://github.com/DanexCodr/Coderive/sessions/40be63ba-f796-4997-9cd7-22680da225c2 Co-authored-by: DanexCodr <216312766+DanexCodr@users.noreply.github.com> --- src/main/java/cod/range/NaturalArray.java | 6 +++--- src/main/java/cod/range/formula/ConditionalFormula.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/cod/range/NaturalArray.java b/src/main/java/cod/range/NaturalArray.java index 3917784e..2ef9b447 100644 --- a/src/main/java/cod/range/NaturalArray.java +++ b/src/main/java/cod/range/NaturalArray.java @@ -1410,10 +1410,10 @@ public void addConditionalFormula(ConditionalFormula formula) { if (conditionalFormulas.isEmpty()) { conditionalFormulas.add(formula); } else { - ConditionalFormula current = conditionalFormulas.get(conditionalFormulas.size() - 1); + int lastIndex = conditionalFormulas.size() - 1; + ConditionalFormula current = conditionalFormulas.get(lastIndex); ConditionalFormula merged = ConditionalFormula.compose(formula, current); - conditionalFormulas.clear(); - conditionalFormulas.add(merged); + conditionalFormulas.set(lastIndex, merged); } clearCache(); } diff --git a/src/main/java/cod/range/formula/ConditionalFormula.java b/src/main/java/cod/range/formula/ConditionalFormula.java index 5340b8a4..1fd4c284 100644 --- a/src/main/java/cod/range/formula/ConditionalFormula.java +++ b/src/main/java/cod/range/formula/ConditionalFormula.java @@ -585,7 +585,7 @@ && structurallyEqual(x.left, y.left) && structurallyEqual(x.thenExpr, y.thenExpr) && structurallyEqual(x.elseExpr, y.elseExpr); } - return a.toString().equals(b.toString()); + return false; } private Boolean evaluateConstantBoolean(Expr expr) {