From b21e85f5e84a07728e1ffbe2aa1dd012c363d6c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Tue, 2 May 2023 14:33:22 +0200 Subject: [PATCH] Add devcontainer and tasks config for docker dev --- .devcontainer/Dockerfile | 18 ++++++++++ .devcontainer/devcontainer.json | 32 +++++++++++++++++ .devcontainer/reinstall-cmake.sh | 59 ++++++++++++++++++++++++++++++++ .gitignore | 1 - .vscode/launch.json | 47 +++++++++++++++++++++++++ .vscode/tasks.json | 26 ++++++++++++++ sample/sample.cpp | 47 +++++++++++++------------ 7 files changed, 208 insertions(+), 22 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/reinstall-cmake.sh create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..b9bdeb7 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -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 " + +# [Optional] Uncomment this section to install additional packages. +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e3c01ae --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -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" +} \ No newline at end of file diff --git a/.devcontainer/reinstall-cmake.sh b/.devcontainer/reinstall-cmake.sh new file mode 100644 index 0000000..408b81d --- /dev/null +++ b/.devcontainer/reinstall-cmake.sh @@ -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 diff --git a/.gitignore b/.gitignore index 9446e2b..8934161 100644 --- a/.gitignore +++ b/.gitignore @@ -35,5 +35,4 @@ .idea cmake-* **/CMakeFiles -.vscode/* **/gcovr-report \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e2daa52 --- /dev/null +++ b/.vscode/launch.json @@ -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" + } + }, + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..6154a34 --- /dev/null +++ b/.vscode/tasks.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/sample/sample.cpp b/sample/sample.cpp index 8ab7433..a40e8f7 100644 --- a/sample/sample.cpp +++ b/sample/sample.cpp @@ -14,25 +14,27 @@ using namespace mdlp; const string PATH = "../../tests/datasets/"; /* 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 */ - const char *basename = strrchr(path, '/'); + const char* basename = strrchr(path, '/'); basename = basename ? basename + 1 : path; cout << "usage: " << basename << "[OPTION]" << endl; cout << " -h, --help\t\t Print this help and exit." << endl; cout - << " -f, --file[=FILENAME]\t {all, glass, iris, kdd_JapaneseVowels, letter, liver-disorders, mfeat-factors, test}." - << endl; + << " -f, --file[=FILENAME]\t {all, glass, iris, kdd_JapaneseVowels, letter, liver-disorders, mfeat-factors, test}." + << 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 - << " -c, --max_cutpoints=FLOAT\t percentage of lines expressed in decimal or integer number or cut points. Default = 0 -> any" - << endl; + << " -c, --max_cutpoints=FLOAT\t percentage of lines expressed in decimal or integer number or cut points. Default = 0 -> any" + << endl; cout << " -n, --min_length=INT\t interval min_length pased to discretizer. Default = 3" << endl; } -tuple parse_arguments(int argc, char **argv) { +tuple parse_arguments(int argc, char** argv) +{ string file_name; string path = PATH; int max_depth = numeric_limits::max(); @@ -86,8 +88,9 @@ tuple parse_arguments(int argc, char **argv) { 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, - float max_cutpoints) { +void process_file(const string& path, const string& file_name, bool class_last, int max_depth, int min_length, + float max_cutpoints) +{ ArffFiles file; 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(); cout << "Number of lines: " << items << endl; cout << "Attributes: " << endl; - for (auto attribute: attributes) { + for (auto attribute : attributes) { cout << "Name: " << get<0>(attribute) << " Type: " << get<1>(attribute) << endl; } cout << "Class name: " << file.getClassName() << endl; cout << "Class type: " << file.getClassType() << endl; cout << "Data: " << endl; - vector &X = file.getX(); - labels_t &y = file.getY(); + vector& X = file.getX(); + labels_t& y = file.getY(); for (int i = 0; i < 5; i++) { - for (auto feature: X) { + for (auto feature : X) { cout << fixed << setprecision(1) << feature[i] << " "; } 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); test.fit(X[i], y); auto cut_points = test.getCutPoints(); - for (auto item: cut_points) { + for (auto item : cut_points) { cout << item; if (item != cut_points.back()) 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; } -void process_all_files(const map &datasets, const string &path, int max_depth, int min_length, - float max_cutpoints) { +void process_all_files(const map& datasets, const string& path, int max_depth, int min_length, + float 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("==================== ==== ==== ========\n"); - for (const auto &dataset: datasets) { + for (const auto& dataset : datasets) { ArffFiles file; file.load(path + dataset.first + ".arff", dataset.second); auto attributes = file.getAttributes(); - vector &X = file.getX(); - labels_t &y = file.getY(); + vector& X = file.getX(); + labels_t& y = file.getY(); size_t timing = 0; size_t cut_points = 0; for (auto i = 0; i < attributes.size(); i++) { @@ -157,7 +161,8 @@ void process_all_files(const map &datasets, const string &path, in } -int main(int argc, char **argv) { +int main(int argc, char** argv) +{ map datasets = { {"glass", true}, {"iris", true},