Compare commits

..

3 Commits

5 changed files with 41 additions and 54 deletions

View File

@@ -9,17 +9,14 @@ BayesNet is a C++ library implementing Bayesian Network Classifiers. It provides
## Build System & Dependencies ## Build System & Dependencies
### Dependency Management ### Dependency Management
The project supports **two package managers**: The project supports **two package managers**:
#### vcpkg (Default) #### vcpkg (Default)
- Uses vcpkg with private registry at https://github.com/rmontanana/vcpkg-stash
- Uses vcpkg with private registry at <https://github.com/rmontanana/vcpkg-stash>
- Core dependencies: libtorch, nlohmann-json, folding, fimdlp, arff-files, catch2 - Core dependencies: libtorch, nlohmann-json, folding, fimdlp, arff-files, catch2
- All dependencies defined in `vcpkg.json` with version overrides - All dependencies defined in `vcpkg.json` with version overrides
#### Conan (Alternative) #### Conan (Alternative)
- Modern C++ package manager with better dependency resolution - Modern C++ package manager with better dependency resolution
- Configured via `conanfile.py` for packaging and distribution - Configured via `conanfile.py` for packaging and distribution
- Supports subset of dependencies (libtorch, nlohmann-json, catch2) - Supports subset of dependencies (libtorch, nlohmann-json, catch2)
@@ -28,7 +25,6 @@ The project supports **two package managers**:
### Build Commands ### Build Commands
#### Using vcpkg (Default) #### Using vcpkg (Default)
```bash ```bash
# Initialize dependencies # Initialize dependencies
make init make init
@@ -53,7 +49,6 @@ make clean
``` ```
#### Using Conan #### Using Conan
```bash ```bash
# Install Conan first: pip install conan # Install Conan first: pip install conan
@@ -79,7 +74,6 @@ make conan-clean
``` ```
### CMake Configuration ### CMake Configuration
- Uses CMake 3.27+ with C++17 standard - Uses CMake 3.27+ with C++17 standard
- Debug builds automatically enable testing and coverage - Debug builds automatically enable testing and coverage
- Release builds optimize with `-Ofast` - Release builds optimize with `-Ofast`
@@ -95,7 +89,6 @@ make conan-clean
- Coverage reporting with lcov/genhtml - Coverage reporting with lcov/genhtml
### Test Categories ### Test Categories
- A2DE, BoostA2DE, BoostAODE, XSPODE, XSPnDE, XBAODE, XBA2DE - A2DE, BoostA2DE, BoostAODE, XSPODE, XSPnDE, XBAODE, XBA2DE
- Classifier, Ensemble, FeatureSelection, Metrics, Models - Classifier, Ensemble, FeatureSelection, Metrics, Models
- Network, Node, MST, Modules - Network, Node, MST, Modules
@@ -103,7 +96,6 @@ make conan-clean
## Code Architecture ## Code Architecture
### Core Structure ### Core Structure
``` ```
bayesnet/ bayesnet/
├── BaseClassifier.h # Abstract base for all classifiers ├── BaseClassifier.h # Abstract base for all classifiers
@@ -115,14 +107,12 @@ bayesnet/
``` ```
### Key Design Patterns ### Key Design Patterns
- **BaseClassifier** abstract interface for all algorithms - **BaseClassifier** abstract interface for all algorithms
- Template-based design with both std::vector and torch::Tensor support - Template-based design with both std::vector and torch::Tensor support
- Network/Node abstraction for Bayesian network representation - Network/Node abstraction for Bayesian network representation
- Feature selection as separate, composable modules - Feature selection as separate, composable modules
### Data Handling ### Data Handling
- Supports both discrete integer data and continuous data with discretization - Supports both discrete integer data and continuous data with discretization
- ARFF file format support through arff-files library - ARFF file format support through arff-files library
- Tensor operations via PyTorch C++ (libtorch) - Tensor operations via PyTorch C++ (libtorch)
@@ -138,7 +128,6 @@ bayesnet/
## Sample Applications ## Sample Applications
Sample code in `sample/` directory demonstrates library usage: Sample code in `sample/` directory demonstrates library usage:
```bash ```bash
make sample fname=tests/data/iris.arff model=TANLd make sample fname=tests/data/iris.arff model=TANLd
``` ```
@@ -146,7 +135,6 @@ make sample fname=tests/data/iris.arff model=TANLd
## Package Distribution ## Package Distribution
### Creating Conan Packages ### Creating Conan Packages
```bash ```bash
# Create package locally # Create package locally
make conan-create make conan-create
@@ -160,9 +148,7 @@ make conan-upload remote=myremote profile=myprofile
``` ```
### Using the Library ### Using the Library
With Conan: With Conan:
```python ```python
# conanfile.txt or conanfile.py # conanfile.txt or conanfile.py
[requires] [requires]
@@ -173,7 +159,6 @@ cmake
``` ```
With vcpkg: With vcpkg:
```json ```json
{ {
"dependencies": ["bayesnet"] "dependencies": ["bayesnet"]
@@ -185,7 +170,7 @@ With vcpkg:
- **Add new classifier**: Extend BaseClassifier, implement in appropriate subdirectory - **Add new classifier**: Extend BaseClassifier, implement in appropriate subdirectory
- **Add new test**: Update `tests/CMakeLists.txt` and create test in `tests/` - **Add new test**: Update `tests/CMakeLists.txt` and create test in `tests/`
- **Modify build**: Edit main `CMakeLists.txt` or use Makefile targets - **Modify build**: Edit main `CMakeLists.txt` or use Makefile targets
- **Update dependencies**: - **Update dependencies**:
- vcpkg: Modify `vcpkg.json` and run `make init` - vcpkg: Modify `vcpkg.json` and run `make init`
- Conan: Modify `conanfile.py` and run `make conan-init` - Conan: Modify `conanfile.py` and run `make conan-init`
- **Package for distribution**: Use `make conan-create` for Conan packaging - **Package for distribution**: Use `make conan-create` for Conan packaging

View File

@@ -18,7 +18,8 @@ set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -fno-elide-constructors")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-default-inline") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-default-inline")
endif() endif()
@@ -67,19 +68,18 @@ target_link_libraries(bayesnet
# ------- # -------
if (CMAKE_BUILD_TYPE STREQUAL "Debug") if (CMAKE_BUILD_TYPE STREQUAL "Debug")
MESSAGE("Debug mode") MESSAGE("Debug mode")
else(CMAKE_BUILD_TYPE STREQUAL "Debug") set(ENABLE_TESTING ON)
MESSAGE("Release mode") set(CODE_COVERAGE ON)
endif (CMAKE_BUILD_TYPE STREQUAL "Debug") endif (CMAKE_BUILD_TYPE STREQUAL "Debug")
if (ENABLE_TESTING) if (ENABLE_TESTING)
MESSAGE(STATUS "Testing enabled") MESSAGE(STATUS "Testing enabled")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage -fno-elide-constructors")
find_package(Catch2 CONFIG REQUIRED) find_package(Catch2 CONFIG REQUIRED)
find_package(arff-files CONFIG REQUIRED) find_package(arff-files CONFIG REQUIRED)
enable_testing() enable_testing()
include(CTest) include(CTest)
add_subdirectory(tests) add_subdirectory(tests)
else(ENABLE_TESTING) else(ENABLE_TESTING)
message("Release mode")
endif (ENABLE_TESTING) endif (ENABLE_TESTING)
# Installation # Installation
@@ -99,14 +99,17 @@ configure_package_config_file(
install(TARGETS bayesnet install(TARGETS bayesnet
EXPORT bayesnetTargets EXPORT bayesnetTargets
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib) LIBRARY DESTINATION lib
CONFIGURATIONS Release)
install(DIRECTORY bayesnet/ install(DIRECTORY bayesnet/
DESTINATION include/bayesnet DESTINATION include/bayesnet
FILES_MATCHING FILES_MATCHING
CONFIGURATIONS Release
PATTERN "*.h") PATTERN "*.h")
install(FILES ${CMAKE_BINARY_DIR}/configured_files/include/bayesnet/config.h install(FILES ${CMAKE_BINARY_DIR}/configured_files/include/bayesnet/config.h
DESTINATION include/bayesnet) DESTINATION include/bayesnet
CONFIGURATIONS Release)
install(EXPORT bayesnetTargets install(EXPORT bayesnetTargets
FILE bayesnetTargets.cmake FILE bayesnetTargets.cmake

View File

@@ -16,28 +16,29 @@ conan profile new default --detect
1. Create a `conanfile.txt` in your project: 1. Create a `conanfile.txt` in your project:
```ini ```ini
[requires] [requires]
libtorch/2.7.0 libtorch/2.7.0
bayesnet/1.2.0 bayesnet/1.2.0
[generators] [generators]
CMakeDeps CMakeDeps
CMakeToolchain CMakeToolchain
```
1. Install dependencies: ```
```bash 2. Install dependencies:
conan install . --build=missing
```
1. In your CMakeLists.txt: ```bash
conan install . --build=missing
```
```cmake 3. In your CMakeLists.txt:
find_package(bayesnet REQUIRED)
target_link_libraries(your_target bayesnet::bayesnet) ```cmake
``` find_package(bayesnet REQUIRED)
target_link_libraries(your_target bayesnet::bayesnet)
```
### Building BayesNet with Conan ### Building BayesNet with Conan
@@ -68,8 +69,8 @@ make conan-create
For the custom dependencies, you'll need to create Conan recipes: For the custom dependencies, you'll need to create Conan recipes:
1. **folding**: Cross-validation library 1. **folding**: Cross-validation library
1. **fimdlp**: Discretization library 2. **fimdlp**: Discretization library
1. **arff-files**: ARFF file format parser 3. **arff-files**: ARFF file format parser
Contact the maintainer or create custom recipes for these packages. Contact the maintainer or create custom recipes for these packages.

View File

@@ -1,6 +1,6 @@
SHELL := /bin/bash SHELL := /bin/bash
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
.PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean updatebadge doc doc-install init clean-test conan-debug conan-release conan-create conan-upload conan-clean conan-sample .PHONY: viewcoverage coverage setup help install uninstall diagrams buildr buildd test clean updatebadge doc doc-install init clean-test debug release conan-create conan-upload conan-clean sample
f_release = build_Release f_release = build_Release
f_debug = build_Debug f_debug = build_Debug
@@ -196,8 +196,7 @@ debug: ## Build debug version using Conan
@conan install . \ @conan install . \
-s build_type=Debug \ -s build_type=Debug \
--build=missing \ --build=missing \
-of $(f_debug) \ -of $(f_debug)
--profile=debug
@cmake -S . -B $(f_debug) \ @cmake -S . -B $(f_debug) \
-DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_BUILD_TYPE=Debug \
-DENABLE_TESTING=ON \ -DENABLE_TESTING=ON \
@@ -210,8 +209,7 @@ release: ## Build release version using Conan
@conan install . \ @conan install . \
-s build_type=Release \ -s build_type=Release \
--build=missing \ --build=missing \
-of $(f_debug) \ -of $(f_debug)
--profile=release
@if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi @if [ -d ./$(f_release) ]; then rm -rf ./$(f_release); fi
@mkdir $(f_release) @mkdir $(f_release)
@conan install . -s build_type=Release --build=missing -of $(f_release) @conan install . -s build_type=Release --build=missing -of $(f_release)
@@ -220,8 +218,8 @@ release: ## Build release version using Conan
conan-create: ## Create Conan package conan-create: ## Create Conan package
@echo ">>> Creating Conan package..." @echo ">>> Creating Conan package..."
@conan create . --build=missing -tf "" --profile=release @conan create . --build=missing -tf "" --profile=release -tf ""
@conan create . --build=missing -tf "" --profile=debug -o "&:enable_coverage=False" -o "&:enable_testing=False" @conan create . --build=missing -tf "" --profile=debug
@echo ">>> Done" @echo ">>> Done"
profile ?= release profile ?= release

View File

@@ -18,7 +18,7 @@ class BayesNetConan(ConanFile):
"enable_testing": False, "enable_testing": False,
"enable_coverage": False "enable_coverage": False
} }
# Sources are located in the same place as this recipe, copy them to the recipe # Sources are located in the same place as this recipe, copy them to the recipe
exports_sources = "CMakeLists.txt", "bayesnet/*", "config/*", "cmake/*", "docs/*", "tests/*", "bayesnetConfig.cmake.in" exports_sources = "CMakeLists.txt", "bayesnet/*", "config/*", "cmake/*", "docs/*", "tests/*", "bayesnetConfig.cmake.in"
@@ -35,7 +35,7 @@ class BayesNetConan(ConanFile):
self.version = match.group(1) self.version = match.group(1)
else: else:
raise Exception("Version not found in CMakeLists.txt") raise Exception("Version not found in CMakeLists.txt")
self.version = match.group(1) self.version = match.group(1)
def config_options(self): def config_options(self):
if self.settings.os == "Windows": if self.settings.os == "Windows":
@@ -50,7 +50,7 @@ class BayesNetConan(ConanFile):
self.requires("libtorch/2.7.0") self.requires("libtorch/2.7.0")
self.requires("nlohmann_json/3.11.3") self.requires("nlohmann_json/3.11.3")
self.requires("folding/1.1.1") # Custom package self.requires("folding/1.1.1") # Custom package
self.requires("fimdlp/2.1.0") # Custom package self.requires("fimdlp/2.1.0") # Custom package
def build_requirements(self): def build_requirements(self):
self.build_requires("cmake/[>=3.27]") self.build_requires("cmake/[>=3.27]")