From 090dd1ff645ae03b5855c1654430739eed361db2 Mon Sep 17 00:00:00 2001 From: MrWaradana Date: Wed, 11 Feb 2026 14:59:08 +0700 Subject: [PATCH] feat: Implement a simulation mode for equipment prediction and EAC, and extract execution time formatting into a helper function. --- .../__pycache__/Prediksi.cpython-311.pyc | Bin 50257 -> 52571 bytes .../equipment/__pycache__/run.cpython-311.pyc | Bin 2998 -> 4437 bytes src/modules/equipment/run.py | 71 ++++++++++++------ 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/modules/equipment/__pycache__/Prediksi.cpython-311.pyc b/src/modules/equipment/__pycache__/Prediksi.cpython-311.pyc index c8d25eb97c8b7b24c9656b5d0c914eb70e304388..08e596875942f83b3f0925c1d41c034543b31702 100644 GIT binary patch delta 3828 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 diff --git a/src/modules/equipment/__pycache__/run.cpython-311.pyc b/src/modules/equipment/__pycache__/run.cpython-311.pyc index cd997a85fa3624a3fa582bd712f75ac7f8c56c3e..9b0cd2d6b22b0d6d713340d2fb921cbf334572e0 100644 GIT binary patch literal 4437 zcmeHKU2N3Y6~6wP@%&_x3<=33gqWX&goK$uAj_g<*^r;2v_!44qTN7u>Dw}kimlN=Y8sPNrr>__PhbyF7QC6oN=P}QRq5gP85l9A?>XWf9k3^oH8e@EKxW`;j>-}b z;g4lW;B=M}nTNFKdgPkGeUoeku72)Z@_URU{)z^5Wa%@jR-U7r-*=g zR{eixDtgE{=W|HIGt(|2;hcK}43lQf)UtxJ?N@*bcc{zg0rgutM`Q_+Oe3YyVUOBw zPec)nBOUE%4gVjzWJ#x$hv?C^Hw5||e94h_No>C?-6U?JTh!<1 zCIK<{Dz;#Cfw+YeIZCVB`Zj|{(JI+(o-1sYa>PqH{AHXT61$1f^}md9SN|H;sU@@z^@$m%q73)Z?lCS8V|lmd8U`l`&E zo{?LEl)~Pcl&UGF+qP%AdG&TekdvlQR)wUJ1o%ow7M^swOs|SZqYP$^wmFP$ilnAv znn_5e%NAKFA(r*raY;6VP_%p+Q zso=k)`!5y!!MV{AgZxL{e(ys5<`N>A`YpE3*6D%BQ+4IU;~P(IfCyx;eFe5pXZwn5 zV9r&!-a;uc&=@~i>`!Cs{m^1)&b96f7JU1cZWz8J1>cbpB0L9+?FSaFZe4SuRzC*~ z_E3R6q+9fM-Pg3`hb37`Jx}|WuRk7mGN1=~fDE>`!1n5F?~cxV&!UE=`P*OLnZJ|2 zSPWeLuIt=ir~lq&d@^BleOBoDOb=WJ%Krq$bnfVvb$c*Pq^J2Cul z49>*x<721-f9L2zV!+!3yUef^X%~s1I?i{X(@K6n9HTQa{Ky!0of!61B79F`sETgq z#L&En#9JHYv)rf>giaLPlhTA)Gq6nOgrLYNjT88oP{|<q3P*ujw|KoVgq_Pdizxb|i$xGxNK1IFsb`D3Vmk|bJlZ{64kuMs3jSp~Ej_wYYCn27!W*3}G!uGi& zym>AO%L!G2EdnoSX+CBhBduv|?ys$G?V8|xsbIh;&rv+%%}{N1eE7usi1LcS>%ejh zJDcF+QZx#?ncJ#K#iWEu^UAdwCIy?RKOhAk$gOS12K#Z@=}(js@D9hOdVrTGf*^`0 zkhiWP^5w0oTF`#!06xls< x?s?zB#f6La#}>y7wzI%?>J@rre;r;JzCXG+YOw7Ewq37KsSeR?(4#d}{{eb$4$c4o delta 1235 zcmah|U1%Id9G~6UkK2#C%Uv3iRHSRINv?#%8Y(qytwpz`q#o1{iVw1!w-a4+yBBBY zP}e=0V!#u8FwBcsf(o|v<0TM~z7{O>@vcM&gF-<9`WC4V;*&G?(b_8b=Rd!h`Tu|a z-+b)OkNdwL&0WoAO~CEt(f5NR`dV&GZh^HacUVJ~uPwuoiSx|&G{bIGMMeNg&GKN7v~^Yfj40j(L{;s!m);l@uiWTun7qePc-#Wq6)E+^^@I zh$npY`-Pj@zc?BIzWE9X5@B-a={&4l~s|rvy^tB~U7qlMxr=I(CA{dAot|d!An* zm3ik>LO;}=mJ)hh8(l~W?#bsI+=v{ENCQX6cM{zR2nyqwq&Ub`>)~<@5#)>5KoeD} z9xt4Cf}tD$za68W+Xr4qgA zOoDpE)MXq*gu$3#W-Vjn2UQ}ZsjKgMm6<^tL@}vERm7B95EG`72Hy^YH54((D@!Ib zIRO(-$TJDCLSKcedlf-=#uC%5d$wmtbLt!KyRPni?u$Rl5vosokp<=gaec;d118*aOJp8GWc z+;8f=zK1QnrPEbddbYfAx?L=DzxGbA@1e-wE}q-qnR9o&rSB+4Yw}`wwY*Z^wu&p| z*rh}HLkCYj_55-0!*SC+1aIj3+-Z1YTIFMw@w~7SM4ng5;=H&GgOdDfQkLGzA2`fE zIS`Df5+cuIkbkakz#Se0*x~S3=2%$w8#VL{F7c^&!|}I(xV_` ratn^P;rO= 3600: + hours = int(execution_time // 3600) + minutes = int((execution_time % 3600) // 60) + seconds = execution_time % 60 + return f"{hours}h {minutes}m {seconds:.2f}s." + elif execution_time >= 60: + minutes = int(execution_time // 60) + seconds = execution_time % 60 + return f"{minutes}m {seconds:.2f}s." + else: + return f"{execution_time:.2f} seconds." + +# Alternative calling function to just predict and calculate eac without inserting actual data +async def simulate(): + start_time = time.time() + print("Starting simulation (predict + eac)...") + + try: + prediction_result = await predict_run() + if prediction_result is False: + print("Prediction step failed or was skipped. Skipping EAC run.") + return + except Exception as e: + print(f"Error in predict_run: {str(e)}") + return + + try: + result = eac_run() + if asyncio.iscoroutine(result): + result = await result + print("EAC run completed.") + except Exception as e: + print(f"Error in eac_run: {str(e)}") + return + + end_time = time.time() + message = f"Simulation finished in {format_execution_time(end_time - start_time)}" + print(message) + return message + # Panggil fungsi async def main(): start_time = time.time() @@ -29,34 +70,20 @@ async def main(): result = eac_run() if asyncio.iscoroutine(result): result = await result - - if isinstance(result, (list, tuple)): - print(f"EAC run returned {len(result)} items.") - else: - print("EAC run completed.") + print("EAC run completed.") except Exception as e: print(f"Error in eac_run: {str(e)}") return end_time = time.time() - execution_time = end_time - start_time - # format execution time into h/m/s as needed - if execution_time >= 3600: - hours = int(execution_time // 3600) - minutes = int((execution_time % 3600) // 60) - seconds = execution_time % 60 - message = f"Script calculation finished in {hours}h {minutes}m {seconds:.2f}s." - elif execution_time >= 60: - minutes = int(execution_time // 60) - seconds = execution_time % 60 - message = f"Script calculation finished in {minutes}m {seconds:.2f}s." - else: - message = f"Script calculation finished in {execution_time:.2f} seconds." - + message = f"Script calculation finished in {format_execution_time(end_time - start_time)}" print(message) return message if __name__ == "__main__": - asyncio.run( - main() - ) + import sys + # Use 'simulate' argument to run without query_data + if len(sys.argv) > 1 and sys.argv[1] == "simulate": + asyncio.run(simulate()) + else: + asyncio.run(main())