From be437c2858cf03b4c00aea8265b183412292d52d Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Fri, 16 Aug 2024 22:09:47 +0200 Subject: [PATCH] initial commit --- .gitignore | 15 ++ Gemfile | 5 + Gemfile.lock | 12 ++ README.md | 50 +++++ bun.lockb | Bin 0 -> 58711 bytes index.html | 16 ++ package.json | 27 +++ .../simplesso-primale-algebrico/View.jsx | 29 +++ .../simplesso-primale-algebrico/algorithm.rb | 30 +++ src/components/KaTeX.jsx | 16 ++ src/components/Steps.jsx | 18 ++ src/main.jsx | 105 +++++++++++ src/ruby.js | 26 +++ src/style.css | 176 ++++++++++++++++++ tsconfig.json | 27 +++ vite.config.js | 15 ++ 16 files changed, 567 insertions(+) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 index.html create mode 100644 package.json create mode 100644 src/algorithms/simplesso-primale-algebrico/View.jsx create mode 100644 src/algorithms/simplesso-primale-algebrico/algorithm.rb create mode 100644 src/components/KaTeX.jsx create mode 100644 src/components/Steps.jsx create mode 100644 src/main.jsx create mode 100644 src/ruby.js create mode 100644 src/style.css create mode 100644 tsconfig.json create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81ca160 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Local files +.env +*.local* + +# NodeJS +node_modules/ + +# Binaries +bin/ +.out/ +out/ +dist/ + +# Editors +.vscode/ diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..d2403f1 --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +# gem "rails" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..1491436 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,12 @@ +GEM + remote: https://rubygems.org/ + specs: + +PLATFORMS + ruby + x86_64-linux + +DEPENDENCIES + +BUNDLED WITH + 2.5.17 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a986257 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# Ricerca Operativa + +Un piccolo sito con alcuni degli algoritmi presentati nel corso di Ricerca Operativa. Gli algoritmi sono scritti in Ruby e +eseguiti nel browser con WASM (uso il Ruby perché è l'unico linguaggio con i numeri razionali e buon supporto per WASM). + +## Algoritmi + +### Programmazione Lineare + +- [ ] Metodo del simplesso + + - [ ] Metodo del simplesso (con i conti) + + - [ ] Metodo del simplesso (con disegnini) + +- [ ] Metodo del simplesso duale + + - [ ] Metodo del simplesso duale (con i conti) + + - [ ] Metodo del simplesso duale (con disegnini) + +### Programmazione Lineare Intera + +- [ ] Branch and Bound + +- [ ] Branch and Cut + +- [ ] Branch and Price + +### Programmazione Dinamica + +- [ ] Algoritmo di Bellman + +- [ ] Algoritmo di Dijkstra + +- [ ] Algoritmo di Floyd + +### Altri + +- [ ] Algoritmo di Kruskal + +## Usage + +```bash +bun install +``` + +```bash +bun run index.ts +``` diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..cc27caf3da492d469cc30e71577bbdfe9667a0f8 GIT binary patch literal 58711 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≈L*=z0O?A}W+z$2qd^<~q_|-4#7>nU_;kzl{6Om6~`|-V-_A(kA-<(9unp;(U zkwIk<^IAcM1<_n#?wLJDB<8GFNUgl4&Ylp{X;8pv1 z72>`0REfL7UjBMxhI_wXXxnqbQ2(5_XQPUgEsGC1(?1*)BorJwcJbVo0(+A?eM`DpwR^bP-d>GL!NsfoT@~V8e0R>? zMLFz;UtO9%SI;}bySg#@fFO_RwXL_Tji(t0ruc;`Wcl=E?*`NO=CkkIJbdG#^u6mI zvT_z(iY*0+t5|Wm@Y(VAL@Z02cTjmKo$Bi7DB0gGIyu3Qo=26^~Y)XhmHH|BCEq0I!^kK z=Sgz?YTx^Gz#R39R)LtUR}e%+$*;R@w_E^ZD7I5M6Fo~~AE4cMiXALzDp ztxO$NQcZwXLYlh*jn>gQ+x<3(XW-&pf!7sYb3na6D^Pdd`L%wBv-xZyIc(hI-_@z# zUGZWpI51y1uW;$>HAhxA3rXMDleRu|&L-*j@S^0U<1Z>rIbGlEIE~ZQ#_RSxXiJ{f zFVP;nXDcTzpmBN|tus{u>zST%?RyD{4NsCcjN5cm#ckdaT*b)6dGRo-*VxStJKI}9 zdduVWgdWP0_rK(N(824@eR{KJ9NZ@ed_MsC2?~5 zTXvXu77)y?BsT70)!&{fEpbQpK!DNK2VYgM`Ru^OtBcnqF4~@*7Ol=HJ~ouz|7Bo0 zY--wWMC9nJElsgglD55I&rh+wxW18?bnCP@{A{r&*hScr#dllE-=HR zQZA!@oL}5s=KYe$nAb{h;PSZ`w#ohs*R)^ zXWRHp@@c1*W!=5hTQ;HtGNsBJN3832U3grjC?68QwTtUQ6HXWVJPpYcd)UJi^MxEo zX(VY?U(j&b)ErqjsK8w23wlaN!of=^Ekd;j%mP?LH^D&d7nf&+j8uI9T;1 z)}(LUQ)YKIR@Jv)=#J$VrSY5QZH?JSSLi(uUv@F=>VdY(j3E8m8|8``hH+1Dy6AH| zED@J~3F&VeTIZlIvL>=f(xm*=f*!*QeD;>yV(cxRHfgud4_;GJG<#$>-Z;rrd~B6- zv8UwMwf7yS8(nK(UkOeU#_6KZ`>;fGP<>odQoixg^_j?pEFqsfQ?oQVmr3l}wez}V zZ|SYp$7}5Q8R!?XUJ1Ybd0KsGymNF$>fp&KuCU{N8Q)T)Jjw4b$m0TieuyRF)a!lX zt86bd*Bs-p&8r+?Y>BD0=5%D~+tjc&V|sMl&iAojP)R^g_LlAa@l)11hi16iTKK;> zg%RG*)SHek$;QQNiiv_HUgS%dQ>(bLmWFxh4*ONISAAF-E@!UcU7}BwdHu9$gm&cU zwXg=7uRC}uRz98{con8`@-p8jAG%dzR&s@UU4E;pC-m+WoGA90u%W-3yxhGI zr)!4SfrX`08)GH0^0trV!nt=WS`i;|TJwNdQEb%oXU0(Zz!{x0MqDaatZ?y~W1?V*Zm%-q z>?iHz3U=FmSf^EGQxTji5WHzY$&<^s(@WIuyuSNsXH3eo_?`U=%47Q4Y8>~j%Q;$= zzrV%QqW;y$h~5}ZcMV>5PW{}6%Z!O1yeb72b}8D~5#!}PraxZOR-wFlsg>MyV>2;v z*~vHV^R+!@nAB+`vb|`d}3py}GS5&2z#?d9RvB8hwe#(@b&8u~J#Jqf{k{ zpA!Yuj4Pf$7rs>J(}LeeS>ko&9^c&6=`Qq0hI_xwx|Vwv72a{%F5KTg#dXe~s!QtP zxlNo7Yiu{)R3gNgEa;`LjOSo`Ggh8nW#;Fv&+#%f`5G=>E4=QFt8N#T7_6OBaOC0+ z%i3M%X=4P1OY%I2nXb6fA4^+a(rv6qJ8*D4oil6bB&*G$Ly1vGPQ1UR7olhTMe+QI z2Yx?kjn~yxbh_2vPMIPP0&f48WGPj1ipXT18 zqWfL&YVR?jUFbV!`te$87~Sisgm!~N|`(>yf-H6wHT1fQQY_awc+vpr*%)4sz@rv^$LNh+E=YBOkAJKhk z|Drkia;wkvWj%`*bWsV;i!C-j?e8m`ST*EfRpPrWteqT`{wzwO@S|VGjE)#`53@ZX!bdSCEDxr zy@6Z6~TBJMxQV)bb~ z`$8$^PGjjlx;ov9w=A?r=M=9l89Q)CQQvytA-|>Ksma*H8@iMG)^~}C<870q*{$MeJv4Z13_p1F5);G`c;*BP&Smxb=eiLV$4pt-p(%z6(#2#?R?wB5n=a6 zZ9q^KWSBW9qj0^Q)B5_0iS%s+Ykk_@?^xhj#nIRNu5$&~LT;Zx=^XR2?c%5JW$A70I{MWx=HpA8t~*}W`zbZY5huY|uKAC;%4;3A zJ`d6xGtJUvzvR`HGE)S9M%8wA#>C$DjzWf;wb$h|R&`|OF21{e?!*yYCQI|Um`t3m z2VR%;p|;!n)17t1M>MA%s}kchJX9I#)b<#2JiM;>cJG6==Q>Ld7$$1-Kfc?=|A^f` zx-8H4}wOH7$u?`8@@ zdRgA96}`M`yHMiBraT@Z=NI`?srMGH>^+k)6I)lHspVXshST-L>uzti+pNVVQevl; zl{&aYU*4>wI(a74X&|#mtIx#dlv}mAOi1T|YK0P}+$Ufnhbi!7kXP(fwXfMv72@hdQ@Ed*_5Y`TcVTrkcTGuw1?AD z<1v}XCV88$XR5@$7d2|@EA!xTAXIv+;98PTBjErU}nMnR2a5TivhT)r#p&k9&4y zG%k3H&%Sr{3|^k{!RmThKJU+^Cmb5oJ%ZEq!|OgUrmPx_p7ddjs!JKcK5cUp@9K%5wDY~J7tC(@v(s%blX&X4`r^x~ zdwexELgJF5@7I`bDY&{}-oR!Fx0{3GtW|jdXXr-!@#{q(UN`g1Neu~)Gd(dW<@M{V ztsX3Sk~o=5*R|}n%H3VNH{FZu*Qw^ZKo#Npb^WQd>!*6{nYZrTZyIp=T>ao)#i6_L zcX06r;dQgSxlRP$h?wgf8Mj39ebVAiMO$XAj8|QQwK<`@?ZX$#^ILT~uGV(*y1xzk z)MDdL)gm#t@x!p3-1?b{hgFjJ_nX0ZT?x4W&9y|9PZ4(#-do1iSL9m_j_r`Wo;fevW6`~(gsCgIc(>zq8K3R<@fp2o zZXqsdxj;Oq%EBOLl#4jZ-M^&Cf28Z6bN%(b$D1E=4_SV2I=*jknKr{bw=mAUQ42oq z<@21JMaZAOk=OYUyzYHAt1}JMuacw5xX$~mlIo4DRIO_=b6x?h^nhmC1%r;!Z>|a_ zm1H@W;BxOjoHSu?T3x`(lWDGqey%Z`+mdonR6elWEoqC; zolQ^fJy2fHR_%52)3@#HgwDjY{2w*Xk@Pn`R8gD|f9cJh8l3Jfye?m* zl$^7q;FhJ4a!%`eh54wBJBwPF{SKtP?>t!0>B^^4ZG7|PP{dN>he2EwWlK{>t6r|- zbsDg;Yv2Bnjjq-iryGga^`F12a@vuTF6M;!j?E#gYJ9S0{TGY;9hqvMzEh%>Shw@* z*ulho3FZq9d~34UUbpfRXT909*_{o=vH3^x0ytl|pt}t;?-LJdule?E<=$ zjYMQW?#w>CW2{N*UB;8}kNLre+Z8wkA8ZrbpBbcFLA~dyfK~+c%3Y(vW5fMXXxL{iC>9}VDRcr{CrPRdXx{Yg| zE!Y^|o>I+2sC6%Ww)y1<{(j$XyzaV{PJD5OT723$8G&+pYzH_!N(nh}S_Oj14~D5j zdv}%Xel~HV@Z-ZnAv-0xuQi(Pk*&J$i8{Ware10P$I*{*xOn&Ab$J!Vqu9a<;yj(t zsPU+t+sRg}elu&lBwY4W@gg0!X1+XbciO>qJ;O$mAkb-ZzZ9>1x$Y3@+nzWAVC9@2`GSxpMl%ZT(#|^X_Qn_xKlF4Cy`6 znRDpS>Lee=Bl~xSuV4?l)YY!B}{+IVNf$y}eAcD3@+i?DELBPV2M2zCwhyms zFex88*_B6nvFcJ>x{C=EUBvC_Zzn~O!(Z@qkXFRBHv)Uo)6RG zBi!GPtM$K65vP+##LqkEc`_^!GlUnd-n_Sc_Xh1FMYjF{4g1XE%9||usyi}w8_D-< zP+9Y}<6~$j2XRaN_WO#vBHDVL7wosX-b)jj#Y<)6a^(iD9u8olV2O#jd?Dl01#)L= zpU-1D#udvvQdHP-Zbgw^G1v37?vr_SOJ7+Xe?%0X@TR$4vm;!4q36T%k3t_Rx9_fS z|5iJ#fYUvQ*InLPx%0SIcD}Dl@f`Vf$$jEFt;aa+SKSePnzV{>ysIgR?R2C>G>aa$ z6}_bSGmc#cHSIb-tax29_s!f*GKIqU`^ty#x-`=oHw_Ow+`xZ9fUftm$-IipI`PGi zHY{RivGDh5VeA3nGJJfo1aD8nU4_|pQf8l&7 z`@%ulhx9AeqvJ&mYcZPynw*Y%baGFwtH0f)(pEku{QfryuPer|oMn#A8FM9tmRnQL zoW`6^gbyf|m>q`f|I)56QTE+3z-wC*JiIrs^QsNdJ9-8wJj9XBWb zeqS#>~*g|F#Xol)HD>75yE zy2d_2bz|G`WrlW-mLaN^oVR;%{oycPm&3ZS-%g3SAy{tSxA-wbzNGS+yqZ(-4^56* zHmJ6$8;ZQmS6cq|i)KRwUk>xU82TM^cdboPzRK`SLSl_c(9vp~ZVFy^PG*nV-p4n& zO=@1c$*w2tXCa8lmK?NfxaBdAIBt6_VdJY4C%dk^7ktR<$lH_~*V%KV#6vIlR`R|0 zp}BI)lc;gJNAS9GT_vBZcM}Ym-<@+ZWH47t`JnoF*udRl@IhM(T{rvlt46Uy_8(K4 zSnr3{-k z9{8I9|J!r_pPvD$KkRq!qTs;+Mwsi+IqWy^s^J_ArO5yJCH?nS)|JyO)^GESvzh8*W8>Dma<#;aW@7Os!=YPs;R1WMn6kFj-?*BK} zK@_1Wcg{}TSk^jT_Qv-i$;7<+wsewN=@TUg; z)WDw__)`OaYT!=|{HcLIHSnhf{?x#q8u(KKe`?@Q4g9HrKQ-{D2L9B*pBng61Al7Z z|9>?=`T8OU#m>_R@OP4O_YMej@br}O^l{qe>h9?xW##YUqQx&K!yn+j!^Ou{f?t8( z!P9-Kw~s4)orXY|`9@CYH4@UMsHLQ$Gw_`ojUahBEg=0hoq#?IMW3zH0MKWua{#n} zxd1ueX#zcm0oH;oasa0RnSecj-GCc_ zGk_RC6{X*Cpv)lsxBiE^sty3vAF4-GpVR0YGhx+6T20YA@7osQs1!PY#r3)I(8A47c&m0uH} z4Z!*qvTFcIfJ6Xln|J_fUqe7F0JXyoKp-Fh;1AFRp!)LzApS;xE5Hfh2-pBH2bckj z0V@GW&j6qg&;u9&P+u_xpfQ8#U|hsQoYesI8l6Yipn6*iumo68j*-SXfHlAhU<0rP ztOp>j1I5~d-2|`$YzAxrpkwqJU58?J0XPGYCW;@G75T8TAnOb80k{LU0#JF}0NwyE zfG5BMunmCXMb}|@Z->`toCE20FB3;0CX-I5Cw>&SnTy~I7YFf z82178QeG#3Jp?!iK<#+|Kuxizt15hHk( zt+_oQTt2cBJPJ~>%HYAiO)pAxXECDx5&|AYDe#f|4J&X4yiYYpwAQ?!CdVcxL+Z6C zHi24N-SbOgjld%(r6eUsZYO5&u&_Ur5*I$&IqSi`;aeJ6bt^uhm4g~pF)4ZaI6DMD zhp2iPta(Cp^+Vv0Vw00at;+&x5&1G#6ys-BgGXLU9@W9WN6kX@6t3lfYq4*Svj}SH zZJ#?@3LF_JIaw)rg0D|Npi@8qVUxqXrnjr;qQIj9B~_69{-nSf&nGLH&*;FD4k!YY zk!yfUu#0zKKv`lmcg*|v9wJqQ97G@wvjP?QTX{*+8x9H=YpQZkp}*IGYQ@t9GJ%w# zaettRk!F~KYB@TDWDHlJ_K7G93TRMim*b$alSQ$~5CR;?9E*P4eXL1tA+sE7;GmY{ zJ}ME~eR2BDtS2Ba)H4WjT5-}ro=GdF3g-#h>fjH8*P5LkR?ca-H0ud;@ego;N$F$s zhHqyDsdOL$)Y?#^J(PU3?5HaqexQ3sO$BjDp?UBJbpWkB1RR(-Bg;9s*fuAmM-!MchD#0TNo(a432!-QK z-)228!Gj`rt+R}7Oi#ad)`J!@e()%ZTvUA$E@DFQxL?!AQ=s*FJ?q&- z@$?@J9LZYoxqQ~+P4V37OUh&CHX5JxL{dCTtL~O$C12e!>q!O=8euZJ8TO^L%+N!y z2+mME+2}aiE%7p{l)JN@9`K;Kq+#xwRKo$U z>RHbS#k1hc7g>uYC6`$bEeveLsV2NP5+0=1p7rohJWqDJ8p+ASuDJ@qJ!qMp6Ae@^x)}WQuSuzG&P3)rb3?M0|PwW9bx`4 zJk@JThbs+9&+S`a_zL-fC?zZNA9Fl-V0x34lTx_`94JyGy^luyo3$C` z;8B#4Q<75n3l28>M?wXl_0**J+w-1H&#fV9Whps1SZI>KvlKkxDJp(*z0%Q2OZF%h zfkzTNsriv&9ObI04oDtF!ZYwNfoHj*?E4Ki=S0CHM_#wzfd`F}nn(I?qx!>yzyqrp z8rx`lh4NX$TKpzf;vPMC(5Q!*+}Xu32<^=d?ItL^;AyHSapa*mgl#^aKK||jfh~c3 z`*hb4(Hbl(rGn;zrJ#oD;An|y4xMuCI5mt$dD4<02_6>k+!T7`aGb_G8#qcR0-5jM zX&03})3RtF2smg3gbF2S0td}Vy>GAcRPj%@fk#G48AV_L9vF6!E*efEyO^f=sHu!7 zXEsyp)yXAYiIFGESg4exLZB3XwLfr!YvKRMGWZ9L1%m6%+INY5Paz*UDboD**X^SK zd!%OIpz;iPgvHXUDV+iiv;u6@2;Ja8HL4JPFl{8fs0Z`N5oW-H*17dNPTv^g?71}S z;f1b?TF&UDr@``DrPnZz3_%<`Xzpd!Gkn6V`A%ilqXHh(uXW9>&CL!TzB%hLqIh^F zyxyHN71)P)) z?|@KmC&CsUbLHbU49(P3fuMq-#hx=#^LMnB@=Thp1)IoFwzZmiuo#a`dGH953m{Foy{$lxchfX6sX-|)m#Yy%Ejvmok1@W4=t4E~tCsZFJ_-PG041tTprj6 z5Ng4L_WncpE@w{OKUIR2ROR~01xyj z)T^+kJO6VY4TT%lus9P&QZIM#gfATd4!mte zMuLN+MN{eO+Ww=)e9<(}7RVh#2aarq3@xaJ}ImBnXH{8ux zv7dgg$@5l{8hMWd8#z>e$I_d4{JhE-NE}j0r@({qVSXgMc-K%WTAfkLAvG76NFbdT z%&wT%63T*R7t&^f;OOJy>F5yPBIEF|Gh*|#tl0?Q9);v~H;2HoCu`SrOqOVa2ko9f z&0CzD&$kX~OX`7iEmA(@*nGT#0^L0WR`>OCB?%OFg9r5ksOu2mpk5^t&{k_XV?7BT zQk%lP#~(%@E==~CfpUyx1zlzjGzBDCn^&Da;AW7ysXS=DRP@u?^^xB=UKVkZ0!_+2i2SP zmbc%&BszR1d0?jq_Yh%cht@1?*9jido?MpTD@`6H8c)jP?|mw)LOWv8vOtIh4_eL6 zt{1bdbFIAq99gm}1w3eH$9Qe4;*vYNUXwhe^8DpKo-~vD`nxzd1;YKLmUnH5myMpo zT|-$J(rujoyf3DuiJDu6@YfvV`RjKdXioh1l0rVD8CFsz6nYk#-zrq8Zr^w5M7@eK z$NzZtPX!JSaCTN$MylV6Lw%IQQ6Ut92P!pkd{x2+*skra-8u` zN#sD!)1q_CJvkchdHt>j2EgsPU>E<*5BQ@jTumohpueF#{2mp>yHp`eGkKIKDtpOM z!Dl>he_8fNx0eb2?oKZLP7abjzApX_f$qT$fuX)IWBa@N25OUggfy4{mq1C>bF@ib zX~!UM$}7@MTgq$lZCY(tAGjUr6XfsYBJJ)CrPlTjatxJ*TcVQN9Rj@2KknpH-w%

}w5-YKmBgu)|(~qAEfU7K%lJhbzH8)&>AV`8Blun!8smep(AfiOgr(auIga2Bpv*u;wo^rX}B%H^)Ofa z#crV5vhmFIVk@ueWV%1P9;P){!CPU_9)zvL!B10p^4vMb=_D^Al>z6Ks70XOcdH_j6(QWpTEP=@0t)IO?q*F>>y@{-=@-`<2 z{~#uvs3PjGdA`4WO1c!U3J6Lwu~A~rq7T93K14~dJ$2lN&lKF3uaDHr(?^p^tdgS z&adPvkSwr*{7S4~?tm5KS7Q0f0VqGa63J6N0C~BUIG$Pq$IGq65jEl^0~{}R6%H>) zi^I9AaCl`|9L}x8F`9#|1vp-AC63V=!SQle;$SS`$KW8h5=S(Kc2>Z+%t{ouWdp@! zR-%ZuXkJ`qC5k&_z>CYQL=jQQEZOu*40|Mk5u09#Az~0dZ2Bq;(G95Kv}dXusrV%m?fFR)In;Rwc1j_gjKEHbs?JNlyG`fbp{sKLWB+ zwfe3k<34j=oh8D3f( zRQ#fYtJf*nKotl{KD1qpmoVZ4$M3Lbr?+tc3OK(9a&N}@?t0s|?YnBg&QNEsRj%Mb zhHINAVL#Rf)ggQsk;3fer#m4(o8Bq(_JD7s@^=NO+>9k}QG9bE$N5Hnw(|3MbBamP zh^8+gJpxhK2{CCbx2*2EzI`k65$^=xpaXweG>Al^$Beeu`F(l7>xRPC)>VjvuUaT@ z*1wkH5H_gW;s}qfl|oo;ax!#HIhJ)t!SyEFXLy?#Y?j|r+6HB#Iuq8e9J8ATy3FcF zqUc>#+CUJJP#h;kl0XdPt^6h1h%7k-3&i{j?W0!)&_*b9I2UMiitpcdO1MrCb4(LR z`4>mnMz)SfclChg^#In$MG$8#Ka(hE&kKP?k2G;CGjTLiK#`5gQ!~*)twFL1wDO0# z^MMcl3eq`M74!oAQenBDRIJjQRQx{=ut~q*}E9N~Ybz+Ci04XfMu}^ka zd|NPqf}l1@cn{N}@?-*1F9&Mc+R!VD2!i5MAtIKb9l(M-1o2(Aa4DvvI*CP%ED&Yb zBID(B!!OO+7~r!#{y?tvQqDqPN@Cgi)U@`L2DwdpEA9EMuZq|5vpgKAo~#T$ zV1&YKp=<=w87~Lc;HlbDYISBITDbEn!53pSup%@_Rr8h^u%`x;!UWCo9GmK5wgM{0 zQcz6ntUc31P91Pqehu=BE$-lFD$j*Ujj~a}=E_15I&-J($kx~H0(>hpjEDZH@+{xS z_Db6Z4B0de4Y~lw4-Fk_3p$33(oTlfY!^gxWs#qkh!}= z6M}U=;CRB9U_{FSbLG$;K4NQJpOHKQZVL|RBQrv%$clxpK{h$;F?+f2Su2wLIEcYi z!><|+;&=I^BqF^8C5^<`&-2(KpM+=}rvP*rrcGVt!ZCwBEWqsEr%e(Gj0dqKcv154 z_i}7<_PStlqT!H!JKzL#7)RQcnL4NdGA)AR1W3H6QXKuj%Re%Cd)lh@WGbg`kPZ+u zF2jch?~p}X@8OLxu>k92L@&@fDUnv3K~WFq%LXp)O`2>h{E5OgNVyR%^) z;_54SI)0Zu>LEJvF_O3Q(XImwk8Q#53Rq2fe33Dj zZwf$dk~o{wOM-NOzSIDnNwWT>`tzNxp!Kt4iKkO?y_B)L|TS z1?nKrs*)U6;Bf~8hpdy+gkMjbL*5soE2X2y<#;j12FkAjG)j3Mz(*c17?-nX7CZkg z+Tt8<#3_2_vyyJC%X{@l4g^07?Iue*uB6(gx%@=pzkrZ%rs{0pQv8Oit}&M( + + + + + + + + + + Visualizzazioni di Ricerca Operativa + + + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..8936432 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "ricerca-operativa", + "module": "index.ts", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "@preact/preset-vite": "^2.9.0", + "@types/bun": "latest", + "@types/katex": "^0.16.7", + "@types/lodash": "^4.17.7", + "vite": "^5.4.1" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@fontsource/inter": "^5.0.20", + "@ruby/3.3-wasm-wasi": "^2.6.2", + "@ruby/wasm-wasi": "^2.6.2", + "katex": "^0.16.11", + "lodash": "^4.17.21", + "vite-plugin-wasm": "^3.3.0" + } +} diff --git a/src/algorithms/simplesso-primale-algebrico/View.jsx b/src/algorithms/simplesso-primale-algebrico/View.jsx new file mode 100644 index 0000000..0c5ee2c --- /dev/null +++ b/src/algorithms/simplesso-primale-algebrico/View.jsx @@ -0,0 +1,29 @@ +import { Steps } from '../../components/Steps.jsx' +import { evalRuby } from '../../ruby.js' +import algorithmCode from './algorithm.rb?raw' + +import { useEffect, useState } from 'preact/hooks' + +export const metadata = { + group: 'Programmazione Lineare', + title: 'Simplesso Primale Algebrico', + description: 'Algoritmo principale della programmazione lineare', +} + +export const View = ({}) => { + const [steps, setSteps] = useState([]) + + useEffect(async () => { + const { outputs } = await evalRuby(algorithmCode) + setSteps(outputs) + }, []) + + return ( + <> +

Simplesso Primale Algebrico

+

TODO

+ + + + ) +} diff --git a/src/algorithms/simplesso-primale-algebrico/algorithm.rb b/src/algorithms/simplesso-primale-algebrico/algorithm.rb new file mode 100644 index 0000000..76483cd --- /dev/null +++ b/src/algorithms/simplesso-primale-algebrico/algorithm.rb @@ -0,0 +1,30 @@ +require "json" +require "js" + +def print_step(label, state) + puts "Ruby: #{label} #{state}" + JS.global[:rubyOutputs].push({ + label: label, + state: state + }) +end + +def run(config) + i = config["i"] || 1 + j = config["j"] || 1 + n = config["n"] || 10 + + print_step "Initial", { i: i, j: j, n: n } + + n.times do + m = i + j + i = j + j = m + + print_step "Step", { i: i, j: j } + end + + return i +end + +run({ "n" => 10 }) \ No newline at end of file diff --git a/src/components/KaTeX.jsx b/src/components/KaTeX.jsx new file mode 100644 index 0000000..e011167 --- /dev/null +++ b/src/components/KaTeX.jsx @@ -0,0 +1,16 @@ +import 'katex/dist/katex.min.css' +import katex from 'katex' + +export const KaTeX = ({ source }) => { + console.log(source) + + return ( +
{ + if (!el) return + katex.render(source.toString(), el, { throwOnError: false }) + }} + >
+ ) +} diff --git a/src/components/Steps.jsx b/src/components/Steps.jsx new file mode 100644 index 0000000..78f02e5 --- /dev/null +++ b/src/components/Steps.jsx @@ -0,0 +1,18 @@ +import { KaTeX } from './KaTeX.jsx' + +export const Steps = ({ steps }) => { + return ( +
+ {steps.map((step, i) => ( +
+
{step.label}
+
+ {Object.entries(step.state).map(([key, value]) => ( + + ))} +
+
+ ))} +
+ ) +} diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..c330965 --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,105 @@ +import './style.css' +import '@fontsource/inter/latin.css' + +import _ from 'lodash' + +import { render } from 'preact' +import { useState } from 'preact/hooks' + +const ViewRegistry = Object.fromEntries( + Object.entries( + import.meta.glob('./algorithms/*/View.jsx', { + eager: true, + }) + /* fix for broken syntax highlighting */ + ).map(([path, module]) => { + const [id] = path.match(/(?<=\/)[^/]*(?=\/View\.jsx$)/) + return [id, { id, ...module }] + }) +) + +const NewAlgorithmBox = ({ title, description, onClick }) => ( +
+

{title}

+

{description}

+
+) + +const AlgorithmChooserView = ({ setCurrentView }) => { + const sections = _.groupBy(ViewRegistry, 'metadata.group') + + return ( + <> +

Algoritmi

+ {Object.entries(sections).map(([group, algorithms]) => ( +
+

{group}

+
+ {algorithms.map(({ id, metadata }) => ( + setCurrentView(id)} + /> + ))} +
+
+ ))} +
+

Flussi su Grafi

+
+ + + + +
+
+
+

Flussi su Grafi

+
+ + + + +
+
+
+

Flussi su Grafi

+
+ + + + +
+
+ + ) +} + +const Main = ({}) => { + const [currentView, setCurrentView] = useState(null) + + if (!currentView) { + return + } + + const View = ViewRegistry[currentView].View + + return +} + +const App = ({}) => { + return ( + <> +
Visualizzazioni di Ricerca Operativa
+ +
+
+
+ + ) +} + +render(, document.body) diff --git a/src/ruby.js b/src/ruby.js new file mode 100644 index 0000000..5924442 --- /dev/null +++ b/src/ruby.js @@ -0,0 +1,26 @@ +import rubyWasmModuleUrl from '@ruby/3.3-wasm-wasi/dist/ruby+stdlib.wasm?url' +import { DefaultRubyVM } from '@ruby/wasm-wasi/dist/browser' + +window.rubyOutputs = [] +let vmInstance = null + +async function preloadRuby() { + if (vmInstance) return + + const response = await fetch(rubyWasmModuleUrl) + const module = await WebAssembly.compileStreaming(response) + const { vm } = await DefaultRubyVM(module) + vmInstance = vm +} + +export async function evalRuby(code) { + await preloadRuby() + + window.rubyOutputs = [] + const result = vmInstance.eval(code) + + return { + result, + outputs: window.rubyOutputs, + } +} diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..6839564 --- /dev/null +++ b/src/style.css @@ -0,0 +1,176 @@ +*, +*::before, +*::after { + font-family: inherit; + padding: 0; + margin: 0; + box-sizing: border-box; +} + +html, +body { + min-height: 100%; + height: 100%; +} + +body { + width: 100vw; + height: 100vh; + + position: fixed; + overflow: hidden; + + user-select: none; +} + +img { + display: block; +} + +/* Typography */ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Inter', sans-serif; + font-weight: 500; +} + +/* Components */ + +.boxes { + display: flex; + flex-direction: row; + gap: 1rem; + + align-items: start; + + .algorithm-box { + display: grid; + grid-template-rows: auto 1fr; + + gap: 0.25rem; + padding: 1rem; + border-radius: 0.75rem; + + background: #fff; + border: 2px solid #333; + + width: 10rem; + min-height: calc(10rem * 3 / 4); + + p { + color: #444; + } + + cursor: pointer; + + &:hover { + background: #f4f4f4; + } + } +} + +.steps { + display: grid; + grid-template-columns: 1fr; + + place-self: center; + + gap: 1rem; + + .step { + display: grid; + grid-template-rows: auto 1fr; + + gap: 0.5rem; + padding: 1rem; + border-radius: 0.75rem; + + background: #fff; + border: 2px solid #333; + + min-width: 20rem; + + & > .label { + font-weight: 500; + font-size: 15px; + } + + & > .state { + display: grid; + grid-template-columns: 1fr; + gap: 0.25rem; + } + } +} + +/* Structure */ + +body { + display: grid; + grid-template-columns: 20% 1fr; + grid-template-rows: auto 1fr; + + font-family: 'Inter', sans-serif; + font-weight: 400; + font-size: 16px; + + background: #f0f0f0; + + & > header, + aside, + main, + footer { + display: grid; + place-content: center; + + padding: 0 1rem; + } + + & > header { + height: 3rem; + + grid-column: span 2; + + border-bottom: 2px solid #333; + background: #fff; + + font-weight: 300; + font-size: 1.25rem; + } + + & > aside { + border-right: 2px solid #333; + background: #e0e0e0; + + position: sticky; + height: 100vh; + + padding: 1rem; + + align-content: start; + } + + & > main { + display: grid; + grid-template-columns: auto; + + padding: 6rem 1rem; + gap: 1.5rem; + + place-content: center; + align-content: start; + + overflow: auto; + + & > section { + display: grid; + grid-template-columns: auto; + gap: 0.5rem; + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..dfef62d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..1b0bb46 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite' + +import wasm from 'vite-plugin-wasm' +import preactPlugin from '@preact/preset-vite' + +export default defineConfig({ + build: { + outDir: 'out', + emptyOutDir: true, + }, + server: { + port: 3000, + }, + plugins: [preactPlugin(), wasm()], +})