From ae55cd42f228aaa41729fd7dc234416e9ffbb8b2 Mon Sep 17 00:00:00 2001 From: Zihang Xu <1099498275@qq.com> Date: Sat, 10 May 2025 21:43:17 -0500 Subject: [PATCH] README Update --- README.md | 253 ++++++++++++++++++++++++++----- multi_agents_pipeline/Agents.jpg | Bin 0 -> 51041 bytes multi_agents_pipeline/Readme.md | 46 +++--- 3 files changed, 238 insertions(+), 61 deletions(-) create mode 100644 multi_agents_pipeline/Agents.jpg diff --git a/README.md b/README.md index 5cbbf74..059bdc9 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,245 @@ -# Understanding Different Design Choices in Training Large Time Series Models - +# LTSM-Bundle: A Toolbox and Benchmark on Large Language Models for Time Series Forecasting + +
+LTSM Model +
[![Test](https://github.com/daochenzha/ltsm/actions/workflows/test.yml/badge.svg)](https://github.com/daochenzha/ltsm/actions/workflows/test.yml) -This work investigates the transition from traditional Time Series Forecasting (TSF) to Large Time Series Models (LTSMs), leveraging universal transformer-based models. Training LTSMs on diverse time series data introduces challenges due to varying frequencies, dimensions, and patterns. We explore various design choices for LTSMs, including pre-processing, model configurations, and dataset setups. We introduce **Time Series Prompt**, a statistical prompting strategy, and $\texttt{LTSM-bundle}$, which encapsulates the most effective design practices identified. $\texttt{LTSM-bundle}$ is developed by [Data Lab at Rice University](https://cs.rice.edu/~xh37/). +> Empowering forecasts with precision and efficiency. + +## Table of Contents + +* [Overview](#overview) +* [Why LTSM-bundle](#why-ltsm-bundle) +* [Features](#features) +* [Installation](#installation) +* [Quick Start](#quick-start) +* [Project Structure](#project-structure) +* [Datasets and Prompts](#datasets-and-prompts) +* [Model Access](#model-access) +* [Cite This Work](#cite-this-work) +* [License](#license) +* [Acknowledgments](#acknowledgments) + +--- -## Resources -:star2: Please star our repo to follow the latest updates on LTSM-bundle! +## Overview -:mega: We have released our [paper](https://arxiv.org/abs/2406.14045) and source code of LTSM-bundle-v1.0! +This work investigates the transition from traditional Time Series Forecasting (TSF) to Large Time Series Models (LTSMs), leveraging large transformer-based models like GPT. Training LTSMs on diverse time series data introduces challenges due to varying frequencies, dimensions, and patterns. -:books: Follow our latest [English Tutorial](https://github.com/daochenzha/ltsm/tree/main/tutorial) or [中文教程](https://zhuanlan.zhihu.com/p/708804309) to costomize your LTSM! +We explore multiple design choices, including pre-processing strategies, tokenization, model architectures, and dataset setups. We introduce: -:earth_americas: For more information, please visit: -* Paper: [https://arxiv.org/abs/2406.14045](https://arxiv.org/abs/2406.14045) -* Blog: [Time Series Are Not That Different for LLMs](https://towardsdatascience.com/time-series-are-not-that-different-for-llms-56435dc7d2b1) -* Tutorial: [Build your own LTSM-bundle](https://github.com/daochenzha/ltsm/tree/main/tutorial) -* Chinese Tutorial: [https://zhuanlan.zhihu.com/p/708804309](https://zhuanlan.zhihu.com/p/708804309) -* Do you want to learn more about data pipeline search? Please check out our [data-centric AI survey](https://arxiv.org/abs/2303.10158) and [data-centric AI resources](https://github.com/daochenzha/data-centric-AI) ! +* **Time Series Prompt**: A statistical prompting strategy +* **LTSM-bundle**: A toolkit encapsulating effective design practices + +The project is developed by the [Data Lab at Rice University](https://cs.rice.edu/~xh37/). + +--- ## Why LTSM-bundle? -The LTSM-bundle package leverages the HuggingFace transformers toolkit, offering flexibility to switch between different advanced language models as the backbone. It is easy to tailor the general LTSMs to their specific time series forecasting needs by selecting the most suitable language model from a wide array of options. The flexibility enhances the adaptability of the package across different industries and data types, ensuring optimal performance in diverse scenarios. + +The LTSM-bundle leverages HuggingFace transformers, allowing flexible integration of large-scale pre-trained language models for time series tasks. Users can customize the pipeline to fit specific forecasting needs with minimal overhead, making it adaptable across various domains and industries. + +Key highlights: + +* Plug-and-play with GPT-style backbones +* Modular pipeline for easy experimentation +* Support for statistical and text prompts + +--- + +## Features + +| Category | Highlights | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| ⚙️ Architecture | Modular design, GPT-style transformers for time series | +| 📝 Prompting | Time Series Prompt & Text Prompt support | +| ⚡️ Performance | GPU acceleration, optimized pipelines | +| 🔧 Integrations | LoRA support, JSON/CSV-based dataset and prompt interfaces | +| 🔬 Testing | Unit and integration tests, GitHub Actions CI | +| 📊 Data | Built-in data loaders, scalers, and tokenizers | +| 📂 Documentation | Tutorials in [English](https://github.com/daochenzha/ltsm/tree/main/tutorial) and [Chinese](https://zhuanlan.zhihu.com/p/708804309) | + +--- ## Installation -``` + +We recommend using Conda: + +```bash conda create -n ltsm python=3.8.0 conda activate ltsm -git clone git@github.com:daochenzha/ltsm.git -cd ltsm -pip3 install -e . -pip3 install -r requirements.txt ``` -## Quick Exploration on LTSM-bundle +Then install the package: -Training on **[Time Series Prompt]** and **[Linear Tokenization]** ```bash -bash scripts/train_ltsm_csv.sh +git clone https://github.com/datamllab/ltsm.git +cd ltsm +pip install -e . +pip install -r requirements.txt ``` -Training on **[Text Prompt]** and **[Linear Tokenization]** -```bash -bash scripts/train_ltsm_textprompt_csv.sh +--- + +## 🔧 Training Examples + +```Python ``` -Training on **[Time Series Prompt]** and **[Time Series Tokenization]** -```bash -bash scripts/train_ltsm_tokenizer_csv.sh + +## 🔍 Inference Examples + +```Python +import os +import torch +import pandas as pd +from huggingface_hub import hf_hub_download +from safetensors.torch import load_file +from ltsm.models import LTSMConfig, ltsm_model + +# Download model config and weights from Hugging Face +config_path = hf_hub_download("LSC2204/LTSM-bundle", "config.json") +weights_path = hf_hub_download("LSC2204/LTSM-bundle", "model.safetensors") + +# Load model and weights +model_config = LTSMConfig() +model_config.load(config_path) +model = ltsm_model.LTSM(model_config) + +state_dict = load_file(weights_path) +model.load_state_dict(state_dict) + +# Move model to device +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") +model = model.to(device).eval() + +# Load your dataset (e.g., weather) +df_weather = pd.read_csv("/path/to/dataset.csv") +print("Loaded data shape:", df_weather.shape) + +# Load prompts per feature +feature_prompts = {} +prompt_dir = "/path/to/prompts/" +for feature, filename in { + "T (degC)": "weather_T (degC)_prompt.pth.tar", + "rain (mm)": "weather_rain (mm)_prompt.pth.tar" +}.items(): + prompt_tensor = torch.load(os.path.join(prompt_dir, filename)) + feature_prompts[feature] = prompt_tensor.squeeze(0).float().to(device) + +# Predict (custom code here depending on your model usage) +# For example: +with torch.no_grad(): + inputs = feature_prompts["T (degC)"].unsqueeze(0) + preds = model(inputs) + print("Prediction output shape:", preds.shape) +``` + +--- + +## Project Structure + +```text +└── ltsm-package/ + ├── datasets + │ └── README.md + ├── imgs + │ ├── ltsm_model.png + │ ├── prompt_csv_tsne.png + │ └── stat_prompt.png + ├── ltsm + │   ├── common # Base classes + │   ├── data_pipeline # Model lifecycle management and training pipeline + │   ├── data_provider # Dataset construction + │   ├── data_reader # Read input data from various formats (CSV, JSON, etc.) + │   ├── evaluate_pipeline # Evaluation workflow for model performance + │   ├── layers # Custom neural network components + │   ├── models # Implementations: LTSM, DLinear, Informer, PatchTST + │   ├── prompt_reader # Prompt generation and formatting + │   ├── sk_interface # Scikit-learn style interface + │   └── utils # Shared helper functions + ├── multi_agents_pipeline # Multi-agent time series reasoning framework + │   ├── Readme.md + │   ├── agents # Agent definitions: Planner, QA, TS, Reward + │   ├── llm-server.py # Local LLM server interface + │   ├── ltsm_inference.py # Inference script using LTSM pipeline + │   ├── main.py # Pipeline entry point + │   └── model_config.yaml # Configuration file for models and agents + ├── requirements.txt + ├── setup.py + ├── tests # Unit tests for LTSM modules + │   ├── common + │   ├── data_pipeline + │   ├── data_provider + │   ├── data_reader + │   ├── evaluate_pipeline + │   ├── models + │   └── test_scripts + └── tutorial + └── README.md ``` -## Datasets and Time Series Prompts -Download the datasets +--- + +## Datasets and Prompts + +Download datasets: + ```bash cd datasets -download: https://drive.google.com/drive/folders/1hLFbz0FRxdiDCzgFYtKCOPJYSBVvwW9P +# Google Drive link: +https://drive.google.com/drive/folders/1hLFbz0FRxdiDCzgFYtKCOPJYSBVvwW9P ``` -Download the time series prompts +Download time series prompts: + ```bash -cd prompt_bank/propmt_data_csv -download: https://drive.google.com/drive/folders/1hLFbz0FRxdiDCzgFYtKCOPJYSBVvwW9P +cd prompt_bank/prompt_data_csv +# Same Google Drive link applies ``` +--- + +## Model Access + +You can find our trained LTSM models on Hugging Face: + +➡️ [https://huggingface.co/LSC2204/LTSM-bundle](https://huggingface.co/LSC2204/LTSM-bundle) + +--- + ## Cite This Work -If you find this work useful, you may cite this work: -``` -@article{ltsm-bundle, - title={Understanding Different Design Choices in Training Large Time Series Models}, - author={Chuang*, Yu-Neng and Li*, Songchen and Yuan*, Jiayi and Wang*, Guanchu and Lai*, Kwei-Herng and Yu, Leisheng and Ding, Sirui and Chang, Chia-Yuan and Tan, Qiaoyu and Zha, Daochen and Hu, Xia}, - journal={arXiv preprint arXiv:2406.14045}, - year={2024} + +If you find this work useful, please cite: + +```bibtex +@misc{chuang2025ltsmbundletoolboxbenchmarklarge, + title={LTSM-Bundle: A Toolbox and Benchmark on Large Language Models for Time Series Forecasting}, + author={Yu-Neng Chuang and Songchen Li and Jiayi Yuan and Guanchu Wang and Kwei-Herng Lai and Songyuan Sui and Leisheng Yu and Sirui Ding and Chia-Yuan Chang and Qiaoyu Tan and Daochen Zha and Xia Hu}, + year={2025}, + eprint={2406.14045}, + archivePrefix={arXiv}, + primaryClass={cs.LG}, + url={https://arxiv.org/abs/2406.14045}, } ``` + +--- + +## License + +This project is licensed under the MIT License. See the [LICENSE](https://choosealicense.com/licenses/mit/) file for details. + +--- + +## Acknowledgments + +We thank all contributors and collaborators involved in the LTSM project. Special thanks to the Data Lab at Rice University and the open-source community for enabling fast prototyping and reproducible research. + +--- + +
+ ⬆️ Back to Top +
diff --git a/multi_agents_pipeline/Agents.jpg b/multi_agents_pipeline/Agents.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4016b8174df293dac826cf76104fceb0a34100d9 GIT binary patch literal 51041 zcmeFZ1yo$!mM&U&2o?zLL4pNBaF-A~c+f(U;1Jv`g#-u$2@oJaa1SnpySr=Q?(SB+ zog>|U{&Tu-pMLkfJMI`=j0J3J*Is+>wdR`N{N}f~pSoWJJ(81>l>#9kfMa_!Oj6loX`od~QWFva4G0kz z0SOo3z70eL+$RdcUtXZUy$}$QkWo<49-u$O08W5D0wE$GAt53op`aim17~{y?}LzW zQShF;5J!Ei@(zv04xhs(BJ~07%aUdS)!{=r&iD4d=nn~rh)GE4pE58qF>`VA@bd8s zNW7Ail9rK`Q+uPXp{b>Ev;?s9i3g>JtL!I;}erp)3BxGmDRQNjm@p?qvMm)v-69~ ztLtBOA%KwnY8LSQuZI1}E?mGaL}X+nWVBy)At1T{4G9++<;e?FJaHAYcXp3yID8)9 zzl=yNX-22zR6QhkZ$JEykdAAK{^*x!f3fVpW|;4P%d&qn?BDHzfiRH}fWbq;1&M+# zt{Kz3AO27KpJ(ttbKrmG!2isF|9j>@+gPDB+Zj@pPTvrn8RfdsO%wT^q;OC(-8pfm zZfH$Y*@ouCpq;bd;f;{=bv)<`9CwfWD3X^Jkpufd*C}-{Xz(8N$wlHGl){sE5Ax21<3m~mQ}01TWQzBorZ@MX zhofoUoWJ)?^~Zk8H&ZYN|Jb+mEo}|e9YXoREsD}%!Go+|CszC*ngC`wcIrpA(qp7v zAd^3L@%!b?WVw`gPmEs8HxoG^RELWRD?vqm-2&zCQSb0o#8Cc)MsRRI zGn&s(mms3csOvMfQhXuI5|qd=4jvfS>H$aCR9&fri`5g~Bz;U|Nk6i={W2hI&FXVa zvXU>*QXW4{qHblT0&gE_+$1r*2Yn>EW&Gm-^BKXQv!U~Ub^^Yh|FrZCksL5I#>sb= z28Zc?JjfeUaV9dR+SOx$`@}#lmLM(RfB3yfMRH2-8>Gas=o(e~9<<;OjHBppNA;3K z@BWwFBO`jze}aLD&yOeC!=o8bJ0(R{j=Gj>Ey=o|7{qLg483tkh3+BeBFoheXAfg< zzjO(+v58%yuNDS#*hpC^Dr{N}OA=J)s7T_2{!cXxl;m4~=-~CO(j7xUqbW`BI*R4aeHDtnBd2KPx#$Yu9|QXd}sO<$D08@q0aYY<})2o5OpM zeCbemKU>d%G8EnyBWuN$7VWv&8}p3gO)i=nF>Mwj5{vSYR0Vx~WogVby}_f_td}G0 z)fx;z#E}Rj)Fr~wnc@yVFKZB%U8TxQI>kTh(si_1SNG|gbdVLNybTFclz#0n1iPeq z4GlM|s*ecEh))nI4KRs&!zSA)5fZWO+O%AxuvE*G3^s8)$#0{nZpHcbpbzq#oSgD% z-J73mkYwBCx~(F{es-$U${aa=;`-HOhpe%}<$G^`ysj~$>d26psey< zEnq}EK6>h}exO=H-Kc%Hyz8vILbG#?3RoC4Tb!#>mAcw@LN+^|x?1lmqo{~d{}{rc zCldhiG$fpnJ147ZOEivh>;gh+BoG|J~)`pi0o|VIp1QL;jZmUK=K_RvGf*I%1TR+cW&FRd25%ab^TOA`(W&oQ*dd;WZaSWtRHh6_$206RD2VE<1 z>;L3UJ|+ZK@13K2&}otdXdx|_5%gbgMrD%7CbAhaLr$h|LAMGZL)S{UpcLpLTdQWN##$y9z~`?8v}1QG|*IDD3`yv#qmJ-lr> z6?5rWY+4MCpBLSE&H|zMiUluusffVL*%>E$&O*7_0c*VDG?p3F#GYS>^1%UkXfA$a zc8~F=2CO5_wb{yvOm^xNcOYMB)nd;v!T(pR^53*DLT>%3M(!&DfRNE!E9S# zDm!&_8Om{#wg{z0byJ6-abqVg&1trlZo&$(!pTP@tsHEevS;REj82TTC20E=UZB`czxxr%hy;N@ z_IfIBsm(fayzUVbfj2_t%*i5UM{UeEQ~nj(Zp^74W5tT;^pY)2zMDR2X-{>Sb!PD7 zE8eDBiE>7yYo~kLm{pw~g!|LQgbUXDdAImh*#@wiA$?$U!^@pIl)1!weqn4Dj>#6C z3{vEZ$p%XKa)GwV_w$0s3^LQGox$&WT>P46rQA}m_Q0J%HdYx*?+jfSYsVVe?Z{?$ z;|Pc3+2+}AF`bZ&#*;5!KXY8IvYe^j|FT`G)$$ca(X-_8z*|+`k($@uLj!N~BZC57 zhxXg*x|m)tc*a98q0Mb%>WN+`lc08K+nEr#(fD^E?w^IZR)SyzQr8$S@$m0;Vna1~ zPVgggrxdKNTgwcd1UENcSV8=Nv9G0hit!Jbsi{;0=Vs4Nd!@Y%vOP+XAQ9T5i$tI;WS$Rn z^UCp58Z)jdk(a=Z!Ze|eGdAiglsc|MbfY#p@|*V-{F&}{4|-yS18=0d2g$DIjZ2*X z_<-u}qbNM8UySTjMG}Pn=cX=yc|eJ9&XQ9wrzkIr^Zh~RYir`dj|=J(f&OpDSL4y+ z*ZB-^VHK?7pJ&@p>6_5_h_}Qj^a#GBT5v1~t=zmERIXIcH1W1Fwze;<=G%NAF%CC(d)6`At z|DHq8<>#b6JxY ziQA0mk!pP;v75WFZJFu%J|f*Tlq5~?YeZr;vXQ&3%&i%czY<34QaIB0j~aC`>*M?M z6f=Y2KD(lA7rA*h?TyFJEAKpKAe)yvc-49PAr||98zQ{w|eahcMwhk(nlUW>+W2nLIN2F9F`2+$&-YmbFOL7q~xGBl(wW zf*IG}IlJu!?6kUEMyVe^r!NT*jLR%`ORr|CR$pPBJ^?M}?nJc9rn}0Wnz>Uf5^m+p zOn*1=h2y*+A*o#S7S}*)tR`4cQ6K2+bI?d4sS2=q>Q?l`?ZbXn^*3oyDE8$vVhROl zR$%q$^_VA%oy%SE;k-0?Wo*oaZEQ$s`YYO|cM)G-dzDPo1T#6X*OCx@f1<>f8*4VN z{7&{Dt+ z)q+jyesgO#ji9CEN1I8{T)w=PuRcAP-!+Am=60bd6{(6Oa=g%w&UD?7Z%p2G@m1hd zCg+AOPC4unWa=rH^tu;*?JdXkd7_Ar1x~)pP&uM@RmifJm<;B z8fHuyPjDLen@*)ys1(sA3eD$*iepx_Ee_?=7s5*PFrQqDzV`UxVd5=N!-RmD`px%2 z7i~Q&2w%hI^YhG6E{vHe9=GB)ZI_Uco8ZCXiFB=f>+H$=qJqV6wu*^0ZCN2oin65d zopeKJl9EPLk6_Z|9m`}1ZfOrZgJ|zo4g}TAkT)2@>fM*WT?ULBdL7PYw)B*EeM>pP zVDItq^ZSZEVAp(_f@Q(-O$lEY3d1SwGPIK1^Nb)mu%*UE3f z>!+77&C9Nt@HL3)k^#;&53p1~VRS|Fo4ylwx=7RCPB= zt2n~9-&ULXQDypBr{l9rY5BV#>Qf}4s1PqRB<_;MZy88;|Hg%ovigAHp%*jzjoyT{{3dvNR=W#TH zw`jc|KAMEa--GUuP8V)*qV7Qip{*yJ!B!VFA{^)|rBn zxs{hCeZgFvCgCxrkZOwYyG`-MF;eS@tj&paERGgf520W%xUIz3O9m-QzRUo~t3M{( zgM5x5NAWzC04~QFg&c|~!8yfgdQ=|jZ9kUe7yXUXry_TQfIo&*N zxO{>U&LHY0eZ#+sJGDbP^4>{s?OsC(24BZ)huL`3!Z(-U6OWbsW@~Y`;cqW-hp*? z!?Tp~%5Zd(5sBQKbRih~&RJu$e6(w{AbG>?9;85ZjWaZMDL z57NCE|7+%iMAoiSoXk}z4eqyVKRI)WScAC$l548w9&~$S-grsEa1SB{h!$XW zBwO*`gOKR%K`ZLvrOAfRO=%u7Lw5BbaIf-(TTH+KLRId*026+&;@2#SgdF`8{&s^_ z7J)(_dd}8(4-$ddz)@uZxA@6_TJJnRubnib$U;g)tuJDW3fYLJ?D6uO?lLAIjJ3(% zzSe6$>E9(I!<0dB1ZHI@$Z>I!4L27U9Ms&AY4Ol1hK-Q?$hC9&~jM zOkEBoIJb0Z^4oKJ>a=WlJK%U5GrwH1Tl8|A>Q4qvD;0b26HNQ&noxr{WcR>ug3$EC zwGvzD_z^_}_--U;_^`j}%%%SN+SvA}#41vhl}#ko^!LSxUC`i1zQPO;DyWG7%E-6f zZ{A+e63kc-ikQ1Cpchc|!Rib{tB_`w!Xez&-EW_H4IiPc(w{pSrzExomdcJ4m93w6 zlys>!b9%uooE)|ou=c@I(wHaQ)fH9cdvb;Pov4!g&UXD;Xkq$?iHn#c-IsH!l9(cm zI-sJTI&9F?S)En^${OFC_x=oPQd4aRw<5VWfm609BV~Xb{XNk^#3zeLVin} zD<+-BJJ;6Rekbl;El9WAI6!)IP_0|${?{X%uPuiqmCg}cV(MO)sd?e*GK&oAm6339 zdiK}^-w1ajKE?HJLAH5zL^fD-U;{{e{*ogJ)||IV_uPKX>3FOh~bquK!i++oW1u3v9mJ* zl;A&W%!S$aAnJs{>qUUlLC;gyRJ#X#RoJ+*h1?+zp=$byuF8)velFc5t_((XGIkI7`GZ*Aa ze&hG!V?&dg;Zf#(DD%u^k-UdcVxEUJM$`4RX%rn7{NiE)j7R=ExCD|4{QpW?wBn4x}iQxUCdYj z-c#+AZ`RWKpOlgRX{z++)aifovHb+qu__dDeH3^Vzik;)d=H9@&I5)rM6_>G?LQ#< zHJ;|>_Y+JPk52GZsbf7WMO1y{ZYy#^^*W4SxD@N@Ttua$y(CnFUtkTE{3-w>s?~jG zb`J{5zC$Z&JQxSob<*5*siYQDu%x}g5f=a=&Mxk*D}gBS2GTYP_nTa}*k1S*8~Orw zpE{Lm(gSE*=^DoXvXBP>*5_LV(M@45pdL_g54s#D?-Kqr5OWP5Re*Zr&3s<;5vcuv z1Ft?W)ZM-YLSp~Jr$9(-9MUMCMtIBf(rmOBw26gkQ71f>DQ2R$yw^I=R6 zh};;`8zdzChI>$>1`y0F!i*?eObWj&6$nbq(J_wdb@x>|Bp!Eptc5G36a=p}E}H`> z-p;|znGF!4a(=fkJr1onZemzB_V?SR`rTd!>hs3}FqSB7=x6N9Gt(d8i!}ip+3-ts zno6!j6(>F_M-#HoV56a^#OxBZDq(TBG)=sD1hakEI>3Fs_Wm>d`LibZ*4IXK#}7b^ zPYcxbl;GmL$!E;~FncUUqW|C?6!9F0riDmX@eBDl$dIns3}B=YZu@P9{*JLwX#m4;WSNg%#!Sr1_JZf2(7FKr!Wj1Vp@C>Z8%Wh4A0>AAdl0(4 zuA9~B7gUAI6_@YWoIAlS4PnbnMfyFX>Sg0P(q{fSrWJ{0$7QCB94~75gw2rh>g)ZK z%02R8XYdT^5M}8WL1=W5Vu(L=cI=egD1ad1>>!8!Nw)(OMgHTF%m9CL^LftM3^*ZC z04?Cfv-3$@UE*&meN#=*$QL^y7l=P+6`oe+nCGD+&c4tYJP*pM@=xo){l3Q*co5=1|8I!cX6#Jbg;5u4MVIYFq}n5H|Udgu(>I z*yqLV9PDh!_9N$fyIu@^CI0wHlf=#@2eu`Unb@8=-oLgUi!XO1rKc}W#$p@@THQ#h zF9X*|=2RS^7IzGFjB?r2HE0k__9{yq=rtW(4x#RG&(XX*=161gHsM1|)c5jmg`JJ+ z4!FQrBCODFYQ>xE1xt2zUxZzaB=V|EKjzQLD=QG8AA0i@HXr|B8*2m-%5X~uL%T!c zTDZjszqO14A$YS3=UQfOL*{QWKbEXIK@OwLs7}cN?87E{lwpH+>Gdto()}IsTR$f% z(E|H&l{3+Uj|gYsv>2TlaEbtw>chS9pZbb&ub&;@DtAaf`9^tb`(lB6@KUscSA?+s zMR$#rh}7LK^#EE65KD|29DAR=Yq5-q(Fuoet|L| zedwr`W4unjXarq%MgURr_xHjtWy^7{u>nL%M0GjIBuS+PzgVQwIu-;gXeu_+X&b<1 zBf1~;6@_<=*PP^9Er0jz4OEME;xiUW2@@~OYjyuIIZ-+@$8(dX@o+H2Em%suWZMmG zmb9Y)O-XM!gPG|sl{uf3zgOkd#P;K7O5h+pj)Rm@RH&YysD6AH`iq zh$3a|Wxv=&t9=+esst@jrS?}3f3^|pu-)gzFgt|Y_{X70|D)C1^!Nx=e;i0)HT}~= zla&NX18&FzL}BrM0CXd+0IRI%($gW)P5xi_R~NFPsv?H_pFX3pZ_3EO&4>T|Cd{RS z$`Nh3>v=`bE~qX?H@Df%5O+D-?eKb$bDvoa5Bniq21i!c=1FA7j+Kw$4)}SNP`Au7 zZf7{og@uk$eF)y9ju-smx)D?x_IW0S1! z?m_e{ngBIV42dhu`sWIVmHe=ahPY~%`YKE>=dLc%qj99e!j7sr(L24#JBS`+^NQKD zq#oyUr6j(Fsg{avQJ5210)`cZ)tN*V{X|C0$*gzsGZTLFn?;|V;0`_e^G@v>tk|G{ zTFe+C&YqcftY%#)>DD0#zKZPTQ?Yc3;Sy=pmN<`fvB+c$c4zKX;a&n{x&5V5Db^~H z+S8hJ8*Ah@YJ;J>`V>qB&usSB#%W^Y&EAJfeB8}3w(3KSsIBfqON!ILHgX)(WcRdt z`;684V`~nH^>fP3-8{TFRVPfj;<@mpZFKT5KRRjA;H9dPD5f0qN{z|$^U;>!juEDa zQL~$Nxnk>-4U$eSE&hn{Vcmkk@Mn9Wr^(at-(upuTEX*r8Rly(P2NhZG30(td=wTF zsmoK(Y@SnpQEaRST+?AvOcS3ZihST7&B&z=ekvvnl%WJTbR{ zaUNTK$e2?o*<5L7aReldEhD+cRLT!T3qbOc4$h=WP&xtszU2Y4-6X9(p2M2D{4Wu{ zT0T)>9m#1sMDZa*l`yWEE;?1C8(IPnhY;_k5{4uJq@*!~po(VI`a3ReRI!b**Zl>$Qu>Q16p$n%g%Ag>-$(D^O?dUMnP{zjt@q`A6i zC)|x%l)nYwe+2Vsghv=z)wtn6bZlsm9CH_rAyioT_5^k2G;KTdzk)MN ze8^9)YBXR57jQ^m3gRO;hgXJQT%F5g zW304QGP|k9*aGD7Q$VbtZ8bPWt+)*bAW6}AQt~}WbYkJ+4AK$4CoBqw6f_=e1996J z(t^8Gbd3c5D1G}YK>c6(p%PE=6$RebEi1afJ(a#S@a}$ox6h9i?&r5pC`ke5A<Rxzls7|k!bK41x%{S$BpQVhtLJP9`s@}pLImrP)2)LzO%Hk9&On~ zw)=z}O>K%aUv8G7A)TCzv4e4!NYI}l5S>qIMA&P6F^FmV+7G+$=L1{Uji^q!vZbPj z+d68O4tq41<`owu3Tu_f-87{Hl;71(3wo*WwYDi~8-{7LCEHWFBfO`d@*F&L=vM8) zp-`|gLPV8P5?5T!DH!f(T?!TFCUcwVnTkJ!`CMHcCp}fUTnogv_((j)c1EG$T2~OO zxHOY26at?`uv=4QE6!7}eKzSb(mKTxMdc8Jg$pU<{3b}_W% zZjtueRY$*inG-_2ZE*L7gQMEydkdOIUd5Uo%Rk z#KQ8~-+Uf>WT_v_gkS#fw+NM)0Sw=&B@}R9vT(qC?Pdomn+Aa7t3Z(&_>S~+My|?t zP|e@kGnZ{6Mr$p^sIv-_oN|RggOygfYJB&gC`u`4PyR*B7;hZUn?h`{mXjYw$0&~Y z%BVag>HRr#ZY5p8BCU2-0fX~VCOAV@+y<(Lw-?1i=FjB7@-c0uqHYz7cOp8QW+~Y2 zCz502+qSUY53Fb0h#IlZm*FwA?^7^&d(ug0(IzTaLL~8|s$s$SrbB8uDTqI}A;;)- zK+cB)Ox<|sZ{Z4L>`DuNRnGvg!dVC83qrp|tN(C?LUD@;2Ur|=oa=Mor#QhDbX`aE z*5{e%4ovh8SFES>KHFH&!&#Ak^{R^WW6C*)E^D1;@Mpt_-rbe;xk}MCF*I`1ko6y|_600c zLk8I9;%6E>P4^%R5L+_?HoNrF*y+9nna#tk^U0Xl0Qv6yXD6$&!o3YmZ*rB(g z3o{EA5rV<;&Kf=E9`X#+PHuQiVR$0v_RR^_ZZK@7=R#l<=-ymDsngxgbeg;%n1Ri5^8SQOLM!3^ z+z#&>11zPN0VMV*58y*mu-;F_o&$r|ILOY%}fXfR7R9yNhikOqP{|S&EQbG{gK}N7`7lFc( zEL}Zw7gCP|!Q{CCDWyR)Ai91hs8)CSE%LrW*l5H>sY{|gEa#2ktvoNB)Hg1OvpV=Z z7KVhmcrp=hIDA@!Lzed($6y*AD#)i#wnZ;xxWTAN#lJ`-d}!zUpb)5Qyds*X9zIjE zRo-fFrkzga>=UbZ=y;KIx(AUW-TTCo<$x3Ggfg<ej9!6qa5%YdY`E4+hFY73cBm zx!7^e4Kq_`MCc@Y|lMNeI4{7++OMv^(cNJ(>a zyvbWC$5pGqZ$mlHPlD1GPD?#6j{NhJkR#p6NIBQ@hxefO^Dy0n1)&*pcJuGY75li6 z5@&n^?jNCSl}ppySTASPN1d=LDyPLWVn^F_Q}zB~~NnB85fgH!xLsJ#UF+u_B5qByP<${QO01s6;Ut2MUTi5^zg*2o)G$A zP=}@?%-GE~;dUXVE^bgGkx3jq4`LM(HEbXQ@AON6t4l+=IlaBP+9G8bEWTeNT}lZ| z)WJE%00y!`dtn+3F@xz%w{;L1;z#JpJQCRWD&5EK&~vt42311eu0WG2ABB?Wi|%dI z1-~huwIUdCwz^%4by#7r(RHGMZXCXftq_Q)ACFhixYnZQjcCGs&t7ci+aY@;-c22; zxY7?2Uom*JO*jFk8U27L$y)Jga?7sXkLlUAUDzk&E|IFj1PRORp?saw4(r#PF7?SP+r88i=&w(%@P|ZZ|Kqc*(lc&I|ZUI-ms9`3u%z{R`G1NG`M}0rVgH*}P0v7_yZ& zZP-NHifAi3_>-aZFC%Gcl2QXC5ly2jl9!)jZjnk=dfB`S<#4X9k0eRVieRu=FqT8; zSe$d6Vv1kc#G7($(Q}q}$lw1q%@ulcz|c#n6t!T!A?P}=JDD%Qk}9p-(~6AyRnkEx z_S43g{yx=S-uKg+VhykjEAh|hhuvfm-&D~Q?V>_V68mNa$<=$L?Fzc$Tg}qug*m3C z3yW&a!c7N;?NRsUWUc}Ti_BoUq#e+uOKx9ozSx&BVy2r@>Pb^PBuo4QLqD=N2w$Je_~2gE z(lK?|z&2A0xkyL1+Pru>%D!Wcs`RbY5xkjpVN%!{lL zSa!cSsz|z{F>3GzmG>r^$}0%qrC|iEfJ?z>U1)4*)lF1E1@TPWPVcg<6jgUxUTAHT zT4$!wX7=YV$~>)(Xl-iB%b8Wgc`4lP@Z3S@Bjsp0i|pymmp5bYf|>A4PFB@_P-M}h z(Gzt7L>EtF1V`@V}HypFxfgE$`skaby~d1s2*DhlrOF$s>D;G z7;oEe(EM)Syn?h2WY0ojRRuf3cpl(AtELc17vvY>uQYf+faY zgY8(_JMBkJI5+b3;qVZG{$NNgPx=vsI=+g&`2;Y*{vzdjZy|cjxwUY%;Q*k5W{sbP z1vdpQ@>SNj>G3n7dpsRf*U!d({?iKJFEWo=6cbR+=BEEDGErTFvgUO&6Msx{kkiTN z-Yh!i39yz;o9TFE_~D6Lk$(^#7ZdIAe*Slk^?Ye|6R|7r5sBwTAYnQckB?9`?sOzgUKSN*qMxFFV>K#_>x z?^mA~tuxJ>pY@7d?anrEq204ruPnPeT ze1#h-$xTKwkeB2miLXxb529|<9U|wUtxCIIJACUQ5rSDnSK+*uRXD*lR5Rs#XEITo z+Ps5dSv)&eSgPw+FXrZoRqLW_`3{U>Jr5&jYeR}Z5>8jA^c!l96 zZ}J3ywF}&vW4~(42>wN-5;=vLCC3$J zDQjQwPQPPaeuC#{N3|W_SC>s>z!qWCeilbJV!l=*lvI>8Le7v(W`#;liJ2qSvmEw- z+KRYqON?AGHm8@qA(p-&k9%&fRW6pDgx5+e%%SqqxmY~u>L8wOys^BzKxF!PU(wT0 z&e?o>U`1FQopG57SeSKx#Rld@OJ)O+4O?fmgX9av+?DJ%Z>{pT8BpUw!Io6f;3G|-()epKFNtA5u=dCqBq z+Q|AnC=RFUwcVw!@aA>D{?cyhRL2oHEIZ)Ya!q{+G?Iz#xY>6r3>$spMYx2PhCX}E zn04gDpk$=m>}^gIAT)BW0c1ykSUFRQ7uW6M@SGmcTobF34u>RsQ>4n3ks2IKSB=(I zLVfkpt5|GNFWc62hdVSVm3H2&@HatXTeBpZ7-Y9+rtQY+<=;C>F=VaS{=r}8L`~>`#a&gSP;1D-vwKR6Tu>7 znpGZ*&U}}ioOy~f)}~OX;yS81m~tjsOyp8jZu?n&%IF>~v_c_*deM|FDI;n&s+;?L z@PHG&Xizk9&Mpuh#Kr%n)k7wVu{D6zLtFMkkA@a~`H?BxD8=)WOLm;ojg(9QSySEq zP=oM!9->zhmE2sKH+uyzZvQ49l=`D2($YB?)bhJ5k_<5M8f~lbl8WITL{b1_M8Yru zWCdb(K;;W*6%Z0|eE^=;zl$a-0ev28{2zsv!@r9c|66x(bvP=0*Z51d`Rf)t0%fYJ ztHQig%@W_gJ(_um6GQCyOzD}lHRvE@xx(yUP!r`sa%Q%M^7^#ODyCLKU4%k6(;H6@ zG-0XJ`I*Nx%g4E%|lcJkM z!0uQ;GH}`d4_81%CcIvyq_3S2>CEPZQOkH1RaDKCpAAM2uIV)X@9z${VTJdi@p@0E zzc~?JWF{P9k%mu{f8fUOl0u?G@zI#3v*xL@+H3`)*4Y?=WaF@>#5*BRuY72E3WN|h zL)ELJgX)m>KiGlrHz=bv=9q`2v(PohN>deH?9@#qG4_#Q5Yob#x0x&&$Zc{gEst^A zO*ITYcz(5B15C8&FCAZunP*(TC?(5&|ADS$<1<(mzB4*eW5y7$P7pu;Cgv%LW~d+1 zDNT&l`>LR{c&Nh z`Jm&=Kv|BN@T-rb$6MhVig{-RcbrGF@`d@ zI^Jm1nRRP^t&;JfklMvl8p1u$@RWC8EehP%CuE}i=CA9dM*GvqBXqjZnlX|%l5vcg z`r%K(hdr5!dH_eN7fN+03pKb#o(52g2Oz@)D#zoH&Bvwyl-c_wzYHY^uZT!4kMID> z(wcA|9>^u-0wAdT{X^-JlrZrB{`~>jR(?P)bXMjS4Iw|A%2#z_;1yC|C zx}ZX1O%MFe@tB}Sh(B|CNoufBxJAn)nJA@q3dP(0S?)VP2RVUKBfR7H2)a7 zB%)w-%rN$*3xbhL>uqp7;`F-xajL8Kpa$b^oXCc?rG*oJCD*5`N^UctemV4)Vs(be z!_4pADMpd50G1RH9{#X?!<`>#q4{a)ZK(l!)EW6lZILmAF?9urH^n0s>`iBcZfHahdF#4vSCpf7!!YX0jzPgqg1*> zD5ghau!M3E;^9K4r^w;uGD10T?v#%CvXU__1NE-zBnr#fdBLoLtGbl!;RdOL6SZ8g zLJ4ryRiqGenh+DkNCcz<9IddV&%HjW@ZE!AGOPhek0=DEVA1)Pc31u@J2C(9+a#D&1Xsod&zHwXb`)!jX^rxb#c;Q?qeW8UK@&Elr9Zs9AziLOU24aJ{NqVB zT=04ltj}#_2MEa?oVq9FX3goyH9QCBeb*rR+L0=?jOeQ^j)sgBf4WE2R%236S288s z%O%F?HsSD+-3v3g`WB%5A$XP-lyu{c1yrv}s}=a#D8XOWKbJ%xg)oLTBwFh3*qO(_ z=GCW5YL$!b*3hUyWw*B_m|}Bn-qOvdB!o_QdM)RDIUA!@m`Ho-yKhF&8OeD;jM_|j znMWF8>*~=_V|=&E%VDm(Wo2q38goJUDz#bgGiFn%H!o$a3?MriQ!3mdtWeR{wTMyC z>B&rw+sCK%=8*fbcr-{r4yPX~FscaiGF1xNkJg{lUqgsidRZ;xHx&lmfa!F(iI`|4w5~(?kp=tyjTXxyQq|aedPgc^i^Yy z9-HOUtf9lB@NslXQ}%933>Mo5wANBm3Lng$+hJ!edi37WO(9vjeK4$q+L0>`QpH9$ zzu12W#u}vqK>n7~ANRUx{tVr?^)DB_zJ=T|#C!8@{!g$A-RlD`XY(@-!jF%T4G2G{Dd~r*htHnm>J;5p zZ=-D>4I5ES25&%>f+pjg8*Pwbx)n#S5^PvAsjCbJ)B|-fad)D2&5%le{hJ6NCK>Q7 zT#E>_r_O!~0aDyI2`1x%MlIG^P`nJ9v|G>2qYiH*!^TlEnTZ}CHLnP>o zOWQwGjxp`4Z!mNH*;zxvJK??AB)z%^MiGaK_)d!sV!imPNM9dpnwve+SoqYqYG81E z1xN*kk2UBGhMnYv$y!j);Z6bg)zzzK41-bLg2@*10lO118!D1+PJ!(hGkea@;BD?8~RNhAeMFk+U}%FbC6_vluQRAPq2n)$iy zOcuK{8-|yX+T}O^oS0|Y+>KXDI&J8VNysdUp|R%to%1u{o!oi4ou76OqNK{cZ{ra= zR}&WCA&eLE8oKCPK9;Q>C)tAueubq5t2v-YYTDnB1xg%eQCSPPWBQ3v`m3`+imKGPTPklO=|z^b}nlm_@+!IRk z6o)wj5rWlwH8$RC;FSi>lN!pbiJ=cT*oX*n4)>&wArh(cXAnMu)q+XhCbi6iO<0kn zGBNOEiC6eHMD@)O+yDRAeb6nSa%ln$c&nj?h+0MLq&Q z>L+Mp;^Lr-5D1W#LeZl9ggd60U>3DqvOUitPlY+N9YJBD+s_J<^jniWUd-j&bU2WV ziCxBebZOdB0c+U;{?&o+_3~Chsw^TdjX=IfbCUskkz(9R7D$*Qfi4JBi7qUc6tS<* z7DORi#G24HPhSh4Y$&#RQy)4zab7X3-8M1uIl=ry_x9>Nwp{c~M7#O?oTUh@(&KW{ zjCdnb$B(a^(-@~@I#41)GJW{2&OsMUoALw-Y}4p z7Vnp&3l_goi80{=xyK*pc*=XFnib1ht+7`gCWe%-bg)KlBl=KJ}C1fNsa!n>j$}TX(nz7#D1m@Z-zzhS6l=Y?8+x- zREE+j9C8IK{|rDT*r4-^YFe(x^M3fRZ`vk^%{4#p_-Q^u3_cb@x)cRLBj@dNtn zU&7*Ttr03SAGA-{XZ1^$(J3I^gRDQ+A7RiW=fz(+X^_cl>y0?g0GcjMk!-RP*#p9NE zWS;kK%SwAJ32r9G=WRvbqr3vfRd6X|dV+C%1YZsPrPZ-1d+-2>1T>yi9Xtrp5_co_D%W!Bp>YDZI7jffq z=yIX|4|{JF6xY}7i#CuT!3plc-Q5GhLy+L^*0^i11cF;|5AIIm?oKzB#v6w;!6nH5 z_V?YoRrl1s_hCPreRiEXPpekfs$Sh=%{AwkWBg=5ox!e7veFs8-4bTr7Aaz(-bLw1 zq&WXZv=t#TnM){ETONJGN!99rCG^%|j^$e^FTDx-x8zUg6ULM%Cu&x5o)Wi)!D+4Y zoe&qn*zu_i({2YI;|C>h=y1dY%6$WS*HVxqBV^R;t}&d)proy%>8%_+@9cA7CGJY@ zRlZ{||4>`HA-}_lD%Ir_{fuZf;~ISzu~l;+nFP)%;X?|07NuP2d~=Sva3dq=b}5&g zD1NUg$88VoJw03g_O_jix{4Wr!}6_AFBgP!_~(pQg-Z%?S|&qI$?HgUGAM$!aIMrb zh0a;r7C8zPp>w+!PG-?I_do}j;{`4zIylo${&9UPQMo@p9h&j!%jXkOiNI{pk!gPQ zgiR_bbU3=uNrZ*oI`7RNT}SaiKTcXD&Y}cT4GXJy*{VcyG3~UhcRB(EC=S{1=$=Kp zo*%6<{Yu@x6-nQUJSd3F@&(Tr{YQ2=tBWS2m-@(1xA^tV&-I$~wml|Gd2ek^6DCAz z^B2yu zVTU}xGou%Mq5iCnG0i2Nz48@Ex6!!sz1x$=5e|+U|7n7!mg5&3u(wf19TN$!;It+C zkG2lKlpR1n0b3FUN@6*cNbO%16nqKBVva9Hh7ZY9q5`AJq)GE!Zsl94bB5u#uk9}w z!P8uSq!t{PomPC+*%`2x2vaX3PDDj0FHDFCks@#-uD`?l4ibQ+DdYOex0Ttl=aIH= zltm>P59`%cRJqX{d_1~G>bXjJ1e=t7y{-f_g>}@1;d7KXB9zO|gh)SnsUhGMMG$^p zMhTHng#Uxjs1@1GgZ@peA%dx1u^BRMB!|G1A^JXG|Ee2}7J8lKpZPS|;4%LzMa9hc z_Rm|6=@U1!J_1Pd|JlY@6m08(WbLKbx$ip2JK98{)f}3i?Cuyxte~-wIxm(qRp1n6 z9QQUlf}J(Ne)gB8YY#;L&DEUYVO@UQXw`|DJfWWG_y4b({*URZo}>f}ud2#ATds{I zHE$V z1f^VhhXMfvJS;mt|_U$_$Q6|NDr_Tvgf)ogP2A3$tv01FEJ3x1FEOMs*FJzx7j z02rdL_TS)(YI!c`jHi3RffJ>lZ*)Dd9mmM!$;Zgq=;GKa`cdZJc>m|c<#aIN6zYq) zl1oi3q2@{@#bL)CN+M5=h+!XvD5<0;KTpj)ks=~Ef@q5VzfYI<32VMtBN!Tkj3pr+ zSN{M|-y+J-ULpU(sdtAw@%#Ul7ilyuv^)z=LD$&E6|mw|JE(IqQxiw)7vy>WL*w$l zB6I&g_xS$@s{U^j8+_xIV<5kgLdrTDZ;Wto)l34Ch{&tEfjad8l7K~MeKfpvYW&QF zv))PvFP!eX0DkWJ9f{WLN)v(^CliG8sJLP=6G}o$@gfQ&u1vFHc zrRtW(`SBGElxcm_iQ4zqz~!CqT32qc;|PH0umDexJALe$T;^~>H4b_0hR%SemzshNaGKjSC|e>?UuY4JSFme{(!f4sVBJ^J2dH|vW|Rlr zj(o_MCaL^cms)IMs$LCM_QbONkT|tENh&JI+kVMEephWubw0D1Ts;=(E`WoY=un;( zmwGj9+_)DE>9*?me7+LF?PXMpY;b0tS@E-G})!4U!3YO5f^3lBRSzwy;Z*a=|jpb71zTxW`#hW?6K2smqSuAJFol$ z(kyt0?3s5)YHlE-4O*MFX56o}W!$}(iM3ZUL06R^b-u~J7Q^{O7Kj_+MMb*aZwqNf z=h}16t7)7&z!RBuA6pJ3t9+6Rq`+3xiIC~)TBx!0qrPC0F9IbIB?;sJoo#eh^n=PErVr*@6FY;c|Ks+=-XgYwQZ2 z(`{RGY!vC$xA?*Pwg|=((+#>X_nHCt+!f$kv<04KUQgJ91sGz+!e{f(z%Lo18#wWY~)&m6mE{x|jUw0*2Jb%b9S$+tcwHb|KtEv8a?FE{kuH<4pOvZ*VeI@1Jau$kRZw>_e z@J=vFPnuUxNESwWi5t5@yMKB6rpOp4KUo7XsN78$>%&|)TkGF$=Co&1DPYhwB%(dj z%siBBj9n;4j9F;cOHrSYh^cM-+<->q$h3gN#2Xl*Gn>60%iYET0C4Xa%Qcw=msZsV zICke=jTOgU5|MU5iVTh6?%D`>uBm9ViREN4-6R#=8A55$J6-tA0@W`wm}VC}rCqqE ziF)+)dl)y)#_<>bu>Cg+Qy`xS{D`74H!?+{*>yiX(+kuZ7YR9`Jfdm`Uqeqh%h|EJ zHNNczs*G|coKJp$<}$zErl!Y@n+|-dYmQOQKW5x1zvVc18{mJ^XbM*}%@h&DP8??L zY;0Mwov*8H0mdc+Z^yDQ6uI{!SwvUOFuS(OM5_YOLhD*K6jlAN=P-@N$}d-ZbTMyZ zf0DfUwD-I)H?5N5AwsKb_SMV8bC?t5poHcQmx-X(SIA zIha0OHt@0PEZ?JTRI%@_HTNmr~$zk@1es%-@YJt38C zI=s9ESGfJ0QLGoNgE?yoPw0RYk95B znzL40M>@u4QwWew!-cVKsyoke>JeHbRrcgxF&W$i`1LoNpYv@P@V2-&+!T!|BVwY4 zI&n&Yb&iI&&5Q^pY68ngp?BRSN_XbzP9#?CmonQ(GDOxFIF)F_CaRwTm2JRqugtUX zp-7LBk}0;Zj_6fF?zX_i^e_DFVjGb;RY#rwhnKHBVni zmIZO~wl8(<3NEB4LP>0MW;3=M$e}&wU+@7Ag=d@f<;FTS`X4@X6w+Lo|c+Yy22INaL;x zajFfMTw0bus+?@Qn(gf#F^x&lq<|E#=#C=k4MXT_&tez@uyjfyTYjP^>a!Y`s)&su zlOCW_Z(Iv!XNCHH#OR_RvR>l7R2m0{jjyW%L%dYpm+1y$7Y(8udlx-4KqY1N2;_yv zkvLoi?2t@wb$Nf@H#e$;u@^+*-LZ5sz)!oLwjDy2DMLu(y ziO~{$2$0fWhr<(G)tgfX6fSs6+px&NC2$lOFEF~k&e1r&=_SL%KDv#lxsjb=tJdAK z?HVk$R+n}s;I`Wu*}}nOX9~lP3g8PLll`5FR*&~VojH=AzC6W#~k3znY@M> z2G>4Mq!o)@O81p)z}UrRZT)dR@BH3^sq)Y8*@Lr_0d*41;tympFZX(uy}MLLi`~kM zw~d~jrH*_;1>E24dLpJgNWNUOUi=E(UDW&R`*X$}K{GTmu);GmSU2jVJY!NoXl|K1 zNoUqsN=NY<_$8WjH+07fY$$%rhhi$u{S|0xuw5HNSK>?6o|MoD5b5v$t%${6nt<{|xGbM*`(r(%KG4ns22s>k*@LxuBC3K8A+C^~$*_0YN zWP2apV(J^pQR1ApY&z&@bdZtGA=jOD3KjXoIMH+=du?dy{<`*OnAi*BguGfv50RTl z+w-VFn@(X*1psrqE^?XXyP@{1Xtq%tu zU|To6cH2ZxXSsKQWnpRg#x6=fnw4p<`u-3nn$wg|(8Q*zQsCqgkAmL#R-X&Sh zD1qW>7vfp#aAhc0n`daWS~h^m*_|Wzo)txe)~*-*m2X|_C^_fccL{#?@?TSgdYlY= z!w@^$qkUz7$RV1o$W0;EV*#mY?9^1S_|OUoyqu2Wit?z}s0r;7B7I7VjBzANdC+E& zzcRc@8FMgu;sctOo?C_o|gsZ_nEQep1VtzAifPiH{2P z6B2tEB8NG;HsE5M|83pX3F>OM$D43>eyRJMU=o~YHrmcfGaQh5--hi7J5xA+0r^Yi z+2KofeIEtHy#EJag5??P(Ymm9Z+oY7?~N!A9Ha&mIIAjzvsb>?(R12A=Z_<1z*$9Z z^2Yr}O^sOJoS^o9z4Ov*Unw~Y;^Pr8OoZ3zdroK;R2E`mtB+nnRjVZvqC6`M9LS8; zGWX@7J19**^Np*L)IW7wU#Mk_DHs%jz}MwH9YB_PJH?I!qHoq@^6Ojvv$!Y;qV$5J zr+;(*lKWMwwk=(+1;)QOG;lhjONFEQzteGT=6-6`qXmR~Jro^fH|eD@_HWCMaWKRw zmgsbDZ5`=tM*YL2l!}xb4$^SbLlIXLKx&fsk}*><_VZX+_{!0zX?-|S{=4FSQ+3VP z>j4J$dXIsN0cfwaKv6OB`b;`CPuTlpqPV~=Td-4Uz8Bs{Ow@Nap z2KG?1lxL%tD}RlCM@wX}MZ1S59xFF-MeZ+~w1YXZlrGr`~aj4YkK#Q1=jef)D$ z0JXNeadnXJBK4M;QmQ-zqTLjZURz^joq(F4;PPpqi}v|9N!I}w} z8T?h3z>(z-n+iGUIBs6~zD2wHoN4QiP3C3SZlfLaQgFRMm-w+=l1rZP$8e~EP7>>b zK2>eYVYw;0)vy$S)VpPg<1+2$ROL=csb=0o=2#?EJ9>ypDRAc>0HJ#Az0aXeC-`Ni zSm5h(!St4gA<1{qR~ER_QpWk^`G7*qeC|c=k+bMR2auYbd-b}QB(#E)kayJN){fr2 zACTmpyKGzO9Jrm+!>-x7?9IML5qsoR&*^%|AI|7pO~<>h&r6AeK1b9Cb4GTy;c%(p zN{8q`${*!R&T=4(DorBej0VbRXp*>&`)A$ayTPAL8he(`ynbCz1+Kb$%5vogkRc%r zWe)U<1V@R||H1hI*dhf&TTJOXy1-{l#MESw?D4Ybb0pMO$Vb6GvSedjZ?5TmT{zT^ zv!tf!uY%T}x_I+`U5^QlITT>GI9POaUT|fVp9Hk-PlMjhF1Vn0QdN}1!F8Z$;BV)V z2w>!!trvWz#dploHjkf-q^-6fgoZ2xpSAUYS4Gi(xo#dp!!>*iNNv^R@i!R z3Z2=KZVNl}8%-Uy+;d)mp zS{2zt9P7CXaDJv>q>xT)5u-46()=*D>T@EWTza8VW9q0j{pFBP(Mz5a9kgM%GM&Dx z7N%^L2CAQ=aA2Pe28Jk{Pj{++H@sIxF^Xq{4(N(}4G~a#$Jr>OgXY(dNHVCU$+jFf z>CPh@(wnfkbz0lAt&`LAiCEAj)hANtuL>Oh03#q0WYrGzg9!Z5j}!-F7)8>4zu$ok zLlMd!KsU<3oZ;`5e*kdYW*RuXlid{!jV(6Fb{F)=Gp~KF*B*K4e{xld&^ym?OLpPR zTfC88≪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 literal 0 HcmV?d00001 diff --git a/multi_agents_pipeline/Readme.md b/multi_agents_pipeline/Readme.md index 29051c9..7b05e07 100644 --- a/multi_agents_pipeline/Readme.md +++ b/multi_agents_pipeline/Readme.md @@ -1,9 +1,10 @@ # Quick Command - The command `CUDA_VISIBLE_DEVICES=1,2,3 uvicorn llm-server:app --port --reload` should be run in the `multi_agents_pipeline` directory. e.g. `CUDA_VISIBLE_DEVICES=1,2,3 uvicorn llm-server:app --reload` will run the FastAPI app on http://127.0.0.1:8000/. -`lsof -i :8000` can be used to check the running local LLM. + ## Run the local LLM Server + The command `CUDA_VISIBLE_DEVICES=1,2,3 uvicorn llm-server:app --port --reload` should be run in the `multi_agents_pipeline` directory. e.g. `CUDA_VISIBLE_DEVICES=2,3,4 uvicorn llm-server:app` will run the FastAPI app on http://127.0.0.1:8000/. +## Run the Pipeline To execute the full pipeline, go to the `multi_agents_pipeline` folder and run `python main.py`. > To use LLama-3-8B-Instruct, please check transformers >= 4.40! @@ -30,43 +31,48 @@ class TSMessage(BaseModel): filepath: str # TO DO : Sopport more possible types task_type:Optional[str] = None description: Optional[str] = None + +class TSTaskMessage(BaseModel): + """ + passed to Planner + + This message contains a text prompt and the filepath to the data file. + """ + description: str + filepath: str ``` +| **Agent** | **Publishes** | **Subscribes** | +|------------------|--------------------------------------------------------|--------------------------------------------------------| +| **Planner** | `Planner-QA` (`TextMessage`)
`Planner-TS` (`TSMessage`) | `TSTaskMessage` | +| **TS Agent** | `TS-Info` (`TSMessage`) | `Planner-TS` (`TSMessage`)
`Reward-TS` (`TSMessage`) | +| **QA Agent** | `QA-Response` (`TextMessage`) | `Planner-QA` (`TextMessage`)
`TS-Info` (`TSMessage`)
`Reward-QA` (`TextMessage`) | +| **Reward Agent** | `Reward-QA` (`TextMessage`)
`Reward-TS` (`TSMessage`) | `TS-Info` (`TSMessage`)
`QA-Response` (`TextMessage`) | -! To Discuss ! : Planner publishes messages with topic "Planner-QA"(`TextMessage`), "Planner-TS"(`TSMessage`) -TS Agent publishes messages with topic "TS-Info"(`TSMessage`), subscribes "Planner-TS"(`TSMessage`) and "Reward-TS"(`TSMessage`), -QA Agent publishes messages with topic "QA-Response"(`TextMessage`), subscribes ""Planner-QA"(`TextMessage`)", "TS-Info"(`TSMessage`) and "Reward-QA"(`TextMessage`), +# Agents -Reward Agent publishes messages with topic "Reward-QA"(`TextMessage`), , "Reward-TS"(`TSMessage`), and subscribes "TS-Info"(`TSMessage`), "QA-Response"(`TextMessage`). +![](./Agents.jpg) -# Agents +## Planner + +Receive TSTaskMessage from user. Then generate TS Task and QA Task to be sent tox TS Agent and QA Agent. ## TS Agent -Handle TSMessage, use LTSM to inference +Handle TSMessage, use Time Series Models(e.g., LTSM) or Chat Models(e.g., ChatGPT) to extract features from time series. ## QA Agent -Combine TS Info and Planner-QA, get the response of LLM +Combine TS Info and Planner-QA, get the response of LLM, and provide ## Reward Agent -gather output of TS Agent and QA Agent - - -# Question: -1. context buffer size : decided by the reward agent? +Gather output of TS Agent and QA Agent. Send Feedback to TS and QA if the evaluation score is lower than a threshold. -2. should reward give signal to planner to handle the next query? -3. dataset selection (Task selection) : forecasting ? classification ? Answer: Time Reasoning -TODO List (April 7, 2025) -- performance of the framework -- remove TS, test the performance of -- use different TS models based on the task