diff --git a/CMakeLists.txt b/CMakeLists.txt index 721f6a8..89b1de3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.25) -project(COSC-4P80-Assignment-1 VERSION 0.0.15) +project(COSC-4P80-Assignment-1 VERSION 0.0.16) option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF) option(ENABLE_UBSAN "Enable the ub sanitizer" OFF) diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..0e04da0 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +#!/bin/sh +mkdir build +cmake -DCMAKE_BUILD_TYPE=Release -S ./ -B ./build +cmake --build ./build -j 32 diff --git a/lib/blt b/lib/blt index 329eeb1..bfcb357 160000 --- a/lib/blt +++ b/lib/blt @@ -1 +1 @@ -Subproject commit 329eeb174bcb66f3403255d324c6c8451246a131 +Subproject commit bfcb35705910851a6a7466406609793bae3eb2be diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..3107829 --- /dev/null +++ b/run.sh @@ -0,0 +1,2 @@ +#!/bin/sh +./build/COSC-4P80-Assignment-1 diff --git a/src/main.cpp b/src/main.cpp index aa7e61e..896ba19 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,17 +3,19 @@ #include #include "blt/std/assert.h" #include -#include +#include #include -constexpr blt::u32 num_values = 4; -constexpr blt::u32 input_count = 5; -constexpr blt::u32 output_count = 4; +constexpr blt::u32 num_values_part_a = 3; +constexpr blt::u32 num_values_part_c1 = 4; +constexpr blt::u32 num_values_part_c2 = 7; +constexpr blt::u32 input_vec_size = 5; +constexpr blt::u32 output_vec_size = 4; -using input_t = blt::generalized_matrix; -using output_t = blt::generalized_matrix; +using input_t = blt::generalized_matrix; +using output_t = blt::generalized_matrix; using weight_t = decltype(std::declval().transpose() * std::declval()); -using crosstalk_t = blt::generalized_matrix; +using crosstalk_t = blt::generalized_matrix; // part a input_t input_1{-1, 1, 1, 1, -1}; @@ -58,106 +60,77 @@ const auto weight_total_a = weight_1 + weight_2 + weight_3; const auto weight_total_c = weight_total_a + weight_4; const auto weight_total_c_2 = weight_total_c + weight_5 + weight_6 + weight_7; -crosstalk_t crosstalk_values{}; +crosstalk_t crosstalk_values[num_values_part_a]; -//template -//void execute_BAM(const Weights& weights, const Inputs& input, const Outputs& output) -//{ -// auto current_inputs = input; -// auto current_outputs = output; -// auto next_inputs = current_inputs; -// auto next_outputs = current_outputs; -// blt::size_t iterations = 0; -// constexpr blt::size_t max_iterations = 5; -// -// do -// { -// current_inputs = next_inputs; -// current_outputs = next_outputs; -// ++iterations; -// for (const auto& [index, val] : blt::enumerate(current_inputs)) -// { -// auto next = a1::run_step(weights, val, current_outputs[index]); -// next_inputs[index] = next.first; -// next_outputs[index] = next.second; -// } -// // loop until no changes or we hit the iteration limit -// } while ((!a1::equal(current_inputs, next_inputs) || !a1::equal(current_outputs, next_outputs)) && iterations < max_iterations); -// -// BLT_DEBUG("Tracked after %ld iterations", iterations); -// a1::check_recall(weights, next_inputs, next_outputs); -//} -// -//void part_a() -//{ -// blt::log_box_t box(BLT_TRACE_STREAM, "Part A", 8); -// -// execute_BAM(weight_total_a, part_a_inputs, part_a_outputs); -//} -// -//void part_b() -//{ -// blt::log_box_t box(BLT_TRACE_STREAM, "Part B", 8); -// for (blt::u32 i = 0; i < num_values; i++) -// { -// blt::generalized_matrix accum; -// for (blt::u32 k = 0; k < num_values; k++) -// { -// if (i == k) -// continue; -// accum += (part_a_outputs[k] * a1::crosstalk(part_a_inputs[k].normalize(), part_a_inputs[i].normalize())); -// } -// crosstalk_values.assign_to_column_from_column_rows(accum, i); -// } -// for (blt::u32 i = 0; i < num_values; i++) -// { -// BLT_DEBUG_STREAM << crosstalk_values[i] << " Mag: " << crosstalk_values[i].magnitude() << "\n"; -// } -//} -// -//void part_c() -//{ -// blt::log_box_t box(BLT_TRACE_STREAM, "Part C", 8); -// execute_BAM(weight_total_c, part_c_1_inputs, part_c_1_outputs); -// BLT_TRACE("--- { Part C with 3 extra pairs } ---"); -// execute_BAM(weight_total_c_2, part_c_2_inputs, part_c_2_outputs); -//} +template +void execute_BAM(const Weights& weights, const Inputs& input, const Outputs& output) +{ + auto current_inputs = input; + auto current_outputs = output; + auto next_inputs = current_inputs; + auto next_outputs = current_outputs; + blt::size_t iterations = 0; + constexpr blt::size_t max_iterations = 5; + + do + { + current_inputs = next_inputs; + current_outputs = next_outputs; + ++iterations; + for (const auto& [index, val] : blt::enumerate(current_inputs)) + { + auto next = a1::run_step(weights, val, current_outputs[index]); + next_inputs[index] = next.first; + next_outputs[index] = next.second; + } + // loop until no changes or we hit the iteration limit + } while ((!a1::equal(current_inputs, next_inputs) || !a1::equal(current_outputs, next_outputs)) && iterations < max_iterations); + + BLT_DEBUG("Tracked after %ld iterations", iterations); + a1::check_recall(weights, next_inputs, next_outputs); +} + +void part_a() +{ + blt::log_box_t box(BLT_TRACE_STREAM, "Part A", 8); + + execute_BAM(weight_total_a, part_a_inputs, part_a_outputs); +} + +void part_b() +{ + blt::log_box_t box(BLT_TRACE_STREAM, "Part B", 8); + for (blt::u32 i = 0; i < num_values_part_a; i++) + { + crosstalk_values[i] = {}; + for (blt::u32 k = 0; k < num_values_part_a; k++) + { + if (i == k) + continue; + crosstalk_values[i] += (part_a_outputs[i] * a1::crosstalk(part_a_inputs[i].normalize(), part_a_inputs[k].normalize())).abs(); + } + } + for (const auto& crosstalk_value : crosstalk_values) + { + auto vec = crosstalk_value.vec_from_column_row(); + BLT_DEBUG_STREAM << vec << " Mag: " << vec.magnitude() << "\n"; + } +} + +void part_c() +{ + blt::log_box_t box(BLT_TRACE_STREAM, "Part C", 8); + execute_BAM(weight_total_c, part_c_1_inputs, part_c_1_outputs); + BLT_TRACE("--- { Part C with 3 extra pairs } ---"); + execute_BAM(weight_total_c_2, part_c_2_inputs, part_c_2_outputs); +} int main() { blt::logging::setLogOutputFormat("\033[94m[${{TIME}}]${{RC}} \033[35m(${{FILE}}:${{LINE}})${{RC}} ${{LF}}${{CNR}}${{STR}}${{RC}}\n"); -// a1::test_math(); + a1::test_math(); - for (const auto& [index, value] : blt::enumerate(part_c_2_inputs)) - BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; - - BLT_TRACE(""); - - for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).rev()) - BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; - - BLT_TRACE(""); - - for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).skip(3)) - BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; - - BLT_TRACE(""); - - for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).skip(3).rev()) - BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; - - BLT_TRACE(""); - - for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).rev().skip(3).rev()) - BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; - - BLT_TRACE(""); - - for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).skip(2).take(3)) - BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; - - -// part_a(); -// part_b(); -// part_c(); + part_a(); + part_b(); + part_c(); }