v1
Brett 2024-09-24 21:39:00 -04:00
parent d5250b163a
commit a2a358ac0c
3 changed files with 85 additions and 92 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
project(COSC-4P80-Assignment-1 VERSION 0.0.12) project(COSC-4P80-Assignment-1 VERSION 0.0.13)
option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF) option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF)
option(ENABLE_UBSAN "Enable the ub sanitizer" OFF) option(ENABLE_UBSAN "Enable the ub sanitizer" OFF)

@ -1 +1 @@
Subproject commit a7412fccec0ba14e1a4f0135e53db002cb944924 Subproject commit cacc082ce9a28468d29a31c402fa2c3fcbe3f910

View File

@ -59,106 +59,99 @@ const auto weight_total_c_2 = weight_total_c + weight_5 + weight_6 + weight_7;
crosstalk_t crosstalk_values{}; crosstalk_t crosstalk_values{};
template<typename Weights, typename Inputs, typename Outputs> //template<typename Weights, typename Inputs, typename Outputs>
void execute_BAM(const Weights& weights, const Inputs& input, const Outputs& output) //void execute_BAM(const Weights& weights, const Inputs& input, const Outputs& output)
{ //{
auto current_inputs = input; // auto current_inputs = input;
auto current_outputs = output; // auto current_outputs = output;
auto next_inputs = current_inputs; // auto next_inputs = current_inputs;
auto next_outputs = current_outputs; // auto next_outputs = current_outputs;
blt::size_t iterations = 0; // blt::size_t iterations = 0;
constexpr blt::size_t max_iterations = 5; // constexpr blt::size_t max_iterations = 5;
//
do // do
{ // {
current_inputs = next_inputs; // current_inputs = next_inputs;
current_outputs = next_outputs; // current_outputs = next_outputs;
++iterations; // ++iterations;
for (const auto& [index, val] : blt::enumerate(current_inputs)) // for (const auto& [index, val] : blt::enumerate(current_inputs))
{ // {
auto next = a1::run_step(weights, val, current_outputs[index]); // auto next = a1::run_step(weights, val, current_outputs[index]);
next_inputs[index] = next.first; // next_inputs[index] = next.first;
next_outputs[index] = next.second; // next_outputs[index] = next.second;
} // }
// loop until no changes or we hit the iteration limit // // 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); // } while ((!a1::equal(current_inputs, next_inputs) || !a1::equal(current_outputs, next_outputs)) && iterations < max_iterations);
//
BLT_DEBUG("Tracked after %ld iterations", iterations); // BLT_DEBUG("Tracked after %ld iterations", iterations);
a1::check_recall(weights, next_inputs, next_outputs); // a1::check_recall(weights, next_inputs, next_outputs);
} //}
//
void part_a() //void part_a()
{ //{
blt::log_box_t box(BLT_TRACE_STREAM, "Part A", 8); // blt::log_box_t box(BLT_TRACE_STREAM, "Part A", 8);
//
execute_BAM(weight_total_a, part_a_inputs, part_a_outputs); // execute_BAM(weight_total_a, part_a_inputs, part_a_outputs);
} //}
//
void part_b() //void part_b()
{ //{
blt::log_box_t box(BLT_TRACE_STREAM, "Part B", 8); // blt::log_box_t box(BLT_TRACE_STREAM, "Part B", 8);
for (blt::u32 i = 0; i < num_values; i++) // for (blt::u32 i = 0; i < num_values; i++)
{ // {
blt::generalized_matrix<float, 1, output_count> accum; // blt::generalized_matrix<float, 1, output_count> accum;
for (blt::u32 k = 0; k < num_values; k++) // for (blt::u32 k = 0; k < num_values; k++)
{ // {
if (i == k) // if (i == k)
continue; // continue;
accum += (part_a_outputs[k] * a1::crosstalk(part_a_inputs[k].normalize(), part_a_inputs[i].normalize())); // 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); // crosstalk_values.assign_to_column_from_column_rows(accum, i);
} // }
for (blt::u32 i = 0; i < num_values; i++) // for (blt::u32 i = 0; i < num_values; i++)
{ // {
BLT_DEBUG_STREAM << crosstalk_values[i] << " Mag: " << crosstalk_values[i].magnitude() << "\n"; // BLT_DEBUG_STREAM << crosstalk_values[i] << " Mag: " << crosstalk_values[i].magnitude() << "\n";
} // }
} //}
//
void part_c() //void part_c()
{ //{
blt::log_box_t box(BLT_TRACE_STREAM, "Part C", 8); // blt::log_box_t box(BLT_TRACE_STREAM, "Part C", 8);
execute_BAM(weight_total_c, part_c_1_inputs, part_c_1_outputs); // execute_BAM(weight_total_c, part_c_1_inputs, part_c_1_outputs);
BLT_TRACE("--- { Part C with 3 extra pairs } ---"); // BLT_TRACE("--- { Part C with 3 extra pairs } ---");
execute_BAM(weight_total_c_2, part_c_2_inputs, part_c_2_outputs); // execute_BAM(weight_total_c_2, part_c_2_inputs, part_c_2_outputs);
} //}
int main() int main()
{ {
blt::logging::setLogOutputFormat("\033[94m[${{TIME}}]${{RC}} \033[35m(${{FILE}}:${{LINE}})${{RC}} ${{LF}}${{CNR}}${{STR}}${{RC}}\n"); 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_a_inputs)) for (const auto& [index, value] : blt::enumerate(part_c_2_inputs))
BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n';
BLT_TRACE(""); BLT_TRACE("");
// for (const auto& [index, value] : blt::enumerate(part_a_inputs).rev()) for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).rev())
// BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n'; BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n';
BLT_TRACE(""); BLT_TRACE("");
BLT_TRACE_STREAM for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).skip(3))
<< blt::meta::is_random_access_iterator<decltype(part_a_inputs.begin())> BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n';
<< '\n';
BLT_TRACE_STREAM BLT_TRACE("");
<< blt::meta::is_bidirectional_iterator<decltype(part_a_inputs.begin())>
<< '\n';
BLT_TRACE_STREAM for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).skip(3).rev())
<< blt::meta::is_bidirectional_or_better<decltype(part_a_inputs.begin())> BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n';
<< '\n';
// auto d = blt::enumerate(part_a_inputs).rev(); BLT_TRACE("");
// BLT_TRACE(blt::type_string<decltype(d.begin())>());
// BLT_TRACE(blt::type_string<decltype(*++d.begin())>());
// BLT_TRACE(blt::type_string<std::iterator_traits<decltype(blt::enumerate(part_a_inputs))::type>::iterator_category>()); for (const auto& [index, value] : blt::enumerate(part_c_2_inputs).rev().skip(3).rev())
// BLT_TRACE(blt::type_string<decltype(blt::enumerate(part_a_inputs))::iter>()); BLT_TRACE_STREAM << index << " : " << value.vec_from_column_row() << '\n';
// BLT_TRACE(blt::type_string<decltype(std::reverse_iterator{part_a_inputs.begin()})::iterator_category>());
// std::cout << std::iterator_traits<decltype(blt::enumerate(part_a_inputs))::type>::iterator_category << std::endl;
part_a();
part_b(); // part_a();
part_c(); // part_b();
// part_c();
} }