325 lines
21 KiB
HTML
325 lines
21 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
|
<meta name="generator" content="Doxygen 1.9.8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>SVM Classifier C++: SVM Classifier C++</title>
|
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="jquery.js"></script>
|
|
<script type="text/javascript" src="dynsections.js"></script>
|
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
<script type="text/javascript" src="search/search.js"></script>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr id="projectrow">
|
|
<td id="projectalign">
|
|
<div id="projectname">SVM Classifier C++<span id="projectnumber"> 1.0.0</span>
|
|
</div>
|
|
<div id="projectbrief">High-performance Support Vector Machine classifier with scikit-learn compatible API</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.9.8 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
|
var searchBox = new SearchBox("searchBox", "search/",'.html');
|
|
/* @license-end */
|
|
</script>
|
|
<script type="text/javascript" src="menudata.js"></script>
|
|
<script type="text/javascript" src="menu.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */
|
|
</script>
|
|
<div id="main-nav"></div>
|
|
</div><!-- top -->
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<div id="MSearchResults">
|
|
<div class="SRPage">
|
|
<div id="SRIndex">
|
|
<div id="SRResults"></div>
|
|
<div class="SRStatus" id="Loading">Loading...</div>
|
|
<div class="SRStatus" id="Searching">Searching...</div>
|
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div><div class="header">
|
|
<div class="headertitle"><div class="title">SVM Classifier C++ </div></div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="textblock"><p><a class="anchor" id="md_README"></a> A high-performance Support Vector Machine classifier implementation in C++ with a scikit-learn compatible API. This library provides a unified interface for SVM classification using both liblinear (for linear kernels) and libsvm (for non-linear kernels), with support for multiclass classification and PyTorch tensor integration.</p>
|
|
<h1>Features</h1>
|
|
<ul>
|
|
<li><b>🚀 Scikit-learn Compatible API</b>: Familiar <code>fit()</code>, <code>predict()</code>, <code>predict_proba()</code>, <code>score()</code> methods</li>
|
|
<li><b>🔧 Multiple Kernels</b>: Linear, RBF, Polynomial, and Sigmoid kernels</li>
|
|
<li><b>📊 Multiclass Support</b>: One-vs-Rest (OvR) and One-vs-One (OvO) strategies</li>
|
|
<li><b>⚡ Automatic Library Selection</b>: Uses liblinear for linear kernels, libsvm for others</li>
|
|
<li><b>🔗 PyTorch Integration</b>: Native support for libtorch tensors</li>
|
|
<li><b>⚙️ JSON Configuration</b>: Easy parameter management with nlohmann::json</li>
|
|
<li><b>🧪 Comprehensive Testing</b>: 100% test coverage with Catch2</li>
|
|
<li><b>📈 Performance Metrics</b>: Detailed evaluation and training metrics</li>
|
|
<li><b>🔍 Cross-Validation</b>: Built-in k-fold cross-validation support</li>
|
|
<li><b>🎯 Grid Search</b>: Hyperparameter optimization capabilities</li>
|
|
</ul>
|
|
<h1>Quick Start</h1>
|
|
<h2>Prerequisites</h2>
|
|
<ul>
|
|
<li>C++17 or later</li>
|
|
<li>CMake 3.15+</li>
|
|
<li>libtorch</li>
|
|
<li>Git</li>
|
|
</ul>
|
|
<h2>Building</h2>
|
|
<div class="fragment"><div class="line">git clone <repository-url></div>
|
|
<div class="line">cd svm_classifier</div>
|
|
<div class="line">mkdir build && cd build</div>
|
|
<div class="line">cmake ..</div>
|
|
<div class="line">make -j$(nproc)</div>
|
|
</div><!-- fragment --><h2>Basic Usage</h2>
|
|
<div class="fragment"><div class="line"><span class="preprocessor">#include <svm_classifier/svm_classifier.hpp></span></div>
|
|
<div class="line"><span class="preprocessor">#include <torch/torch.h></span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="keyword">using namespace </span>svm_classifier;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// Create sample data</span></div>
|
|
<div class="line"><span class="keyword">auto</span> X = torch::randn({100, 2}); <span class="comment">// 100 samples, 2 features</span></div>
|
|
<div class="line"><span class="keyword">auto</span> y = torch::randint(0, 3, {100}); <span class="comment">// 3 classes</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// Create and train SVM</span></div>
|
|
<div class="line"><a class="code hl_class" href="classsvm__classifier_1_1SVMClassifier.html">SVMClassifier</a> svm(KernelType::RBF, 1.0);</div>
|
|
<div class="line"><span class="keyword">auto</span> metrics = svm.fit(X, y);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// Make predictions</span></div>
|
|
<div class="line"><span class="keyword">auto</span> predictions = svm.predict(X);</div>
|
|
<div class="line"><span class="keyword">auto</span> probabilities = svm.predict_proba(X);</div>
|
|
<div class="line"><span class="keywordtype">double</span> accuracy = svm.score(X, y);</div>
|
|
<div class="ttc" id="aclasssvm__classifier_1_1SVMClassifier_html"><div class="ttname"><a href="classsvm__classifier_1_1SVMClassifier.html">svm_classifier::SVMClassifier</a></div><div class="ttdoc">Support Vector Machine Classifier with scikit-learn compatible API.</div><div class="ttdef"><b>Definition</b> <a href="svm__classifier_8hpp_source.html#l00021">svm_classifier.hpp:21</a></div></div>
|
|
</div><!-- fragment --><h2>JSON Configuration</h2>
|
|
<div class="fragment"><div class="line"><span class="preprocessor">#include <nlohmann/json.hpp></span></div>
|
|
<div class="line"> </div>
|
|
<div class="line">nlohmann::json config = {</div>
|
|
<div class="line"> {<span class="stringliteral">"kernel"</span>, <span class="stringliteral">"rbf"</span>},</div>
|
|
<div class="line"> {<span class="stringliteral">"C"</span>, 10.0},</div>
|
|
<div class="line"> {<span class="stringliteral">"gamma"</span>, 0.1},</div>
|
|
<div class="line"> {<span class="stringliteral">"multiclass_strategy"</span>, <span class="stringliteral">"ovo"</span>},</div>
|
|
<div class="line"> {<span class="stringliteral">"probability"</span>, <span class="keyword">true</span>}</div>
|
|
<div class="line">};</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_class" href="classsvm__classifier_1_1SVMClassifier.html">SVMClassifier</a> svm(config);</div>
|
|
</div><!-- fragment --><h1>API Reference</h1>
|
|
<h2>Constructor Options</h2>
|
|
<div class="fragment"><div class="line"><span class="comment">// Default constructor</span></div>
|
|
<div class="line"><a class="code hl_class" href="classsvm__classifier_1_1SVMClassifier.html">SVMClassifier</a> svm;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// With explicit parameters</span></div>
|
|
<div class="line"><a class="code hl_class" href="classsvm__classifier_1_1SVMClassifier.html">SVMClassifier</a> svm(KernelType::RBF, 1.0, MulticlassStrategy::ONE_VS_REST);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// From JSON configuration</span></div>
|
|
<div class="line"><a class="code hl_class" href="classsvm__classifier_1_1SVMClassifier.html">SVMClassifier</a> svm(config_json);</div>
|
|
</div><!-- fragment --><h2>Core Methods</h2>
|
|
<table class="markdownTable">
|
|
<tr class="markdownTableHead">
|
|
<th class="markdownTableHeadNone">Method </th><th class="markdownTableHeadNone">Description </th><th class="markdownTableHeadNone">Returns </th></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><code>fit(X, y)</code> </td><td class="markdownTableBodyNone">Train the classifier </td><td class="markdownTableBodyNone"><code>TrainingMetrics</code> </td></tr>
|
|
<tr class="markdownTableRowEven">
|
|
<td class="markdownTableBodyNone"><code>predict(X)</code> </td><td class="markdownTableBodyNone">Predict class labels </td><td class="markdownTableBodyNone"><code>torch::Tensor</code> </td></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><code>predict_proba(X)</code> </td><td class="markdownTableBodyNone">Predict class probabilities </td><td class="markdownTableBodyNone"><code>torch::Tensor</code> </td></tr>
|
|
<tr class="markdownTableRowEven">
|
|
<td class="markdownTableBodyNone"><code>score(X, y)</code> </td><td class="markdownTableBodyNone">Calculate accuracy </td><td class="markdownTableBodyNone"><code>double</code> </td></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><code>decision_function(X)</code> </td><td class="markdownTableBodyNone">Get decision values </td><td class="markdownTableBodyNone"><code>torch::Tensor</code> </td></tr>
|
|
<tr class="markdownTableRowEven">
|
|
<td class="markdownTableBodyNone"><code>cross_validate(X, y, cv)</code> </td><td class="markdownTableBodyNone">K-fold cross-validation </td><td class="markdownTableBodyNone"><code>std::vector<double></code> </td></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><code>grid_search(X, y, grid, cv)</code> </td><td class="markdownTableBodyNone">Hyperparameter tuning </td><td class="markdownTableBodyNone"><code>nlohmann::json</code> </td></tr>
|
|
</table>
|
|
<h2>Parameter Configuration</h2>
|
|
<h3>Common Parameters</h3>
|
|
<ul>
|
|
<li><b>kernel</b>: <code>"linear"</code>, <code>"rbf"</code>, <code>"polynomial"</code>, <code>"sigmoid"</code></li>
|
|
<li><b>C</b>: Regularization parameter (default: 1.0)</li>
|
|
<li><b>multiclass_strategy</b>: <code>"ovr"</code> (One-vs-Rest) or <code>"ovo"</code> (One-vs-One)</li>
|
|
<li><b>probability</b>: Enable probability estimates (default: false)</li>
|
|
<li><b>tolerance</b>: Convergence tolerance (default: 1e-3)</li>
|
|
</ul>
|
|
<h3>Kernel-Specific Parameters</h3>
|
|
<ul>
|
|
<li><b>RBF/Polynomial/Sigmoid</b>: <code>gamma</code> (default: auto)</li>
|
|
<li><b>Polynomial</b>: <code>degree</code> (default: 3), <code>coef0</code> (default: 0.0)</li>
|
|
<li><b>Sigmoid</b>: <code>coef0</code> (default: 0.0)</li>
|
|
</ul>
|
|
<h1>Examples</h1>
|
|
<h2>Multi-class Classification</h2>
|
|
<div class="fragment"><div class="line"><span class="comment">// Generate multi-class dataset</span></div>
|
|
<div class="line"><span class="keyword">auto</span> X = torch::randn({300, 4});</div>
|
|
<div class="line"><span class="keyword">auto</span> y = torch::randint(0, 5, {300}); <span class="comment">// 5 classes</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// Configure for multi-class</span></div>
|
|
<div class="line">nlohmann::json config = {</div>
|
|
<div class="line"> {<span class="stringliteral">"kernel"</span>, <span class="stringliteral">"rbf"</span>},</div>
|
|
<div class="line"> {<span class="stringliteral">"C"</span>, 1.0},</div>
|
|
<div class="line"> {<span class="stringliteral">"gamma"</span>, 0.1},</div>
|
|
<div class="line"> {<span class="stringliteral">"multiclass_strategy"</span>, <span class="stringliteral">"ovo"</span>},</div>
|
|
<div class="line"> {<span class="stringliteral">"probability"</span>, <span class="keyword">true</span>}</div>
|
|
<div class="line">};</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_class" href="classsvm__classifier_1_1SVMClassifier.html">SVMClassifier</a> svm(config);</div>
|
|
<div class="line"><span class="keyword">auto</span> metrics = svm.<a class="code hl_function" href="classsvm__classifier_1_1SVMClassifier.html#a7e6648c4d2bac92bb00381076ea92db3">fit</a>(X, y);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// Evaluate</span></div>
|
|
<div class="line"><span class="keyword">auto</span> eval_metrics = svm.<a class="code hl_function" href="classsvm__classifier_1_1SVMClassifier.html#a38a9b020b9f4f9254920c97a3a047e9b">evaluate</a>(X, y);</div>
|
|
<div class="line">std::cout << <span class="stringliteral">"Accuracy: "</span> << eval_metrics.<a class="code hl_variable" href="structsvm__classifier_1_1EvaluationMetrics.html#abe60e87c99b8b3c4499e602d8c26847a">accuracy</a> << std::endl;</div>
|
|
<div class="line">std::cout << <span class="stringliteral">"F1-Score: "</span> << eval_metrics.f1_score << std::endl;</div>
|
|
<div class="ttc" id="aclasssvm__classifier_1_1SVMClassifier_html_a38a9b020b9f4f9254920c97a3a047e9b"><div class="ttname"><a href="classsvm__classifier_1_1SVMClassifier.html#a38a9b020b9f4f9254920c97a3a047e9b">svm_classifier::SVMClassifier::evaluate</a></div><div class="ttdeci">EvaluationMetrics evaluate(const torch::Tensor &X, const torch::Tensor &y_true)</div><div class="ttdoc">Calculate detailed evaluation metrics.</div></div>
|
|
<div class="ttc" id="aclasssvm__classifier_1_1SVMClassifier_html_a7e6648c4d2bac92bb00381076ea92db3"><div class="ttname"><a href="classsvm__classifier_1_1SVMClassifier.html#a7e6648c4d2bac92bb00381076ea92db3">svm_classifier::SVMClassifier::fit</a></div><div class="ttdeci">TrainingMetrics fit(const torch::Tensor &X, const torch::Tensor &y)</div><div class="ttdoc">Train the SVM classifier.</div></div>
|
|
<div class="ttc" id="astructsvm__classifier_1_1EvaluationMetrics_html_abe60e87c99b8b3c4499e602d8c26847a"><div class="ttname"><a href="structsvm__classifier_1_1EvaluationMetrics.html#abe60e87c99b8b3c4499e602d8c26847a">svm_classifier::EvaluationMetrics::accuracy</a></div><div class="ttdeci">double accuracy</div><div class="ttdoc">Classification accuracy.</div><div class="ttdef"><b>Definition</b> <a href="types_8hpp_source.html#l00071">types.hpp:71</a></div></div>
|
|
</div><!-- fragment --><h2>Cross-Validation</h2>
|
|
<div class="fragment"><div class="line"><a class="code hl_class" href="classsvm__classifier_1_1SVMClassifier.html">SVMClassifier</a> svm(KernelType::RBF);</div>
|
|
<div class="line"><span class="keyword">auto</span> cv_scores = svm.<a class="code hl_function" href="classsvm__classifier_1_1SVMClassifier.html#a4c91072ea0d3d9b97ba458ff7d0898b8">cross_validate</a>(X, y, 5); <span class="comment">// 5-fold CV</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="keywordtype">double</span> mean_score = 0.0;</div>
|
|
<div class="line"><span class="keywordflow">for</span> (<span class="keyword">auto</span> score : cv_scores) {</div>
|
|
<div class="line"> mean_score += score;</div>
|
|
<div class="line">}</div>
|
|
<div class="line">mean_score /= cv_scores.size();</div>
|
|
<div class="ttc" id="aclasssvm__classifier_1_1SVMClassifier_html_a4c91072ea0d3d9b97ba458ff7d0898b8"><div class="ttname"><a href="classsvm__classifier_1_1SVMClassifier.html#a4c91072ea0d3d9b97ba458ff7d0898b8">svm_classifier::SVMClassifier::cross_validate</a></div><div class="ttdeci">std::vector< double > cross_validate(const torch::Tensor &X, const torch::Tensor &y, int cv=5)</div><div class="ttdoc">Perform cross-validation.</div></div>
|
|
</div><!-- fragment --><h2>Grid Search</h2>
|
|
<div class="fragment"><div class="line">nlohmann::json param_grid = {</div>
|
|
<div class="line"> {<span class="stringliteral">"C"</span>, {0.1, 1.0, 10.0}},</div>
|
|
<div class="line"> {<span class="stringliteral">"gamma"</span>, {0.01, 0.1, 1.0}},</div>
|
|
<div class="line"> {<span class="stringliteral">"kernel"</span>, {<span class="stringliteral">"rbf"</span>, <span class="stringliteral">"polynomial"</span>}}</div>
|
|
<div class="line">};</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="keyword">auto</span> best_params = svm.<a class="code hl_function" href="classsvm__classifier_1_1SVMClassifier.html#afed66a704dfb38cc7d080d3337d10194">grid_search</a>(X, y, param_grid, 3);</div>
|
|
<div class="line">std::cout << <span class="stringliteral">"Best parameters: "</span> << best_params.dump(2) << std::endl;</div>
|
|
<div class="ttc" id="aclasssvm__classifier_1_1SVMClassifier_html_afed66a704dfb38cc7d080d3337d10194"><div class="ttname"><a href="classsvm__classifier_1_1SVMClassifier.html#afed66a704dfb38cc7d080d3337d10194">svm_classifier::SVMClassifier::grid_search</a></div><div class="ttdeci">nlohmann::json grid_search(const torch::Tensor &X, const torch::Tensor &y, const nlohmann::json &param_grid, int cv=5)</div><div class="ttdoc">Find optimal hyperparameters using grid search.</div></div>
|
|
</div><!-- fragment --><h1>Testing</h1>
|
|
<h2>Run All Tests</h2>
|
|
<div class="fragment"><div class="line">cd build</div>
|
|
<div class="line">make test_all</div>
|
|
</div><!-- fragment --><h2>Test Categories</h2>
|
|
<div class="fragment"><div class="line">make test_unit # Unit tests</div>
|
|
<div class="line">make test_integration # Integration tests </div>
|
|
<div class="line">make test_performance # Performance tests</div>
|
|
</div><!-- fragment --><h2>Coverage Report</h2>
|
|
<div class="fragment"><div class="line">cmake -DCMAKE_BUILD_TYPE=Debug ..</div>
|
|
<div class="line">make coverage</div>
|
|
</div><!-- fragment --><p>The coverage report will be generated in <code>build/coverage_html/index.html</code>.</p>
|
|
<h1>Project Structure</h1>
|
|
<div class="fragment"><div class="line">svm_classifier/</div>
|
|
<div class="line">├── include/svm_classifier/ # Public headers</div>
|
|
<div class="line">│ ├── svm_classifier.hpp # Main classifier interface</div>
|
|
<div class="line">│ ├── data_converter.hpp # Tensor conversion utilities</div>
|
|
<div class="line">│ ├── multiclass_strategy.hpp # Multiclass strategies</div>
|
|
<div class="line">│ ├── kernel_parameters.hpp # Parameter management</div>
|
|
<div class="line">│ └── types.hpp # Common types and enums</div>
|
|
<div class="line">├── src/ # Implementation files</div>
|
|
<div class="line">├── tests/ # Comprehensive test suite</div>
|
|
<div class="line">├── examples/ # Usage examples</div>
|
|
<div class="line">├── external/ # Third-party dependencies</div>
|
|
<div class="line">└── CMakeLists.txt # Build configuration</div>
|
|
</div><!-- fragment --><h1>Dependencies</h1>
|
|
<h2>Required</h2>
|
|
<ul>
|
|
<li><b>libtorch</b>: PyTorch C++ API for tensor operations</li>
|
|
<li><b>liblinear</b>: Linear SVM implementation</li>
|
|
<li><b>libsvm</b>: Non-linear SVM implementation</li>
|
|
<li><b>nlohmann/json</b>: JSON configuration handling</li>
|
|
</ul>
|
|
<h2>Testing</h2>
|
|
<ul>
|
|
<li><b>Catch2</b>: Testing framework</li>
|
|
</ul>
|
|
<h2>Build System</h2>
|
|
<ul>
|
|
<li><b>CMake</b>: Cross-platform build system</li>
|
|
</ul>
|
|
<h1>Performance Characteristics</h1>
|
|
<h2>Memory Usage</h2>
|
|
<ul>
|
|
<li>Efficient sparse data handling</li>
|
|
<li>Automatic memory management for SVM structures</li>
|
|
<li>Configurable cache sizes for large datasets</li>
|
|
</ul>
|
|
<h2>Speed</h2>
|
|
<ul>
|
|
<li>Linear kernels: Uses highly optimized liblinear</li>
|
|
<li>Non-linear kernels: Uses proven libsvm implementation</li>
|
|
<li>Multi-threading support via libtorch</li>
|
|
</ul>
|
|
<h2>Scalability</h2>
|
|
<ul>
|
|
<li>Handles datasets from hundreds to millions of samples</li>
|
|
<li>Memory-efficient data conversion</li>
|
|
<li>Sparse feature support</li>
|
|
</ul>
|
|
<h1>Library Selection Logic</h1>
|
|
<p>The classifier automatically selects the appropriate underlying library:</p>
|
|
<ul>
|
|
<li><b>Linear Kernel</b> → liblinear (optimized for linear classification)</li>
|
|
<li><b>RBF/Polynomial/Sigmoid</b> → libsvm (supports arbitrary kernels)</li>
|
|
</ul>
|
|
<p>This ensures optimal performance for each kernel type while maintaining a unified API.</p>
|
|
<h1>Contributing</h1>
|
|
<ol type="1">
|
|
<li>Fork the repository</li>
|
|
<li>Create a feature branch</li>
|
|
<li>Add tests for new functionality</li>
|
|
<li>Ensure all tests pass: <code>make test_all</code></li>
|
|
<li>Check code coverage: <code>make coverage</code></li>
|
|
<li>Submit a pull request</li>
|
|
</ol>
|
|
<h2>Code Style</h2>
|
|
<ul>
|
|
<li>Follow modern C++17 conventions</li>
|
|
<li>Use RAII for resource management</li>
|
|
<li>Comprehensive error handling</li>
|
|
<li>Document all public APIs</li>
|
|
</ul>
|
|
<h1>License</h1>
|
|
<p>[Specify your license here]</p>
|
|
<h1>Acknowledgments</h1>
|
|
<ul>
|
|
<li><b>libsvm</b>: Chih-Chung Chang and Chih-Jen Lin</li>
|
|
<li><b>liblinear</b>: Fan et al.</li>
|
|
<li><b>PyTorch</b>: Facebook AI Research</li>
|
|
<li><b>nlohmann/json</b>: Niels Lohmann</li>
|
|
<li><b>Catch2</b>: Phil Nash and contributors </li>
|
|
</ul>
|
|
</div></div><!-- PageDoc -->
|
|
</div><!-- contents -->
|
|
<!-- start footer part -->
|
|
<hr class="footer"/><address class="footer"><small>
|
|
Generated on Sun Jun 22 2025 11:25:27 for SVM Classifier C++ by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
|
|
</small></address>
|
|
</body>
|
|
</html>
|