#  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.7.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.12.0"

# ---- DL / HF stack ----
torch = "^2.9.0,<2.10.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.0,<2.4.0"
pandas = ">=2.0,<2.4.0"
scipy = "^1.12.0"
scikit-learn = "^1.7.1"
statsmodels = "^0.14.5"
sktime = "0.40.1"
pmdarima = "2.1.1"
hmmlearn = "0.3.3"
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 = ">=26.3.1"
isort = "6.0.1"
setuptools = ">=75.3.0"
joblib = ">=1.4.2"
urllib3 = "2.6.3"
jaxtyping = ">=0.2.24"
rotary-embedding-torch = ">=0.8.0"

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

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