diff --git a/experiments/StringExperiments.cpp b/experiments/StringExperiments.cpp new file mode 100644 index 000000000..2eead91b4 --- /dev/null +++ b/experiments/StringExperiments.cpp @@ -0,0 +1,494 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#define TEST_NAME(opName) "StringsExperiments (" opName ")" +#define CATCH_CONFIG_ENABLE_BENCHMARKING + +#define LOOP_SIZE 1 +#define NUM_COLS 2 + +#define DELIM ',' + +// Place this file into the test directory (./test/runtime/local/datastructures/), add it to the CMakeLists.txt in the test directory and perform and run ./experiments/experiments.sh -nb StringsE* -d yes +// The results.xml is then used by the analytics jupyter notebook + +namespace fs = std::filesystem; + +std::vector getCSVFiles(const std::string& folderPath) { + std::vector csvFiles; + for (const auto& entry : fs::directory_iterator(folderPath)) { + if (entry.path().extension() == ".csv") { + csvFiles.push_back(entry.path().string()); + } + } + return csvFiles; +} + + +namespace fs = std::filesystem; + +std::vector> getCSVFilePairs(const std::string& folderPath) { + // Map: key is the common filename (without the seed digit) + // Value: pair.first is the seed 3 file, pair.second is the seed 1 file. + std::unordered_map> fileMap; + + // This regex matches filenames with a substring "seed_" followed by either '1' or '3' + // For example: "data_seed_1_version.csv" or "data_seed_3_version.csv" + // Group 1: everything up to and including "seed_" + // Group 2: the seed digit (either '1' or '3') + // Group 3: the rest of the filename (excluding the ".csv" extension) + std::regex pattern(R"(^(.*seed_)([13])(.*)\.csv$)", std::regex::icase); + + for (const auto& entry : fs::directory_iterator(folderPath)) { + if (entry.path().extension() == ".csv") { + std::string fileName = entry.path().filename().string(); + std::smatch match; + if (std::regex_match(fileName, match, pattern)) { + // Ensure we have the expected groups: entire match, then 3 groups. + if (match.size() == 4) { + std::string prefix = match[1].str(); // e.g., "data_seed_" + std::string seedDigit = match[2].str(); // "1" or "3" + std::string suffix = match[3].str(); // e.g., "_version" + + // Create a key by removing the seed digit. + std::string commonKey = prefix + suffix; + + // Depending on the digit, store the file in the proper slot. + if (seedDigit == "3") { + fileMap[commonKey].first = entry.path().string(); + } else if (seedDigit == "1") { + fileMap[commonKey].second = entry.path().string(); + } + } + } + } + } + + // Build the vector of pairs. Only include pairs that have both seed files. + std::vector> result; + for (const auto& [key, pair] : fileMap) { + if (!pair.first.empty() && !pair.second.empty()) { + // Each inner vector has 2 entries: [seed3_file, seed1_file] + result.push_back({ pair.first, pair.second }); + } + } + return result; +} + +const std::vector>& getCachedCSVFilePairs() { + static const std::vector> cachedPairs = getCSVFilePairs("./experiments/datasets/"); + return cachedPairs; +} + + +//----------------------------------------------------------------- +// A generic binary matrix test function (unchanged) +template +void StringTestEwBinaryMat(BinaryOpCode opCode, const DTArg *lhs, const DTArg *rhs) { + DTRes *res = nullptr; + ewBinaryMat(opCode, res, lhs, rhs, nullptr); + DataObjectFactory::destroy(res); +} + +//----------------------------------------------------------------- +// Generic unary matrix test function +template +void StringTestEwUnaryMat(UnaryOpCode opCode, const DTArg *arg) { + DTRes *res = nullptr; + ewUnaryMat(opCode, res, arg, nullptr); + DataObjectFactory::destroy(res); +} + +//----------------------------------------------------------------- +// Test for concatenation +template +void StringTestConcat(VT lhs, VT rhs) { + EwBinarySca::apply(lhs, rhs, nullptr); +} + + +template +void StringTestEwBinarySca(T lhs, T rhs, int64_t exp) { + EwBinarySca::apply(lhs, rhs, nullptr); +} + +//----------------------------------------------------------------- + +TEMPLATE_PRODUCT_TEST_CASE( + TEST_NAME("ReadCsv"), + TAG_DATASTRUCTURES, + (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + + using DT = TestType; + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + const std::string& fileName2 = filePair[1]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName =fileName1; + + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + DT* m = nullptr; + SECTION("readCsv()") { + for (size_t i = 0; i < LOOP_SIZE; i++) { + + // Use .c_str() to convert std::string to const char* + readCsv(m, fileName1.c_str(), numRows, NUM_COLS, DELIM); + } + } + DataObjectFactory::destroy(m); + } +} + + + +TEMPLATE_PRODUCT_TEST_CASE( + TEST_NAME("get"), + TAG_DATASTRUCTURES, + (DenseMatrix), + (ALL_STRING_VALUE_TYPES) +) { + using DT = TestType; + using VT = typename DT::VT; + + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName =fileName1; + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + DT* m = nullptr; + // Use .c_str() to convert std::string to const char* + readCsv(m, fileName1.c_str(), numRows, NUM_COLS, DELIM); + + SECTION("getNumRows()") { + for (size_t i = 0; i < LOOP_SIZE; i++) { + volatile size_t numRowsLhs = m->getNumRows(); + } + } + SECTION("getNumCols()") { + for (size_t i = 0; i < LOOP_SIZE; i++) { + volatile size_t numColsLhs = m->getNumCols(); + } + } + SECTION("getValues()") { + for (size_t i = 0; i < LOOP_SIZE; i++) { + volatile VT* values = m->getValues(); + } + } + + DataObjectFactory::destroy(m); + } +} + +TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("EwBinaryMat"), TAG_DATASTRUCTURES, (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + using DTRes = DenseMatrix; + + + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + const std::string& fileName2 = filePair[1]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName = fileName1; + + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + + DT *m1 = nullptr; + DT *m2 = nullptr; + + readCsv(m1, fileName1.c_str(), numRows, NUM_COLS, DELIM); + readCsv(m2, fileName2.c_str(), numRows, NUM_COLS, DELIM); + + REQUIRE(m1->getNumRows() == numRows); + REQUIRE(m1->getNumCols() == NUM_COLS); + REQUIRE(m2->getNumRows() == numRows); + REQUIRE(m2->getNumCols() == NUM_COLS); + + SECTION("EQ") { + for (size_t i = 0; i < LOOP_SIZE; i++) + StringTestEwBinaryMat(BinaryOpCode::EQ, m1, m2); + } + + SECTION("NEQ") { + for (size_t i = 0; i < LOOP_SIZE; i++) + StringTestEwBinaryMat(BinaryOpCode::NEQ, m1, m2); + } + + SECTION("LT") { + for (size_t i = 0; i < LOOP_SIZE; i++) + StringTestEwBinaryMat(BinaryOpCode::LT, m1, m2); + } + + SECTION("GT") { + for (size_t i = 0; i < LOOP_SIZE; i++) + StringTestEwBinaryMat(BinaryOpCode::GT, m1, m2); + } + + DataObjectFactory::destroy(m1); + DataObjectFactory::destroy(m2); + + } +} + + +TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("Operations"), TAG_DATASTRUCTURES, (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName = fileName1; + + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + + DT *m = nullptr; + + readCsv(m, fileName1.c_str(), numRows, NUM_COLS, DELIM); + + SECTION("Upper") { + for (size_t i = 0; i < LOOP_SIZE; i++) + StringTestEwUnaryMat(UnaryOpCode::UPPER, m); + } + + SECTION("Lower") { + for (size_t i = 0; i < LOOP_SIZE; i++) + StringTestEwUnaryMat(UnaryOpCode::LOWER, m); + } + + DataObjectFactory::destroy(m); + } +} + + + +TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("Operations2"), TAG_DATASTRUCTURES, (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName = fileName1; + + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + DT *m = nullptr; + readCsv(m, fileName1.c_str(), numRows, NUM_COLS, DELIM); + SECTION("Concat") { + for (size_t r = 0; r < static_cast(numRows); r++) { + VT resultConcat = ewBinarySca(BinaryOpCode::CONCAT, m->get(r, 0), m->get(r, 1), nullptr); + } + } + DataObjectFactory::destroy(m); + } +} + +TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("Fill"), TAG_DATASTRUCTURES, (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto numRows = GENERATE(100000, 1000000); + + DT *m = nullptr; + + SECTION("FillShortString") { + fill(m, VT("abc"), numRows, NUM_COLS, nullptr); + } + + SECTION("FillLongString") { + fill(m, VT("abcdfgfdgfdgdfgfdgfdgfdggdfgfdgfdgfdjhg34hg3kjghj43hgkj34hgjk34hjkgh34kjgh3j4hgj34hg3jkgh34jkhgj34hjkg34hggdfgfdgdfg"), numRows, NUM_COLS, nullptr); + } + DataObjectFactory::destroy(m); + +} + + +TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("Transpose"), TAG_DATASTRUCTURES, (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName = fileName1; + + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + DT *m = nullptr; + readCsv(m, fileName1.c_str(), numRows, NUM_COLS, DELIM); + + DT *res = nullptr; + SECTION("Transpose") { + transpose(res, m, nullptr); + } + DataObjectFactory::destroy(m, res); + } +} + +TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("Reverse"), TAG_DATASTRUCTURES, (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName = fileName1; + + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + DT *m = nullptr; + readCsv(m, fileName1.c_str(), numRows, NUM_COLS, DELIM); + + DT *res = nullptr; + SECTION("Reverse") { + reverse(res, m, nullptr); + } + DataObjectFactory::destroy(m, res); + } +} + + +TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("Reshape"), TAG_DATASTRUCTURES, (DenseMatrix), + (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + + // Specify the folder where your CSV files are located. + std::string folderPath = "./experiments/datasets/"; + + // Dynamically get all CSV files in that folder. + auto csvFiles = getCachedCSVFilePairs(); + + // Use Catch2's generator to iterate through CSV file names. + auto filePair = GENERATE_COPY(from_range(csvFiles.begin(), csvFiles.end())); + + const std::string& fileName1 = filePair[0]; + + auto numRows = GENERATE(100000, 1000000); + + // Build an outer section name that embeds the CSV file name. + std::string outerSectionName = fileName1; + + SECTION(outerSectionName + "_numRowsRead_" + std::to_string(numRows)) { + DT *m = nullptr; + readCsv(m, fileName1.c_str(), numRows, NUM_COLS, DELIM); + + DT *res = nullptr; + SECTION("Reshape") { + reshape(res, m, NUM_COLS, numRows, nullptr); + } + DataObjectFactory::destroy(m, res); + } +} \ No newline at end of file diff --git a/experiments/analysis.ipynb b/experiments/analysis.ipynb new file mode 100644 index 000000000..c626fb5f5 --- /dev/null +++ b/experiments/analysis.ipynb @@ -0,0 +1,1113 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "5a5b9149-02ee-476f-839d-16290f9dc98e", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 592 + }, + "id": "5a5b9149-02ee-476f-839d-16290f9dc98e", + "outputId": "8e042b14-2c13-4cfc-f51d-75fa72a79806" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "nan\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " CSVFile section \\\n", + "995 FillLongString \n", + "997 FillLongString \n", + "1011 FillLongString \n", + "1013 FillLongString \n", + "1015 FillLongString \n", + "... ... ... \n", + "73 dataset_rows_1000000_cols_5_mean_5_std_3_dup_5... readCsv() \n", + "87 dataset_rows_1000000_cols_5_mean_5_std_3_dup_5... readCsv() \n", + "97 dataset_rows_1000000_cols_5_mean_5_std_3_dup_5... readCsv() \n", + "107 dataset_rows_1000000_cols_5_mean_5_std_3_dup_5... readCsv() \n", + "117 dataset_rows_1000000_cols_5_mean_5_std_3_dup_5... readCsv() \n", + "\n", + " durationinseconds failures \\\n", + "995 0.004613 0 \n", + "997 0.121576 0 \n", + "1011 0.004976 0 \n", + "1013 0.102668 0 \n", + "1015 0.008914 0 \n", + "... ... ... \n", + "73 0.202444 0 \n", + "87 0.101776 0 \n", + "97 0.095803 0 \n", + "107 0.666888 0 \n", + "117 1.68427 0 \n", + "\n", + " testcase \\\n", + "995 StringsExperiments (Fill) - DenseMatrix\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
CSVFilesectiondurationinsecondsfailurestestcaseStringtypealternativerowscolsmeanstddupdistseedminmaxnumRowsRead
995FillLongString0.0046130StringsExperiments (Fill) - DenseMatrix<std::s...std::stringNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
997FillLongString0.1215760StringsExperiments (Fill) - DenseMatrix<std::s...std::stringNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1011FillLongString0.0049760StringsExperiments (Fill) - DenseMatrix<FixedS...FixedStr128NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1013FillLongString0.1026680StringsExperiments (Fill) - DenseMatrix<FixedS...FixedStr128NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1015FillLongString0.0089140StringsExperiments (Fill) - DenseMatrix<FixedS...FixedStr256NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
......................................................
73dataset_rows_1000000_cols_5_mean_5_std_3_dup_5...readCsv()0.2024440StringsExperiments (ReadCsv) - DenseMatrix<Fix...FixedStr256NaN100000055350uniform31101000000
87dataset_rows_1000000_cols_5_mean_5_std_3_dup_5...readCsv()0.1017760StringsExperiments (ReadCsv) - DenseMatrix<Umb...Umbra_tNaN100000055350uniform31101000000
97dataset_rows_1000000_cols_5_mean_5_std_3_dup_5...readCsv()0.0958030StringsExperiments (ReadCsv) - DenseMatrix<New...NewUmbra_tNaN100000055350uniform31101000000
107dataset_rows_1000000_cols_5_mean_5_std_3_dup_5...readCsv()0.6668880StringsExperiments (ReadCsv) - DenseMatrix<Uno...UnorderedDictionaryEncodedStringNaN100000055350uniform31101000000
117dataset_rows_1000000_cols_5_mean_5_std_3_dup_5...readCsv()1.684270StringsExperiments (ReadCsv) - DenseMatrix<Ord...OrderedDictionaryEncodedStringNaN100000055350uniform31101000000
\n", + "

1070 rows × 17 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "repr_error": "Out of range float values are not JSON compliant: nan" + } + }, + "metadata": {}, + "execution_count": 45 + } + ], + "source": [ + "import pandas as pd\n", + "import xml.etree.ElementTree as ET\n", + "import re\n", + "\n", + "log_file = \"results.xml\"\n", + "tree = ET.parse(log_file)\n", + "root = tree.getroot()\n", + "\n", + "rows = []\n", + "\n", + "# Regular expression to extract the type inside DenseMatrix<...>\n", + "dm_pattern = re.compile(r\"DenseMatrix<([^>]+)>\")\n", + "# Regular expression to extract the CSV file name from a top-level section name\n", + "csv_pattern = re.compile(r\"\\s*(.+)\")\n", + "\n", + "def process_section(section, csv_file=None, parent_name=\"\"):\n", + " current_name = section.attrib.get(\"name\", \"\")\n", + " # At the top-level, try to extract the CSV file name.\n", + " if csv_file is None and not parent_name:\n", + " m = csv_pattern.match(current_name)\n", + " if m:\n", + " csv_file = m.group(1).strip()\n", + " composite_name = \"\" # reset composite name for inner sections\n", + " else:\n", + " # If no CSV file label, use current name as composite name.\n", + " composite_name = current_name\n", + " else:\n", + " composite_name = current_name if not parent_name else f\"{parent_name} > {current_name}\"\n", + "\n", + " results = []\n", + " child_sections = section.findall(\"Section\")\n", + " if child_sections:\n", + " for child in child_sections:\n", + " results.extend(process_section(child, csv_file=csv_file, parent_name=composite_name))\n", + " else:\n", + " overall_results = section.find(\"OverallResults\")\n", + " duration = overall_results.attrib.get(\"durationInSeconds\", \"\") if overall_results is not None else \"\"\n", + " failures = overall_results.attrib.get(\"failures\", \"\") if overall_results is not None else \"\"\n", + " results.append((csv_file, composite_name, duration, failures))\n", + " return results\n", + "\n", + "# Iterate over each TestCase element in the XML\n", + "for testcase in root.findall(\".//TestCase\"):\n", + " test_case_name = testcase.attrib.get(\"name\", \"\")\n", + " # Extract DenseMatrix string type\n", + " m = dm_pattern.search(test_case_name)\n", + " string_type = m.group(1) if m else None\n", + "\n", + " # If there are nested Section elements, process them.\n", + " testcase_sections = testcase.findall(\"Section\")\n", + " if testcase_sections:\n", + " for sec in testcase_sections:\n", + " # Process each top-level section; if it has a CSV file name, it will be extracted.\n", + " section_tuples = process_section(sec)\n", + " for csv_file, inner_section, duration, failures in section_tuples:\n", + " rows.append({\n", + " \"CSVFile\": csv_file,\n", + " \"section\": inner_section,\n", + " \"durationinseconds\": duration,\n", + " \"failures\": failures,\n", + " \"testcase\": test_case_name,\n", + " \"Stringtype\": string_type\n", + " })\n", + " else:\n", + " # If no sections are present, look for an OverallResult directly under the TestCase.\n", + " overall_result = testcase.find(\"OverallResult\")\n", + " duration = overall_result.attrib.get(\"durationInSeconds\", \"\") if overall_result is not None else \"\"\n", + " failures = overall_result.attrib.get(\"failures\", \"\") if overall_result is not None else \"\"\n", + " rows.append({\n", + " \"CSVFile\": None,\n", + " \"section\": None,\n", + " \"durationinseconds\": duration,\n", + " \"failures\": failures,\n", + " \"testcase\": test_case_name,\n", + " \"Stringtype\": string_type\n", + " })\n", + "\n", + "# Create the DataFrame and drop rows without a valid Stringtype.\n", + "df = pd.DataFrame(rows).dropna(subset=[\"Stringtype\"])\n", + "\n", + "# Optionally extract an alternative from the test case name if needed.\n", + "df['alternative'] = df['testcase'].str.extract(r'-\\s*(EwBinaryMat|EwBinarySca)\\)', expand=False)\n", + "df['CSVFile'] = df['CSVFile'].str.split('/').str[-1]\n", + "# Define a regex pattern with named capture groups for each parameter\n", + "pattern = (\n", + " r\"dataset_rows_(?P\\d+)_\"\n", + " r\"cols_(?P\\d+)_\"\n", + " r\"mean_(?P\\d+)_\"\n", + " r\"std_(?P\\d+)_\"\n", + " r\"dup_(?P\\d+)_\"\n", + " r\"dist_(?P\\w+)_\"\n", + " r\"seed_(?P\\d+)_\"\n", + " r\"min_(?P\\d+)_\"\n", + " r\"max_(?P\\d+)\\.csv\"\n", + " r\"_numRowsRead_(?P\\d+)\"\n", + ")\n", + "\n", + "# Extract the parameters into a new DataFrame\n", + "params = df['CSVFile'].str.extract(pattern)\n", + "\n", + "# Join the extracted parameters back to the original DataFrame\n", + "df = df.join(params)\n", + "# Define your custom ordering for the string type.\n", + "order = [\"std::string\", \"FixedStr16\", \"FixedStr32\", \"FixedStr64\",\n", + " \"FixedStr128\", \"FixedStr256\", \"Umbra_t\", \"NewUmbra_t\",\n", + " \"UnorderedDictionaryEncodedString\", \"OrderedDictionaryEncodedString\"]\n", + "\n", + "df[\"Stringtype\"] = pd.Categorical(df[\"Stringtype\"], categories=order, ordered=True)\n", + "print(df['dist'].unique()[2])\n", + "\n", + "\n", + "pd.set_option('display.max_rows', 100)\n", + "df_sorted = df.sort_values(by=[\"CSVFile\", \"section\", \"alternative\", \"Stringtype\"])\n", + "df_sorted[df_sorted[\"failures\"]==\"0\"]" + ] + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Parameters\n", + "operation = 'EQ' # 'EQ', 'NEQ', 'LT', 'GT', 'Concat', 'Lower', 'Upper', 'readCsv()', 'Transpose', 'Reverse', 'Reshape'\n", + "dist = 'skewed' # Not used\n", + "rowsRead = '1000000'\n", + "\n", + "\n", + "dfs = dict(tuple(df.groupby('CSVFile')))\n", + "for csv_file, group_df in dfs.items():\n", + " dfs[csv_file] = group_df.sort_values('section')\n", + "\n", + "\n", + "def plot_section_bars(df):\n", + " csv_filename = df['CSVFile'].iloc[0]\n", + "\n", + " fixed_order = [\"std::string\", \"FixedStr16\", \"FixedStr32\", \"FixedStr64\",\n", + " \"FixedStr128\", \"FixedStr256\", \"Umbra_t\", \"NewUmbra_t\",\n", + " \"UnDict\", \"OrdDict\"]\n", + "\n", + " rename_map = {\n", + " \"UnorderedDictionaryEncodedString\": \"UnDict\",\n", + " \"OrderedDictionaryEncodedString\": \"OrdDict\"\n", + " }\n", + "\n", + " for section, group in df.groupby('section'):\n", + " if section == operation:\n", + " new_df = group[['Stringtype', 'durationinseconds']].copy()\n", + " new_df['durationinseconds'] = pd.to_numeric(new_df['durationinseconds'], errors='coerce')\n", + "\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n", + "\n", + " new_df = (new_df\n", + " .set_index('Stringtype')\n", + " .reindex(fixed_order)\n", + " .dropna(subset=['durationinseconds'])\n", + " .reset_index()\n", + " )\n", + " #new_df = new_df[(~new_df['Stringtype'].isin(['UnDict', 'OrdDict']))]\n", + "\n", + " if new_df.empty:\n", + " continue\n", + "\n", + " fig, ax = plt.subplots(figsize=(8, 5))\n", + " ax.bar(new_df['Stringtype'], new_df['durationinseconds'], color='red')\n", + "\n", + " distribution = group['dist'].iloc[0]\n", + " min_val = group['min'].iloc[0]\n", + " max_val = group['max'].iloc[0]\n", + "\n", + " ax.set_title(f\"{distribution} distribution with length range of [{min_val}-{max_val}]: {section}\")\n", + " ax.set_xlabel(\"Stringtype\")\n", + " ax.set_ylabel(\"Duration (seconds)\")\n", + "\n", + " plt.xticks(rotation=45)\n", + " plt.tight_layout()\n", + " plt.show()\n", + "\n", + "\n", + "dfs.keys()\n", + "\n", + "for frame in dfs:\n", + " plot_section_bars(dfs[frame])\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "YNzDErFCDPQy", + "outputId": "d47743e7-71d7-4f56-d08b-27cb1be19786" + }, + "id": "YNzDErFCDPQy", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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jIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZjIkFEREREREZzNTYARARERFRHqRSGTuCnEPE2BFkCO9YEBERERGRwZhYEBERERGRwZhYEBERERGRwZhYEBERERGRwQxKLBISEjIrDiIiIiIiysH0Six2796NHj16oEyZMsiXLx/y588PKysrNGrUCF999RXu37+fVXESEREREdF7LEOJxc8//4zy5cvjs88+g6mpKb744gts27YNe/bswYoVK9CoUSPs27cPZcqUQf/+/fHo0aOsjpuIiIiIiN4jKpH/HhjX29sbEydORIsWLaBWvzkXuXfvHhYtWgR7e3uMGDEiUwN938TGxsLa2hoxMTGwsrIydjhEuRvHOs+4HDLWOb0F9/eM4/6es3Ffzzgj7uv6nPNm6I5FWFgYWrVq9dakAgCKFy+OmTNn6pVUBAYGonTp0rCwsICXlxeOHTv21vKbN2+Gm5sbLCwsUKVKFezatUtn/rZt29CsWTMULVoUKpUKZ86cSbOO+Ph4DBo0CEWLFkXBggXRvn17REZGZjhmIiIiIiLSZfCoUMnJyThz5gyePn2q97IbN26Ev78/pkyZglOnTqFatWrw9fXFw4cP0y3/559/okuXLujduzdOnz4NPz8/+Pn54cKFC0qZuLg41K9fH7NmzXrj544YMQK//vorNm/ejD/++AP379/Hxx9/rHf8RERERESUIkNNoVIbPnw4qlSpgt69eyM5ORmNGjXCn3/+ifz582Pnzp1o3Lhxhtfl5eWFWrVqYfHixQAAjUYDZ2dnDBkyBGPHjk1TvlOnToiLi8POnTuVaXXq1IGHhweCgoJ0yt66dQsuLi44ffo0PDw8lOkxMTGws7PDunXr8MknnwAArly5gooVKyIsLAx16tTJUOxsCkWUjXi7POPYNCTn4/6ecdzfczbu6xmXm5pCpbZlyxZUq1YNAPDrr78iPDwcV65cwYgRIzBhwoQMrycxMREnT56Ej4/Pv8Go1fDx8UFYWFi6y4SFhemUBwBfX983lk/PyZMn8erVK531uLm5oWTJknqth4iIiIiI/qV3YvH48WM4ODgAAHbt2oUOHTooI0adP39er/UkJyfD3t5eZ7q9vT0iIiLSXSYiIkKv8m9ah5mZGQoXLqzXehISEhAbG6vzIiIiIiKiFHonFvb29rh06RKSk5MRHByMDz/8EADw4sULmJiYZHqA74uAgABYW1srL2dnZ2OHRERERET03tA7sejVqxc6duwId3d3qFQqpUnR0aNH4ebmluH12NrawsTEJM1oTJGRkcodkdc5ODjoVf5N60hMTER0dLRe6xk3bhxiYmKU1927dzP8mUREREREuZ3eicXUqVOxYsUK9O3bF0eOHIG5uTkAwMTEJN0O129iZmYGT09PhIaGKtM0Gg1CQ0Ph7e2d7jLe3t465QEgJCTkjeXT4+npiXz58ums5+rVq7hz585b12Nubg4rKyudFxFRrqZS8ZXRFxERwfRdFtKOppRajx499F6Pv78/evTogZo1a6J27dpYsGAB4uLi0KtXLwBA9+7dUbx4cQQEBAAAhg0bhkaNGmHevHlo1aoVNmzYgBMnTmD58uXKOqOionDnzh3cv38fQErSAKTcqXBwcIC1tTV69+4Nf39/2NjYwMrKCkOGDIG3t3eGR4QiIiIiIiJdGUosFi5cmOEVDh06NMNlO3XqhEePHmHy5MmIiIiAh4cHgoODlQ7ad+7c0XkoX926dbFu3TpMnDgR48ePh6urK7Zv3w53d3elzC+//KIkJgDQuXNnAMCUKVMwdepUAMD8+fOhVqvRvn17JCQkwNfXF0uWLMlw3EREREREpCtDz7FwcXHRef/o0SO8ePFCGVkpOjoa+fPnR7FixXDz5s0sCfR9w+dYEGUjNjXJuMwc65z1nnGsd+PgcyxyNu7rGZebnmMRHh6uvL766it4eHjg8uXLiIqKQlRUFC5fvowaNWpg+vTpmbIBRERERESUs+j95O2yZctiy5YtqF69us70kydP4pNPPkF4eHimBvi+4h0LomzEq1oZxyvnxsF6Nw7escjZuK9nXG66Y5HagwcPkJSUlGZ6cnJymqFgiYiIiIgob9A7sWjatCn69euHU6dOKdNOnjyJAQMGKM+0ICIiIiKivEXvxGLlypVwcHBAzZo1YW5uDnNzc9SuXRv29vZYsWJFVsRIRERERETvOb2fY2FnZ4ddu3bh2rVruHLlCgDAzc0N5cuXz/TgiIiIiIgoZ3inB+QBQPny5ZlMEBERERERgHdILJKTk7F69WqEhobi4cOH0Gg0OvP379+facEREREREVHOoHdiMWzYMKxevRqtWrWCu7s7VBwqjIiIiIgoz9M7sdiwYQM2bdqEli1bZkU8RERERESUA+k9KpSZmRnKlSuXFbEQEREREVEOpXdiMXLkSHz77bfQ84HdRERERESUi+ndFOrw4cM4cOAAdu/ejcqVKyNfvnw687dt25ZpwRERERERUc6gd2JRuHBhtGvXLitiISIiIiKiHErvxGLVqlVZEQcREREREeVg7/yAvEePHuHq1asAgAoVKsDOzi7TgiIiIiIiopxF787bcXFx+Oyzz+Do6IiGDRuiYcOGcHJyQu/evfHixYusiJGIiIiIiN5zeicW/v7++OOPP/Drr78iOjoa0dHR2LFjB/744w+MHDkyK2IkIiIiIqL3nEr0HDfW1tYWW7ZsQePGjXWmHzhwAB07dsSjR48yM773VmxsLKytrRETEwMrKytjh0OUu6lUxo4g58jMocBZ7xnHejcODn2fs3Ffzzgj7uv6nPPqfcfixYsXsLe3TzO9WLFibApFRERERJRH6Z1YeHt7Y8qUKYiPj1emvXz5EtOmTYO3t3emBkdERERERDmD3qNCffvtt/D19UWJEiVQrVo1AMDZs2dhYWGBPXv2ZHqARERERET0/tM7sXB3d8f169fx008/4cqVKwCALl26oGvXrrC0tMz0AImIiIiI6P33Ts+xyJ8/P/r06ZPZsRARERERUQ6ldx+LgIAArFy5Ms30lStXYtasWZkSFBERERER5Sx6JxbLli2Dm5tbmumVK1dGUFBQpgRFREREREQ5i96JRUREBBwdHdNMt7Ozw4MHDzIlKCIiIiIiyln0TiycnZ1x5MiRNNOPHDkCJyenTAmKiIiIiIhyFr07b/fp0wfDhw/Hq1ev0KRJEwBAaGgoxowZg5EjR2Z6gERERERE9P7TO7EYPXo0njx5goEDByIxMREAYGFhgS+++ALjxo3L9ACJiIiIiOj9pxIReZcFnz9/jsuXL8PS0hKurq4wNzfP7Njea7GxsbC2tkZMTAysrKyMHQ5R7qZSGTuCnOPdDunpY71nHOvdODKz3in7cV/POCPu6/qc8+rdx0IrIiICUVFRKFu2LMzNzfGO+QkREREREeUCeicWT548QdOmTVG+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Xo3OnTunG8ecOXOwdOlS3Lx5M0Nxx8bGwtraGjExMbCystJ3szOHSmWcz82JMms3Z51nXGYeWljvGcd6Nw7Wu3Hw2J79uK8bhxFP1/U55zXqHYvExEScPHkSPj4+yjS1Wg0fHx+EhYWlu0xYWJhOeQDw9fVVyoeHhyMiIkKnjLW1Nby8vN64TiAl+bCxsTFkc4iIiIiI8ixTY37448ePkZycDHt7e53p9vb2uHLlSrrLREREpFs+IiJCma+d9qYyr7tx4wYWLVqEuXPnvjHWhIQEJCQkKO9jY2PfWJaIiIiIKK8xeh8LY7t37x6aN2+ODh06oE+fPm8sFxAQAGtra+Xl7OycjVESEREREb3fjJpY2NrawsTEBJGRkTrTIyMj4eDgkO4yDg4Oby2v/Tcj67x//z4++OAD1K1bF8uXL39rrOPGjUNMTIzyunv37n9vIBERERFRHmHUxMLMzAyenp4IDQ1Vpmk0GoSGhsLb2zvdZby9vXXKA0BISIhS3sXFBQ4ODjplYmNjcfToUZ113rt3D40bN4anpydWrVoFtfrtVWFubg4rKyudFxERERERpTBqHwsA8Pf3R48ePVCzZk3Url0bCxYsQFxcHHr16gUA6N69O4oXL46AgAAAwLBhw9CoUSPMmzcPrVq1woYNG3DixAnljoNKpcLw4cMxY8YMuLq6wsXFBZMmTYKTkxP8/PwA/JtUlCpVCnPnzsWjR4+UeN50p4SIiIiIiN7M6IlFp06d8OjRI0yePBkRERHw8PBAcHCw0vn6zp07OncT6tati3Xr1mHixIkYP348XF1dsX37dri7uytlxowZg7i4OPTt2xfR0dGoX78+goODYWFhASDlDseNGzdw48YNlChRQiceI4++S0RERESUIxn9ORY5FZ9jkcNwrPPsx7HOjYP1bhysd+PgsT37cV83Dj7HgoiIiIiI8gomFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkREREREZDAmFkRERERE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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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rKys4nXH6tSkatWqsLKy0hq3QURJg2MsiIgoRUybNg0XLlxAtWrVYGhoqEyN2bVr11Q5per3nD59Gv3790ezZs2QPXt2XLx4EX/++SdcXFy0Bh7/iIYMGaL0p09r04IuWbIE79+/B4BY94ggIt0wsSAiohRRvnx5HDhwAOPHj8eHDx+QO3dujB07FiNGjNB3aMnC0dER9vb2mDt3Lt6+fQsLCwu0bdsWU6ZM0bpr94+ocOHCWtO2piXu7u76DoEozeIYCyIiIiIi0hnHWBARERERkc6YWBARERERkc44xiIOUVFRePHiBbJkyaJ1EyMiIiIiovRERPD+/XvY2dlBrf52mwQTizi8ePEiTc5QQkRERESUGE+fPkWuXLm+WYaJRRyyZMkCILoCzczM9BwNEREREZF+BAcHw97eXjk//hYmFnHQdH8yMzNjYkFERERE6V58hgdw8DYREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREenMUN8BEBEpVCp9R5C6iOg7AiIiIgVbLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGc/RGKxYMECODo6wtTUFO7u7jh79uxXyy5duhSVKlVCtmzZkC1bNnh4eMQqLyIYPXo0bG1tkSFDBnh4eODevXvJvRlEREREROmW3hOLjRs3YsCAARgzZgwuXryI4sWLw9PTE69evYqz/JEjR9CqVSscPnwYp06dgr29PWrVqoXnz58rZaZNm4a5c+di8eLFOHPmDDJlygRPT0+Ehoam1GYREREREaUrKhERfQbg7u6O0qVLY/78+QCAqKgo2Nvbo0+fPvD29v7u6yMjI5EtWzbMnz8fbdu2hYjAzs4OAwcOxKBBgwAAQUFBsLa2xsqVK9GyZcvvrjM4OBjm5uYICgqCmZmZbhtIRPGnUuk7gtRFv4dvIiJKBxJyXqzXFovw8HBcuHABHh4eyjK1Wg0PDw+cOnUqXuv4+PEjPn/+DAsLCwCAr68v/Pz8tNZpbm4Od3f3r64zLCwMwcHBWn9ERERERBR/ek0s3rx5g8jISFhbW2stt7a2hp+fX7zWMXToUNjZ2SmJhOZ1CVnn5MmTYW5urvzZ29sndFOIiIiIiNI1vY+x0MWUKVPw119/4e+//4apqWmi1zNs2DAEBQUpf0+fPk3CKImIiIiI0j5Dfb65paUlDAwM4O/vr7Xc398fNjY233ztjBkzMGXKFBw8eBDFihVTlmte5+/vD1tbW611urq6xrkuExMTmJiYJHIriIiIiIhIry0WxsbGKFmyJHx8fJRlUVFR8PHxQbly5b76umnTpmH8+PHYu3cvSpUqpfWck5MTbGxstNYZHByMM2fOfHOdRERERESUeHptsQCAAQMGoF27dihVqhTKlCmDOXPmICQkBB06dAAAtG3bFjlz5sTkyZMBAFOnTsXo0aOxfv16ODo6KuMmMmfOjMyZM0OlUsHLywsTJkyAs7MznJycMGrUKNjZ2aFRo0b62kwiIiIiojRN74lFixYt8Pr1a4wePRp+fn5wdXXF3r17lcHXT548gVr9v4aVRYsWITw8HD///LPWesaMGYOxY8cCAIYMGYKQkBB07doVgYGBqFixIvbu3avTOAwiIiIiIvo6vd/H4kfE+1gQ6QnvY5EwPHwTEVEySzX3sSAiIiIiorSBiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREelM58QiLCwsKeIgIiIiIqJULMGJxZ49e9CuXTvkyZMHRkZGyJgxI8zMzFClShVMnDgRL168SI44iYiIiIjoBxbvxOLvv/9G/vz50bFjRxgaGmLo0KHYtm0b9u3bh2XLlqFKlSo4ePAg8uTJg+7du+P169fJGTcREREREf1AVCIi8SlYrlw5jBw5EnXq1IFa/fV85Pnz55g3bx6sra3Rv3//JAs0JQUHB8Pc3BxBQUEwMzPTdzhE6YdKpe8IUpf4Hb6JiIgSLSHnxfFOLNITJhZEesLEImF4+CYiomSWkPPiJJkVKjIyEpcvX8a7d++SYnVERERERJTKJCqx8PLywp9//gkgOqmoUqUKSpQoAXt7exw5ciQp4yMiIiIiolQgUYnFli1bULx4cQDAv//+C19fX9y+fRv9+/fHiBEjkjRAIiIiIiL68SUqsXjz5g1sbGwAALt370azZs2UGaOuXbuWpAESEREREdGPL1GJhbW1NW7evInIyEjs3bsXNWvWBAB8/PgRBgYGSRogERERERH9+AwT86IOHTqgefPmsLW1hUqlgoeHBwDgzJkzKFiwYJIGSEREREREP75EJRZjx46Fi4sLnj59imbNmsHExAQAYGBgAG9v7yQNkIiIiIiIfny8j0UceB8LIj3hfSwShodvIiJKZgk5L453i8XcuXPjHUDfvn3jXZaIiIiIiFK/eLdYODk5aT1+/fo1Pn78iKxZswIAAgMDkTFjRuTIkQMPHz5M8kBTElssiPSELRYJwxYLIiJKZsly521fX1/lb+LEiXB1dcWtW7fw9u1bvH37Frdu3UKJEiUwfvx4nTeAiIiIiIhSl0SNscibNy+2bNkCNzc3reUXLlzAzz//DF9f3yQLUB/YYkGkJ2yxSBi2WBARUTJLlhaL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RERERPR9ieoKlSlTJmVcha2tLR48eIAiRYoAiB7nEF8DBgxAu3btUKpUKZQpUwZz5sxBSEgIOnToAABo27YtcubMicmTJwOIHpx98+ZN5f/Pnz/H5cuXkTlzZuTLly9e6yQiIiIioqSXqMSibNmyOHHiBAoVKoS6deti4MCBuHbtGrZt24ayZcvGez0tWrTA69evMXr0aPj5+cHV1RV79+5VBl8/efIEavX/GlVevHgBNzc35fGMGTMwY8YMVKlSBUeOHInXOomIiIiIKOkl6j4WDx8+xIcPH1CsWDGEhIRg4MCB+O+//+Ds7IxZs2bBwcEhOWJNMbyPBZGecF7zhOF9LIgoteLxPmFSyX0sEtxiERkZiWfPnqFYsWIAortFJeRu20RERERElPYkePC2gYEBatWqhXfv3iVHPERERERElAolalYoFxcXPHz4MKljISIiIiKiVCpRicWECRMwaNAg7Ny5Ey9fvkRwcLDWHxERERERpS+JGrwdc6YmVYzBNyIClUqFyMjIpIlOTzh4m0hPOJgvYTh4m4hSKx7vEyatDt4GgMOHDycqMCIiIiIiSpsSlVhUqVIlqeMgIiIiIqJULFGJxbFjx775fOXKlRMVDBERERERpU6JSiyqVq0aa1nMsRapfYwFERERERElTKISiy/vYfH582dcunQJo0aNwsSJE5MkMCIiSkEcSJkwHDhPRBRLohILc3PzWMtq1qwJY2NjDBgwABcuXNA5MCIiIiIiSj0SdR+Lr7G2tsadO3eScpVERERERJQKJKrF4urVq1qPRQQvX77ElClT4OrqmhRxERERERFRKpKoxMLV1RUqlQpf3luvbNmyWL58eZIERkREREREqUeiEgtfX1+tx2q1GlZWVjA1NU2SoIiIiIiIKHVJVGLh4OCQ1HEQEREREVEqluDEIioqCitXrsS2bdvw6NEjqFQqODk54eeff0abNm207mdBRERERETpQ4JmhRIRNGjQAJ07d8bz589RtGhRFClSBI8fP0b79u3RuHHj5IqTiIiIiIh+YAlqsVi5ciWOHTsGHx8fVKtWTeu5Q4cOoVGjRli9ejXatm2bpEESEREREdGPLUEtFhs2bMDw4cNjJRUAUL16dXh7e2PdunVJFhwREREREaUOCUosrl69itq1a3/1+Tp16uDKlSs6B0WkVyoV/xLyR0RERIQEJhZv376FtbX1V5+3trbGu3fvdA6KiIiIiIhSlwQlFpGRkTA0/PqwDAMDA0REROgcFBERERERpS4JGrwtImjfvj1MTEzifD4sLCxJgiIiIiIiotQlQYlFu3btvluGM0IREREREaU/CUosVqxYkVxxEBERERFRKpagMRZERERERERxYWJBREREREQ6Y2JBREREREQ6Y2JBREREREQ6S9DgbSIiIqI0Q6XSdwSpi4i+I6AfHFssiIiIiIhIZ0wsiIiIiIhIZ0wsiIiIiIhIZxxjQUREpE/s558w7OdP9MNiiwUREREREemMLRY/Kl7BShhewSIiIiLSK7ZYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzn6IxGLBggVwdHSEqakp3N3dcfbs2W+W37x5MwoWLAhTU1MULVoUu3fv1nq+ffv2UKlUWn+1a9dOzk0gIiIiIkrX9J5YbNy4EQMGDMCYMWNw8eJFFC9eHJ6ennj16lWc5f/77z+0atUKnTp1wqVLl9CoUSM0atQI169f1ypXu3ZtvHz5UvnbsGFDSmwOEREREVG6pBIR0WcA7u7uKF26NObPnw8AiIqKgr29Pfr06QNvb+9Y5Vu0aIGQkBDs3LlTWVa2bFm4urpi8eLFAKJbLAIDA7F9+/ZExRQcHAxzc3MEBQXBzMwsUevQmUqln/dNrZJyN2bdJwzrXn9Y9/rDutcf1r3+sO71R4+n6wk5L9Zri0V4eDguXLgADw8PZZlarYaHhwdOnToV52tOnTqlVR4APD09Y5U/cuQIcuTIgQIFCqBHjx4ICAj4ahxhYWEIDg7W+iMiIiIiovjTa2Lx5s0bREZGwtraWmu5tbU1/Pz84nyNn5/fd8vXrl0bq1evho+PD6ZOnYqjR4+iTp06iIyMjHOdkydPhrm5ufJnb2+v45YREREREaUvhvoOIDm0bNlS+X/RokVRrFgx5M2bF0eOHEGNGjVilR82bBgGDBigPA4ODmZyQURERESUAHptsbC0tISBgQH8/f21lvv7+8PGxibO19jY2CSoPADkyZMHlpaWuH//fpzPm5iYwMzMTOuPiIiIiIjiT6+JhbGxMUqWLAkfHx9lWVRUFHx8fFCuXLk4X1OuXDmt8gBw4MCBr5YHgGfPniEgIAC2trZJEzgREREREWnR+3SzAwYMwNKlS7Fq1SrcunULPXr0QEhICDp06AAAaNu2LYYNG6aU79evH/bu3YuZM2fi9u3bGDt2LM6fP4/evXsDAD58+IDBgwfj9OnTePToEXx8fNCwYUPky5cPnp6eetlGIiIiIqK0Tu9jLFq0aIHXr19j9OjR8PPzg6urK/bu3asM0H7y5AnU6v/lP+XLl8f69esxcuRIDB8+HM7Ozti+fTtcXFwAAAYGBrh69SpWrVqFwMBA2NnZoVatWhg/fjxMTEz0so1ERERERGmd3u9j8SPifSxSIc6trT+se/1h3esP615/WPf6w7rXH97HgoiIiIiI0gsmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpLMfIrFYsGABHB0dYWpqCnd3d5w9e/ab5Tdv3oyCBQvC1NQURYsWxe7du7WeFxGMHj0atra2yJAhAzw8PHDv3r3k3AQiIiIionRN74nFxo0bMWDAAIwZMwYXL15E8eLF4enpiVevXsVZ/r///kOrVq3QqVMnXLp0CY0aNUKjRo1w/fp1pcy0adMwd+5cLF68GGfOnEGmTJng6emJ0NDQlNosIiIiIqJ0RSUios8A3N3dUbp0acyfPx8AEBUVBXt7e/Tp0wfe3t6xyrdo0QIhISHYuXOnsqxs2bJwdXXF4sWLISKws7PDwIEDMWjQIABAUFAQrK2tsXLlSrRs2fK7MQUHB8Pc3BxBQUEwMzNLoi1NIJVKP++bWiXlbsy6TxjWvf6w7vWHda8/rHv9Yd3rjx5P1xNyXmyYQjHFKTw8HBcuXMCwYcOUZWq1Gh4eHjh16lScrzl16hQGDBigtczT0xPbt28HAPj6+sLPzw8eHh7K8+bm5nB3d8epU6fiTCzCwsIQFhamPA4KCgIQXZGUSvCz0h/Wvf6w7vWHda8/rHv9Yd3rjx7rXnM+HJ+2CL0mFm/evEFkZCSsra21lltbW+P27dtxvsbPzy/O8n5+fsrzmmVfK/OlyZMnY9y4cbGW29vbx29DSP/MzfUdQfrFutcf1r3+sO71h3WvP6x7/fkB6v79+/cw/04cek0sfhTDhg3TagWJiorC27dvkT17dqjYVKcIDg6Gvb09nj59qr8uYukU615/WPf6w7rXH9a9/rDu9Yd1HzcRwfv372FnZ/fdsnpNLCwtLWFgYAB/f3+t5f7+/rCxsYnzNTY2Nt8sr/nX398ftra2WmVcXV3jXKeJiQlMTEy0lmXNmjUhm5KumJmZ8QunJ6x7/WHd6w/rXn9Y9/rDutcf1n1s32up0NDrrFDGxsYoWbIkfHx8lGVRUVHw8fFBuXLl4nxNuXLltMoDwIEDB5TyTk5OsLGx0SoTHByMM2fOfHWdRERERESkG713hRowYADatWuHUqVKoUyZMpgzZw5CQkLQoUMHAEDbtm2RM2dOTJ48GQDQr18/VKlSBTNnzkS9evXw119/4fz58/jjjz8AACqVCl5eXpgwYQKcnZ3h5OSEUaNGwc7ODo0aNdLXZhIRERERpWl6TyxatGiB169fY/To0fDz84Orqyv27t2rDL5+8uQJ1Or/NayUL18e69evx8iRIzF8+HA4Oztj+/btcHFxUcoMGTIEISEh6Nq1KwIDA1GxYkXs3bsXpqamKb59aYmJiQnGjBkTq9sYJT/Wvf6w7vWHda8/rHv9Yd3rD+ted3q/jwUREREREaV+er/zNhERERERpX5MLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiI9CAqKkrfIRD9EPhdoNQo5n4bEREBAPj8+bO+wvlhMLEgveAPif5pPoPPnz8jNDRUz9GkL1FRUVCr1Xj69Clu376t73DShcjISH2HQF+huVfV69ev9RxJ6hDzLgGaE1pKeWq1Go8ePUJgYCAMDQ2xfft2jBgxAuHh4foOTa+YWFCKExHlh2TBggU4ePAgD44pTHNie+vWLXTp0gU1atTAoEGDeJKbAjR1f+3aNVStWhWLFy9GUFCQvsNKU27evIk3b94AALy9vXH9+nUYGBjoOSr60sGDBzF9+nQAQK9evTB48OB0f1L2PSIClUqFV69e4dOnTzA0NMSBAwdw5swZfYeW7oSFhaFdu3Zwc3PDypUr0aRJE5QoUQLGxsb6Dk2veIM8SlGakyoACAoKgrOzM3Lnzo1Zs2ahQoUK/PFPAZofphs3bqBy5cr46aefYGNjg+XLl6NHjx747bff9B1imnfv3j2UL18e7du3x7hx45AxY0Z9h5QmiAiuX7+OGjVqYMSIEbhz5w4WL16Mq1evwsXFRd/hUQwhISHw8vLC5cuXYW5ujnPnzuHUqVMoXLiwvkP74b158watW7dG8eLFUbx4cbRp0wb//PMPfvrpJ32Hlu68evUKpUqVwqtXrzB79mz06NEDkZGR6fpchokF6cXgwYPx7NkzPH/+HFevXkWOHDmwbNkyVKxYUUk8KPkEBwejYcOGcHd3x5QpUwAAM2bMwO3btzF37lye6CazadOm4dq1a1izZg0iIyOxatUqPHr0CPny5UOlSpXg5OSk7xBTtYkTJ2LmzJkIDQ3F7t27UbVqVa2LGvRjCAoKQo0aNXDx4kUMHDhQab3gZ/VtHz9+xIwZM7B27Vo8fvwYCxYsQOfOndP9CW1K0lyge/PmDVxcXBAVFQU7OzscOXIEWbNmTdefBb+5lOL++OMPLFu2DIMHD8b69etx5coVWFhYoH379jhx4gT7QqeAqKgoBAcHo2jRosqyhw8f4sqVK3Bzc0Pbtm2xatUqPUaYtl25cgVmZmYAgOrVq2PRokU4fPgwevfujf79+8PHx0fPEaZOmmNHoUKFoFarYWZmhsuXL+Ply5c8Uf3BREVFITQ0FK6urmjWrBlOnTqFGTNmAIjuu87usXGLiopCxowZ4enpidevX8PGxga+vr749OkTDAwM+PuZAjRJxd27dxEUFITbt2/jwoULAIDKlSsjMDAQBgYGyjjG9DaGkUdaSnEPHz5EhQoVUKJECeTMmRMODg44ceIELCws0LNnTyYXKeDDhw8ICAjAmTNn4OPjg3HjxmHVqlX45ZdfMGjQIHz69AmrV6/GjRs39B1qmqLZr+3t7WFoaIjNmzfDxMQEu3btwvHjx3H8+HG8fPmSSV0iaa4Q1qxZE76+vujTpw9mzZqFVatWwc/PL1Z5TiKhP2q1GtbW1li2bBkWLFiAokWLYsuWLZg5cyYAwNDQEADw4sULfYb5Q9GMT3zz5g2yZMmCnTt3olu3bvDx8cGoUaMQGhrK5CKZaZKKbdu2oWHDhtiyZQtCQ0Nhb2+PdevWQa1Wo2rVqnj37h3UajV+//13jBs3Ln0da4QohURGRoqISPfu3aVYsWLK8k+fPomIyNatW0WlUombm5tcvnxZRESioqJSPtA05mt1uGnTJnFwcJD69euLlZWVbNy4UXnu+vXrYmpqKuvXr0+pMNMkzT4fFBSktXzbtm2iUqmkevXq0rt3b63nfHx8RK1Wy/Xr11MszrREU+cao0ePFnt7e5k+fbr4+fmJiMjPP/8st27d0kd49P80xyXN5/X06VPp0aOHVKhQQSZNmiRhYWFSo0YN6du3rz7D/GFo6mvHjh1Srlw52blzp4iIhISEyOjRo8Xd3V0GDx4soaGhIiKybNkyOXv2rN7iTcv2798vGTJkkPnz58ubN2+0nrtx44aULFlSLC0tpXnz5mJoaChXrlzRU6T6wRYLSjZfZuiargg9evTA8+fPMWzYMACAqakpACBTpkzw8vKCWq1Gz549AQAqlSoFI057oqKilBlErly5goMHD0JEICJo1qwZzp49i+XLl8Pe3l7p1y8isLOzg6urKzJlyqTnLUi9NP3Er1y5gurVq+PmzZvKc40bN4aXlxcOHz4Mf39/raZyW1tbuLq6IkuWLPoIO9XTHGc0x59x48ahY8eOWLhwIfr06YPKlSvj+PHjyJs3rz7DTPc0x3a1Wg0RQa5cuTB8+HCULl0ay5YtQ/78+fH69Wtl3EV6p1Kp8O+//6Jly5Zo2LChsv9mzJgRQ4cOhaenJ06cOIGWLVti4MCB6NKli9LdkhLv7du3yv+joqIQHh6OFStWoFu3bujVqxeyZ88O4H+t0YULF8bBgwfRpk0b5MiRA1euXEGxYsX0Eru+GOo7AEqbJMaUsn/99Rdu376NEiVKoESJEihWrBiGDx+OhQsXIjQ0FKNHj8bbt28xd+5clC5dGkuXLkWFChVw6NAhVK9eXc9bknppTmyvX7+O1q1bIzIyEjdv3kStWrWwcuVK2NjYIHv27Hj16hXevn2LJ0+eoHTp0hARzJkzBy9fvkSJEiX0vRmpUsykokyZMhgwYIAy243muc6dO+Pdu3dYu3Yt5s+fj+bNm8Pa2hobNmxAWFgYB9DrSK1WK3U9duxY5MiRAzdu3ICZmRkOHToEQ0NDREREKF1uSH9UKpWSXIwcORItW7aEr68vmjVrBgMDA35OAN69e4cpU6Zg2LBhGDp0qLI8IiICGTNmhLe3N3LkyIH9+/fj3LlzuHTpEgoUKKDHiFO/GTNm4NWrV5g4cSKMjIygVqthbGyMp0+fInfu3AD+1zVK0w3T19cXTk5OmDVrFj5//gwjIyN9boJ+6K+xhNKqmF1vvL29JVu2bFK6dGmxsrKSNm3ayLVr1yQ8PFyWLFki1tbWYmFhIbly5RJXV1eJiIiQ69evi5OTk1y9elWPW5E23LlzR3LkyCEjR46UGzduyJ07d8TGxiZW94KRI0eKWq2WypUri4eHh9jZ2cnFixf1FHXqptn/r127JhkyZJBRo0Ypz71//158fX2Vx35+fuLt7S1GRkaSJ08eKVGihNjY2MilS5dSOOq0K2bXqIiICOX/nz9/1kc49A1xddtMj5+Tt7e3HDlyRGuZv7+/5MmTR/bs2SMi0fu1pr6ioqK06u79+/cpF2watmDBArl9+7aIiHz8+FFEovfHqlWrSuPGjZVymrp//vy5jB8/Xu7cuZPywf5AmFhQkor5w33+/Hlp3LixnD59WkSi+/RXqlRJmjRpooyheP/+vezYsUOOHTumvHbo0KHi5uam9IemxPnw4YO0b99eunXrJp8/f1YOfrNnzxZ3d3eJiopS6jwqKkpWrVolHTt2lPHjx8u9e/f0GXqq9/r1a3FxcZHChQsryzp06CClSpWSbNmySf369eXUqVPKZ3L69GnZsGGD/PXXX/Lo0SN9hZ0qJHbcVcyTsC/HYVDS+1odf+/z47g6kU6dOsXqlx8cHCy2trYyZcoUZZnm+H3x4kXZunVrukzCUsKJEyekd+/eSsJw4MABMTIykpEjR2qVGzp0qJQoUUJevXqljzB/GLyPBSWJHTt2oGHDhsrjNWvWYMuWLRARZeYbANi2bRvmzJkDa2trDBgwAOXKlVNec+3aNSxcuBAbNmzA0aNHUbx48RTfjrQkNDQU7du3R5UqVdCjRw9l+datW+Hl5YXbt2/DxMQk3XcxSA7v37/HiBEjcPXqVZQvXx7Hjh2Dubk56tSpAwcHBwwbNgwZM2bEsmXL0l3/W13EvL/B27dv8enTJ+TMmVN5Xv6/W8KXYi5///49x68ks5ifk4+PD54+fQp7e3sUKlQIdnZ2X71PRczP6ciRI8iTJ4/S5SQ9OnDgANRqNWrUqIGIiAj07dsXV69exeDBg7V+b728vHDz5k1s27YNmTNn1mPEqZ9mH9ScGqtUKsyYMQNLlixB/fr10adPHzg5OWHu3LkYPHgwatSoATs7O3z69Am7du3C4cOH4ebmpuet0DP95TSUVkyYMEHatGmjdYVq6tSpYm9vL/b29rFmX9m2bZtUq1ZNqlevLjdu3FCW7927V/r168fZcJKA5rN49+6dskxzdevAgQPi4uKiVf7hw4e8ipvEAgMDZciQIZI7d26pVauWVgtccHCw2NnZSb9+/fQXYCoTc/8cN26cVKhQQczNzaVLly6yb98+5bkvr3jHfDx79mzJly+fhISEJH/A6VTM+h4yZIg4OTlJ/vz5pVy5clKvXj3l9+DL403M1y1cuFBUKpWcP38+ZYL+AXw5S5aISMuWLUWlUsmhQ4dEJLplwtPTU8qVKyejRo2SNWvWSJcuXcTc3DzdzTyU1DT1Hh4eLiIiT5480ZrNb/bs2eLq6ip9+vSRp0+fikh0S3OzZs2kcePG0rVrV63zmfSMiQXp7PHjx0oT7Llz55Tly5cvl4IFC0rnzp2Vfooa69atk549e8b6cdFMPUsJo6nHmF3RYtZtzP/7+PhI3rx5tbqe1a9fn/1yE0lTtx8/fpSgoCAJCwtTnnv37p1MmzZNdu3apZw4aL4rTZs2lZ9//jnlA07lRo0aJdbW1rJ69Wo5duyYFC5cWKpWrao1XXLMbk8aixcvluzZs8u6detSPOb0aPr06ZIzZ045ceKEiER/bsbGxuLu7q6Mn9N8d778nLJlyyabN29O+aD14MvfwA8fPmg9/vXXX8Xc3FwOHDggItFjt4YNGyZ58uSRYsWKiYeHB5MKHWk+g/v370vfvn3F1dVVjI2NpXjx4uLt7a2UmzlzphQvXlz69Okj9+/f13ptzN/e9I6JBekkZp/Of/75RwoUKCDz5s1Tls2fP1/c3Nyke/fuXx3QxCvlutHU371792TatGny+PHjb5Y/ePCgWFtbS0REhIwcOVKMjIw433kiaer+xo0bUrt2bXFzc5PChQvL+vXrlUQtNDRUK9kQif4Rql+/vowbN05E2K/8W2LWzZEjR6RQoUJy7NgxERH577//xNjYWAoXLizu7u6ybds2pWzMY9PixYvFzMxMtmzZknKBpzMxj+Nv376VOnXqyJo1a0REZNeuXZIlSxbp3bu3lCtXTsqVK6dcbErPn5Omzh4/fiyzZ8+WmjVrSqlSpcTLy0sOHjyolGvZsqWYmZkpyYVIdL0FBwez9U1Hms/gypUr4uDgIB06dJDJkyfLxo0bpWnTpmJkZCRNmzZVyk+fPl1cXV2lf//+WhdMeQz/HyYWlCSOHTsmN27ckDZt2kjFihVlwYIFynPz5s2TEiVKSK9evdhUmEzu3bsnFhYWYmhoKL/99ps8e/bsq2V9fHykdOnS4u3tLcbGxnLhwoUUjDTt0PyQ3LhxQywtLaV3796ybt06ad26tdja2sZqpYv5uuHDh0vOnDk5SP47Yp6svnv3Tu7cuSMLFy4UEZF9+/aJhYWFrFy5Up4/fy6WlpZSqVIl+fPPP7XWsWTJEjE3N083J6v6EPOkaufOnRIcHCynTp0SX19fuXDhgtjb2yuf2+jRo0WlUomTk5PcvXtXed2CBQvEwsIi3XxOmn372rVrUqhQIWnSpIn8/PPP0qdPH8mUKZM4OzvL7NmzlfKtWrUSc3NzpVsU6U7zGVy+fFkyZcokQ4YM0eo14e/vL/Pnz5cMGTJI27ZtleW///67ODo6ytChQzlgPg5MLChRYv7gDx8+XFQqlbx7905u374tHTp0kHLlymklFwsWLJBcuXLJ9OnT9RFumvb+/Xtp1aqVtGnTRkaMGCE5c+aUMWPGfDW5OHjwoKhUKrGyskpXfZiTQ0BAgNSoUSPW3bM1V7S+tGXLFqlfv75YW1tzOt8E6NOnj/Tv319evXolAQEB8unTJ6lbt66MHTtWORZVqVJFbG1tZeDAgcrrNmzYICqVSrZu3aqv0NO8mL8FY8aMkXz58snNmzeVZZMmTZJGjRpp3RH6p59+kgkTJijdR65evSoqlUo2bdqUssHrScwT2ixZssiQIUO0ZhK6ceOGVKtWTfLlyyfLli1Tlrdr105UKpUcPXo0xWNOqx49eiRqtVppPdYkCjHHKY4fP14yZMiglfQuWrRIHj58mPIBpwKcDoYSRTOjx4MHD2BkZIT9+/cja9asyJo1K4YNG4bJkydj7dq1UKlU6NGjB3r27Alra2s0atRIv4GnQSKCChUqIHv27GjZsiUsLCwwa9YsiAi6dOmCXLlyaZUvWrQoChUqhA0bNnBGIh09evQIhoaGaN26NQAgPDwcxsbGKFmyJD5+/BirfIkSJeDj44OpU6eiUKFCKR1uqiExZge6ffs2du3ahdWrV8PKygoAEBISgpcvXyJjxoxQq9UICwuDo6MjhgwZgtq1awOIvhOulZUV9uzZA09PT71tS1qn+S149OgR7t69i4ULF2rt2yEhIbh+/TrevHmDnDlzYufOnahQoQK8vb0BRM8gVbRoUdy9exf58uXTyzakNLVajTt37qBChQrw8vLChAkTlDs3f/78GYULF1Zumrly5Uo0bNgQlpaW+PPPP2FiYgJra2s9b0HaEB4ejgsXLiBr1qzw9fUFgFg3zsyaNStatmyJOXPm4PHjx8pru3fvrpeYUwU9JzaUysS8OrV161ZRqVSSO3du5eqr5vm7d+9Khw4dpGLFijJt2jStdXCQU9KI2f3g3bt3Wp/NjBkzJGfOnDJq1Cil5eLz58/KbBZsvtVNzLqPeZVVU68jR46U9u3ba70mODhYRLj/J8TkyZOlX79+sW7o+ObNG6lRo4Y0aNBAfvvtN6lZs6aUKFEi1kBK9ntOGUuWLBEzMzNxcXGRa9euicj/6n7v3r1SqVIlsbe3l2LFiknBggWV70l6vadIZGSkdOzYUbJnz651/PhyMPvevXtFpVJpjbcg3S1YsEDphvru3TvZuHGj2NvbS8uWLZUyERERWsePAgUKyODBg1M81tQo9kTSRF8RHh6uXJ36/PkzSpcujbZt28LPzw9+fn4Aoq8+RUVFwdnZGcOGDYOlpSXu37+vzAkNAAYGBnqJP63RXNHdv38//P39oVarlateAwcOhJeXF5YvX44//vgDvr6+8Pb2RteuXREaGhrnHPIUf5q6P3z4sNLqIyLKVa7Q0FDlOwEAM2fOxPz58xEREcG6j6fw8HA8ffoUc+fOxY0bN5TlIoLs2bNj8uTJCA0Nxb59+2BiYoLTp09DrVYjKipKOcbEdU8LSnqdOnVCkSJFcOPGDVy/fh2RkZFK3Xt6emLkyJHo168fmjVrhmvXrsHQ0FApkx6/D2q1GuPGjUPVqlUxf/58rFy5UlkeFRWllCtSpAiyZMmCV69e6SnStMfPzw+rVq1CtWrV8PDhQ2TNmhW1a9fGtGnTcPLkSbRq1QpA9HmK5vf02rVrMDMzg4eHhz5DTz30nNhQKrFnzx5ZuXKliIh07txZqlatKiIi169fl6ZNm0qWLFmUO2xHREQoV16ePn0a55SClDROnTolKpVK1q1bF+c86DNmzBAHBwcpUqSImJiYsF9/EtLU/dq1a2NNbzpy5EhlKtlRo0aJSqVSptikuMV15frVq1cycuRIUavVyjSxkZGRStng4GD5+PFjrKl8Kfl8rcUtIiJCXF1dxdnZWU6fPv3N4316b7XTbP+zZ8+kYcOGUrlyZeX3VeR/34WDBw9KsWLFYt0LinRz9uxZ8fT0FAcHB2Xa2KCgINmwYUOslguR6PuxVKhQQeteRPR1TCwoXho3biz58uWTOnXqSPbs2bXmzb5165Y0b95ccuTIIWfOnBGR6B/4mD8s6bG5O7ldv35dduzYIVOnTo31XMz6LlWqlFhYWPDENgl9re41Jwy//fab9OrVSyZNmiSmpqYcJP8dMffXZ8+eac2WFR4eLv369RMDAwP5+++/lfLfuhEeJb3AwECtx9u3b5c5c+bIzp075fLlyyISfdx3cXGRwoULy5kzZ+K8n0h6Flc9PHnyJM7kQkSkb9++Uq9evVh1T4kTM6E9ceKE1K5dWwoWLKhM0R5XcjFx4kQxMzPj72cCMLGgb4p5IHRxcRGVSiUTJkyIVe7mzZvSsmVLsbW1VeaYp6Sn+TyeP38u1tbWYmhoKGPHjhWR2FcBw8PDpXv37rxankQSUveaKTUzZ86sddNI0jZnzhytu9t6e3uLs7OzZMmSRapUqSKLFy+W0NBQiYqKkr59+4qRkZFs375djxGnT126dJHhw4crMxcNHjxYzM3NpVixYuLo6CguLi7KSXFERIQUK1ZMihYtKsePH2dS8f809XD+/HlZtWqVHD16VLkC/vjx41jJxfjx48XS0lKuX7+ut5jTGs1nsHv3bmncuLFUrlxZVCqV5MuXT6vl4q+//hInJyfJkSMHLwwlAhML+qqYXZg+fPggDRs2lFq1aik/Il/emOfmzZtSvXp1qVevnj7CTZM0n4FmqkYRUaa4W7p0qeTNm1fq1q2rPPflCe6CBQt4UEwkXep+5syZkiVLFq1pN0nbzZs3RaVSSZs2bSQ0NFSWLVsmNjY2snbtWtm/f7/8/PPPUrZsWRk9erSEhYXJp0+fZMCAAZxuUw+8vLzEwcFBJk+eLPv27ZOyZcvKyZMnJSoqSs6fPy/9+vUTOzs7Wb9+vYhEf3dsbW2ldevWeo78x7J161YxNzcXJycncXBwkF9++UXp5qRJLmrWrCm1atUSU1NT3mMoGRw5ckTUarUsWLBAzp49K8uWLZNy5cqJo6OjPHjwQESiu1iuXLlSypcvL5cuXdJvwKkQEwuKU8yuCVu2bNE6QWrevLkULlw4VnIRHh4ugYGB7PaUxB48eCB9+/aVV69eyaZNm0SlUsmjR48kKChIVq1aJebm5tKhQwelfHrvv5yUElr3Mfv4f+smhRTt+PHjki1bNunUqZPMnDlTlixZojz38eNH8fb2Fjc3N9m3b5+IRN83ZO7cuRxLkUJitjaMHTtW8uTJIz179pSff/5Z6zhz//596dixo9StW1dp1YiKikq3x6KYv4Hh4eEiIvLixQtp0aKFLF++XD58+CBLly4VDw8P8fT0VH5fHz9+LDVq1BAbGxue0CaTcePGaV0QEhE5efKklClTRpydnbW6RcVsTaX4Y2JBscT8MRkyZIjky5dPpk+frjVwqVmzZuLi4iJLliyR58+fS+XKlaVx48bK80wuks6uXbvEzMxMatasKaamplr9cD98+CCrVq0SW1tb6dSpk7I8vf6gJ7XE1H3MFg76vmPHjkm2bNlEpVLJqFGjRET7GOTq6iodO3aM9TomFykj5rFk9OjRYmhoKPb29uLr66tVbt26dWJmZhbrpmHp9Vj05MkT5f+nTp2S5s2bS7169eT58+fK8o0bN0qNGjXE09NTabl48eIFL0okIc2x5OzZs/LmzRuZOHGi5M6dW0n4NObNmycqlUosLS2VlgtKHCYW9FUTJ04US0tLOX36dJw/Dm3btpV8+fJJnjx5pGTJkhIWFqaHKNMeTVIWFham/F/TZ79y5crKFRWN9+/fy6pVq8Te3l6aN2+e4vGmJaz75BdXn/tTp06Jra2tVKlSRV6+fKlVxsvLSxo2bJhuT1D15WsXh6ZMmSJZs2aV4cOHK/fFEYm+i7Szs7MykDs9CwkJkfLly0vx4sVFRGTlypXi5OQk1tbW8uLFC62yGzduFE9PTylbtqzcvn1bD9GmfXv27BFLS0vZu3evHDx4UNzc3GTp0qVaPS4OHTokHh4e0rp1a7l7964eo0390t8E0hQvb968wcGDBzF37ly4u7vj+fPn2L9/P1q3bo0xY8YAAFatWoX58+dj1qxZOHPmDIyNjREREaHnyFO3qKgoqNVqPHz4EFOmTMG2bdsgIsiYMSOGDh2Kx48f47fffsP169eV12TOnBmNGzfGyJEjcfHiRbx8+VKPW5B6se6TX1RUlHJ/g/fv3yvLy5Yti82bN+Py5cvo27cvfH19ER4ejtDQUJw8eRKWlpa8/00K0nwXAOC///7DuXPn8OzZMwDA0KFD0bt3b6xatQoTJ07EkSNHcPHiRQwdOhTm5uYoWrSoPkP/IRgbG2Po0KEQEdStWxft2rXD9OnTkTFjRvTv3x8vXrxQyjZv3hytW7eGjY0NMmTIoMeo0xb5/3tn+fv7Y8uWLRgxYgQ8PT1RuXJlFChQAMuXL8eaNWsQEhKCqKgoHDhwAFZWVli8eDGcnZ31HH0qp9+8hn5Unz9/lvLly8svv/wiBw4ckIYNG0rZsmWlYcOGYmJiIgMGDIj1Gl5R1I3mCuHVq1fFyclJWrZsqUyvqfHPP/+Ivb29dOzYUW7cuKEs18wcwmkJE4d1n7ImTJggderUkWrVqsmRI0eUvszHjh2TrFmzSp48eaROnTrSuHFjKV68uNJtgTMMpaxBgwaJnZ2dZMiQQX766SdZsWKF8tyYMWMkQ4YMkiFDBmnatKn88ssvyueUnrvCarb98+fPsmfPHilQoIDUrl1bRETWrl0r7u7u0q5dO3n58qXW64KDg1M81rTu9OnTUqFCBSlRooT4+Pgoyz99+iStW7cWNzc3sbS0lIoVK0rGjBk5e2ISYWJBipiJwefPn+WPP/6Q0qVLi6mpqXh7e8vhw4dFJHrcRevWrZlIJIM7d+5I9uzZxdvbWwICAuIs8/fff0vu3LmlU6dOcvDgQRk3bpyoVKqvlqf4Yd2njAULFoiVlZWMHz9eKlasKHZ2djJ//nx58+aNiEQPpHR0dJRs2bLJqVOnlOMMx1Qkv5iJ2/nz58XNzU3OnTsn+/btk5YtW0r58uVl/vz5Spnp06eLSqWSv/76K93epFCTSMTssx8zudi9e7cUKFBA6tSpIyIiq1atEnd3d+nUqZPWeAtKPE19f/z4UUJDQ+Xx48cSGRkp79+/l6pVq4pKpZIpU6ZovSY8PFzOnDkjM2fOlPnz57P7UxJiYkFa7ty5Izt37hSR6Kw+MDBQmd9Zo0qVKjJw4EB9hJdmRUZGyufPn6VHjx7SuXNnreeCg4Pl5s2bsn//fnn//r2IRF89d3FxkaJFi0ru3Ll5rwQdsO6T15dXr2fMmCEbNmxQHvfp00ecnJxk7ty5SoKm6e+seS0vYiS/Lz+nixcvas14dufOHenQoYOUK1dOFixYoCxfuHCh8vmk1xalR48eiZeXl9aNY79suShUqJC0adNGRET++OMPKVy4sPTs2ZP7to409Xzz5k1p0qSJuLi4iKGhobi4uMiMGTPk48ePUqtWLSlevLj8+++/6bo1LaUY6rsrFv04oqKisHjxYsyZMweXLl1C8eLFYWpqCnNzc4SEhODy5csYP3483r17hylTpug73DRFpVLB0NAQL168gKOjo7L833//xT///IP169cjY8aMMDY2xunTp1G/fn3kz58fHz58gI2NDXLmzKm/4FM51n3yERGlr/6OHTsQEBCAS5cuoUCBAkqZuXPnQqVSYc6cOVCpVGjRogWqVauGatWqAYg+LnF8RfLTfE6TJ0/GgQMHYGBgADMzM+X5/PnzY9iwYZg8eTI2bNiADx8+YMiQIejRowcAIDIyMt1+TsHBwdixYwdCQ0PRu3dvFClSBGq1GlFRUTA0NETVqlXh7e2NqVOn4vTp0+jSpQuioqLg6emZbussKWiOL9euXUOlSpXw66+/om7durCwsMCqVaswZMgQXLt2DStWrEDbtm0xfvx4qNVq1K5dW/l8NPs9JSF9ZzakX19eYfL395e//vorVrkdO3ZI69atpU6dOkqTL6+06G758uVy9uxZEYluxtXcIOnvv/+WESNGiIODg7Rt21bWrFkj586dkzJlykitWrVY90mAdZ+8Yh5bBg0aJFmyZBFnZ2dRqVTSsmXLWH3Mvby8JEOGDLJ58+aUDjVdi3kFd86cOWJubi4DBgyQihUrSoYMGWTy5Mla5e/evSuNGjWSrl27ptsWirhcunRJSpQoIZ07d9a6W7bmeBEYGCg5cuSQ2bNn6ynCtOnVq1fi5uYm3t7esZbPnz9fjI2NpXfv3hIeHi5Vq1aVypUry99//819NxkxsUhnYvYD1Xyx/Pz8lDm0v1Y+KChILl68qNW8S7rx9fWVypUri6urq3KH1QcPHkj+/PmlUKFCYmNjI2vWrNGa4rRHjx7i6empr5DTDNZ98tMcXy5evCiNGzeWU6dOSUhIiIwePVqKFy8uI0aM0Lo3jkj0iS0TN/04evSoLFy4UPbs2SMi0fdhGDp0qBQsWFCmTZumVfbp06fKbwFP0P7n4sWLSnIRc4KHz58/y/v378XT01OZFIL1ljQuXrwoLi4ucu3aNeXYodk3AwMDZcKECWJsbCwnTpyQgIAAKVy4sNSuXVs+fPigz7DTNCYW6UiLFi2kVatWyg28oqKiJDAwUAoXLhznFcQPHz7ITz/9JGvXrtVazj6KSWf//v1Sv359KVmypJw+fVpERN6+fSuPHz+O866f7du3l+7du8vnz5/5w6Qj1n3yOHz4sFI/a9askcqVK0v9+vW17nMzevRocXNzk+HDh8dKLkTYGpoS3r17p/z/9OnTolKpJHPmzHLgwAFl+aNHj8Tb21sKFiwoM2bMiLUO/hbEpkkuOnToIBcvXhSR6At0Y8aMEScnp1j3wiHdrFixQkxNTZXHXx6bHz58KObm5jJp0iQRiT7Gf3lzR0pa7FyWjrRo0QI7duzAgAEDEBoaCpVKBXNzc/Tp0wfOzs6wsbHRKh8ZGQlTU1MsXbpUazn7JOouMjISAFCzZk107doVTk5O6NOnD65du4Zs2bLB3t4emTNnVsqHhIRgxIgR2LVrF/r16wdDQ0PlfgCUMKz75OPn54dOnTqhbNmyAKLr7sWLF7h8+TJCQkKUcuPGjUODBg2wf/9+ZdxWTOx3nryOHz+OvHnz4ty5cwCAPHnyYPr06TAwMMD+/fuVcg4ODujRoweaNGmCiRMnYv369Vrr4W9BbG5ubli+fDnu37+PX3/9FU2aNMEvv/yCP//8E9u2bUPu3Ln1HWKaki9fPgDA1q1bASDWsdnJyQl58uTBq1evAADZsmXTGktHyUDfmQ2lDM0VwD179kjGjBmlT58+cV6VFdG+ChUYGMirUslAc1Vl79690rp1aylbtqyoVCopXbq0XLp0SavsvHnzpHv37pIzZ07lChglHus++YSHh8u///4rRYsWlbp164qIyJYtW8TZ2Vlat24d667D/fv3lw4dOrAFKIWFhIRI1apVxcHBQc6fPy8iIgEBATJt2jTJlCmTjBs3Tqv8gwcPZNGiRWxJSoDHjx/LnDlzpGnTpjJhwgS5c+eOvkNKk54+fSo5cuSQBg0ayKNHj5TlmvOWt2/fSvny5WXNmjX6CjHdYWKRDsT8Mbh8+bKMHDlSVCqVDBkyROuW9iLRPy6zZ8+OdRLF5CLpHTlyRFQqlcybN09OnTolc+fOlYoVK0qpUqXk8uXLIiLy+vVradCggbRv315u376t54jTDtZ90ovrxmCaufvXrl0rZcqUifPGYJqkgslFyvr48aPUrl1b7OzslHFGAQEBMn36dMmaNav89ttvcb6OyQX9aLZu3SrGxsbSpk0brYHzIiIjR44UR0dHraSDkhcTi3Rk8ODBkjdvXundu7dUrFhRDA0NpWfPnvLp0yelzP79+0WlUsWaCYSSjuYEavjw4fLTTz9pPbdr1y4pW7aslC5dWq5duyYiIu/fv+dAsyTCuk96Me8Y/L0bg5UtW1Y6duwoz54901oHk4qUE/MiUczkQtNy4e/vLzNnzpTs2bPLoEGD9BUmUbxFRETI4sWLxdDQUAoUKCAdO3aUESNGyC+//CLZsmVja3MKY2KRThw6dEjMzMzk+PHjIhJ987uNGzeKiYmJ9OrVS6vlYteuXbwqlQLGjBkjhQsX1joxExGZNm2aqFQqyZcvHw+IyYR1nzT2798vbdu2latXryrLvmy5KFy4sHKjtUWLFkn+/PllwoQJeok3vdqzZ49s27ZNeRwzkdMkFw4ODuLv7y8i0cnF2LFjpVatWkz6KNU4ffq0NGnSRIoUKSIVKlSQnj17fnXGS0o+HHmVRmkGqGqEhITA0tISxYoVAwCYmpqiefPmWLhwIRYuXIjJkycjKCgIAFC3bl0YGBjEWgclreLFiyMiIgIHDhxAaGiostzV1RXly5dH1apVkTVrVv0FmIax7pOGhYUFzp49iwULFuDGjRsAEOvGYP3798e5c+dw7949dO/eHRMmTIC3t7eeI08/AgMDsXr1agwYMAD//vsvgOgBriICAMiQIQPWrl0LKysrtGzZEgCQI0cO9O/fH3v37tUqS/Qjc3d3x6ZNm3Dt2jWcOHEC8+bNQ8GCBfUdVrrDxCINevv2rTKrypkzZxAZGYlcuXLhyZMnOH36NAAoPxRly5aFubk5Jk6cGGv2J87MkjQ0dX316lUcOHAA69evx6dPn9C4cWOUKFECQ4YMwb///ouAgAAAwKFDh1CwYEFMnz4dTk5O+gw91WPdJ6+SJUtiw4YNOHfuHObMmaOVXGhmlfP09MSDBw9w+fJlAECzZs144SIFZc2aFV5eXqhWrRqGDh2Kf/75B4B2cpE9e3b07dsXfn5+ePHiBQDAzMxMKcNZ0Ci1UKvVyv7K/VZP9NhaQsng0KFDUqdOHXn+/Ln069dP7O3t5dWrV/Lx40dp06aNVKpUSY4ePaqUf/HihXTv3l0OHz7Mm94lo61bt4qNjY1UrVpVbGxspHz58sodhjVNtw4ODlKpUiUxNTVV+viT7lj3yU8zd3+XLl1iDZ709fWVihUryqlTp/QUXfr0ZRemO3fuSNu2baVQoUKyY8cOZbmm2+vmzZulXLly8ubNmxSNk4jSFpUI2zjTkg0bNmDp0qV4/vw53rx5g3PnziFPnjwAoq/Gzp8/H3fv3kX37t2RM2dOLF68GKGhoThy5AhUKhUiIiJgaGio561IW86dO4e6deti2rRp6NChA65fv45ixYph+vTpGDhwIADgwIEDuH79OiIiItCwYUPkz59fz1GnDaz7lHPp0iV07twZLi4u8PLygpubG968eYPOnTvj3bt3OHz4MO97oAerV6/Gy5cvMXToUJw/fx7z58/HuXPn8Ntvv6Fp06YAgLCwMDRt2hQWFhZYtWoVr/QSUaIxsUgjIiMjla5L3bt3xx9//IGqVati2bJlSmIBAKdOncL27duxZMkSODg4IFu2bDhw4ACMjIzY5J1MVqxYgY0bN2Lv3r24c+cO6tati+rVqytdz969e4ds2bLpOcq0iXWfsq5evYq+ffvC19cXuXPnhkRPEIIjR47AyMgIUVFRTC6S2ZfH8e7du+Pw4cO4fPkyMmTIgLNnz2LZsmXYtGkTunfvDnNzc/z33394+vQpzp07x98CItIJE4s0IOaP9aZNm3Dz5k3Y29tj06ZNMDU1xfjx45VB2xpv376FiMDCwoItFUlM86Os+XfChAm4e/cuVq9eDXt7e9StWxeLFi2CWq3G33//jUePHqF79+7IkCEDf9B1xLrXv5cvX8LHxwe3bt2Cs7Mz2rRpAwMDAx5jUkDMfTgkJASZMmUCABQuXBhFihTB5s2bAQC+vr7YuXMnFixYAGdnZzg6OmL27NkwNDTk50REOmFikcrF/CHx9vbG1q1b4eXlhV69emH9+vX4888/kTlzZkyYMAFFixYFAOzfvx+VKlVChgwZAIBXEZPBzp078e7dO7Rp0wanTp2Cp6cnIiIi0K1bN8yePVsp16tXL7x580b5nEh3rPsfT8wWVUp+U6ZMga+vL1q0aIHq1avjwIEDGDlyJHr27Il27dop5UJDQ2Fqaqo85udERLri2WQqp0kqxo8fjz///BPr1q1D69atAQC//PIL+vbti/DwcAwePBj//PMP6tSpA29vb60fEyYVSe+vv/7C4cOHAQBFihRBv379YG5urrQcvXjxAsOHD8fGjRsxZswYntgmIdb9j4cnqyknKCgI+/fvx5o1a9CjRw9MmDABBQsWRIECBXDixAm8e/cOQHQSYWJiorxORPg5EZHO2N6ZBrx9+xbHjh3DnDlzUKZMGTx//hyXLl3C+vXr4eHhAQ8PD/z333/o27cv8uTJgzNnznAawWRmaWmJs2fPAoietrFVq1YIDg5G9+7dMWnSJGTJkgXBwcE4cOAAChcurOdo0xbWPaUnXx7Hzc3N0blzZ6jVanTu3Bnjx4+Hv78/zMzM8Mcff6BGjRpo2bJlrCSCvwVElBTYFSoNePfuHVxcXNChQwfUqlULCxcuhK+vL6KiovDs2TOMGTMGLVu2xOvXr5E3b16o1Wr2o01Cmh/2Fy9eQKVSwdbWFlu2bMGCBQuwd+9eGBoawsDAAMHBwbhz5w7Onz8PR0dHFC1aFLly5dJ3+Kka654o2rJlyxAZGYlu3boBAOrVqwc7OzssWrQIU6dOhZ+fHxYsWAAjIyNcuXKFNw4jomTBxCKN+PPPPzF48GBERkaie/fuqFmzJjw8PPDrr7/C0NAQK1euVMpyTIXu5s6di2zZsqFNmzYAgOvXr6NMmTKwsrJC/vz58fr1azx8+BDLly9HwYIF4eLiwnpPIqx7Im2vXr3CpEmTMH/+fPz6668YPHgwcubMiYYNG6JDhw5o3749fH19MX78eNy+fRvHjx9ntyciShZMLNKQJ0+eICwsDM7OzgCiE4hatWqhbNmymDBhgp6jSxs0LT2NGjXCnDlz4OjoqDx36NAhGBoa4siRIwgKCsLs2bNhbm6OHDlyICIiAqampmjbti0GDhzI1qJEYN0TRftaonzmzBn07NkTZmZmcHFxQf78+XH//n0MGjQI9vb2AP7XyseB2kSUHJhYpEEfPnzA5cuXMXXqVDx+/BgXL17kyVQS0PyY+/r6omrVqvD19cXZs2dx48YNdOrUKVb5evXqoXLlyvj5559x4sQJvHz5Ej/99BNcXFz0EH3qxronihYzqdi4cSPu3LmD8PBwNGzYEKVLl4afnx82bdqETZs24b///kPWrFkxZcoUdO3aVVkHx9cRUXLh2WYaIyI4f/48Zs6cic+fP+PChQswNDTk1SkdaX7ML1++jEqVKqFDhw5Qq9WYNm0aHj58CJVKhY4dOwIAwsPDYWhoiNevXyMgIAB58+ZF3rx59bwFqRfrnuh/NEnF4MGDsXnzZri5uSFTpkxwd3fHunXr0KpVK/Ts2ROtWrXChAkTMG/ePPz1119aiQWTCiJKLux0nMaoVCqUK1cOv/32G3bv3g0jIyNEREQwqdCB5sT26tWrqFChAvr27Yu5c+cCANatWwdHR0ds3boVf/75JwDA2NgYarUaNWvWxOPHjwFEJ3yUcKx7ov+JiIgAAGzbtg3r16/H5s2b8ffff6NVq1YA/revGxoawsrKCr///jv279+PAwcO6C1mIkpfmFikQSYmJnBzc4NarUZUVBS7QelIrVbj6dOnqFGjBn766SdMnDhReW7Lli3InDmzMkB++fLlynPGxsa4ePEiPn/+rI+w0wTWPRFw4MABiIhyLH/27Bk8PT1RunRpbNmyBS1btsTixYvxyy+/ICgoCM+ePVNe6+HhAQMDA0RGRuorfCJKR5hYpHGcCSdpREZGwsnJCaGhoTh58iQAYPLkyejevTuGDBmC5cuXw9raWusEt2XLlti/fz+MjIzY9UAHrHtKz96+fYuuXbuicOHCSovEhw8fEBAQgC1btqBjx46YNm2a0tVpx44dmDhxIj58+KC1HrZaE1FK4OBtoni6d+8e+vbtC2NjY1hbW2PHjh1Ys2YNatWqBQDw8/NDv379cPPmTYwYMQItW7bUc8RpB+ue0isRwalTp9CtWzcYGhri4sWLuHbtGtq0aYO7d+9i0qRJ6N+/P4DohKNly5bIkycPfv/9dybVRJTieDmbKJ6cnZ3x+++/49OnT1i7di2GDBminNhGRETAxsYGs2fPRokSJVC2bFk9R5u2sO4pvVKpVChbtiz++OMPfPr0CeXKlUOxYsXQvHlzmJub49OnT7hx4wZOnTqFZs2a4fnz55g1axZUKhXHFxFRimOLBVECPXjwAD179oSBgQGGDx+OihUrAgA+f/4MIyMjzsCVjFj3lB6cPXsWAQEBqFOnjnL/loiICFy8eBEtW7ZEzpw5cfz4cYwaNQq7du3C5cuX4e7ujixZsmDXrl38LhCR3jCxIEoETdccEcGoUaNQoUIFfYeUbrDuKS07fPgwatSoAQBwd3dHwYIF0bBhQ5QoUQK5c+fGuXPn0LVrV2TKlAknTpzA58+f8d9//8HJyQm5cuWCWq1WkhEiopTGxIIoke7du4cBAwbgzZs3mD17NrvgpCDWPaVVDx48QJs2bfD582dYWloif/78WL16NbJnzw4XFxdUq1YNWbNmxciRI1GwYEHs379fayzF1+7KTUSUEnj0IUokZ2dnTJ8+Hbly5YKdnZ2+w0lXWPeUVuXNmxerVq2Cvb09DAwM0LFjRzx8+BBLliwBEH0Pi+7du0OlUsHHx0cZuK3BpIKI9IktFkQ6Cg8Ph7Gxsb7DSJdY95RW3b17F3379kVUVBTGjRuHcuXKAYiefnn37t14+PAhTp06hTVr1sDIyEjP0RIRRWNiQURE9AO6d+8e+vTpAwAYPnw4KleuHGc5zeQFRET6xsSCiIjoB6WZrAAARo4cyckKiOiHxs6YREREPyhnZ2fMnTsXBgYG8PLywtWrV/UdEhHRVzGxICIi+oFpJiuoXLkyXFxc9B0OEdFXsSsUERFRKsIpZYnoR8XEgoiIiIiIdMZLHkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkRElKyqVq0KLy8vfYdBRETJjIkFERHF8vr1a/To0QO5c+eGiYkJbGxs4OnpiZMnTwIAVCoVtm/fHq91bdu2DePHj0/S+I4cOQKVSoXAwMAkXS8RESWeob4DICKiH0/Tpk0RHh6OVatWIU+ePPD394ePjw8CAgLivY7w8HAYGxvDwsIiGSMlIqIfBVssiIhIS2BgII4fP46pU6eiWrVqcHBwQJkyZTBs2DA0aNAAjo6OAIDGjRtDpVIpj8eOHQtXV1csW7YMTk5OMDU1BRC7K5SjoyMmTZqEjh07IkuWLMidOzf++OMPrRj+++8/uLq6wtTUFKVKlcL27duhUqlw+fJlPHr0CNWqVQMAZMuWDSqVCu3bt8fq1auRPXt2hIWFaa2rUaNGaNOmjVaMS5Ysgb29PTJmzIjmzZsjKChI6zXLli1DoUKFYGpqioIFC2LhwoVJVb1ERGkWEwsiItKSOXNmZM6cGdu3b491kg4A586dAwCsWLECL1++VB4DwP3797F161Zs27YNly9f/up7zJw5E6VKlcKlS5fQs2dP9OjRA3fu3AEABAcHo379+ihatCguXryI8ePHY+jQocpr7e3tsXXrVgDAnTt38PLlS/z+++9o1qwZIiMj8c8//yhlX716hV27dqFjx45aMW7atAn//vsv9u7dq8SgsW7dOowePRoTJ07ErVu3MGnSJIwaNQqrVq1KYE0SEaUvTCyIiEiLoaEhVq5ciVWrViFr1qyoUKEChg8fjqtXrwIArKysAABZs2aFjY2N8hiI7v60evVquLm5oVixYl99j7p166Jnz57Ily8fhg4dCktLSxw+fBgAsH79eqhUKixduhSFCxdGnTp1MHjwYOW1BgYGSveqHDlywMbGBubm5siQIQN++eUXrFixQim7du1a5M6dG1WrVlWWhYaGYvXq1XB1dUXlypUxb948/PXXX/Dz8wMAjBkzBjNnzkSTJk3g5OSEJk2aoH///liyZImONUtElLYxsSAioliaNm2KFy9e4J9//kHt2rVx5MgRlChRAitXrvzm6xwcHLQSja+JmXSoVCrY2Njg1atXAKJbIYoVK6Z0pQKAMmXKxCvuLl26YP/+/Xj+/DkAYOXKlWjfvj1UKpVSJnfu3MiZM6fyuFy5coiKisKdO3cQEhKCBw8eoFOnTkrLTebMmTFhwgQ8ePAgXjEQEaVXHLxNRERxMjU1Rc2aNVGzZk2MGjUKnTt3xpgxY9C+ffuvviZTpkzxWreRkZHWY5VKhaioKF3CBQC4ubmhePHiWL16NWrVqoUbN25g165d8X79hw8fAABLly6Fu7u71nMGBgY6x0dElJaxxYKIiOKlcOHCCAkJARCdGERGRibL+xQoUADXrl3TGt8RcxwHABgbGwNAnDF07twZK1euxIoVK+Dh4QF7e3ut5588eYIXL14oj0+fPg21Wo0CBQrA2toadnZ2ePjwIfLly6f15+TklJSbSUSU5jCxICIiLQEBAahevTrWrl2Lq1evwtfXF5s3b8a0adPQsGFDANEzO/n4+MDPzw/v3r1L0vf/5ZdfEBUVha5du+LWrVvYt28fZsyYAQBKlyYHBweoVCrs3LkTr1+/VloaNK9/9uwZli5dqjVoW8PU1BTt2rXDlStXcPz4cfTt2xfNmzeHjY0NAGDcuHGYPHky5s6di7t37+LatWtYsWIFZs2alaTbSUSU1jCxICIiLZkzZ4a7uztmz56NypUrw8XFBaNGjUKXLl0wf/58ANGzOh04cAD29vZwc3NL0vc3MzPDv//+i8uXL8PV1RUjRozA6NGjAUAZd5EzZ06MGzcO3t7esLa2Ru/evZXXm5ubo2nTpsicOTMaNWoUa/358uVDkyZNULduXdSqVQvFihXTmk62c+fOWLZsGVasWIGiRYuiSpUqWLlyJVssiIi+QyUiou8giIiIvmXdunXo0KEDgoKCkCFDhu+Wr1GjBooUKYK5c+dqLR87diy2b9/+zalwiYgocTh4m4iIfjirV69Gnjx5kDNnTly5cgVDhw5F8+bNv5tUvHv3DkeOHMGRI0d4UzsiohTGxIKIiH44fn5+GD16NPz8/GBra4tmzZph4sSJ332dm5sb3r17h6lTp6JAgQIpECkREWmwKxQREREREemMg7eJiIiIiEhnTCyIiIiIiEhnTCyIiIiIiEhnTCyIiIiIiEhnTCyIiIiIiEhnTCyIiIiIiEhnTCyIiIiIiEhnTCyIiIiIiEhnTCyIiIiIiEhn/wdCm4cB4hMDrwAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Vq1aYcCAAQCAxo0bQyaTqXTFMbsKFSqofJUzO319fVhbWxeo7r59+/Dll19KCQAAuLu7o0aNGti9e7dU9vvvvyM9PR0jRoyQymQyGYYPH47Hjx8jJCRE5W2+TUJCAsLDw5GQkFCg+vnJPj5qxYoV0mf39u3bSEtLw8yZM9GwYUOYmprCyMgIzZs3x8mTJ/Pdxrs+/+86vgP/+75613EZAP799190794d5ubmKFWqFJo0aYKDBw/mqvfzzz+jTp06KFWqFMqUKYNGjRph+/btSnWePHmCwYMHw8rKSvpcb9y4UY1XlzSBVyzok3L27Fns378fI0aMgLGxMVauXIlu3brh4cOHsLCwyHOdX3/9FWvXrsXFixexfv16AMBnn30GIOsXsc2bN+Prr7/GuHHjcOHCBfj6+uLOnTv47bfflLYTERGB3r1747vvvsPQoUNRs2ZNaZmvry8MDQ0xefJk3Lt3Dz///DN0dXWhpaWFV69eYfbs2fj7778REBAAOzs7zJw58637uWHDBnz33Xf47LPP4O3tjX///RedO3eGubk5bGxs3rput27dcOvWLXh5ecHW1haxsbEICgrCw4cPYWtrixUrVsDLywulS5fGtGnTAABWVlZK2xgxYgTKli2LmTNnIikp6a3P988//6Bnz574/vvvMWDAAGzatAndu3fHkSNH8Pnnn7913ZwKElt2AQEBGDRoEBo3bgxfX1/ExMTgp59+wrlz53DlyhWlX3YzMzPh4eEBV1dX/PDDDzh+/DiWLVuGatWqYfjw4fk+R/PmzbF8+XLcunVLGgR75swZaGlp4cyZMxg9erRUBmR1n8jLd999h6dPnyIoKChX9wqF7du347///sN3330HmUyGJUuWoGvXrvj3339VPhE8ceIE2rdvj4YNG2LWrFnQ0tLCpk2b0KZNG5w5cwYuLi5K9Xv06AE7Ozv4+voiLCwM69evR7ly5bB48WKpzsCBA7F7927069cPTZo0wV9//YWOHTsqbadr1664e/cuduzYgeXLl8PS0hIAULZsWanO+3yOs5s3bx709PQwfvx4pKamQk9PD7dv38aBAwfQvXt32NnZISYmBr/88gtatmyJ27dv5+rys2jRImhpaWH8+PFISEjAkiVL0KdPH1y4cEGqs2bNGowaNQrNmzfH2LFjERUVBU9PT5QpU0ZKuIGssQGdO3fG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MCFXu46JiREjR44UNjY2QldXV1hbW4u2bduKtWvXvutlpSJEJsQHHAVKRET0FlevXkX9+vWxdetW9OnTR9PhfHByuRxly5ZF165d8+z6VFQMHDgQJ06cQFhYGHR0dJTGNn0q0tLSkJiYiJ07d8LLywuXLl3K98pRSWJrawtHR0cEBgZqOhQqhtgVioiIPork5ORcs9+sWLECWlpa+d5xvDhLSUmBvr6+UrenLVu2IC4uTqXZkTTl0aNHKFu2LOrUqZNn3/eS7tChQ0r3ciCid2NiQUREH8WSJUsQGhqK1q1bQ0dHB4cPH8bhw4cxbNiwYjml6rv8/fffGDt2LLp37w4LCwuEhYVhw4YNcHR0LPAgYU2ZOHEi+vbtCyD31MKfiqZNmyrNbJXXPRuISBm7QhER0UcRFBSEOXPm4Pbt23j9+jUqV66Mfv36Ydq0ae+cEas4ioqKwujRo3Hx4kXExcXB3NwcHTp0wKJFi1CuXDlNh0eUJ3aFInUwsSAiIiIiIrXxPhZERERERKQ2JhZERERERKS2ktep9SORy+V4+vQpjI2NlWb8ICIiIiIqKYQQ+O+//1ChQgXpxof5YWLxnp4+fVoiZzEhIiIiIsrp0aNHqFSp0lvrMLF4T4rb0D969AgmJiYajoaIiIiIqPAlJibCxsZGOvd9GyYW70nR/cnExISJBRERERGVaAXp+s/B20REREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYmFkREREREpDYdTQdAREQfiEym6QiooITQdARERGrjFQsiIiIiIlIbEwsiIiIiIlIbEwsiIiIiIlIbEwsiIiIiIlIbEwsiIiIiIlIbEwsiIiIiIlJbkUgs/Pz8YGtrCwMDA7i6uuLixYtvrb9nzx44ODjAwMAAdevWxaFDh5SWz549Gw4ODjAyMkKZMmXg7u6OCxcuKNWxtbWFTCZTeixatKjQ942IiIiI6FOg8cRi165d8PHxwaxZsxAWFgYnJyd4eHggNjY2z/rnz59H7969MWTIEFy5cgWenp7w9PTEzZs3pTo1atTAqlWrcOPGDZw9exa2trb44osv8Pz5c6Vt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ylKgxCIyMlL6//bt27F69Wps2LBB+mU/IiICQ4cOxXfffadyAD4+PhgwYAAaNWoEFxcXrFixAklJSRg0aBAAoH///qhYsSJ8fX0BAGPGjEHLli2xbNkydOzYETt37sTly5exdu1aAFlJxddff42wsDAEBgYiMzNTGn9hbm4OPT09hISE4MKFC2jdujWMjY0REhKCsWPHom/fvihTpozK+0BERERE9KlTebrZatWqYe/evahfv75SeWhoKL7++mulJKSgVq1ahaVLlyI6OhrOzs5YuXIlXF1dAQCtWrWCra0tAgICpPp79uzB9OnTERUVBXt7eyxZsgQdOnQAAERFRcHOzi7P5zl58iRatWqFsLAwjBgxAuHh4UhNTYWdnR369esHHx+fAnd34nSzRFTkcbrZ4oPTzRJREaXKOa/KiUWpUqXw119/oXHjxkrlFy9eRKtWrfDmzRvVIy6GmFgQUZHHxKL4YGJBREXUB72PRdu2bfHdd98hLCxMKgsNDcXw4cNz3V+CiIiIiIg+DSonFhs3boS1tTUaNWokzZTk4uICKysrrF+//kPESERERERERZzK97EoW7YsDh06hLt370o3sXNwcECNGjUKPTgiIiIiIioe3usGeQBQo0YNJhNERERERATgPRKLzMxMBAQEIDg4GLGxsZDL5UrLT5w4UWjBEZEKOFC3+OBAXSIiKoFUTizGjBmDgIAAdOzYEY6OjpDxZIaIiIiI6JOncmKxc+dO7N69W7pvBBERERERkcqzQunp6aF69eofIhYiIiIiIiqmVE4sxo0bh59++gkq3lePiIiIiIhKMJW7Qp09exYnT57E4cOHUadOHejq6iot379/f6EFR0RERERExYPKiYWZmRm++uqrDxELEREREREVUyonFps2bfoQcdD74IxcxQO7DRIREdEn4L1vkPf8+XNEREQAAGrWrImyZcsWWlBERERERFS8qDx4OykpCYMHD0b58uXRokULtGjRAhUqVMCQIUPw5s2bDxEjEREREREVcSonFj4+Pvjrr7/w559/Ij4+HvHx8fj999/x119/Ydy4cR8iRiIiIiIiKuJkQsV5Yy0tLbF37160atVKqfzkyZPo0aMHnj9/XpjxFVmJiYkwNTVFQkICTExMNBMEx1gUDx9rjAXbQ/HBNkE5cSwWERVRqpzzqnzF4s2bN7CysspVXq5c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f//+hR4kEREREREVbQW+YrFjxw5MnTo1V1IBAG3atMHkyZOxbdu2Qg2OiIiIiIiKhwInFtevX0e7du3yXd6+fXtcu3atUIIiIiIiIqLipcCJRVxcHKysrPJdbmVlhVevXhVKUEREREREVLwUOLHIzMyEjk7+QzK0tbWRkZFRKEEREREREVHxUuDB20IIDBw4EPr6+nkuT01NLbSgiIiIiIioeClwYjFgwIB31uGMUEREREREn6YCJxabNm36kHEQEREREVExVuAxFkRERERERPlhYkFERERERGpjYkFERERERGpjYkFERERERGpjYkFERERERGpjYkFERERERGpjYkFERERERGpjYkFERERERGor8A3yiIiIiKiEkck0HQEVhBCajqBAeMWCiIiIiIjUpvHEws/PD7a2tjAwMICrqysuXrz41vp79uyBg4MDDAwMULduXRw6dEhp+f79+/HFF1/AwsICMpkMV69ezbWNlJQUjBw5EhYWFihdujS6deuGmJiYwtwtIiIiIqJPikYTi127dsHHxwezZs1CWFgYnJyc4OHhgdjY2Dzrnz9/Hr1798aQIUNw5coVeHp6wtPTEzdv3pTqJCUloVmzZli8eHG+zzt27Fj8+eef2LNnD/766y88ffoUXbt2LfT9IyIiIiL6VMiE0FynLVdXVzRu3BirVq0CAMjlctjY2MDLywuTJ0/OVb9nz55ISkpCYGCgVNakSRM4OzvD399fqW5UVBTs7Oxw5coVODs7S+UJCQkoW7Ystm/fjq+//hoAEB4ejlq1aiEkJARNmjQpUOyJiYkwNTVFQkICTExMVN31wsF+kcXDx/qIsT0UH2wTlFMx6T9NJRCPE8WDBo8RqpzzauyKRVpaGkJDQ+Hu7v6/YLS04O7ujpCQkDzXCQkJUaoPAB4eHvnWz0toaCjS09OVtuPg4IDKlSurtB0iIiIiIvofjc0K9eLFC2RmZsLKykqp3MrKCuHh4XmuEx0dnWf96OjoAj9vdHQ09PT0YGZmptJ2UlNTkZqaKv2dmJhY4OckIiIiIirpND54u7jw9fWFqamp9LCxsdF0SERERERERYbGEgtLS0toa2vnmo0pJiYG1tbWea5jbW2tUv38tpGWlob4+HiVtjNlyhQkJCRIj0ePHhX4OYmIiIiISjqNJRZ6enpo2LAhgoODpTK5XI7g4GC4ubnl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27dvw8nJCVpaWrxxFdEnTnEM2L9/P7y8vHDgwAE0btwYBw8eRKdOnbB161Z88803SuscP34crVu3ZrcnIqIShlcsSCX6+vqoX78+B2oTfeKCgoIghJCOAY8fP4aHhwcaN26MvXv3olevXvD398c333yDhIQEPH78WFrX3d0d2travNpJRFTCMLGg98Y7ahN9muLi4jBs2DDUrl1bumfF69ev8fLlS+zduxeDBw/GkiVLpDEUv//+OxYsWIDXr18rbYdXLIiIShaeGRIRkUrKlCmDbdu2QUdHBw0aNIAQAl9++SWioqLQr18/zJkzB8OHDweQlXDs3r0burq6MDIy0nDkRET0ITGxICIilchkMjRp0gRr165FcnIy3NzcUK9ePfTo0QOmpqZITk7GrVu3EBISgu7du+PJkyf48ccfIZPJct2Vm4iISg4O3iYione6ePEiXr58ifbt20sDtjMyMhAWFoZevXqhYsWKOHPmDGbMmIGDBw/i6tWrcHV1hbGxMQ4ePAhdXV3ep4KIqIRjYkFERG918uRJtG3bFgDg6uoKBwcHdOnSBQ0aNEDlypVx6dIlDBs2DEZGRjh79izS09Nx/vx52NnZoVKlSpxBjojoE8HEgoiI3ur+/fvo168f0tPTYWlpiRo1amDLli2wsLCAo6MjWrduDTMzM0yfPh0ODg44duyY0n0p8rsrNxERlSw80hMR0VtVq1YNmzdvho2NDbS1tTF48GD8+++/+OWXXwAA+/fvx/fffw+ZTIbg4GCMHTtWaX0mFUREnwZesSAiogK5e/cuRo8eDblcjjlz5sDNzQ0AkJmZiUOHDuHff/9FSEgIfv31V+jq6mo4WiIi+tiYWBARUYH9888/8PLyAgBMnToVLVq0yLNeeno6kwsiok8MEwsiIlLJP//8g9GjRwMApk+fjqZNm2o4IiIiKgrY8ZWIiFRib2+PlStXQltbG97e3rh+/bqmQyIioiKAiQUREanM3t4eS5cuRYsWLeDo6KjpcIiIqAhgVygiIlIbp5QlIiImFkREREREpDb+vERERERERGpjYkFERERERGpjYkFERERERGpjYkFERERERGpjYkFERERERGpjYkFERERERGpjYkFERB9Vq1at4O3trekwiIiokDGxICKid3r+/DmGDx+OypUrQ19fH9bW1vDw8MC5c+cAADKZDAcOHCjQ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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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trZCX19fWFtbi2bNmomVK1d+6WUlLSMTIgdHihIRUb4VHBwMZ2dnbNy4Eb169dJ0ODlOLpfD0tISnTp1SrfrU17h4eGBv//+G9euXYOenp7S2Kb8IjExEdHR0di6dSu8vLxw+fLlDFuOviV2dnZwcHDA/v37NR0KfaPYFYqIiNQWFxeXZvabRYsWQUdHJ8MVx7VZfHw8DA0Nlbo9rV+/HhERESrNjqQpz58/h6WlJapWrZpu3/dv3cGDB5XWciCi7MHEgoiI1DZnzhxcvXoVTZo0gZ6eHg4dOoRDhw5hwIABWjml6pdcuHABw4YNQ5cuXVCkSBFcu3YNq1evhoODQ5YHCWvK6NGj8dNPPwFIO7VwflGvXj2lma3SW7OBiFTHrlBERKS2Y8eOwcfHB3fu3EFMTAxKlSqF3r17Y/z48V+cEUsbPXnyBEOHDsWlS5cQEREBCwsLtGnTBrNmzUKxYsU0HR5RutgVinIaEwsiIiIiIlIb17EgIiIiIiK1MbEgIiIiIiK1fXsdX79ALpfj1atXMDU1VZrNg4iIiIiIlAkh8OHDB5QoUUJaHDEj+S6xePXq1Tc5QwkRERERUU55/vw5SpYsmWmZfJdYKJaYf/78OczMzDQcDRERERFR3hUdHQ1bW1vpGjoz+S6xUHR/MjMzY2JBRERERJQFWRlCwMHbRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNiYWRERERESkNj1NB0BERCqSyTQdAalKCE1HQESU49hiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREatNoYnHq1Cm0a9cOJUqUgEwmw549ezItv2vXLrRo0QKWlpYwMzND3bp1ceTIkdwJloiIiIiIMqTRxCI2NhaOjo7w8/PLUvlTp06hRYsWOHjwIK5evYomTZqgXbt2uH79eg5HSkREREREmZEJIYSmgwAAmUyG3bt3o2PHjirtV7VqVXTr1g2TJk3KUvno6GiYm5sjKioKZmZmXxEpEZGGyWSajoBUlTe+aomIVKbKtbNWj7GQy+X48OEDLCwsNB0KEREREVG+pqfpANQxb948xMTEoGvXrhmWSUhIQEJCgnQ7Ojo6N0IjIiIiIspXtLbFYvPmzfDx8cH27dtRrFixDMv5+vrC3Nxc+rO1tc3FKImIiIiI8getTCy2bt2Kfv36Yfv27WjevHmmZceNG4eoqCjp7/nz57kUJRERERFR/qF1XaG2bNmCvn37YuvWrWjbtu0XyxsaGsLQ0DAXIiMiIiIiyr80mljExMTg4cOH0u2QkBAEBwfDwsICpUqVwrhx4/Dy5UusX78ewKfuT+7u7vjjjz/g6uqK0NBQAICxsTHMzc018hyIiIiIiEjDXaGuXLkCZ2dnODs7AwCGDx8OZ2dnaerY169f49mzZ1L5lStXIjk5GUOGDEHx4sWlv99++00j8RMRERER0Sd5Zh2L3MJ1LIhI63EdC+2Tv75qiegbkm/WsSAiIiIioryBiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREamNiQUREREREalNo4nFqVOn0K5dO5QoUQIymQx79uz54j4nT55EjRo1YGhoiHLlyiEwMDDH4yQiIiIiosxpNLGIjY2Fo6Mj/Pz8slQ+JCQEbdu2RZMmTRAcHAxvb2/069cPR44cyeFIiYiIiIgoM3qafPDWrVujdevWWS7v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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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EamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREamMiQUREREREalM5cQiKSlJ5SCWLFkCGxsbGBgYwNnZGRcvXvxs/R07dsDe3h4GBgaoUqUKDh48mGndAQMGQCaTYcGCBSrHSUREREREGct2YnHo0CH06tULZcqUga6uLgoUKAATExM0btwY06dPx8uXL7O1v23btsHb2xuTJk1CaGgoHB0d4erqisjIyAzrnzt3Dt26dUOfPn1w5coVuLm5wc3NDTdv3kxX9++//8b58+dRvHjx7B4mERERERFlg0wIIbJS8e+//8aoUaPw33//oXXr1qhduzaKFy8OQ0NDREdH4+bNmzh9+jSCg4Ph7u6OqVOnomjRol/cr7OzM2rVqoXFixcDAORyOaytreHp6YnRo0enq9+lSxfEx8dj//79UlmdOnXg5OQEPz8/qezFixdwdnbGkSNH0KZNG3h5ecHLyysrh4q4uDiYmpoiNjYWJiYmWdqGKM/IZOqOgLIqa6dXIiKifCs718U6Wd3p7NmzMX/+fLRq1QpaWuk7Ojp37gzg4wX9X3/9hY0bN2Lo0KGf3WdycjJCQkIwZswYqUxLSwsuLi4IDg7OcJvg4GB4e3srlbm6uiIgIED6XS6Xo0ePHhgxYgQqV66c1UMkIiIiIqIcynJikdmF/qdKlCiBmTNnZqnumzdvkJqaCgsLC6VyCwsL3L17N8NtwsPD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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Nzc3nD17Nkf7WLFiBbp16wYjI6NM709OTkZ8fLzSjYiIiIiIcpdGE4uXL18iLS0NVlZWSuVWVlaIjIz85PYhISG4fv06+vXrl2Udf39/mJmZSTdbW1u14yYiIiIiImUa7wqljhUrVqB69eqoW7dulnV8fX0RFxcn3R4/fpyHERIRERERFQ46mnxwS0tLaGtrIyoqSqk8KioK1tbW2W6bkJCATZs2YdKkSdnW09fXh76+vtqxEhERERFR1jR6xUJPTw+1a9dGcHCwVCaXyxEcHIz69etnu+3WrVuRnJyMnj17fukwiYiIiIjoEzR6xQIAfHx84OHhARcXF9StWxfz589HQkICPD09AQC9e/eGjY0N/P39lbZbsWIFOnTogGLFimkibCIiIiIiSkfjiUXXrl3x4sULjB8/HpGRkXB2dsaBAwekAd2PHj2ClpbyhZXw8HCcOnUKhw4d0kTIRERERET0EZkQQmg6iLwUHx8PMzMzxMXFwdTUVNPhEBGpTibTdASkqsL1VUtEXxFVzp0L9KxQRERERESUPzCxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitWk8sQgICIC9vT0MDAzg6uqKkJCQbOvHxsZi8ODBKFmyJPT19VGxYkXs27cvj6IlIiIiIqLM6GjywTdv3gwfHx8EBgbC1dUV8+fPh7u7O8LDw1GiRIkM9VNSUtCiRQuUKFEC27Ztg42NDR4+fAhzc/O8D56IiIiIiCQyIYTQ1IO7urqiTp06WLhwIQBALpfD1tYWXl5eGD16dIb6gYGBmDVrFm7fvg1dXd3Pesz4+HiYmZkhLi4OpqamasVPRKQRMpmmIyBVae6rlohILaqcO2usK1RKSgpCQ0Ph5ub2v2C0tODm5oazZ89mus0///yD+vXrY/DgwbCysoKjoyOmTZuGtLS0LB8nOTkZ8fHxSjciIiIiIspdGkssXr58ibS0NFhZWSmVW1lZITIyMtNt7t+/j23btiEtLQ379u3DuHHjMGfOHEyZMiXLx/H394eZmZl0s7W1zdXnQURERERE+WDwtirkcjlKlCiBpUuXonbt2ujatSvGjBmDwMDALLfx9fVFXFycdHv8+HEeRkxEREREVDhobPC2paUltLW1ERUVpVQeFRUFa2vrTLcpWbIkdHV1oa2tLZVVqVIFkZGRSElJgZ6eXoZt9PX1oa+vn7vBExERERGREo1dsdDT00Pt2rURHBwslcnlcgQHB6N+/fqZbtOgQQPcvXsXcrlcKrtz5w5KliyZaVJBRERERER5Q6NdoXx8fLBs2TKsXr0at27dwsCBA5GQkABPT08AQO/eveHr6yvVHzhwIGJiYvD777/jzp072Lt3L6ZNm4bBgwdr6ikQERERERE0vI5F165d8eLFC4wfPx6RkZFwdnbGgQMHpAHdjx49gpbW/3IfW1tbHDx4EEOHDkWNGjVgY2OD33//HaNGjdLUUyAiIiIiImh4HQtN4DoWRFTgcR2LgqdwfdUS0VdElXNnjV6xKNR4YlDw8MSAiIiIKEtMLIjyIyaeBQ8TTyIiKuQK1DoWRERERESUPzGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitTGxICIiIiIitamVWCQnJ+dWHEREREREVICplFjs378fHh4eKFu2LHR1dVGkSBGYmpqicePGmDp1Kp49e/al4iQiIiIionwsR4nF33//jYoVK6Jv377Q0dHBqFGjsGPHDhw8eBDLly9H48aNceTIEZQtWxa//vorXrx48aXjJiIiIiKifEQmhBCfqlS/fn2MHTsW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desWevfuDQDQ0dFBYmIijI2NMWnSpDy7amBiYoLLly/jwoULmDp1Knx8fHD8+PFM6/r7+8PMzEy62dra5kmMRERERESFicqJhZGRkTSuomTJkrh3755038uXL1Xal6WlJbS1tREVFaVUHhUVBWtr6yy309LSQvny5eHs7Ixhw4bhxx9/hL+/f6Z1fX19ERcXJ90eP36sUoxERERERPRpKicW9erVw6lTpwAArVu3xrBhwzB16lT07dsX9erVU2lfenp6qF27NoKDg6UyuVyO4OBg1K9fP8f7kcvlSE5OzvQ+fX19mJqaKt2IiIiIiCh3qTx4e+7cuXj79i0AwM/PD2/fvsXmzZtRoUIFlWeEAgAfHx94eHjAxcUFdevWxfz585GQkABPT08AQO/evWFjYyNdkfD394eLiwvKlSuH5ORk7Nu3D2vXrsXixYtVfmwiIiIiIsodKiUWaWlpePLkCWrUqAHgQ7codVfb7tq1K168eIHx48cjMjISzs7OOHDggDSg+9GjR9DS+t+FlYSEBAwaNAhPnjyBoaEhKleujHXr1qFr165qxUFERERERJ9P5XUsDAwMcOvWLTg4OHypmL4ormNBn43rFFB22D4oO1zHgogKKFXOnVUeY+Ho6Ij79+9/dnBERERERPT1UTmxmDJlCoYPH449e/bg+fPnXCOCiIiIiIhU7wqVfryDLN3leCEEZDIZ0tLSci+6L4BdoeizsasLZYftg7LDrlBEVECpcu6s8qxQx44d++zAiIiIiIjo66RyYtG4ceMvEQcRERERERVgKicWJ06cyPb+Ro0afXYwRERERERUMKmcWDRp0iRDWfqxFvl9jAUREREREeU+lWeFev36tdItOjoaBw4cQJ06dXDo0KEvESMREREREeVzKl+xMDMzy1DWokUL6OnpwcfHB6GhobkSGBERERERFRwqX7HIipWVFcLDw3Nrd0REREREVICofMXi6tWrSn8LIfD8+XNMnz4dzs7OuRUXEREREREVIConFs7OzpDJZPh4Xb169eph5cqVuRYYEREREREVHConFhEREUp/a2lpoXjx4jAwMMi1oIiIiIiIqGBRObGws7P7EnEQEREREVEBplJiIZfLERQUhB07duDBgweQyWRwcHDAjz/+iF69eimtZ0FERERERIVHjmeFEkKgXbt26NevH54+fYrq1aujWrVqePjwIfr06YMffvjhS8ZJRERERET5WI6vWAQFBeHEiRMIDg5G06ZNle47evQoOnTogDVr1qB37965HiQREREREeVvOb5isXHjRvzxxx8ZkgoAaNasGUaPHo3169fnanBERERERFQw5DixuHr1Klq2bJnl/a1atcKVK1dyJSgiIiIiIipYcpxYxMTEwMrKKsv7rays8Pr161wJioiIiIiICpYcJxZpaWnQ0cl6SIa2tjZSU1NzJSgiIiIiIipYcjx4WwiBPn36QF9fP9P7k5OTcy0oIiIiIiIqWHKcWHh4eHyyDmeEIiIiIiIqnHKcWKxatepLxkFERERERAVYjsdYEBERERERZYWJBRERERERqY2JBRERERERqY2JBRERERERqY2JBRERERERqY2JBRERERERqY2JBRERERERqY2JBRERERERqY2JBRERERERqY2JBRERERERqY2JBRERERERqS1fJBYBAQGwt7eHgYEBXF1dERISkmXdZcuWoWHDhihatCiKFi0KNze3bOsTEREREdGXp/HEYvPmzfDx8cGECRMQFhYGJycnuLu7Izo6OtP6x48fx08//YRjx47h7NmzsLW1xXfffYenT5/mceRERERERKQgE0IITQbg6uqKOnXqYOHChQAAuVwOW1tbeHl5YfTo0Z/cPi0tDUWLFsXChQvRu3fvT9aPj4+HmZkZ4uLiYGpqqnb8n00m09xj0+fJy48K20fBw/ZB2dHsVy0R0WdT5dxZo1csUlJSEBoaCjc3N6lMS0sLbm5uOHv2bI728e7dO7x//x4WFhaZ3p+cnIz4+HilGxERERER5S6NJhYvX75EWloarKyslMqtrKwQGRmZo32MGjUKpUqVUkpO0vP394eZmZl0s7W1VTtuIiIiIiJSpvExFuqYPn06Nm3ahL///hsGBgaZ1vH19UVcXJx0e/z4cR5HSURERET09dPR5INbWlpCW1sbUVFRSuVRUVGwtrbOdtvZs2dj+vTpOHLkCGrUqJFlPX19fejr6+dKvERERERElDmNXrHQ09ND7dq1ERwcLJXJ5XIEBwejfv36WW43c+ZMTJ48GQcOHICLi0tehEpERERERNnQ6BULAPDx8YGHhwdcXFxQt25dzJ8/HwkJCfD09AQA9O7dGzY2NvD39wcAzJgxA+PHj8eGDRtgb28vjcUwNjaGsbGxxp4HERER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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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PDB//nxERkaie/fuAICuXbuiQIEC8PPzAwAMGjQItWrVwty5c9G4cWNs3LgRZ8+exfLlywEkJBVt2rTB+fPnsXv3bsTFxSnjL6ytrWFqaoqAgACcOnUKderUQa5cuRAQEIAhQ4bg66+/Rp48efRTEUREREREmZjeE4v27dvj+fPnmDhxIoKDg+Hm5oZ9+/YpA7QfPXqkcZe/qlWrYsOGDRg/fjzGjh0LFxcX7NixA66urgCAoKAg7Ny5EwDg5uam8V5HjhxB7dq1YWZmho0bN2Ly5MmIjo6Gs7MzhgwZojGGgoiIiIiIUk/v97HIrHgfCyIiIiIydJnmPhZERERERGQYmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHO9H4fCyIiojShUuk7grTF2eCJKJNhiwUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREeksQyQWixYtgpOTE8zNzeHp6YnTp09/tPyWLVtQsmRJmJubo2zZstizZ4/y3Pv37zFq1CiULVsWOXLkQP78+dG1a1c8efJEYx2hoaHo3LkzLC0tkTt3bvTs2RNv3rxJl+0jIiIiIjJ0ek8sNm3ahKFDh2LSpEk4f/48ypcvDx8f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0lyat1gk9vTpU8TGxiZZHhcXh5CQEG1XR0REREREBkDrxKJevXro06cPzp8/ryw7d+4cvv32W+WeFkRERERElLVonVisXLkSDg4OcHd3h5mZGczMzODh4QF7e3usWLEiPWIkIiIiIqIMTusb5NnZ2WHPnj24ffs2bt68CQAoWbIkihcvnubBERERERFR5qB1YqFWvHhxJhNERERERATgMxKLuLg4rF69Gv7+/nj27Bni4+M1nj98+HCaBUdERERERJmD1onFoEGDsHr1ajRu3Biurq5QGdr0fkREREREpDWtE4uNGzdi8+bNaNSoUXrEQ0REREREmZDWs0KZmpqiWLFi6RELERERERFlUlonFsOGDcNPP/0ELW/YTUREREREBkzrrlAnTpzAkSNHsHfvXpQpUwbZsmXTeH779u1pFhwREREREWUOWrdY5M6dGy1btkStWrVga2sLKysrjYe2Fi1aBCcnJ5ibm8PT0xOnT5/+aPktW7agZMmSMDc3R9myZbFnzx6N57dv344GDRrAxsYGKpUKFy9eTLKO2rVrQ6VSaTz69u2rdexERERERJRA6xaLVatWpdmbb9q0CUOHDsXSpUvh6emJ+fPnw8fHB7du3ULevHmTlD958iQ6duwIPz8/NGnSBBs2bECLFi1w/vx5uLq6AgAiIyNRvXp1tGvXDr169UrxvXv16oWpU6cqf2fPnj3NtouIiIiIKKtRyWcOlnj+/Dlu3boFAChRogTs7Oy0XoenpycqV66MhQsXAgDi4+Ph6OiIAQMGYPTo0UnKt2/fHpGRkdi9e7eyrEqVKnBzc8PSpUs1yj548ADOzs64cOEC3NzcNJ6rXbs23NzcMH/+fK1jVouIiICVlRXCw8NhaWn52eshIqI0YmjTn3MsIxFlANqc82rdFSoyMhI9evRAvnz5ULNmTdSsWRP58+dHz5498fbt21SvJyYmBufOnYO3t/f/gjEygre3NwICApJ9TUBAgEZ5APDx8Umx/MesX78etra2cHV1xZgxY7SKnYiIiIiINGmdWAwdOhR///03du3ahbCwMISFheHPP//E33//jWHDhqV6PS9evEBcXBzs7e01ltvb2yM4ODjZ1wQHB2tVPiWdOnXCb7/9hiNHjmDMmDFYt24dvv7664++Jjo6GhERERoPIiIiIiJKoPUYi23btmHr1q2oXbu2sqxR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AydOnMD79+9x8uRJODs7o2DBgjAyMlKSESJKe0wsiIgysTt37mDo0KF48eIF5s2blyW7/rAOso579+6hS5cueP/+PWxtbVG8eHGsXbsWNjY2cHV1RZ06dZA7d26MHz8eJUuWxIEDBzTGUqR0V24iShv8dhERZWJZYTasT2EdZB1FixbFmjVr4OjoCGNjY/To0QP379/HsmXLACTcw6Jv375QqVTw9/dXBm6rMakgSl9ssSAiMgCGPhtWarAOso7bt29j4MCBiI+Px5QpU+Dl5QUgYTriPXv24P79+wgICMC6deuUm2USUfpjYkFERESZzp07dzBgwAAAwNixY1GzZs1ky6kH8xNR+mNiQURERJmSevA+AIwfP56D94n0jJ0NiYiIKFNycXHBggULYGxsjMGDB+Py5cv6DokoS2NiQURERJmWevB+zZo14erqqu9wiLI0doUiIiIig8EpZYn0h4kFERERERHpjCk9ERERERHpjIkFERERERHpjIkFERERERHpjIkFERERERHpjIkFERERERHpjIkFERERERHpjIkFERF9UbVr18bgwYP1HQYREaUxJhZERPRJz58/x7fffotChQrBzMwMDg4O8PHxwT///AMAUKlU2LFjR6rWtX37dkybNi1N4zt69ChUKhXCwsLSdL1ERJR6JvoOgIiIMr7WrVsjJiYGa9asQZEiRRASEgJ/f3+8fPky1euIiYmBqakprK2t0zFSIiLSF7ZYEBHRR4WFheH48eP44YcfUKdOHRQuXBgeHh4YM2YMmjVrBicnJwBAy5YtoVKplL8nT54MNzc3rFixAs7OzjA3NweQtCuUk5MTZsyYgR49eiBXrlwoVKgQli9frhHDyZMn4ebmBnNzc7i7u2PHjh1QqVS4ePEiHjx4gDp16gAA8uTJA5VKhW7dumHt2rWwsbFBdHS0xrpatGiBLl26aMS4bNkyODo6Inv27GjXrh3Cw8M1XrNixQqUKlUK5ubmKFmyJBYvXpxW1Uv0f+3dX0hTfRzH8feyQmmkF5WrMcUYDCyXi0gisKiUEqKY6IU3Wc0giaCLWBSbSVkUWWTdxILNoRGFIZrQH6JBN0FQ/iFkkQVROowYRUI3zudCOrSnxz89s+cp+7xgF79zzu/8vmdX+/D7/c5EZg0FCxERmZTZbMZsNtPe3v7dj3SAJ0+eABAMBhkaGjLaAC9fvqStrY1bt27R3d094RiNjY2sWbOGZ8+eUVtby/79+4lGowB8+vSJ7du3U1BQwNOnTzlx4gRer9foa7PZaGtrAyAajTI0NMTFixepqKhgdHSUjo4O49rh4WG6urrYs2dPUo03btygs7OTO3fuGDV81drait/vp6Ghgf7+fk6dOoXP56O5ufkHv0kRkdlNwUJERCY1d+5cQqEQzc3NZGVlsX79eo4ePUpvby8AixcvBiArKwuLxWK0YXz5UzgcxuVy4XQ6JxyjrKyM2tpa7HY7Xq+XRYsW8fDhQwCuXbuGyWQiEAiQn5/Ptm3bOHz4sNE3LS3NWF61ZMkSLBYLmZmZZGRkUFVVRTAYNK5taWkhJyeHjRs3Gse+fPlCOBymsLCQ4uJiLl26xPXr14nFYgDU1dXR2NiI2+0mLy8Pt9vNoUOHuHLlSorfrIjI7KJgISIiUyovL2dwcJCOjg62bt1KJBJh9erVhEKhSfvl5uYmBY2JfBs6TCYTFouF4eFhYHwWwul0GkupANauXTutumtqarh37x7v3r0DIBQKUV1djclkMq7JycnBarUa7XXr1pFIJIhGo4yMjDAwMMDevXuNmRuz2czJkycZGBiYVg0iIn8Kbd4WEZFpSU9Pp6SkhJKSEnw+Hx6Ph7q6Oqqrqyfss2DBgmnde968eUltk8lEIpFIpVwAXC4Xq1atIhwOU1payvPnz+nq6pp2/8+fPwMQCAQoKipKOpeWlpZyfSIis4lmLERE5F/Jz89nZGQEGA8Go6OjP2Uch8NBX19f0v6Ob/dxAMyfPx/gH2vweDyEQiGCwSBbtmzBZrMlnX/z5g2Dg4NG+/Hjx8yZMweHw0F2djbLli3j1atX2O32pE9eXt5MPqaIyG9PwUJERCb14cMHNm3aREtLC729vbx+/ZqbN29y9uxZduzYAYy/2enBgwfEYjHi8fiMjl9VVUUikWDfvn309/dz9+5dzp07B2AsacrNzcVkMnH79m3ev39vzDR87f/27VsCgUDSpu2v0tPT2bVrFz09PTx69IiDBw9SWVmJxWIBoL6+ntOnT9PU1MSLFy/o6+sjGAxy/vz5GX1OEZHfnYKFiIhMymw2U1RUxIULFyguLmblypX4fD5qamq4fPkyMP5Wp/v372Oz2XC5XDM6/sKFC+ns7KS7u5vCwkKOHTuG3+8HMPZdWK1W6uvrOXLkCNnZ2Rw4cMDon5mZSXl5OWazmZ07d353f7vdjtvtpqysjNLSUpxOZ9LrZD0eD1evXiUYDFJQUMCGDRsIhUKasRAR+RvT2NjY2P9dhIiIyI9obW1l9+7dfPz4kYyMjCmv37x5MytWrKCpqSnp+PHjx2lvb5/0VbgiIjI92rwtIiK/vHA4zPLly7FarfT09OD1eqmsrJwyVMTjcSKRCJFIRH9qJyLykylYiIjILy8Wi+H3+4nFYixdupSKigoaGhqm7OdyuYjH45w5cwaHw/EfVCoi8ufSUigREREREUmZNm+LiIiIiEjKFCxERERERCRlChYiIiIiIpIyBQsREREREUmZgoWIiIiIiKRMwUJERERERFKmYCEiIiIiIilTsBARERERkZQpWIiIiIiISMr+Ar/+1kCyoXx/AAAAAElFTkSuQmCC\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAhaxJREFUeJzt3XdYFGfXBvB7ASkWUATBglQbooJi74oSNfYafRWxa2LvvZdYorHFLrbEHhONnWjUxFhjiTUqNhTsoCggcL4/+HZgBZR1gYXl/l3XXsrszOyZZ2dm58xTRiUiAiIiIiIiIh0Y6TsAIiIiIiLK+phYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEBERERGRzphYEKUgICAAKpUKd+/e1Zg+Z84cuLi4wNjYGJ6ennqJTVd16tRBnTp1lL/v3r0LlUqFgICAdP/s5MrVyckJX375Zbp/NgAcPXoUKpUKR48ezZDP05U234163rlz537WZ2WlslGpVPjmm2/0HUaWtX//fnh6esLc3BwqlQqvXr1Kdr6uXbtCpVJBpVLBw8MjY4P8DLt27VLiValUOHv2rL5DIspWmFgQaeHgwYMYMWIEqlevjrVr12LGjBn6Dkmvli5dmiHJyOfIzLHpau/evZg0aZK+w0h3f/31FyZNmpTiRS99nufPn6Ndu3awsLDAkiVLsGHDBuTKlSvF+W1sbLBhwwbMmjVLY/rBgwfRvXt3eHh4wNjYGE5OTlrF8ebNG0ycOBFffPEFrK2tP5lAX7t2DV988QVy584Na2trdO7cGU+fPtWYx9vbGxs2bECvXr20ikVNfePjUy9tt5UouzDRdwBEmVXnzp3RoUMHmJmZKdN+//13GBkZYfXq1TA1NdVjdGnL0dER7969Q44cObRabunSpbCxsUHXrl1TvUxy5ZoeUoqtVq1aePfuXZb5/pL7bvbu3YslS5YYfHLx119/YfLkyejatSvy5s2r73AMxpkzZ/D69WtMnToVPj4+n5w/V65c+N///pdk+o8//ogtW7agfPnyKFSokNZxPHv2DFOmTEHRokVRrly5j9aUPXz4ELVq1YKVlRVmzJiBN2/eYO7cubh8+TJOnz6tHM9FihTB//73P8TExGDFihVax1SrVi1s2LBBY1qPHj1QqVIljWQld+7cWq+bKDtgYkGUAmNjYxgbG2tMe/LkCSwsLNLsolREEBkZCQsLizRZ3+dSqVQwNzdP18+IiIhArly5ki3XjGRkZJTu25qWMuK7ISAyMhKmpqYwMjL8ivwnT54AgM7J2owZM7By5UrkyJEDX375Jf7991+tli9YsCAeP34Me3t7nD17FhUrVvzoZ0VERODcuXMoWrQoAKBSpUpo0KABAgICPruG4kMuLi5wcXHRmNanTx+4uLgkm1ypxcTEIC4uLsvcsCBKL4Z/BqVsoWvXrslWTU+aNAkqlUpjmrpt9q5du+Dh4QEzMzOULl0a+/fv15jvw74AKpUKa9euRUREhFIdrq62j4mJwdSpU+Hq6gozMzM4OTlhzJgxiIqK0linui/BgQMH4O3tDQsLCyxfvlxp275161ZMnjwZhQsXRp48edCmTRuEhYUhKioKgwYNQoECBZA7d274+/snWXdKVqxYAVdXV1hYWKBSpUo4fvx4knmSa8cfEhICf39/FClSBGZmZihYsCCaN2+ulIeTkxOuXLmCP/74QykPdb8Nddn98ccf6NevHwoUKIAiRYokW66JHTx4UGn37e7ujp07d2q8n9z3mdw6PxZbSv0Itm3bhgoVKsDCwgI2Njb43//+h+DgYI15unbtity5cyM4OBgtWrRA7ty5YWtri2HDhiE2NjaFbyDekCFDkD9/foiIMq1///5QqVRYuHChMi00NBQqlQo//PADgKTfTdeuXbFkyRIA0Gia8SH1925mZoaKFSvizJkzH43vY06dOoUvvvgCVlZWyJkzJ2rXro0///xTYx71d3Pr1i2lhsHKygr+/v54+/atxrzv3r3DgAEDYGNjgzx58qBZs2YIDg6GSqVSamEmTZqE4cOHAwCcnZ2V7fxwv/nUcZwc9T6wefNmjBs3DoULF0bOnDkRHh6OFy9eYNiwYShTpgxy584NS0tLNGrUCBcvXkx2HVu3bsX06dNRpEgRmJubo379+rh161aSz1yyZAlcXFw0jsMP+zoBQFRUFCZOnAg3NzeYmZnBwcEBI0aMSPXx/qn9uE6dOvDz8wMAVKxYESqVSqsax8QKFSqkdS1nYmZmZrC3t0/VvDt27MCXX36pJBUA4OPjg+LFi2Pr1q2pWkdYWBiuX7+OsLCwz4pXLXFfpgULFijH2dWrVxEdHY0JEyagQoUKsLKyQq5cuVCzZk0cOXIkxXV86lj91LkYSPht+dQ5FADu3LmDtm3bwtraGjlz5kSVKlXw22+/JZlv0aJFKF26NHLmzIl8+fLB29sbP/74o8Y8wcHB6NatG+zs7JRjcM2aNTqULmV1rLGgbOnEiRPYuXMn+vXrhzx58mDhwoVo3bo17t+/j/z58ye7zIYNG7BixQqcPn0aq1atAgBUq1YNQHxV+bp169CmTRsMHToUp06dwsyZM3Ht2jX8/PPPGuu5ceMGvvrqK/Tu3Rs9e/ZEiRIllPdmzpwJCwsLjBo1Crdu3cKiRYuQI0cOGBkZ4eXLl5g0aRL+/vtvBAQEwNnZGRMmTPjodq5evRq9e/dGtWrVMGjQINy5cwfNmjWDtbU1HBwcPrps69atceXKFfTv3x9OTk548uQJDh06hPv378PJyQkLFixA//79kTt3bowdOxYAYGdnp7GOfv36wdbWFhMmTEBERMRHP++///5D+/bt0adPH/j5+WHt2rVo27Yt9u/fjwYNGnx02Q+lJrbEAgIC4O/vj4oVK2LmzJkIDQ3F999/jz///BP//POPxp3d2NhY+Pr6onLlypg7dy4OHz6MefPmwdXVFX379k3xM2rWrIn58+fjypUrSifY48ePw8jICMePH8eAAQOUaUB8k4zk9O7dG48ePcKhQ4eSNNlQ+/HHH/H69Wv07t0bKpUKs2fPRqtWrXDnzh2tLwR///13NGrUCBUqVMDEiRNhZGSEtWvXol69ejh+/DgqVaqkMX+7du3g7OyMmTNn4vz581i1ahUKFCiAb7/9Vpmna9eu2Lp1Kzp37owqVargjz/+QJMmTTTW06pVK9y8eRM//fQT5s+fDxsbGwCAra2tMs/nHMeJTZ06Faamphg2bBiioqJgamqKq1evYteuXWjbti2cnZ0RGhqK5cuXo3bt2rh69WqSJj+zZs2CkZERhg0bhrCwMMyePRudOnXCqVOnlHl++OEHfPPNN6hZsyYGDx6Mu3fvokWLFsiXL5+ScANAXFwcmjVrhhMnTqBXr14oVaoULl++jPnz5+PmzZvYtWvXR7cnNfvx2LFjUaJECaxYsQJTpkyBs7MzXF1dP1lW+hQcHIwnT57A29s7yXuVKlXC3r17U7Wen3/+Gf7+/li7du1nJ1OJrV27FpGRkejVqxfMzMxgbW2N8PBwrFq1Cl999RV69uyJ169fY/Xq1fD19cXp06eTDPiRmmP1U+ditdScQ0NDQ1GtWjW8ffsWAwYMQP78+bFu3To0a9YM27dvR8uWLQEAK1euxIABA9CmTRsMHDgQkZGRuHTpEk6dOoWOHTsq66pSpYpys87W1hb79u1D9+7dER4ejkGDBulcxpQFCZEB8PPzE0dHxyTTJ06cKB/u5gDE1NRUbt26pUy7ePGiAJBFixYp09auXSsAJCgoSONzcuXKpbG+CxcuCADp0aOHxvRhw4YJAPn999+VaY6OjgJA9u/frzHvkSNHBIB4eHhIdHS0Mv2rr74SlUoljRo10pi/atWqyW5vYtHR0VKgQAHx9PSUqKgoZfqKFSsEgNSuXVuZFhQUJABk7dq1IiLy8uVLASBz5sz56GeULl1aYz1q6rKrUaOGxMTEJPte4nJVl8uOHTuUaWFhYVKwYEHx8vJSpiX3faa0zpRiU5f1kSNHRCShnDw8POTdu3fKfHv27BEAMmHCBGWan5+fAJApU6ZorNPLy0sqVKiQ5LMSe/LkiQCQpUuXiojIq1evxMjISNq2bSt2dnbKfAMGDBBra2uJi4sTkaTfjYjI119/nWw5qOfNnz+/vHjxQpn+yy+/CADZvXv3R2P8sGzi4uKkWLFi4uvrq8QjIvL27VtxdnaWBg0aKNPU3023bt001tmyZUvJnz+/8ve5c+cEgAwaNEhjvq5duwoAmThxojJtzpw5Sb5XtdQexx/bThcXF3n79q3Ge5GRkRIbG6sxLSgoSMzMzDS+d/U6SpUqpXF8ff/99wJALl++LCIiUVFRkj9/fqlYsaK8f/9emS8gICDJcbhhwwYxMjKS48ePa3z+smXLBID8+eefKW6TNvux+ng5c+bMx4pJRFI+t36oSZMmqZovJWfOnEmyn3/43vr165O8N3z4cAEgkZGRGtOT20b1tOQ+42Ny5colfn5+yt/q48zS0lKePHmiMW9MTIzG/iASfz61s7PTODZSe6ym9lyc2nPooEGDBIDGPvb69WtxdnYWJycnZd9v3ry5lC5d+qOf2b17dylYsKA8e/ZMY3qHDh3EysoqybFF2QObQlG25OPjo3GXrmzZsrC0tMSdO3e0Xpf6btmQIUM0pg8dOhQAklQxOzs7w9fXN9l1denSReOOcuXKlSEi6Natm8Z8lStXxoMHDxATE5NiXGfPnsWTJ0/Qp08fjXa/Xbt2hZWV1Ue3Sd2P5OjRo3j58uVH5/2Ynj17pro/RaFChZS7ZQBgaWmJLl264J9//kFISMhnx/Ap6nLq16+fRl+GJk2aoGTJksk2EejTp4/G3zVr1vzkvmNra4uSJUvi2LFjAIA///wTxsbGGD58OEJDQ/Hff/8BiK+xqFGjRrLNm1Krffv2yJcvn0Z8ALTevy9cuID//vsPHTt2xPPnz/Hs2TM8e/YMERERqF+/Po4dO4a4uDiNZZIrm+fPnyM8PBwAlKZK/fr105ivf//+WsUG6H4c+/n5JenfZGZmpvSziI2NxfPnz5E7d26UKFEC58+fT7IOf39/jePrw7I+e/Ysnj9/jp49e8LEJKGRQKdOnTS+IyC+GVOpUqVQsmRJpayfPXuGevXqAUCS5jSJfc5+nFW8e/cOAJId8EG9rep5PqZr164QkTSprQDiaxIS16AB8X3z1PtDXFwcXrx4gZiYGHh7eye7/3zqWNXmXJyac+jevXtRqVIl1KhRQ5kvd+7c6NWrF+7evYurV68CiO9/8/DhwxSbUIoIduzYgaZNm0JENPZXX19fhIWFJbu9ZPiYWFC2lLidrlq+fPk+6yL63r17MDIygpubm8Z0e3t75M2bF/fu3dOY7uzsnOq41AnAh82WrKysEBcX99G2wurPLVasmMb0HDlyJOmc+CEzMzN8++232LdvH+zs7FCrVi3Mnj1b6wv8j23rh9zc3JJcTBcvXhwAku2PkVbU5ZS4SZpayZIlk3x/5ubmSS4mUrvv1KxZU2nqdPz4cXh7e8Pb2xvW1tY4fvw4wsPDcfHiReXi4nN9uB+pL1y03b/VyY6fnx9sbW01XqtWrUJUVFSSffBTn60+Xj7cNz48flJD1+M4uf0zLi4O8+fPR7FixWBmZgYbGxvY2tri0qVLyR5vqdleIOn2mZiYJOkX9t9//+HKlStJylp9HKg7XSdH2/04o8TGxiIkJETjFR0drdU61Mlfcv1MIiMjNebJSCmd39atW4eyZcvC3Nwc+fPnh62tLX777bfP2n+0ORen5hx67969ZPeRUqVKKe8DwMiRI5E7d25UqlQJxYoVw9dff63Rr+rp06d49eoVVqxYkWR/9ff3B/Dx/ZUMF/tYkEFI6e5uSh1qU7qLLok61qZVDB/62A9gSnGlR7yfMmjQIDRt2hS7du3CgQMHMH78eMycORO///47vLy8UrWOtP6x1/Z7Tg+6jGhVo0YNrFy5Enfu3MHx48dRs2ZNqFQq1KhRA8ePH0ehQoUQFxenc2KRVvuLujZizpw5KT4M8sNhNzNyX9X1s5LbP2fMmIHx48ejW7dumDp1KqytrWFkZIRBgwYlqZ1JixgSi4uLQ5kyZfDdd98l+/6n+kVlRg8ePEhyAX7kyJEkndY/pmDBggCAx48fJ3nv8ePHsLa2Tvfhq5OT3P6zceNGdO3aFS1atMDw4cNRoEABGBsbY+bMmbh9+3aS+VOz/6TFuVhbpUqVwo0bN7Bnzx7s378fO3bswNKlSzFhwgRMnjxZORb+97//KYMBfKhs2bLpEhtlbkwsyCDky5cv2YdoZcRdOkdHR8TFxeG///5T7voA8R3bXr16BUdHx3SPIaW4gPi7oOqmFADw/v17BAUFoVy5cp9ch6urK4YOHYqhQ4fiv//+g6enJ+bNm4eNGzcCSH0ylRq3bt2CiGis8+bNmwCg3NlV38179eqVRofq5L7n1MamLqcbN25olJN6Wlp+f+qE4dChQzhz5gxGjRoFIL6j9g8//IBChQohV65cqFChwkfXk5bl/jHqZkaWlpapet5BaqiPl6CgII3atORGUsqo7Uxs+/btqFu3LlavXq0x/dWrV0oHcm2o959bt26hbt26yvSYmBjcvXtX4+LL1dUVFy9eRP369bXe9ozcj7Vhb2+PQ4cOaUxLzbknscKFC8PW1jbZp2gn1yFan7Zv3w4XFxfs3LlT4zucOHGiTuv91LkYSN051NHRETdu3Eiy/uvXryvvq+XKlQvt27dH+/btER0djVatWmH69OkYPXo0bG1tkSdPHsTGxqbZuYEMA5tCkUFwdXVFWFgYLl26pEx7/PhxkhGZ0kPjxo0BxI9ElJj6ruOHo91kFG9vb9ja2mLZsmUaTQ8CAgI++STjt2/fKk0M1FxdXZEnTx6N5gi5cuVKs6ciP3r0SOP7Cg8Px/r16+Hp6akMSam+0FX3UwDin4+xbt26JOtLbWze3t4oUKAAli1bprFt+/btw7Vr19L0+3N2dkbhwoUxf/58vH//HtWrVwcQn3Dcvn0b27dvR5UqVTTa4idH/ZTk9H4idYUKFeDq6oq5c+fizZs3Sd7/8KnHqaHuX7R06VKN6YsWLUoyb0ZtZ2LGxsZJahu2bduWZOjh1PL29kb+/PmxcuVKjT5RmzZtStJkq127dggODsbKlSuTrOfdu3cfHVktI/djbZibm8PHx0fj9WHfktRo3bo19uzZgwcPHijTAgMDcfPmTbRt2zZV60ir4WY/Rl0DkXgfOnXqFE6ePPlZ60vtuRhI3Tm0cePGOH36tEY8ERERWLFiBZycnODu7g4g/unsiZmamsLd3R0igvfv38PY2BitW7fGjh07kn1+yeecG8gwsMaCDEKHDh0wcuRItGzZEgMGDMDbt2/xww8/oHjx4unegaxcuXLw8/PDihUr8OrVK9SuXRunT5/GunXr0KJFC427lBkpR44cmDZtGnr37o169eqhffv2CAoKwtq1az/Zx+LmzZuoX78+2rVrB3d3d5iYmODnn39GaGgoOnTooMxXoUIF/PDDD5g2bRrc3NxQoECBJHdLU6t48eLo3r07zpw5Azs7O6xZswahoaFYu3atMk/Dhg1RtGhRdO/eHcOHD4exsTHWrFkDW1tb3L9/X2N9qY0tR44c+Pbbb+Hv74/atWvjq6++UobpdHJywuDBgz9re1JSs2ZNbN68GWXKlFEusMqXL49cuXLh5s2bylCOH6Ou0RgwYAB8fX1hbGys8b2kFSMjI6xatQqNGjVC6dKl4e/vj8KFCyM4OBhHjhyBpaUldu/erdU6K1SogNatW2PBggV4/vy5Mtys+s5q4rut6u0cO3YsOnTogBw5cqBp06ZKwpEevvzyS0yZMgX+/v6oVq0aLl++jE2bNn3ymEmJqakpJk2ahP79+6NevXpo164d7t69i4CAALi6umpsb+fOnbF161b06dMHR44cQfXq1REbG4vr169j69atyvNvkpPR+zEAXLp0Cb/++iuA+LvlYWFhmDZtGoD482LTpk0/uY7Fixfj1atXePToEQBg9+7dePjwIYD4Dv3qfmZjxozBtm3bULduXQwcOBBv3rzBnDlzUKZMGaVN/6ek9XCzyfnyyy+xc+dOtGzZEk2aNEFQUBCWLVsGd3f3ZJPzT0ntuRhI3Tl01KhR+Omnn9CoUSMMGDAA1tbWWLduHYKCgrBjxw5l4IKGDRvC3t4e1atXh52dHa5du4bFixejSZMmyJMnD4D4oZaPHDmCypUro2fPnnB3d8eLFy9w/vx5HD58GC9evNChJCnLyviBqIjSx8GDB8XDw0NMTU2lRIkSsnHjxhSHm/3666+TLO/o6KgxpGBqh5sVEXn//r1MnjxZnJ2dJUeOHOLg4CCjR49OMgSio6OjNGnSJMny6qErt23bpjE9pWEh1dv19OnTFMtDbenSpeLs7CxmZmbi7e0tx44dk9q1a390uNlnz57J119/LSVLlpRcuXKJlZWVVK5cWbZu3aqx7pCQEGnSpInkyZNHY+jMjw1nmdJws02aNJEDBw5I2bJlxczMTEqWLJmkPETihyutXLmymJqaStGiReW7775Ldp0pxfbhkKpqW7ZsES8vLzEzMxNra2vp1KmTPHz4UGOelL7/lIbBTc6SJUsEgPTt21djuo+PjwCQwMBAjenJDTcbExMj/fv3F1tbW1GpVMpnq+dNbmhKfDCUa3JSKpt//vlHWrVqJfnz5xczMzNxdHSUdu3aacSa0j6Z3HcTEREhX3/9tVhbW0vu3LmlRYsWcuPGDQEgs2bN0lh+6tSpUrhwYTEyMtJYT2qP449tZ3L7V2RkpAwdOlQKFiwoFhYWUr16dTl58mSSYyaldST3fYmILFy4UBwdHcXMzEwqVaokf/75p1SoUEG++OILjfmio6Pl22+/ldKlS4uZmZnky5dPKlSoIJMnT5awsLCPbpdI6vbjtBpuVr2e5F6f+g7U1MOkJvf6cJjhf//9Vxo2bCg5c+aUvHnzSqdOnSQkJOSjsaXncLPJHWdxcXEyY8YM5bv28vKSPXv2JCnH1B6rqT0Xa3MOvX37trRp00by5s0r5ubmUqlSJdmzZ4/GPMuXL5datWopx7yrq6sMHz48yT4YGhoqX3/9tTg4OEiOHDnE3t5e6tevLytWrPhUsZKBUomkY+9PIiKiVLhw4QK8vLywceNGdOrUSd/hpLu4uDjY2tqiVatWyTZ9yiy6du2K33//HefPn4eJiYlG36bMKDo6GuHh4di8eTP69++PM2fOpFjLY0icnJzg4eGBPXv26DsUyubYFIqIiDLUu3fvkoyos2DBAhgZGaX4xPGsLDIyEmZmZhrNntavX48XL15oNTqSvjx48AC2trYoXbp0su3pM5O9e/dqPMuBiDIWEwsiIspQs2fPxrlz51C3bl2YmJhg37592LdvH3r16pUlh1T9lL///huDBw9G27ZtkT9/fpw/fx6rV6+Gh4dHqjse68uIESPwv//9D0DSoYUzo+rVq2uMQpXcMxuIKP2wKRQREWWoQ4cOYfLkybh69SrevHmDokWLonPnzhg7duwnR8TKiu7evYsBAwbg9OnTePHiBaytrdG4cWPMmjULBQoU0Hd4ZADYFIoyCyYWRERERESkMz7HgoiIiIiIdMbEgoiIiIiIdGZ4jVk/IS4uDo8ePUKePHk0RuggIiIiIiJNIoLXr1+jUKFCykMUU5LtEotHjx4Z5KgjRERERETp5cGDByhSpMhH58l2iYX6UfQPHjyApaWlnqMhIiIiIsq8wsPD4eDgoFxDf0y2SyzUzZ8sLS2ZWBARERERpUJquhCw8zYREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREeksUyQWS5YsgZOTE8zNzVG5cmWcPn06xXkDAgKgUqk0Xubm5hkYLRERERERfUjvicWWLVswZMgQTJw4EefPn0e5cuXg6+uLJ0+epLiMpaUlHj9+rLzu3buXgRETEREREdGH9J5YfPfdd+jZsyf8/f3h7u6OZcuWIWfOnFizZk2Ky6hUKtjb2ysvOzu7DIyYiIiIiIg+pNfEIjo6GufOnYOPj48yzcjICD4+Pjh58mSKy7158waOjo5wcHBA8+bNceXKlRTnjYqKQnh4uMaLiIiIiIjSll4Ti2fPniE2NjZJjYOdnR1CQkKSXaZEiRJYs2YNfvnlF2zcuBFxcXGoVq0aHj58mOz8M2fOhJWVlfJycHBI8+0gIiIiIsru9N4USltVq1ZFly5d4Onpidq1a2Pnzp2wtbXF8uXLk51/9OjRCAsLU14PHjzI4IiJiEhnKpVhvoiIDIiJPj/cxsYGxsbGCA0N1ZgeGhoKe3v7VK0jR44c8PLywq1bt5J938zMDGZmZjrHSkREREREKdNrjYWpqSkqVKiAwMBAZVpcXBwCAwNRtWrVVK0jNjYWly9fRsGCBdMrTCIiIiIi+gS91lgAwJAhQ+Dn5wdvb29UqlQJCxYsQEREBPz9/QEAXbp0QeHChTFz5kwAwJQpU1ClShW4ubnh1atXmDNnDu7du4cePXroczOIiIiIiLI1vScW7du3x9OnTzFhwgSEhITA09MT+/fvVzp0379/H0ZGCRUrL1++RM+ePRESEoJ8+fKhQoUK+Ouvv+Du7q6vTSAiIiIiyvZUIiL6DiIjhYeHw8rKCmFhYbC0tNR3OERElBqG2tE5e/0EE1EWpM21c5YbFYqIiIiIiDIfJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKQzJhZERERERKSzTJFYLFmyBE5OTjA3N0flypVx+vTpVC23efNmqFQqtGjRIn0DJCIiIiKij9J7YrFlyxYMGTIEEydOxPnz51GuXDn4+vriyZMnH13u7t27GDZsGGrWrJlBkRIRERERUUr0nlh899136NmzJ/z9/eHu7o5ly5YhZ86cWLNmTYrLxMbGolOnTpg8eTJcXFwyMFoiIiIiIkqOXhOL6OhonDt3Dj4+Pso0IyMj+Pj44OTJkykuN2XKFBQoUADdu3f/5GdERUUhPDxc40VERERERGlLr4nFs2fPEBsbCzs7O43pdnZ2CAkJSXaZEydOYPXq1Vi5cmWqPmPmzJmwsrJSXg4ODjrHTUREREREmvTeFEobr1+/RufOnbFy5UrY2NikapnRo0cjLCxMeT148CCdoyQiIiIiyn5M9PnhNjY2MDY2RmhoqMb00NBQ2NvbJ5n/9u3buHv3Lpo2bapMi4uLAwCYmJjgxo0bcHV11VjGzMwMZmZm6RA9ERERERGp6bXGwtTUFBUqVEBgYKAyLS4uDoGBgahatWqS+UuWLInLly/jwoULyqtZs2aoW7cuLly4wGZORERERER6otcaCwAYMmQI/Pz84O3tjUqVKmHBggWIiIiAv78/AKBLly4oXLgwZs6cCXNzc3h4eGgsnzdvXgBIMp2IiIiIiDKO3hOL9u3b4+nTp5gwYQJCQkLg6emJ/fv3Kx2679+/DyOjLNUVhIiIiIgo21GJiOg7iIwUHh4OKysrhIWFwdLSUt/hEBFRaqhU+o4gfWSvn2AiyoK0uXZmVQAREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREelMp8QiKioqreIgIiIiIqIsTKvEYt++ffDz84OLiwty5MiBnDlzwtLSErVr18b06dPx6NGj9IqTiIiIiIgysVQlFj///DOKFy+Obt26wcTEBCNHjsTOnTtx4MABrFq1CrVr18bhw4fh4uKCPn364OnTp+kdNxERERERZSIqEZFPzVS1alWMGzcOjRo1gpFRyrlIcHAwFi1aBDs7OwwePDhNA00r4eHhsLKyQlhYGCwtLfUdDhERpYZKpe8I0senf4KJiPRKm2vnVCUWhoSJBRFRFsTEgohIL7S5dtZ5VKjY2FhcuHABL1++1HVVRERERESURWmdWAwaNAirV68GEJ9U1K5dG+XLl4eDgwOOHj2a1vEREREREVEWoHVisX37dpQrVw4AsHv3bgQFBeH69esYPHgwxo4dm+YBEhERERFR5qd1YvHs2TPY29sDAPbu3Yu2bdsqI0Zdvnw5zQMkIiIiIqLMT+vEws7ODlevXkVsbCz279+PBg0aAADevn0LY2PjNA+QiIiIiIgyPxNtF/D390e7du1QsGBBqFQq+Pj4AABOnTqFkiVLpnmARERERESU+WmdWEyaNAkeHh548OAB2rZtCzMzMwCAsbExRo0aleYBEhERERFR5sfnWBARUebH51gQEemFNtfOqaqxWLhwYao/fMCAAamel4iIiIiIDEOqaiycnZ01/n769Cnevn2LvHnzAgBevXqFnDlzokCBArhz5066BJpWWGNBRJQFscaCiEgv0vzJ20FBQcpr+vTp8PT0xLVr1/DixQu8ePEC165dQ/ny5TF16tQ02QAiIiIiIspatO5j4erqiu3bt8PLy0tj+rlz59CmTRsEBQWlaYBpjTUWRERZEGssiIj0Is1rLBJ7/PgxYmJikkyPjY1FaGiotqsjIiIiIiIDoHViUb9+ffTu3Rvnz59Xpp07dw59+/ZVnmlBRERERETZi9aJxZo1a2Bvbw9vb2+YmZnBzMwMlSpVgp2dHVatWpUeMRIRERERUSan9QPybG1tsXfvXty8eRPXr18HAJQsWRLFixdP8+CIiIiIiChr0DqxUCtevDiTCSIiIiIiAvAZiUVsbCwCAgIQGBiIJ0+eIC4uTuP933//Pc2CIyIiIiKirEHrxGLgwIEICAhAkyZN4OHhAZWhDgFIRERERESppnVisXnzZmzduhWNGzdOj3iIiIiIiCgL0npUKFNTU7i5uaVHLERERERElEVpnVgMHToU33//PbR8YDcRERERERkwrZtCnThxAkeOHMG+fftQunRp5MiRQ+P9nTt3pllwRERERESUNWidWOTNmxctW7ZMj1iIiIiIiCiL0jqxWLt2bXrEQUREREREWdhnPyDv6dOnuHHjBgCgRIkSsLW1TbOgiIiIiIgoa9G683ZERAS6deuGggULolatWqhVqxYKFSqE7t274+3bt+kRIxERERERZXJaJxZDhgzBH3/8gd27d+PVq1d49eoVfvnlF/zxxx8YOnRoesRIRERERESZnEq0HDfWxsYG27dvR506dTSmHzlyBO3atcPTp0/TMr40Fx4eDisrK4SFhcHS0lLf4RARUWqoVPqOIH1w6HYiyuS0uXbWusbi7du3sLOzSzK9QIECbApFRERERJRNaZ1YVK1aFRMnTkRkZKQy7d27d5g8eTKqVq36WUEsWbIETk5OMDc3R+XKlXH69OkU5925cye8vb2RN29e5MqVC56entiwYcNnfS4REREREaUNrUeF+v777+Hr64siRYqgXLlyAICLFy/C3NwcBw4c0DqALVu2YMiQIVi2bBkqV66MBQsWwNfXFzdu3ECBAgWSzG9tbY2xY8eiZMmSMDU1xZ49e+Dv748CBQrA19dX688nIiIi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ERERUeaW6hqLn376CWPGjEmSVABAvXr1MGrUKGzatClNgyMiIiIioqwh1YnFpUuX8MUXX6T4fqNGjXDx4sU0CYqIiIiIiLKWVCcWL168gJ2dXYrv29nZ4eXLl2kSFBERERERZS2pTixiY2NhYpJylwxjY2PExMSkSVBERERERJS1pLrztoiga9euMDMzS/b9qKioNAuKiIiIiIiyllQnFn5+fp+chyNCERERERFlT6lOLNauXZuecRARERERURaW6j4WREREREREKWFiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOmNiQUREREREOjPRdwBERPQRKpW+I0h7IvqOgIiI0gFrLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGdMLIiIiIiISGd6TyyWLFkCJycnmJubo3Llyjh9+nSK8165cgWtW7eGk5MTVCoVFixYkHGBEhEREVHmplIZ3isL0WtisWXLFgwZMgQTJ07E+fPnUa5cOfj6+uLJkyfJzv/27Vu4uLhg1qxZsLe3z+BoiYiIiIgoJXpNLL777jv07NkT/v7+cHd3x7Jly5AzZ06sWbMm2fkrVqyIOXPmoEOHDjAzM8vgaImIiIiIKCV6Syyio6Nx7tw5+Pj4JARjZAQfHx+cPHlSX2EREREREdFnMNHXBz979gyxsbGws7PTmG5nZ4fr16+n2edERUUhKipK+Ts8PDzN1k1ERERERPH03nk7vc2cORNWVlbKy8HBQd8hEREREREZHL0lFjY2NjA2NkZoaKjG9NDQ0DTtmD169GiEhYUprwcPHqTZuomIiIiIKJ7eEgtTU1NUqFABgYGByrS4uDgEBgaiatWqafY5ZmZmsLS01HgREREREVHa0lsfCwAYMmQI/Pz84O3tjUqVKmHBggWIiIiAv78/AKBLly4oXLgwZs6cCSC+w/fVq1eV/wcHB+PChQvInTs33Nzc9LYdRERERETZnV4Ti/bt2+Pp06eYMGECQkJC4Onpif379ysduu/fvw8jo4RKlUePHsHLy0v5e+7cuZg7dy5q166No0ePZnT4RERERET0/1QiIvoOIiOFh4fDysoKYWFhbBZFRJlfFnvqaqp8zs+OIZYD8HllQUQpM8RzhZ7PE9pcOxv8qFBERERERJT+mFgQEREREZHOmFgQEREREZHOmFgQEREREZHO9DoqFBEREWmJnVOJKJNijQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMiQUREREREemMw80SERERZWWGOAQxwGGIsyDWWBARERERkc5YY6Evhnh3gXcWiIiIiLIt1lgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOmFgQEREREZHOTPQdABFREiqVviNIeyL6joCIiChdscaCiIiIiIh0xsSCiIiIiIh0xqZQRERElDWx2SRRpsIaCyIiIiIi0hlrLIgyC0O88wbw7hsREVE2wRoLIiIiIiLSGRMLIiIiIiLSGZtCkf4ZYhMgNv8hIiKibIY1FkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpDMmFkREREREpLNMkVgsWbIETk5OMDc3R+XKlXH69OmPzr9t2zaULFkS5ubmKFOmDPbu3ZtBkRIRERERUXL0nlhs2bIFQ4YMwcSJE3H+/HmUK1cOvr6+ePLkSbLz//XXX/jqq6/QvXt3/PPPP2jRogVatGiBf//9N4MjJyIiIiIiNZWIiD4DqFy5MipWrIjFixcDAOLi4uDg4ID+/ftj1KhRSeZv3749IiIisGfPHmValSpV4OnpiWXL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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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XVtjFqrU7tlARB+Ol0IREVG2sn//fsyYMQNXr17Fq1evULx4cfTo0QOTJk1674xYOdHdu3cxbNgwnDx5EuHh4bC2tkbz5s3xzTffoEiRIvoOjwwAL4Wij4WFBRERERER6Yz3sSAiIiIiIp2xsCAiIiIiIp0Z3sWqH0liYiIePXqEAgUKaMzkQURERERkKEQEL1++hKOjo3KTxLSwsPhAjx49MsjZSYiIiIiI3vXgwQMUK1Ys3TYsLD6Q+pb1Dx48gKWlpZ6jISIiIiLKfFFRUXByclLOfdPDwuIDqS9/srS0ZGFBRERERAYtI5f+c/A2ERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpjIUFERERERHpzETfARAREWUKlUrfEWQuEX1HQESkFfZYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzlhYEBERERGRzvReWCxZsgQuLi4wNzeHl5cXTp48mW77zZs3o2zZsjA3N0fFihWxe/dujce3bduGpk2bonDhwlCpVDh//rzG4+Hh4Rg6dCjKlCkDCwsLFC9eHMOGDUNkZGRmbxoRERERUa6h18Ji48aNGDVqFKZNm4azZ8+icuXK8PX1xZMnT1Jtf/z4cXTt2hV9+/bFuXPn4OfnBz8/P1y+fFlpEx0djTp16uDbb79NdR2PHj3Co0ePMHfuXFy+fBlr1qxBYGAg+vbtmyXbSERERESUG6hERPT1x728vFC9enUsXrwYAJCYmAgnJycMHToU48ePT9G+c+fOiI6Oxq5du5RlNWvWhIeHB5YtW6bR9u7du3B1dcW5c+fg4eGRbhybN2/Gp59+iujoaJiYmGQo9qioKFhZWSEyMhKWlpYZeg4REWUhlUrfEWQu/X08ExEptDnn1VuPRVxcHM6cOQMfH5//gjEygo+PD4KDg1N9TnBwsEZ7APD19U2zfUapE5VeUREbG4uoqCiNHyIiIiIiSqK3wuLZs2dISEiAnZ2dxnI7OzuEhoam+pzQ0FCt2mc0jpkzZ6J///7ptgsICICVlZXy4+Tk9MF/k4iIiIjI0Oh98LY+RUVFoUWLFihfvjymT5+ebtsJEyYgMjJS+Xnw4MHHCZKIiIiIKAfI2ICCLGBjYwNjY2OEhYVpLA8LC4O9vX2qz7G3t9eqfXpevnyJTz75BAUKFMBvv/2GPHnypNvezMwMZmZmWv8dIiIiIqLcQG89FqampqhWrRqCgoKUZYmJiQgKCoK3t3eqz/H29tZoDwD79+9Ps31aoqKi0LRpU5iammLHjh0wNzfXfgOIiIiIiEihtx4LABg1ahT8/f3h6emJGjVqYMGCBYiOjkbv3r0BAD179kTRokUREBAAABg+fDjq16+PefPmoUWLFtiwYQNOnz6NFStWKOsMDw/H/fv38ejRIwDAjRs3ACT1dtjb2ytFxevXr/HLL79oDMS2tbWFsbHxx0wBEREREZFB0Gth0blzZzx9+hRTp05FaGgoPDw8EBgYqAzQvn//PoyM/utUqVWrFtavX4/Jkydj4sSJcHNzw/bt2+Hu7q602bFjh1KYAECXLl0AANOmTcP06dNx9uxZnDhxAgBQqlQpjXhCQkLg4uKSVZtLRERERGSw9Hofi5yM97EgIspmeB8LIqJMlyPuY0FERERERIaDhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREemMhQUREREREenMRN8BEBERERFlKpVK3xFkLhF9R5Ah7LEgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKdsbAgIiIiIiKd6b2wWLJkCVxcXGBubg4vLy+cPHky3fabN29G2bJlYW5ujooVK2L37t0aj2/btg1NmzZF4cKFoVKpcP78+RTriImJweDBg1G4cGHkz58f7du3R1hYWGZuFhERERFRrqLXwmLjxo0YNWoUpk2bhrNnz6Jy5crw9fXFkydPUm1//PhxdO3aFX379sW5c+fg5+cHPz8/XL58WWkTHR2NOnXq4Ntvv03z744cORI7d+7E5s2b8eeff+LRo0do165dpm8fEREREVFuoRIR0dcf9/LyQvXq1bF48WIAQGJiIpycnDB06FCMHz8+RfvOnTsjOjoau3btUpbVrFkTHh4eWLZsmUbbu3fvwtXVFefOnYOHh4eyPDIyEra2tli/fj06dOgAALh+/TrKlSuH4OBg1KxZM0OxR0VFwcrKCpGRkbC0tNR204mIKLOpVPqOIHPp7+OZKOfj8SDTaHPOq7cei7i4OJw5cwY+Pj7/BWNkBB8fHwQHB6f6nODgYI32AODr65tm+9ScOXMGb9++1VhP2bJlUbx4ca3WQ0RERERE/zHR1x9+9uwZEhISYGdnp7Hczs4O169fT/U5oaGhqbYPDQ3N8N8NDQ2FqakpChYsqNV6YmNjERsbq/weFRWV4b9JRERERGTo9D54O6cICAiAlZWV8uPk5KTvkIiIiIiIsg29FRY2NjYwNjZOMRtTWFgY7O3tU32Ovb29Vu3TWkdcXBwiIiK0Ws+ECRMQGRmp/Dx48CDDf5OIiIiIyNDprbAwNTVFtWrVEBQUpCxLTExEUFAQvL29U32Ot7e3RnsA2L9/f5rtU1OtWjXkyZNHYz03btzA/fv3012PmZkZLC0tNX6IiIiIiCiJ3sZYAMCoUaPg7+8PT09P1KhRAwsWLEB0dDR69+4NAOjZsyeKFi2KgIAAAMDw4cNRv359zJs3Dy1atMCGDRtw+vRprFixQllneHg47t+/j0ePHgFIKhqApJ4Ke3t7WFlZoW/fvhg1ahSsra1haWmJoUOHwtvbO8MzQhERERERkSa9FhadO3fG06dPMXXqVISGhsLDwwOBgYHKAO379+/DyOi/TpVatWph/fr1mDx5MiZOnAg3Nzds374d7u7uSpsdO3YohQkAdOnSBQAwbdo0TJ8+HQAwf/58GBkZoX379oiNjYWvry+WLl36EbaYiIiIiMgw6fU+FjkZ72NBRJTNcN56IlLj8SDT5Ij7WBARERERkeFgYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDpjYUFERERERDrTqbCIjY3NrDiIiIiIiCgH06qw2LNnD/z9/VGiRAnkyZMHefPmhaWlJerXr4+vvvoKjx49yqo4iYiIiIgoG8tQYfHbb7+hdOnS6NOnD0xMTPDFF19g27Zt2Lt3L1auXIn69evjwIEDKFGiBAYOHIinT59mddxERERERJSNqERE3tfI29sbkydPRrNmzWBklHYt8vDhQyxatAh2dnYYOXJkpgaa3URFRcHKygqRkZGwtLTUdzhERKRS6TuCzPX+j2ciSguPB5lGm3PeDBUWlBILCyKibIYnEkSkxuNBptHmnFfnWaESEhJw/vx5vHjxQtdVERERERFRDqV1YTFixAj8+OOPAJKKivr166Nq1apwcnLC4cOHMzs+IiIiIiLKAbQuLLZs2YLKlSsDAHbu3ImQkBBcv34dI0eOxKRJkzI9QCIiIiIiyv60LiyePXsGe3t7AMDu3bvRsWNHZcaoS5cuZXqARERERESU/WldWNjZ2eHq1atISEhAYGAgmjRpAgB4/fo1jI2NMz1AIiIiIiLK/ky0fULv3r3RqVMnODg4QKVSwcfHBwBw4sQJlC1bNtMDJCIiIiKi7E/rwmL69Olwd3fHgwcP0LFjR5iZmQEAjI2NMX78+EwPkIiIiIiIsj/ex+ID8T4WRETZDOetJyI1Hg8yjTbnvBnqsVi4cGGG//iwYcMy3JaIiIiIiAxDhnosXF1dNX5/+vQpXr9+jYIFCwIAIiIikDdvXhQpUgR37tzJkkCzG/ZYEBFlM/yGkojUeDzINJl+5+2QkBDl56uvvoKHhweuXbuG8PBwhIeH49q1a6hatSpmzpyZKRtAREREREQ5i9ZjLEqWLIktW7agSpUqGsvPnDmDDh06ICQkJFMDzK7YY0FElM3wG0oiUuPxINNkeo9Fco8fP0Z8fHyK5QkJCQgLC9N2dUREREREZAC0LiwaN26MAQMG4OzZs8qyM2fO4PPPP1fuaUFERERERLmL1oXFqlWrYG9vD09PT5iZmcHMzAw1atSAnZ0dVq5cmRUxEhERERFRNqf1DfJs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sLe3T/U59vb26bZX/5uRdT569AgNGzZErVq1sGLFinRjnTBhAiIjI5WfBw8evH8DiYiIiIhyCb0WFqampqhWrRqCgoKUZYmJiQgKCoK3t3eqz/H29tZoDwD79+9X2ru6usLe3l6jTVRUFE6cOKGxzocPH6JBgwaoVq0aVq9eDSOj9FNhZmYGS0tLjR8iIiIiIkqi1zEWADBq1Cj4+/vD09MTNWrUwIIFCxAdHY3evXsDAHr27ImiRYsiICAAADB8+HDUr18f8+bNQ4sWLbBhwwacPn1a6XFQqVQYMWIEZs2aBTc3N7i6umLKlClwdHSEn58fgP+KCmdnZ8ydOxdPnz5V4kmrp4SIiIiIiNKm98Kic+fOePr0KaZOnYrQ0FB4eHggMDBQGXx9//59jd6EWrVqYf369Zg8eTImTpwINzc3bN++He7u7kqbcePGITo6Gv3790dERATq1KmDwMBAmJubA0jq4bh9+zZu376NYsWKacSj59l3iYiIiIhyJL3fxyKn4n0ssgDnqWYOAOYAYA4A5gBgDgDmAGAOAOYA4H0siIiIiIgo92BhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOmNhQUREREREOssWhcWSJUvg4uICc3NzeHl54eTJk+m237x5M8qWLQtzc3NUrFgRu3fv1nhcRDB16lQ4ODjAwsICPj4+uHXrlkab8PBwdO/eHZaWlihYsCD69u2LV69eZfq2ERERERHlBnovLDZu3IhRo0Zh2rRpOHv2LCpX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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":31: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " new_df['Stringtype'] = new_df['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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rW26zzMwMED58uUBAG5ubrhy5QoCAgKUxOJtzs7OsLKyws2bN9NMLExMTDi4m4iIiIhICzodY2FsbIw6deogKChI2ZaUlISgoCB4enpmeD9JSUmIi4tL9/EHDx4gPDwcdnZ2WsVLRERERERp03lXKD8/P/j4+MDd3R316tXDwoULERMTA19fXwBAv379ULp0aQQEBABIHg/h7u4OFxcXxMXFYffu3diwYQOWLVsGAIiOjoa/vz+6du0KW1tb3Lp1CxMmTED58uU1pqMlIiIiIqLso/PEomfPnnj69CmmT5+O0NBQuLm5ITAwUBnQfe/ePRgY/K9hJSYmBsOHD8eDBw9gZmaGypUr46effkLPnj0BAIaGhjh//jzWrVuHiIgI2Nvbo3Xr1pg5cya7OxERERER5RCdr2ORF3EdCyKifIDrWBAR5bh8s44FERERERHpByYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESkNSYWRERERESktTyRWCxduhSOjo4wNTWFh4cHTpw4kW7Z7du3w93dHcWLF0eRIkXg5uaGDRs2aJQREUyfPh12dnYwMzODl5cXbty4kdOHQURERERUYOk8sdi0aRP8/PwwY8YMnDlzBjVr1oS3tzeePHmSZnlLS0tMmTIFwcHBOH/+PHx9feHr64u9e/cqZebOnYtFixZh+fLlOH78OIoUKQJvb2/Exsbm1mERERERERUoKhERXQbg4eGBunXrYsmSJQCApKQkODg4YMSIEZg4cWKG9lG7dm20b98eM2fOhIjA3t4eY8eOxbhx4wAAkZGRsLGxwdq1a9GrV6/37i8qKgoWFhaIjIyEubl51g+OiIhyjkql6wiyl26/jomI0pSZ62KdtljEx8fj9OnT8PLyUrYZGBjAy8sLwcHB732+iCAoKAjXrl1DkyZNAAAhISEIDQ3V2KeFhQU8PDzS3WdcXByioqI0foiIiIiIKON0mlg8e/YMiYmJsLGx0dhuY2OD0NDQdJ8XGRmJokWLwtjYGO3bt8fixYvRqlUrAFCel5l9BgQEwMLCQvlxcHDQ5rCIiIiIiAocnY+xyIpixYrh7NmzOHnyJL766iv4+fnh0KFDWd7fpEmTEBkZqfzcv38/+4IlIiIiIioAjHT5x62srGBoaIiwsDCN7WFhYbC1tU33eQYGBihfvjwAwM3NDVeuXEFAQACaNWumPC8sLAx2dnYa+3Rzc0tzfyYmJjAxMdHyaIiIiIiICi6dtlgYGxujTp06CAoKUrYlJSUhKCgInp6eGd5PUlIS4uLiAABOTk6wtbXV2GdUVBSOHz+eqX0SEREREVHG6bTFAgD8/Pzg4+MDd3d31KtXDwsXLkRMTAx8fX0BAP369UPp0qUREBAAIHk8hLu7O1xcXBAXF4fdu3djw4YNWLZsGQBApVJh9OjRmDVrFipUqAAnJydMmzYN9vb26Ny5s64Ok4iIiIhIr+k8sejZsyeePn2K6dOnIzQ0FG5ubggMDFQGX9+7dw8GBv9rWImJicHw4cPx4MEDmJmZoXLlyvjpp5/Qs2dPpcyECRMQExODwYMHIyIiAo0aNUJgYCBMTU1z/fiIiIiIiAoCna9jkRdxHQsionyA61gQEeW4fLOOBRERERER6QcmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDUmFkREREREpDWtE4u4uLjsiIOIiIiIiPKxTCcWe/bsgY+PD5ydnVGoUCEULlwY5ubmaNq0Kb766is8evQoJ+IkIiIiIqI8LMOJxW+//YaKFStiwIABMDIywueff47t27dj7969WLVqFZo2bYoDBw7A2dkZQ4cOxdOnTzMcxNKlS+Ho6AhTU1N4eHjgxIkT6ZZduXIlGjdujBIlSqBEiRLw8vJKVb5///5QqVQaP23atMlwPERERERElDkqEZGMFPT09MTUqVPRtm1bGBikn488fPgQixcvho2NDcaMGfPe/W7atAn9+vXD8uXL4eHhgYULF2LLli24du0aSpUqlap8nz590LBhQzRo0ACmpqaYM2cOfvvtN1y6dAmlS5cGkJxYhIWFYc2aNcrzTExMUKJEiYwcKqKiomBhYYHIyEiYm5tn6DlERJTLVCpdR5C9MvZ1TESUqzJzXZzhxCKneHh4oG7duliyZAkAICkpCQ4ODhgxYgQmTpz43ucnJiaiRIkSWLJkCfr16wcgObGIiIjAjh07shQTEwsionyAiQURUY7LzHVxtswKlZiYiLNnz+LFixeZel58fDxOnz4NLy+v/wVkYAAvLy8EBwdnaB+vXr3CmzdvYGlpqbH90KFDKFWqFCpVqoRhw4YhPDw8U7EREREREVHGZSmxGD16NH788UcAyUlF06ZNUbt2bTg4OODQoUMZ3s+zZ8+QmJgIGxsbje02NjYIDQ3N0D4+//xz2NvbayQnbdq0wfr16xEUFIQ5c+bg8OHDaNu2LRITE9PcR1xcHKKiojR+iIiIiIgo44yy8qStW7fi448/BgDs3LkTISEhuHr1KjZs2IApU6bg77//ztYg0zN79mz8+uuvOHToEExNTZXtvXr1Uv5fvXp11KhRAy4uLjh06BBatmyZaj8BAQHw9/fPlZiJiIiIiPRRllosnj17BltbWwDA7t270b17d2XGqAsXLmR4P1ZWVjA0NERYWJjG9rCwMGX/6Zk/fz5mz56Nffv2oUaNGu8s6+zsDCsrK9y8eTPNxydNmoTIyEjl5/79+xk+BiIiIiIiymJiYWNjg8uXLyMxMRGBgYFo1aoVgOTxDoaGhhnej7GxMerUqYOgoCBlW1JSEoKCguDp6Znu8+bOnYuZM2ciMDAQ7u7u7/07Dx48QHh4OOzs7NJ83MTEBObm5ho/RERERESUcVnqCuXr64sePXrAzs4OKpVKGd9w/PhxVK5cOVP78vPzg4+PD9zd3VGvXj0sXLgQMTEx8PX1BQD069cPpUuXRkBAAABgzpw5mD59On7++Wc4OjoqYzGKFi2KokWLIjo6Gv7+/ujatStsbW1x69YtTJgwAeXLl4e3t3dWDpeIiIiIiN4jS4nFF198AVdXV9y/fx/du3eHiYkJAMDQ0DBDU8Sm1LNnTzx9+hTTp09HaGgo3NzcEBgYqAzovnfvnsa6GcuWLUN8fDy6deumsZ8ZM2bgiy++gKGhIc6fP49169YhIiIC9vb2aN26NWbOnKnESURERERE2Uvn61jkRVzHgogoH+A6FkREOS4z18UZbrFYtGhRhgMYOXJkhssSEREREVH+l+EWCycnJ43fnz59ilevXqF48eIAgIiICBQuXBilSpXC7du3sz3Q3MQWCyKifIAtFkREOS5HVt4OCQlRfr766iu4ubnhypUreP78OZ4/f44rV66gdu3amDlzptYHQERERERE+UuWxli4uLhg69atqFWrlsb206dPo1u3bggJCcm2AHWBLRZERPkAWyyIiHJcjrRYpPT48WMkJCSk2p6YmJhqsTsiIiIiItJ/WUosWrZsiSFDhuDMmTPKttOnT2PYsGHKmhZERERERFRwZCmxWL16NWxtbeHu7g4TExOYmJigXr16sLGxwapVq7I7RiIiIiIiyuOytECetbU1du/ejevXr+Pq1asAgMqVK6NixYrZGhwREREREeUPWUos1CpWrMhkgoiIiIiIspZYJCYmYu3atQgKCsKTJ0+QlJSk8fhff/2VLcEREREREVH+kKXEYtSoUVi7di3at28PV1dXqPRtyj8iIiIiIsqULCUWv/76KzZv3ox27dpldzxERERERJQPZWlWKGNjY5QvXz67YyEiIiIionwqS4nF2LFj8d133yELi3YTEREREZEeylJXqGPHjuHgwYPYs2cPqlWrhkKFCmk8vn379mwJjoiIiIiI8ocsJRbFixdHly5dsjsWIiIiIiLKp7KUWKxZsya74yAiIiIionxMqwXynj59imvXrgEAKlWqBGtr62wJioiIiIiI8pcsDd6OiYnBgAEDYGdnhyZNmqBJkyawt7fHwIED8erVq+yOkYiIiIiI8rgsJRZ+fn44fPgwdu7ciYiICEREROD333/H4cOHMXbs2OyOkYiIiIiI8jiVZGHOWCsrK2zduhXNmjXT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6+IstVh8++23iI6OBgD4+/sjOjoamzZtQoUKFXQ6IxQREREREelGphOLxMREPHjwADVq1ACQ3C0qM6ttExGRlninnoiI8qBMD942NDRE69at8eLFi5yIh4iIiIiI8qEszQrl6uqK27dvZ3csRERERESUT2UpsZg1axbGjRuHXbt24fHjx4iKitL4ISIiIiKigiVLs0KlnAJWlaKvr4hApVIhMTExe6LTEc4KRUR5GsdYJGM9EBHluByfFergwYNZCoyIiIiIiPRTlhKLpk2bZnccRERERESUj2UpsThy5Mg7H2/SpEmWgiEiIiIiovwpS4lFs2bNUm1LOdYiv4+xICIiIiKizMnSrFAvXrzQ+Hny5AkCAwNRt25d7Nu3L7tjJCIiIiKiPC5LLRYWFhaptrVq1QrGxsbw8/PD6dOntQ6MiIiIiIjyjyy1WKTHxsYG165dy85dEhERERFRPpClFovz589r/C4iePz4MWbPng03N7fsiIuIiIiIiPKRLCUWbm5uUKlUeHttvfr162P16tXZEhgREREREeUfWUosQkJCNH43MDCAtbU1TE1NsyUoIiIiIiLKX7KUWJQrVy674yAiIiIionws04lFUlIS1q5di+3bt+POnTtQqVRwcnJCt27d0LdvX431LIiIiIiIqGDI1KxQIoKOHTvik08+wcOHD1G9enVUq1YNd+/eRf/+/dGlS5ecipOIiIiIiPKwTLVYrF27FkeOHEFQUBCaN2+u8dhff/2Fzp07Y/369ejXr1+2BklERERERHlbplosfvnlF0yePDlVUgEALVq0wMSJE7Fx48ZsC46IiIiIiPKHTCUW58+fR5s2bdJ9vG3btjh37pzWQRERERERUf6SqcTi+fPnsLGxSfdxGxsbvHjxQuugiIiIiIgof8lUYpGYmAgjo/SHZRgaGiIhIUHroIiIiIiIKH/J1OBtEUH//v1hYmKS5uNxcXHZEhQREREREeUvmUosfHx83luGM0IRERERERU8mUos1qxZk1NxEBERERFRPpapMRZERERERERpYWJBRERERERaY2JBRERERERaY2JBRERERERaY2JBRERERERaY2JBRERERERay9R0s0REREREeZpKpesIsp+IriPIELZYEBERERGR1phYEBERERGR1nSeWCxduhSOjo4wNTWFh4cHTpw4kW7ZS5cuoWvXrnB0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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c10c049a-3635-4492-a177-b2710615c844", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 757 + }, + "id": "c10c049a-3635-4492-a177-b2710615c844", + "outputId": "29e152d5-d300-4d4f-9cad-a7ad64fcf408" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_fill['durationinseconds'] = pd.to_numeric(df_fill['durationinseconds'], errors='coerce')\n", + ":8: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " df_fill['Stringtype'] = df_fill['Stringtype'].replace(rename_map)\n", + ":8: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_fill['Stringtype'] = df_fill['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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mDZtGoyNjXHx4kWsXbsWERERsLe3R6NGjTB9+nSYmZl90msjIiIiIsopdL6ORXbEdSyIiPSAoU3RyrdjIsqG9GYdCyIiIiIiMgwsLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGssLIiIiIiISGvZorBYtmwZnJycYG5uDi8vL5w6deq9+65cuRK1atWCtbU1rK2t4ePjk2p/EcGUKVNQpEgRWFhYwMfHB//8809WXwYRERERUY6l88Ji8+bNGDFiBKZOnYqzZ8+iUqVK8PX1xdOnT9PcPygoCJ06dcKhQ4cQHBwMBwcHNGrUCI8ePVL2mTNnDhYvXozly5fj5MmTyJMnD3x9fREbG/upLouIiIiIKEdRiYjoMgAvLy94enpi6dKlAICkpCQ4ODhg8ODBGDdu3H8en5iYCGtrayxduhTdunWDiMDe3h4jR47EqFGjAACRkZGwtbWFv78/Onbs+J/njIqKgpWVFSIjI2FpaandBRIRUdZQqXQdQebS7dsxEVGaPua+WKctFvHx8Thz5gx8fHyUbUZGRvDx8UFwcHC6zhETE4O3b9+iQIECAICQkBCEhoZqnNPKygpeXl7vPWdcXByioqI0voiIiIiIKP10Wlg8f/4ciYmJsLW11dhua2uL0NDQdJ1j7NixsLe3VwoJ9XEfc85Zs2bByspK+XJwcPjYSyEiIiIiytF0PsZCG7Nnz8amTZvw66+/wtzcPMPnGT9+PCIjI5WvBw8eZGKURERERESGz0SXP9zGxgbGxsYICwvT2B4WFgY7O7sPHjtv3jzMnj0bBw8eRMWKFZXt6uPCwsJQpEgRjXO6u7uneS4zMzOYmZll8CqIiIiIiEinLRampqb47LPPEBgYqGxLSkpCYGAgvL2933vcnDlzMH36dAQEBKBKlSoajzk7O8POzk7jnFFRUTh58uQHz0lERERERBmn0xYLABgxYgS6d++OKlWqoGrVqli4cCGio6PRs2dPAEC3bt1QtGhRzJo1CwDw7bffYsqUKdiwYQOcnJyUcRN58+ZF3rx5oVKpMGzYMMyYMQMlS5aEs7MzJk+eDHt7e7Rs2VJXl0lEREREZNB0Xlh06NABz549w5QpUxAaGgp3d3cEBAQog6/v378PI6N/G1Z++OEHxMfHo23bthrnmTp1KqZNmwYAGDNmDKKjo9GvXz9ERESgZs2aCAgI0GocBhERERERvZ/O17HIjriOBRGRHuA6FkREWU5v1rEgIiIiIiLDwMKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0xsKCiIiIiIi0pnVhERcXlxlxEBERERGRHvvowuKPP/5A9+7d4eLigly5ciF37tywtLREnTp1MHPmTDx+/Dgr4iQiIiIiomws3YXFr7/+ilKlSqFXr14wMTHB2LFjsWPHDuzbtw+rVq1CnTp1cPDgQbi4uKB///549uxZVsZNRERERETZiEpEJD07ent7Y9KkSWjSpAmMjN5fjzx69AhLliyBra0thg8fnmmBfkpRUVGwsrJCZGQkLC0tdR0OERGlRaXSdQSZK31vx0REn9TH3Benu7DISVhYEBHpARYWRERZ7mPuizNlVqjExEScP38eL1++zIzTERERERGRnslQYTFs2DD89NNPAJKLijp16qBy5cpwcHBAUFBQZsZHRERERER6IEOFxbZt21CpUiUAwO7duxESEoLr169j+PDhmDhxYqYGSERERERE2V+GCovnz5/Dzs4OALB37160a9dOmTHq0qVLmRogERERERFlfxkqLGxtbXH16lUkJiYiICAADRs2BADExMTA2Ng4UwMkIiIiIqLszyQjB/Xs2RPt27dHkSJFoFKp4OPjAwA4efIkypQpk6kBEhERERFR9pehwmLatGlwc3PDgwcP0K5dO5iZmQEAjI2NMW7cuEwNkIiIiIiIsj+uY5EGrmNBRKQHuI4FEVGW+5j74nS3WCxevDjdAQwZMiTd+xIRERERkf5Ld4uFs7OzxvfPnj1DTEwM8ufPDwCIiIhA7ty5UbhwYdy5cyfTA/2U2GJBRKQH2GJBRJTlsmTl7ZCQEOVr5syZcHd3x7Vr1/DixQu8ePEC165dQ+XKlTF9+nStL4CIiIiIiPRLhsZYlChRAtu2bYOHh4fG9jNnzqBt27YICQnJtAB1gS0WRER6gC0WRERZLktaLFJ68uQJEhISUm1PTExEWFhYRk5JRERERER6LEOFRYMGDfDVV1/h7NmzyrYzZ85gwIABypoWRERERESUc2SosFi9ejXs7OxQpUoVmJmZwczMDFWrVoWtrS1WrVqV2TESEREREVE2l6EF8goVKoS9e/fi5s2buH79OgCgTJkyKFWqVKYGR0RERERE+iFDhYVaqVKlWEwQEREREVHGCovExET4+/sjMDAQT58+RVJSksbjf/75Z6YER0RERERE+iFDhcXQoUPh7++Pzz//HG5ublAZ2pR/RERERET0UTJUWGzatAlbtmxB06ZNMzseIiIiIiLSQxmaFcrU1BSurq6ZHQsREREREempDBUWI0eOxKJFi5CBRbuJiIiIiMgAZagr1LFjx3Do0CH88ccfKF++PHLlyqXx+I4dOzIlOCIiIiIi0g8ZKizy58+PVq1aZXYsRERERESkpzJUWKxZsyaz4yAiIiIiIj2m1QJ5z549w40bNwAApUuXRqFChTIlKCIiIiIi0i8ZGrwdHR2NXr16oUiRIqhduzZq164Ne3t79O7dGzExMZkdIxERERERZXMZKixGjBiBw4cPY/fu3YiIiEBERAR+++03HD58GCNHjszsGImIiIiIKJtTSQbmjLWxscG2bdtQt25dje2HDh1C+/bt8ezZs8yKTyeioqJgZWWFyMhIWFpa6jocIiJKi0ql6wgyF6dwJ6Js6GPuizPUYhETEwNbW9tU2wsXLsyuUEREREREOVCGCgtvb29MnToVsbGxyrY3b97Az88P3t7emRYcERERERHphwwVFosWLcJff/2FYsWKoUGDBmjQoAEcHBxw/PhxLFq06KPOtWzZMjg5OcHc3BxeXl44derUe/e9cuUK2rRpAycnJ6hUKixcuDDVPtOmTYNKpdL4KlOmzMdeIhERERERfYQMTTfr5uaGf/75B+vXr8f169cBAJ06dUKXLl1gYWGR7vNs3rwZI0aMwPLly+Hl5YWFCxfC19cXN27cQOHChVPtHxMTAxcXF7Rr1w7Dhw9/73nLly+PgwcPKt+bmGg1qy4REREREf2HDN9x586dG3379tXqh3/33Xfo27cvevbsCQBYvnw59uzZg9WrV2PcuHGp9vf09ISnpycApPm4momJCezs7LSKjYiIiIiI0i9DXaFmzZqF1atXp9q+evVqfPvtt+k6R3x8PM6cOQMfH59/gzEygo+PD4KDgzMSluKff/6Bvb09XFxc0KVLF9y/f1+r8xERERER0YdlqLBYsWJFmuMWypcvj+XLl6frHM+fP0diYmKq2aVsbW0RGhqakbAAAF5eXvD390dAQAB++OEHhISEoFatWnj16tV7j4mLi0NUVJTGFxERERERpV+GukKFhoaiSJEiqbYXKlQIT5480ToobTRp0kT5f8WKFeHl5QVHR0ds2bIFvXv3TvOYWbNmwc/P71OFSERERERkcDLUYuHg4IC//vor1fa//voL9vb26TqHjY0NjI2NERYWprE9LCwsU8dH5M+fH6VKlcKtW7feu8/48eMRGRmpfD148CDTfj4RERERUU6QocKib9++GDZsGNasWYN79+7h3r17WL16NYYPH57uAd2mpqb47LPPEBgYqGxLSkpCYGBgpq6F8fr1a9y+fTvNFhY1MzMzWFpaanwREREREVH6Zagr1OjRoxEeHo6BAwciPj4eAGBubo6xY8di/Pjx6T7PiBEj0L17d1SpUgVVq1bFwoULER0drcwS1a1bNxQtWhSzZs0CkDzg++rVq8r/Hz16hPPnzyNv3rxwdXUFAIwaNQrNmjWDo6MjHj9+jKlTp8LY2BidOnXKyKUSEREREVE6qEREMnrw69evce3aNVhYWKBkyZIwMzP7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xMREODs7IzY2VmmdmTVrFvr3748xY8Zg9erVsLW11bip7tixI/bv349cuXIZzBz8zAO968WLF+jXrx/KlSuntEi8fv0a4eHh2LZtG3r16oU5c+agX79+AIDffvsNM2fOxOvXrzXOY0itnETZBWeFIr0SHx8PU1NTXYehc8xDzshBTp8RS415oJREBMHBwfjqq69gYmKCs2fP4tKlS+jatStu3ryJb775BsOHDweQXHB07NgRLi4uWLRoEQtNoiyWMz/+Jr1l6DeS6cU85IwclCxZEosWLcKbN2/wyy+/YMyYMcrNdEJCAuzs7LBgwQJUrlwZ1apV03G0WYd5oJRUKhWqVauGH3/8EW/evIG3tzcqVqyI9u3bw8rKCm/evMGVK1cQHByMdu3a4dGjR/juu++gUqk45oYoi7HFgogom7t9+zYGDhwIY2NjTJgwATVr1gQAvH37Frly5cox8+8zDznXqVOnEB4ejiZNmihrmiQkJODs2bPo2LEjihYtiqNHj2Ly5MnYs2cPzp8/Dy8vL+TLlw979uzh3wfRJ8LCgohID6i7A4kIJk+ejBo1aug6JJ1gHnKeQ4cOoUGDBgAALy8vlClTBi1atEDlypVRvHhx/P333+jXrx/y5MmDY8eO4e3btzh+/DicnZ1RrFgxGBkZKcUIEWUtFhZERHrin3/+wYgRI/D8+XMsWLAgx3b7YR5yltu3b6Nr1654+/YtbGxsUKpUKaxbtw4FCxaEm5sb6tWrh/z582PSpEkoU6YM9u/frzGW4n2rchNR5uMzjYhIT+SUGbH+C/OQs5QoUQJr166Fg4MDjI2N0atXL9y5cwcrVqwAkLyGRf/+/aFSqRAYGKgM3FZjUUH06bDFgohIz+SEGbHSg3nIWW7evIkhQ4YgKSkJfn5+8Pb2BpA8JfHevXtx584dBAcH4+eff1YWziSiT4uFBREREemFf/75B4MHDwYATJgwAbVr105zP/WAfiL6tFhYEBERkd5QD+AHgEmTJnEAP1E2wo6HREREpDdKliyJxYsXw9jYGMOGDcPFixd1HRIR/T8WFkRERKRX1AP4a9euDTc3N12HQ0T/j12hiIiISK9xSlmi7IGFBRERERERaY3lPRERERERaY2FBRERERERaY2FBRERERERaY2FBRERERERaY2FBRERERERaY2FBRERERERaY2FBRERZam6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\n" + }, + "metadata": {} + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "df_fill = df[df['CSVFile'] == 'FillShortString']\n", + "df_fill['durationinseconds'] = pd.to_numeric(df_fill['durationinseconds'], errors='coerce')\n", + "rename_map = {\n", + " \"UnorderedDictionaryEncodedString\": \"UnDict\",\n", + " \"OrderedDictionaryEncodedString\": \"OrdDict\"\n", + "}\n", + "df_fill['Stringtype'] = df_fill['Stringtype'].replace(rename_map)\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "ax.bar(df_fill['Stringtype'], df_fill['durationinseconds'], color='red')\n", + "\n", + "ax.set_title(f\"Short String Fill\")\n", + "ax.set_xlabel(\"Stringtype\")\n", + "ax.set_ylabel(\"Duration (seconds)\")\n", + "\n", + "plt.xticks(rotation=45)\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt\n", + "df_fill = df[(df['CSVFile'] == 'FillLongString') & (~df['Stringtype'].isin(['FixedStr16', 'FixedStr32', 'FixedStr64']))]\n", + "df_fill['durationinseconds'] = pd.to_numeric(df_fill['durationinseconds'], errors='coerce')\n", + "rename_map = {\n", + " \"UnorderedDictionaryEncodedString\": \"UnDict\",\n", + " \"OrderedDictionaryEncodedString\": \"OrdDict\"\n", + "}\n", + "df_fill['Stringtype'] = df_fill['Stringtype'].replace(rename_map)\n", + "\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "ax.bar(df_fill['Stringtype'], df_fill['durationinseconds'], color='red')\n", + "\n", + "ax.set_title(f\"Long String Fill\")\n", + "ax.set_xlabel(\"Stringtype\")\n", + "ax.set_ylabel(\"Duration (seconds)\")\n", + "\n", + "plt.xticks(rotation=45)\n", + "plt.tight_layout()\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 757 + }, + "id": "ARd6BEN3Lq-3", + "outputId": "572f6dd5-26b0-4d54-d953-ac53e1f7e019" + }, + "id": "ARd6BEN3Lq-3", + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":3: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_fill['durationinseconds'] = pd.to_numeric(df_fill['durationinseconds'], errors='coerce')\n", + ":8: FutureWarning: The behavior of Series.replace (and DataFrame.replace) with CategoricalDtype is deprecated. In a future version, replace will only be used for cases that preserve the categories. To change the categories, use ser.cat.rename_categories instead.\n", + " df_fill['Stringtype'] = df_fill['Stringtype'].replace(rename_map)\n", + ":8: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df_fill['Stringtype'] = df_fill['Stringtype'].replace(rename_map)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAffJJREFUeJzt3XdYFFfbBvB7FwRsgIiCGBTsBRVsiN1IRE2MLSpq7CV2EWPBWKMJxkqMGBO7scYSTTQSETU2rIhdjIpdsAKKUvf5/uBjXldQWRdYgft3XXvFnTkz+8xhMjvPnjnnqEREQEREREREpAe1oQMgIiIiIqKcj4kFERERERHpjYkFERERERHpjYkFERERERHpjYkFERERERHpjYkFERERERHpjYkFERERERHpjYkFERERERHpjYkFERERERHpjYkFERHlKjdu3IBKpcLKlSsNHUq6VCoVpk6dqrxfuXIlVCoVbty4oSxr2rQpmjZtmu2xERHpg4kFEVEOlnpTevLkSUOHopPnz59jypQpcHJyQsGCBVG0aFE4Oztj5MiRuHfvnlLu77//1roJ/9Dt378fKpUq3Zenp6ehwyMiylLGhg6AiIjylsTERDRu3BiXL19Gr169MHz4cDx//hwXLlzAunXr0L59e9jZ2QFISSz8/f11Si5Kly6Nly9fIl++fFl0BO82YsQI1KlTR2uZg4MDAODly5cwNubXLxHlPryyERFRttq2bRtOnz6NtWvXolu3blrr4uLikJCQ8F77TUpKgkajgYmJCczMzDIj1PfWqFEjfPHFF+muM3RsRERZhY9CERHlAadPn0arVq1gbm6OQoUKoXnz5jh69KhWmdTHqg4fPgxvb28UK1YMBQsWRPv27fHw4UOtshqNBlOnToWdnR0KFCiAZs2a4eLFi3BwcEDv3r3fGsu1a9cAAA0aNEizzszMDObm5gCA3r17w9/fHwC0HikC/tePYs6cOfDz80PZsmVhamqKixcvptvHonfv3ihUqBDu3r2Ldu3aoVChQihWrBi+/vprJCcna8Xw+PFj9OjRA+bm5rC0tESvXr1w5syZTOu38XofCyKi3IItFkREudyFCxfQqFEjmJubY+zYsciXLx9++eUXNG3aFP/++y9cXV21yg8fPhxFihTBlClTcOPGDfj5+WHYsGHYuHGjUsbHxwezZs1CmzZt4OHhgTNnzsDDwwNxcXHvjKd06dIAgNWrV2PixIlKsvC6r776Cvfu3UNgYCB+++23dMusWLECcXFxGDhwIExNTWFlZQWNRpNu2eTkZHh4eMDV1RVz5szBnj17MHfuXJQtWxaDBw8GkJIwtWnTBsePH8fgwYNRqVIlbN++Hb169Xrncb3q2bNnePTokdYyKysrqNX8PY+Ici8mFkREudzEiRORmJiIQ4cOoUyZMgCAnj17omLFihg7diz+/fdfrfJFixbF7t27lRt+jUaDBQsWIDo6GhYWFoiMjMS8efPQrl07/PHHH8p206ZNy9Av8e3atUPFihUxefJkLFu2DM2aNUOjRo3w2WefoXjx4ko5Nzc3VKhQAYGBgfjyyy/T3dedO3dw9epVFCtWTFn26uhKr4qLi0OXLl0wadIkAMCgQYNQs2ZNLFu2TEkstm3bhuDgYPj5+WHkyJEAgMGDB+OTTz5553G9qm/fvmmWhYeHK/0siIhyI/50QkSUiyUnJ2P37t1o166dklQAQIkSJdCtWzccOnQIMTExWtsMHDhQqxWhUaNGSE5Oxs2bNwEAQUFBSEpKwpAhQ7S2Gz58eIZiyp8/P44dO4YxY8YASHkEq1+/fihRogSGDx+O+Pj4DB9fx44dtZKKdxk0aJDW+0aNGuH69evK+4CAAOTLlw8DBgxQlqnVagwdOjTDnwEAkydPRmBgoNbL1tZWp30QEeU0bLEgIsrFHj58iBcvXqBixYpp1lWuXBkajQa3b99G1apVleWlSpXSKlekSBEAwNOnTwFASTDKlSunVc7Kykop+y4WFhaYNWsWZs2ahZs3byIoKAhz5szBwoULYWFhgRkzZmRoP46OjhkqB6T033g9CSlSpIhyXEDKsZUoUQIFChTQKvf6sb5LtWrV4O7urtM2REQ5HVssiIhIi5GRUbrLRSRLPq906dLo27cvDh8+DEtLS6xduzbD2+bPnz/DZd90XERElDmYWBAR5WLFihVDgQIFEBYWlmbd5cuXoVarYW9vr9M+UztfX716VWv548ePtX7911WRIkVQtmxZ3L9/X1n2po7dWaV06dK4f/8+Xrx4obX89WMlIqK0mFgQEeViRkZGaNGiBbZv367VqTkyMhLr1q1Dw4YNleFdM6p58+YwNjbGzz//rLV84cKFGdr+zJkzaUZMAlIeQ7p48aLWY1sFCxYEAERFRekU4/vy8PBAYmIilixZoizTaDTKsLdERPRm7GNBRJQLLF++HAEBAWmWjxw5EjNmzEBgYCAaNmyIIUOGwNjYGL/88gvi4+Mxa9YsnT/LxsYGI0eOxNy5c/H555+jZcuWOHPmDHbt2gVra+t3tjIEBgZiypQp+Pzzz1GvXj0UKlQI169fx/LlyxEfH681slStWrUApMxk7eHhASMjI3h6euocc0a1a9cOdevWxejRo3H16lVUqlQJf/75J548eQIg+1tQiIhyEiYWRES5wOutB6l69+6NqlWr4uDBg/Dx8YGvry80Gg1cXV2xZs2aNHNYZNQPP/yAAgUKYMmSJdizZw/c3Nywe/duNGzY8J0zS3fs2BHPnj3D7t27sXfvXjx58gRFihRRbuibNWumlO3QoQOGDx+ODRs2YM2aNRCRLE0sjIyMsHPnTowcORKrVq2CWq1G+/btMWXKFDRo0ICzZhMRvYVKsqo3HhER5SlRUVEoUqQIZsyYgW+++cbQ4WSqbdu2oX379jh06FC6M4YTERH7WBAR0Xt4+fJlmmV+fn4AgKZNm2ZvMJns9WNLTk7GTz/9BHNzc9SsWdNAURERffj4KBQREels48aNWLlyJVq3bo1ChQrh0KFDWL9+PVq0aJHjf9EfPnw4Xr58CTc3N8THx2Pr1q04cuQIvv/+e52GtyUiymuYWBARkc6qV68OY2NjzJo1CzExMUqH7oxObPch+/jjjzF37lzs2LEDcXFxKFeuHH766ScMGzbM0KEREX3Q2MeCiIiIiIj0xj4WRERERESkNyYWRERERESkN/axeE8ajQb37t1D4cKFOWESEREREeVKIoJnz57Bzs4OavXb2ySYWLyne/fuwd7e3tBhEBERERFludu3b+Ojjz56axkmFu+pcOHCAFIq2dzc3MDREBERERFlvpiYGNjb2yv3vm/DxOI9pT7+ZG5uzsSCiIiIiHK1jDz6z87bRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkNyYWRERERESkN2NDB0BE9E4qlaEjyDlEDB0BERHlUWyxICIiIiIivX0QiYW/vz8cHBxgZmYG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tRAUFKQs02g0CAoKgpubm977X7FiBYoXL45PP/30nWVDQ0MBACVKlHhjGVNTU5ibm2u9iIiIiIgohUEfhfL29kavXr1Qu3Zt1K1bF35+foiNjUWfPn0AAD179kTJkiXh6+sLIKUz9sWLF5V/3717F6GhoShUqBDKlSun7Fej0WDFihXo1asXjI21D/HatWtYt24dWrdujaJFi+Ls2bMYNWoUGjdujOrVq2fTkRMRERER5S4GTSy6dOmChw8fYvLkyYiIiICzszMCAgKUDt23bt2CWv2/RpV79+7BxcVFeT9nzhzMmTMHTZo0wf79+5Xle/bswa1bt9C3b980n2liYoI9e/YoSYy9vT06duyIiRMnZt2BEhERERHlcioREUMHkRPFxMTAwsIC0dHRfCyKKKu9Nlw0vQUv6URElIl0uec16AR5RERERESUOzCxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivRk8sfD394eDgwPMzMzg6uqK48ePv7HshQsX0LFjRzg4OEClUsHPzy9NmalTp0KlUmm9KlWqpFUmLi4OQ4cORdGiRVGoUCF07NgRkZGRmX1oRERERER5hkETi40bN8Lb2xtTpkxBSEgIatSoAQ8PDzx48CDd8i9evECZMmUwc+ZM2NravnG/VatWxf3795XXoUOHtNaPGjUKf/31FzZt2oR///0X9+7dQ4cOHTL12IiIiIiI8hKDJhbz5s3DgAED0KdPH1SpUgWLFy9GgQIFsHz58nTL16lTB7Nnz4anpydMTU3fuF9jY2PY2toqL2tra2VddHQ0li1bhnnz5uHjjz9GrVq1sGLFChw5cgRHjx7N9GMkIiIiIsoLDJZYJCQk4NSpU3B3d/9fMGo13N3dERwcrNe+//vvP9jZ2aFMmTLo3r07bt26paw7deoUEhMTtT63UqVKKFWq1Fs/Nz4+HjExMVovIiIiIiJKYbDE4tGjR0hOToaNjY3WchsbG0RERLz3fl1dXbFy5UoEBATg559/Rnh4OBo1aoRnz54BACIiImBiYgJLS0udPtfX1xcWFhbKy97e/r1jJCIiIiLKbQzeeTuztWrVCp06dUL16tXh4eGBv//+G1FRUfj999/12q+Pjw+io6OV1+3btzMpYiIiIiKinM/YUB9sbW0NIyOjNKMxRUZGvrVjtq4sLS1RoUIFXL16FQBga2uLhIQEREVFabVavOtzTU1N39qvg4iIiIgoLzNYi4WJiQlq1aqFoKAgZZlGo0FQUBDc3Nwy7XOeP3+Oa9euoUSJEgCAWrVqIV++fFqfGxYWhlu3bmXq5xIRERER5SV6tVjEx8fr9Su+t7c3evXqhdq1a6Nu3brw8/NDbGws+vTpAwDo2bMnSpYsCV9fXwApHb4vXryo/Pvu3bsIDQ1FoUKFUK5cOQDA119/jTZt2qB06dK4d+8epkyZAiMjI3Tt2hUAYGFhgX79+sHb2xtWVlYwNzfH8OHD4ebmhnr16ulTHUREREREeZZOicWuXbuwYcMGHDx4ELdv34ZGo0HBggXh4uKCFi1aoE+fPrCzs8vw/rp06YKHDx9i8uTJiIiIgLOzMwICApQO3bdu3YJa/b9GlXv37sHFxUV5P2fOHMyZMwdNmjTB/v37AQB37txB165d8fjxYxQrVgwNGzbE0aNHUaxYMWW7+fPnQ61Wo2PHjoiPj4eHhwcWLVqkS1UQEREREdErVCIi7yr0xx9/YNy4cXj27Blat26NunXrws7ODvnz58eTJ09w/vx5HDx4EMHBwejduzemT5+udSOfG8XExMDCwgLR0dEwNzc3dDhEuZtKZegIco53X9KJiIgyTJd73gwlFm5ubpg4cSJatWql1YLwurt37+Knn36CjY0NRo0apXvkOQgTC6JsxMQi45hYEBFRJsr0xILSYmJBlI2YWGQcL+lERJSJdLnn1XtUqOTkZISGhuLp06f67oqIiIiIiHIonRMLLy8vLFu2DEBKUtGkSRPUrFkT9vb2SgdqIiIiIiLKW3ROLDZv3owaNWoAAP766y+Eh4fj8uXLGDVqFL755ptMD5CIiIiIiD58OicWjx49Umao/vvvv9GpUydUqFABffv2xblz5zI9QCIiIiIi+vDpnFjY2Njg4sWLSE5ORkBAAD755BMAwIsXL2BkZJTpARIRERER0YdP55m3+/Tpg86dO6NEiRJQqVRwd3cHABw7dgyVKlXK9ACJiIiIiOjDp3NiMXXqVDg5OeH27dvo1KkTTE1NAQBGRkYYP358pgdIREREREQfPs5j8Z44jwVRNuI8FhnHSzoREWUiXe55M9RisWDBggx/+IgRIzJcloiIiIiIcocMtVg4OjpqvX/48CFevHgBS0tLAEBUVBQKFCiA4sWL4/r161kS6IeGLRZE2YgtFhnHFgsiIspEmT7zdnh4uPL67rvv4OzsjEuXLuHJkyd48uQJLl26hJo1a2L69OmZcgBERERERJSz6NzHomzZsti8eTNcXFy0lp86dQpffPEFwsPDMzXADxVbLIiyEVssMo4tFkRElIkyvcXiVffv30dSUlKa5cnJyYiMjNR1d0RERERElAvonFg0b94cX331FUJCQpRlp06dwuDBg5U5LYiIiIiIKG/RObFYvnw5bG1tUbt2bZiamsLU1BR169aFjY0Nli5dmhUxEhERERHRB07nCfKKFSuGv//+G1euXMHly5cBAJUqVUKFChUyPTgiIiIiIsoZdE4sUlWoUIHJBBERERERAXiPxCI5ORkrV65EUFAQHjx4AI1Go7V+7969mRYcERERERHlDDonFiNHjsTKlSvx6aefwsnJCSoOA0lERERElOfpnFhs2LABv//+O1q3bp0V8RARERERUQ6k86hQJiYmKFeuXFbEQkREREREOZTOicXo0aPx448/QscJu4mIiIiIKBfT+VGoQ4cOYd++fdi1axeqVq2KfPnyaa3funVrpgVHREREREQ5g86JhaWlJdq3b58VsRARERERUQ6lc2KxYsWKrIiDiIiIiIhysPeeIO/hw4cICwsDAFSsWBHFihXLtKCIiIiIiChn0bnzdmxsLPr27YsSJUqgcePGaNy4Mezs7NCvXz+8ePEiK2IkIiIiIqIPnM6Jhbe3N/7991/89ddfiIqKQlRUFLZv345///0Xo0eP1jkAf39/ODg4wMzMDK6urjh+/Pgby164cAEdO3aEg4MDVCoV/Pz80pTx9fVFnTp1ULhwYRQvXhzt2rVTWlZSNW3aFCqVSus1aNAgnWMnIiIiIqIUOicWW7ZswbJly9CqVSuYm5vD3NwcrVu3xpIlS7B582ad9rVx40Z4e3tjypQpCAkJQY0aNeDh4YEHDx6kW/7FixcoU6YMZs6cCVtb23TL/Pvvvxg6dCiOHj2KwMBAJCYmokWLFoiNjdUqN2DAANy/f195zZo1S6fYiYiIiIjof3TuY/HixQvY2NikWV68eHGdH4WaN28eBgwYgD59+gAAFi9ejJ07d2L58uUYP358mvJ16tRBnTp1ACDd9QAQEBCg9X7lypUoXrw4Tp06hcaNGyvLCxQo8MbkhIiIiIiIdKNzi4WbmxumTJmCuLg4ZdnLly8xbdo0uLm5ZXg/CQkJOHXqFNzd3f8XjFoNd3d3BAcH6xrWG0VHRwMArKystJavXbsW1tbWcHJygo+PzzuTovj4eMTExGi9iIiIiIgohc4tFj/++CM8PDzw0UcfoUaNGgCAM2fOwMzMDP/880+G9/Po0SMkJyenaf2wsbHB5cuXdQ0rXRqNBl5eXmjQoAGcnJyU5d26dUPp0qVhZ2eHs2fPYty4cQgLC3vr5H6+vr6YNm1apsRFRERERJTb6JxYODk54b///sPatWuVBKBr167o3r078ufPn+kB6mPo0KE4f/48Dh06pLV84MCByr+rVauGEiVKoHnz5rh27RrKli2b7r58fHzg7e2tvI+JiYG9vX3WBE5ERERElMO81zwWBQoUwIABA/T6YGtraxgZGSEyMlJreWRkZKb0fRg2bBh27NiBAwcO4KOPPnprWVdXVwDA1atX35hYmJqawtTUVO+4iIiIiIhyI537WPj6+mL58uVpli9fvhw//PBDhvdjYmKCWrVqISgoSFmm0WgQFBSkU1+N14kIhg0bhj/++AN79+6Fo6PjO7cJDQ0FAJQoUeK9P5eIiIiIKC/TObH45ZdfUKlSpTTLq1atisWLF+u0L29vbyxZsgSrVq3CpUuXMHjwYMTGxiqjRPXs2RM+Pj5K+YSEBISGhiI0NBQJCQm4e/cuQkNDcfXqVaXM0KFDsWbNGqxbtw6FCxdGREQEIiIi8PLlSwDAtWvXMH36dJw6dQo3btzAn3/+iZ49e6Jx48aoXr26rtVBREREREQAVCIiumxgZmaGS5cupWkJuH79OqpUqaI1WlRGLFy4ELNnz0ZERAScnZ2xYMEC5dGkpk2bwsHBAStXrgQA3LhxI90WiCZNmmD//v0pB6RSpfs5K1asQO/evXH79m18+eWXOH/+PGJjY2Fvb4/27dtj4sSJMDc3z3DcMTExsLCwQHR0tE7bEdF7eMP/15QO3S7pREREb6XLPa/OfSzs7e1x+PDhNDf4hw8fhp2dna67w7BhwzBs2LB016UmC6kcHBzwrjzoXevt7e3x77//6hTjB4s3WxnHmy0iIiKiLKVzYjFgwAB4eXkhMTERH3/8MQAgKCgIY8eOxejRozM9QCIiIiIi+vDpnFiMGTMGjx8/xpAhQ5CQkAAg5fGocePGafWHICIiIiKivEPnPhapnj9/jkuXLiF//vwoX758nhuK9YPoY8FHoTKOj0LlbDzXM47nOhERZSJd7nl1HhUqVUREBJ48eYKyZcvC1NT0nX0biIiIiIgo99I5sXj8+DGaN2+OChUqoHXr1rh//z4AoF+/fuxjQURERESUR+mcWIwaNQr58uXDrVu3UKBAAWV5ly5dEBAQkKnBERERERFRzqBz5+3du3fjn3/+wUcffaS1vHz58rh582amBUZERERERDmHzi0WsbGxWi0VqZ48eZLnOnATEREREVEKnROLRo0aYfXq1cp7lUoFjUaDWbNmoVmzZpkaHBERERER5Qw6Pwo1a9YsNG/eHCdPnkRCQgLGjh2LCxcu4MmTJzh8+HBWxEhERERERB84nVssnJyccOXKFTRs2BBt27ZFbGwsOnTogNOnT6Ns2bJZESMREREREX3g3nuCvLyOE+TlMDzNczae6xnHc52IiDJRlk6QFxAQgEOHDinv/f394ezsjG7duuHp06e6R0tERERERDmezonFmDFjEBMTAwA4d+4cvL290bp1a4SHh8Pb2zvTAyQiIiIiog+fzp23w8PDUaVKFQDAli1b0KZNG3z//fcICQlB69atMz1AIiIiIiL68OncYmFiYoIXL14AAPbs2YMWLVoAAKysrJSWDCIiIiIiylt0brFo2LAhvL290aBBAxw/fhwbN24EAFy5ciXNbNxERERERJQ36NxisXDhQhgbG2Pz5s34+eefUbJkSQDArl270LJly0wPkIiIiIiIPnwcbvY9cbjZHIanec7Gcz3jeK4TEVEmyvThZmNjY3UKQNfyRERERESUs2UosShXrhxmzpyJ+/fvv7GMiCAwMBCtWrXCggULMi1AIiIiIiL68GWo8/b+/fsxYcIETJ06FTVq1EDt2rVhZ2cH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R48yLzIiIiIiIsoxdO5jUa9ePRw6dAiVK1dG69atMXr0aJw7dw5bt25FvXr1siJGIiIiIiL6wOmcWMybNw/Pnz8HAEybNg3Pnz/Hxo0bUb58eY4IRURERESUR+mUWCQnJ+POnTuoXr06gJTHojjbNhERERER6dTHwsjICC1atMDTp0+zKh4iIiIiIsqBdO687eTkhOvXr2dFLERERERElEPpnFjMmDEDX3/9NXbs2IH79+8jJiZG60VERERERHmPSkRElw3U6v/lIiqVSvm3iEClUiE5OTnzovuAxcTEwMLCAtHR0TA3NzdMEK/UP72Dbqf5m7HOMy6z6hxgvesiM+udDIPne8bxfCfKcrrc8+o8KtS+ffveOzAiIiIiIsqddH4UqkmTJm99vQ9/f384ODjAzMwMrq6uOH78+FvLb9q0CZUqVYKZmRmqVauGv//+W2u9SqVK9zV79myljIODQ5r1M2fOfK/4iYiIiIjyOp1bLA4cOPDW9Y0bN9Zpfxs3boS3tzcWL14MV1dX+Pn5wcPDA2FhYShevHia8keOHEHXrl3h6+uLzz77DOvWrUO7du0QEhICJycnAMD9+/e1ttm1axf69euHjh07ai3/9ttvMWDAAOV94cKFdYqdiIiIiIhS6NXHQtnJK8+D6trHwtXVFXXq1MHChQsBABqNBvb29hg+fDjGjx+fpnyXLl0QGxuLHTt2KMvq1asHZ2fnN86p0a5dOzx79gxBQUHKMgcHB3h5ecHLy0uneFOxj0UOwz4W2Y99LAyDz5znfDzfM47nO1GW0+WeV+dHoZ4+far1evDgAQICAlCnTh3s3r1bp30lJCTg1KlTcHd3/19AajXc3d0RHByc7jbBwcFa5QHAw8PjjeUjIyOxc+dO9OvXL826mTNnomjRonBxccHs2bORlJSkU/xERERERJRC50ehLCws0iz75JNPYGJiAm9vb5w6dSrD+3r06BGSk5NhY2OjtdzGxgaXL19Od5uIiIh0y0dERKRbftWqVShcuDA6dOigtXzEiBGoWbMmrKyscOTIEfj4+OD+/fuYN29euvuJj49HfHy88p5D6xIRERER/Y/OicWb2NjYICwsLLN2l2mWL1+O7t27w8zMTGu5t7e38u/q1avDxMQEX331FXx9fWFqappmP76+vpg2bVqWx0tERERElBPpnFicPXtW672I4P79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U3Hy5EkMGzYMAPD8+XOMGTMGR48exY0bNxAUFIS2bduiXLly8PDwAABUrlwZLVu2xIABA3D8+HEcPnwYw4YNg6enZ4ZGhCIiIiIiIm0G72PRpUsXPHz4EJMnT0ZERAScnZ0REBCgdNC+desW1Or/5T/169fHunXrMHHiREyYMAHly5fHtm3b4OTkBAAwMjLC2bNnsWrVKkRFRcHOzg4tWrTA9OnTYWpqquxn7dq1GDZsGJo3bw61Wo2OHTtiwYIF2XvwRERERES5hMHnscipOI9FDsN5LLIfx/U3DNa7YbDeDYO3MDkbz/WM4zwWRERERESUVzCxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivTGxICIiIiIivRl8HgsiIiIig+KwpxnHIX7pLdhiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREemNiQUREREREevsgEgt/f384ODjAzMwMrq6uOH78+FvLb9q0CZUqVYKZmRmqVauGv//+W1mXmJiIcePGoVq1aihYsCDs7OzQs2dP3Lt3T2sfDg4OUKlUWq+ZM2dmyfEREREREeV2Bk8sNm7cCG9vb0yZMgUhISGoUaMGPDw88ODBg3TLHzlyBF27dkW/fv1w+vRptGvXDu3atcP58+cBAC9evEBISAgmTZqEkJAQbN26FWFhYfj888/T7Ovbb7/F/fv3ldfw4cOz9FiJiIiIiHIrlYiIIQNwdXVFnTp1sHDhQgCARqOBvb09hg8fjvHjx6cp36VLF8TGxmLHjh3Ksnr16sHZ2RmLFy9O9zNOnDiBunXr4ubNmyhVqhSAlBYLLy8veHl5vVfcMTExsLCwQHR0NMzNzd9rH3pTqQzzuTlRZp3mrPOMy8xLC+s941jvhsF6Nwxe27Mfz3XDMODtui73vAZtsUhISMCpU6fg7u6uLFOr1XB3d0dwcHC62wQHB2uVBwAPD483lgeA6OhoqFQqWFpaai2fOXMmihYtChcXF8yePRtJSUlv3Ed8fDxiYmK0XkRERERElMLYkB/+6NEjJCcnw8bGRmu5jY0NLl++nO42ERER6ZaPiIhIt3xcXBzGjRuHrl27amVZI0aMQM2aNWFlZYUjR47Ax8cH9+/fx7x589Ldj6+vL6ZNm6bL4RERERER5RkGTSyyWmJiIjp37gwRwc8//6y1ztvbW/l39erVYWJigq+++gq+vr4wNTVNsy8fHx+tbWJiYmBvb591wRMRERER5SAGTSysra1hZGSEyMhIreWRkZGwtbVNdxtbW9sMlU9NKm7evIm9e/e+85kwV1dXJCUl4caNG6hYsWKa9aampukmHEREREREZOA+FiYmJqhVqxaCgoKUZRqNBkFBQXBzc0t3Gzc3N63yABAYGKhVPjWp+O+//7Bnzx4ULVr0nbGEhoZCrVajePHi73k0RERERER5l8EfhfL29kavXr1Qu3Zt1K1bF35+foiNjUWfPn0AAD179kTJkiXh6+sLABg5ciSaNGmCuXPn4tNPP8WGDRtw8uRJ/PrrrwBSkoovvvgCISEh2LFjB5KTk5X+F1ZWVjAxMUFwcDCOHTuGZs2aoXDhwggODsaoUaPw5ZdfokiRIoapCCIiIiKiHMzgiUWXLl3w8OFDTJ48GREREXB2dkZAQIDSQfvWrVtQq//XsFK/fn2sW7cOEydOxIQJE1C+fHls27YNTk5OAIC7d+/izz//BAA4Oztrfda+ffvQtGlTmJqaYsOGDZg6dSri4+Ph6OiIUaNGafWhICIiIiKijDP4PBY5FeexyGE41nn241jnhsF6NwzWu2Hw2p79eK4bBuexICIiIiKivIKJBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6Y2JBRERERER6e2D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\n" + }, + "metadata": {} + } + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + }, + "colab": { + "provenance": [] + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/experiments/experiments.sh b/experiments/experiments.sh new file mode 100755 index 000000000..b3ba42153 --- /dev/null +++ b/experiments/experiments.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# Copyright 2021 The DAPHNE Consortium +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script builds and runs the test cases for the DAPHNE prototype. +# +# Arguments to this script are forwarded to the test-case executable, i.e., all +# arguments to the catch2 main-function can be used. Invoke `./test.sh -h` or +# see https://github.com/catchorg/Catch2/blob/v2.x/docs/command-line.md for a +# reference. +# +# Invoke this script in the root directory "prototype". + +# Stop immediately if any command fails. +set -e + +catch2_options="" +BUILD_CUDA="" +BUILD_FPGAOPENCL="" +BUILD_MPI="" +BUILD_PAPI="" +BUILD_DEBUG="" +BUILD_DAPHNE=1 + +while [[ $# -gt 0 ]]; do + key=$1 + shift + case $key in + --cuda) + echo using CUDA + export BUILD_CUDA="--cuda" + ;; + --fpgaopencl) + echo using FPGAOPENCL + export BUILD_FPGAOPENCL="--fpgaopencl" + ;; + --mpi) + echo using MPI + export BUILD_MPI="--mpi" + ;; + --no-papi) + echo not using PAPI + export BUILD_PAPI="--no-papi" + ;; + --debug) + echo building DEBUG version + export BUILD_DEBUG="--debug" + ;; + -nb | --no-build) + BUILD_DAPHNE=0 + ;; + *) + catch2_options="${catch2_options} ${key}" + ;; + esac +done + +# Build tests. +if [ $BUILD_DAPHNE -gt 0 ]; then + ./build.sh $BUILD_CUDA $BUILD_FPGAOPENCL $BUILD_MPI $BUILD_PAPI $BUILD_DEBUG --target run_tests +fi + +# Preparations for running DaphneLib (Python API) tests and MLIR codegen tests (LLVM LIT) +export PYTHONPATH="$PYTHONPATH:$PWD/src/api/python/:/usr/lib/llvm-10/build/utils/lit/:/usr/lib/llvm-18/build/utils/lit/" +export DAPHNELIB_DIR_PATH=$PWD/lib +export PATH=$PWD/bin:/usr/lib/llvm-10/bin:/usr/lib/llvm-18/bin:$PATH +export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH + +# Silence TensorFlow warnings in DaphneLib test cases. +export TF_CPP_MIN_LOG_LEVEL=3 + +# this speeds up the vectorized tests +export OPENBLAS_NUM_THREADS=1 + +# Find out if TensorFlow and PyTorch are available in Python and set environment +# variables accordingly. Used to switch the DaphneLib test cases for data transfer +# with these libraries on/off. +# As an alternative to environment variables, we could use a custom catch2 main +# function with custom CLI arguments, but that seems to be more complicated. +if python3 -c "import tensorflow" 2> /dev/null; then + export DAPHNE_DEP_AVAIL_TENSFORFLOW=1 +else + export DAPHNE_DEP_AVAIL_TENSFORFLOW=0 +fi +if python3 -c "import torch" 2> /dev/null; then + export DAPHNE_DEP_AVAIL_PYTORCH=1 +else + export DAPHNE_DEP_AVAIL_PYTORCH=0 +fi + +# Run tests. +# shellcheck disable=SC2086 +#./bin/run_tests $catch2_options +./bin/run_tests --reporter xml --out results.xml $catch2_options + +set +e \ No newline at end of file diff --git a/experiments/gen_dataset.ipynb b/experiments/gen_dataset.ipynb new file mode 100644 index 000000000..cb41ab9b8 --- /dev/null +++ b/experiments/gen_dataset.ipynb @@ -0,0 +1,303 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "id": "103d7e43-0b02-4f93-a541-485c1a4d6c28", + "metadata": {}, + "outputs": [], + "source": [ + "import argparse\n", + "import csv\n", + "import numpy as np\n", + "import random\n", + "import string\n", + "import sys\n", + "\n", + "### Helper functions ###\n", + "def generate_random_string(length, allowed_chars):\n", + " return ''.join(random.choices(allowed_chars, k=length))\n", + "\n", + "\n", + "def generate_lengths(num_samples, mean_length, std_length, distribution,\n", + " allow_zero=False, min_length=1, max_length=100):\n", + " if distribution == \"normal\":\n", + " lengths = np.random.normal(mean_length, std_length, num_samples)\n", + " elif distribution == \"uniform\":\n", + " lengths = np.random.uniform(min_length, max_length, num_samples)\n", + " elif distribution == \"skewed\":\n", + " # Log Normal distribution\n", + " sigma = std_length / mean_length\n", + " mu = np.log(mean_length) + sigma**2\n", + " lengths = np.random.lognormal(mean=mu, sigma=sigma, size=num_samples)\n", + " else:\n", + " raise ValueError(f\"Unknown distribution type: {distribution}\")\n", + "\n", + "\n", + " # Round to the nearest integer.\n", + " lengths = np.rint(lengths).astype(int)\n", + "\n", + " # Ensure lengths are at least min_length if allow_zero is False.\n", + " if not allow_zero:\n", + " lengths = np.maximum(lengths, min_length)\n", + "\n", + " # Clamp the lengths between min_length and max_length.\n", + " lengths = np.clip(lengths, min_length, max_length)\n", + " return lengths.tolist()\n", + "\n", + "\n", + "def generate_dataset(num_rows, num_cols, mean_length, std_length,\n", + " duplicate_factor=0.0, distribution=\"normal\",\n", + " allowed_chars=string.ascii_letters + string.digits,\n", + " seed=None, min_length=1, max_length=100):\n", + " if seed is not None:\n", + " np.random.seed(seed)\n", + " random.seed(seed)\n", + "\n", + " # Determine the number of unique rows.\n", + " unique_count = max(1, int(num_rows * (1 - duplicate_factor)))\n", + " duplicate_count = num_rows - unique_count\n", + "\n", + " unique_rows = []\n", + "\n", + " # Generate unique rows.\n", + " for _ in range(unique_count):\n", + " # For each cell in the row, generate a length then a random string.\n", + " lengths = generate_lengths(\n", + " num_cols, mean_length, std_length,\n", + " distribution,allow_zero=False, min_length=min_length, \n", + " max_length=max_length\n", + " )\n", + " row = [generate_random_string(length, allowed_chars) for length in lengths]\n", + " unique_rows.append(row)\n", + "\n", + " # For duplicate rows, randomly sample from the unique rows.\n", + " duplicate_rows = [random.choice(unique_rows) for _ in range(duplicate_count)]\n", + "\n", + " # Combine and shuffle so that duplicates are not all grouped.\n", + " all_rows = unique_rows + duplicate_rows\n", + " random.shuffle(all_rows)\n", + " return all_rows\n", + "\n", + "\n", + "def write_csv(filename, dataset, delimiter=\",\"):\n", + " with open(filename, \"w\", newline=\"\") as csvfile:\n", + " writer = csv.writer(csvfile, delimiter=delimiter)\n", + " for row in dataset:\n", + " writer.writerow(row)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6305c138-4239-449a-ab58-65719bc49d7a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_5_std_3_dup_3_dist_uniform_seed_1_min_1_max_10.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_500_std_3_dup_3_dist_uniform_seed_1_min_1_max_1000.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_5_std_3_dup_3_dist_uniform_seed_3_min_1_max_10.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_500_std_3_dup_3_dist_uniform_seed_3_min_1_max_1000.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_5_std_3_dup_50_dist_uniform_seed_1_min_1_max_10.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_500_std_3_dup_50_dist_uniform_seed_1_min_1_max_1000.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_5_std_3_dup_50_dist_uniform_seed_3_min_1_max_10.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_500_std_3_dup_50_dist_uniform_seed_3_min_1_max_1000.csv\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "# Define parameter values\n", + "path = r\"\\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\" # Path to save dataset to (./experiments/datasets/)\n", + "rows = 1000000\n", + "cols = 5\n", + "stds = [3]\n", + "duplicate_factors = [0.03, 0.5]\n", + "distributions = [\"uniform\"]\n", + "seeds = [1, 3]\n", + "length_ranges = [[1, 5, 10], [1, 500, 1000]]\n", + "\n", + "# Ensure the output directory exists\n", + "os.makedirs(path, exist_ok=True)\n", + "\n", + "# Loop over every combination of parameters\n", + "for s in stds:\n", + " for dup in duplicate_factors:\n", + " for dist in distributions:\n", + " for seed in seeds:\n", + " for min_length, mean, max_length in length_ranges:\n", + " # Construct a unique filename for the current combination\n", + " std_str = str(s).replace('.', '_')\n", + " filename = (\n", + " f\"dataset_rows_{rows}_cols_{cols}_\"\n", + " f\"mean_{mean}_std_{std_str}_dup_{dup*100:.0f}_\"\n", + " f\"dist_{dist}_seed_{seed}_min_{min_length}_max_{max_length}.csv\"\n", + " )\n", + " output = os.path.join(path, filename)\n", + " \n", + " # Generate the dataset for the current combination\n", + " dataset = generate_dataset(\n", + " num_rows=rows,\n", + " num_cols=cols,\n", + " mean_length=mean,\n", + " std_length=s,\n", + " duplicate_factor=dup,\n", + " distribution=dist,\n", + " seed=seed,\n", + " min_length=min_length,\n", + " max_length=max_length\n", + " )\n", + " \n", + " # Write the dataset to CSV\n", + " write_csv(output, dataset)\n", + " print(f\"Dataset with {rows} rows and {cols} columns written to {output}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "77031f3e-f970-4e26-8a59-9ddd9febd366", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2QAAAIhCAYAAAAhCnmjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABog0lEQVR4nO3de1yUZf7/8fcIM5zEkUOAKOJhzTym6WZqpaZi5aFyy8rCTDNbTTO1zLU17KCpeWh1TWtNzUPalrqlLYmVlguaaVhaa4f1rIgHxAMKI1y/P/oyP0dAGURv0Nfz8eDxaK7rmvu+7ns+Q7y977nGZowxAgAAAABccRWsngAAAAAAXKsIZAAAAABgEQIZAAAAAFiEQAYAAAAAFiGQAQAAAIBFCGQAAAAAYBECGQAAAABYhEAGAAAAABYhkAEAAACARQhkQDk3d+5c2Ww294+/v7+ioqLUrl07jRs3Tunp6QWek5CQIJvN5tV+srKylJCQoDVr1nj1vML2VaNGDXXp0sWr7VzMokWLNHXq1EL7bDabEhISSnV/pe3zzz9X8+bNFRQUJJvNpuXLlxc5ds+ePRowYICuv/56BQQEKDQ0VI0aNVK/fv20Z88e97hPP/20RMdt5fmy2Wx6+umnLdl3ccyYMUNz584t0L5mzRrZbDZ9+OGHl23fvXv3Vo0aNUpte/v371dCQoJSU1ML3VfFihVLbV8Xs27dOj388MOqXr26/Pz8FBQUpAYNGmjYsGH673//e8XmcSWU9H1ZHG3btlXbtm0vOq5GjRru/2dUqFBBTqdT9erVU69evbRq1apLmkNR7xGrjB079oK/T4GygEAGXCXmzJmjlJQUJSUl6e9//7uaNGmi8ePHq169elq9erXH2CeeeEIpKSlebT8rK0tjxozxOpCVZF8lcaFAlpKSoieeeOKyz6GkjDHq0aOH7Ha7Pv74Y6WkpKhNmzaFjt27d69uuukmJSUlaejQofr000/17rvv6uGHH9bGjRv1v//9zz32008/1ZgxY7yeT1k/X1ay8o/Nv/71r1q2bFmpbW///v0aM2ZMoYHsSnrxxRd12223adeuXXrxxReVmJio5cuXq0+fPkpKSlK9evWUm5tr6RxLU0nfl6WtdevWSklJUXJysj766CM9/fTT2rFjhzp16qT7779fLperRNslkAHe87V6AgBKR8OGDdW8eXP34z/96U969tlndeutt6p79+765ZdfFBkZKUmqVq2aqlWrdlnnk5WVpcDAwCuyr4u55ZZbLN3/xezfv19Hjx7Vfffdp/bt219w7DvvvKPDhw/rm2++Uc2aNd3t9957r/7yl78oLy+vRHMwxujMmTMKCAgo8+frWlW7dm2rp1Dq3n//fb322mt66qmnNGPGDI+r6R07dtTQoUM1Y8YMC2d4cfm/68qbypUre7zXO3TooIEDByohIUFjxozRiy++qPHjx1s4Q+DawRUy4CpWvXp1TZo0SSdOnNCsWbPc7YXdRvjFF1+obdu2CgsLU0BAgKpXr64//elPysrK0s6dO3XddddJksaMGeO+1aV3794e29u8ebPuv/9+hYSEuP94vNDtkcuWLVPjxo3l7++vWrVq6W9/+5tHf/7tmDt37vRoz789LP9qXdu2bbVy5Urt2rXL4/bNfIXdgrd161bdc889CgkJkb+/v5o0aaJ58+YVup/3339fo0aNUnR0tCpVqqQOHTpo+/btRZ/4c6xbt07t27dXcHCwAgMD1apVK61cudLdn5CQ4A6sI0aMkM1mu+BtaUeOHFGFChUUERFRaH+FCr//Wu/du7f+/ve/u48//yf/XObfGjhz5kzVq1dPfn5+7uM//3zlvw5ffvml/vznPys8PFxhYWHq3r279u/f77H/7OxsDRs2TFFRUQoMDNTtt9+uTZs2qUaNGu56uVQ5OTl69dVXdcMNN8jPz0/XXXedHn/8cR06dMhjXP6tsYmJibrpppsUEBCgG264Qe+++26Bba5bt04tW7aUv7+/qlatqr/+9a/6xz/+4XHOatSooW3btmnt2rXu83n+a+VyuS5aK9999526dOmiiIgI+fn5KTo6Wp07d9bevXsveNyF3bKY/zrOnz9f9erVU2BgoG688UatWLHigttas2aN/vjHP0qSHn/8cffxnP8++fXXX3X33XerYsWKiomJ0bBhw5Sdne0xprivR2FeffVVhYeHa8qUKYX+nrDZbBo4cKB8fHw82levXq327durUqVKCgwMVOvWrfX55597jMn/3bNt2zY9/PDDcjqdioyMVJ8+fZSZmekx1hijGTNmqEmTJgoICFBISIjuv/9+jyvO0u+/axo2bKivvvpKrVq1UmBgoPr06SNJWrJkieLi4lSlShUFBASoXr16euGFF3Tq1Cn38y/2vizuPIwxmjBhgmJjY+Xv76+bbrpJ//73vy96vosjISFBDRo00PTp03XmzBl3+5gxY9SiRQuFhoaqUqVKuummmzR79mwZY9xjLvQeOXPmjIYNG6YmTZrI6XQqNDRULVu21L/+9a8Cc/jnP/+pFi1ayOl0KjAwULVq1XKf53zHjx/X8OHDVbNmTTkcDlWtWlVDhgzxON82m02nTp3SvHnz3PMpzi2dwBVnAJRrc+bMMZLMxo0bC+0/efKk8fHxMe3bt3e3vfTSS+bct/+OHTuMv7+/6dixo1m+fLlZs2aNWbhwoYmPjzcZGRnmzJkzJjEx0Ugyffv2NSkpKSYlJcX8+uuvHtuLjY01I0aMMElJSWb58uWF7ssYY2JjY03VqlVN9erVzbvvvms+/fRT88gjjxhJZuLEiQWObceOHR7P//LLL40k8+WXXxpjjNm2bZtp3bq1iYqKcs8tJSXFPV6Seemll9yP//vf/5rg4GBTu3Zt895775mVK1eahx9+2Egy48ePL7CfGjVqmEceecSsXLnSvP/++6Z69eqmTp065uzZsxd8bdasWWPsdrtp1qyZWbJkiVm+fLmJi4szNpvNLF682BhjzJ49e8zSpUuNJDNo0CCTkpJiNm/eXOQ2FyxYYCSZuLg4k5iYaDIzMwsd9+uvv5r777/fSPI4J2fOnHGfk6pVq5rGjRubRYsWmS+++MJs3bq10POV/zrUqlXLDBo0yHz22WfmH//4hwkJCTHt2rXz2O/DDz9sKlSoYF544QWzatUqM3XqVBMTE2OcTqd57LHHLni+8vc9cODAIvtzc3PNnXfeaYKCgsyYMWNMUlKS+cc//mGqVq1q6tevb7KystxjY2NjTbVq1Uz9+vXNe++9Zz777DPzwAMPGElm7dq17nFbtmwx/v7+pnHjxmbx4sXm448/NnfffbepUaOGR/1t3rzZ1KpVyzRt2tR9PvNfq+LWysmTJ01YWJhp3ry5+eCDD8zatWvNkiVLzFNPPWV+/PHHC56bxx57zMTGxhY4XzVq1DA333yz+eCDD8ynn35q2rZta3x9fc1vv/1W5LYyMzPdr+uLL77oPp49e/a49+VwOEy9evXMG2+8YVavXm1Gjx5tbDabGTNmTIlej/Pt27fPSDIPP/zwBY/7fPPnzzc2m83ce++9ZunSpeaTTz4xXbp0MT4+Pmb16tXucfm/e+rWrWtGjx5tkpKSzOTJk42fn595/PHHPbbZr18/Y7fbzbBhw0xiYqJZtGiRueGGG0xkZKRJS0tzj2vTpo0JDQ01MTExZtq0aebLL79019Irr7xipkyZYlauXGnWrFljZs6caWrWrOnxHrnY+7K488g/tr59+5p///vf5u233zZVq1Y1UVFRpk2bNhc9h7GxsaZz585F9r/wwgtGkvn666/dbb179zazZ882SUlJJikpybzyyismICDAox4u9B45duyY6d27t5k/f7754osvTGJiohk+fLipUKGCmTdvnnsbycnJxmazmYceesh8+umn5osvvjBz5swx8fHx7jGnTp0yTZo0MeHh4Wby5Mlm9erV5s033zROp9PccccdJi8vzxhjTEpKigkICDB33323ez7btm276PkBrjQCGVDOXSyQGWNMZGSkqVevnvvx+SHpww8/NJJMampqkds4dOhQgT/Uz9/e6NGji+w7V2xsrLHZbAX217FjR1OpUiVz6tQpj2O7WCAzxpjOnTsX+GM13/nzfuihh4yfn5/ZvXu3x7i77rrLBAYGmmPHjnns5+677/YY98EHH7j/oLqQW265xURERJgTJ064286ePWsaNmxoqlWr5v6jYceOHQXCaFHy8vJM//79TYUKFYwkY7PZTL169cyzzz5b4DwNHDiwwLnPJ8k4nU5z9OjRQvsKC2QDBgzwGDdhwgQjyRw4cMAY83swlmRGjBjhMe799983kkolkOVv66OPPvJo37hxo5FkZsyY4W6LjY01/v7+ZteuXe6206dPm9DQUNO/f3932wMPPGCCgoLMoUOH3G25ubmmfv36BeqvQYMGhf7BW9xa+fbbb40k9z9YeKOoQBYZGWmOHz/ubktLSzMVKlQw48aNu+D28s/ZnDlzCt2XJPPBBx94tN99992mbt267sfevB7nW79+vZFkXnjhhQJ9Z8+eNS6Xy/2T/145deqUCQ0NNV27dvUYn5uba2688UZz8803u9vyf/dMmDDBY+yAAQOMv7+/xx/tksykSZM8xu3Zs8cEBASY559/3t3Wpk0bI8l8/vnnRR6XMb+/T10ul1m7dq2RZLZs2eLuK+p9Wdx5ZGRkGH9/f3Pfffd5jPvPf/5jJJVKIHvrrbeMJLNkyZJC+3Nzc43L5TIvv/yyCQsLc59LY4p+j5wv/zXu27evadq0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zBj9+OOP+stf/uIOXzabTb6+vh6rXZ4+fVrz588v9PgKqymbzSaHw+HxGqelpRW6yuK522rTpo0qV66szz77TN99951atmypLl26aOzYsQoLC/P4+o+itlFa71ngciGQAVeJrVu3uu+jT09P19dff605c+bIx8dHy5Ytcy9bX5iZM2fqiy++UOfOnVW9enWdOXPG/S+PHTp0kPT7v3THxsbqX//6l9q3b6/Q0FCFh4eX+H/+0dHR6tatmxISElSlShUtWLBASUlJGj9+vPs7ff74xz+qbt26Gj58uM6ePauQkBAtW7ZM69atK7C9Ro0aaenSpXrrrbfUrFkzVahQweN72c710ksvacWKFWrXrp1Gjx6t0NBQLVy4UCtXrtSECRPkdDpLdEznGzdunDp27Kh27dpp+PDhcjgcmjFjhrZu3ar333+/RFeoXnvtNf3nP//Rgw8+6F4ae8eOHZo+fbqOHDmiiRMnusc2atRIkjR+/Hjddddd8vHxUePGjeVwOErl+M7XoEEDPfzww5o0aZJ8fHx0xx13aNu2bZo0aZKcTqd7Sf6L+e233/Thhx8WaK9fv74eeughLVy4UHfffbeeeeYZ3XzzzbLb7dq7d6++/PJL3XPPPbrvvvu8mveoUaP0ySefqH379ho1apQCAgI0c+ZM92eRzp13/tWtJUuWqFatWvL393ef5+JYsWKFZsyYoXvvvVe1atWSMUZLly7VsWPH1LFjR6/mfalq166tgIAALVy4UPXq1VPFihUVHR19wdubz3epr8fDDz+sbdu26bXXXtOWLVvUu3dv1alTR3l5edqzZ4/7D/78K20VK1bUtGnT9Nhjj+no0aO6//77FRERoUOHDmnLli06dOiQ3nrrLa/OQ+vWrfXkk0/q8ccf17fffqvbb79dQUFBOnDggNatW6dGjRrpz3/+8wW30apVK4WEhOipp57SSy+9JLvdroULF2rLli0Fxhb1vizuPEJCQjR8+HC9+uqreuKJJ/TAAw9oz549SkhI8OqWxWPHjmn9+vWSfr+1ffv27Vq8eLG+/vpr9ejRw+PLqzt37qzJkyerZ8+eevLJJ3XkyBG98cYbhV7JK+o90qVLFy1dulQDBgzQ/fffrz179uiVV15RlSpV9Msvv7ifP3r0aO3du1ft27dXtWrVdOzYMb355psen8kbMmSIPvroI91+++16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UqVKlcp8QaJsoWbgLWoG3qJm4A3qBd4qLzXjdDovOqbCFZhHueBwONSsWTMlJSV5tCclJXncwggAAAAApYUrZOcYOnSo4uPj1bx5c7Vs2VJvv/22du/eraeeesrqqQEAAAC4ChHIzvHggw/qyJEjevnll3XgwAE1bNhQn376qWJjYy/+ZAv4+fnppZdeKnDbJFAUagbeombgLWoG3qBe4K2rsWZYZREAAAAALMJnyAAAAADAIgQyAAAAALAIgQwAAAAALEIgAwAAAACLEMjKqRkzZqhmzZry9/dXs2bN9PXXX1s9JZQR48aN0x//+EcFBwcrIiJC9957r7Zv3+4xxhijhIQERUdHKyAgQG3bttW2bdssmjHKknHjxslms2nIkCHuNuoFhdm3b58effRRhYWFKTAwUE2aNNGmTZvc/dQNznX27Fm9+OKLqlmzpgICAlSrVi29/PLLysvLc4+hZq5tX331lbp27aro6GjZbDYtX77co7849ZGdna1BgwYpPDxcQUFB6tatm/bu3XsFj6JkCGTl0JIlSzRkyBCNGjVK3333nW677Tbddddd2r17t9VTQxmwdu1aDRw4UOvXr1dSUpLOnj2ruLg4nTp1yj1mwoQJmjx5sqZPn66NGzcqKipKHTt21IkTJyycOay2ceNGvf3222rcuLFHO/WC82VkZKh169ay2+3697//rR9//FGTJk1S5cqV3WOoG5xr/PjxmjlzpqZPn66ffvpJEyZM0MSJEzVt2jT3GGrm2nbq1CndeOONmj59eqH9xamPIUOGaNmyZVq8eLHWrVunkydPqkuXLsrNzb1Sh1EyBuXOzTffbJ566imPthtuuMG88MILFs0IZVl6erqRZNauXWuMMSYvL89ERUWZ119/3T3mzJkzxul0mpkzZ1o1TVjsxIkTpk6dOiYpKcm0adPGPPPMM8YY6gWFGzFihLn11luL7KducL7OnTubPn36eLR1797dPProo8YYagaeJJlly5a5HxenPo4dO2bsdrtZvHixe8y+fftMhQoVTGJi4hWbe0lwhaycycnJ0aZNmxQXF+fRHhcXp+TkZItmhbIsMzNTkhQaGipJ2rFjh9LS0jxqyM/PT23atKGGrmEDBw5U586d1aFDB4926gWF+fjjj9W8eXM98MADioiIUNOmTfXOO++4+6kbnO/WW2/V559/rp9//lmS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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "# Parameters for dataset generation.\n", + "num_rows = 10000\n", + "num_cols = 5\n", + "mean_length = 1\n", + "std_length = 1\n", + "distribution = \"skewed\"\n", + "seed = 1\n", + "min_length=1\n", + "max_length=100\n", + "\n", + "\n", + "# Generate the dataset.\n", + "dataset = generate_dataset(num_rows, num_cols, mean_length, std_length,\n", + " distribution=distribution, seed=seed, min_length=min_length, max_length=max_length)\n", + "\n", + "# Flatten all string lengths from the dataset.\n", + "all_lengths = [len(cell) for row in dataset for cell in row]\n", + "\n", + "# Plot a histogram of the string lengths.\n", + "plt.figure(figsize=(10, 6))\n", + "# Setting bins from the minimum to the maximum length.\n", + "plt.hist(all_lengths, bins=range(min(all_lengths), max(all_lengths)+2), \n", + " edgecolor='black', alpha=0.75)\n", + "plt.title(\"Distribution of String Lengths in the Generated Dataset\")\n", + "plt.xlabel(\"String Length\")\n", + "plt.ylabel(\"Frequency\")\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "0c941948-ddaa-42e4-b7cb-ee398e7208f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_1_std_1_dup_0_dist_skewed_seed_1_min_1_max_100.csv\n", + "Dataset with 1000000 rows and 5 columns written to \\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\\dataset_rows_1000000_cols_5_mean_1_std_1_dup_0_dist_skewed_seed_3_min_1_max_100.csv\n" + ] + } + ], + "source": [ + "import os\n", + "\n", + "# Define parameter values\n", + "path = r\"\\\\wsl.localhost\\Ubuntu\\home\\tim\\daphne_clean\\daphne\\experiments\\datasets\" # Path to save dataset to (./experiments/datasets/)\n", + "rows = 1000000\n", + "cols = 5\n", + "stds = [1]\n", + "duplicate_factors = [0.0]\n", + "distributions = [\"skewed\"]\n", + "seeds = [1, 3]\n", + "length_ranges = [[1, 1, 100]]\n", + "\n", + "# Ensure the output directory exists\n", + "os.makedirs(path, exist_ok=True)\n", + "\n", + "# Loop over every combination of parameters\n", + "for s in stds:\n", + " for dup in duplicate_factors:\n", + " for dist in distributions:\n", + " for seed in seeds:\n", + " for min_length, mean, max_length in length_ranges:\n", + " # Construct a unique filename for the current combination\n", + " std_str = str(s).replace('.', '_')\n", + " filename = (\n", + " f\"dataset_rows_{rows}_cols_{cols}_\"\n", + " f\"mean_{mean}_std_{std_str}_dup_{dup*100:.0f}_\"\n", + " f\"dist_{dist}_seed_{seed}_min_{min_length}_max_{max_length}.csv\"\n", + " )\n", + " output = os.path.join(path, filename)\n", + " \n", + " # Generate the dataset for the current combination\n", + " dataset = generate_dataset(\n", + " num_rows=rows,\n", + " num_cols=cols,\n", + " mean_length=mean,\n", + " std_length=s,\n", + " duplicate_factor=dup,\n", + " distribution=dist,\n", + " seed=seed,\n", + " min_length=min_length,\n", + " max_length=max_length\n", + " )\n", + " \n", + " # Write the dataset to CSV\n", + " write_csv(output, dataset)\n", + " print(f\"Dataset with {rows} rows and {cols} columns written to {output}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80285b9d-b81e-445f-b02c-2baa60138207", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/experiments/results.xml b/experiments/results.xml new file mode 100644 index 000000000..140126033 --- /dev/null +++ b/experiments/results.xml @@ -0,0 +1,8277 @@ + + + + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+
+
+ + string exceeds fixed buffer size + + +
+ +
+
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+
+ + the binary operation CONCAT is not supported on the value types FixedStr (res), FixedStr (lhs), and FixedStr (rhs) + + +
+ +
+
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+ + DataObjectFactory::destroy() must not be called with nullptr + +
+ +
+
+ + string exceeds fixed buffer size + + +
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+ + DataObjectFactory::destroy() must not be called with nullptr + +
+ +
+
+ + string exceeds fixed buffer size + + +
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+ + DataObjectFactory::destroy() must not be called with nullptr + +
+ +
+
+ + string exceeds fixed buffer size + + +
+ + DataObjectFactory::destroy() must not be called with nullptr + + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + string exceeds fixed buffer size + + +
+
+ + string exceeds fixed buffer size + + +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ + +
+ + +
diff --git a/src/runtime/local/datastructures/DenseMatrix.cpp b/src/runtime/local/datastructures/DenseMatrix.cpp index 463a5ca0c..b8e1d4d6b 100644 --- a/src/runtime/local/datastructures/DenseMatrix.cpp +++ b/src/runtime/local/datastructures/DenseMatrix.cpp @@ -344,3 +344,11 @@ template class DenseMatrix; template class DenseMatrix; template class DenseMatrix; template class DenseMatrix; +template class DenseMatrix; +template class DenseMatrix; +template class DenseMatrix; +template class DenseMatrix; +template class DenseMatrix; +template class DenseMatrix; +template class DenseMatrix; +template class DenseMatrix; diff --git a/src/runtime/local/datastructures/FixedSizeStringValueType.h b/src/runtime/local/datastructures/FixedSizeStringValueType.h deleted file mode 100644 index f39cbda6a..000000000 --- a/src/runtime/local/datastructures/FixedSizeStringValueType.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2024 The DAPHNE Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include -#include - -#include -#include - -/** - * @brief A string value type with a maximum length of 15 characters. - * - * Each instance is backed by a 16-character buffer, whereby at least the last character must always be a null - * character. The null-termination is required for some operations to work correctly (e.g., casting to a number). - */ -struct FixedStr16 { - static const std::size_t N = 16; - char buffer[N]; - - // Default constructor - FixedStr16() { std::fill(buffer, buffer + N, '\0'); } - - // Constructor from a C-style string - FixedStr16(const char *str) { - size_t len = std::strlen(str); - if (len >= N) { - throw std::length_error("string exceeds fixed buffer size"); - } - std::copy(str, str + len, buffer); - std::fill(buffer + len, buffer + N, '\0'); - } - - // Copy constructor - FixedStr16(const FixedStr16 &other) { std::copy(other.buffer, other.buffer + N, buffer); } - - // Constructor from a std::string - FixedStr16(const std::string &other) { - size_t len = other.size(); - if (len >= N) { - throw std::length_error("string exceeds fixed buffer size"); - } - std::copy(other.begin(), other.end(), buffer); - std::fill(buffer + len, buffer + N, '\0'); - } - - // Assignment operator - FixedStr16 &operator=(const FixedStr16 &other) { - if (this != &other) { - std::copy(other.buffer, other.buffer + N, buffer); - } - return *this; - } - - // Overriding the equality operator - bool operator==(const FixedStr16 &other) const { return std::equal(buffer, buffer + N, other.buffer); } - - bool operator==(const char *str) const { return std::strncmp(buffer, str, sizeof(buffer)) == 0; } - - // Overriding the inequality operator - bool operator!=(const FixedStr16 &other) const { return !(std::equal(buffer, buffer + N, other.buffer)); } - - bool operator!=(const char *str) const { return !(std::strncmp(buffer, str, sizeof(buffer)) == 0); } - - // Overriding the Less than operator - bool operator<(const FixedStr16 &other) const { return std::strncmp(buffer, other.buffer, N) < 0; } - - // Overriding the Greater than operator - bool operator>(const FixedStr16 &other) const { return std::strncmp(buffer, other.buffer, N) > 0; } - - // Concatenation operator - friend std::string operator+(const FixedStr16 &lhs, const FixedStr16 &rhs) { - std::string result(lhs.buffer); - result.append(rhs.buffer); - return result; - } - - // Serialization function - void serialize(std::vector &outBuffer) const { outBuffer.insert(outBuffer.end(), buffer, buffer + N); } - - // Overload the output stream operator - friend std::ostream &operator<<(std::ostream &os, const FixedStr16 &fs) { - os.write(fs.buffer, N); - return os; - } - - // Size method - size_t size() const { return std::strlen(buffer); } - - // Method to set the string - void set(const char *str) { - size_t len = std::strlen(str); - if (len >= N) { - throw std::length_error("string exceeds fixed buffer size"); - } - std::transform(str, str + len, buffer, [](char c) { return c; }); - std::fill(buffer + len, buffer + N, '\0'); - } - - // C-string method for compatibility - std::string to_string() const { return std::string(buffer, size()); } - - // Compare method similar to std::string::compare - int compare(const FixedStr16 &other) const { return std::strncmp(buffer, other.buffer, N); } - - // Convert to lowercase - FixedStr16 lower() const { - FixedStr16 result; - std::transform(buffer, buffer + N, result.buffer, [](unsigned char c) { return std::tolower(c); }); - return result; - } - - // Convert to uppercase - FixedStr16 upper() const { - FixedStr16 result; - std::transform(buffer, buffer + N, result.buffer, [](unsigned char c) { return std::toupper(c); }); - return result; - } -}; - -// Specialize std::hash for FixedStr16 this is nessary to use FixedStr16 as a key in std::unordered_map -namespace std { -template <> struct hash { - std::size_t operator()(const FixedStr16 &key) const { - // Compute the hash of the fixed-size buffer - return std::hash()(std::string(key.buffer, key.N)); - } -}; -} // namespace std diff --git a/src/runtime/local/datastructures/OrderedDictionaryEncodedStringValueType.h b/src/runtime/local/datastructures/OrderedDictionaryEncodedStringValueType.h new file mode 100644 index 000000000..ec372afdf --- /dev/null +++ b/src/runtime/local/datastructures/OrderedDictionaryEncodedStringValueType.h @@ -0,0 +1,188 @@ +/* + * Copyright 2024 The DAPHNE Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #pragma once + + #include + #include + #include + #include + #include + #include + #include + + /** + * @brief A String value type that holds all the strings in a global ordered map. + * Each instance of a string has a pointer to its string and the lexicographical key. + * Its important to note that each unique string is only stored one time, + * meaning if two instances represent the same string they point to the same string, saving memory. + * The lex_key can be used to perform comparisons (<, >, ...), because the generation of + * lex_key ensures that if std::string1 < std::string2 => lex_key1 < lex_kex2. + * The first inserted string gets key 0 and all new strings are either placed above or below 0 + * with a gap of 1000000000LL to ensure plenty of space in between for new insertions. + */ + struct OrderedDictionaryEncodedString { + private: + + inline static std::map string_order_map; + + inline static std::mutex dict_mutex; + + + int64_t lex_key; + const std::string* str_ptr; + + + static void getOrInsert(const std::string &s, int64_t &key, const std::string* &ptr) { + std::lock_guard lock(dict_mutex); + auto it = string_order_map.find(s); + if (it != string_order_map.end()) { + key = it->second; + ptr = &(it->first); + } else { + + const int64_t gap = 1000000000LL; + int64_t new_key = 0; + auto lower = string_order_map.lower_bound(s); + if (string_order_map.empty()) { + new_key = 0; + } else if (lower == string_order_map.begin()) { + + new_key = lower->second - gap; + } else if (lower == string_order_map.end()) { + + auto last = std::prev(string_order_map.end()); + new_key = last->second + gap; + } else { + + auto pred = std::prev(lower); + new_key = pred->second + (lower->second - pred->second) / 2; + + if (new_key == pred->second) + new_key = pred->second + 1; + } + auto insert_result = string_order_map.insert({s, new_key}); + key = insert_result.first->second; + ptr = &(insert_result.first->first); + } + } + +public: + // Default constructor: represents the empty string. + OrderedDictionaryEncodedString() { + getOrInsert("", lex_key, str_ptr); + } + + // Constructor from a C-style string. + OrderedDictionaryEncodedString(const char *s) { + std::string str(s ? s : ""); + getOrInsert(str, lex_key, str_ptr); + } + + // Constructor from a std::string. + OrderedDictionaryEncodedString(const std::string &s) { + getOrInsert(s, lex_key, str_ptr); + } + + // Copy constructor. + OrderedDictionaryEncodedString(const OrderedDictionaryEncodedString &other) + : lex_key(other.lex_key), str_ptr(other.str_ptr) {} + + // Assignment operator. + OrderedDictionaryEncodedString &operator=(const OrderedDictionaryEncodedString &other) { + if (this != &other) { + lex_key = other.lex_key; + str_ptr = other.str_ptr; + } + return *this; + } + + // Comparios operators + bool operator==(const OrderedDictionaryEncodedString &other) const { + return lex_key == other.lex_key; + } + bool operator!=(const OrderedDictionaryEncodedString &other) const { + return lex_key != other.lex_key; + } + bool operator<(const OrderedDictionaryEncodedString &other) const { + return lex_key < other.lex_key; + } + bool operator>(const OrderedDictionaryEncodedString &other) const { + return lex_key > other.lex_key; + } + bool operator<=(const OrderedDictionaryEncodedString &other) const { + return lex_key <= other.lex_key; + } + bool operator>=(const OrderedDictionaryEncodedString &other) const { + return lex_key >= other.lex_key; + } + + // Concatenation operator + OrderedDictionaryEncodedString operator+(const OrderedDictionaryEncodedString &rhs) const { + return OrderedDictionaryEncodedString(*str_ptr + *rhs.str_ptr); + } + + OrderedDictionaryEncodedString operator+(const char *rhs) const { + return OrderedDictionaryEncodedString(*str_ptr + std::string(rhs)); + } + + // Overload the output stream operator + friend std::ostream &operator<<(std::ostream &os, const OrderedDictionaryEncodedString &s) { + os << *s.str_ptr; + return os; + } + + // Size method + size_t size() const { + return str_ptr->size(); + } + + // Set + void set(const std::string &s) { + getOrInsert(s, lex_key, str_ptr); + } + + // To String method + std::string to_string() const { + return *str_ptr; + } + + // Lowercase + OrderedDictionaryEncodedString lower() const { + std::string s = *str_ptr; + std::transform(s.begin(), s.end(), s.begin(), ::tolower); + return OrderedDictionaryEncodedString(s); + } + + // Uppercase + OrderedDictionaryEncodedString upper() const { + std::string s = *str_ptr; + std::transform(s.begin(), s.end(), s.begin(), ::toupper); + return OrderedDictionaryEncodedString(s); + } +}; + +// Specialization of std::hash for OrderedDictionaryEncodedString. +namespace std { + template <> + struct hash { + std::size_t operator()(const OrderedDictionaryEncodedString &key) const { + return std::hash()(key.to_string()); + } + }; +} + + diff --git a/src/runtime/local/datastructures/TemplatedFixedSizeString.h b/src/runtime/local/datastructures/TemplatedFixedSizeString.h new file mode 100644 index 000000000..fa5a5806e --- /dev/null +++ b/src/runtime/local/datastructures/TemplatedFixedSizeString.h @@ -0,0 +1,149 @@ +/* + * Copyright 2024 The DAPHNE Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #pragma once + + #include + #include + #include + #include + #include + #include + #include + #include + #include + + /** + * @brief A string value type with a maximum length of N = 2^n = {16, 32, 64, 128, 256} characters. + * + * Each instance is backed by a N-character buffer, whereby at least the last character must always be a null + * character. The null-termination is required for some operations to work correctly (e.g., casting to a number). + */ + template class FixedStr { + static_assert(N > 0, "Capacity must be greater than 0."); + static_assert((N & (N - 1)) == 0, "Capacity must be a power of 2."); + + public: + char buffer[N]; + + // Default Constructor + FixedStr() { std::fill(buffer, buffer + N, '\0'); } + + // Constructor from a C-style string + FixedStr(const char *str) { + std::size_t len = std::strlen(str); + if (len >= N) + throw std::length_error("string exceeds fixed buffer size"); + std::copy(str, str + len, buffer); + std::fill(buffer + len, buffer + N, '\0'); + } + + // Copy constructor + FixedStr(const FixedStr &other) { std::copy(other.buffer, other.buffer + N, buffer); } + + // Constructor from a std::string + FixedStr(const std::string &str) { + std::size_t len = str.size(); + if (len >= N) + throw std::length_error("string exceeds fixed buffer size"); + std::copy(str.begin(), str.end(), buffer); + std::fill(buffer + len, buffer + N, '\0'); + } + + // Assignment operator + FixedStr &operator=(const FixedStr &other) { + if (this != &other) { + std::copy(other.buffer, other.buffer + N, buffer); + } + return *this; + } + + // Overriding the comparison operators + bool operator==(const FixedStr &other) const { return std::equal(buffer, buffer + N, other.buffer); } + bool operator==(const char *str) const { return std::strncmp(buffer, str, N) == 0; } + + bool operator!=(const FixedStr &other) const { return !(*this == other); } + bool operator!=(const char *str) const { return !(*this == str); } + + bool operator<(const FixedStr &other) const { return std::strncmp(buffer, other.buffer, N) < 0; } + + bool operator>(const FixedStr &other) const { return std::strncmp(buffer, other.buffer, N) > 0; } + + + // Concatenation operator + friend std::string operator+(const FixedStr &lhs, const FixedStr &rhs) { + std::string result(lhs.buffer); + result.append(rhs.buffer); + return result; + } + + // Serialization function + void serialize(std::vector &outBuffer) const { outBuffer.insert(outBuffer.end(), buffer, buffer + N); } + + // Overload the output stream operator + friend std::ostream &operator<<(std::ostream &os, const FixedStr &fs) { + os << fs.to_string(); + return os; + } + + // Size method + std::size_t size() const { return std::strlen(buffer); } + + // Method to set the string + void set(const char *str) { + std::size_t len = std::strlen(str); + if (len >= N) + throw std::length_error("string exceeds fixed buffer size"); + std::copy(str, str + len, buffer); + std::fill(buffer + len, buffer + N, '\0'); + } + + // C-string method for compatibility + std::string to_string() const { return std::string(buffer, size()); } + + // Compare method similar to std::string::compare + int compare(const FixedStr &other) const { return std::strncmp(buffer, other.buffer, N); } + + // Lowercase method + FixedStr lower() const { + FixedStr result(*this); + std::transform(result.buffer, result.buffer + N, result.buffer, + [](unsigned char c) { return std::tolower(c); }); + return result; + } + + // Uppercase method + FixedStr upper() const { + FixedStr result(*this); + std::transform(result.buffer, result.buffer + N, result.buffer, + [](unsigned char c) { return std::toupper(c); }); + return result; + } + }; + +// define hash for use in unordered map + namespace std { + template struct hash> { + std::size_t operator()(const FixedStr &key) const { return std::hash()(key.to_string()); } + }; + } // namespace std + + // Type aliases for common fixed string sizes. + using FixedStr16 = FixedStr<16>; + using FixedStr32 = FixedStr<32>; + using FixedStr64 = FixedStr<64>; + using FixedStr128 = FixedStr<128>; + using FixedStr256 = FixedStr<256>; \ No newline at end of file diff --git a/src/runtime/local/datastructures/Umbra.h b/src/runtime/local/datastructures/Umbra.h new file mode 100644 index 000000000..73f91dbdb --- /dev/null +++ b/src/runtime/local/datastructures/Umbra.h @@ -0,0 +1,459 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SHORT_STR_LEN 12 +#define PREFIX_LEN 4 + +/** + * @brief A string value type with a fixed memory size of 16 bytes, where the first 4 bytes + * are reserved for the length of the string. When the length does not exceed 12 characters, + * the string is stored in the remainig 12 bytes. Otherwise, 4 of the remaining 12 bytes + * store a prefix of the string and the other 8 bytes a pointer to the string. + * This implementation uses a Union to realise the overall datastructure. + */ +struct Umbra_t { + union { + char short_str[SHORT_STR_LEN]; // For small strings + struct { + char prefix[PREFIX_LEN]; // Prefix for long strings + char *ptr; // Pointer to the long string + } long_str; + }; + uint32_t length; // Length of the string + + // Default constructor + Umbra_t() : length(0) { std::fill(short_str, short_str + SHORT_STR_LEN, '\0'); } + + // Constructor from a C-style string + Umbra_t(const char *str) { + size_t len = std::strlen(str); + if (len > UINT32_MAX) { + throw std::length_error("String length exceeds maximum allowed"); + } + length = static_cast(len); + if (length <= SHORT_STR_LEN) { + std::memcpy(short_str, str, length); + std::fill(short_str + length, short_str + SHORT_STR_LEN, '\0'); + } else { + std::memcpy(long_str.prefix, str, PREFIX_LEN); + long_str.ptr = new char[length + 1]; + std::memcpy(long_str.ptr, str, length); + long_str.ptr[length] = '\0'; + } + } + + // Constructor from a std::string + Umbra_t(const std::string &str) { + size_t len = str.size(); + if (len > UINT32_MAX) { + throw std::length_error("String length exceeds maximum allowed"); + } + length = static_cast(len); + if (length <= SHORT_STR_LEN) { + str.copy(short_str, length); + std::fill(short_str + length, short_str + SHORT_STR_LEN, '\0'); + } else { + str.copy(long_str.prefix, PREFIX_LEN); + long_str.ptr = new char[length + 1]; + str.copy(long_str.ptr, length); + long_str.ptr[length] = '\0'; + } + } + + // Copy constructor + Umbra_t(const Umbra_t &other) { + length = other.length; + if (length <= SHORT_STR_LEN) { + std::memcpy(short_str, other.short_str, length); + std::fill(short_str + length, short_str + SHORT_STR_LEN, '\0'); + } else { + std::memcpy(long_str.prefix, other.long_str.prefix, PREFIX_LEN); + long_str.ptr = new char[length + 1]; + std::memcpy(long_str.ptr, other.long_str.ptr, length); + long_str.ptr[length] = '\0'; + } + } + + // Destructor + ~Umbra_t() { + if (length > SHORT_STR_LEN) { + delete[] long_str.ptr; + long_str.ptr = nullptr; + } + } + + // Assignment operator + Umbra_t &operator=(const Umbra_t &other) { + if (this != &other) { + if (length > SHORT_STR_LEN) { + delete[] long_str.ptr; + } + length = other.length; + if (length <= SHORT_STR_LEN) { + std::memcpy(short_str, other.short_str, length); + std::fill(short_str + length, short_str + SHORT_STR_LEN, '\0'); + } else { + std::memcpy(long_str.prefix, other.long_str.prefix, PREFIX_LEN); + long_str.ptr = new char[length + 1]; + std::memcpy(long_str.ptr, other.long_str.ptr, length); + long_str.ptr[length] = '\0'; + } + } + return *this; + } + + // Copy + Umbra_t(Umbra_t &&other) noexcept : length(other.length) { + if (other.length <= SHORT_STR_LEN) { + std::memcpy(short_str, other.short_str, SHORT_STR_LEN); + } else { + std::memcpy(long_str.prefix, other.long_str.prefix, PREFIX_LEN); + long_str.ptr = other.long_str.ptr; + other.long_str.ptr = nullptr; + other.length = 0; + } + } + + // Assignment + Umbra_t &operator=(Umbra_t &&other) noexcept { + if (this != &other) { + if (length > SHORT_STR_LEN) { + delete[] long_str.ptr; + } + length = other.length; + if (other.length <= SHORT_STR_LEN) { + std::memcpy(short_str, other.short_str, SHORT_STR_LEN); + } else { + std::memcpy(long_str.prefix, other.long_str.prefix, PREFIX_LEN); + long_str.ptr = other.long_str.ptr; + other.long_str.ptr = nullptr; + other.length = 0; + } + } + return *this; + } + + // Equality comparison with other Umbra Strings + bool operator==(const Umbra_t &other) const { + if (length != other.length) { + return false; + } + if (length <= SHORT_STR_LEN) { + return std::equal(short_str, short_str + length, other.short_str); + } else { + if (!std::equal(long_str.prefix, long_str.prefix + PREFIX_LEN, other.long_str.prefix)) { + return false; + } + return std::equal(long_str.ptr, long_str.ptr + length, other.long_str.ptr); + } + } + + // Equality comparison with other C-style strings + bool operator==(const char *str) const { + size_t str_len = std::strlen(str); + if (length != str_len) return false; + if (length <= SHORT_STR_LEN) + return std::equal(short_str, short_str + length, str); + else + return std::equal(long_str.ptr, long_str.ptr + length, str); + } + + // Inequality comparison with other Umbra Strings + bool operator!=(const Umbra_t &other) const { return !(*this == other); } + + // Inequality comparison with other C-style strings + bool operator!=(const char *str) const { return !(*this == str); } + + // Less-than comparison with other Umbra Strings + bool operator<(const Umbra_t &other) const { + uint32_t min_length = std::min(length, other.length); + int cmp; + if (length <= SHORT_STR_LEN && other.length <= SHORT_STR_LEN) { + cmp = std::memcmp(short_str, other.short_str, min_length); + } else if (length <= SHORT_STR_LEN) { + cmp = std::memcmp(short_str, other.long_str.prefix, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(short_str, other.long_str.ptr, min_length); + } + } else if (other.length <= SHORT_STR_LEN) { + cmp = std::memcmp(long_str.prefix, other.short_str, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(long_str.ptr, other.short_str, min_length); + } + } else { + cmp = std::memcmp(long_str.prefix, other.long_str.prefix, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(long_str.ptr, other.long_str.ptr, min_length); + } + } + if (cmp == 0) { + return length < other.length; + } + return cmp < 0; + } + + // Less-than comparison with other C-style strings + bool operator<(const char *str) const { + uint32_t str_len = std::strlen(str); + uint32_t min_length = std::min(length, str_len); + int cmp; + if (length <= SHORT_STR_LEN) { + cmp = std::memcmp(short_str, str, min_length); + } else { + cmp = std::memcmp(long_str.prefix, str, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(long_str.ptr, str, min_length); + } + } + if (cmp == 0) { + return length < str_len; + } + return cmp < 0; + } + + // Greater-than comparison with other Umbra Strings + bool operator>(const Umbra_t &other) const { + uint32_t min_length = std::min(length, other.length); + int cmp; + if (length <= SHORT_STR_LEN && other.length <= SHORT_STR_LEN) { + cmp = std::memcmp(short_str, other.short_str, min_length); + } else if (length <= SHORT_STR_LEN) { + cmp = std::memcmp(short_str, other.long_str.prefix, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(short_str, other.long_str.ptr, min_length); + } + } else if (other.length <= SHORT_STR_LEN) { + cmp = std::memcmp(long_str.prefix, other.short_str, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(long_str.ptr, other.short_str, min_length); + } + } else { + cmp = std::memcmp(long_str.prefix, other.long_str.prefix, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(long_str.ptr, other.long_str.ptr, min_length); + } + } + if (cmp == 0) { + return length > other.length; + } + return cmp > 0; + } + + // Greater-than comparison with other C-style strings + bool operator>(const char *str) const { + uint32_t str_len = std::strlen(str); + uint32_t min_length = std::min(length, str_len); + int cmp; + if (length <= SHORT_STR_LEN) { + cmp = std::memcmp(short_str, str, min_length); + } else { + cmp = std::memcmp(long_str.prefix, str, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(long_str.ptr, str, min_length); + } + } + if (cmp == 0) { + return length > str_len; + } + return cmp > 0; + } + + operator std::string() const { return this->to_string(); } + + // Concatenation Operation with other Umbra Strings. + + Umbra_t operator+(const Umbra_t &other) const { + Umbra_t result; + result.length = this->length + other.length; + + if (result.length <= SHORT_STR_LEN) { + std::memcpy(result.short_str, this->short_str, this->length); + std::memcpy(result.short_str + this->length, other.short_str, other.length); + } else { + char *new_str = new char[result.length + 1]; + + if (this->length <= SHORT_STR_LEN) { + std::memcpy(new_str, this->short_str, this->length); + } else { + std::memcpy(new_str, this->long_str.ptr, this->length); + } + + if (other.length <= SHORT_STR_LEN) { + std::memcpy(new_str + this->length, other.short_str, other.length); + } else { + std::memcpy(new_str + this->length, other.long_str.ptr, other.length); + } + + new_str[result.length] = '\0'; + + std::memcpy(result.long_str.prefix, new_str, PREFIX_LEN); + result.long_str.ptr = new_str; + } + + return result; + } + + // Concatenation Operation with other C-style strings. + Umbra_t operator+(const char *str) const { + uint32_t str_length = std::strlen(str); + uint32_t new_length = length + str_length; + char *new_str = new char[new_length + 1]; + + if (length <= SHORT_STR_LEN) { + std::memcpy(new_str, short_str, length); + } else { + std::memcpy(new_str, long_str.ptr, length); + } + + std::memcpy(new_str + length, str, str_length); + + new_str[new_length] = '\0'; + Umbra_t result(new_str); + delete[] new_str; + return result; + } + + // Serialize method + void serialize(std::vector &outBuffer) const { + outBuffer.reserve(4 + length); + + outBuffer.push_back(static_cast((length >> 0) & 0xFF)); + outBuffer.push_back(static_cast((length >> 8) & 0xFF)); + outBuffer.push_back(static_cast((length >> 16) & 0xFF)); + outBuffer.push_back(static_cast((length >> 24) & 0xFF)); + + if (length <= SHORT_STR_LEN) { + outBuffer.insert(outBuffer.end(), short_str, short_str + length); + } else { + outBuffer.insert(outBuffer.end(), long_str.ptr, long_str.ptr + length); + } + } + + // size method + inline size_t size() const { return length; } + + // Method to check if string is stored in long format + inline bool is_long() const { return length > SHORT_STR_LEN; } + + // method to get string + inline const char *get() const { return is_long() ? long_str.ptr : short_str; } + + // Method to set the String + void set(const char *str) { + size_t len = std::strlen(str); + + if (len > UINT32_MAX) { + throw std::length_error("String length exceeds maximum allowed"); + } + + if (is_long()) { + delete[] long_str.ptr; // Clean up old string if previously long + } + + length = static_cast(len); + + if (length <= SHORT_STR_LEN) { + std::memcpy(short_str, str, length); + std::fill(short_str + length, short_str + SHORT_STR_LEN, '\0'); + + } else { + std::memcpy(long_str.prefix, str, PREFIX_LEN); + long_str.ptr = new char[length + 1]; + std::memcpy(long_str.ptr, str, length); + long_str.ptr[length] = '\0'; + } + } + + // Method to convert Umbra to std::string + std::string to_string() const { + if (length <= SHORT_STR_LEN) { + return std::string(short_str, length); + } + return std::string(long_str.ptr, size()); + } + + // Output stream operator + friend std::ostream &operator<<(std::ostream &os, const Umbra_t &str) { + if (str.length <= SHORT_STR_LEN) { + os.write(str.short_str, str.length); + } else { + os.write(str.long_str.ptr, str.length); + } + + return os; + } + + // Compare method similar to std::string::compare + int compare(const char *str) const { + uint32_t str_len = std::strlen(str); + uint32_t min_length = std::min(length, str_len); + int cmp; + if (length <= SHORT_STR_LEN) { + cmp = std::memcmp(short_str, str, min_length); + } else { + cmp = std::memcmp(long_str.prefix, str, PREFIX_LEN); + if (cmp == 0) { + cmp = std::memcmp(long_str.ptr, str, min_length); + } + } + return cmp; + } + + // Convert to lowercase + Umbra_t lower() const { + Umbra_t result(*this); + if (length <= SHORT_STR_LEN) { + for (uint32_t i = 0; i < length; i++) { + result.short_str[i] = static_cast(std::tolower(result.short_str[i])); + } + } else { + char *str = reinterpret_cast(result.long_str.ptr); + for (uint32_t i = 0; i < length; i++) { + str[i] = static_cast(std::tolower(str[i])); + } + for (int i = 0; i < PREFIX_LEN; i++) { + result.long_str.prefix[i] = static_cast(std::tolower(result.long_str.prefix[i])); + } + } + return result; + } + + // Convert to uppercase + Umbra_t upper() const { + Umbra_t result(*this); + if (length <= SHORT_STR_LEN) { + for (uint32_t i = 0; i < length; i++) { + result.short_str[i] = static_cast(std::toupper(result.short_str[i])); + } + } else { + char *str = reinterpret_cast(result.long_str.ptr); + for (uint32_t i = 0; i < length; i++) { + str[i] = static_cast(std::toupper(str[i])); + } + for (int i = 0; i < PREFIX_LEN; i++) { + result.long_str.prefix[i] = static_cast(std::toupper(result.long_str.prefix[i])); + } + } + return result; + } +} __attribute__((aligned(8))); + + +// Hash function for use in unordered map +namespace std { +template <> struct hash { + size_t operator()(const Umbra_t &key) const { + return std::hash()(std::string_view(key.get(), key.size())); + } +}; +} // namespace std \ No newline at end of file diff --git a/src/runtime/local/datastructures/UmbraNew.h b/src/runtime/local/datastructures/UmbraNew.h new file mode 100644 index 000000000..dac35ceb8 --- /dev/null +++ b/src/runtime/local/datastructures/UmbraNew.h @@ -0,0 +1,400 @@ +#pragma once // ifndef + +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_LEN 12 +#define PREFIX_LEN 4 + +/** + * @brief A string value type with a fixed memory size of 16 bytes, where the first 4 bytes + * are reserved for the length of the string. When the length does not exceed 12 characters, + * the string is stored in the remainig 12 bytes. Otherwise, 4 of the remaining 12 bytes + * store a prefix of the string and the other 8 bytes a pointer to the string. + * This implementation uses a uint8_t buffer to store the remaining 12 bytes in comparison to the union of the other Umbra implementation. + */ +class NewUmbra_t { + static_assert(BUFFER_LEN >= PREFIX_LEN + sizeof(uintptr_t), "Buffer too small to store pointer."); + + private: + uint32_t length; // Length of the string + uint8_t buffer[BUFFER_LEN]; // buffer to hold string if <= 12 bytes or prefix and pointer + + bool is_long() const { return length > BUFFER_LEN; } + + void set_pointer(const std::string &full_str) { + std::string *ptr = new std::string(full_str); + + uintptr_t address = reinterpret_cast(ptr); + std::memcpy(buffer + PREFIX_LEN, &address, sizeof(uintptr_t)); + } + + std::string *get_pointer() const { + uintptr_t address; + std::memcpy(&address, buffer + PREFIX_LEN, sizeof(uintptr_t)); + return reinterpret_cast(address); + } + + void set_string(const char *str) { + std::copy(str, str + PREFIX_LEN, buffer); + set_pointer(std::string(str)); + } + + void clear_pointer() { std::memset(buffer + PREFIX_LEN, 0, sizeof(uintptr_t)); } + + public: + // Default constructor + NewUmbra_t() : length(0) { std::fill(buffer, buffer + BUFFER_LEN, static_cast('\0')); } + + // Constructor from a C-style string + NewUmbra_t(const char *str) { + length = static_cast(std::strlen(str)); + if (length > UINT32_MAX) { + throw std::length_error("String exceeds fixed buffer size"); + } + if (length <= BUFFER_LEN) { + std::copy(str, str + length, buffer); + std::fill(buffer + length, buffer + BUFFER_LEN, static_cast('\0')); + } else { + set_string(str); + } + } + + // Copy constructor + NewUmbra_t(const NewUmbra_t &other) : length(other.length) { + if (length <= BUFFER_LEN) { + std::copy(other.buffer, other.buffer + BUFFER_LEN, buffer); + } else { + std::copy(other.buffer, other.buffer + PREFIX_LEN, buffer); + std::string *original_ptr = other.get_pointer(); + if (original_ptr) { + std::string *new_ptr = new std::string(*original_ptr); + uintptr_t new_address = reinterpret_cast(new_ptr); + std::memcpy(buffer + PREFIX_LEN, &new_address, sizeof(uintptr_t)); + } + } + } + + // Constructor from a std::string + NewUmbra_t(const std::string &str) { + length = static_cast(str.size()); + if (length > UINT32_MAX) { + throw std::length_error("String exceeds fixed buffer size"); + } + if (length <= BUFFER_LEN) { + std::copy(str.begin(), str.begin() + length, buffer); + std::fill(buffer + length, buffer + BUFFER_LEN, static_cast('\0')); + } else { + set_string(str.c_str()); + } + } + + // Copy constructor + NewUmbra_t(NewUmbra_t &&other) noexcept : length(other.length) { + if (!other.is_long()) { + std::copy(other.buffer, other.buffer + BUFFER_LEN, buffer); + } else { + std::memcpy(buffer, other.buffer, sizeof(uint8_t) * BUFFER_LEN); + other.length = 0; + other.clear_pointer(); + } + } + + // Assignment operator + NewUmbra_t &operator=(const NewUmbra_t &other) { + if (this != &other) { + if (is_long()) { + delete get_pointer(); + clear_pointer(); + } + + length = other.length; + if (!other.is_long()) { + std::copy(other.buffer, other.buffer + BUFFER_LEN, buffer); + } else { + + std::copy(other.buffer, other.buffer + PREFIX_LEN, buffer); + std::string *original_ptr = other.get_pointer(); + if (original_ptr) { + std::string *new_ptr = new std::string(*original_ptr); + uintptr_t new_address = reinterpret_cast(new_ptr); + std::memcpy(buffer + PREFIX_LEN, &new_address, sizeof(uintptr_t)); + } + } + } + return *this; + } +/* + NewUmbra_t &operator=(NewUmbra_t &&other) noexcept { + if (this != &other) { + if (is_long()) { + delete get_pointer(); + clear_pointer(); + } + + length = other.length; + std::copy(other.buffer, other.buffer + BUFFER_LEN, buffer); + + if (other.is_long()) { + + std::memcpy(buffer + PREFIX_LEN, other.buffer + PREFIX_LEN, sizeof(uintptr_t)); + other.length = 0; + other.clear_pointer(); + } + } + return *this; + } + */ + + // Destructor + ~NewUmbra_t() { + if (is_long()) { + delete get_pointer(); + clear_pointer(); + } + } + + // Comparison operators + bool operator==(const NewUmbra_t &other) const { + if (length != other.length) + return false; + + if (!is_long()) { + return std::equal(buffer, buffer + BUFFER_LEN, other.buffer); + } else { + if (!std::equal(buffer, buffer + PREFIX_LEN, other.buffer)) { + return false; + } + return *get_pointer() == *other.get_pointer(); + } + } + + bool operator==(const char *str) const { + size_t len = std::strlen(str); + if (len != length) + return false; + + if (!is_long()) { + return std::strncmp(reinterpret_cast(buffer), str, BUFFER_LEN) == 0; + } else { + if (!std::equal(buffer, buffer + PREFIX_LEN, str)) { + return false; + } + std::string *ptr = get_pointer(); + if (ptr) + return *ptr == std::string(str); + return false; + } + } + + bool operator!=(const NewUmbra_t &other) const { return !(*this == other); } + + bool operator!=(const char *str) const { return !(*this == str); } + + bool operator<(const NewUmbra_t &other) const { + int cmp; + if (!is_long() && !other.is_long()) { + cmp = std::memcmp(buffer, other.buffer, BUFFER_LEN); + } else if (!is_long()) { + cmp = std::memcmp(buffer, other.buffer, PREFIX_LEN); + if (cmp == 0) { + return this->to_string() < *(other.get_pointer()); + } + } else if (!other.is_long()) { + cmp = std::memcmp(buffer, other.buffer, PREFIX_LEN); + if (cmp == 0) { + return *(this->get_pointer()) < other.to_string(); + } + } else { + cmp = std::memcmp(buffer, other.buffer, PREFIX_LEN); + if (cmp == 0) { + std::string *ptr1 = get_pointer(); + std::string *ptr2 = other.get_pointer(); + return *ptr1 < *ptr2; + } + } + if (cmp == 0) { + return length < other.length; + } + return cmp < 0; + } + + bool operator<(const char *str) const { + uint32_t str_len = std::strlen(str); + uint32_t min_length = std::min(length, str_len); + int cmp; + if (!is_long()) { + cmp = std::memcmp(buffer, str, min_length); + } else { + cmp = std::memcmp(buffer, str, PREFIX_LEN); + if (cmp == 0) { + std::string *ptr1 = get_pointer(); + return *ptr1 < str; + } + } + if (cmp == 0) { + return length < str_len; + } + return cmp < 0; + } + + bool operator>(const NewUmbra_t &other) const { + int cmp; + if (!is_long() && !other.is_long()) { + cmp = std::memcmp(buffer, other.buffer, BUFFER_LEN); + } else if (!is_long()) { + cmp = std::memcmp(buffer, other.buffer, PREFIX_LEN); + if (cmp == 0) { + return this->to_string() > *(other.get_pointer()); + } + } else if (!other.is_long()) { + cmp = std::memcmp(buffer, other.buffer, PREFIX_LEN); + if (cmp == 0) { + return *(this->get_pointer()) > other.to_string(); + } + } else { + cmp = std::memcmp(buffer, other.buffer, PREFIX_LEN); + if (cmp == 0) { + std::string *ptr1 = get_pointer(); + std::string *ptr2 = other.get_pointer(); + return *ptr1 > *ptr2; + } + } + if (cmp == 0) { + return length > other.length; + } + return cmp > 0; + } + + bool operator>(const char *str) const { + uint32_t str_len = std::strlen(str); + uint32_t min_length = std::min(length, str_len); + int cmp; + if (!is_long()) { + cmp = std::memcmp(buffer, str, min_length); + } else { + cmp = std::memcmp(buffer, str, PREFIX_LEN); + if (cmp == 0) { + std::string *ptr1 = get_pointer(); + return *ptr1 > str; + } + } + if (cmp == 0) { + return length > str_len; + } + return cmp > 0; + } + + // Concatenation operator + NewUmbra_t operator+(const NewUmbra_t &rhs) const { + std::string full_str = this->to_string() + rhs.to_string(); + return NewUmbra_t(full_str); + } + + NewUmbra_t operator+(const char *rhs) const { + std::string full_str = this->to_string() + std::string(rhs); + return NewUmbra_t(full_str); + } + + // Output Stream operator + friend std::ostream &operator<<(std::ostream &os, const NewUmbra_t &str) { + os << str.to_string(); + return os; + } + + // method to get the string as c_str + const char *get() const { + if (!is_long()) { + return reinterpret_cast(buffer); + } else { + return get_pointer()->c_str(); + } + } + + // Serialize method + void serialize(std::vector &outBuffer) const { + + outBuffer.insert(outBuffer.end(), reinterpret_cast(&length), + reinterpret_cast(&length) + sizeof(uint32_t)); + + if (is_long()) { + + uintptr_t address = reinterpret_cast(get_pointer()); + outBuffer.insert(outBuffer.end(), reinterpret_cast(&address), + reinterpret_cast(&address) + sizeof(uintptr_t)); + } else { + + outBuffer.insert(outBuffer.end(), reinterpret_cast(buffer), + reinterpret_cast(buffer) + (BUFFER_LEN - PREFIX_LEN)); + } + } + + // method to return std::string + std::string to_string() const { + if (is_long()) { + std::string *ptr = get_pointer(); + if (ptr) + return *ptr; + return ""; + } else { + return std::string(reinterpret_cast(buffer), length); + } + } + + // compare method + int compare(const NewUmbra_t &other) const { return to_string().compare(other.to_string()); } + + // Lowercase + NewUmbra_t lower() const { + NewUmbra_t result(*this); + std::string lower_str = result.to_string(); + std::transform(lower_str.begin(), lower_str.end(), lower_str.begin(), + [](unsigned char c) { return std::tolower(c); }); + result = NewUmbra_t(lower_str); + return result; + } + + // Uppercase + NewUmbra_t upper() const { + NewUmbra_t result(*this); + std::string upper_str = result.to_string(); + std::transform(upper_str.begin(), upper_str.end(), upper_str.begin(), + [](unsigned char c) { return std::toupper(c); }); + result = NewUmbra_t(upper_str); + return result; + } + + // method to set string + void set(const char *str) { + uint32_t new_length = static_cast(std::strlen(str)); + if (is_long()) { + delete get_pointer(); + clear_pointer(); + } + length = new_length; + if (new_length <= BUFFER_LEN) { + std::copy(str, str + new_length, buffer); + std::fill(buffer + new_length, buffer + BUFFER_LEN, static_cast('\0')); + } else { + std::copy(str, str + PREFIX_LEN, buffer); + std::string *ptr = new std::string(str); + uintptr_t address = reinterpret_cast(ptr); + std::memcpy(buffer + PREFIX_LEN, &address, sizeof(uintptr_t)); + } + } + + size_t size() const { return length; } +}; + +// Specialize std::hash for NewUmbra_t to use in unordered containers +namespace std { +template <> struct hash { + size_t operator()(const NewUmbra_t &u) const { return std::hash()(u.to_string()); } +}; +} // namespace std \ No newline at end of file diff --git a/src/runtime/local/datastructures/UnorderedDictionaryEncodedStringValueType.h b/src/runtime/local/datastructures/UnorderedDictionaryEncodedStringValueType.h new file mode 100644 index 000000000..278bc4ed6 --- /dev/null +++ b/src/runtime/local/datastructures/UnorderedDictionaryEncodedStringValueType.h @@ -0,0 +1,178 @@ +/* + * Copyright 2024 The DAPHNE Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #pragma once + + #include + #include + #include + #include + #include + #include + + /** + * @brief A string value type that has a global unordered map that holds all the strings. + * Each string instance is simply a std::size_t. When creating a new string, + * the string is inserted into the dictionary and the index of the string is returned. + * For the String -> Index direction we have the string_index_map + * and for the Index -> String direction we have a deque. + */ + + struct UnorderedDictionaryEncodedString { + private: + + // Global Vector (deque for thread safety) that Maps Index -> String + inline static std::deque index_string_vec; + + // Global Unordered Map that Maps String -> Index + inline static std::unordered_map string_index_map; + + // Mutex for thread safe execution + inline static std::mutex dict_mutex; + + // Index for the given String in "index_string_vec" + std::size_t index; + + /** + * @brief Get the Index associated to the string. + * If it doesn't exist in the dictionary yet, it is first inserted. + * + * @param str The string to look up in the dictionary. + * @return The index associated to str. + */ + static std::size_t getIndex(const std::string &str) { + // Aquire Lock + std::lock_guard lock(dict_mutex); + + auto search = string_index_map.find(str); + if (search != string_index_map.end()) { + // Element found + return search->second; + } + else { + // Get Index for new string entry + std::size_t newIndex = string_index_map.size(); + + // Append string to end of vector + index_string_vec.push_back(str); + + // Insert str into the Map + string_index_map[str] = newIndex; + return newIndex; + } + } + + public: + // Default constructor: points to an empty string. + UnorderedDictionaryEncodedString() : index(getIndex("")) {} + + // Constructor from a C-style string + UnorderedDictionaryEncodedString(const char *str) : index(getIndex(str ? str : "")) {} + + // Constructor from a std::string + UnorderedDictionaryEncodedString(const std::string &other) : index(getIndex(other)) {} + + // Copy constructor + UnorderedDictionaryEncodedString(const UnorderedDictionaryEncodedString &other) : index(other.index) {} + + // Assignment operator + UnorderedDictionaryEncodedString &operator=(const UnorderedDictionaryEncodedString &other) { + if (this != &other) { + index = other.index; + } + return *this; + } + + // Equality operator compares by dictionary index + bool operator==(const UnorderedDictionaryEncodedString &other) const { + return index == other.index; + } + + // Inequality operator + bool operator!=(const UnorderedDictionaryEncodedString &other) const { + return index != other.index; + } + + // Overriding the Less than operator + bool operator<(const UnorderedDictionaryEncodedString &other) const { + return index_string_vec[index] < index_string_vec[other.index]; + } + + + // Overriding the Greater than operator + bool operator>(const UnorderedDictionaryEncodedString &other) const { + return index_string_vec[index] > index_string_vec[other.index]; + } + + // Concatenation operator + UnorderedDictionaryEncodedString operator+(const UnorderedDictionaryEncodedString &rhs) const { + return UnorderedDictionaryEncodedString(index_string_vec[index] + index_string_vec[rhs.index]); + } + + // Concatenation operator with C-style string + UnorderedDictionaryEncodedString operator+(const char *rhs) const { + std::string full_str = index_string_vec[index] + std::string(rhs); + return UnorderedDictionaryEncodedString(full_str); + } + + + // Overload the output stream operator + friend std::ostream &operator<<(std::ostream &os, const UnorderedDictionaryEncodedString &ds) { + os << ds.to_string(); + return os; + } + + // Size method + size_t size() const + { + return index_string_vec[index].size(); + } + + + // Set + void set(const std::string &str) { + index = getIndex(str); + } + + // To String method + std::string to_string() const { + return index_string_vec[index]; + } + + //Convert to lowercase + UnorderedDictionaryEncodedString lower() const { + std::string str = index_string_vec[index]; + std::transform(str.begin(), str.end(), str.begin(), ::tolower); // Convert to lowercase + return UnorderedDictionaryEncodedString(str); + } + + //Convert to uppercase + UnorderedDictionaryEncodedString upper() const { + std::string str = index_string_vec[index]; + std::transform(str.begin(), str.end(), str.begin(), ::toupper); // Convert to lowercase + return UnorderedDictionaryEncodedString(str); + } + + + }; + + // Hash + template <> struct std::hash { + std::size_t operator()(const UnorderedDictionaryEncodedString &key) const { + // Compute the hash + return std::hash()(key.to_string()); + } + }; \ No newline at end of file diff --git a/src/runtime/local/datastructures/ValueTypeCode.h b/src/runtime/local/datastructures/ValueTypeCode.h index f1f7e5f64..b880ebfdc 100644 --- a/src/runtime/local/datastructures/ValueTypeCode.h +++ b/src/runtime/local/datastructures/ValueTypeCode.h @@ -37,6 +37,14 @@ enum class ValueTypeCode : uint8_t { F64, // floating point (float, double) STR, // std::string FIXEDSTR16, // fixed-size string (length 16) + FIXEDSTR32, // fixed-size string (length 32) + FIXEDSTR64, // fixed-size string (length 64) + FIXEDSTR128, // fixed-size string (length 128) + FIXEDSTR256, // fixed-size string (length 256) + UMBRA, // Umbra String + NEWUMBRA, // Another Umbra Implementation + UNORDDICENCSTR, // Unordered Dictionary-Encoded String + ORDDICENCSTR, // ordered Dictionary-Encoded String INVALID, // only for JSON enum conversion // TODO Support bool as well, but poses some challenges (e.g. sizeof). // UI1 // boolean (bool) diff --git a/src/runtime/local/datastructures/ValueTypeUtils.cpp b/src/runtime/local/datastructures/ValueTypeUtils.cpp index 4c91b976f..70ee2c094 100644 --- a/src/runtime/local/datastructures/ValueTypeUtils.cpp +++ b/src/runtime/local/datastructures/ValueTypeUtils.cpp @@ -46,6 +46,22 @@ size_t ValueTypeUtils::sizeOf(ValueTypeCode type) { return sizeof(std::string); case ValueTypeCode::FIXEDSTR16: return sizeof(FixedStr16); + case ValueTypeCode::FIXEDSTR32: + return sizeof(FixedStr32); + case ValueTypeCode::FIXEDSTR64: + return sizeof(FixedStr64); + case ValueTypeCode::FIXEDSTR128: + return sizeof(FixedStr128); + case ValueTypeCode::FIXEDSTR256: + return sizeof(FixedStr256); + case ValueTypeCode::UMBRA: + return sizeof(Umbra_t); + case ValueTypeCode::NEWUMBRA: + return sizeof(NewUmbra_t); + case ValueTypeCode::UNORDDICENCSTR: + return sizeof(UnorderedDictionaryEncodedString); + case ValueTypeCode::ORDDICENCSTR: + return sizeof(OrderedDictionaryEncodedString); default: throw std::runtime_error("ValueTypeUtils::sizeOf: unknown value type code"); } @@ -97,6 +113,14 @@ template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode:: template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::F64; template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::STR; template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::FIXEDSTR16; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::FIXEDSTR32; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::FIXEDSTR64; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::FIXEDSTR128; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::FIXEDSTR256; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::UMBRA; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::NEWUMBRA; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::UNORDDICENCSTR; +template <> const ValueTypeCode ValueTypeUtils::codeFor = ValueTypeCode::ORDDICENCSTR; template <> const std::string ValueTypeUtils::cppNameFor = "int8_t"; template <> const std::string ValueTypeUtils::cppNameFor = "int32_t"; @@ -110,6 +134,14 @@ template <> const std::string ValueTypeUtils::cppNameFor = "bool"; template <> const std::string ValueTypeUtils::cppNameFor = "const char*"; template <> const std::string ValueTypeUtils::cppNameFor = "std::string"; template <> const std::string ValueTypeUtils::cppNameFor = "FixedStr"; +template <> const std::string ValueTypeUtils::cppNameFor = "FixedStr"; +template <> const std::string ValueTypeUtils::cppNameFor = "FixedStr"; +template <> const std::string ValueTypeUtils::cppNameFor = "FixedStr"; +template <> const std::string ValueTypeUtils::cppNameFor = "FixedStr"; +template <> const std::string ValueTypeUtils::cppNameFor = "Umbra"; +template <> const std::string ValueTypeUtils::cppNameFor = "NewUmbra"; +template <> const std::string ValueTypeUtils::cppNameFor = "UnorderedDictionaryEncodedString"; +template <> const std::string ValueTypeUtils::cppNameFor = "OrderedDictionaryEncodedString"; template <> const std::string ValueTypeUtils::irNameFor = "si8"; template <> const std::string ValueTypeUtils::irNameFor = "si32"; @@ -132,6 +164,14 @@ template <> const bool ValueTypeUtils::defaultValue = false; template <> const char *ValueTypeUtils::defaultValue = ""; template <> const std::string ValueTypeUtils::defaultValue = std::string(""); template <> const FixedStr16 ValueTypeUtils::defaultValue = FixedStr16(); +template <> const FixedStr32 ValueTypeUtils::defaultValue = FixedStr32(); +template <> const FixedStr64 ValueTypeUtils::defaultValue = FixedStr64(); +template <> const FixedStr128 ValueTypeUtils::defaultValue = FixedStr128(); +template <> const FixedStr256 ValueTypeUtils::defaultValue = FixedStr256(); +template <> const Umbra_t ValueTypeUtils::defaultValue = Umbra_t(); +template <> const NewUmbra_t ValueTypeUtils::defaultValue = NewUmbra_t(); +template <> const UnorderedDictionaryEncodedString ValueTypeUtils::defaultValue = UnorderedDictionaryEncodedString(); +template <> const OrderedDictionaryEncodedString ValueTypeUtils::defaultValue = OrderedDictionaryEncodedString(); const std::string ValueTypeUtils::cppNameForCode(ValueTypeCode type) { switch (type) { @@ -153,6 +193,14 @@ const std::string ValueTypeUtils::cppNameForCode(ValueTypeCode type) { return cppNameFor; case ValueTypeCode::STR: return cppNameFor; + case ValueTypeCode::UMBRA: + return cppNameFor; + case ValueTypeCode::NEWUMBRA: + return cppNameFor; + case ValueTypeCode::UNORDDICENCSTR: + return cppNameFor; + case ValueTypeCode::ORDDICENCSTR: + return cppNameFor; default: throw std::runtime_error("ValueTypeUtils::cppNameForCode: unknown value type code"); } diff --git a/src/runtime/local/datastructures/ValueTypeUtils.h b/src/runtime/local/datastructures/ValueTypeUtils.h index d8297cc2e..278efe1b8 100644 --- a/src/runtime/local/datastructures/ValueTypeUtils.h +++ b/src/runtime/local/datastructures/ValueTypeUtils.h @@ -16,7 +16,12 @@ #pragma once -#include +#include +#include +#include +#include +#include + #include #include @@ -30,7 +35,11 @@ // changes to the list of supported data types local. #define ALL_VALUE_TYPES int8_t, int32_t, int64_t, uint8_t, uint32_t, uint64_t, float, double -#define ALL_STRING_VALUE_TYPES std::string, FixedStr16 +#define ALL_STRING_VALUE_TYPES \ + std::string, FixedStr16, FixedStr32, FixedStr64, FixedStr128, FixedStr256, Umbra_t, NewUmbra_t, UnorderedDictionaryEncodedString, OrderedDictionaryEncodedString +#define FLEXIBLE_SIZE_STRING_VALUE_TYPES std::string, Umbra_t, NewUmbra_t, UnorderedDictionaryEncodedString, OrderedDictionaryEncodedString +#define FIXED_SIZE_STRING_VALUE_TYPES FixedStr16, FixedStr32, FixedStr64, FixedStr128, FixedStr256 + struct ValueTypeUtils { @@ -61,6 +70,14 @@ template <> const ValueTypeCode ValueTypeUtils::codeFor; template <> const ValueTypeCode ValueTypeUtils::codeFor; template <> const ValueTypeCode ValueTypeUtils::codeFor; template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; +template <> const ValueTypeCode ValueTypeUtils::codeFor; template <> const std::string ValueTypeUtils::cppNameFor; template <> const std::string ValueTypeUtils::cppNameFor; @@ -92,4 +109,15 @@ template <> const float ValueTypeUtils::defaultValue; template <> const double ValueTypeUtils::defaultValue; template <> const std::string ValueTypeUtils::defaultValue; template <> const FixedStr16 ValueTypeUtils::defaultValue; +template <> const FixedStr32 ValueTypeUtils::defaultValue; +template <> const FixedStr64 ValueTypeUtils::defaultValue; +template <> const FixedStr128 ValueTypeUtils::defaultValue; +template <> const FixedStr256 ValueTypeUtils::defaultValue; +template <> const UnorderedDictionaryEncodedString ValueTypeUtils::defaultValue; +template <> const OrderedDictionaryEncodedString ValueTypeUtils::defaultValue; + template <> const char *ValueTypeUtils::defaultValue; +template <> const Umbra_t ValueTypeUtils::defaultValue; +template <> const NewUmbra_t ValueTypeUtils::defaultValue; + + diff --git a/src/runtime/local/io/ReadCsvFile.h b/src/runtime/local/io/ReadCsvFile.h index 4cb208f45..7c6678bd5 100644 --- a/src/runtime/local/io/ReadCsvFile.h +++ b/src/runtime/local/io/ReadCsvFile.h @@ -185,6 +185,255 @@ template <> struct ReadCsvFile> { } }; +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + FixedStr32 *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + FixedStr64 *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + FixedStr128 *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + FixedStr256 *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + Umbra_t *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + NewUmbra_t *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + UnorderedDictionaryEncodedString *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + + +template <> struct ReadCsvFile> { + static void apply(DenseMatrix *&res, struct File *file, size_t numRows, size_t numCols, char delim) { + if (file == nullptr) + throw std::runtime_error("ReadCsvFile: requires a file to be specified (must not be nullptr)"); + if (numRows <= 0) + throw std::runtime_error("ReadCsvFile: numRows must be > 0"); + if (numCols <= 0) + throw std::runtime_error("ReadCsvFile: numCols must be > 0"); + + if (res == nullptr) { + res = DataObjectFactory::create>(numRows, numCols, false); + } + + size_t cell = 0; + OrderedDictionaryEncodedString *valuesRes = res->getValues(); + + for (size_t r = 0; r < numRows; r++) { + if (getFileLine(file) == -1) + throw std::runtime_error("ReadCsvFile::apply: getFileLine failed"); + + size_t pos = 0; + for (size_t c = 0; c < numCols; c++) { + std::string val(""); + pos = setCString(file, pos, &val, delim) + 1; + // TODO This assumes that rowSkip == numCols. + valuesRes[cell++].set(val.c_str()); + } + } + } +}; + // ---------------------------------------------------------------------------- // CSRMatrix // ---------------------------------------------------------------------------- @@ -375,6 +624,54 @@ template <> struct ReadCsvFile { reinterpret_cast(rawCols[col])[row] = FixedStr16(val_str); break; } + case ValueTypeCode::FIXEDSTR32: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = FixedStr32(val_str); + break; + } + case ValueTypeCode::FIXEDSTR64: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = FixedStr64(val_str); + break; + } + case ValueTypeCode::FIXEDSTR128: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = FixedStr128(val_str); + break; + } + case ValueTypeCode::FIXEDSTR256: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = FixedStr256(val_str); + break; + } + case ValueTypeCode::UMBRA: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = Umbra_t(val_str); + break; + } + case ValueTypeCode::NEWUMBRA: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = NewUmbra_t(val_str); + break; + } + case ValueTypeCode::UNORDDICENCSTR: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = UnorderedDictionaryEncodedString(val_str); + break; + } + case ValueTypeCode::ORDDICENCSTR: { + std::string val_str = ""; + pos = setCString(file, pos, &val_str, delim); + reinterpret_cast(rawCols[col])[row] = OrderedDictionaryEncodedString(val_str); + break; + } default: throw std::runtime_error("ReadCsvFile::apply: unknown value type code"); } diff --git a/src/runtime/local/kernels/BinaryOpCode.h b/src/runtime/local/kernels/BinaryOpCode.h index 9fc55fd53..ecb297c94 100644 --- a/src/runtime/local/kernels/BinaryOpCode.h +++ b/src/runtime/local/kernels/BinaryOpCode.h @@ -181,17 +181,49 @@ SUPPORT_NUMERIC_INT(uint8_t) // Strings binary operations. SUPPORT_EQUALITY_RLR(int64_t, std::string, std::string) SUPPORT_EQUALITY_RLR(int64_t, FixedStr16, FixedStr16) +SUPPORT_EQUALITY_RLR(int64_t, FixedStr32, FixedStr32) +SUPPORT_EQUALITY_RLR(int64_t, FixedStr64, FixedStr64) +SUPPORT_EQUALITY_RLR(int64_t, FixedStr128, FixedStr128) +SUPPORT_EQUALITY_RLR(int64_t, FixedStr256, FixedStr256) +SUPPORT_EQUALITY_RLR(int64_t, Umbra_t, Umbra_t) +SUPPORT_EQUALITY_RLR(int64_t, NewUmbra_t, NewUmbra_t) +SUPPORT_EQUALITY_RLR(int64_t, UnorderedDictionaryEncodedString, UnorderedDictionaryEncodedString) +SUPPORT_EQUALITY_RLR(int64_t, OrderedDictionaryEncodedString, OrderedDictionaryEncodedString) SUPPORT_EQUALITY_RLR(int64_t, const char *, const char *) SUPPORT_EQUALITY_RLR(int64_t, std::string, const char *) + SUPPORT_COMPARISONS_RLR(int64_t, std::string, std::string) SUPPORT_COMPARISONS_RLR(int64_t, FixedStr16, FixedStr16) +SUPPORT_COMPARISONS_RLR(int64_t, FixedStr32, FixedStr32) +SUPPORT_COMPARISONS_RLR(int64_t, FixedStr64, FixedStr64) +SUPPORT_COMPARISONS_RLR(int64_t, FixedStr128, FixedStr128) +SUPPORT_COMPARISONS_RLR(int64_t, FixedStr256, FixedStr256) +SUPPORT_COMPARISONS_RLR(int64_t, Umbra_t, Umbra_t) +SUPPORT_COMPARISONS_RLR(int64_t, NewUmbra_t, NewUmbra_t) +SUPPORT_COMPARISONS_RLR(int64_t, UnorderedDictionaryEncodedString, UnorderedDictionaryEncodedString) +SUPPORT_COMPARISONS_RLR(int64_t, OrderedDictionaryEncodedString, OrderedDictionaryEncodedString) SUPPORT_COMPARISONS_RLR(int64_t, std::string, const char *) + + SUPPORT_COMPARISONS_EQUAL_RLR(int64_t, std::string, std::string) SUPPORT_COMPARISONS_EQUAL_RLR(int64_t, std::string, const char *) + SUPPORT_STRING_RLR(std::string, std::string, std::string) +SUPPORT_STRING_RLR(Umbra_t, Umbra_t, Umbra_t) +SUPPORT_STRING_RLR(NewUmbra_t, NewUmbra_t, NewUmbra_t) SUPPORT_STRING_RLR(std::string, FixedStr16, FixedStr16) +SUPPORT_STRING_RLR(std::string, FixedStr32, FixedStr32) +SUPPORT_STRING_RLR(std::string, FixedStr64, FixedStr64) +SUPPORT_STRING_RLR(std::string, FixedStr128, FixedStr128) +SUPPORT_STRING_RLR(std::string, FixedStr256, FixedStr256) +SUPPORT_STRING_RLR(UnorderedDictionaryEncodedString, UnorderedDictionaryEncodedString, UnorderedDictionaryEncodedString) +SUPPORT_STRING_RLR(UnorderedDictionaryEncodedString, UnorderedDictionaryEncodedString, const char *) +SUPPORT_STRING_RLR(OrderedDictionaryEncodedString, OrderedDictionaryEncodedString, OrderedDictionaryEncodedString) +SUPPORT_STRING_RLR(OrderedDictionaryEncodedString, OrderedDictionaryEncodedString, const char *) SUPPORT_STRING_RLR(const char *, const char *, const char *) SUPPORT_STRING_RLR(std::string, std::string, const char *) +SUPPORT_STRING_RLR(Umbra_t, Umbra_t, const char *) +SUPPORT_STRING_RLR(NewUmbra_t, NewUmbra_t, const char *) // Undefine helper macros. #undef SUPPORT diff --git a/src/runtime/local/kernels/CastSca.h b/src/runtime/local/kernels/CastSca.h index 547fc6c0a..6076d7a4f 100644 --- a/src/runtime/local/kernels/CastSca.h +++ b/src/runtime/local/kernels/CastSca.h @@ -123,6 +123,190 @@ template struct CastSca { } }; +template struct CastSca { + static VTRes apply(FixedStr32 arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.buffer)); + else + return static_cast(std::stoll(arg.buffer)); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.buffer)); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.buffer)); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + +template struct CastSca { + static VTRes apply(FixedStr64 arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.buffer)); + else + return static_cast(std::stoll(arg.buffer)); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.buffer)); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.buffer)); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + +template struct CastSca { + static VTRes apply(FixedStr128 arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.buffer)); + else + return static_cast(std::stoll(arg.buffer)); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.buffer)); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.buffer)); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + +template struct CastSca { + static VTRes apply(FixedStr256 arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.buffer)); + else + return static_cast(std::stoll(arg.buffer)); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.buffer)); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.buffer)); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + +template struct CastSca { + static VTRes apply(Umbra_t arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.get())); + else + return static_cast(std::stoll(arg.get())); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.get())); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.get())); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + +template struct CastSca { + static VTRes apply(NewUmbra_t arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.get())); + else + return static_cast(std::stoll(arg.get())); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.get())); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.get())); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + +template struct CastSca { + static VTRes apply(UnorderedDictionaryEncodedString arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.to_string())); + else + return static_cast(std::stoll(arg.to_string())); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.to_string())); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.to_string())); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + +template struct CastSca { + static VTRes apply(OrderedDictionaryEncodedString arg, DCTX(ctx)) { + if constexpr (std::is_integral::value) { + if constexpr (std::is_unsigned::value) + return static_cast(std::stoull(arg.to_string())); + else + return static_cast(std::stoll(arg.to_string())); + } else if constexpr (std::is_same::value) + return static_cast(std::stold(arg.to_string())); + else if constexpr (std::is_same::value) + return static_cast(std::stof(arg.to_string())); + else { + // Trigger a compiler warning using deprecated attribute. + return throwUnsupportedType(arg); + } + } + + [[deprecated("CastSca: Warning! Unsupported result type in casting string values.")]] + static VTRes throwUnsupportedType(std::string arg) { + throw std::runtime_error("CastSca: Unsupported result type in casting string values"); + } +}; + // ---------------------------------------------------------------------------- // string <- string // ---------------------------------------------------------------------------- diff --git a/src/runtime/local/kernels/OneHot.h b/src/runtime/local/kernels/OneHot.h index 1ebe430bb..be9fdffdc 100644 --- a/src/runtime/local/kernels/OneHot.h +++ b/src/runtime/local/kernels/OneHot.h @@ -170,6 +170,62 @@ template struct OneHot, DenseMatrix> { } }; +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + +template struct OneHot, DenseMatrix> { + static void apply(DenseMatrix *&res, const DenseMatrix *arg, const DenseMatrix *info, + DCTX(ctx)) { + oneHotString(res, arg, info, ctx); + } +}; + // ---------------------------------------------------------------------------- // Matrix <- Matrix // ---------------------------------------------------------------------------- diff --git a/src/runtime/local/kernels/UnaryOpCode.h b/src/runtime/local/kernels/UnaryOpCode.h index 063b2cc34..c5391c8fd 100644 --- a/src/runtime/local/kernels/UnaryOpCode.h +++ b/src/runtime/local/kernels/UnaryOpCode.h @@ -19,7 +19,12 @@ #pragma once -#include +#include +#include +#include +#include +#include + // **************************************************************************** // Enum for unary op codes and their names @@ -140,6 +145,14 @@ SUPPORT_NUMERIC(uint8_t) // String operations SUPPORT_STRING(std::string) SUPPORT_STRING(FixedStr16) +SUPPORT_STRING(FixedStr32) +SUPPORT_STRING(FixedStr64) +SUPPORT_STRING(FixedStr128) +SUPPORT_STRING(FixedStr256) +SUPPORT_STRING(Umbra_t) +SUPPORT_STRING(NewUmbra_t) +SUPPORT_STRING(UnorderedDictionaryEncodedString) +SUPPORT_STRING(OrderedDictionaryEncodedString) SUPPORT_STRING(const char *) // Undefine helper macros. diff --git a/test/runtime/local/kernels/CastObjTest.cpp b/test/runtime/local/kernels/CastObjTest.cpp index d66d748e0..794911643 100644 --- a/test/runtime/local/kernels/CastObjTest.cpp +++ b/test/runtime/local/kernels/CastObjTest.cpp @@ -229,6 +229,59 @@ TEMPLATE_PRODUCT_TEST_CASE("castObj, DenseMatrix to DenseMatrix, FixedStr16("1.1"), FixedStr16("5.1"), FixedStr16("9.1")}); DTRes *res_FixedStr16 = nullptr; + auto arg_FixedStr32 = + genGivenVals>(numRows, {FixedStr32("3.1"), FixedStr32("1.1"), FixedStr32("4.1"), + FixedStr32("1.1"), FixedStr32("5.1"), FixedStr32("9.1")}); + DTRes *res_FixedStr32 = nullptr; + + auto arg_FixedStr64 = + genGivenVals>(numRows, {FixedStr64("3.1"), FixedStr64("1.1"), FixedStr64("4.1"), + FixedStr64("1.1"), FixedStr64("5.1"), FixedStr64("9.1")}); + DTRes *res_FixedStr64 = nullptr; + + auto arg_FixedStr128 = + genGivenVals>(numRows, {FixedStr128("3.1"), FixedStr128("1.1"), FixedStr128("4.1"), + FixedStr128("1.1"), FixedStr128("5.1"), FixedStr128("9.1")}); + DTRes *res_FixedStr128 = nullptr; + + auto arg_FixedStr256 = + genGivenVals>(numRows, {FixedStr256("3.1"), FixedStr256("1.1"), FixedStr256("4.1"), + FixedStr256("1.1"), FixedStr256("5.1"), FixedStr256("9.1")}); + DTRes *res_FixedStr256 = nullptr; + + auto arg_Umbra_t = + genGivenVals>(numRows, { + Umbra_t("3.1"), Umbra_t("1.1"), Umbra_t("4.1"), + Umbra_t("1.1"), Umbra_t("5.1"), Umbra_t("9.1") + }); + + DTRes *res_Umbra_t = nullptr; + + auto arg_NewUmbra_t = + genGivenVals>(numRows, { + NewUmbra_t("3.1"), NewUmbra_t("1.1"), NewUmbra_t("4.1"), + NewUmbra_t("1.1"), NewUmbra_t("5.1"), NewUmbra_t("9.1") + }); + + DTRes *res_NewUmbra_t = nullptr; + + auto arg_UnorderedDictionaryEncodedString = + genGivenVals>(numRows, { + UnorderedDictionaryEncodedString("3.1"), UnorderedDictionaryEncodedString("1.1"), UnorderedDictionaryEncodedString("4.1"), + UnorderedDictionaryEncodedString("1.1"), UnorderedDictionaryEncodedString("5.1"), UnorderedDictionaryEncodedString("9.1") + }); + + DTRes *res_UnorderedDictionaryEncodedString = nullptr; + + auto arg_OrderedDictionaryEncodedString = + genGivenVals>(numRows, { + OrderedDictionaryEncodedString("3.1"), OrderedDictionaryEncodedString("1.1"), OrderedDictionaryEncodedString("4.1"), + OrderedDictionaryEncodedString("1.1"), OrderedDictionaryEncodedString("5.1"), OrderedDictionaryEncodedString("9.1") + }); + + DTRes *res_OrderedDictionaryEncodedString = nullptr; + + auto check = genGivenVals>( numRows, {VTRes(3.1), VTRes(1.1), VTRes(4.1), VTRes(1.1), VTRes(5.1), VTRes(9.1)}); @@ -238,9 +291,33 @@ TEMPLATE_PRODUCT_TEST_CASE("castObj, DenseMatrix to DenseMatrix, castObj, DenseMatrix>(res_FixedStr16, arg_FixedStr16, nullptr); CHECK(*res_FixedStr16 == *check); + castObj, DenseMatrix>(res_FixedStr32, arg_FixedStr32, nullptr); + CHECK(*res_FixedStr32 == *check); + + castObj, DenseMatrix>(res_FixedStr64, arg_FixedStr64, nullptr); + CHECK(*res_FixedStr64 == *check); + + castObj, DenseMatrix>(res_FixedStr128, arg_FixedStr128, nullptr); + CHECK(*res_FixedStr128 == *check); + + castObj, DenseMatrix>(res_FixedStr256, arg_FixedStr256, nullptr); + CHECK(*res_FixedStr256 == *check); + + castObj, DenseMatrix>(res_Umbra_t, arg_Umbra_t, nullptr); + CHECK(*res_Umbra_t == *check); + + castObj, DenseMatrix>(res_NewUmbra_t, arg_NewUmbra_t, nullptr); + CHECK(*res_NewUmbra_t == *check); + + castObj, DenseMatrix>(res_UnorderedDictionaryEncodedString, arg_UnorderedDictionaryEncodedString, nullptr); + CHECK(*res_UnorderedDictionaryEncodedString == *check); + + castObj, DenseMatrix>(res_OrderedDictionaryEncodedString, arg_OrderedDictionaryEncodedString, nullptr); + CHECK(*res_OrderedDictionaryEncodedString == *check); + DataObjectFactory::destroy(check); - DataObjectFactory::destroy(res_stdSTR, res_FixedStr16); - DataObjectFactory::destroy(arg_stdSTR, arg_FixedStr16); + DataObjectFactory::destroy(res_stdSTR, res_FixedStr16, res_FixedStr32, res_FixedStr64, res_FixedStr128, res_FixedStr256, res_Umbra_t, res_NewUmbra_t, res_UnorderedDictionaryEncodedString, res_OrderedDictionaryEncodedString); + DataObjectFactory::destroy(arg_stdSTR, arg_FixedStr16, arg_FixedStr32, arg_FixedStr64, arg_FixedStr128, arg_FixedStr256, arg_Umbra_t, arg_NewUmbra_t, arg_UnorderedDictionaryEncodedString, arg_OrderedDictionaryEncodedString); } TEMPLATE_PRODUCT_TEST_CASE("castObj, DenseMatrix to DenseMatrix, int64_t", TAG_KERNELS, (DenseMatrix), @@ -286,6 +363,152 @@ TEMPLATE_PRODUCT_TEST_CASE("castObj, DenseMatrix to DenseMatrix DataObjectFactory::destroy(res_FixedStr16); DataObjectFactory::destroy(arg_FixedStr16); } + + SECTION("FixedStr32") { + auto arg_FixedStr32 = genGivenVals>( + numRows, {FixedStr32("123456789012345"), FixedStr32("123456789012344"), FixedStr32("123456789012343"), + FixedStr32("123456789012342"), FixedStr32("123456789012341"), FixedStr32("123456789012340")}); + DTRes *res_FixedStr32 = nullptr; + auto check_FixedStr32 = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_FixedStr32, arg_FixedStr32, nullptr); + + CHECK(*res_FixedStr32 == *check_FixedStr32); + + DataObjectFactory::destroy(check_FixedStr32); + DataObjectFactory::destroy(res_FixedStr32); + DataObjectFactory::destroy(arg_FixedStr32); + } + + SECTION("FixedStr64") { + auto arg_FixedStr64 = genGivenVals>( + numRows, {FixedStr64("123456789012345"), FixedStr64("123456789012344"), FixedStr64("123456789012343"), + FixedStr64("123456789012342"), FixedStr64("123456789012341"), FixedStr64("123456789012340")}); + DTRes *res_FixedStr64 = nullptr; + auto check_FixedStr64 = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_FixedStr64, arg_FixedStr64, nullptr); + + CHECK(*res_FixedStr64 == *check_FixedStr64); + + DataObjectFactory::destroy(check_FixedStr64); + DataObjectFactory::destroy(res_FixedStr64); + DataObjectFactory::destroy(arg_FixedStr64); + } + + SECTION("FixedStr128") { + auto arg_FixedStr128 = genGivenVals>( + numRows, {FixedStr128("123456789012345"), FixedStr128("123456789012344"), FixedStr128("123456789012343"), + FixedStr128("123456789012342"), FixedStr128("123456789012341"), FixedStr128("123456789012340")}); + DTRes *res_FixedStr128 = nullptr; + auto check_FixedStr128 = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_FixedStr128, arg_FixedStr128, nullptr); + + CHECK(*res_FixedStr128 == *check_FixedStr128); + + DataObjectFactory::destroy(check_FixedStr128); + DataObjectFactory::destroy(res_FixedStr128); + DataObjectFactory::destroy(arg_FixedStr128); + } + + SECTION("FixedStr256") { + auto arg_FixedStr256 = genGivenVals>( + numRows, {FixedStr256("123456789012345"), FixedStr256("123456789012344"), FixedStr256("123456789012343"), + FixedStr256("123456789012342"), FixedStr256("123456789012341"), FixedStr256("123456789012340")}); + DTRes *res_FixedStr256 = nullptr; + auto check_FixedStr256 = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_FixedStr256, arg_FixedStr256, nullptr); + + CHECK(*res_FixedStr256 == *check_FixedStr256); + + DataObjectFactory::destroy(check_FixedStr256); + DataObjectFactory::destroy(res_FixedStr256); + DataObjectFactory::destroy(arg_FixedStr256); + } + + SECTION("Umbra_t") { + auto arg_Umbra_t = genGivenVals>( + numRows, {Umbra_t("123456789012345"), Umbra_t("123456789012344"), Umbra_t("123456789012343"), + Umbra_t("123456789012342"), Umbra_t("123456789012341"), Umbra_t("123456789012340")}); + DTRes *res_Umbra_t = nullptr; + auto check_Umbra_t = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_Umbra_t, arg_Umbra_t, nullptr); + + CHECK(*res_Umbra_t == *check_Umbra_t); + + DataObjectFactory::destroy(check_Umbra_t); + DataObjectFactory::destroy(res_Umbra_t); + DataObjectFactory::destroy(arg_Umbra_t); + } + + SECTION("NewUmbra_t") { + auto arg_NewUmbra_t = genGivenVals>( + numRows, {NewUmbra_t("123456789012345"), NewUmbra_t("123456789012344"), NewUmbra_t("123456789012343"), + NewUmbra_t("123456789012342"), NewUmbra_t("123456789012341"), NewUmbra_t("123456789012340")}); + DTRes *res_NewUmbra_t = nullptr; + auto check_NewUmbra_t = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_NewUmbra_t, arg_NewUmbra_t, nullptr); + + CHECK(*res_NewUmbra_t == *check_NewUmbra_t); + + DataObjectFactory::destroy(check_NewUmbra_t); + DataObjectFactory::destroy(res_NewUmbra_t); + DataObjectFactory::destroy(arg_NewUmbra_t); + } + + SECTION("UnorderedDictionaryEncodedString") { + auto arg_UnorderedDictionaryEncodedString = genGivenVals>( + numRows, { + UnorderedDictionaryEncodedString("123456789012345"), UnorderedDictionaryEncodedString("123456789012344"), UnorderedDictionaryEncodedString("123456789012343"), + UnorderedDictionaryEncodedString("123456789012342"), UnorderedDictionaryEncodedString("123456789012341"), UnorderedDictionaryEncodedString("123456789012340")}); + DTRes *res_UnorderedDictionaryEncodedString = nullptr; + auto check_UnorderedDictionaryEncodedString = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_UnorderedDictionaryEncodedString, arg_UnorderedDictionaryEncodedString, nullptr); + + CHECK(*res_UnorderedDictionaryEncodedString == *check_UnorderedDictionaryEncodedString); + + DataObjectFactory::destroy(check_UnorderedDictionaryEncodedString); + DataObjectFactory::destroy(res_UnorderedDictionaryEncodedString); + DataObjectFactory::destroy(arg_UnorderedDictionaryEncodedString); + } + + SECTION("OrderedDictionaryEncodedString") { + auto arg_OrderedDictionaryEncodedString = genGivenVals>( + numRows, { + OrderedDictionaryEncodedString("123456789012345"), OrderedDictionaryEncodedString("123456789012344"), OrderedDictionaryEncodedString("123456789012343"), + OrderedDictionaryEncodedString("123456789012342"), OrderedDictionaryEncodedString("123456789012341"), OrderedDictionaryEncodedString("123456789012340")}); + DTRes *res_OrderedDictionaryEncodedString = nullptr; + auto check_OrderedDictionaryEncodedString = + genGivenVals>(numRows, {123456789012345, 123456789012344, 123456789012343, + 123456789012342, 123456789012341, 123456789012340}); + + castObj, DenseMatrix>(res_OrderedDictionaryEncodedString, arg_OrderedDictionaryEncodedString, nullptr); + + CHECK(*res_OrderedDictionaryEncodedString == *check_OrderedDictionaryEncodedString); + + DataObjectFactory::destroy(check_OrderedDictionaryEncodedString); + DataObjectFactory::destroy(res_OrderedDictionaryEncodedString); + DataObjectFactory::destroy(arg_OrderedDictionaryEncodedString); + } } TEMPLATE_PRODUCT_TEST_CASE("castObj, matrix to matrix, single dim", TAG_KERNELS, (DenseMatrix), diff --git a/test/runtime/local/kernels/CastScaTest.cpp b/test/runtime/local/kernels/CastScaTest.cpp index d1143db38..49e4cd1a3 100644 --- a/test/runtime/local/kernels/CastScaTest.cpp +++ b/test/runtime/local/kernels/CastScaTest.cpp @@ -73,4 +73,92 @@ TEST_CASE("castSca, actual casts strings to numbers", TAG_KERNELS) { CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); + + CHECK(castSca("123", nullptr) == 123); + CHECK(castSca("-123", nullptr) == -123); + CHECK(castSca("0", nullptr) == 0); + CHECK(castSca("123.4", nullptr) == 123.4); + CHECK(castSca("-123.4", nullptr) == -123.4); + CHECK(castSca("0.0", nullptr) == 0.0); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ll); + CHECK(castSca("-12345678901234", nullptr) == -12345678901234ll); + CHECK(castSca("123456789012345", nullptr) == 123456789012345ull); + CHECK(castSca("0", nullptr) == std::numeric_limits::min()); } diff --git a/test/runtime/local/kernels/EwBinaryMatTest.cpp b/test/runtime/local/kernels/EwBinaryMatTest.cpp index 648a1b232..587e35f0c 100644 --- a/test/runtime/local/kernels/EwBinaryMatTest.cpp +++ b/test/runtime/local/kernels/EwBinaryMatTest.cpp @@ -14,578 +14,605 @@ * limitations under the License. */ -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include - -#include - -#define TEST_NAME(opName) "EwBinaryMat (" opName ")" -#define DATA_TYPES DenseMatrix, CSRMatrix, Matrix -#define VALUE_TYPES double, uint32_t -// CSRMatrix currently only supports ADD and MUL opCodes -#define DATA_TYPES_NO_CSR DenseMatrix, Matrix - -template -void checkEwBinaryMat(BinaryOpCode opCode, const DTArg *lhs, const DTArg *rhs, const DTRes *exp) { - DTRes *res = nullptr; - ewBinaryMat(opCode, res, lhs, rhs, nullptr); - CHECK(*res == *exp); -} - -template void checkEwBinaryMat(BinaryOpCode opCode, const DT *lhs, const DT *rhs, const DT *exp) { - DT *res = nullptr; - ewBinaryMat(opCode, res, lhs, rhs, nullptr); - CHECK(*res == *exp); -} - -template -void checkSparseDenseEwBinaryMat(BinaryOpCode opCode, const SparseDT *lhs, const DT *rhs, const SparseDT *exp) { - SparseDT *res = nullptr; - ewBinaryMat(opCode, res, lhs, rhs, nullptr); - CHECK(*res == *exp); -} - -// **************************************************************************** -// Arithmetic -// **************************************************************************** - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("add"), TAG_KERNELS, (DATA_TYPES), (VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - - auto m0 = genGivenVals
(4, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - auto m1 = genGivenVals
(4, { - 1, 2, 0, 0, 1, 3, 0, 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - DT *m2 = nullptr; - DT *m3 = nullptr; - if (std::is_unsigned_v) { - m2 = genGivenVals
(4, { - 0, 0, 0, 0, 0, 0, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, - }); - m3 = genGivenVals
(4, { - 1, 2, 0, 0, 1, 3, 1, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, - }); - } else { - m2 = genGivenVals
(4, { - VT(-1), 0, 0, 0, 0, 0, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, - }); - m3 = genGivenVals
(4, { - 0, 2, 0, 0, 1, 3, 1, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, - }); - } - - checkEwBinaryMat(BinaryOpCode::ADD, m0, m0, m0); - checkEwBinaryMat(BinaryOpCode::ADD, m1, m0, m1); - checkEwBinaryMat(BinaryOpCode::ADD, m1, m2, m3); - - DataObjectFactory::destroy(m0, m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("mul"), TAG_KERNELS, (DATA_TYPES), (VALUE_TYPES)) { - using DT = TestType; - - auto m0 = genGivenVals
(4, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - auto m1 = genGivenVals
(4, { - 1, 2, 0, 0, 1, 3, 0, 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - auto m2 = genGivenVals
(4, { + #include + #include + #include + #include + #include + + #include + + #include + + #include + #include + + #include + + #define TEST_NAME(opName) "EwBinaryMat (" opName ")" + #define DATA_TYPES DenseMatrix, CSRMatrix, Matrix + #define VALUE_TYPES double, uint32_t + // CSRMatrix currently only supports ADD and MUL opCodes + #define DATA_TYPES_NO_CSR DenseMatrix, Matrix + + template + void checkEwBinaryMat(BinaryOpCode opCode, const DTArg *lhs, const DTArg *rhs, const DTRes *exp) { + DTRes *res = nullptr; + ewBinaryMat(opCode, res, lhs, rhs, nullptr); + CHECK(*res == *exp); + } + + template void checkEwBinaryMat(BinaryOpCode opCode, const DT *lhs, const DT *rhs, const DT *exp) { + DT *res = nullptr; + ewBinaryMat(opCode, res, lhs, rhs, nullptr); + CHECK(*res == *exp); + } + + template + void checkSparseDenseEwBinaryMat(BinaryOpCode opCode, const SparseDT *lhs, const DT *rhs, const SparseDT *exp) { + SparseDT *res = nullptr; + ewBinaryMat(opCode, res, lhs, rhs, nullptr); + CHECK(*res == *exp); + } + + // **************************************************************************** + // Arithmetic + // **************************************************************************** + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("add"), TAG_KERNELS, (DATA_TYPES), (VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m0 = genGivenVals
(4, { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + auto m1 = genGivenVals
(4, { + 1, 2, 0, 0, 1, 3, 0, 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + DT *m2 = nullptr; + DT *m3 = nullptr; + if (std::is_unsigned_v) { + m2 = genGivenVals
(4, { 0, 0, 0, 0, 0, 0, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, }); - auto m3 = genGivenVals
(4, { - 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - - checkEwBinaryMat(BinaryOpCode::MUL, m0, m0, m0); - checkEwBinaryMat(BinaryOpCode::MUL, m1, m0, m0); - checkEwBinaryMat(BinaryOpCode::MUL, m1, m2, m3); - - DataObjectFactory::destroy(m0, m1, m2, m3); -} - -TEMPLATE_TEST_CASE(TEST_NAME("mul_sparse_dense"), TAG_KERNELS, VALUE_TYPES) { - // TODO: all Dense - CSR combinations - using VT = TestType; - using SparseDT = CSRMatrix; - using DT = DenseMatrix; - - auto m0 = genGivenVals(4, { - 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - - auto m1 = genGivenVals
(4, { - 1, 2, 0, 0, 1, 3, 0, 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - auto m2 = genGivenVals
(4, { - 3, 0, 3, 3, 3, 3, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 3, 2, - }); - auto m3 = genGivenVals
(4, { - 0, 1, 1, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - auto exp0 = genGivenVals(4, { - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - auto exp1 = genGivenVals(4, { - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }); - - checkSparseDenseEwBinaryMat(BinaryOpCode::MUL, m0, m1, exp0); - checkSparseDenseEwBinaryMat(BinaryOpCode::MUL, m0, m2, exp1); - checkSparseDenseEwBinaryMat(BinaryOpCode::MUL, m0, m3, m0); - - DataObjectFactory::destroy(m0, m1, m2, m3, exp0, exp1); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("div"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m0 = genGivenVals
(2, { - 0, - 0, - 0, - 0, - 0, - 0, - }); - auto m1 = genGivenVals
(2, { - 1, - 2, - 4, - 6, - 8, - 9, - }); - auto m2 = genGivenVals
(2, { - 1, - 2, - 2, - 2, - 4, - 3, - }); - auto m3 = genGivenVals
(2, { - 1, - 1, - 2, - 3, - 2, - 3, - }); - - checkEwBinaryMat(BinaryOpCode::DIV, m0, m1, m0); - checkEwBinaryMat(BinaryOpCode::DIV, m1, m2, m3); - - DataObjectFactory::destroy(m0, m1, m2, m3); -} - -// **************************************************************************** -// Comparisons -// **************************************************************************** - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - - auto m1 = genGivenVals
(2, {VT("1"), VT("2"), VT("abc"), VT("abcd"), VT("ABCD"), VT("34ab")}); - auto m2 = genGivenVals
(2, {VT("1"), VT("0"), VT("3"), VT("abcd"), VT("abcd"), VT("34ab")}); - auto m3 = genGivenVals>(2, {1, 0, 0, 1, 0, 1}); - - SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::EQ, m1, m2, m3); } - - DataObjectFactory::destroy(m1); - DataObjectFactory::destroy(m2); - DataObjectFactory::destroy(m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - - auto m1 = genGivenVals
(2, {VT("1"), VT("2"), VT("abc"), VT("abcd"), VT("ABCD"), VT("34ab")}); - auto m2 = genGivenVals
(2, {VT("1"), VT("0"), VT("3"), VT("abcd"), VT("abcd"), VT("34ab")}); - auto m3 = genGivenVals>(2, {0, 1, 1, 0, 1, 0}); - - SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::NEQ, m1, m2, m3); } - - DataObjectFactory::destroy(m1); - DataObjectFactory::destroy(m2); - DataObjectFactory::destroy(m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 3, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 1, - 0, - 1, - 1, - 0, - 0, - }); - - checkEwBinaryMat(BinaryOpCode::EQ, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 3, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 0, - 1, - 0, - 0, - 1, - 1, - }); - - checkEwBinaryMat(BinaryOpCode::NEQ, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 4, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 0, - 0, - 1, - 0, - 0, - 1, - }); - - checkEwBinaryMat(BinaryOpCode::LT, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - - auto m1 = genGivenVals
( - 3, {VT("1"), VT("2"), VT("1"), VT("abc"), VT("abcd"), VT("abcd"), VT("abcd"), VT("ABC"), VT("35abcd")}); - auto m2 = genGivenVals
( - 3, {VT("1"), VT("0"), VT("3"), VT("abcd"), VT("abce"), VT("abcd"), VT("abc"), VT("abc"), VT("30abcd")}); - auto m3 = genGivenVals>(3, {0, 0, 1, 1, 1, 0, 0, 1, 0}); - - SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::LT, m1, m2, m3); } - - DataObjectFactory::destroy(m1); - DataObjectFactory::destroy(m2); - DataObjectFactory::destroy(m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("le"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 4, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 1, - 0, - 1, - 1, - 0, - 1, - }); - - checkEwBinaryMat(BinaryOpCode::LE, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 4, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 0, - 1, - 0, - 0, - 1, - 0, - }); - - checkEwBinaryMat(BinaryOpCode::GT, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - - auto m1 = genGivenVals
( - 3, {VT("1"), VT("2"), VT("1"), VT("abc"), VT("abcd"), VT("abcd"), VT("abcd"), VT("ABC"), VT("35abcd")}); - auto m2 = genGivenVals
( - 3, {VT("1"), VT("0"), VT("3"), VT("abcd"), VT("abce"), VT("abcd"), VT("abc"), VT("abc"), VT("30abcd")}); - auto m3 = genGivenVals>(3, {0, 1, 0, 0, 0, 0, 1, 0, 1}); - - SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::GT, m1, m2, m3); } - - DataObjectFactory::destroy(m1); - DataObjectFactory::destroy(m2); - DataObjectFactory::destroy(m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("ge"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 4, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 1, - 1, - 0, - 1, - 1, - 0, - }); - - checkEwBinaryMat(BinaryOpCode::GE, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -// **************************************************************************** -// Min/max -// **************************************************************************** - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("min"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 4, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 1, - 0, - 3, - 4, - 4, - 6, - }); - - checkEwBinaryMat(BinaryOpCode::MIN, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("max"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - - auto m1 = genGivenVals
(2, { - 1, - 2, - 3, - 4, - 5, - 6, - }); - auto m2 = genGivenVals
(2, { - 1, - 0, - 4, - 4, - 4, - 9, - }); - auto m3 = genGivenVals
(2, { - 1, - 2, - 4, - 4, - 5, - 9, - }); - - checkEwBinaryMat(BinaryOpCode::MAX, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -// **************************************************************************** -// Logical -// **************************************************************************** - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("and"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - - auto m1 = genGivenVals
(1, {0, 0, 1, 1, 0, 2, 2, 0, VT(-2), VT(-2)}); - auto m2 = genGivenVals
(1, {0, 1, 0, 1, 2, 0, 2, VT(-2), 0, VT(-2)}); - auto m3 = genGivenVals
(1, {0, 0, 0, 1, 0, 0, 1, 0, 0, 1}); - - checkEwBinaryMat(BinaryOpCode::AND, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("or"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - - auto m1 = genGivenVals
(1, {0, 0, 1, 1, 0, 2, 2, 0, VT(-2), VT(-2)}); - auto m2 = genGivenVals
(1, {0, 1, 0, 1, 2, 0, 2, VT(-2), 0, VT(-2)}); - auto m3 = genGivenVals
(1, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}); - - checkEwBinaryMat(BinaryOpCode::OR, m1, m2, m3); - - DataObjectFactory::destroy(m1, m2, m3); -} - -// **************************************************************************** -// string. -// **************************************************************************** - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("concat"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { - using DT = TestType; - using VT = typename DT::VT; - using VTr = std::string; - - auto m1 = genGivenVals
(2, {VT("1"), VT("2"), VT(""), VT(""), VT("ab"), VT("abcd")}); - auto m2 = genGivenVals
(2, {VT(""), VT("0"), VT(""), VT("abc"), VT("ce"), VT("abcd")}); - auto m3 = - genGivenVals>(2, {VTr("1"), VTr("20"), VTr(""), VTr("abc"), VTr("abce"), VTr("abcdabcd")}); - - SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::CONCAT, m1, m2, m3); } - - DataObjectFactory::destroy(m1); - DataObjectFactory::destroy(m2); - DataObjectFactory::destroy(m3); -} - -// **************************************************************************** -// Invalid op-code -// **************************************************************************** - -TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("some invalid op-code"), TAG_KERNELS, (DATA_TYPES), (VALUE_TYPES)) { - using DT = TestType; - DT *res = nullptr; - auto m = genGivenVals
(1, {1}); - CHECK_THROWS(ewBinaryMat(static_cast(999), res, m, m, nullptr)); -} \ No newline at end of file + m3 = genGivenVals
(4, { + 1, 2, 0, 0, 1, 3, 1, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, + }); + } else { + m2 = genGivenVals
(4, { + VT(-1), 0, 0, 0, 0, 0, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, + }); + m3 = genGivenVals
(4, { + 0, 2, 0, 0, 1, 3, 1, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, + }); + } + + checkEwBinaryMat(BinaryOpCode::ADD, m0, m0, m0); + checkEwBinaryMat(BinaryOpCode::ADD, m1, m0, m1); + checkEwBinaryMat(BinaryOpCode::ADD, m1, m2, m3); + + DataObjectFactory::destroy(m0, m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("mul"), TAG_KERNELS, (DATA_TYPES), (VALUE_TYPES)) { + using DT = TestType; + + auto m0 = genGivenVals
(4, { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + auto m1 = genGivenVals
(4, { + 1, 2, 0, 0, 1, 3, 0, 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + auto m2 = genGivenVals
(4, { + 0, 0, 0, 0, 0, 0, 1, 2, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 2, + }); + auto m3 = genGivenVals
(4, { + 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + + checkEwBinaryMat(BinaryOpCode::MUL, m0, m0, m0); + checkEwBinaryMat(BinaryOpCode::MUL, m1, m0, m0); + checkEwBinaryMat(BinaryOpCode::MUL, m1, m2, m3); + + DataObjectFactory::destroy(m0, m1, m2, m3); + } + + TEMPLATE_TEST_CASE(TEST_NAME("mul_sparse_dense"), TAG_KERNELS, VALUE_TYPES) { + // TODO: all Dense - CSR combinations + using VT = TestType; + using SparseDT = CSRMatrix; + using DT = DenseMatrix; + + auto m0 = genGivenVals(4, { + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + + auto m1 = genGivenVals
(4, { + 1, 2, 0, 0, 1, 3, 0, 1, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + auto m2 = genGivenVals
(4, { + 3, 0, 3, 3, 3, 3, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 3, 2, + }); + auto m3 = genGivenVals
(4, { + 0, 1, 1, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + auto exp0 = genGivenVals(4, { + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + auto exp1 = genGivenVals(4, { + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }); + + checkSparseDenseEwBinaryMat(BinaryOpCode::MUL, m0, m1, exp0); + checkSparseDenseEwBinaryMat(BinaryOpCode::MUL, m0, m2, exp1); + checkSparseDenseEwBinaryMat(BinaryOpCode::MUL, m0, m3, m0); + + DataObjectFactory::destroy(m0, m1, m2, m3, exp0, exp1); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("div"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m0 = genGivenVals
(2, { + 0, + 0, + 0, + 0, + 0, + 0, + }); + auto m1 = genGivenVals
(2, { + 1, + 2, + 4, + 6, + 8, + 9, + }); + auto m2 = genGivenVals
(2, { + 1, + 2, + 2, + 2, + 4, + 3, + }); + auto m3 = genGivenVals
(2, { + 1, + 1, + 2, + 3, + 2, + 3, + }); + + checkEwBinaryMat(BinaryOpCode::DIV, m0, m1, m0); + checkEwBinaryMat(BinaryOpCode::DIV, m1, m2, m3); + + DataObjectFactory::destroy(m0, m1, m2, m3); + } + + // **************************************************************************** + // Comparisons + // **************************************************************************** + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m1 = + genGivenVals
(2, {VT("Ur"), VT("Uruk"), VT("Lugal"), VT("Ur"), VT("Lugaluschumgal"), VT("Lugaluschumgal")}); + auto m2 = + genGivenVals
(2, {VT("Uruk"), VT("Ur"), VT("Lugaluschumgal"), VT("Ur"), VT("Lugal"), VT("Lugaluschumgal")}); + auto m3 = genGivenVals>(2, {0, 0, 0, 1, 0, 1}); + + SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::EQ, m1, m2, m3); } + + DataObjectFactory::destroy(m1); + DataObjectFactory::destroy(m2); + DataObjectFactory::destroy(m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m1 = + genGivenVals
(2, {VT("Ur"), VT("Uruk"), VT("Lugal"), VT("Ur"), VT("Lugaluschumgal"), VT("Lugaluschumgal")}); + auto m2 = + genGivenVals
(2, {VT("Uruk"), VT("Ur"), VT("Lugaluschumgal"), VT("Ur"), VT("Lugal"), VT("Lugaluschumgal")}); + auto m3 = genGivenVals>(2, {1, 1, 1, 0, 1, 0}); + + SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::NEQ, m1, m2, m3); } + + DataObjectFactory::destroy(m1); + DataObjectFactory::destroy(m2); + DataObjectFactory::destroy(m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 3, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 1, + 0, + 1, + 1, + 0, + 0, + }); + + checkEwBinaryMat(BinaryOpCode::EQ, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 3, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 0, + 1, + 0, + 0, + 1, + 1, + }); + + checkEwBinaryMat(BinaryOpCode::NEQ, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 4, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 0, + 0, + 1, + 0, + 0, + 1, + }); + + checkEwBinaryMat(BinaryOpCode::LT, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m1 = genGivenVals
(3, {VT("Memphis"), VT("Raqote"), VT("Iushenshen"), VT("Sumenu"), VT("HermopolisParva"), + VT("HermopolisParva"), VT("Neferneferuaten"), VT("Hotepsekhemwy"), VT("Nefertiti")}); + auto m2 = + genGivenVals
(3, {VT("Men-nefer"), VT("Alexandria"), VT("Iushenshen"), VT("Crocodilopolis"), VT("Weprehwy"), + VT("HermopolisParva"), VT("Nefertiti"), VT("Neferneferuaten"), VT("Neferneferuaten")}); + auto m3 = genGivenVals>(3, {1, 0, 0, 0, 1, 0, 1, 1, 0}); + + SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::LT, m1, m2, m3); } + + DataObjectFactory::destroy(m1); + DataObjectFactory::destroy(m2); + DataObjectFactory::destroy(m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("le"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 4, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 1, + 0, + 1, + 1, + 0, + 1, + }); + + checkEwBinaryMat(BinaryOpCode::LE, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 4, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 0, + 1, + 0, + 0, + 1, + 0, + }); + + checkEwBinaryMat(BinaryOpCode::GT, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, (DenseMatrix), (ALL_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m1 = genGivenVals
(3, {VT("Memphis"), VT("Raqote"), VT("Iushenshen"), VT("Sumenu"), VT("HermopolisParva"), + VT("HermopolisParva"), VT("Neferneferuaten"), VT("Hotepsekhemwy"), VT("Nefertiti")}); + auto m2 = + genGivenVals
(3, {VT("Men-nefer"), VT("Alexandria"), VT("Iushenshen"), VT("Crocodilopolis"), VT("Weprehwy"), + VT("HermopolisParva"), VT("Nefertiti"), VT("Neferneferuaten"), VT("Neferneferuaten")}); + auto m3 = genGivenVals>(3, {0, 1, 0, 1, 0, 0, 0, 0, 1}); + + SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::GT, m1, m2, m3); } + + DataObjectFactory::destroy(m1); + DataObjectFactory::destroy(m2); + DataObjectFactory::destroy(m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("ge"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 4, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 1, + 1, + 0, + 1, + 1, + 0, + }); + + checkEwBinaryMat(BinaryOpCode::GE, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + // **************************************************************************** + // Min/max + // **************************************************************************** + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("min"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 4, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 1, + 0, + 3, + 4, + 4, + 6, + }); + + checkEwBinaryMat(BinaryOpCode::MIN, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("max"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + + auto m1 = genGivenVals
(2, { + 1, + 2, + 3, + 4, + 5, + 6, + }); + auto m2 = genGivenVals
(2, { + 1, + 0, + 4, + 4, + 4, + 9, + }); + auto m3 = genGivenVals
(2, { + 1, + 2, + 4, + 4, + 5, + 9, + }); + + checkEwBinaryMat(BinaryOpCode::MAX, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + // **************************************************************************** + // Logical + // **************************************************************************** + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("and"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m1 = genGivenVals
(1, {0, 0, 1, 1, 0, 2, 2, 0, VT(-2), VT(-2)}); + auto m2 = genGivenVals
(1, {0, 1, 0, 1, 2, 0, 2, VT(-2), 0, VT(-2)}); + auto m3 = genGivenVals
(1, {0, 0, 0, 1, 0, 0, 1, 0, 0, 1}); + + checkEwBinaryMat(BinaryOpCode::AND, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("or"), TAG_KERNELS, (DATA_TYPES_NO_CSR), (VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m1 = genGivenVals
(1, {0, 0, 1, 1, 0, 2, 2, 0, VT(-2), VT(-2)}); + auto m2 = genGivenVals
(1, {0, 1, 0, 1, 2, 0, 2, VT(-2), 0, VT(-2)}); + auto m3 = genGivenVals
(1, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}); + + checkEwBinaryMat(BinaryOpCode::OR, m1, m2, m3); + + DataObjectFactory::destroy(m1, m2, m3); + } + + // **************************************************************************** + // string. + // **************************************************************************** + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("concat"), TAG_KERNELS, (DenseMatrix), (FIXED_SIZE_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + using VTr = std::string; + + auto m1 = genGivenVals
( + 2, {VT("Hong "), VT("Buenos "), VT(""), VT("Saint "), VT("Alexandria in"), VT("Alexandria Prop")}); + auto m2 = + genGivenVals
(2, {VT("Kong"), VT("Aires"), VT(""), VT("Petersburg"), VT(" the Caucasus"), VT("hthasia")}); + auto m3 = + genGivenVals>(2, {VTr("Hong Kong"), VTr("Buenos Aires"), VTr(""), VTr("Saint Petersburg"), + VTr("Alexandria in the Caucasus"), VTr("Alexandria Prophthasia")}); + + SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::CONCAT, m1, m2, m3); } + + DataObjectFactory::destroy(m1); + DataObjectFactory::destroy(m2); + DataObjectFactory::destroy(m3); + } + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("concat"), TAG_KERNELS, (DenseMatrix), (FLEXIBLE_SIZE_STRING_VALUE_TYPES)) { + using DT = TestType; + using VT = typename DT::VT; + + auto m1 = genGivenVals
( + 2, {VT("Hong "), VT("Buenos "), VT(""), VT("Saint "), VT("Alexandria in"), VT("Alexandria Prop")}); + auto m2 = + genGivenVals
(2, {VT("Kong"), VT("Aires"), VT(""), VT("Petersburg"), VT(" the Caucasus"), VT("hthasia")}); + auto m3 = genGivenVals>(2, {VT("Hong Kong"), VT("Buenos Aires"), VT(""), VT("Saint Petersburg"), + VT("Alexandria in the Caucasus"), VT("Alexandria Prophthasia")}); + + SECTION("matrix") { checkEwBinaryMat(BinaryOpCode::CONCAT, m1, m2, m3); } + + DataObjectFactory::destroy(m1); + DataObjectFactory::destroy(m2); + DataObjectFactory::destroy(m3); + } + + // **************************************************************************** + // Invalid op-code + // **************************************************************************** + + TEMPLATE_PRODUCT_TEST_CASE(TEST_NAME("some invalid op-code"), TAG_KERNELS, (DATA_TYPES), (VALUE_TYPES)) { + using DT = TestType; + DT *res = nullptr; + auto m = genGivenVals
(1, {1}); + CHECK_THROWS(ewBinaryMat(static_cast(999), res, m, m, nullptr)); + } \ No newline at end of file diff --git a/test/runtime/local/kernels/EwBinaryScaTest.cpp b/test/runtime/local/kernels/EwBinaryScaTest.cpp index 1504071d8..deffa3e4b 100644 --- a/test/runtime/local/kernels/EwBinaryScaTest.cpp +++ b/test/runtime/local/kernels/EwBinaryScaTest.cpp @@ -14,231 +14,268 @@ * limitations under the License. */ -#include - -#include - -#include - -#include - -#define TEST_NAME(opName) "EwBinarySca (" opName ")" -#define VALUE_TYPES double, uint32_t - -template void checkEwBinarySca(VT lhs, VT rhs, VT exp) { - CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); - CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); -} - -template void checkEwBinarySca(std::string lhs, std::string rhs, int64_t exp) { - CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); - CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); -} - -template void checkEwBinarySca(FixedStr16 lhs, FixedStr16 rhs, int64_t exp) { - CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); - CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); -} - -template void checkEwBinarySca(VT lhs, VT rhs, std::string exp) { - CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); - CHECK(ewBinarySca(BinaryOpCode::CONCAT, lhs, rhs, nullptr) == exp); -} - -// **************************************************************************** -// Arithmetic -// **************************************************************************** - -TEMPLATE_TEST_CASE(TEST_NAME("add"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(0, 0, 0); - checkEwBinarySca(0, 1, 1); - checkEwBinarySca(1, 2, 3); -} - -TEMPLATE_TEST_CASE(TEST_NAME("mul"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(0, 0, 0); - checkEwBinarySca(0, 1, 0); - checkEwBinarySca(2, 3, 6); -} - -TEMPLATE_TEST_CASE(TEST_NAME("div"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(0, 3, 0); - checkEwBinarySca(6, 3, 2); -} - -// **************************************************************************** -// Comparisons -// **************************************************************************** - -TEMPLATE_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(0, 0, 1); - checkEwBinarySca(3, 3, 1); - checkEwBinarySca(3, 5, 0); -} - -TEMPLATE_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(VT("abcd"), VT("abcd"), 1); - checkEwBinarySca(VT("abce"), VT("abcd"), 0); - checkEwBinarySca(VT("abcda"), VT("abcd"), 0); - checkEwBinarySca(VT("abc"), VT("abcd"), 0); - checkEwBinarySca(VT("ABCD"), VT("abcd"), 0); - checkEwBinarySca(VT("36abcd"), VT("30abcd"), 0); - checkEwBinarySca(VT("3"), VT("4"), 0); - checkEwBinarySca(VT(""), VT("abc"), 0); - checkEwBinarySca(VT(""), VT(""), 1); -} - -TEMPLATE_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(0, 0, 0); - checkEwBinarySca(3, 3, 0); - checkEwBinarySca(3, 5, 1); -} - -TEMPLATE_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(VT("abcd"), VT("abcd"), 0); - checkEwBinarySca(VT("abce"), VT("abcd"), 1); - checkEwBinarySca(VT("abcda"), VT("abcd"), 1); - checkEwBinarySca(VT("abc"), VT("abcd"), 1); - checkEwBinarySca(VT("ABCD"), VT("abcd"), 1); - checkEwBinarySca(VT("36abcd"), VT("30abcd"), 1); - checkEwBinarySca(VT("3"), VT("4"), 1); - checkEwBinarySca(VT(""), VT("abc"), 1); - checkEwBinarySca(VT(""), VT(""), 0); -} - -TEMPLATE_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(1, 1, 0); - checkEwBinarySca(1, 3, 1); - checkEwBinarySca(4, 2, 0); -} - -TEMPLATE_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(VT("abcd"), VT("abcd"), 0); - checkEwBinarySca(VT("abce"), VT("abcd"), 0); - checkEwBinarySca(VT("abcb"), VT("abcd"), 1); - checkEwBinarySca(VT("abcda"), VT("abcd"), 0); - checkEwBinarySca(VT("abc"), VT("abcd"), 1); - checkEwBinarySca(VT("ABCD"), VT("abcd"), 1); - checkEwBinarySca(VT("abcD"), VT("abcd"), 1); - checkEwBinarySca(VT("36abcd"), VT("30abcd"), 0); - checkEwBinarySca(VT("3"), VT("4"), 1); - checkEwBinarySca(VT(""), VT("abc"), 1); - checkEwBinarySca(VT(""), VT(""), 0); -} - -TEMPLATE_TEST_CASE(TEST_NAME("le"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(1, 1, 1); - checkEwBinarySca(1, 3, 1); - checkEwBinarySca(4, 2, 0); -} - -TEMPLATE_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(1, 1, 0); - checkEwBinarySca(1, 3, 0); - checkEwBinarySca(4, 2, 1); -} - -TEMPLATE_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(VT("abcd"), VT("abcd"), 0); - checkEwBinarySca(VT("abce"), VT("abcd"), 1); - checkEwBinarySca(VT("abcb"), VT("abcd"), 0); - checkEwBinarySca(VT("abcda"), VT("abcd"), 1); - checkEwBinarySca(VT("abc"), VT("abcd"), 0); - checkEwBinarySca(VT("ABCD"), VT("abcd"), 0); - checkEwBinarySca(VT("abcD"), VT("abcd"), 0); - checkEwBinarySca(VT("36abcd"), VT("30abcd"), 1); - checkEwBinarySca(VT("3"), VT("4"), 0); - checkEwBinarySca(VT(""), VT("abc"), 0); - checkEwBinarySca(VT(""), VT(""), 0); -} - -TEMPLATE_TEST_CASE(TEST_NAME("ge"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(1, 1, 1); - checkEwBinarySca(1, 3, 0); - checkEwBinarySca(4, 2, 1); -} - -// **************************************************************************** -// Min/max -// **************************************************************************** - -TEMPLATE_TEST_CASE(TEST_NAME("min"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(2, 2, 2); - checkEwBinarySca(2, 3, 2); - checkEwBinarySca(3, 0, 0); -} - -TEMPLATE_TEST_CASE(TEST_NAME("max"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(2, 2, 2); - checkEwBinarySca(2, 3, 3); - checkEwBinarySca(3, 0, 3); -} - -// **************************************************************************** -// Logical -// **************************************************************************** - -TEMPLATE_TEST_CASE(TEST_NAME("and"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(0, 0, 0); - checkEwBinarySca(0, 1, 0); - checkEwBinarySca(1, 0, 0); - checkEwBinarySca(1, 1, 1); - checkEwBinarySca(0, 2, 0); - checkEwBinarySca(2, 0, 0); - checkEwBinarySca(2, 2, 1); - checkEwBinarySca(0, -2, 0); - checkEwBinarySca(-2, 0, 0); - checkEwBinarySca(-2, -2, 1); -} - -TEMPLATE_TEST_CASE(TEST_NAME("or"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(0, 0, 0); - checkEwBinarySca(0, 1, 1); - checkEwBinarySca(1, 0, 1); - checkEwBinarySca(1, 1, 1); - checkEwBinarySca(0, 2, 1); - checkEwBinarySca(2, 0, 1); - checkEwBinarySca(2, 2, 1); - checkEwBinarySca(0, -2, 1); - checkEwBinarySca(-2, 0, 1); - checkEwBinarySca(-2, -2, 1); -} - -// **************************************************************************** -// String ops -// **************************************************************************** - -TEMPLATE_TEST_CASE(TEST_NAME("concat"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { - using VT = TestType; - checkEwBinarySca(VT("abcd"), VT("abcd"), std::string("abcdabcd")); - checkEwBinarySca(VT("ABCD"), VT("abcd"), std::string("ABCDabcd")); - checkEwBinarySca(VT("3"), VT("4"), std::string("34")); - checkEwBinarySca(VT(""), VT("abc"), std::string("abc")); - checkEwBinarySca(VT(""), VT(""), std::string("")); -} - -// **************************************************************************** -// Invalid op-code -// **************************************************************************** - -TEMPLATE_TEST_CASE(TEST_NAME("some invalid op-code"), TAG_KERNELS, VALUE_TYPES) { - using VT = TestType; - CHECK_THROWS(ewBinarySca(static_cast(999), 0, 0, nullptr)); -} \ No newline at end of file + #include + + #include + + #include + + #include + + #define TEST_NAME(opName) "EwBinarySca (" opName ")" + #define VALUE_TYPES double, uint32_t + + template void checkEwBinarySca(VT lhs, VT rhs, VT exp) { + CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); + CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); + } + + template void checkEwBinarySca(std::string lhs, std::string rhs, int64_t exp) { + CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); + CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); + } + + template void checkEwBinarySca(FixedStr16 lhs, FixedStr16 rhs, int64_t exp) { + CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); + CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); + } + + template void checkEwBinarySca(UnorderedDictionaryEncodedString lhs, UnorderedDictionaryEncodedString rhs, int64_t exp) { + CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); + CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); + } + + template void checkEwBinarySca(OrderedDictionaryEncodedString lhs, OrderedDictionaryEncodedString rhs, int64_t exp) { + CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); + CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); + } + + template void checkEwBinarySca(VT lhs, VT rhs, std::string exp) { + CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); + CHECK(ewBinarySca(BinaryOpCode::CONCAT, lhs, rhs, nullptr) == exp); + } + + + template void checkEwBinarySca(VT lhs, VT rhs, VTRes exp) { + CHECK(EwBinarySca::apply(lhs, rhs, nullptr) == exp); + CHECK(ewBinarySca(opCode, lhs, rhs, nullptr) == exp); + } + + + + + // **************************************************************************** + // Arithmetic + // **************************************************************************** + + TEMPLATE_TEST_CASE(TEST_NAME("add"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(0, 0, 0); + checkEwBinarySca(0, 1, 1); + checkEwBinarySca(1, 2, 3); + } + + TEMPLATE_TEST_CASE(TEST_NAME("mul"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(0, 0, 0); + checkEwBinarySca(0, 1, 0); + checkEwBinarySca(2, 3, 6); + } + + TEMPLATE_TEST_CASE(TEST_NAME("div"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(0, 3, 0); + checkEwBinarySca(6, 3, 2); + } + + // **************************************************************************** + // Comparisons + // **************************************************************************** + + TEMPLATE_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(0, 0, 1); + checkEwBinarySca(3, 3, 1); + checkEwBinarySca(3, 5, 0); + } + + TEMPLATE_TEST_CASE(TEST_NAME("eq"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { + using VT = TestType; + using VTRes = int64_t; + checkEwBinarySca(VT(" "), VT(""), 0); + checkEwBinarySca(VT("Valentia"), VT("Valencia"), 0); + checkEwBinarySca(VT("Parisiorum Lute"), VT("Paris"), 0); + checkEwBinarySca(VT("Roma"), VT("Roma"), 1); + checkEwBinarySca(VT("Palma"), VT("PalmadeMallorca"), 0); + checkEwBinarySca(VT("Pompeii"), VT("Pompei"), 0); + checkEwBinarySca(VT("Thessalonica"), VT("Thessaloniki"), 0); + checkEwBinarySca(VT("Regium Lepidi"), VT("Reggio Emilia"), 0); + checkEwBinarySca(VT("Augusta Trevero"), VT("Augusta Trevero"), 1); + } + + TEMPLATE_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(0, 0, 0); + checkEwBinarySca(3, 3, 0); + checkEwBinarySca(3, 5, 1); + } + + TEMPLATE_TEST_CASE(TEST_NAME("neq"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { + using VT = TestType; + using VTRes = int64_t; + checkEwBinarySca(VT(" "), VT(""), 1); + checkEwBinarySca(VT("Valentia"), VT("Valencia"), 1); + checkEwBinarySca(VT("Parisiorum Lute"), VT("Paris"), 1); + checkEwBinarySca(VT("Roma"), VT("Roma"), 0); + checkEwBinarySca(VT("Palma"), VT("PalmadeMallorca"), 1); + checkEwBinarySca(VT("Pompeii"), VT("Pompei"), 1); + checkEwBinarySca(VT("Thessalonica"), VT("Thessaloniki"), 1); + checkEwBinarySca(VT("Regium Lepidi"), VT("Reggio Emilia"), 1); + checkEwBinarySca(VT("Augusta Trevero"), VT("Augusta Trevero"), 0); + } + + TEMPLATE_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(1, 1, 0); + checkEwBinarySca(1, 3, 1); + checkEwBinarySca(4, 2, 0); + } + + TEMPLATE_TEST_CASE(TEST_NAME("lt"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { + using VT = TestType; + using VTRes = int64_t; + checkEwBinarySca(VT("Tenochtitlan"), VT("Coixtlahuaca"), 0); + checkEwBinarySca(VT("Tlacozauhtitlan"), VT("Quiauhteopan"), 0); + checkEwBinarySca(VT("Texcoco"), VT("Temazcaltepec"), 0); + checkEwBinarySca(VT("Cuauhchinanco"), VT("Tepecoacuilco"), 1); + checkEwBinarySca(VT("Tlacopan"), VT("Tlacozauhtitlan"), 1); + checkEwBinarySca(VT("Tochtepec"), VT("Tochpan"), 0); + checkEwBinarySca(VT("Quetzaltecolotl"), VT("Quetzaltecolotl"), 0); + checkEwBinarySca(VT("Chimalpopoca"), VT("Chimalpopoc"), 0); + checkEwBinarySca(VT("Huitzilopochtl"), VT("Huitzilopochtli"), 1); + checkEwBinarySca(VT(""), VT("abc"), 1); + checkEwBinarySca(VT(""), VT(""), 0); + } + + TEMPLATE_TEST_CASE(TEST_NAME("le"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(1, 1, 1); + checkEwBinarySca(1, 3, 1); + checkEwBinarySca(4, 2, 0); + } + + TEMPLATE_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(1, 1, 0); + checkEwBinarySca(1, 3, 0); + checkEwBinarySca(4, 2, 1); + } + + TEMPLATE_TEST_CASE(TEST_NAME("gt"), TAG_KERNELS, ALL_STRING_VALUE_TYPES) { + using VT = TestType; + using VTRes = int64_t; + checkEwBinarySca(VT("Tenochtitlan"), VT("Coixtlahuaca"), 1); + checkEwBinarySca(VT("Tlacozauhtitlan"), VT("Quiauhteopan"), 1); + checkEwBinarySca(VT("Texcoco"), VT("Temazcaltepec"), 1); + checkEwBinarySca(VT("Cuauhchinanco"), VT("Tepecoacuilco"), 0); + checkEwBinarySca(VT("Tlacopan"), VT("Tlacozauhtitlan"), 0); + checkEwBinarySca(VT("Tochtepec"), VT("Tochpan"), 1); + checkEwBinarySca(VT("Quetzaltecolotl"), VT("Quetzaltecolotl"), 0); + checkEwBinarySca(VT("Chimalpopoca"), VT("Chimalpopoc"), 1); + checkEwBinarySca(VT("Huitzilopochtl"), VT("Huitzilopochtli"), 0); + checkEwBinarySca(VT(""), VT("abc"), 0); + checkEwBinarySca(VT(""), VT(""), 0); + } + + TEMPLATE_TEST_CASE(TEST_NAME("ge"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(1, 1, 1); + checkEwBinarySca(1, 3, 0); + checkEwBinarySca(4, 2, 1); + } + + // **************************************************************************** + // Min/max + // **************************************************************************** + + TEMPLATE_TEST_CASE(TEST_NAME("min"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(2, 2, 2); + checkEwBinarySca(2, 3, 2); + checkEwBinarySca(3, 0, 0); + } + + TEMPLATE_TEST_CASE(TEST_NAME("max"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(2, 2, 2); + checkEwBinarySca(2, 3, 3); + checkEwBinarySca(3, 0, 3); + } + + // **************************************************************************** + // Logical + // **************************************************************************** + + TEMPLATE_TEST_CASE(TEST_NAME("and"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(0, 0, 0); + checkEwBinarySca(0, 1, 0); + checkEwBinarySca(1, 0, 0); + checkEwBinarySca(1, 1, 1); + checkEwBinarySca(0, 2, 0); + checkEwBinarySca(2, 0, 0); + checkEwBinarySca(2, 2, 1); + checkEwBinarySca(0, -2, 0); + checkEwBinarySca(-2, 0, 0); + checkEwBinarySca(-2, -2, 1); + } + + TEMPLATE_TEST_CASE(TEST_NAME("or"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + checkEwBinarySca(0, 0, 0); + checkEwBinarySca(0, 1, 1); + checkEwBinarySca(1, 0, 1); + checkEwBinarySca(1, 1, 1); + checkEwBinarySca(0, 2, 1); + checkEwBinarySca(2, 0, 1); + checkEwBinarySca(2, 2, 1); + checkEwBinarySca(0, -2, 1); + checkEwBinarySca(-2, 0, 1); + checkEwBinarySca(-2, -2, 1); + } + + // **************************************************************************** + // String ops + // **************************************************************************** + TEMPLATE_TEST_CASE(TEST_NAME("concat"), TAG_KERNELS, FIXED_SIZE_STRING_VALUE_TYPES) { + using VT = TestType; + using VTRes = std::string; + checkEwBinarySca(VT("Pachakutiy"), VT(" Inka Yupanki"), + VTRes("Pachakutiy Inka Yupanki")); + checkEwBinarySca(VT("Tawantinsuyu:"), VT(" Chinchay Suyu"), + VTRes("Tawantinsuyu: Chinchay Suyu")); + checkEwBinarySca(VT("Túpac Inca"), VT(" Yupanqui"), VTRes("Túpac Inca Yupanqui")); + checkEwBinarySca(VT(""), VT("abc"), VTRes("abc")); + checkEwBinarySca(VT(""), VT(""), VTRes("")); + } + + TEMPLATE_TEST_CASE(TEST_NAME("concat"), TAG_KERNELS, FLEXIBLE_SIZE_STRING_VALUE_TYPES) { + using VT = TestType; + using VTRes = VT; + checkEwBinarySca(VT("Pachakutiy"), VT(" Inka Yupanki"), + VT("Pachakutiy Inka Yupanki")); + checkEwBinarySca(VT("Tawantinsuyu:"), VT(" Chinchay Suyu"), + VT("Tawantinsuyu: Chinchay Suyu")); + checkEwBinarySca(VT("Túpac Inca"), VT(" Yupanqui"), VT("Túpac Inca Yupanqui")); + checkEwBinarySca(VT(""), VT("abc"), VT("abc")); + checkEwBinarySca(VT(""), VT(""), VT("")); + } + + // **************************************************************************** + // Invalid op-code + // **************************************************************************** + + TEMPLATE_TEST_CASE(TEST_NAME("some invalid op-code"), TAG_KERNELS, VALUE_TYPES) { + using VT = TestType; + CHECK_THROWS(ewBinarySca(static_cast(999), 0, 0, nullptr)); + } \ No newline at end of file