Skip to content
Snippets Groups Projects
Commit cb65223d authored by Grégoire Kubler's avatar Grégoire Kubler
Browse files

feat : first draw support cibuildwheel

parent 566878e6
No related branches found
No related tags found
4 merge requests!93Release v0.3.0,!64Feat/release pip,!63Draft: Feat/release pip,!62Draft: Feat/release pip 2
...@@ -11,6 +11,8 @@ __pycache__ ...@@ -11,6 +11,8 @@ __pycache__
*.pyc *.pyc
*.egg-info *.egg-info
dist*/ dist*/
wheelhouse/
aidge_backend_cpu/_version.py
# Mermaid # Mermaid
*.mmd *.mmd
...@@ -19,4 +21,4 @@ dist*/ ...@@ -19,4 +21,4 @@ dist*/
xml*/ xml*/
# ONNX # ONNX
*.onnx *.onnx
\ No newline at end of file
################################################################################
# Centralized definitions of common job parameter values. #
# Parameters with many optional configurations may be in separate files. #
# #
################################################################################
variables:
GIT_SUBMODULE_STRATEGY: recursive
OMP_NUM_THREADS: 4
GIT_SSL_NO_VERIFY: 1
DEBIAN_FRONTEND: noninteractive
# See https://docs.gitlab.com/ee/ci/yaml/workflow.html#switch-between-branch-pipelines-and-merge-request-pipelines
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
default:
image: nvidia/cuda:12.2.0-devel-ubuntu22.04
before_script:
- apt update
- apt install -y cmake cppcheck python-is-python3 pip git gcovr unzip curl
include:
- remote: 'https://gitlab.eclipse.org/eclipse/aidge/gitlab_shared_files/-/raw/main/.gitlab/ci/shared_script.gitlab-ci.yml'
build:ubuntu_cpp:
stage: build
needs: []
tags:
- docker
script:
# Download dependencies
# aidge_core
- DEPENDENCY_NAME="aidge_core"
- DEPENDENCY_JOB="build:ubuntu_cpp"
- !reference [.download_dependency, script]
# Build current module
- export CMAKE_PREFIX_PATH=../install_cpp
- mkdir -p build_cpp
- cd build_cpp
- cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON ..
- make -j4 all install
artifacts:
expire_in: 1 week
paths:
- build_cpp/
- install_cpp/
build:ubuntu_cpp_g++10:
stage: build
needs: []
tags:
- docker
script:
# Download dependencies
# aidge_core
- DEPENDENCY_NAME="aidge_core"
- DEPENDENCY_JOB="build:ubuntu_cpp"
- !reference [.download_dependency, script]
# Build current module
- export CMAKE_PREFIX_PATH=../install_cpp
- apt install -y g++-10
- mkdir -p build_cpp
- mkdir -p install_cpp
- cd build_cpp
- export CXX=/usr/bin/g++-10
- cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON ..
- make -j4 all install
build:ubuntu_cpp_g++12:
stage: build
needs: []
tags:
- docker
script:
# Download dependencies
# aidge_core
- DEPENDENCY_NAME="aidge_core"
- DEPENDENCY_JOB="build:ubuntu_cpp"
- !reference [.download_dependency, script]
# Build current module
- export CMAKE_PREFIX_PATH=../install_cpp
- apt install -y g++-12
- mkdir -p build_cpp
- mkdir -p install_cpp
- cd build_cpp
- export CXX=/usr/bin/g++-12
- cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON ..
- make -j4 all install
build:ubuntu_cpp_clang12:
stage: build
needs: []
tags:
- docker
script:
# Download dependencies
# aidge_core
- DEPENDENCY_NAME="aidge_core"
- DEPENDENCY_JOB="build:ubuntu_cpp"
- !reference [.download_dependency, script]
# Build current module
- export CMAKE_PREFIX_PATH=../install_cpp
- apt install -y clang-12
- mkdir -p build_cpp
- mkdir -p install_cpp
- cd build_cpp
- export CXX=/usr/bin/clang++-12
- cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON ..
- make -j4 all install
build:ubuntu_cpp_clang15:
stage: build
needs: []
tags:
- docker
script:
# Download dependencies
# aidge_core
- DEPENDENCY_NAME="aidge_core"
- DEPENDENCY_JOB="build:ubuntu_cpp"
- !reference [.download_dependency, script]
# Build current module
- export CMAKE_PREFIX_PATH=../install_cpp
- apt install -y clang-15
- mkdir -p build_cpp
- mkdir -p install_cpp
- cd build_cpp
- export CXX=/usr/bin/clang++-15
- cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON ..
- make -j4 all install
build:ubuntu_python:
stage: build
needs: []
tags:
- docker
script:
# Download dependencies
# aidge_core (Python)
- DEPENDENCY_NAME="aidge_core"
- DEPENDENCY_JOB="build:ubuntu_python"
- !reference [.download_dependency, script]
- python3 -m pip install virtualenv
- virtualenv venv
- source venv/bin/activate
- python3 -m pip install -r requirements.txt
- python3 -m pip install .
- python3 -m pip install numpy unittest-xml-reporting
- python3 -m pip list
artifacts:
expire_in: 1 week
paths:
- venv/
build:windows_cpp:
stage: build
needs: []
tags:
- windows
image: buildtools
before_script:
# Install Chocolatey
- Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Install dependencies
- choco install cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"' -Y
- choco install git -Y
- choco install python -Y
# Update PATH
- $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
script:
# Download dependencies
# aidge_core
- $DEPENDENCY_NAME="aidge_core"
- $DEPENDENCY_JOB="build:windows_cpp"
- !reference [.download_dependency_windows, script]
- Remove-Item .\build_cpp\ -Recurse -Force -ErrorAction Ignore
- $env:CMAKE_PREFIX_PATH = '../install_cpp'
- mkdir -p build_cpp
- cd build_cpp
- cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug ..
- cmake --build . -j2
- cmake --install . --config Debug
artifacts:
expire_in: 1 week
paths:
- build_cpp/
- install_cpp/
build:windows_python:
stage: build
needs: []
tags:
- windows
image: buildtools
before_script:
# Install Chocolatey
- Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Install dependencies
- choco install cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"' -Y
- choco install git -Y
- choco install python -Y
# Update PATH
- $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
script:
# Download dependencies
# aidge_core (Python)
- $DEPENDENCY_NAME="aidge_core"
- $DEPENDENCY_JOB="build:windows_python"
- !reference [.download_dependency_windows, script]
- python -m pip install virtualenv
- virtualenv venv
- venv\Scripts\Activate.ps1
- python -m pip install -r requirements.txt
- python -m pip install .
artifacts:
expire_in: 1 week
paths:
- venv/
$ErrorActionPreference = "Stop"
if ($($env:AIDGE_DEPENDENCIES -split " ").Length -eq 0) {
Write-Host "- No dependencies provided for current repsitory"
New-Item -ItemType Directory -Force -Path ".\build" | Out-Null
Remove-Item -Path ".\build\*" -Recurse -Force
} else {
Write-Host "Retrieving given dependencies to build current package : $env:AIDGE_DEPENDENCIES"
foreach ($dep in $($env:AIDGE_DEPENDENCIES -split " ")) {
Write-Host "Retrieving : $dep"
$curr_loc=$(Get-Location)
Set-Location ../$dep
Write-Host "YYEETEEEEEEEEEEEEt"
Get-Location
Get-ChildItem .
New-Item -Path ".\build" -ItemType Directory -Force | Out-Null
Get-ChildItem -Path ".\build" -File | Remove-Item -Force
python -m pip install . -v
Set-Location $curr_loc
}
}
\ No newline at end of file
#!/bin/bash
set -x
set -e
if [[ $AIDGE_DEPENDENCIES == "" ]]; then # case for aidge_ core
mkdir -p build # creating build if its not already there to hold the build of cpp files
rm -rf build/* # build from scratch
else
for repo in $AIDGE_DEPENDENCIES ; do # case for other projects
REPO_PATH=$(find /host/home/ -type d -name $repo \
-not -path '*install*' \
-not -path '*.git*' \
-not -path '*miniconda*' \
-not -path '*conda*' \
-not -path '*.local*' \
-not -path "*lib*" \
-not -path "*/$repo/$repo" \
-print -quit)
cd $REPO_PATH
mkdir -p build # creating build if its not already there to hold the build of cpp files
rm -rf build/* # build from scratch
pip install . -v
cd -
done
fi
set +x
set +e
coverage:ubuntu_cpp:
stage: coverage
needs: ["build:ubuntu_cpp"]
tags:
- docker
script:
- cd build_cpp
- ctest --output-on-failure
# HTML report for visualization
- gcovr --html-details --exclude-unreachable-branches -o coverage.html --root ${CI_PROJECT_DIR} --filter '\.\./include/' --filter '\.\./src/'
# Coberta XML report for Gitlab integration
- gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o coverage.xml --root ${CI_PROJECT_DIR} --filter '\.\./include/' --filter '\.\./src/'
coverage: /^\s*lines:\s*\d+.\d+\%/
artifacts:
name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}
expire_in: 2 days
reports:
coverage_report:
coverage_format: cobertura
path: build_cpp/coverage.xml
coverage:ubuntu_python:
stage: coverage
needs: ["build:ubuntu_python"]
tags:
- docker
script:
- source venv/bin/activate
- python3 -m pip install numpy coverage
- cd ${CI_PROJECT_NAME}
# Retrieve the installation path of the module, since it is installed with pip.
- export MODULE_LOCATION=`python -c "import ${CI_PROJECT_NAME} as _; print(_.__path__[0])"`
- python3 -m coverage run --source=$MODULE_LOCATION -m unittest discover -s unit_tests/ -v -b
- python3 -m coverage report
- python3 -m coverage xml
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: ${CI_PROJECT_NAME}/coverage.xml
static_analysis:cpp:
stage: static_analysis
tags:
- static_analysis
allow_failure: true
script:
- mkdir -p $CI_COMMIT_REF_NAME
- cppcheck -j 4 --enable=all --inconclusive --force --xml --xml-version=2 . 2> cppcheck-result.xml
- python -m pip install Pygments
- cppcheck-htmlreport --file=cppcheck-result.xml --report-dir=$CI_COMMIT_REF_NAME --source-dir=src
- python3 -m pip install -U cppcheck_codequality
- cppcheck-codequality --input-file=cppcheck-result.xml --output-file=cppcheck.json
- mkdir -p public/cpp
- mv $CI_COMMIT_REF_NAME public/cpp/
artifacts:
paths:
- public
reports:
codequality: cppcheck.json
static_analysis:python:
stage: static_analysis
tags:
- static_analysis
allow_failure: true
script:
- pip install pylint
- pip install pylint-gitlab
- pylint --rcfile=.pylintrc --exit-zero --output-format=pylint_gitlab.GitlabCodeClimateReporter ${CI_PROJECT_NAME}/ > codeclimate.json
- pylint --rcfile=.pylintrc --exit-zero --output-format=pylint_gitlab.GitlabPagesHtmlReporter ${CI_PROJECT_NAME}/ > pylint.html
- mkdir -p public/python/$CI_COMMIT_REF_NAME
- mv pylint.html public/python/$CI_COMMIT_REF_NAME/
artifacts:
paths:
- public
reports:
codequality: codeclimate.json
\ No newline at end of file
test:ubuntu_cpp:
stage: test
needs: ["build:ubuntu_cpp"]
tags:
- docker
script:
- cd build_cpp
- ctest --output-junit ctest-results.xml --output-on-failure
artifacts:
reports:
junit: build_cpp/ctest-results.xml
test:ubuntu_python:
stage: test
needs: ["build:ubuntu_python"]
tags:
- docker
script:
- source venv/bin/activate
- cd ${CI_PROJECT_NAME}
# Run on discovery all tests located in core/unit_tests/python and discard the stdout
# only to show the errors/warnings and the results of the tests
- python3 -m xmlrunner discover -s unit_tests/ -v -b --output-file xmlrunner-results.xml
artifacts:
reports:
junit: ${CI_PROJECT_NAME}/xmlrunner-results.xml
test:windows_cpp:
stage: test
needs: ["build:windows_cpp"]
tags:
- windows
image: buildtools
before_script:
# Install Chocolatey
- Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Install dependencies
- choco install cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"' -Y
- choco install python -Y
# Update PATH
- $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
script:
- cd build_cpp
- ctest --output-junit ctest-results.xml --output-on-failure
artifacts:
reports:
junit: build_cpp/ctest-results.xml
...@@ -2,10 +2,25 @@ cmake_minimum_required(VERSION 3.15) ...@@ -2,10 +2,25 @@ cmake_minimum_required(VERSION 3.15)
file(STRINGS "${CMAKE_SOURCE_DIR}/version.txt" version) file(STRINGS "${CMAKE_SOURCE_DIR}/version.txt" version)
project(aidge_backend_cpu
VERSION ${version}
DESCRIPTION "CPU implementations of the operators of aidge framework"
LANGUAGES CXX)
message(STATUS "Project name: ${CMAKE_PROJECT_NAME}")
message(STATUS "Project version: ${version}")
add_definitions(-DPROJECT_VERSION="${version}") add_definitions(-DPROJECT_VERSION="${version}")
file(STRINGS "${CMAKE_SOURCE_DIR}/project_name.txt" project)
message(STATUS "Project name: ${project}") execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
message(STATUS "Project name: ${CMAKE_PROJECT_NAME}")
message(STATUS "Project version: ${version}") message(STATUS "Project version: ${version}")
execute_process( execute_process(
...@@ -20,9 +35,9 @@ message(STATUS "Latest git commit: ${GIT_COMMIT_HASH}") ...@@ -20,9 +35,9 @@ message(STATUS "Latest git commit: ${GIT_COMMIT_HASH}")
add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}")
# Note : project name is {project} and python module name is also {project} # Note : project name is {project} and python module name is also {project}
set(module_name _${project}) # target name set(module_name _${CMAKE_PROJECT_NAME}) # target name
project(${project}) project(${CMAKE_PROJECT_NAME})
set(CXX_STANDARD 14) set(CXX_STANDARD 14)
############################################## ##############################################
...@@ -83,14 +98,14 @@ target_include_directories(${module_name} ...@@ -83,14 +98,14 @@ target_include_directories(${module_name}
# PYTHON BINDING # PYTHON BINDING
if (PYBIND) if (PYBIND)
generate_python_binding(${project} ${module_name})
# Handles Python + pybind11 headers dependencies # Handles Python + pybind11 headers dependencies
generate_python_binding(${CMAKE_PROJECT_NAME} ${module_name})
target_link_libraries(${module_name} target_link_libraries(${module_name}
PUBLIC PUBLIC
pybind11::pybind11 pybind11::pybind11
PRIVATE PRIVATE
Python::Python Python::Module
) )
endif() endif()
...@@ -112,9 +127,9 @@ endif() ...@@ -112,9 +127,9 @@ endif()
# Installation instructions # Installation instructions
include(GNUInstallDirs) include(GNUInstallDirs)
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${project}) set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
install(TARGETS ${module_name} EXPORT ${project}-targets install(TARGETS ${module_name} EXPORT ${CMAKE_PROJECT_NAME}-targets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
...@@ -124,8 +139,8 @@ install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) ...@@ -124,8 +139,8 @@ install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
#Export the targets to a script #Export the targets to a script
install(EXPORT ${project}-targets install(EXPORT ${CMAKE_PROJECT_NAME}-targets
FILE "${project}-targets.cmake" FILE "${CMAKE_PROJECT_NAME}-targets.cmake"
DESTINATION ${INSTALL_CONFIGDIR} DESTINATION ${INSTALL_CONFIGDIR}
COMPONENT ${module_name} COMPONENT ${module_name}
) )
...@@ -133,27 +148,27 @@ install(EXPORT ${project}-targets ...@@ -133,27 +148,27 @@ install(EXPORT ${project}-targets
#Create a ConfigVersion.cmake file #Create a ConfigVersion.cmake file
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
write_basic_package_version_file( write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config-version.cmake"
VERSION ${version} VERSION ${version}
COMPATIBILITY AnyNewerVersion COMPATIBILITY AnyNewerVersion
) )
configure_package_config_file("${project}-config.cmake.in" configure_package_config_file("${CMAKE_PROJECT_NAME}-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config.cmake"
INSTALL_DESTINATION ${INSTALL_CONFIGDIR} INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
) )
#Install the config, configversion and custom find modules #Install the config, configversion and custom find modules
install(FILES install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config-version.cmake"
DESTINATION ${INSTALL_CONFIGDIR} DESTINATION ${INSTALL_CONFIGDIR}
) )
############################################## ##############################################
## Exporting from the build tree ## Exporting from the build tree
export(EXPORT ${project}-targets export(EXPORT ${CMAKE_PROJECT_NAME}-targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/${project}-targets.cmake") FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-targets.cmake")
############################################## ##############################################
......
include README.md LICENCE
recursive-include aidge_backend_cpu *.py
recursive-exclude aidge_backend_cpu/unit_tests *.py
recursive-include include *.hpp
recursive-include src *.cpp
recursive-include python_binding *.cpp
include CMakeLists.txt
function(generate_python_binding name target_to_bind) function(generate_python_binding pybind_module_name target_to_bind)
add_definitions(-DPYBIND) add_definitions(-DPYBIND)
Include(FetchContent) Include(FetchContent)
set(PYBIND_VERSION v2.10.4)
set(PYBIND11_FINDPYTHON ON)
message(STATUS "Retrieving pybind ${PYBIND_VERSION} from git")
FetchContent_Declare( FetchContent_Declare(
PyBind11 PyBind11
GIT_REPOSITORY https://github.com/pybind/pybind11.git GIT_REPOSITORY https://github.com/pybind/pybind11.git
GIT_TAG v2.10.4 # or a later release GIT_TAG ${PYBIND_VERSION} # or a later release
) )
# Use the New FindPython mode, recommanded. Requires CMake 3.15+ # Use the New FindPython mode, recommanded. Requires CMake 3.15+
find_package(Python COMPONENTS Interpreter Development) find_package(Python COMPONENTS Interpreter Development.Module)
FetchContent_MakeAvailable(PyBind11) FetchContent_MakeAvailable(PyBind11)
message(STATUS "Creating binding for module ${name}") message(STATUS "Creating binding for module ${pybind_module_name}")
file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp") file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp")
pybind11_add_module(${name} MODULE ${pybind_src_files} "NO_EXTRAS") # NO EXTRA recquired for pip install pybind11_add_module(${pybind_module_name} MODULE ${pybind_src_files} "NO_EXTRAS") # NO EXTRA recquired for pip install
target_include_directories(${name} PUBLIC "python_binding") target_include_directories(${pybind_module_name} PUBLIC "python_binding")
target_link_libraries(${name} PUBLIC ${target_to_bind}) target_link_libraries(${pybind_module_name} PUBLIC ${target_to_bind})
endfunction() endfunction()
[MASTER] [project]
name = "aidge_backend_cpu"
description="CPU implementation of layers for operators of the AIDGE framework"
dependencies = [
"numpy>=1.21.6",
"Jinja2>=3.1.2"
]
requires-python = ">= 3.7"
readme = "README.md"
license = { file = "LICENSE" }
classifiers = [
"Development Status :: 2 - Pre-Alpha",
"Programming Language :: Python :: 3"
]
# dynamic = ["version"] # defined in tool.setuptools_scm
version="1"
[build-system]
requires = [
"setuptools>=64",
"setuptools_scm[toml]==7.1.0",
"cmake>=3.27.9",
"toml"
]
build-backend = "setuptools.build_meta"
#####################################################
# SETUPTOOLS
[tool.setuptools]
[tool.setuptools.packages.find]
where = ["."] # list of folders that contain the packages (["."] by default)
include = ["aidge_backend_cpu*"] # package names should match these glob patterns (["*"] by default)
exclude = ["aidge_backend_cpu.unit_tests*"] # exclude packages matching these glob patterns (empty by default)
namespaces = false # to disable scanning PEP 420 namespaces (true by default)
# # SETUPTOOLS_SCM
# [tool.setuptools_scm]
# write_to = "aidge_backend_cpu/_version.py"
#####################################################
# CIBUILDWHEEL
[tool.cibuildwheel]
build-frontend = "build"
build=["cp38-manylinux_x86_64"]#, "cp39-manylinux_x86_64","cp310-manylinux_x86_64"]
### AIDGE DEPENDENCIES DECLARATION
# aidge_core do not rely on any aidge dependency, hence this string is empty
[tool.cibuildwheel.linux]
before-build = [
"bash .gitlab/ci/cibuildwheel_build_deps_before_build_wheel.sh ${AIDGE_DEPENDENCIES}"
]
[tool.cibuildwheel.linux.environment]
AIDGE_DEPENDENCIES = "" # format => "dep_1 dep_2 ... dep_n"
AIDGE_INSTALL="/AIDGE_INSTALL_CIBUILDWHEEL"
[tool.cibuildwheel.windows]
before-build = [
"powershell -File .\\.gitlab\\ci\\cibuildwheel_build_deps_before_build_wheel.ps1"
]
[tool.cibuildwheel.windows.environment]
AIDGE_DEPENDENCIES = [] # format => "dep_1","dep_2", ... ,"dep_n"
AIDGE_INSTALL="../AIDGE_INSTALL_CIBUILDWHEEL/"
#####################################################
# PYLINT
[tool.pylint.main]
# Analyse import fallback blocks. This can be used to support both Python 2 and 3
# compatible code, which means that the block might have code that exists only in
# one or another interpreter, leading to false positives when analysed.
# analyse-fallback-blocks =
# Clear in-memory caches upon conclusion of linting. Useful if running pylint in
# a server-like mode.
# clear-cache-post-run =
# Always return a 0 (non-error) status code, even if lint errors are found. This
# is primarily useful in continuous integration scripts.
# exit-zero =
# A comma-separated list of package or module names from where C extensions may # A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may # be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code. # run arbitrary code.
extension-pkg-allow-list= aidge_core, aidge_backend_cpu, torch, tensorflow extension-pkg-allow-list = ["aidge_core", "aidge_backend_cpu", "torch", "tensorflow"]
# A comma-separated list of package or module names from where C extensions may # A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may # be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code. (This is an alternative name to extension-pkg-allow-list # run arbitrary code. (This is an alternative name to extension-pkg-allow-list
# for backward compatibility.) # for backward compatibility.)
extension-pkg-whitelist= # extension-pkg-whitelist =
# Return non-zero exit code if any of these messages/categories are detected, # Return non-zero exit code if any of these messages/categories are detected,
# even if score is above --fail-under value. Syntax same as enable. Messages # even if score is above --fail-under value. Syntax same as enable. Messages
# specified are enabled, while categories only check already-enabled messages. # specified are enabled, while categories only check already-enabled messages.
fail-on= # fail-on =
# Specify a score threshold to be exceeded before program exits with error. # Specify a score threshold under which the program will exit with error.
fail-under=0.0 # fail-under =
# Interpret the stdin as a python script, whose filename needs to be passed as
# the module_or_package argument.
# from-stdin =
# Files or directories to be skipped. They should be base names, not paths. # Files or directories to be skipped. They should be base names, not paths.
ignore=CVS ignore = ["CVS"]
# Add files or directories matching the regular expressions patterns to the
# ignore-list. The regex matches against paths and can be in Posix or Windows
# format. Because '\\' represents the directory delimiter on Windows systems, it
# can't be used as an escape character.
# ignore-paths =
# Add files or directories matching the regex patterns to the ignore-list. The # Files or directories matching the regular expression patterns are skipped. The
# regex matches against paths. # regex matches against base names, not paths. The default value ignores Emacs
ignore-paths= # file locks
# ignore-patterns =
# Files or directories matching the regex patterns are skipped. The regex # List of module names for which member attributes should not be checked (useful
# matches against base names, not paths. # for modules/projects where namespaces are manipulated during runtime and thus
ignore-patterns= # existing member attributes cannot be deduced by static analysis). It supports
# qualified module names, as well as Unix pattern matching.
ignored-modules = ["aidge_core", "aidge_backend_cpu"]
# Python code to execute, usually for sys.path manipulation such as # Python code to execute, usually for sys.path manipulation such as
# pygtk.require(). # pygtk.require().
#init-hook= # init-hook =
# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
# number of processors available to use. # number of processors available to use, and will cap the count on Windows to
jobs=1 # avoid hangs.
jobs = 1
# Control the amount of potential inferred values when inferring a single # Control the amount of potential inferred values when inferring a single object.
# object. This can help the performance when dealing with large functions or # This can help the performance when dealing with large functions or complex,
# complex, nested conditions. # nested conditions.
limit-inference-results=100 limit-inference-results = 100
# List of plugins (as comma separated values of python module names) to load, # List of plugins (as comma separated values of python module names) to load,
# usually to register additional checkers. # usually to register additional checkers.
load-plugins= # load-plugins =
# Pickle collected data for later comparisons. # Pickle collected data for later comparisons.
persistent=yes persistent = true
# Minimum Python version to use for version dependent checks. Will default to the
# version used to run pylint.
py-version = "3.11"
# Discover python modules and packages in the file system subtree.
# recursive =
# Add paths to the list of the source roots. Supports globbing patterns. The
# source root is an absolute path or a path relative to the current working
# directory used to determine a package namespace for modules located under the
# source root.
# source-roots =
# When enabled, pylint would attempt to guess common misconfiguration and emit # When enabled, pylint would attempt to guess common misconfiguration and emit
# user-friendly hints instead of false-positive error messages. # user-friendly hints instead of false-positive error messages.
suggestion-mode=yes suggestion-mode = true
# Allow loading of arbitrary C extensions. Extensions are imported into the # Allow loading of arbitrary C extensions. Extensions are imported into the
# active Python interpreter and may run arbitrary code. # active Python interpreter and may run arbitrary code.
unsafe-load-any-extension=no # unsafe-load-any-extension =
[MESSAGES CONTROL]
# Only show warnings with the listed confidence levels. Leave empty to show
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED.
confidence=
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once). You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use "--disable=all --enable=classes
# --disable=W".
disable=print-statement,
parameter-unpacking,
unpacking-in-except,
old-raise-syntax,
backtick,
long-suffix,
old-ne-operator,
old-octal-literal,
import-star-module-level,
non-ascii-bytes-literal,
raw-checker-failed,
bad-inline-option,
locally-disabled,
file-ignored,
suppressed-message,
useless-suppression,
deprecated-pragma,
use-symbolic-message-instead,
apply-builtin,
basestring-builtin,
buffer-builtin,
cmp-builtin,
coerce-builtin,
execfile-builtin,
file-builtin,
long-builtin,
raw_input-builtin,
reduce-builtin,
standarderror-builtin,
unicode-builtin,
xrange-builtin,
coerce-method,
delslice-method,
getslice-method,
setslice-method,
no-absolute-import,
old-division,
dict-iter-method,
dict-view-method,
next-method-called,
metaclass-assignment,
indexing-exception,
raising-string,
reload-builtin,
oct-method,
hex-method,
nonzero-method,
cmp-method,
input-builtin,
round-builtin,
intern-builtin,
unichr-builtin,
map-builtin-not-iterating,
zip-builtin-not-iterating,
range-builtin-not-iterating,
filter-builtin-not-iterating,
using-cmp-argument,
eq-without-hash,
div-method,
idiv-method,
rdiv-method,
exception-message-attribute,
invalid-str-codec,
sys-max-int,
bad-python3-import,
deprecated-string-function,
deprecated-str-translate-call,
deprecated-itertools-function,
deprecated-types-field,
next-method-defined,
dict-items-not-iterating,
dict-keys-not-iterating,
dict-values-not-iterating,
deprecated-operator-function,
deprecated-urllib-function,
xreadlines-attribute,
deprecated-sys-function,
exception-escape,
comprehension-escape,
c-extension-no-member,
too-many-locals,
missing-class-docstring,
missing-function-docstring,
too-many-ancestor,
too-many-arguments,
protected-access,
too-many-branches,
too-many-ancestors,
wrong-import-order,
wrong-import-position,
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once). See also the "--disable" option for examples.
enable=c-extension-no-member
[REPORTS]
# Python expression which should return a score less than or equal to 10. You
# have access to the variables 'error', 'warning', 'refactor', and 'convention'
# which contain the number of messages in each category, as well as 'statement'
# which is the total number of statements analyzed. This score is used by the
# global evaluation report (RP0004).
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
# Template used to display messages. This is a python new-style format string
# used to format the message information. See doc for all details.
#msg-template=
# Set the output format. Available formats are text, parseable, colorized, json
# and msvs (visual studio). You can also give a reporter class, e.g.
# mypackage.mymodule.MyReporterClass.
output-format=text
# Tells whether to display a full report or only the messages.
reports=no
# Activate the evaluation score.
score=yes
[REFACTORING]
# Maximum number of nested blocks for function / method body
max-nested-blocks=5
# Complete name of functions that never returns. When checking for
# inconsistent-return-statements if a never returning function is called then
# it will be considered as an explicit return statement and no message will be
# printed.
never-returning-functions=sys.exit,argparse.parse_error
[BASIC]
[tool.pylint.basic]
# Naming style matching correct argument names. # Naming style matching correct argument names.
argument-naming-style=snake_case argument-naming-style = "snake_case"
# Regular expression matching correct argument names. Overrides argument- # Regular expression matching correct argument names. Overrides argument-naming-
# naming-style. # style. If left empty, argument names will be checked with the set naming style.
#argument-rgx= # argument-rgx =
# Naming style matching correct attribute names. # Naming style matching correct attribute names.
attr-naming-style=snake_case attr-naming-style = "snake_case"
# Regular expression matching correct attribute names. Overrides attr-naming- # Regular expression matching correct attribute names. Overrides attr-naming-
# style. If left empty, attribute names will be checked with the set naming
# style. # style.
#attr-rgx= # attr-rgx =
# Bad variable names which should always be refused, separated by a comma. # Bad variable names which should always be refused, separated by a comma.
bad-names=foo, bad-names = ["foo", "bar", "baz", "toto", "tutu", "tata"]
bar,
baz,
toto,
tutu,
tata
# Bad variable names regexes, separated by a comma. If names match any regex, # Bad variable names regexes, separated by a comma. If names match any regex,
# they will always be refused # they will always be refused
bad-names-rgxs= # bad-names-rgxs =
# Naming style matching correct class attribute names. # Naming style matching correct class attribute names.
class-attribute-naming-style=any class-attribute-naming-style = "any"
# Regular expression matching correct class attribute names. Overrides class- # Regular expression matching correct class attribute names. Overrides class-
# attribute-naming-style. # attribute-naming-style. If left empty, class attribute names will be checked
#class-attribute-rgx= # with the set naming style.
# class-attribute-rgx =
# Naming style matching correct class constant names. # Naming style matching correct class constant names.
class-const-naming-style=UPPER_CASE class-const-naming-style = "UPPER_CASE"
# Regular expression matching correct class constant names. Overrides class- # Regular expression matching correct class constant names. Overrides class-
# const-naming-style. # const-naming-style. If left empty, class constant names will be checked with
#class-const-rgx= # the set naming style.
# class-const-rgx =
# Naming style matching correct class names. # Naming style matching correct class names.
class-naming-style=PascalCase class-naming-style = "PascalCase"
# Regular expression matching correct class names. Overrides class-naming- # Regular expression matching correct class names. Overrides class-naming-style.
# style. # If left empty, class names will be checked with the set naming style.
#class-rgx= # class-rgx =
# Naming style matching correct constant names. # Naming style matching correct constant names.
const-naming-style=UPPER_CASE const-naming-style = "UPPER_CASE"
# Regular expression matching correct constant names. Overrides const-naming- # Regular expression matching correct constant names. Overrides const-naming-
# style. # style. If left empty, constant names will be checked with the set naming style.
#const-rgx= # const-rgx =
# Minimum line length for functions/classes that require docstrings, shorter # Minimum line length for functions/classes that require docstrings, shorter ones
# ones are exempt. # are exempt.
docstring-min-length=-1 docstring-min-length = -1
# Naming style matching correct function names. # Naming style matching correct function names.
function-naming-style=snake_case function-naming-style = "snake_case"
# Regular expression matching correct function names. Overrides function- # Regular expression matching correct function names. Overrides function-naming-
# naming-style. # style. If left empty, function names will be checked with the set naming style.
#function-rgx= # function-rgx =
# Good variable names which should always be accepted, separated by a comma. # Good variable names which should always be accepted, separated by a comma.
good-names=i, good-names = ["i", "j", "k", "ex", "Run", "_"]
j,
k,
ex,
Run,
_,
# Good variable names regexes, separated by a comma. If names match any regex, # Good variable names regexes, separated by a comma. If names match any regex,
# they will always be accepted # they will always be accepted
good-names-rgxs= # good-names-rgxs =
# Include a hint for the correct naming format with invalid-name. # Include a hint for the correct naming format with invalid-name.
include-naming-hint=no # include-naming-hint =
# Naming style matching correct inline iteration names. # Naming style matching correct inline iteration names.
inlinevar-naming-style=any inlinevar-naming-style = "any"
# Regular expression matching correct inline iteration names. Overrides # Regular expression matching correct inline iteration names. Overrides
# inlinevar-naming-style. # inlinevar-naming-style. If left empty, inline iteration names will be checked
#inlinevar-rgx= # with the set naming style.
# inlinevar-rgx =
# Naming style matching correct method names. # Naming style matching correct method names.
method-naming-style=snake_case method-naming-style = "snake_case"
# Regular expression matching correct method names. Overrides method-naming- # Regular expression matching correct method names. Overrides method-naming-
# style. # style. If left empty, method names will be checked with the set naming style.
#method-rgx= # method-rgx =
# Naming style matching correct module names. # Naming style matching correct module names.
module-naming-style=snake_case module-naming-style = "snake_case"
# Regular expression matching correct module names. Overrides module-naming- # Regular expression matching correct module names. Overrides module-naming-
# style. # style. If left empty, module names will be checked with the set naming style.
#module-rgx= # module-rgx =
# Colon-delimited sets of names that determine each other's naming style when # Colon-delimited sets of names that determine each other's naming style when the
# the name regexes allow several styles. # name regexes allow several styles.
name-group= # name-group =
# Regular expression which should only match function or class names that do # Regular expression which should only match function or class names that do not
# not require a docstring. # require a docstring.
no-docstring-rgx=^_ no-docstring-rgx = "^_"
# List of decorators that produce properties, such as abc.abstractproperty. Add # List of decorators that produce properties, such as abc.abstractproperty. Add
# to this list to register other decorators that produce valid properties. # to this list to register other decorators that produce valid properties. These
# These decorators are taken in consideration only for invalid-name. # decorators are taken in consideration only for invalid-name.
property-classes=abc.abstractproperty property-classes = ["abc.abstractproperty"]
# Regular expression matching correct type alias names. If left empty, type alias
# names will be checked with the set naming style.
# typealias-rgx =
# Regular expression matching correct type variable names. If left empty, type
# variable names will be checked with the set naming style.
# typevar-rgx =
# Naming style matching correct variable names. # Naming style matching correct variable names.
variable-naming-style=snake_case variable-naming-style = "snake_case"
# Regular expression matching correct variable names. Overrides variable-naming-
# style. If left empty, variable names will be checked with the set naming style.
# variable-rgx =
[tool.pylint.classes]
# Warn about protected attribute access inside special methods
# check-protected-access-in-special-methods =
# Regular expression matching correct variable names. Overrides variable- # List of method names used to declare (i.e. assign) instance attributes.
# naming-style. defining-attr-methods = ["__init__", "__new__", "setUp", "__post_init__"]
#variable-rgx=
# List of member names, which should be excluded from the protected access
# warning.
exclude-protected = ["_asdict", "_fields", "_replace", "_source", "_make"]
# List of valid names for the first argument in a class method.
valid-classmethod-first-arg = ["cls"]
# List of valid names for the first argument in a metaclass class method.
valid-metaclass-classmethod-first-arg = ["cls"]
[tool.pylint.design]
# List of regular expressions of class ancestor names to ignore when counting
# public methods (see R0903)
# exclude-too-few-public-methods =
# List of qualified class names to ignore when counting class parents (see R0901)
# ignored-parents =
# Maximum number of arguments for function / method.
max-args = 5
# Maximum number of attributes for a class (see R0902).
max-attributes = 7
# Maximum number of boolean expressions in an if statement (see R0916).
max-bool-expr = 5
# Maximum number of branch for function / method body.
max-branches = 12
[FORMAT] # Maximum number of locals for function / method body.
max-locals = 15
# Maximum number of parents for a class (see R0901).
max-parents = 7
# Maximum number of public methods for a class (see R0904).
max-public-methods = 20
# Maximum number of return / yield for function / method body.
max-returns = 6
# Maximum number of statements in function / method body.
max-statements = 50
# Minimum number of public methods for a class (see R0903).
min-public-methods = 2
[tool.pylint.exceptions]
# Exceptions that will emit a warning when caught.
overgeneral-exceptions = ["BaseException", "Exception"]
[tool.pylint.format]
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. # Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
expected-line-ending-format= # expected-line-ending-format =
# Regexp for a line that is allowed to be longer than the limit. # Regexp for a line that is allowed to be longer than the limit.
ignore-long-lines=^\s*(# )?<?https?://\S+>?$ ignore-long-lines = "^\\s*(# )?<?https?://\\S+>?$"
# Number of spaces of indent required inside a hanging or continued line. # Number of spaces of indent required inside a hanging or continued line.
indent-after-paren=4 indent-after-paren = 4
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab). # tab).
indent-string=' ' indent-string = " "
# Maximum number of characters on a single line. # Maximum number of characters on a single line.
max-line-length=200 max-line-length = 200
# Maximum number of lines in a module. # Maximum number of lines in a module.
max-module-lines=1000 max-module-lines = 1000
# Allow the body of a class to be on the same line as the declaration if body # Allow the body of a class to be on the same line as the declaration if body
# contains single statement. # contains single statement.
single-line-class-stmt=no # single-line-class-stmt =
# Allow the body of an if to be on the same line as the test if there is no else.
# single-line-if-stmt =
# Allow the body of an if to be on the same line as the test if there is no [tool.pylint.imports]
# else. # List of modules that can be imported at any level, not just the top level one.
single-line-if-stmt=no # allow-any-import-level =
# Allow explicit reexports by alias from a package __init__.
# allow-reexport-from-package =
[LOGGING] # Allow wildcard imports from modules that define __all__.
# allow-wildcard-with-all =
# Deprecated modules which should not be used, separated by a comma.
# deprecated-modules =
# Output a graph (.gv or any supported image format) of external dependencies to
# the given file (report RP0402 must not be disabled).
# ext-import-graph =
# Output a graph (.gv or any supported image format) of all (i.e. internal and
# external) dependencies to the given file (report RP0402 must not be disabled).
# import-graph =
# Output a graph (.gv or any supported image format) of internal dependencies to
# the given file (report RP0402 must not be disabled).
# int-import-graph =
# Force import order to recognize a module as part of the standard compatibility
# libraries.
# known-standard-library =
# Force import order to recognize a module as part of a third party library.
known-third-party = ["enchant"]
# Couples of modules and preferred modules, separated by a comma.
# preferred-modules =
[tool.pylint.logging]
# The type of string formatting that logging methods do. `old` means using % # The type of string formatting that logging methods do. `old` means using %
# formatting, `new` is for `{}` formatting. # formatting, `new` is for `{}` formatting.
logging-format-style=old logging-format-style = "old"
# Logging modules to check that the string format arguments are in logging # Logging modules to check that the string format arguments are in logging
# function parameter format. # function parameter format.
logging-modules=logging logging-modules = ["logging"]
[tool.pylint."messages control"]
# Only show warnings with the listed confidence levels. Leave empty to show all.
# Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, UNDEFINED.
confidence = ["HIGH", "CONTROL_FLOW", "INFERENCE", "INFERENCE_FAILURE", "UNDEFINED"]
# Disable the message, report, category or checker with the given id(s). You can
# either give multiple identifiers separated by comma (,) or put this option
# multiple times (only on the command line, not in the configuration file where
# it should appear only once). You can also use "--disable=all" to disable
# everything first and then re-enable specific checks. For example, if you want
# to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use "--disable=all --enable=classes
# --disable=W".
disable = ["raw-checker-failed", "bad-inline-option", "locally-disabled", "file-ignored", "suppressed-message", "useless-suppression", "deprecated-pragma", "use-symbolic-message-instead", "use-implicit-booleaness-not-comparison-to-string", "use-implicit-booleaness-not-comparison-to-zero", "too-many-locals", "missing-class-docstring", "missing-function-docstring", "too-many-arguments", "protected-access", "too-many-branches", "too-many-ancestors", "wrong-import-order", "wrong-import-position"]
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where it
# should appear only once). See also the "--disable" option for examples.
enable = ["c-extension-no-member"]
[MISCELLANEOUS] [tool.pylint.method_args]
# List of qualified names (i.e., library.method) which require a timeout
# parameter e.g. 'requests.api.get,requests.api.post'
timeout-methods = ["requests.api.delete", "requests.api.get", "requests.api.head", "requests.api.options", "requests.api.patch", "requests.api.post", "requests.api.put", "requests.api.request"]
[tool.pylint.miscellaneous]
# List of note tags to take in consideration, separated by a comma. # List of note tags to take in consideration, separated by a comma.
notes=FIXME, notes = ["FIXME", "XXX", "TODO"]
XXX,
TODO
# Regular expression of note tags to take in consideration. # Regular expression of note tags to take in consideration.
#notes-rgx= # notes-rgx =
[tool.pylint.refactoring]
# Maximum number of nested blocks for function / method body
max-nested-blocks = 5
# Complete name of functions that never returns. When checking for inconsistent-
# return-statements if a never returning function is called then it will be
# considered as an explicit return statement and no message will be printed.
never-returning-functions = ["sys.exit", "argparse.parse_error"]
# Let 'consider-using-join' be raised when the separator to join on would be non-
# empty (resulting in expected fixes of the type: ``"- " + " - ".join(items)``)
suggest-join-with-non-empty-separator = true
[tool.pylint.reports]
# Python expression which should return a score less than or equal to 10. You
# have access to the variables 'fatal', 'error', 'warning', 'refactor',
# 'convention', and 'info' which contain the number of messages in each category,
# as well as 'statement' which is the total number of statements analyzed. This
# score is used by the global evaluation report (RP0004).
evaluation = "10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)"
# Template used to display messages. This is a python new-style format string
# used to format the message information. See doc for all details.
# msg-template =
# Set the output format. Available formats are: text, parseable, colorized, json2
# (improved json format), json (old json format) and msvs (visual studio). You
# can also give a reporter class, e.g. mypackage.mymodule.MyReporterClass.
# output-format =
# Tells whether to display a full report or only the messages.
# reports =
[SIMILARITIES] # Activate the evaluation score.
score = true
[tool.pylint.similarities]
# Comments are removed from the similarity computation # Comments are removed from the similarity computation
ignore-comments=yes ignore-comments = true
# Docstrings are removed from the similarity computation # Docstrings are removed from the similarity computation
ignore-docstrings=yes ignore-docstrings = true
# Imports are removed from the similarity computation # Imports are removed from the similarity computation
ignore-imports=no # ignore-imports =
# Signatures are removed from the similarity computation # Signatures are removed from the similarity computation
ignore-signatures=no # ignore-signatures =
# Minimum lines number of a similarity. # Minimum lines number of a similarity.
min-similarity-lines=4 min-similarity-lines = 4
[SPELLING]
[tool.pylint.spelling]
# Limits count of emitted suggestions for spelling mistakes. # Limits count of emitted suggestions for spelling mistakes.
max-spelling-suggestions=4 max-spelling-suggestions = 4
# Spelling dictionary name. Available dictionaries: none. To make it work, # Spelling dictionary name. No available dictionaries : You need to install both
# install the 'python-enchant' package. # the python package and the system dependency for enchant to work.
spelling-dict= # spelling-dict =
# List of comma separated words that should be considered directives if they # List of comma separated words that should be considered directives if they
# appear and the beginning of a comment and should not be checked. # appear at the beginning of a comment and should not be checked.
spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: spelling-ignore-comment-directives = "fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:"
# List of comma separated words that should not be checked. # List of comma separated words that should not be checked.
spelling-ignore-words= # spelling-ignore-words =
# A path to a file that contains the private dictionary; one word per line. # A path to a file that contains the private dictionary; one word per line.
spelling-private-dict-file= # spelling-private-dict-file =
# Tells whether to store unknown words to the private dictionary (see the # Tells whether to store unknown words to the private dictionary (see the
# --spelling-private-dict-file option) instead of raising a message. # --spelling-private-dict-file option) instead of raising a message.
spelling-store-unknown-words=no # spelling-store-unknown-words =
[STRING]
# This flag controls whether inconsistent-quotes generates a warning when the
# character used as a quote delimiter is used inconsistently within a module.
check-quote-consistency=no
# This flag controls whether the implicit-str-concat should generate a warning
# on implicit string concatenation in sequences defined over several lines.
check-str-concat-over-line-jumps=no
[TYPECHECK]
[tool.pylint.typecheck]
# List of decorators that produce context managers, such as # List of decorators that produce context managers, such as
# contextlib.contextmanager. Add to this list to register other decorators that # contextlib.contextmanager. Add to this list to register other decorators that
# produce valid context managers. # produce valid context managers.
contextmanager-decorators=contextlib.contextmanager contextmanager-decorators = ["contextlib.contextmanager"]
# List of members which are set dynamically and missed by pylint inference # List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular # system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted. # expressions are accepted.
generated-members= # generated-members =
# Tells whether missing members accessed in mixin class should be ignored. A # Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive). # class is considered mixin if its name matches the mixin-class-rgx option.
ignore-mixin-members=yes # Tells whether to warn about missing members when the owner of the attribute is
# inferred to be None.
# Tells whether to warn about missing members when the owner of the attribute ignore-none = true
# is inferred to be None.
ignore-none=yes
# This flag controls whether pylint should warn about no-member and similar # This flag controls whether pylint should warn about no-member and similar
# checks whenever an opaque object is returned when inferring. The inference # checks whenever an opaque object is returned when inferring. The inference can
# can return multiple potential results while evaluating a Python object, but # return multiple potential results while evaluating a Python object, but some
# some branches might not be evaluated, which results in partial inference. In # branches might not be evaluated, which results in partial inference. In that
# that case, it might be useful to still emit no-member and other checks for # case, it might be useful to still emit no-member and other checks for the rest
# the rest of the inferred objects. # of the inferred objects.
ignore-on-opaque-inference=yes ignore-on-opaque-inference = true
# List of symbolic message names to ignore for Mixin members.
ignored-checks-for-mixins = ["no-member", "not-async-context-manager", "not-context-manager", "attribute-defined-outside-init"]
# List of class names for which member attributes should not be checked (useful # List of class names for which member attributes should not be checked (useful
# for classes with dynamically set attributes). This supports the use of # for classes with dynamically set attributes). This supports the use of
# qualified names. # qualified names.
ignored-classes=optparse.Values, ignored-classes = ["optparse.Values", "thread._local", "_thread._local", "aidge.global_variables", "aidge.cells.abstract_cell.Trainable", "torch", "tensorflow"]
thread._local,
_thread._local, # Show a hint with possible names when a member name was not found. The aspect of
aidge.global_variables, # finding the hint is based on edit distance.
aidge.cells.abstract_cell.Trainable, missing-member-hint = true
torch,
tensorflow,
# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis). It
# supports qualified module names, as well as Unix pattern matching.
ignored-modules= aidge_core, aidge_backend_cpu
# Show a hint with possible names when a member name was not found. The aspect
# of finding the hint is based on edit distance.
missing-member-hint=yes
# The minimum edit distance a name should have in order to be considered a # The minimum edit distance a name should have in order to be considered a
# similar match for a missing member name. # similar match for a missing member name.
missing-member-hint-distance=1 missing-member-hint-distance = 1
# The total number of similar names that should be taken in consideration when # The total number of similar names that should be taken in consideration when
# showing a hint for a missing member. # showing a hint for a missing member.
missing-member-max-choices=1 missing-member-max-choices = 1
# List of decorators that change the signature of a decorated function. # Regex pattern to define which classes are considered mixins.
signature-mutators= mixin-class-rgx = ".*[Mm]ixin"
# List of decorators that change the signature of a decorated function.
# signature-mutators =
[VARIABLES] [tool.pylint.variables]
# List of additional names supposed to be defined in builtins. Remember that you
# List of additional names supposed to be defined in builtins. Remember that # should avoid defining new builtins when possible.
# you should avoid defining new builtins when possible. # additional-builtins =
additional-builtins=
# Tells whether unused global variables should be treated as a violation. # Tells whether unused global variables should be treated as a violation.
allow-global-unused-variables=yes allow-global-unused-variables = true
# List of names allowed to shadow builtins # List of names allowed to shadow builtins
allowed-redefined-builtins= # allowed-redefined-builtins =
# List of strings which can identify a callback function by name. A callback # List of strings which can identify a callback function by name. A callback name
# name must start or end with one of those strings. # must start or end with one of those strings.
callbacks=cb_, callbacks = ["cb_", "_cb"]
_cb
# A regular expression matching the name of dummy variables (i.e. expected to # A regular expression matching the name of dummy variables (i.e. expected to not
# not be used). # be used).
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ dummy-variables-rgx = "_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_"
# Argument names that match this expression will be ignored. Default to name # Argument names that match this expression will be ignored.
# with leading underscore. ignored-argument-names = "_.*|^ignored_|^unused_"
ignored-argument-names=_.*|^ignored_|^unused_
# Tells whether we should check for unused import in __init__ files. # Tells whether we should check for unused import in __init__ files.
init-import=no # init-import =
# List of qualified module names which can have objects that can redefine # List of qualified module names which can have objects that can redefine
# builtins. # builtins.
redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io redefining-builtins-modules = ["six.moves", "past.builtins", "future.builtins", "builtins", "io"]
[CLASSES]
# Warn about protected attribute access inside special methods
check-protected-access-in-special-methods=no
# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods=__init__,
__new__,
setUp,
__post_init__
# List of member names, which should be excluded from the protected access
# warning.
exclude-protected=_asdict,
_fields,
_replace,
_source,
_make
# List of valid names for the first argument in a class method.
valid-classmethod-first-arg=cls
# List of valid names for the first argument in a metaclass class method.
valid-metaclass-classmethod-first-arg=cls
[DESIGN]
# List of qualified class names to ignore when countint class parents (see
# R0901)
ignored-parents=
# Maximum number of arguments for function / method.
max-args=5
# Maximum number of attributes for a class (see R0902).
max-attributes=7
# Maximum number of boolean expressions in an if statement (see R0916).
max-bool-expr=5
# Maximum number of branch for function / method body.
max-branches=12
# Maximum number of locals for function / method body.
max-locals=15
# Maximum number of parents for a class (see R0901).
max-parents=7
# Maximum number of public methods for a class (see R0904).
max-public-methods=20
# Maximum number of return / yield for function / method body.
max-returns=6
# Maximum number of statements in function / method body.
max-statements=50
# Minimum number of public methods for a class (see R0903).
min-public-methods=2
[IMPORTS]
# List of modules that can be imported at any level, not just the top level
# one.
allow-any-import-level=
# Allow wildcard imports from modules that define __all__.
allow-wildcard-with-all=no
# Analyse import fallback blocks. This can be used to support both Python 2 and
# 3 compatible code, which means that the block might have code that exists
# only in one or another interpreter, leading to false positives when analysed.
analyse-fallback-blocks=no
# Deprecated modules which should not be used, separated by a comma.
deprecated-modules=
# Output a graph (.gv or any supported image format) of external dependencies
# to the given file (report RP0402 must not be disabled).
ext-import-graph=
# Output a graph (.gv or any supported image format) of all (i.e. internal and
# external) dependencies to the given file (report RP0402 must not be
# disabled).
import-graph=
# Output a graph (.gv or any supported image format) of internal dependencies
# to the given file (report RP0402 must not be disabled).
int-import-graph=
# Force import order to recognize a module as part of the standard
# compatibility libraries.
known-standard-library=
# Force import order to recognize a module as part of a third party library.
known-third-party=enchant
# Couples of modules and preferred modules, separated by a comma.
preferred-modules=
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "BaseException, Exception".
overgeneral-exceptions=BaseException,
Exception
\ No newline at end of file
#!/usr/bin/env python3 #!/usr/bin/env python3
""" Aidge
#TODO To change
POC of the next framework named Aidge
"""
DOCLINES = (__doc__ or '').split("\n")
import sys import sys
import os import os
# Python supported version checks
if sys.version_info[:2] < (3, 7):
raise RuntimeError("Python version >= 3.7 required.")
CLASSIFIERS = """\
Development Status :: 2 - Pre-Alpha
"""
import shutil import shutil
import pathlib import pathlib
import subprocess
import multiprocessing import multiprocessing
import toml
from math import ceil from math import ceil
from setuptools import setup, Extension from setuptools import setup, Extension
from setuptools import find_packages
from setuptools.command.build_ext import build_ext from setuptools.command.build_ext import build_ext
def get_project_name() -> str:
return open(pathlib.Path().absolute() / "project_name.txt", "r").read()
def get_project_version() -> str: def get_project_name() -> str:
aidge_root = pathlib.Path().absolute() with open(pathlib.Path().absolute() / "pyproject.toml", "r") as file:
version = open(aidge_root / "version.txt", "r").read().strip() project_toml = toml.load(file)
return version return project_toml["project"]["name"]
class CMakeExtension(Extension): class CMakeExtension(Extension):
def __init__(self, name): def __init__(self, name):
super().__init__(name, sources=[]) super().__init__(name, sources=[])
class CMakeBuild(build_ext):
class CMakeBuild(build_ext):
def run(self): def run(self):
# This lists the number of processors available on the machine # This lists the number of processors available on the machine
# The compilation will use half of them # The compilation will use half of them
...@@ -62,17 +44,29 @@ class CMakeBuild(build_ext): ...@@ -62,17 +44,29 @@ class CMakeBuild(build_ext):
os.chdir(str(build_temp)) os.chdir(str(build_temp))
# Impose to use the executable of the python compile_type = "Debug"
# used to launch setup.py to setup PythonInterp install_path = (
param_py = "-DPYTHON_EXECUTABLE=" + sys.executable os.path.join(sys.prefix, "lib", "libAidge")
if "AIDGE_INSTALL" not in os.environ
compile_type = 'Debug' else os.environ["AIDGE_INSTALL"]
install_path = os.path.join(sys.prefix, "lib", "libAidge") if "AIDGE_INSTALL" not in os.environ else os.environ["AIDGE_INSTALL"] )
self.spawn(['cmake', str(cwd), param_py, '-DTEST=OFF', f'-DCMAKE_INSTALL_PREFIX:PATH={install_path}', f'-DCMAKE_BUILD_TYPE={compile_type}']) self.spawn(
[
"cmake",
str(cwd),
"-DPYTHON_EXECUTABLE={sys.executable}",
"-DTEST=OFF",
"-DPYBIND=ON",
f"-DCMAKE_INSTALL_PREFIX:PATH={install_path}",
f"-DCMAKE_BUILD_TYPE={compile_type}",
]
)
if not self.dry_run: if not self.dry_run:
self.spawn(['cmake', '--build', '.', '--config', compile_type, '-j', max_jobs]) self.spawn(
self.spawn(['cmake', '--install', '.', '--config', compile_type]) ["cmake", "--build", ".", "--config", compile_type, "-j", max_jobs]
)
self.spawn(["cmake", "--install", ".", "--config", compile_type])
os.chdir(str(cwd)) os.chdir(str(cwd))
aidge_package = build_lib / (get_project_name()) aidge_package = build_lib / (get_project_name())
...@@ -83,8 +77,10 @@ class CMakeBuild(build_ext): ...@@ -83,8 +77,10 @@ class CMakeBuild(build_ext):
# Copy all shared object files from build_temp/lib to aidge_package # Copy all shared object files from build_temp/lib to aidge_package
for root, _, files in os.walk(build_temp.absolute()): for root, _, files in os.walk(build_temp.absolute()):
for file in files: for file in files:
if (file.endswith('.so') or file.endswith('.pyd')) and (root != str(aidge_package.absolute())): if (file.endswith(".so") or file.endswith(".pyd")) and (
currentFile=os.path.join(root, file) root != str(aidge_package.absolute())
):
currentFile = os.path.join(root, file)
shutil.copy(currentFile, str(aidge_package.absolute())) shutil.copy(currentFile, str(aidge_package.absolute()))
# Copy version.txt in aidge_package # Copy version.txt in aidge_package
...@@ -92,23 +88,13 @@ class CMakeBuild(build_ext): ...@@ -92,23 +88,13 @@ class CMakeBuild(build_ext):
shutil.copy("version.txt", str(aidge_package.absolute())) shutil.copy("version.txt", str(aidge_package.absolute()))
if __name__ == '__main__': if __name__ == "__main__":
setup( setup(
name=get_project_name(),
version=get_project_version(),
python_requires='>=3.7',
description=DOCLINES[0],
long_description_content_type="text/markdown",
long_description="\n".join(DOCLINES[2:]),
classifiers=[c for c in CLASSIFIERS.split('\n') if c],
packages=find_packages(where="."),
include_package_data=True, include_package_data=True,
ext_modules=[CMakeExtension(get_project_name())], ext_modules=[CMakeExtension(get_project_name())],
cmdclass={ cmdclass={
'build_ext': CMakeBuild, "build_ext": CMakeBuild,
}, },
install_requires=['aidge_core'], install_requires=["aidge_core"],
zip_safe=False, zip_safe=False,
) )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment