From 2fdd9756ea1cbb23f9bd8f9c9015c928e4f210dd Mon Sep 17 00:00:00 2001 From: Martin Molinero Date: Wed, 4 Dec 2024 15:52:16 -0300 Subject: [PATCH] Foundation update --- .github/workflows/virtual-environments.yml | 6 +- DockerfileLeanFoundation | 348 +++++++++++---------- DockerfileLeanFoundationARM | 240 +++++++------- Research/QuantConnect.Research.csproj | 5 +- Tests/Python/PythonPackagesTests.cs | 296 ++++++++++++++++-- 5 files changed, 584 insertions(+), 311 deletions(-) diff --git a/.github/workflows/virtual-environments.yml b/.github/workflows/virtual-environments.yml index 33b5ed2fdeae..c840aefd9b4e 100644 --- a/.github/workflows/virtual-environments.yml +++ b/.github/workflows/virtual-environments.yml @@ -48,10 +48,10 @@ jobs: dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.TensorflowProbabilityTest" --blame-hang-timeout 120seconds --blame-crash && \ # Run Hvplot Python Package Test dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.HvplotTest" --blame-hang-timeout 120seconds --blame-crash && \ - # Run Keras Python Package Test - dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.KerasTest" --blame-hang-timeout 120seconds --blame-crash && \ # Run Transformers dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.Transformers" --blame-hang-timeout 120seconds --blame-crash && \ dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.XTransformers" --blame-hang-timeout 120seconds --blame-crash && \ # Run Shap - dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.ShapTest" --blame-hang-timeout 120seconds --blame-crash \ No newline at end of file + dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.ShapTest|KerasTest|PyvinecopulibTest" --blame-hang-timeout 120seconds --blame-crash && \ + dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.Mlforecast" --blame-hang-timeout 120seconds --blame-crash && \ + dotnet test ./Tests/bin/Release/QuantConnect.Tests.dll --filter "FullyQualifiedName=QuantConnect.Tests.Python.PythonPackagesTests.MlxtendTest|Thinc" --blame-hang-timeout 120seconds --blame-crash diff --git a/DockerfileLeanFoundation b/DockerfileLeanFoundation index fe49100a104a..adc007d75163 100644 --- a/DockerfileLeanFoundation +++ b/DockerfileLeanFoundation @@ -21,24 +21,26 @@ RUN apt-get update && apt-get -y install wget curl unzip \ && apt-get clean && apt-get autoclean && apt-get autoremove --purge -y \ && rm -rf /var/lib/apt/lists/* -# Install dotnet 6 sdk & runtime -RUN apt-get update && apt-get install -y dotnet-sdk-6.0 && \ +# Install dotnet sdk & runtime +RUN add-apt-repository ppa:dotnet/backports && apt-get update && apt-get install -y dotnet-sdk-9.0 && \ apt-get clean && apt-get autoclean && apt-get autoremove --purge -y && rm -rf /var/lib/apt/lists/* # Set PythonDLL variable for PythonNet ENV PYTHONNET_PYDLL="/opt/miniconda3/lib/libpython3.11.so" # Install miniconda -ENV CONDA="Miniconda3-py311_24.1.2-0-Linux-x86_64.sh" +ENV CONDA="Miniconda3-py311_24.9.2-0-Linux-x86_64.sh" ENV PATH="/opt/miniconda3/bin:${PATH}" RUN wget -q https://cdn.quantconnect.com/miniconda/${CONDA} && \ - bash ${CONDA} -b -p /opt/miniconda3 && rm -rf ${CONDA} && conda config --set solver classic + bash ${CONDA} -b -p /opt/miniconda3 && rm -rf ${CONDA} && \ + conda config --set solver classic && \ + conda config --set auto_update_conda false # Install java runtime for h2o lib -RUN wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.deb \ - && dpkg -i jdk-17_linux-x64_bin.deb \ - && update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17-oracle-x64/bin/java 1 \ - && rm jdk-17_linux-x64_bin.deb +RUN wget https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-x64_bin.deb \ + && dpkg -i jdk-17.0.12_linux-x64_bin.deb \ + && update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17.0.12-oracle-x64/bin/java 1 \ + && rm jdk-17.0.12_linux-x64_bin.deb # Avoid pip install read timeouts ENV PIP_DEFAULT_TIMEOUT=120 @@ -50,137 +52,140 @@ RUN pip install --no-cache-dir \ scipy==1.11.4 \ numpy==1.26.4 \ wrapt==1.16.0 \ - astropy==6.0.0 \ + astropy==7.0.0 \ beautifulsoup4==4.12.3 \ dill==0.3.8 \ - jsonschema==4.21.1 \ - lxml==5.1.0 \ - msgpack==1.0.8 \ - numba==0.59.0 \ - xarray==2024.2.0 \ - plotly==5.20.0 \ - jupyterlab==4.1.5 \ - tensorflow==2.16.1 \ - docutils==0.20.1 \ + jsonschema==4.23.0 \ + lxml==5.3.0 \ + msgpack==1.1.0 \ + numba==0.59.1 \ + xarray==2024.11.0 \ + plotly==5.24.1 \ + jupyterlab==4.3.2 \ + ipywidgets==8.1.5 \ + jupyterlab-widgets==3.0.13 \ + tensorflow==2.18.0 \ + docutils==0.21.2 \ cvxopt==1.3.2 \ - gensim==4.3.2 \ - keras==3.3.3 \ - lightgbm==4.3.0 \ - nltk==3.8.1 \ - graphviz==0.20.1 \ - cmdstanpy==1.2.1 \ + gensim==4.3.3 \ + keras==3.7.0 \ + lightgbm==4.5.0 \ + nltk==3.9.1 \ + graphviz==0.20.3 \ + cmdstanpy==1.2.4 \ copulae==0.7.9 \ - featuretools==1.30.0 \ - PuLP==2.8.0 \ - pymc==5.10.4 \ + featuretools==1.31.0 \ + PuLP==2.9.0 \ + pymc==5.19.0 \ rauth==0.7.3 \ scikit-learn==1.4.2 \ - scikit-optimize==0.10.0 \ - aesara==2.9.3 \ + scikit-optimize==0.10.2 \ + aesara==2.9.4 \ tsfresh==0.20.2 \ tslearn==0.6.3 \ tweepy==4.14.0 \ - PyWavelets==1.5.0 \ - umap-learn==0.5.5 \ - fastai==2.7.14 \ - arch==6.3.0 \ - copulas==0.10.1 \ + PyWavelets==1.7.0 \ + umap-learn==0.5.7 \ + fastai==2.7.18 \ + arch==7.2.0 \ + copulas==0.12.0 \ creme==0.6.1 \ cufflinks==0.17.3 \ gym==0.26.2 \ - ipywidgets==8.1.2 \ deap==1.4.1 \ pykalman==0.9.7 \ - cvxpy==1.4.2 \ - pyportfolioopt==1.5.5 \ + cvxpy==1.6.0 \ + pyportfolioopt==1.5.6 \ pmdarima==2.0.4 \ - pyro-ppl==1.9.0 \ - riskparityportfolio==0.5.1 \ + pyro-ppl==1.9.1 \ + riskparityportfolio==0.6.0 \ sklearn-json==0.1.0 \ - statsmodels==0.14.1 \ - QuantLib==1.33 \ - xgboost==2.0.3 \ - dtw-python==1.3.1 \ - gluonts==0.14.4 \ + statsmodels==0.14.4 \ + QuantLib==1.36 \ + xgboost==2.1.3 \ + dtw-python==1.5.3 \ + gluonts==0.16.0 \ gplearn==0.4.2 \ - jax==0.4.25 \ - jaxlib==0.4.25 \ + jax==0.4.35 \ + jaxlib==0.4.35 \ keras-rl==0.4.2 \ - pennylane==0.35.1 \ - PennyLane-Lightning==0.35.1 \ - pennylane-qiskit==0.35.1 \ - qiskit==1.0.2 \ + pennylane==0.39.0 \ + PennyLane-Lightning==0.39.0 \ + pennylane-qiskit==0.36.0 \ + qiskit==1.2.4 \ neural-tangents==0.6.5 \ mplfinance==0.12.10b0 \ - hmmlearn==0.3.2 \ - catboost==1.2.3 \ + hmmlearn==0.3.3 \ + catboost==1.2.7 \ fastai2==0.0.30 \ - scikit-tda==1.0.0 \ + scikit-tda==1.1.1 \ ta==0.11.0 \ seaborn==0.13.2 \ - optuna==3.5.0 \ - findiff==0.10.0 \ + optuna==4.1.0 \ + findiff==0.10.2 \ sktime==0.26.0 \ hyperopt==0.2.7 \ - bayesian-optimization==1.4.3 \ - pingouin==0.5.4 \ + bayesian-optimization==2.0.0 \ + pingouin==0.5.5 \ quantecon==0.7.2 \ matplotlib==3.7.5 \ sdeint==0.3.0 \ - pandas_market_calendars==4.4.0 \ + pandas_market_calendars==4.4.2 \ dgl==2.1.0 \ ruptures==1.1.9 \ simpy==4.1.1 \ scikit-learn-extra==0.3.0 \ - ray==2.9.3 \ - "ray[tune]"==2.9.3 \ - "ray[rllib]"==2.9.3 \ - fastText==0.9.2 \ - h2o==3.46.0.1 \ - prophet==1.1.5 \ - torch==2.2.1 \ - torchvision==0.17.1 \ - ax-platform==0.3.7 \ - alphalens-reloaded==0.4.3 \ - pyfolio-reloaded==0.9.5 \ - altair==5.2.0 \ + ray==2.40.0 \ + "ray[tune]"==2.40.0 \ + "ray[rllib]"==2.40.0 \ + "ray[data]"==2.40.0 \ + "ray[train]"==2.40.0 \ + fastText==0.9.3 \ + h2o==3.46.0.6 \ + prophet==1.1.6 \ + torch==2.5.1 \ + torchvision==0.20.1 \ + ax-platform==0.4.3 \ + alphalens-reloaded==0.4.5 \ + pyfolio-reloaded==0.9.8 \ + altair==5.5.0 \ modin==0.26.1 \ - persim==0.3.5 \ - ripser==0.6.8 \ - pydmd==1.0.0 \ - spacy==3.7.4 \ + persim==0.3.7 \ + ripser==0.6.10 \ + pydmd==2024.12.1 \ + spacy==3.7.5 \ pandas-ta==0.3.14b \ - pytorch-ignite==0.4.13 \ - tensorly==0.8.1 \ - mlxtend==0.23.1 \ - shap==0.45.0 \ + pytorch-ignite==0.5.1 \ + tensorly==0.9.0 \ + mlxtend==0.23.3 \ + shap==0.46.0 \ lime==0.2.0.1 \ - tensorflow-probability==0.24.0 \ + tensorflow-probability==0.25.0 \ mpmath==1.3.0 \ tensortrade==1.0.3 \ - polars==0.20.15 \ + polars==1.16.0 \ stockstats==0.6.2 \ autokeras==2.0.0 \ - QuantStats==0.0.62 \ + QuantStats==0.0.64 \ hurst==0.0.5 \ - numerapi==2.18.0 \ + numerapi==2.19.1 \ pymdptoolbox==4.0-b3 \ - panel==1.3.8 \ - hvplot==0.9.2 \ - line-profiler==4.1.2 \ + panel==1.5.4 \ + hvplot==0.11.1 \ + line-profiler==4.2.0 \ py-heat==0.0.6 \ py-heat-magic==0.0.2 \ - bokeh==3.3.4 \ - tensorflow-decision-forests==1.9.0 \ + bokeh==3.6.2 \ + tensorflow-decision-forests==1.11.0 \ river==0.21.0 \ - stumpy==1.12.0 \ + stumpy==1.13.0 \ pyvinecopulib==0.6.5 \ - ijson==3.2.3 \ - jupyter-resource-usage==1.0.2 \ - injector==0.21.0 \ - openpyxl==3.1.2 \ + ijson==3.3.0 \ + jupyter-resource-usage==1.1.0 \ + injector==0.22.0 \ + openpyxl==3.1.5 \ xlrd==2.0.1 \ - mljar-supervised==1.1.6 \ + mljar-supervised==1.1.9 \ dm-tree==0.1.8 \ lz4==4.3.3 \ ortools==9.9.3963 \ @@ -188,99 +193,117 @@ RUN pip install --no-cache-dir \ thundergbm==0.3.17 \ yellowbrick==1.5 \ livelossplot==0.5.5 \ - gymnasium==0.28.1 \ - interpret==0.5.1 \ - DoubleML==0.7.1 \ - jupyter-bokeh==4.0.0 \ - imbalanced-learn==0.12.0 \ - openai==1.30.4 \ - lazypredict-nightly==0.3.0 \ - darts==0.28.0 \ - fastparquet==2024.2.0 \ - tables==3.9.2 \ - dimod==0.12.14 \ - dwave-samplers==1.2.0 \ - python-statemachine==2.1.2 \ + gymnasium==1.0.0 \ + interpret==0.6.7 \ + DoubleML==0.9.0 \ + jupyter-bokeh==4.0.5 \ + imbalanced-learn==0.12.4 \ + openai==1.57.0 \ + lazypredict==0.2.14a1 \ + darts==0.31.0 \ + fastparquet==2024.11.0 \ + tables==3.10.1 \ + dimod==0.12.17 \ + dwave-samplers==1.3.0 \ + python-statemachine==2.5.0 \ pymannkendall==1.4.3 \ - Pyomo==6.7.1 \ - gpflow==2.9.1 \ + Pyomo==6.8.2 \ + gpflow==2.9.2 \ pyarrow==15.0.1 \ - dwave-ocean-sdk==6.9.0 \ + dwave-ocean-sdk==8.0.1 \ chardet==5.2.0 \ - stable-baselines3==2.3.2 \ - Shimmy==1.3.0 \ - pystan==3.9.0 \ + stable-baselines3==2.4.0 \ + Shimmy==2.0.0 \ + pystan==3.10.0 \ FixedEffectModel==0.0.5 \ - transformers==4.41.2 \ - Rbeast==0.1.19 \ - langchain==0.1.12 \ - pomegranate==1.0.4 \ - MAPIE==0.8.3 \ - mlforecast==0.12.0 \ - functime==0.9.5 \ - tensorrt==8.6.1.post1 \ - x-transformers==1.30.4 \ - Werkzeug==3.0.1 \ + transformers==4.46.3 \ + Rbeast==0.1.23 \ + langchain==0.2.17 \ + pomegranate==1.1.1 \ + MAPIE==0.9.1 \ + mlforecast==0.15.1 \ + tensorrt==10.7.0 \ + x-transformers==1.42.24 \ + Werkzeug==3.1.3 \ TPOT==0.12.2 \ - llama-index==0.10.19 \ - mlflow==2.11.1 \ + llama-index==0.12.2 \ + mlflow==2.18.0 \ ngboost==0.5.1 \ pycaret==3.3.2 \ - control==0.9.4 \ - pgmpy==0.1.25 \ + control==0.10.1 \ + pgmpy==0.1.26 \ mgarch==0.3.0 \ - jupyter-ai==2.12.0 \ + jupyter-ai==2.28.2 \ keras-tcn==3.5.0 \ - neuralprophet[live]==0.8.0 \ - Riskfolio-Lib==6.0.0 \ + neuralprophet[live]==0.9.0 \ + Riskfolio-Lib==6.1.1 \ fuzzy-c-means==1.7.2 \ - EMD-signal==1.6.0 \ - dask[complete]==2024.3.1 \ - nolds==0.5.2 \ + EMD-signal==1.6.4 \ + dask[complete]==2024.9.0 \ + nolds==0.6.1 \ feature-engine==1.6.2 \ pytorch-tabnet==4.1.0 \ - opencv-contrib-python-headless==4.9.0.80 \ - POT==0.9.3 \ + opencv-contrib-python-headless==4.10.0.84 \ + POT==0.9.5 \ alibi-detect==0.12.0 \ - datasets==2.17.1 \ + datasets==2.21.0 \ scikeras==0.13.0 \ - accelerate==0.30.1 \ - peft==0.11.1 \ - FlagEmbedding==1.2.10 \ - contourpy==1.2.0 + accelerate==0.34.2 \ + peft==0.13.2 \ + FlagEmbedding==1.2.11 \ + contourpy==1.3.1 \ + tensorboardX==2.6.2.2 \ + scikit-image==0.22.0 \ + scs==3.2.7 \ + thinc==8.2.5 \ + cesium==0.12.1 \ + cvxportfolio==1.4.0 \ + tsfel==0.1.9 \ + ipympl==0.9.4 \ + PyQt6==6.7.1 \ + nixtla==0.6.4 \ + tigramite==5.2.6.7 \ + pytorch-forecasting==1.2.0 \ + chronos-forecasting[training]==1.4.1 \ + setuptools==73.0.1 \ + tinygrad==0.10.0 + +RUN conda install -c nvidia -y cuda-compiler=12.3.2 && conda clean -y --all -RUN conda install -c conda-forge -y cudatoolkit=11.8.0 cupy=13.1.0 && conda install -c nvidia -y cuda-compiler=12.2.2 && conda clean -y --all -ENV XLA_FLAGS=--xla_gpu_cuda_data_dir=/opt/miniconda3/ -ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cublas/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_cupti/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_nvrtc/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_runtime/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cudnn/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cufft/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/curand/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cusolver/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cusparse/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/nccl/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/nvjitlink/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/nvtx/lib/:/opt/miniconda3/pkgs/cudatoolkit-11.8.0-h6a678d5_0/lib/ ENV CUDA_MODULE_LOADING=LAZY +ENV XLA_FLAGS=--xla_gpu_cuda_data_dir=/opt/miniconda3/ +ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cublas/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_cupti/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_nvrtc/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_runtime/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cudnn/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cufft/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/curand/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cusolver/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/cusparse/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/nccl/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/nvjitlink/lib/:/opt/miniconda3/lib/python3.11/site-packages/nvidia/nvtx/lib/ # reduces GPU memory usage ENV PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True -# mamba-ssm & causal requires nvidia capabilities to be installed. iisignature requires numpy to be already installed -RUN pip install --no-cache-dir mamba-ssm==1.2.0.post1 causal-conv1d==1.2.0.post2 iisignature==0.24 +# required for numba to work correctly +RUN ln -s /opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_runtime/lib/libcudart.so.12 /opt/miniconda3/lib/python3.11/site-packages/nvidia/cuda_runtime/lib/libcudart.so + +# iisignature requires numpy to be already installed. cupy requires cuda installed +RUN pip install --no-cache-dir iisignature==0.24 cupy-cuda12x==13.3.0 mamba-ssm[causal-conv1d]==2.2.4 + +# TF uses this version, pytorch a slightly older (9.1) but cuDNN is backwards compatible +RUN pip install --no-cache-dir nvidia-cudnn-cu12==9.3.0.75 # Install dwave tool RUN dwave install --all -y # Install 'ipopt' solver for 'Pyomo' -RUN conda install -c conda-forge ipopt==3.14.14 \ +RUN conda install -c conda-forge -y ipopt==3.14.16 coincbc==2.10.12 openmpi=5.0.6 \ && conda clean -y --all # Install spacy models RUN python -m spacy download en_core_web_md && python -m spacy download en_core_web_sm -RUN conda install -y -c conda-forge \ - openmpi=5.0.2 \ - && conda clean -y --all - # Install PyTorch Geometric RUN TORCH=$(python -c "import torch; print(torch.__version__)") && \ CUDA=$(python -c "import torch; print('cu' + torch.version.cuda.replace('.', ''))") && \ pip install --no-cache-dir -f https://pytorch-geometric.com/whl/torch-${TORCH}+${CUDA}.html \ - torch-scatter==2.1.2 torch-sparse==0.6.18 torch-cluster==1.6.3 torch-spline-conv==1.2.2 torch-geometric==2.5.1 + torch-scatter==2.1.2 torch-sparse==0.6.18 torch-cluster==1.6.3 torch-spline-conv==1.2.2 torch-geometric==2.6.1 # Install nltk data RUN python -m nltk.downloader -d /usr/share/nltk_data punkt && \ + python -m nltk.downloader -d /usr/share/nltk_data punkt_tab && \ python -m nltk.downloader -d /usr/share/nltk_data vader_lexicon && \ python -m nltk.downloader -d /usr/share/nltk_data stopwords && \ python -m nltk.downloader -d /usr/share/nltk_data wordnet @@ -300,19 +323,13 @@ RUN wget -q https://cdn.quantconnect.com/ta-lib/ta-lib-0.4.0-src.tar.gz && \ tar -zxvf ta-lib-0.4.0-src.tar.gz && cd ta-lib && \ ./configure --prefix=/usr && make && make install && \ cd .. && rm -rf ta-lib && rm ta-lib-0.4.0-src.tar.gz && \ - pip install --no-cache-dir TA-Lib==0.4.28 - -# Install uni2ts. We manually copy the 'cli' folder which holds the fine tuning tools -RUN wget -q https://cdn.quantconnect.com/uni2ts/uni2ts-main-ffe78db.zip && \ - unzip -q uni2ts-main-ffe78db.zip && cd uni2ts-main && \ - pip install . && cp -r cli /opt/miniconda3/lib/python3.11/site-packages/uni2ts/ && \ - cd .. && rm -rf uni2ts-main && rm uni2ts-main-ffe78db.zip + pip install --no-cache-dir TA-Lib==0.5.1 -# Install chronos-forecasting. We manually copy the 'scripts' folder which holds the fine tuning tools -RUN wget -q https://cdn.quantconnect.com/chronos-forecasting/chronos-forecasting-main-b0bdbd9.zip && \ - unzip -q chronos-forecasting-main-b0bdbd9.zip && cd chronos-forecasting-main && \ - pip install ".[training]" && cp -r scripts /opt/miniconda3/lib/python3.11/site-packages/chronos/ && \ - cd .. && rm -rf chronos-forecasting-main && rm chronos-forecasting-main-b0bdbd9.zip +# chronos-forecasting we manually copy the 'scripts' folder which holds the fine tuning tools +RUN wget -q https://cdn.quantconnect.com/chronos-forecasting/chronos-forecasting-main-133761a.zip && \ + unzip -q chronos-forecasting-main-133761a.zip && cd chronos-forecasting-main && \ + cp -r scripts /opt/miniconda3/lib/python3.11/site-packages/chronos/ && \ + cd .. && rm -rf chronos-forecasting-main && rm chronos-forecasting-main-133761a.zip RUN echo "{\"argv\":[\"python\",\"-m\",\"ipykernel_launcher\",\"-f\",\"{connection_file}\"],\"display_name\":\"Foundation-Py-Default\",\"language\":\"python\",\"metadata\":{\"debugger\":true}}" > /opt/miniconda3/share/jupyter/kernels/python3/kernel.json @@ -331,7 +348,10 @@ RUN mkdir -p /root/ibgateway && \ ./ibgateway-stable-standalone-linux-x64.v10.19.2a.sh -q -dir /root/ibgateway && \ rm ibgateway-stable-standalone-linux-x64.v10.19.2a.sh +RUN apt-get update && apt-get install -y dotnet-sdk-6.0 && \ + apt-get clean && apt-get autoclean && apt-get autoremove --purge -y && rm -rf /var/lib/apt/lists/* + # label definitions -LABEL strict_python_version=3.11.7 +LABEL strict_python_version=3.11.11 LABEL python_version=3.11 -LABEL target_framework=net6.0 \ No newline at end of file +LABEL target_framework=net9.0 \ No newline at end of file diff --git a/DockerfileLeanFoundationARM b/DockerfileLeanFoundationARM index d6c9337f076c..c76aee58201f 100644 --- a/DockerfileLeanFoundationARM +++ b/DockerfileLeanFoundationARM @@ -19,12 +19,12 @@ RUN add-apt-repository ppa:ubuntu-toolchain-r/test && apt-get update \ && apt-get clean && apt-get autoclean && apt-get autoremove --purge -y \ && rm -rf /var/lib/apt/lists/* -# Install dotnet 6 sdk & runtime +# Install dotnet 9 sdk & runtime # The .deb packages don't support ARM, the install script does ENV PATH="/root/.dotnet:${PATH}" RUN wget https://dot.net/v1/dotnet-install.sh && \ chmod 777 dotnet-install.sh && \ - ./dotnet-install.sh -c 6.0 && \ + ./dotnet-install.sh -c 9.0 && \ rm dotnet-install.sh ENV DOTNET_ROOT="/root/.dotnet" @@ -32,16 +32,16 @@ ENV DOTNET_ROOT="/root/.dotnet" ENV PYTHONNET_PYDLL="/opt/miniconda3/lib/libpython3.11.so" # Install miniconda -ENV CONDA="Miniconda3-py311_24.1.2-0-Linux-aarch64.sh" +ENV CONDA="Miniconda3-py311_24.9.2-0-Linux-aarch64.sh" ENV PATH="/opt/miniconda3/bin:${PATH}" RUN wget -q https://cdn.quantconnect.com/miniconda/${CONDA} && \ bash ${CONDA} -b -p /opt/miniconda3 && rm -rf ${CONDA} # Install java runtime for h2o lib -RUN apt-get update && apt-get install -y alien dpkg-dev debhelper build-essential && wget https://download.oracle.com/java/17/latest/jdk-17_linux-aarch64_bin.rpm \ - && alien -i jdk-17_linux-aarch64_bin.rpm \ - && update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17-oracle-aarch64/bin/java 1 \ - && rm jdk-17_linux-aarch64_bin.rpm +RUN apt-get update && apt-get install -y alien dpkg-dev debhelper build-essential && wget https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-aarch64_bin.rpm \ + && alien -i jdk-17.0.12_linux-aarch64_bin.rpm \ + && update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17.0.12-oracle-aarch64/bin/java 1 \ + && rm jdk-17.0.12_linux-aarch64_bin.rpm # Avoid pip install read timeouts ENV PIP_DEFAULT_TIMEOUT=120 @@ -60,116 +60,119 @@ RUN pip install --no-cache-dir \ scipy==1.11.4 \ numpy==1.26.4 \ wrapt==1.16.0 \ - astropy==6.0.0 \ + astropy==7.0.0 \ beautifulsoup4==4.12.3 \ dill==0.3.8 \ - jsonschema==4.21.1 \ - lxml==5.1.0 \ - msgpack==1.0.8 \ - numba==0.59.0 \ - xarray==2024.2.0 \ - plotly==5.20.0 \ - jupyterlab==4.1.5 \ - tensorflow==2.16.1 \ - docutils==0.20.1 \ - gensim==4.3.2 \ - keras==3.3.3 \ - lightgbm==4.3.0 \ - nltk==3.8.1 \ - graphviz==0.20.1 \ - cmdstanpy==1.2.1 \ + jsonschema==4.23.0 \ + lxml==5.3.0 \ + msgpack==1.1.0 \ + numba==0.59.1 \ + xarray==2024.11.0 \ + plotly==5.24.1 \ + jupyterlab==4.3.2 \ + ipywidgets==8.1.5 \ + jupyterlab-widgets==3.0.13 \ + tensorflow==2.18.0 \ + docutils==0.21.2 \ + gensim==4.3.3 \ + keras==3.7.0 \ + lightgbm==4.5.0 \ + nltk==3.9.1 \ + graphviz==0.20.3 \ + cmdstanpy==1.2.4 \ copulae==0.7.9 \ - featuretools==1.30.0 \ - PuLP==2.8.0 \ - pymc==5.10.4 \ + featuretools==1.31.0 \ + PuLP==2.9.0 \ + pymc==5.19.0 \ rauth==0.7.3 \ scikit-learn==1.4.2 \ - scikit-optimize==0.10.0 \ - aesara==2.9.3 \ + scikit-optimize==0.10.2 \ + aesara==2.9.4 \ tsfresh==0.20.2 \ tslearn==0.6.3 \ tweepy==4.14.0 \ - PyWavelets==1.5.0 \ - umap-learn==0.5.5 \ - fastai==2.7.14 \ - arch==6.3.0 \ - copulas==0.10.1 \ + PyWavelets==1.7.0 \ + umap-learn==0.5.7 \ + fastai==2.7.18 \ + arch==7.2.0 \ + copulas==0.12.0 \ cufflinks==0.17.3 \ gym==0.26.2 \ - ipywidgets==8.1.2 \ deap==1.4.1 \ pykalman==0.9.7 \ - cvxpy==1.4.2 \ - pyro-ppl==1.9.0 \ + cvxpy==1.6.0 \ + pyro-ppl==1.9.1 \ sklearn-json==0.1.0 \ - dtw-python==1.3.1 \ - gluonts==0.14.4 \ + dtw-python==1.5.3 \ + gluonts==0.16.0 \ gplearn==0.4.2 \ - jax==0.4.25 \ - pennylane==0.35.1 \ - PennyLane-Lightning==0.35.1 \ - pennylane-qiskit==0.35.1 \ + jax==0.4.35 \ + pennylane==0.39.0 \ + PennyLane-Lightning==0.39.0 \ + pennylane-qiskit==0.36.0 \ mplfinance==0.12.10b0 \ - hmmlearn==0.3.2 \ + hmmlearn==0.3.3 \ ta==0.11.0 \ seaborn==0.13.2 \ - optuna==3.5.0 \ - findiff==0.10.0 \ + optuna==4.1.0 \ + findiff==0.10.2 \ sktime==0.26.0 \ hyperopt==0.2.7 \ - bayesian-optimization==1.4.3 \ + bayesian-optimization==2.0.0 \ matplotlib==3.7.5 \ sdeint==0.3.0 \ - pandas_market_calendars==4.4.0 \ + pandas_market_calendars==4.4.2 \ ruptures==1.1.9 \ simpy==4.1.1 \ scikit-learn-extra==0.3.0 \ - ray==2.9.3 \ - "ray[tune]"==2.9.3 \ - "ray[rllib]"==2.9.3 \ - fastText==0.9.2 \ - h2o==3.46.0.1 \ - prophet==1.1.5 \ - Riskfolio-Lib==6.0.0 \ - torch==2.2.1 \ - torchvision==0.17.1 \ - ax-platform==0.3.7 \ - alphalens-reloaded==0.4.3 \ - pyfolio-reloaded==0.9.5 \ - altair==5.2.0 \ + ray==2.40.0 \ + "ray[tune]"==2.40.0 \ + "ray[rllib]"==2.40.0 \ + "ray[data]"==2.40.0 \ + "ray[train]"==2.40.0 \ + fastText==0.9.3 \ + h2o==3.46.0.6 \ + prophet==1.1.6 \ + Riskfolio-Lib==6.1.1 \ + torch==2.5.1 \ + torchvision==0.20.1 \ + ax-platform==0.4.3 \ + alphalens-reloaded==0.4.5 \ + pyfolio-reloaded==0.9.8 \ + altair==5.5.0 \ modin==0.26.1 \ - persim==0.3.5 \ - ripser==0.6.8 \ - pydmd==1.0.0 \ - EMD-signal==1.6.0 \ - spacy==3.7.4 \ + persim==0.3.7 \ + ripser==0.6.10 \ + pydmd==2024.12.1 \ + EMD-signal==1.6.4 \ + spacy==3.7.5 \ pandas-ta==0.3.14b \ - pytorch-ignite==0.4.13 \ - tensorly==0.8.1 \ - mlxtend==0.23.1 \ - shap==0.45.0 \ + pytorch-ignite==0.5.1 \ + tensorly==0.9.0 \ + mlxtend==0.23.3 \ + shap==0.46.0 \ lime==0.2.0.1 \ mpmath==1.3.0 \ - polars==0.20.15 \ + polars==1.16.0 \ stockstats==0.6.2 \ - QuantStats==0.0.62 \ + QuantStats==0.0.64 \ hurst==0.0.5 \ - numerapi==2.18.0 \ + numerapi==2.19.1 \ pymdptoolbox==4.0-b3 \ - panel==1.3.8 \ - hvplot==0.9.2 \ + panel==1.5.4 \ + hvplot==0.11.1 \ py-heat==0.0.6 \ py-heat-magic==0.0.2 \ - bokeh==3.3.4 \ + bokeh==3.6.2 \ river==0.21.0 \ - stumpy==1.12.0 \ + stumpy==1.13.0 \ pyvinecopulib==0.6.5 \ - ijson==3.2.3 \ - jupyter-resource-usage==1.0.2 \ - injector==0.21.0 \ - openpyxl==3.1.2 \ + ijson==3.3.0 \ + jupyter-resource-usage==1.1.0 \ + injector==0.22.0 \ + openpyxl==3.1.5 \ xlrd==2.0.1 \ - mljar-supervised==1.1.6 \ + mljar-supervised==1.1.9 \ dm-tree==0.1.8 \ lz4==4.3.3 \ ortools==9.9.3963 \ @@ -177,51 +180,50 @@ RUN pip install --no-cache-dir \ thundergbm==0.3.17 \ yellowbrick==1.5 \ livelossplot==0.5.5 \ - gymnasium==0.28.1 \ - interpret==0.5.1 \ - DoubleML==0.7.1 \ - jupyter-bokeh==4.0.0 \ - imbalanced-learn==0.12.0 \ - openai==1.30.4 \ - lazypredict-nightly==0.3.0 \ - darts==0.28.0 \ - fastparquet==2024.2.0 \ - tables==3.9.2 \ - dimod==0.12.14 \ - dwave-samplers==1.2.0 \ - python-statemachine==2.1.2 \ + gymnasium==1.0.0 \ + interpret==0.6.7 \ + DoubleML==0.9.0 \ + jupyter-bokeh==4.0.5 \ + imbalanced-learn==0.12.4 \ + openai==1.57.0 \ + lazypredict==0.2.14a1 \ + darts==0.31.0 \ + fastparquet==2024.11.0 \ + tables==3.10.1 \ + dimod==0.12.17 \ + dwave-samplers==1.3.0 \ + python-statemachine==2.5.0 \ pymannkendall==1.4.3 \ - Pyomo==6.7.1 \ - gpflow==2.9.1 \ + Pyomo==6.8.2 \ + gpflow==2.9.2 \ pyarrow==15.0.1 \ - dwave-ocean-sdk==6.9.0 \ + dwave-ocean-sdk==8.0.1 \ chardet==5.2.0 \ - stable-baselines3==2.3.2 \ - Shimmy==1.3.0 \ + stable-baselines3==2.4.0 \ + Shimmy==2.0.0 \ FixedEffectModel==0.0.5 \ - transformers==4.38.2 \ - langchain==0.1.12 \ - pomegranate==1.0.4 \ - MAPIE==0.8.3 \ - mlforecast==0.12.0 \ - x-transformers==1.27.19 \ - Werkzeug==3.0.1 \ - h5py==3.10.0 \ - nolds==0.5.2 \ + transformers==4.46.3 \ + langchain==0.2.17 \ + pomegranate==1.1.1 \ + MAPIE==0.9.1 \ + mlforecast==0.15.1 \ + x-transformers==1.42.24 \ + Werkzeug==3.1.3 \ + nolds==0.6.1 \ feature-engine==1.6.2 \ pytorch-tabnet==4.1.0 \ - opencv-contrib-python-headless==4.9.0.80 \ - POT==0.9.3 \ + opencv-contrib-python-headless==4.10.0.84 \ + POT==0.9.5 \ alibi-detect==0.12.0 \ - datasets==2.17.1 \ + datasets==2.21.0 \ scikeras==0.13.0 \ - contourpy==1.2.0 + contourpy==1.3.1 # Install dwave tool RUN dwave install --all -y # Install 'ipopt' solver for 'Pyomo' -RUN conda install -c conda-forge ipopt==3.14.14 \ +RUN conda install -c conda-forge ipopt==3.14.16 \ && conda clean -y --all # We install need to install separately else fails to find numpy @@ -231,11 +233,12 @@ RUN pip install --no-cache-dir iisignature==0.24 RUN python -m spacy download en_core_web_md && python -m spacy download en_core_web_sm RUN conda config --set solver classic && conda install -y -c conda-forge \ - openmpi=5.0.2 \ + openmpi=5.0.6 \ && conda clean -y --all # Install nltk data RUN python -m nltk.downloader -d /usr/share/nltk_data punkt && \ + python -m nltk.downloader -d /usr/share/nltk_data punkt_tab && \ python -m nltk.downloader -d /usr/share/nltk_data vader_lexicon && \ python -m nltk.downloader -d /usr/share/nltk_data stopwords && \ python -m nltk.downloader -d /usr/share/nltk_data wordnet @@ -270,7 +273,12 @@ RUN apt-get update && apt install -y xvfb wkhtmltopdf && \ RUN wget -q https://cdn.quantconnect.com/fonts/foundation.zip && unzip -q foundation.zip && rm foundation.zip \ && mv "lean fonts/"* /usr/share/fonts/truetype/ && rm -rf "lean fonts/" "__MACOSX/" +RUN wget https://dot.net/v1/dotnet-install.sh && \ + chmod 777 dotnet-install.sh && \ + ./dotnet-install.sh -c 6.0 && \ + rm dotnet-install.sh + # label definitions -LABEL strict_python_version=3.11.7 +LABEL strict_python_version=3.11.11 LABEL python_version=3.11 -LABEL target_framework=net6.0 \ No newline at end of file +LABEL target_framework=net9.0 \ No newline at end of file diff --git a/Research/QuantConnect.Research.csproj b/Research/QuantConnect.Research.csproj index ba538810071f..e5bc65cd1c5e 100644 --- a/Research/QuantConnect.Research.csproj +++ b/Research/QuantConnect.Research.csproj @@ -32,8 +32,9 @@ - - + + + diff --git a/Tests/Python/PythonPackagesTests.cs b/Tests/Python/PythonPackagesTests.cs index 95d139d0cd53..50fc3bf31d10 100644 --- a/Tests/Python/PythonPackagesTests.cs +++ b/Tests/Python/PythonPackagesTests.cs @@ -23,6 +23,246 @@ namespace QuantConnect.Tests.Python [TestFixture, Category("TravisExclude")] public class PythonPackagesTests { + [Test] + public void Tinygrad() + { + AssertCode(@" +def RunTest(): + import numpy as np + from tinygrad import Tensor + + t1 = Tensor([1, 2, 3, 4, 5]) + na = np.array([1, 2, 3, 4, 5]) + t2 = Tensor(na) +"); + } + + [Test] + public void Tigramite() + { + AssertCode(@" +def RunTest(): + import numpy as np + import matplotlib + from matplotlib import pyplot as plt + + import tigramite + from tigramite import data_processing as pp + from tigramite.toymodels import structural_causal_processes as toys + + from tigramite.toymodels import surrogate_generator + + from tigramite import plotting as tp + from tigramite.pcmci import PCMCI + from tigramite.independence_tests.parcorr import ParCorr + from tigramite.models import Models, Prediction + + import math + import sklearn + from sklearn.linear_model import LinearRegression + + np.random.seed(14) # Fix random seed + lin_f = lambda x: x + links_coeffs = {0: [((0, -1), 0.7, lin_f)], + 1: [((1, -1), 0.8, lin_f), ((0, -1), 0.3, lin_f)], + 2: [((2, -1), 0.5, lin_f), ((0, -2), -0.5, lin_f)], + 3: [((3, -1), 0., lin_f)], #, ((4, -1), 0.4, lin_f)], + 4: [((4, -1), 0., lin_f), ((3, 0), 0.5, lin_f)], #, ((3, -1), 0.3, lin_f)], + } + T = 200 # time series length + # Make some noise with different variance, alternatively just noises=None + noises = np.array([(1. + 0.2*float(j))*np.random.randn((T + int(math.floor(0.2*T)))) + for j in range(len(links_coeffs))]).T + + data, _ = toys.structural_causal_process(links_coeffs, T=T, noises=noises, seed=14) + T, N = data.shape + + # For generality, we include some masking + # mask = np.zeros(data.shape, dtype='int') + # mask[:int(T/2)] = True + mask=None + + # Initialize dataframe object, specify time axis and variable names + var_names = [r'$X^0$', r'$X^1$', r'$X^2$', r'$X^3$', r'$X^4$'] + dataframe = pp.DataFrame(data, + mask=mask, + datatime = {0:np.arange(len(data))}, + var_names=var_names) +"); + } + + [Test] + public void Tsfel() + { + AssertCode(@" +def RunTest(): + import tsfel + import pandas as pd + + # load dataset + data = tsfel.datasets.load_biopluxecg() + + # Retrieves a pre-defined feature configuration file to extract the temporal, statistical and spectral feature sets + cfg = tsfel.get_features_by_domain() + + # Extract features + X = tsfel.time_series_features_extractor(cfg, data) +"); + } + + [Test] + public void Cvxportfolio() + { + AssertCode(@" +def RunTest(): + import cvxportfolio as cvx + import numpy as np + import pandas as pd + + objective = cvx.ReturnsForecast() - 0.5 * cvx.FullCovariance() + constraints = [cvx.LongOnly(), cvx.LeverageLimit(1)] + + strategy = cvx.SinglePeriodOptimization(objective, constraints) +"); + } + + [Test] + public void Cesium() + { + AssertCode(@" +def RunTest(): + import numpy as np + import matplotlib.pyplot as plt + import seaborn + from cesium import datasets, featurize + + seaborn.set() + + eeg = datasets.fetch_andrzejak() + + # Group together classes (Z, O), (N, F), (S) as normal, interictal, ictal + eeg[""classes""] = eeg[""classes""].astype(""U16"") # allocate memory for longer class names + eeg[""classes""][np.logical_or(eeg[""classes""] == ""Z"", eeg[""classes""] == ""O"")] = ""Normal"" + eeg[""classes""][ + np.logical_or(eeg[""classes""] == ""N"", eeg[""classes""] == ""F"") + ] = ""Interictal"" + eeg[""classes""][eeg[""classes""] == ""S""] = ""Ictal"" + + fig, ax = plt.subplots(1, len(np.unique(eeg[""classes""])), sharey=True) + for label, subplot in zip(np.unique(eeg[""classes""]), ax): + i = np.where(eeg[""classes""] == label)[0][0] + subplot.plot(eeg[""times""][i], eeg[""measurements""][i]) + subplot.set(xlabel=""time (s)"", ylabel=""signal"", title=label) + + features_to_use = [ + ""amplitude"", + ""percent_beyond_1_std"", + ""maximum"", + ""max_slope"", + ""median"", + ""median_absolute_deviation"", + ""percent_close_to_median"", + ""minimum"", + ""skew"", + ""std"", + ""weighted_average"", + ] + fset_cesium = featurize.featurize_time_series( + times=eeg[""times""], + values=eeg[""measurements""], + errors=None, + features_to_use=features_to_use, + ) + print(fset_cesium.head()) +"); + } + + [Test, Explicit("Run separate")] + public void Thinc() + { + AssertCode(@" +def RunTest(): + from thinc.api import PyTorchWrapper, chain, Linear + import torch.nn + + model = chain( + PyTorchWrapper(torch.nn.Linear(16, 8)), + Linear(4, 8) + ) + X = model.ops.alloc2f(1, 16) # make a dummy batch + model.initialize(X=X) + Y, backprop = model(X, is_train=True) + dX = backprop(Y) +"); + } + + [Test] + public void Scs() + { + AssertCode(@" +def RunTest(): + import scipy + import scs + import numpy as np + + # Set up the problem data + P = scipy.sparse.csc_matrix([[3.0, -1.0], [-1.0, 2.0]]) + A = scipy.sparse.csc_matrix([[-1.0, 1.0], [1.0, 0.0], [0.0, 1.0]]) + b = np.array([-1, 0.3, -0.5]) + c = np.array([-1.0, -1.0]) + + # Populate dicts with data to pass into SCS + data = dict(P=P, A=A, b=b, c=c) + cone = dict(z=1, l=2) + + # Initialize solver + solver = scs.SCS(data, cone, eps_abs=1e-9, eps_rel=1e-9) + # Solve! + sol = solver.solve() + + print(f""SCS took {sol['info']['iter']} iters"") + print(""Optimal solution vector x*:"") + print(sol[""x""]) + + print(""Optimal dual vector y*:"") + print(sol[""y""])"); + } + + [Test] + public void ScikitImage() + { + AssertCode(@" +def RunTest(): + import skimage as ski + from skimage import data, color + from skimage.transform import rescale, resize, downscale_local_mean + + img = ski.data.astronaut() + top_left = img[:100, :100] + + image = color.rgb2gray(data.astronaut()) + + image_rescaled = rescale(image, 0.25, anti_aliasing=False) + image_resized = resize( + image, (image.shape[0] // 4, image.shape[1] // 4), anti_aliasing=True + ) + image_downscaled = downscale_local_mean(image, (4, 3))"); + } + + [Test] + public void TensorboardX() + { + AssertCode(@" +def RunTest(): + from tensorboardX import SummaryWriter + #SummaryWriter encapsulates everything + writer = SummaryWriter('runs/exp-1') + #creates writer object. The log will be saved in 'runs/exp-1' + writer2 = SummaryWriter() + #creates writer2 object with auto generated file name, the dir will be something like 'runs/Aug20-17-20-33' + writer3 = SummaryWriter(comment='3x learning rate')"); + } + [Test] public void Peft() { @@ -256,7 +496,7 @@ def RunTest(): loss.backward()"); } - [Test] + [Test, Explicit("Requires old polars")] public void Functime() { AssertCode( @@ -308,7 +548,7 @@ def RunTest(): y_pred = forecaster.predict(fh=3, X=X_future)"); } - [Test] + [Test, Explicit("Run separate")] public void Mlforecast() { AssertCode( @@ -480,7 +720,7 @@ transformed parameters { df = fit.to_frame() # pandas `DataFrame, requires pandas"); } - [Test] + [Test, Explicit("Run separate")] public void PyvinecopulibTest() { AssertCode( @@ -800,7 +1040,7 @@ def RunTest(): ); } - [Test] + [Test, Explicit("Run separate")] public void MlxtendTest() { AssertCode( @@ -858,7 +1098,7 @@ public void IgniteTest() import ignite def RunTest(): - assert(ignite.__version__ == '0.4.13')" + assert(ignite.__version__ == '0.5.1')" ); } @@ -2303,38 +2543,42 @@ def RunTest(): /// /// The module we are testing /// The module version - [TestCase("pulp", "2.8.0", "VERSION")] - [TestCase("pymc", "5.10.4", "__version__")] + [TestCase("pulp", "2.9.0", "VERSION")] + [TestCase("pymc", "5.19.0", "__version__")] [TestCase("pypfopt", "pypfopt", "__name__")] [TestCase("wrapt", "1.16.0", "__version__")] [TestCase("tslearn", "0.6.3", "__version__")] [TestCase("tweepy", "4.14.0", "__version__")] - [TestCase("pywt", "1.5.0", "__version__")] - [TestCase("umap", "0.5.5", "__version__")] - [TestCase("dtw", "1.3.1", "__version__")] + [TestCase("pywt", "1.7.0", "__version__")] + [TestCase("umap", "0.5.7", "__version__")] + [TestCase("dtw", "1.5.3", "__version__")] [TestCase("mplfinance", "0.12.10b0", "__version__")] [TestCase("cufflinks", "0.17.3", "__version__")] - [TestCase("ipywidgets", "8.1.2", "__version__")] - [TestCase("astropy", "6.0.0", "__version__")] - [TestCase("gluonts", "0.14.4", "__version__")] + [TestCase("ipywidgets", "8.1.5", "__version__")] + [TestCase("astropy", "7.0.0", "__version__")] + [TestCase("gluonts", "0.16.0", "__version__")] [TestCase("gplearn", "0.4.2", "__version__")] - [TestCase("featuretools", "1.30.0", "__version__")] - [TestCase("pennylane", "0.35.1", "version()")] - [TestCase("pyfolio", "0.9.5", "__version__")] - [TestCase("altair", "5.2.0", "__version__")] + [TestCase("featuretools", "1.31.0", "__version__")] + [TestCase("pennylane", "0.39.0", "version()")] + [TestCase("pyfolio", "0.9.8", "__version__")] + [TestCase("altair", "5.5.0", "__version__")] [TestCase("modin", "0.26.1", "__version__")] - [TestCase("persim", "0.3.5", "__version__")] - [TestCase("pydmd", "1.0.0", "__version__")] + [TestCase("persim", "0.3.7", "__version__")] + [TestCase("pydmd", "pydmd", "__name__")] [TestCase("pandas_ta", "0.3.14b0", "__version__")] [TestCase("tensortrade", "1.0.3", "__version__")] - [TestCase("quantstats", "0.0.62", "__version__")] - [TestCase("panel", "1.3.8", "__version__")] + [TestCase("quantstats", "0.0.64", "__version__")] + [TestCase("panel", "1.5.4", "__version__")] [TestCase("pyheat", "pyheat", "__name__")] - [TestCase("tensorflow_decision_forests", "1.9.0", "__version__")] - [TestCase("pomegranate", "1.0.4", "__version__")] - [TestCase("cv2", "4.9.0", "__version__")] - [TestCase("ot", "0.9.3", "__version__")] - [TestCase("datasets", "2.17.1", "__version__")] + [TestCase("tensorflow_decision_forests", "1.11.0", "__version__")] + [TestCase("pomegranate", "1.1.1", "__version__")] + [TestCase("cv2", "4.10.0", "__version__")] + [TestCase("ot", "0.9.5", "__version__")] + [TestCase("datasets", "2.21.0", "__version__")] + [TestCase("ipympl", "0.9.4", "__version__")] + [TestCase("PyQt6", "PyQt6", "__name__")] + [TestCase("pytorch_forecasting", "1.2.0", "__version__")] + [TestCase("chronos", "chronos", "__name__")] public void ModuleVersionTest(string module, string value, string attribute) { AssertCode(