#  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.5.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 = "ainode/thrift/*", format = "wheel"},
    {path = "ainode/thrift/common/*", format = "wheel"},
    {path = "ainode/thrift/confignode/*", format = "wheel"},
    {path = "ainode/thrift/datanode/*", format = "wheel"},
    {path = "ainode/thrift/ainode/*", format = "wheel"},
    {path = "ainode/conf/*", format = "wheel"},
]
packages = [
    { include = "ainode" }
]

[tool.poetry.dependencies]
python = ">=3.9, <3.13"
numpy = "^1.21.4"
pandas = "^1.3.5"
torch = ">=2.2.0"
pylru = "^1.2.1"
thrift = ">=0.14.0"
dynaconf = "^3.1.11"
requests = "^2.31.0"
optuna = "^3.2.0"
psutil = "^5.9.5"
sktime = "^0.24.1"
pmdarima = "^2.0.4"
hmmlearn = "^0.3.0"
apache-iotdb = "2.0.4.dev0"
einops = "^0.8.1"
safetensors = "^0.5.1"
huggingface_hub = "^0.30.1"
black = "25.1.0"
isort = "6.0.1"
transformers = "==4.40.1"

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

[tool.isort]
profile = "black"