mirror of
https://github.com/rmontanana/mdlp.git
synced 2025-08-15 15:35:55 +00:00
Add devcontainer and tasks config for docker dev
This commit is contained in:
18
.devcontainer/Dockerfile
Normal file
18
.devcontainer/Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
FROM mcr.microsoft.com/devcontainers/cpp:0-ubuntu-22.04
|
||||||
|
|
||||||
|
ARG REINSTALL_CMAKE_VERSION_FROM_SOURCE="3.22.2"
|
||||||
|
|
||||||
|
# Optionally install the cmake for vcpkg
|
||||||
|
COPY ./reinstall-cmake.sh /tmp/
|
||||||
|
|
||||||
|
RUN if [ "${REINSTALL_CMAKE_VERSION_FROM_SOURCE}" != "none" ]; then \
|
||||||
|
chmod +x /tmp/reinstall-cmake.sh && /tmp/reinstall-cmake.sh ${REINSTALL_CMAKE_VERSION_FROM_SOURCE}; \
|
||||||
|
fi \
|
||||||
|
&& rm -f /tmp/reinstall-cmake.sh
|
||||||
|
|
||||||
|
# [Optional] Uncomment this section to install additional vcpkg ports.
|
||||||
|
# RUN su vscode -c "${VCPKG_ROOT}/vcpkg install <your-port-name-here>"
|
||||||
|
|
||||||
|
# [Optional] Uncomment this section to install additional packages.
|
||||||
|
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||||
|
# && apt-get -y install --no-install-recommends <your-package-list-here>
|
32
.devcontainer/devcontainer.json
Normal file
32
.devcontainer/devcontainer.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||||
|
// README at: https://github.com/devcontainers/templates/tree/main/src/cpp
|
||||||
|
{
|
||||||
|
"name": "C++",
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile"
|
||||||
|
},
|
||||||
|
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||||
|
// "features": {},
|
||||||
|
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||||
|
// "forwardPorts": [],
|
||||||
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
|
// "postCreateCommand": "gcc -v",
|
||||||
|
// Configure tool-specific properties.
|
||||||
|
"customizations": {
|
||||||
|
// Configure properties specific to VS Code.
|
||||||
|
"vscode": {
|
||||||
|
"settings": {},
|
||||||
|
"extensions": [
|
||||||
|
"ms-vscode.cpptools",
|
||||||
|
"ms-vscode.cpptools-extension-pack",
|
||||||
|
"ms-vscode.cpptools-themes",
|
||||||
|
"jbenden.c-cpp-flylint",
|
||||||
|
"matepek.vscode-catch2-test-adapter",
|
||||||
|
"ms-vscode.cmake-tools",
|
||||||
|
"GitHub.copilot"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||||
|
// "remoteUser": "root"
|
||||||
|
}
|
59
.devcontainer/reinstall-cmake.sh
Normal file
59
.devcontainer/reinstall-cmake.sh
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#-------------------------------------------------------------------------------------------------------------
|
||||||
|
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
|
||||||
|
#-------------------------------------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CMAKE_VERSION=${1:-"none"}
|
||||||
|
|
||||||
|
if [ "${CMAKE_VERSION}" = "none" ]; then
|
||||||
|
echo "No CMake version specified, skipping CMake reinstallation"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Cleanup temporary directory and associated files when exiting the script.
|
||||||
|
cleanup() {
|
||||||
|
EXIT_CODE=$?
|
||||||
|
set +e
|
||||||
|
if [[ -n "${TMP_DIR}" ]]; then
|
||||||
|
echo "Executing cleanup of tmp files"
|
||||||
|
rm -Rf "${TMP_DIR}"
|
||||||
|
fi
|
||||||
|
exit $EXIT_CODE
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
|
||||||
|
echo "Installing CMake..."
|
||||||
|
apt-get -y purge --auto-remove cmake
|
||||||
|
mkdir -p /opt/cmake
|
||||||
|
|
||||||
|
architecture=$(dpkg --print-architecture)
|
||||||
|
case "${architecture}" in
|
||||||
|
arm64)
|
||||||
|
ARCH=aarch64 ;;
|
||||||
|
amd64)
|
||||||
|
ARCH=x86_64 ;;
|
||||||
|
*)
|
||||||
|
echo "Unsupported architecture ${architecture}."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CMAKE_BINARY_NAME="cmake-${CMAKE_VERSION}-linux-${ARCH}.sh"
|
||||||
|
CMAKE_CHECKSUM_NAME="cmake-${CMAKE_VERSION}-SHA-256.txt"
|
||||||
|
TMP_DIR=$(mktemp -d -t cmake-XXXXXXXXXX)
|
||||||
|
|
||||||
|
echo "${TMP_DIR}"
|
||||||
|
cd "${TMP_DIR}"
|
||||||
|
|
||||||
|
curl -sSL "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_BINARY_NAME}" -O
|
||||||
|
curl -sSL "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_CHECKSUM_NAME}" -O
|
||||||
|
|
||||||
|
sha256sum -c --ignore-missing "${CMAKE_CHECKSUM_NAME}"
|
||||||
|
sh "${TMP_DIR}/${CMAKE_BINARY_NAME}" --prefix=/opt/cmake --skip-license
|
||||||
|
|
||||||
|
ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake
|
||||||
|
ln -s /opt/cmake/bin/ctest /usr/local/bin/ctest
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -35,5 +35,4 @@
|
|||||||
.idea
|
.idea
|
||||||
cmake-*
|
cmake-*
|
||||||
**/CMakeFiles
|
**/CMakeFiles
|
||||||
.vscode/*
|
|
||||||
**/gcovr-report
|
**/gcovr-report
|
47
.vscode/launch.json
vendored
Normal file
47
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "C++ Launch config",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/sample/sample",
|
||||||
|
"cwd": "${workspaceFolder}/build/sample",
|
||||||
|
"args": [
|
||||||
|
"-f",
|
||||||
|
"glass"
|
||||||
|
],
|
||||||
|
"targetArchitecture": "arm64",
|
||||||
|
"launchCompleteCommand": "exec-run",
|
||||||
|
"preLaunchTask": "CMake: build",
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"linux": {
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"miDebuggerPath": "/usr/bin/gdb",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Auto load symbols when loading an .so file",
|
||||||
|
"text": "set auto-solib-add",
|
||||||
|
"ignoreFailures": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"osx": {
|
||||||
|
"type": "lldb",
|
||||||
|
"MIMode": "lldb"
|
||||||
|
},
|
||||||
|
"windows": {
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"miDebuggerPath": "C:\\MinGw\\bin\\gdb.exe"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
26
.vscode/tasks.json
vendored
Normal file
26
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "cmake",
|
||||||
|
"label": "CMake: build",
|
||||||
|
"command": "build",
|
||||||
|
"targets": [
|
||||||
|
"all"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [],
|
||||||
|
"detail": "CMake template build task"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cmake",
|
||||||
|
"label": "CMake: configure",
|
||||||
|
"command": "configure",
|
||||||
|
"problemMatcher": [],
|
||||||
|
"detail": "CMake template configure task"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@@ -14,25 +14,27 @@ using namespace mdlp;
|
|||||||
const string PATH = "../../tests/datasets/";
|
const string PATH = "../../tests/datasets/";
|
||||||
|
|
||||||
/* print a description of all supported options */
|
/* print a description of all supported options */
|
||||||
void usage(const char *path) {
|
void usage(const char* path)
|
||||||
|
{
|
||||||
/* take only the last portion of the path */
|
/* take only the last portion of the path */
|
||||||
const char *basename = strrchr(path, '/');
|
const char* basename = strrchr(path, '/');
|
||||||
basename = basename ? basename + 1 : path;
|
basename = basename ? basename + 1 : path;
|
||||||
|
|
||||||
cout << "usage: " << basename << "[OPTION]" << endl;
|
cout << "usage: " << basename << "[OPTION]" << endl;
|
||||||
cout << " -h, --help\t\t Print this help and exit." << endl;
|
cout << " -h, --help\t\t Print this help and exit." << endl;
|
||||||
cout
|
cout
|
||||||
<< " -f, --file[=FILENAME]\t {all, glass, iris, kdd_JapaneseVowels, letter, liver-disorders, mfeat-factors, test}."
|
<< " -f, --file[=FILENAME]\t {all, glass, iris, kdd_JapaneseVowels, letter, liver-disorders, mfeat-factors, test}."
|
||||||
<< endl;
|
<< endl;
|
||||||
cout << " -p, --path[=FILENAME]\t folder where the arff dataset is located, default " << PATH << endl;
|
cout << " -p, --path[=FILENAME]\t folder where the arff dataset is located, default " << PATH << endl;
|
||||||
cout << " -m, --max_depth=INT\t max_depth pased to discretizer. Default = MAX_INT" << endl;
|
cout << " -m, --max_depth=INT\t max_depth pased to discretizer. Default = MAX_INT" << endl;
|
||||||
cout
|
cout
|
||||||
<< " -c, --max_cutpoints=FLOAT\t percentage of lines expressed in decimal or integer number or cut points. Default = 0 -> any"
|
<< " -c, --max_cutpoints=FLOAT\t percentage of lines expressed in decimal or integer number or cut points. Default = 0 -> any"
|
||||||
<< endl;
|
<< endl;
|
||||||
cout << " -n, --min_length=INT\t interval min_length pased to discretizer. Default = 3" << endl;
|
cout << " -n, --min_length=INT\t interval min_length pased to discretizer. Default = 3" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
tuple<string, string, int, int, float> parse_arguments(int argc, char **argv) {
|
tuple<string, string, int, int, float> parse_arguments(int argc, char** argv)
|
||||||
|
{
|
||||||
string file_name;
|
string file_name;
|
||||||
string path = PATH;
|
string path = PATH;
|
||||||
int max_depth = numeric_limits<int>::max();
|
int max_depth = numeric_limits<int>::max();
|
||||||
@@ -86,8 +88,9 @@ tuple<string, string, int, int, float> parse_arguments(int argc, char **argv) {
|
|||||||
return make_tuple(file_name, path, max_depth, min_length, max_cutpoints);
|
return make_tuple(file_name, path, max_depth, min_length, max_cutpoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_file(const string &path, const string &file_name, bool class_last, int max_depth, int min_length,
|
void process_file(const string& path, const string& file_name, bool class_last, int max_depth, int min_length,
|
||||||
float max_cutpoints) {
|
float max_cutpoints)
|
||||||
|
{
|
||||||
ArffFiles file;
|
ArffFiles file;
|
||||||
|
|
||||||
file.load(path + file_name + ".arff", class_last);
|
file.load(path + file_name + ".arff", class_last);
|
||||||
@@ -95,16 +98,16 @@ void process_file(const string &path, const string &file_name, bool class_last,
|
|||||||
const auto items = file.getSize();
|
const auto items = file.getSize();
|
||||||
cout << "Number of lines: " << items << endl;
|
cout << "Number of lines: " << items << endl;
|
||||||
cout << "Attributes: " << endl;
|
cout << "Attributes: " << endl;
|
||||||
for (auto attribute: attributes) {
|
for (auto attribute : attributes) {
|
||||||
cout << "Name: " << get<0>(attribute) << " Type: " << get<1>(attribute) << endl;
|
cout << "Name: " << get<0>(attribute) << " Type: " << get<1>(attribute) << endl;
|
||||||
}
|
}
|
||||||
cout << "Class name: " << file.getClassName() << endl;
|
cout << "Class name: " << file.getClassName() << endl;
|
||||||
cout << "Class type: " << file.getClassType() << endl;
|
cout << "Class type: " << file.getClassType() << endl;
|
||||||
cout << "Data: " << endl;
|
cout << "Data: " << endl;
|
||||||
vector<samples_t> &X = file.getX();
|
vector<samples_t>& X = file.getX();
|
||||||
labels_t &y = file.getY();
|
labels_t& y = file.getY();
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
for (auto feature: X) {
|
for (auto feature : X) {
|
||||||
cout << fixed << setprecision(1) << feature[i] << " ";
|
cout << fixed << setprecision(1) << feature[i] << " ";
|
||||||
}
|
}
|
||||||
cout << y[i] << endl;
|
cout << y[i] << endl;
|
||||||
@@ -116,7 +119,7 @@ void process_file(const string &path, const string &file_name, bool class_last,
|
|||||||
cout << "Cut points for feature " << get<0>(attributes[i]) << ": [" << setprecision(3);
|
cout << "Cut points for feature " << get<0>(attributes[i]) << ": [" << setprecision(3);
|
||||||
test.fit(X[i], y);
|
test.fit(X[i], y);
|
||||||
auto cut_points = test.getCutPoints();
|
auto cut_points = test.getCutPoints();
|
||||||
for (auto item: cut_points) {
|
for (auto item : cut_points) {
|
||||||
cout << item;
|
cout << item;
|
||||||
if (item != cut_points.back())
|
if (item != cut_points.back())
|
||||||
cout << ", ";
|
cout << ", ";
|
||||||
@@ -130,18 +133,19 @@ void process_file(const string &path, const string &file_name, bool class_last,
|
|||||||
cout << "Total feature states: " << total + attributes.size() << endl;
|
cout << "Total feature states: " << total + attributes.size() << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_all_files(const map<string, bool> &datasets, const string &path, int max_depth, int min_length,
|
void process_all_files(const map<string, bool>& datasets, const string& path, int max_depth, int min_length,
|
||||||
float max_cutpoints) {
|
float max_cutpoints)
|
||||||
|
{
|
||||||
cout << "Results: " << "Max_depth: " << max_depth << " Min_length: " << min_length << " Max_cutpoints: "
|
cout << "Results: " << "Max_depth: " << max_depth << " Min_length: " << min_length << " Max_cutpoints: "
|
||||||
<< max_cutpoints << endl << endl;
|
<< max_cutpoints << endl << endl;
|
||||||
printf("%-20s %4s %4s\n", "Dataset", "Feat", "Cuts Time(ms)");
|
printf("%-20s %4s %4s\n", "Dataset", "Feat", "Cuts Time(ms)");
|
||||||
printf("==================== ==== ==== ========\n");
|
printf("==================== ==== ==== ========\n");
|
||||||
for (const auto &dataset: datasets) {
|
for (const auto& dataset : datasets) {
|
||||||
ArffFiles file;
|
ArffFiles file;
|
||||||
file.load(path + dataset.first + ".arff", dataset.second);
|
file.load(path + dataset.first + ".arff", dataset.second);
|
||||||
auto attributes = file.getAttributes();
|
auto attributes = file.getAttributes();
|
||||||
vector<samples_t> &X = file.getX();
|
vector<samples_t>& X = file.getX();
|
||||||
labels_t &y = file.getY();
|
labels_t& y = file.getY();
|
||||||
size_t timing = 0;
|
size_t timing = 0;
|
||||||
size_t cut_points = 0;
|
size_t cut_points = 0;
|
||||||
for (auto i = 0; i < attributes.size(); i++) {
|
for (auto i = 0; i < attributes.size(); i++) {
|
||||||
@@ -157,7 +161,8 @@ void process_all_files(const map<string, bool> &datasets, const string &path, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
map<string, bool> datasets = {
|
map<string, bool> datasets = {
|
||||||
{"glass", true},
|
{"glass", true},
|
||||||
{"iris", true},
|
{"iris", true},
|
||||||
|
Reference in New Issue
Block a user