silly
parent
8921671966
commit
e3ef31ffc2
|
@ -1,119 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="CMakePresetLoader">{
|
||||
"useNewFormat": true
|
||||
}</component>
|
||||
<component name="CMakeReloadState">
|
||||
<option name="reloaded" value="true" />
|
||||
</component>
|
||||
<component name="CMakeRunConfigurationManager">
|
||||
<generated>
|
||||
<config projectName="COSC-4P80-Assignment-1" targetName="BLT" />
|
||||
<config projectName="COSC-4P80-Assignment-1" targetName="COSC-4P80-Assignment-1" />
|
||||
</generated>
|
||||
</component>
|
||||
<component name="CMakeSettings">
|
||||
<configurations>
|
||||
<configuration PROFILE_NAME="Debug" ENABLED="true" CONFIG_NAME="Debug" />
|
||||
<configuration PROFILE_NAME="Release" ENABLED="true" CONFIG_NAME="Release" />
|
||||
<configuration PROFILE_NAME="RelWithDebInfo" ENABLED="true" CONFIG_NAME="RelWithDebInfo" />
|
||||
<configuration PROFILE_NAME="RelWithDebInfo Addrsan" ENABLED="true" CONFIG_NAME="RelWithDebInfo" GENERATION_OPTIONS="-G Ninja -DENABLE_ADDRSAN=ON" />
|
||||
<configuration PROFILE_NAME="RelWithDebInfo Clang" ENABLED="true" CONFIG_NAME="RelWithDebInfo" TOOLCHAIN_NAME="Clang" />
|
||||
</configurations>
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="c26429cb-3f2d-4b3c-a3dd-031e70b9aeae" name="Changes" comment="" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="ClangdSettings">
|
||||
<option name="clangTidyViaClangd" value="false" />
|
||||
<option name="formatViaClangd" value="false" />
|
||||
</component>
|
||||
<component name="ExecutionTargetManager" SELECTED_TARGET="CMakeBuildProfile:Debug" />
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="ProjectApplicationVersion">
|
||||
<option name="ide" value="CLion" />
|
||||
<option name="majorVersion" value="2024" />
|
||||
<option name="minorVersion" value="1.3" />
|
||||
<option name="productBranch" value="Classic" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo">{
|
||||
"associatedIndex": 5
|
||||
}</component>
|
||||
<component name="ProjectId" id="2mH5CM5ppMWsphz4G4xP4A28USH" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"CMake Application.COSC-4P80-Assignment-1.executor": "Run",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"RunOnceActivity.cidr.known.project.marker": "true",
|
||||
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
||||
"cf.first.check.clang-format": "false",
|
||||
"cidr.known.project.marker": "true",
|
||||
"git-widget-placeholder": "main",
|
||||
"last_opened_file_path": "/home/brett/Documents/code/c++/BLT_dev/BLT",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"settings.editor.selected.configurable": "CPPToolchains",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
}
|
||||
}</component>
|
||||
<component name="RunManager" selected="CMake Application.COSC-4P80-Assignment-1">
|
||||
<configuration name="BLT" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="COSC-4P80-Assignment-1" TARGET_NAME="BLT" CONFIG_NAME="Debug">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="COSC-4P80-Assignment-1" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="COSC-4P80-Assignment-1" TARGET_NAME="COSC-4P80-Assignment-1" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="COSC-4P80-Assignment-1" RUN_TARGET_NAME="COSC-4P80-Assignment-1">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<list>
|
||||
<item itemvalue="CMake Application.BLT" />
|
||||
<item itemvalue="CMake Application.COSC-4P80-Assignment-1" />
|
||||
</list>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="c26429cb-3f2d-4b3c-a3dd-031e70b9aeae" name="Changes" comment="" />
|
||||
<created>1726720532743</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1726720532743</updated>
|
||||
<workItem from="1726720533749" duration="20189000" />
|
||||
<workItem from="1727116071317" duration="39656000" />
|
||||
<workItem from="1727648722710" duration="1807000" />
|
||||
<workItem from="1727806367161" duration="2606000" />
|
||||
<workItem from="1727974969818" duration="2000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
<component name="VCPKGProject">
|
||||
<isAutomaticCheckingOnLaunch value="false" />
|
||||
<isAutomaticFoundErrors value="true" />
|
||||
<isAutomaticReloadCMake value="true" />
|
||||
</component>
|
||||
<component name="XSLT-Support.FileAssociations.UIState">
|
||||
<expand />
|
||||
<select />
|
||||
</component>
|
||||
</project>
|
|
@ -25,7 +25,9 @@
|
|||
</configurations>
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="c26429cb-3f2d-4b3c-a3dd-031e70b9aeae" name="Changes" comment="" />
|
||||
<list default="true" id="c26429cb-3f2d-4b3c-a3dd-031e70b9aeae" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/src/main.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/src/main.cpp" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
|
@ -74,6 +76,11 @@
|
|||
}
|
||||
}</component>
|
||||
<component name="RunManager" selected="CMake Application.COSC-4P80-Assignment-1">
|
||||
<configuration default="true" type="CLionExternalRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true">
|
||||
<method v="2">
|
||||
<option name="CLION.EXTERNAL.BUILD" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="BLT" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="COSC-4P80-Assignment-1" TARGET_NAME="BLT" CONFIG_NAME="Debug">
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
|
@ -85,8 +92,8 @@
|
|||
</method>
|
||||
</configuration>
|
||||
<list>
|
||||
<item itemvalue="CMake Application.BLT" />
|
||||
<item itemvalue="CMake Application.COSC-4P80-Assignment-1" />
|
||||
<item itemvalue="CMake Application.BLT" />
|
||||
</list>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
|
@ -104,7 +111,7 @@
|
|||
<workItem from="1727823589121" duration="4802000" />
|
||||
<workItem from="1728063301012" duration="9392000" />
|
||||
<workItem from="1728077207859" duration="2250000" />
|
||||
<workItem from="1728152682974" duration="2000" />
|
||||
<workItem from="1728089514014" duration="3711000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
|
@ -1,5 +1,5 @@
|
|||
cmake_minimum_required(VERSION 3.25)
|
||||
project(COSC-4P80-Assignment-1 VERSION 0.0.20)
|
||||
project(COSC-4P80-Assignment-1 VERSION 0.0.21)
|
||||
|
||||
option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF)
|
||||
option(ENABLE_UBSAN "Enable the ub sanitizer" OFF)
|
||||
|
|
204
src/main.cpp
204
src/main.cpp
|
@ -2,7 +2,8 @@
|
|||
#include <utility>
|
||||
#include <blt/math/matrix.h>
|
||||
#include <blt/math/log_util.h>
|
||||
#include "blt/std/assert.h"
|
||||
#include <blt/std/assert.h>
|
||||
#include <blt/std/random.h>
|
||||
#include <blt/format/boxing.h>
|
||||
#include <blt/iterator/iterator.h>
|
||||
#include <a1.h>
|
||||
|
@ -16,13 +17,20 @@ constexpr blt::u32 output_vec_size = 4;
|
|||
using input_t = a1::matrix_t<1, input_vec_size>;
|
||||
using output_t = a1::matrix_t<1, output_vec_size>;
|
||||
using weight_t = decltype(std::declval<input_t>().transpose() * std::declval<output_t>());
|
||||
using crosstalk_t = a1::matrix_t<1, output_vec_size>;
|
||||
|
||||
struct correctness_t
|
||||
{
|
||||
blt::size_t correct_input = 0;
|
||||
blt::size_t correct_output = 0;
|
||||
blt::size_t incorrect_input = 0;
|
||||
blt::size_t incorrect_output = 0;
|
||||
};
|
||||
|
||||
class ping_pong
|
||||
{
|
||||
public:
|
||||
ping_pong(weight_t weights, input_t input): weights(std::move(weights)), input(std::move(input))
|
||||
{}
|
||||
// ping_pong(weight_t weights, input_t input): weights(std::move(weights)), input(std::move(input))
|
||||
// {}
|
||||
|
||||
ping_pong(weight_t weights, input_t input, output_t output): weights(std::move(weights)), input(std::move(input)), output(std::move(output))
|
||||
{}
|
||||
|
@ -31,6 +39,7 @@ class ping_pong
|
|||
{
|
||||
auto out = (input * weights);
|
||||
return {weights, (out * weights.transpose()).bipolar(), out.bipolar()};
|
||||
// return {weights, (output * weights.transpose()).bipolar(), input * weights};
|
||||
}
|
||||
|
||||
[[nodiscard]] ping_pong pong() const
|
||||
|
@ -68,12 +77,59 @@ class executor
|
|||
{
|
||||
public:
|
||||
executor(const std::vector<input_t>& inputs, const std::vector<output_t>& outputs): weights(), inputs(inputs), outputs(outputs)
|
||||
{
|
||||
generate_weights();
|
||||
}
|
||||
|
||||
void add_pattern(input_t input, output_t output)
|
||||
{
|
||||
inputs.push_back(std::move(input));
|
||||
outputs.push_back(std::move(output));
|
||||
}
|
||||
|
||||
void generate_weights()
|
||||
{
|
||||
for (auto [in, out] : blt::in_pairs(inputs, outputs))
|
||||
weights += in.transpose() * out;
|
||||
}
|
||||
|
||||
std::vector<output_t> crosstalk()
|
||||
void print_weights() const
|
||||
{
|
||||
BLT_TRACE_STREAM << "Weight Matrix: \n" << weights << "\n";
|
||||
}
|
||||
|
||||
void print_crosstalk_table()
|
||||
{
|
||||
using namespace blt::logging;
|
||||
std::vector<std::string> lines;
|
||||
lines.resize(inputs.size() + 2);
|
||||
std::vector<output_t> crosstalk_data;
|
||||
crosstalk_data.resize(outputs.size());
|
||||
|
||||
for (auto [k, data] : blt::enumerate(inputs))
|
||||
(lines[k] += "Input ") += std::to_string(k) += ": | ";
|
||||
|
||||
for (auto [i, c] : blt::enumerate(crosstalk_data))
|
||||
{
|
||||
for (auto [k, data] : blt::in_pairs(inputs, outputs).enumerate())
|
||||
{
|
||||
if (i == k)
|
||||
continue;
|
||||
auto [a, b] = data;
|
||||
|
||||
(((lines[k] += "b=") += to_string_stream(b.vec_from_column_row()) += ",a=") += to_string_stream(
|
||||
a.normalize().vec_from_column_row()) += ",cos=") += to_string_stream(
|
||||
a.normalize() * inputs[i].normalize().transpose()) += " |";
|
||||
c += (b * (a.normalize() * inputs[i].normalize().transpose()));
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto& line : lines)
|
||||
BLT_TRACE_STREAM << line << "\n";
|
||||
|
||||
}
|
||||
|
||||
[[nodiscard]] std::vector<output_t> crosstalk() const
|
||||
{
|
||||
std::vector<output_t> crosstalk_data;
|
||||
crosstalk_data.resize(outputs.size());
|
||||
|
@ -88,15 +144,29 @@ class executor
|
|||
|
||||
c += (b * (a.normalize() * inputs[i].normalize().transpose()));
|
||||
}
|
||||
|
||||
BLT_TRACE("Input %ld has crosstalk magnitude: %f || %f", i, c.magnitude());
|
||||
}
|
||||
|
||||
return crosstalk_data;
|
||||
}
|
||||
|
||||
void print_crosstalk() const
|
||||
{
|
||||
auto talk = crosstalk();
|
||||
|
||||
float total_talk = 0;
|
||||
|
||||
for (auto [i, c] : blt::enumerate(talk))
|
||||
{
|
||||
BLT_TRACE_STREAM << "Input " << i << " [" << inputs[i].vec_from_column_row() << "] has crosstalk magnitude: " << c.magnitude()
|
||||
<< "\n";
|
||||
total_talk += c.magnitude();
|
||||
}
|
||||
BLT_TRACE("Total Crosstalk: %f", total_talk);
|
||||
}
|
||||
|
||||
void execute()
|
||||
{
|
||||
steps.clear();
|
||||
std::vector<ping_pong> initial_pings;
|
||||
initial_pings.reserve(inputs.size());
|
||||
for (auto [input, output] : blt::in_pairs(inputs, outputs))
|
||||
|
@ -114,7 +184,55 @@ class executor
|
|||
} while (steps.rbegin()[0] != steps.rbegin()[1]);
|
||||
}
|
||||
|
||||
void print()
|
||||
void print_execution_summary()
|
||||
{
|
||||
using namespace blt::logging;
|
||||
for (auto [i, data] : blt::zip(inputs, outputs, steps.back()).enumerate())
|
||||
{
|
||||
auto& [input_data, output_data, ping_ping] = data;
|
||||
BLT_TRACE_STREAM << (input_data == ping_ping.get_input() ? ansi::make_color(ansi::GREEN) : ansi::make_color(ansi::RED))
|
||||
<< "[Input: " << std::to_string(i) << "]: " << (input_data == ping_ping.get_input() ? "Passed" : "Failed") << "\n";
|
||||
BLT_TRACE_STREAM << (output_data == ping_ping.get_output() ? ansi::make_color(ansi::GREEN) : ansi::make_color(ansi::RED))
|
||||
<< "[Output: " << std::to_string(i) << "]: " << (output_data == ping_ping.get_output() ? "Passed" : "Failed")
|
||||
<< "\n";
|
||||
}
|
||||
}
|
||||
|
||||
[[nodiscard]] correctness_t correctness() const
|
||||
{
|
||||
correctness_t results;
|
||||
for (auto [i, data] : blt::zip(inputs, outputs, steps.back()).enumerate())
|
||||
{
|
||||
auto& [input_data, output_data, ping_ping] = data;
|
||||
|
||||
if (input_data == ping_ping.get_input())
|
||||
results.correct_input++;
|
||||
else
|
||||
results.incorrect_input++;
|
||||
|
||||
if (output_data == ping_ping.get_output())
|
||||
results.correct_output++;
|
||||
else
|
||||
results.incorrect_output++;
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
void print_correctness() const
|
||||
{
|
||||
auto data = correctness();
|
||||
|
||||
BLT_TRACE("Correct inputs %ld Incorrect inputs %ld | (%lf%%)", data.correct_input, data.incorrect_input,
|
||||
static_cast<double>(data.correct_input * 100) / static_cast<double>(data.incorrect_input + data.correct_input));
|
||||
BLT_TRACE("Correct outputs %ld Incorrect outputs %ld | (%lf%%)", data.correct_output, data.incorrect_output,
|
||||
static_cast<double>(data.correct_output * 100) / static_cast<double>(data.incorrect_output + data.correct_output));
|
||||
BLT_TRACE("Total correct %ld Total incorrect %ld | (%lf%%)", data.correct_input + data.correct_output,
|
||||
data.incorrect_input + data.incorrect_output,
|
||||
static_cast<double>(data.correct_input + data.correct_output) * 100 /
|
||||
static_cast<double>(data.correct_input + data.correct_output + data.incorrect_input + data.incorrect_output));
|
||||
}
|
||||
|
||||
void print_execution_results()
|
||||
{
|
||||
using namespace blt::logging;
|
||||
std::vector<std::string> input_lines;
|
||||
|
@ -220,6 +338,16 @@ class executor
|
|||
}
|
||||
}
|
||||
|
||||
std::vector<ping_pong>& get_results()
|
||||
{
|
||||
return steps.back();
|
||||
}
|
||||
|
||||
std::vector<input_t>& get_inputs()
|
||||
{
|
||||
return inputs;
|
||||
}
|
||||
|
||||
private:
|
||||
weight_t weights;
|
||||
std::vector<input_t> inputs;
|
||||
|
@ -264,14 +392,16 @@ void part_a()
|
|||
|
||||
executor cute(part_a_inputs, part_a_outputs);
|
||||
cute.execute();
|
||||
cute.print();
|
||||
cute.print_execution_results();
|
||||
cute.print_correctness();
|
||||
}
|
||||
|
||||
void part_b()
|
||||
{
|
||||
blt::log_box_t box(BLT_TRACE_STREAM, "Part B", 8);
|
||||
executor cute(part_a_inputs, part_a_outputs);
|
||||
cute.crosstalk();
|
||||
cute.print_crosstalk();
|
||||
// cute.print_crosstalk_table();
|
||||
}
|
||||
|
||||
void part_c()
|
||||
|
@ -279,11 +409,58 @@ void part_c()
|
|||
blt::log_box_t box(BLT_TRACE_STREAM, "Part C", 8);
|
||||
executor cute(part_c_1_inputs, part_c_1_outputs);
|
||||
cute.execute();
|
||||
cute.print();
|
||||
cute.print_execution_results();
|
||||
cute.print_correctness();
|
||||
BLT_TRACE("--- { Part C with 3 extra pairs } ---");
|
||||
executor cute2(part_c_2_inputs, part_c_2_outputs);
|
||||
cute2.execute();
|
||||
cute2.print();
|
||||
cute2.print_execution_results();
|
||||
cute2.print_correctness();
|
||||
}
|
||||
|
||||
blt::size_t hdist(const input_t& a, const input_t& b)
|
||||
{
|
||||
blt::size_t diff = 0;
|
||||
for (auto [av, bv] : blt::in_pairs(a.vec_from_column_row(), b.vec_from_column_row()))
|
||||
diff += (av == bv ? 1 : 0);
|
||||
return diff;
|
||||
}
|
||||
|
||||
void part_d()
|
||||
{
|
||||
blt::log_box_t box(BLT_TRACE_STREAM, "Part D", 8);
|
||||
blt::random::random_t random(std::random_device{}());
|
||||
blt::size_t number_of_runs = 20;
|
||||
for (blt::size_t run = 0; run < number_of_runs; run++)
|
||||
{
|
||||
auto inputs = part_a_inputs;
|
||||
|
||||
executor cute(part_a_inputs, part_a_outputs);
|
||||
|
||||
auto pos = random.get_size_t(0, inputs.size());
|
||||
auto& input = inputs[pos];
|
||||
auto original = input;
|
||||
for (blt::size_t i = 0; i < std::remove_reference_t<decltype(input)>::data_columns; i++)
|
||||
{
|
||||
if (random.choice(0.8))
|
||||
{
|
||||
// flip value of this location
|
||||
auto& d = input[i][0];
|
||||
if (d >= 0)
|
||||
d = -1;
|
||||
else
|
||||
d = 1;
|
||||
}
|
||||
}
|
||||
cute.get_inputs()[pos] = input;
|
||||
cute.execute();
|
||||
auto corrected = cute.get_results()[pos].get_input();
|
||||
|
||||
auto dist_o_m = hdist(original, input);
|
||||
auto dist_m_c = hdist(input, corrected);
|
||||
|
||||
BLT_TRACE("Run %ld mutated difference: %ld corrected difference: %ld", run, dist_o_m, dist_m_c);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
|
@ -294,8 +471,9 @@ int main()
|
|||
part_a();
|
||||
part_b();
|
||||
part_c();
|
||||
part_d();
|
||||
|
||||
std::vector<input_t> test{input_t{1, -1, -1, -1, -1}, input_t{-1, 1, -1, -1, -1}, input_t{-1, -1, 1, -1, -1}};
|
||||
executor cute{test, part_a_outputs};
|
||||
cute.crosstalk();
|
||||
cute.print_crosstalk();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue