#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.poetry]
name = "apache-iotdb-ainode"
version = "2.0.6.dev"
description = "Apache IoTDB AINode"
readme = "README.md"
authors = ["Apache Software Foundation <dev@iotdb.apache.org>"]
license = "Apache License, Version 2.0"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: Apache Software License",
    "Operating System :: OS Independent",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development :: Libraries :: Python Modules",
]
include = [
    { path = "iotdb/Session.py", format = "wheel" },
    { path = "iotdb/SessionPool.py", format = "wheel" },
    { path = "iotdb/table_session.py", format = "wheel" },
    { path = "iotdb/table_session_pool.py", format = "wheel" },
    { path = "iotdb/dbapi/*", format = "wheel" },
    { path = "iotdb/sqlalchemy/*", format = "wheel" },
    { path = "iotdb/template/*", format = "wheel" },
    { path = "iotdb/thrift/*", format = "wheel" },
    { path = "iotdb/thrift/ainode/*", format = "wheel" },
    { path = "iotdb/thrift/common/*", format = "wheel" },
    { path = "iotdb/thrift/confignode/*", format = "wheel" },
    { path = "iotdb/thrift/datanode/*", format = "wheel" },
    { path = "iotdb/thrift/rpc/*", format = "wheel" },
    { path = "iotdb/tsfile/*", format = "wheel" },
    { path = "iotdb/tsfile/common/*", format = "wheel" },
    { path = "iotdb/tsfile/common/constant/*", format = "wheel" },
    { path = "iotdb/tsfile/utils/*", format = "wheel" },
    { path = "iotdb/utils/*", format = "wheel" },
    { path = "iotdb/__init__.py", format = "wheel" },
    { path = "iotdb/ainode/__init__.py", format = "wheel" },
    { path = "iotdb/ainode/conf/*", format = "wheel" },
]

packages = [
    { include = "iotdb/ainode/core" }
]

exclude = [
    "**/__pycache__/**",
    "**/*.pyc", "**/*.pyo",
    "**/.DS_Store",
    "**/*.log", "**/*.log.gz",
    "venv/**", ".venv/**", "*/.venv/**",
    "iotdb/ainode/core/data/**",
    "iotdb/ainode/core/logs/**",
    "iotdb/**/.cache/**",
    "iotdb/**/download/**",
    "iotdb/**/logs/**",
    "iotdb/**/log-*.log*"
]

[tool.poetry.dependencies]
python = ">=3.11.0,<3.14.0"

# ---- DL / HF stack ----
torch = "^2.8.0,<2.9.0"
torchmetrics = "^1.8.0"
transformers = "==4.56.2"
tokenizers = ">=0.22.0,<=0.23.0"
huggingface_hub = "^0.34.4"
safetensors = "^0.6.2"
einops = "^0.8.1"

# ---- Core scientific stack ----
numpy = "^2.3.2"
scipy = "^1.12.0"
pandas = "^2.3.2"
scikit-learn = "^1.7.1"
statsmodels = "^0.14.5"
sktime = "0.40.1"
pmdarima = "2.1.1"
hmmlearn = "0.3.2"
accelerate = "^1.10.1"

# ---- Optimizers / utils ----
optuna = "^4.4.0"
psutil = "^7.0.0"
requests = "^2.32.5"
dynaconf = "^3.2.11"
thrift = ">=0.14.0"
tzlocal = "^5.3.1"

# ---- HF acceleration ----
hf_xet = ">=1.1.9"

# ---- Tooling ----
pyinstaller = "6.16.0"
black = "25.1.0"
isort = "6.0.1"
setuptools = ">=75.3.0"
joblib = ">=1.4.2"
urllib3 = "2.6.0"

[tool.poetry.scripts]
ainode = "iotdb.ainode.core.script:main"

[tool.isort]
profile = "black"
skip = ["build", "dist", "target"]