From 16633f25b1df9c0a4169893a9f34a0c0f37a6a0b Mon Sep 17 00:00:00 2001 From: Nicolai Date: Thu, 26 Mar 2026 16:51:41 +0100 Subject: [PATCH] =?UTF-8?q?bunderbest=C3=A4nde=20+=20colorfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 ++++++++++++++++++ .../run_optimization.cpython-313.pyc | Bin 41610 -> 42127 bytes src/optimization/run_optimization.py | 12 +++++++++++- webapp/frontend/src/App.jsx | 16 ++++++++-------- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6d08530..7852ea0 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,24 @@ npm install npm run dev ``` +Lokale Ausführung auf dem eigenen Rechner (ohne Docker): + +Backend mit lokaler Gurobi-Lizenz: +```bash +cd /Users/nicolaimacbook/Projects/LEAG/COALLOG/LEAG-COALLOG +GRB_LICENSE_FILE=/Users/nicolaimacbook/gurobi.lic python3 -m uvicorn webapp.backend.main:app --reload +``` + +Frontend: +```bash +cd /Users/nicolaimacbook/Projects/LEAG/COALLOG/LEAG-COALLOG/webapp/frontend +npm run dev +``` + +Danach: +- UI: `http://localhost:5173/` +- API: `http://localhost:8000/` + Optional: eigene Input/Output-Pfade beim Preprocessing via Umgebungsvariablen: `POC1_INPUT_XLSX`, `POC1_OUTPUT_DIR`. diff --git a/src/optimization/__pycache__/run_optimization.cpython-313.pyc b/src/optimization/__pycache__/run_optimization.cpython-313.pyc index 1cc4466929e8996dc7c7dd6274021812fc630d79..7fbc3a6e762492c2fc2bd9fa280e5f8e5fa5ae33 100644 GIT binary patch delta 5227 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 anfuc4yX^J*j)m@Ag{$y~ZEWCv+rI&Jxzz{& delta 5016 zcmb_gd2pM>72nlm`H+w3aFk%niS5RAkWcxL&&alX;&ZkBl888Qe8lHxTef2-U__vl zs}z`5j!vg-niNW>Q%c4JDF1+`l$HV^8QOs%z%(;$XBcJ(Q(Br7+Vt%weUcqwddj0c z-nDPv{&wG!?|(&e&o4BIpO{Q>1V1lsere2b@2Nyj+Lp!=Li$O+x!=-1*FWFC(0{mp zv480y!YMp(zyiTEx8n|`+d{^5Q;Y0tOfN>Vmfgt=IHIzS-34!@?WFTikh2-KrZ;O3 z`{v=-mTjM*t;@sAwp-XTfGZh}rd&(o42eFL+8GH!vc*SPNWn)zKEHE8Rg|LK*IHwa`|f1|PZNjoey5 zDP>kTTUKS{u7kORD1=@?MC0em{H9XoU>R`JYL~23|P>V5KM(XRwNmDCTnHIE-iR!ZSYgKULRqnD)dq+phQRp zLCGdnGO-FtLmEOlex+KoE6k{P$NPlD3$-%1Qqi1J#>)x_tLULl6G3-bTX?}(NG`J` zvbLxqYhTNPd)-bU0ycvRRjl`_KbCJ~KE~ZTxynBkl16(~K #)l+6(**h)P)mHOrD5^@;{{L5+ z-DQr&m3(5Y8L<`|-=#~cR--9)H0g#9s|>Rbl?w44CYn;qrF@ciA|pp zn_49{wLJf-*yR5gv8i1b8;g$D^e*BtSc@ct_3nJFx&^roakHm~%Deb3GwJipX$r`k z#!Ol^4;g}Z9ZyX8iIP~9VM zRF^@6c*kUKlqWT;;iV$a#%p_zshZJV@^Tw1=5?^6wkx-(kjTwzu+X%|#tuRj5L2>K zZjqYdRGl@xrGTiBR4)5(YAvP+j-=+^JAgK1myU<^S{3aUxlO9)t^Omb2fSWg!)YKy zIj44i5H8kOV?1Ixw&JVBwH|5<~(cu?I>>yrt-SXrRhD26u^b+yI&RVyAeP52|sB_L7%5lykL(dNzm=<5CajldYtnxwOQ$o6$KG{#>{XE#!DC+tkHN|i9`UXf{cEpPRIc;A z@89+vD;|-4I;z9{FedSf4f?zxHq1uYA!f_h$r2l7V{DwI=4<8Mcysq~34L=DGPU4a z@IjH^3PEoyR5vEZE{JNurDYSMRwt(a{85ZOlqpO;c}@B`d7p0%?swSGpCq^~ z)12d5U?%nLko)~x)idLBJmjj5O=0b3R4TUV#^g$QKksLGmEXjqw}}wHLsek1wBLy@ zg4FMfCxj)dM!P68$p`Q|fE&v+El7Js&L8MR$-Qta)3V-!gV*$6daVZ)@*qFBfd_+% z2M4d=!GPq)r_quu-6-u_>olZfX3|IDg4e8_!#Ka*a$UmJYnSw*mz=l@}3d=q;6ggR4t z=+qkE`c4zv-k!2;_}aNxeerlY476K}p=5_??OeNcYDsvDp4}|^O1uR_m=bWV(w7yw zxFMLPrO_@bjmfg~r3*>p5q-H-7xEU-fI1?zdczN}G=Wk_g!NLbD%0^w=p02!B@IhM zh=p75*TlL)5=$DQBWgK`o~$h=EpYJ$y;@SnhmjUO;k2L&?{XdsVj{-`o zm!-*RHG#5YN~#^@p~QQeG82&~^{sKTSdxV09TXL)c$X5kG1cVV2+cN`F9|q`JS#X92MCO}ph1pK~TIic2&<~+z z-37?jhEWfWuJ~XG?kZ6J69Dz`jr{VmWRabv@sM}w9@UJs78te-kP#`MaO)eF|FnAy z+PXKv&E0YEKzH2EA$6%3GJqvx24S6Yg@ZK5cNUG18m)tj&^i2(G^de0@J6={&UZWM zJu9(2_icuk$MB?i1c^dkym9z4b zl%_#&CWk(;^2E$>F=-9t(&tv@0@KuxLD8mQTjB3>X8LnTng4z8iZC{SO|C9r5CVG9 z=tL7E8Vxo_V=|jc>&xqlaM0-THZ?W{as)3In-8wwC-9iCk|k)_*yPf{L&72r#EF?M zkRmwAqDd0XCT!j@C?;WkVGr$tGYg;7zrw4Bk7@#+fp77t9Y!G+D;i-U5HB=zgTs@P z@90Lxly+L44`^ZM(l|Y`^6=7M@EH)>i#rul0q2HOYjU=YFCHd zG}PBv6#7U?oM*(b^30?AbcUaa=smw;|IVG%@|+k8!aFg8qtj!9!*j@a`n%1Po`%oA z$Mvrv%e>NeJVrzFq5p*2a7HMM!}5tO^b9 None: bunker_df["vortags_bunkerbestand_tonnen"] = bunker_df.groupby("kraftwerk")[ "bunkerbestand_tonnen" ].shift(1) - bunker_df["vortags_bunkerbestand_tonnen"] = bunker_df["vortags_bunkerbestand_tonnen"].fillna(0) + bunker_init_map = { + j: safe_value(model.bunker_init[j]) for j in getattr(model, "J_BUNKER", []) + } + bunker_df["vortags_bunkerbestand_tonnen"] = bunker_df.apply( + lambda row: ( + bunker_init_map.get(row["kraftwerk"], 0.0) + if pd.isna(row["vortags_bunkerbestand_tonnen"]) + else row["vortags_bunkerbestand_tonnen"] + ), + axis=1, + ) bunker_pivot = ( bunker_df.pivot_table( index=["datum", "woche", "tag"], diff --git a/webapp/frontend/src/App.jsx b/webapp/frontend/src/App.jsx index 382db6b..405c87e 100644 --- a/webapp/frontend/src/App.jsx +++ b/webapp/frontend/src/App.jsx @@ -5,17 +5,17 @@ const API_BASE = import.meta.env.VITE_API_BASE || ""; const THEME_STORAGE_KEY = "poc1-theme"; const SOURCE_ORDER = ["Reichwalde", "Nochten", "Welzow"]; const SOURCE_COLORS = { - Reichwalde: "#e4dc41", - Nochten: "#f6bd1f", - Welzow: "#ef6c00", + Reichwalde: "#8c5e3c", + Nochten: "#b07d4f", + Welzow: "#d39b6a", }; const TARGET_ORDER = ["J", "SP", "B3", "B4", "V"]; const TARGET_COLORS = { - J: "#439c6b", - SP: "#5aaed6", - B3: "#ef6c00", - B4: "#f6bd1f", - V: "#e4dc41", + J: "#2f6f7e", + SP: "#4f8ea3", + B3: "#5c6fb2", + B4: "#7b5ea7", + V: "#2f9a8f", }; const TARGET_LABELS = { J: "KW Jänschwalde",