From 7a7ba4ae75d8ab37a7932118b21a557b005adf7e Mon Sep 17 00:00:00 2001 From: Jikai Ma Date: Wed, 13 Mar 2024 21:25:17 -0700 Subject: [PATCH] thermal: add support of LSTM model sensors - add tflite model files - add lstm model sensors to thermal config - add lstm model sensor to virtual skin prediction Bug: 308179047 Test: build and validate thermal service Change-Id: Iaff613d75b3766bfbdf40b391e453a94172872a3 Signed-off-by: Jikai Ma --- device-caimito-common.mk | 3 ++- thermal/thermal_info_config_caiman.json | 20 ++++++++++++++-- thermal/thermal_info_config_komodo.json | 22 +++++++++++++++--- thermal/thermal_info_config_tokay.json | 20 ++++++++++++++-- .../vt_prediction_lstm_model_caiman.tflite | Bin 0 -> 16856 bytes .../vt_prediction_lstm_model_komodo.tflite | Bin 0 -> 16856 bytes thermal/vt_prediction_lstm_model_tokay.tflite | Bin 0 -> 16736 bytes 7 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 thermal/vt_prediction_lstm_model_caiman.tflite create mode 100644 thermal/vt_prediction_lstm_model_komodo.tflite create mode 100644 thermal/vt_prediction_lstm_model_tokay.tflite diff --git a/device-caimito-common.mk b/device-caimito-common.mk index 18b82721..3bbc4c73 100644 --- a/device-caimito-common.mk +++ b/device-caimito-common.mk @@ -27,7 +27,8 @@ PRODUCT_COPY_FILES += \ ifneq (,$(filter $(TARGET_DEVICE),komodo caiman tokay)) PRODUCT_COPY_FILES += \ $(TARGET_VENDOR_THERMAL_CONFIG_PATH)/thermal_info_config_$(TARGET_DEVICE)_proto.json:$(TARGET_COPY_OUT_VENDOR)/etc/thermal_info_config_proto.json \ - $(TARGET_VENDOR_THERMAL_CONFIG_PATH)/vt_estimation_model_$(TARGET_DEVICE).tflite:$(TARGET_COPY_OUT_VENDOR)/etc/vt_estimation_model.tflite + $(TARGET_VENDOR_THERMAL_CONFIG_PATH)/vt_estimation_model_$(TARGET_DEVICE).tflite:$(TARGET_COPY_OUT_VENDOR)/etc/vt_estimation_model.tflite \ + $(TARGET_VENDOR_THERMAL_CONFIG_PATH)/vt_prediction_lstm_model_$(TARGET_DEVICE).tflite:$(TARGET_COPY_OUT_VENDOR)/etc/vt_prediction_lstm_model.tflite ifneq (,$(filter $(TARGET_BUILD_VARIANT), userdebug eng)) PRODUCT_COPY_FILES += \ $(TARGET_VENDOR_THERMAL_CONFIG_PATH)/thermal_info_config_$(TARGET_DEVICE)_wingboard.json:$(TARGET_COPY_OUT_VENDOR)/etc/thermal_info_config_wingboard.json diff --git a/thermal/thermal_info_config_caiman.json b/thermal/thermal_info_config_caiman.json index f9a4cd05..b862b4d6 100644 --- a/thermal/thermal_info_config_caiman.json +++ b/thermal/thermal_info_config_caiman.json @@ -188,6 +188,19 @@ "Coefficient": [1.0, -1.0], "Multiplier": 1 }, + { + "Name": "VIRTUAL-SKIN-LSTM-MODEL", + "Type": "UNKNOWN", + "VirtualSensor": true, + "ModelPath": "vt_prediction_lstm_model.tflite", + "Formula": "USE_ML_MODEL", + "Combination": ["north_therm", "soc_therm", "charging_therm", "disp_therm", "battery", "quiet_therm", "usb_pwr_therm", "rfpa_therm", "btmspkr_therm"], + "PreviousSampleCount": 11, + "OutputLabelCount": 6, + "Multiplier": 0.001, + "SupportUnderStampling": true, + "ValidateInput": true + }, { "Name": "STATS-UPDATOR", "Type": "UNKNOWN", @@ -195,8 +208,8 @@ "Hidden": true, "TriggerSensor": ["north_therm", "soc_therm", "charging_therm", "disp_therm", "quiet_therm", "usb_pwr_therm", "rfpa_therm", "btmspkr_therm"], "Formula": "WEIGHTED_AVG", - "Combination": ["VIRTUAL-SKIN-MODEL", "VIRTUAL-SKIN-LEGACY", "VIRTUAL-SKIN-MODEL-LEGACY-DIFF"], - "Coefficient": [0.0, 0.0, 0.0], + "Combination": ["VIRTUAL-SKIN-MODEL", "VIRTUAL-SKIN-LEGACY", "VIRTUAL-SKIN-MODEL-LEGACY-DIFF", "VIRTUAL-SKIN-LSTM-MODEL"], + "Coefficient": [0.0, 0.0, 0.0, 0.0], "Multiplier": 1, "SendPowerHint": true, "PollingDelay": 300000, @@ -218,6 +231,9 @@ "SendCallback": true, "PollingDelay": 300000, "PassiveDelay": 7000, + "PredictorInfo": { + "Sensor": "VIRTUAL-SKIN-LSTM-MODEL" + }, "BindedCdevInfo": [ { "CdevRequest": "tpu_cooling", diff --git a/thermal/thermal_info_config_komodo.json b/thermal/thermal_info_config_komodo.json index fd190489..ded4f543 100644 --- a/thermal/thermal_info_config_komodo.json +++ b/thermal/thermal_info_config_komodo.json @@ -211,6 +211,19 @@ "Coefficient": [1.0, -1.0], "Multiplier": 1 }, + { + "Name": "VIRTUAL-SKIN-LSTM-MODEL", + "Type": "UNKNOWN", + "VirtualSensor": true, + "ModelPath": "vt_prediction_lstm_model.tflite", + "Formula": "USE_ML_MODEL", + "Combination": ["north_therm", "soc_therm", "charging_therm", "disp_therm", "battery", "quiet_therm", "usb_pwr_therm", "rfpa_therm", "btmspkr_therm"], + "PreviousSampleCount": 11, + "OutputLabelCount": 6, + "Multiplier": 0.001, + "SupportUnderSampling": true, + "ValidateInput": true + }, { "Name": "STATS-UPDATOR", "Type": "UNKNOWN", @@ -218,14 +231,14 @@ "Hidden": true, "TriggerSensor": ["north_therm", "soc_therm", "charging_therm", "disp_therm", "quiet_therm", "usb_pwr_therm", "rfpa_therm", "btmspkr_therm"], "Formula": "WEIGHTED_AVG", - "Combination": ["VIRTUAL-SKIN-MODEL", "VIRTUAL-SKIN-LEGACY", "VIRTUAL-SKIN-MODEL-LEGACY-DIFF"], - "Coefficient": [0.0, 0.0, 0.0], + "Combination": ["VIRTUAL-SKIN-MODEL", "VIRTUAL-SKIN-LEGACY", "VIRTUAL-SKIN-MODEL-LEGACY-DIFF", "VIRTUAL-SKIN-LSTM-MODEL"], + "Coefficient": [0.0, 0.0, 0.0, 0.0], "Multiplier": 1, "SendPowerHint": true, "PollingDelay": 300000, "PassiveDelay": 7000 }, - { + { "Name": "VIRTUAL-SKIN", "Type": "SKIN", "Version": "6.1", @@ -241,6 +254,9 @@ "SendCallback": true, "PollingDelay": 300000, "PassiveDelay": 7000, + "PredictorInfo": { + "Sensor": "VIRTUAL-SKIN-LSTM-MODEL" + }, "BindedCdevInfo": [ { "CdevRequest": "tpu_cooling", diff --git a/thermal/thermal_info_config_tokay.json b/thermal/thermal_info_config_tokay.json index 9f954766..0eb6ce8d 100644 --- a/thermal/thermal_info_config_tokay.json +++ b/thermal/thermal_info_config_tokay.json @@ -178,6 +178,19 @@ "Coefficient": [1.0, -1.0], "Multiplier": 1 }, + { + "Name": "VIRTUAL-SKIN-LSTM-MODEL", + "Type": "UNKNOWN", + "VirtualSensor": true, + "ModelPath": "vt_prediction_lstm_model.tflite", + "Formula": "USE_ML_MODEL", + "Combination": ["north_therm", "soc_therm", "charging_therm", "disp_therm", "battery", "quiet_therm", "usb_pwr_therm", "rfpa_therm", "btmspkr_therm"], + "PreviousSampleCount": 11, + "OutputLabelCount": 6, + "Multiplier": 0.001, + "SupportUnderSampling": true, + "ValidateInput": true + }, { "Name": "STATS-UPDATOR", "Type": "UNKNOWN", @@ -185,8 +198,8 @@ "Hidden": true, "TriggerSensor": ["north_therm", "soc_therm", "charging_therm", "disp_therm", "quiet_therm", "usb_pwr_therm", "rfpa_therm", "btmspkr_therm"], "Formula": "WEIGHTED_AVG", - "Combination": ["VIRTUAL-SKIN-MODEL", "VIRTUAL-SKIN-LEGACY", "VIRTUAL-SKIN-MODEL-LEGACY-DIFF"], - "Coefficient": [0.0, 0.0, 0.0], + "Combination": ["VIRTUAL-SKIN-MODEL", "VIRTUAL-SKIN-LEGACY", "VIRTUAL-SKIN-MODEL-LEGACY-DIFF", "VIRTUAL-SKIN-LSTM-MODEL"], + "Coefficient": [0.0, 0.0, 0.0, 0.0], "Multiplier": 1, "SendPowerHint": true, "PollingDelay": 300000, @@ -208,6 +221,9 @@ "SendCallback": true, "PollingDelay": 300000, "PassiveDelay": 7000, + "PredictorInfo": { + "Sensor": "VIRTUAL-SKIN-LSTM-MODEL" + }, "BindedCdevInfo": [ { "CdevRequest": "tpu_cooling", diff --git a/thermal/vt_prediction_lstm_model_caiman.tflite b/thermal/vt_prediction_lstm_model_caiman.tflite new file mode 100644 index 0000000000000000000000000000000000000000..14f07b5af296e15078ed73b780b6248dac91023e GIT binary patch literal 16856 zcmd6P30zIv`}dX*A!SZDLegBKq_fvLsFcVMGL=)ECQa&;ZbIA$8KMvwQz0P=q4rwG zbTeh9oAHteOe(g9B zr^R*R+Hq~Tme8icDZ@1fZ5$U3CgE+1++&2O!1Imhi{9rtc)*7G&2$h9| z`v!WudCI(`VgB+O+K3-Nepo<1<5K|yg~@}%xv( z0~s)difc9&%-`PG#%+X+vt+2mS;F0deyghfws0QeG;+Mnn6dUwBWr0?Kue}0o5R4L zXajr$-9o|w<-P$jw{TfVsBchUg-%0zfo_0a01n`(&2ggu=791Z9Cr^;05A~2ya2bl z1ARA++W*W|b0nvbA01U7Mm;iJE zA^->2pj2tsGhjpz!7YM&=GPG>CZ=^`gjudOMtZ@WKOi1Z1dh7}Fah2saBpg4V#FM5 z2ap6yJ$z&$M_&(FV5rPUG``ZtA~Pcsk&j#+Y-MabbLLDVX$6^4P>8p&eAry?xhx=91m}RE zGH;QG%safFMtqzbIH5A`J)?NdrBr8Y)DH0;K`6%2v?OH$)U74fK|QB5<%VE5~8NI1b#& zg`0BR7&uqirD3zkLZtGr5Ltceh{8f4B`}td0N+q~P)LOhtB7I5E+BV&m5IkP6EoY1 zszwS5;au-l#-uaQRr;`X%`?pG#bS`-npU*IBLdM`eYB{uxpIY0%)U$)*3an7j7N#9@CUwNfE*A3$f%OR?8xjP{2=2FfgvQzESQiFXUQj>{&ed7 zA*lIRj;uVWf_fXp2}a(O*f!InvrALNt;&<~Hk7OK6V5B)cT?6N2_H?~Xls(+OTEx& z=eg+f9zXt>mpk$A7K3HYeNjl%X2CCfFY4~1gp?LEM+VM@c%^)X~SWAIWb+?x8svvGkL99P++cj&A?90r&jqkKK+~(}kor9p1L5 zB>bu^eif8SBT|Q<(%G?Ou`m-8Q655$2b;}oTaE?Ux%hl=QJx%bj z`?bC)>be#wPrJgqb#p}D6WftxYgFl;hi&Pm2OH3eu7~&yNfY>1bh-Hc?gFcW`Qxc_ z;RjNd(vyZCS%CGQH>P<-xwPHD-Qx8L*+`x}7SHUYj@Rq;k%V-(N8TRaM?S?4!r18y zwO_pmFF)u?FCB@cqJakJV{&H{@puX9qgRZQ>~@d={H6Tz*?DM|`*Y#6WpljDC?bF5 zmA3TS@N)upQ;i&5kVRgUdZ4w-TVbyS1F5n8DCE{wN#VAjADMREeUQgXXB;JKr+9El zkKP#dkSay*70bU-I`n{yYPWw+qJ0kv=8N}Y>7FRQZ{H&%a?dbwa(;B)jilDtC#gLZ zHBKc<{1+mzX&m0zavVJu6-0J!HAMXvmhmmz)ajo14&)Syp+im5$oh6Kgde9*3VCh1 zqsby$iDg=UyzsOS61FIKhxO)k%ha|Cy@PG=vxW0fQJFn4jQk6q+r1D^_886=?MlWo z6B5y_fUW$F?z;4?iwNIpdX=2Vx7?B>N7#C zmMkQ!8ZDIWA1^jt8LUVzrZWf7)b)!--jRXS4~Pux=9xQ96dN zO;nfc*!dFAp1lo?9@2&;JP9XDvXrRXs!gve1#7=1x+(@r&^R z=Ky@aOG}FSb;g=HO%z+dO(c1JpOP!R2juUK>_wY7eMGj7i)m7xKDxFsoGeEj=zwuI z(de8#)MofbqLbE$uN6)CHEk#g{EOm#nNO+acO7~mBarH>J1V}g zcnvnZyJ&&As;{}@z zPI$Ba;JhNMtLR<|rUqV*@Sx}u*!{It{+Xioiqr3N@gVJU_+@D**>qkRr)?7Gm6lEl zzle6kqjLmquisJ<_GuV)oLo+N6y2vGZ%-lfEAh1Z*FrS-%M)~p?@aNKMR;1TIBMRq zwPL+-0bQLFO5IfxXgeQE+|#rt3R&Dm(mpB*KUUt1$FI?*C(j=vt-_P(!J9`>_Sq|V z_`6SJd#^w;AjJari&UezvFYfC?nxS_GM21)TG%hh zbkUK=#Bih<-T94>Yi%}?lEla4%uhVizl}wK$?&{8n4nR;tx==RW5_w@A!whp03Ddr zls`G-Se~=VKK}bpJj+OwFn&ccnUJy{^&FPL2gZNp1O4YxqiN%b>ZaXj|0`#z(B8?L zJ*l0WiGB(h*eR9V*!GHC*6K!Yl^rH$pBeCT^%HoBELwcUVhI^km}Bi##lzm8&8GGf z{@V5kz13Svr<6P=1IEYjhYjAM87Cg{h8u4qv&_zPq^=HGI;SbhwE2=RdD|ZU)_6_c zo|r75Tatn|NczmLn*SSrL0c=d;wt3id}8Jn||O zwvP!xM%z14m7DX$p0RC^$p>?!R9c${3ZLB}zZY8I34I3Bu@eXJ1zKOxnK4Ju$|H}g zyEeYZs~n#pH2JPdkI0PvGh7YkkdlZ8+|Ua;-9fH;ZP3Y(tQ`o`$; zK4ixgBAYKBL~?lt?n2Qtq8MEVXeLO~AKh<)%I`f}MJ^4@+Q?l+B-$RBl(oN~i7 z+;%N~m6Jl>{;`Bey$(w@+~|O?ibQFA3be45fe-S6QJ-&)W)`qt!Gn65(NbBzy7 z?JrSYunn7;CeRjYtrR^YUy<^ehSaC)OEl?zB>k|eJ({;RoqpcjSTb^&uHxIw+d}T* zUi5pKnd0HBh4^NMJD$WJpdJaAgrqxmbfn7$+PPf7Zv%#qr%M;pmk#go`;+6z$d#G= zpkrbx>GdADZ7SpKUo6gV+x#%~=%y=5hlD* zq1Fe>^KSN>LE?|8;)|VPg?lNnG}-bypLIG(=n}D-$WA9A`ERg3S|~>cGA^LoADr-M z-A`m|$H8>?EK5avxTYdiqp8sKwvi%fRW@$vWsiHGC?thT+bTX?E26Wb8%ccfd(yF6 zvn1coBRr=poqp7JBG)~~DE5rqhIB)FV~cZ$4BT^?qOw)^mdY%2S;D%St0Ko1?c+HsC@P7 z#e)7bF^`w`piyro5T)_oX|d8c^eW{A@f$yz?!LB$H+DHmRV@ZeQm(GR*I!op#s}Uv zp568%t%v<+$G6d_Rml^+i|Io$WuPzrc<3VXw(VH@_4rPd5m|UNeb`KL#-s@vV6zRy zXl3JfideE?Vpr-oeJ?SHTaIMP?)aqpQ=}7hi4eD5NH=c}T5qtGWDV&@=cFy;-zAii z)Ri`L-Y^exceXpeSYSjAQp@>A&Id@&EH#{|Tq4XinMwE-IThI)A1jU^uWp_vS9Yb7J9$q?x53BB*)6-! zhK(2n9#$m|s*{AGCmYH0m>QZ#wAY73UQHzUq;E;?^kN?LbX zKu&Hn!_Cbm(l^D2(R9}f=*yf0R6fL#@6nnPtw1yUHgGD{R4YX;Mu$xx_SZB8r>CliO)wKkt-BoM88195D`4K(`g zOSJD)S2FXE9nL5~)OK`M{_oeC)ALD6)YM#su8EnSKjo|oa=_=%iS^sjz3s)s(|0JJ zrFBvWRf|H8g0|7K-a4qY?k>{Kg`mP)ON6MDJ4kEe%KR*ix9DQqI4t*=Ky!D_Ba4-d z>EZ09q;DrTzR|dTsB1)jyysFf8J6B&knYr>W$F)w<4bJNO`|j9Ob0JK!HUE8uO;NE z+`WPxyp&`4`Vpw>Y=tm?We5E5S`O(lSc5LubUN;DM3e5c!%A)PEuty56zSqv>np<7p=0S( z_nrL2M={uM=2P+BOl4}na47w*)CR4;G87+pZAO-^HKuEp%FxEE&giOUqOeii6MYje zr4KeH<9EuZN%G)psJPzFimbjP z5@AW4?{&nz%2N4Gt_x{XaU4zb=z#6Fx}&V=w*>v;MdVD*SCSonAg@dEDtzAaF`jVE zflTe}L~SR8qS5^|h~b2%x6&7U%k<^>qkEh{_PU)(n9~C^ zc)Bv?z6j_--zP$R@O(1FVg!2BWe4h(V2pJ==H+=@vm&?429h@s6VP@vji~Lkz$+$8 z=y1;gSoTC0t^cVGshJhYpSzgei+{$qX!3*{ zan8q$cP~f1F7KtuXH0N+ul7V?Rg81)2IGT^OzDwU=ZQ+{6Xa;8h9l2pWA$}w_~h8! z{OPLQsoC3Fo0sldrts_hxsJ{ow|$ zsW*`Cv8@etbWtZ`BmYE_y#s{y`!AsVr+eT)=Mb!JsD_=XCfRUtB?tR^#yJFC*ysWIhwjR zmJE#XA&m;6iBaYp-z&iF@MrD+s@CgAQ)eu7Cty?o5^cEF>`@ z1E}~>GpxEj2gMgB2<@8RMjm_Tpii?X@#OmA;<(fN?A7T)hL#RZe^+U9_C2KTKM^%` zScwMA$sznnF}BmP!I=}6)Z*}D8=dm zIu&Y!UK=;UPd44;2mi#=+3^9HCrsmu@;;FrYc2_ zr}=HKYtq7?9FiTgS8&u=Ks!8GgGXu_qj()ns-4pkyN#KR`n|YF+$LNXcK|Ok3LIunHXrI8bbn>OfXq2}djT@RvW)7T)hp$oK z-OnE2W7qm%x726o%6 zQZ#jBfne<1gnTazq*KyAAj5HE>H8gnsBF(4XoL13JW8{KG=AwrTbn*Zg>$X2n!5*o z_wxdNqWwCuYrqR(OWZg#=$l~^uG_)9-LdNE%^oNIqD?mWxZr*M%E{nkKRNHw zb*`|vBp7|~{aL^ZmZCP7viQYEM+SRSJAE> zv(R~^SHg?fmSoSTTHiFedLJdPH5XpL=&G=oxsa$$a>K&(S7=RuJJsL(J6)}afHm|M zth8enzfX57uTa*=kKK2Zl*R7GL!6B9xFQ33!M!ut`BDQEm zA;!Jt+0ip5v#844#k}9QKEzdJ8+uqcSkm7*fxa1?N=v+tlXaK&liPl|*e9_wj*IFk z+)A{fS3Ytiw$)IaHf|M`hgp!5y5;<=tzA(o-&~^CQ5_Gr{(+wB#qf87RtwIjFCmSV zXX)0x18LFm1%lhn!89~pflS^=(Z;_z(s9Sb^Vcm^C%zr~;Mna6Sbly8j#f9OpCasV z;eAVTKk6V#uv$U8XTK+n59?#cRW8(9J%%nCBO{ahUPi+wec?akCgI_&C*hplUFq5` z7wFuRo2a5Nny#L2hTH$xfKL|PLGP}{QlqxP*jTcg+_@uB|5ZK;eB=6B~mCRpLpL^s+;)sfD?2{>kYXZ%O+ugFq51K)ci!Vbq% z=>zZfxY?D782vGo=uC4!>NzRs;=xNuZ^$XWO~wl%y}{#m+2ioBFkSqIrATrxD;4)! zaYG#0# zh2Va@4>`1?RGj0tO`K!pj2sRZ6W?>X!rR_*A!ovDn))b%PD>FHAKfIX7ydmzvs8}X zkDpIhri9X4f-=3cwiEf?bq9K~^b_GOSd!OhKDn8AUYNdqE6ypOfsB_OLfiG564&B+ z$T-Ci>t`=Vo=(FdcZ{V?x_INzMkc~H5<^BE$-)I+<-~G^g6J*$jlR=Tpw;7|$okKA z#C*g^?DT2}iatCaP1>u9hsD1Y{yM&y%iETq@QC>^4Yhi(HLolkMSqiz4TX^2~mm#`t%l#@w0`0HD z1?KRp=ybxC`&DRNwdH;lF=uVLUxmR1TkcokcgB|cMV$Ip={ps03;R1K`x|j_Ra^Dn zOIaIpTUk{*TTA`wq4T{`ezhzp?ckuagX62(+25r*j@`?Tth#6MvFr0mi(iE|f7jwy z@ow64i(iGs{_&Q-imN+YTmCA#Wd5-DRZI*WXZfqhELmgmt8h1Tviwy%f|y`Fs`ej? zgUb4hy0r%^epsIe;Q7-ZKVAb^z0wFr`!OOY)PVXTxy;k3f`-*vaa`+~3M^Ke)EZh? zJFCB;P@8iCPyk?K2SAYroH!^I;$om}D1g=P+=9XeOF#h(oC=5nT!pT9fIooMwJ`oK zkb5e}MDXW=N1v)n0pKZ(JGaKpySd2hPTZJqrZ>!Ls#VCtq7W>t9VrOO- zR?EcdpIDtr7(cTK%h$};%)iyX{&{YUhS9Qv$zWj56g#uS5|9MSTLKDT zFmpfw7$_K^3&?}X_ybe`Tfl&pfKM=3E+7J62`GmLjRIl-!vHFP0tmVo00xx9By$0B zfC=C=OfU-&3@`yahXC9G@C1ke6bv5)umrpVgJuGp0j$=L)ftKaEdQ{4(+hA86pR5_ z14=+KT|g%2H3|Tvoa-z0404T_Eg6{3x`0oxpUj@Ov2v+g<`w2YN*W^fl|!Ya%yWp; z-`~mv`k3vQtynCi*OSBS$Yfz?*N1bcY(|(2N;akbZf3?FVNh8X;1(hacMA++g@L}2 zQYIU^0>b?3$o*bVF3VvqfFx)iR$s1{zf>-lF)?Fgp+3@J*`PYZRuqhSLRDLcuX`9| z^;$YNmMZFu8xDKB&{Sg=mK&1*ZJ<34&i_rYCo7$V0Y*sWBf|Xu>pZH-$H@G{ewlc% zuQXKR=~*#v<^$#nBiJ8hm(~6>ha2Xr0+@FXILp2Kjlu$bJ$*xD9?az6k4jZMWN!YU z@&INC_S{wb6+)CNhW$TiX$0Y1@hq|U=mg`iTwKQvOn{rYailCHC=`-;b$l=x-C%F3 zzKkjVO$H?IpJlWttE(HEE7L6%$PIx^4Hli3&K^a6N7J9{73 zvD;Y4m$FD13#@9}vw8Vd_>XJE-g^uzM&VEr!9STGrwyDzCAkk2R|kg5rGauYmNF}z zXBM9s_4t`Ca8&R=ZWx9~YWxa=!>}7)~_EZ#odVxJCdr zzE?fo?$9OzaM1pD-A!4Ftl>?m$IEhn2w>eXFIyVa@ZPD%%hvHCKt#j5HL=X*tO3{@LD>>hZJMb`juR!~7L-{4@Xhdi*ShGJbPtZ@^}Mi?`x>{A|6& z_~i}r|1I7$KiAd2Qx$(s!~AvPjpf}*_4wJhfC%ueVg5St#`xFQ<7eL{%m?Ps4$I?u zd1zowtTNu~^>|tSW4yr)@>B-!qJ_ zq(Qy`HGK2y@v(0q#-|1Cf7i2r4d0P^eCkzv&JFUJ*YK6q<72VJ##`DTU%wjLFddCx z-xE$XILRi+!O6CR^J_LAw>4>%0^G`P-r1I~@!G{A_J(3wtSWs<8`O53w=s{V&ImdV2oHF*53n z!R#`W0oqyOYDkaz>lj!wG$`K#_`P6122M5ae)b%}p~Ti+J75fE?>b}Deh>+;#vb5n`M^^pyG^{N=rdP^i>k77;z;)t=MA# zsyg2e&M-F1b#>(b{OtgJY>w5>t!u?TQLWz0pKvI#guDf0vG;r(Ss|5Qf3<5)dj&(1NL9wR1-s$zN@t5bC}cL*0%NiUi-~cW6SEjs*Yeu=KIQ{S(Wc=$6`K( zLy7szrD`9jj-9L4yo{(iPMK`B3&y@%4R66Udlum^fb#Dj z>^%X81}v+8^sT(^%YNg?au1Wt@*I0-veT&Hjg^^}9Jh7K0++BI8EU~0k__yv@wZcmF4eXYO|EES&6S<(iXGY`;n#!EuMMe2?&DVR%RX&`8sZ9)G3*D0 zb!1eq!as&)ChVw7&pIpH>xh|Jb2qz|{y$76G|1!MG8GRWX^1!b9rVA%G_XSz{BN0y zJKInT`R)IIyvzvmmC64tRtXDrcMF~w@^6_=h*z-m-!d0>c|d6J^#50;sYp0eE0c}( z2=)_dSm?m7ts#}w<{j-|w$U6a4G8v^g}McWc*;Vc-}I-Prd`?T<{JpX9u8Zg0ii%) z0eP=tfY~i(j~d=csa@m$oS-W*H~bUbs09A62Y*Y~qlP!BShO^P_YMNG-zALUe*ieL B3J(AP literal 0 HcmV?d00001 diff --git a/thermal/vt_prediction_lstm_model_komodo.tflite b/thermal/vt_prediction_lstm_model_komodo.tflite new file mode 100644 index 0000000000000000000000000000000000000000..8a8e26110a487334677d4e739a7e52ac85f11847 GIT binary patch literal 16856 zcmd6P2|QNK`}ZLUB@wOCohTt9MdHlJ(k2O&O6kTe%9i^kEz+uu(4vL3@3cMIIWtO< zr(LDAm-e2gO{?%;V~xk}_v`<@pZ9%#^L)O|IWyOF&0Nd5&YUs#qs?)ghm&((O-{sV za~(KMt_{};+LSm2xaOdZ(lZ9mdwjH8?T(2*|nG)kZ)(~-?#z%R7H zfg#@E5h1d`V2O96BwQL88d9Z`gC6Jx&;xJ)KV6P<1y}%ncH_85fP8?l2<8R2*A?h> zI4%{8^0O1id36Lfz}pTSmkF2yP-xF_aatUw35HJ90J=6n2MT4Wf-S+IB`rBF9UueP z08*8KrUlR_0*wO4Edm4poB@3R1^^MD1E3AyHW=efpR+j1gwJ`WVrJyC6U!;5In!9-t5KHivsNlRhTQ!Gi&I zVPf9^iO4z7R}vzXn25$y+gN07(nk~^lZ9EEn$DOp!$e#~W)d1c#WbjzRBGxx)ZWp> z-LW^2ns6eJ6&4sJ3F<8ikc0<|gL+G6^p;7)!FWn&=#(IdiEn5ykW|GGm=(OuBD6ZL z*%g~Tn=eeWCf@7gf%RDdOaZRp62CxSnN$SBh#~{SWf9^ak#t&Mh)5<04iiBg>>!yU z@|6Th10$p+oI3D~8S3US+RnMR`|zPIA`c*gHZ~5p9EwKO6UN4Pee{YI_(s9J~r36DWRWu-Bo55NN8|Gyz4 z2>8MPGC&kyUyTfAM`n*&ocX2wS9OXTwO2x6{U3js%jm}`!r6i!g5A?0d~$PVWPR9A zC@8n$m2OCR`Ql@|>cLiMaI5n|kH^(ENQ6OKJ!+5JRvahF*An>)YLUoez2NJ$cjMhhRv$^3j`GPa-K;1W%` z_dQAOblOeh=O&WvyY^G3mJ9e^a@usjxk6$ay%l+c#uJs;WhAMv3vV#!7~jmMh%XD> zgv@4_@LLVE(cl0VQuyyL-r;I`1s2`a+*2JrAcvF$o7s8zFGD`Fh9}`uQqVS_YWqa zmvjLx(<>p-iZ98*(@s<_;xoGcY>@EN^9A|x;1v;f_NPg=6tS}+mxE`VM!B!$Xd9h_ zMCYCwQF@-ii|_TqPiQ&aF?&BL{mYmRbqYqd?Yp9aNn=T*V>hyG&3vMphNYvn6&t=ARDrqKl7yCH&(4* z@KJAa(3Iy#v#;OSL6+W4BuAEqk^5z%$%nP;P_sM9w$~gkp%0H7$h$v^NW}G061P8? z#^_oJxlfG98dWvHN$<05;l(8MBjg?Lw%w5Kcg~?Zb047l-yiV0Y7Thz_x3s6g0GV! zP9pN=Vlpi^Iz`;qSfix=$|U|u34g3y4+}SU@F%WMLZ6Wi7Ike$?_C`$h|XLl*N44E zF*!4_+6?)e)`m{RXm%$0`wy)gmo!EEti^Hqtt=8H5ywM zCQ!>OI`mn$smNPigkS%?hNxwn#Dzz_aRU7-o({$Y8L3p|14&ijM9PM@MGkT$EP6u_Y%$~JqF5R&2D1Q0yJiZ&Yj{bO7 z?;HJ{4*0aqFg#lRDhXeti=zj|VuuN7bbV|l3I6CrOLdj#&%@gE#_UrzH^#og^>K~f8p&>QmE zDJlKZe?Pr-F%=t~FF`uSd&uolL;U_!5{bILf$Er52sGLUd$;V2d%oo8JzX6Vu6LK$ ziS3<}V84_OX){z9y;)AM?6S?4i#8eo^fk_RgJ?dX-ElK2OZ2uO~~po+aJ4C6mmd4~2U} zmhxFi8D#RMc|<2k0xc!2q)Z~a0 z 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 literal 0 HcmV?d00001 diff --git a/thermal/vt_prediction_lstm_model_tokay.tflite b/thermal/vt_prediction_lstm_model_tokay.tflite new file mode 100644 index 0000000000000000000000000000000000000000..100d94e541aa9f5bb6650f93099b54857b36d139 GIT binary patch literal 16736 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