From 51792e3f07ded6847a90b3a8fe994ae7cb113cb2 Mon Sep 17 00:00:00 2001 From: Drewniok Date: Sun, 19 May 2024 13:21:57 +0200 Subject: [PATCH 1/3] :alembic: add experiment to measure runtime for ExGS and QuickExact and TTS for TTS. --- .../sidb_simulation/runtime_analysis.cpp | 114 ++++++++++++++++++ .../simulation/sidb/time_to_solution.hpp | 4 +- 2 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 experiments/sidb_simulation/runtime_analysis.cpp diff --git a/experiments/sidb_simulation/runtime_analysis.cpp b/experiments/sidb_simulation/runtime_analysis.cpp new file mode 100644 index 000000000..65617547b --- /dev/null +++ b/experiments/sidb_simulation/runtime_analysis.cpp @@ -0,0 +1,114 @@ +// +// Created by Jan Drewniok on 17.05.24. +// + +#include "fiction/algorithms/iter/bdl_input_iterator.hpp" +#include "fiction/algorithms/simulation/sidb/exhaustive_ground_state_simulation.hpp" +#include "fiction/algorithms/simulation/sidb/quickexact.hpp" +#include "fiction/algorithms/simulation/sidb/quicksim.hpp" +#include "fiction/algorithms/simulation/sidb/sidb_simulation_parameters.hpp" +#include "fiction/algorithms/simulation/sidb/time_to_solution.hpp" +#include "fiction/io/read_sqd_layout.hpp" +#include "fiction/layouts/coordinates.hpp" +#include "fiction/types.hpp" +#include "fiction/utils/truth_table_utils.hpp" +#include "fiction_experiments.hpp" +#include "mockturtle/utils/stopwatch.hpp" + +#include + +#include +#include +#include +#include +#include + +using namespace fiction; + +int main() // NOLINT +{ + experiments::experiment simulation_exp{ + "Benchmark", + "Gate Name", + "#Instances", + "Exhaustive Runtime in s", + "QuickExact Runtime in s", + "Average QuickSim Accuracy of all instances", + "QuickSim Single Runtime in s", + "Sum of TTS of QuickSim in s"}; + + static const std::string folder = fmt::format("{}bestagon_gates_type_tags/", EXPERIMENTS_PATH); + + static const std::array>, 12> gates = { + std::make_pair("hourglass", create_crossing_wire_tt()), + std::make_pair("cx", create_crossing_wire_tt()), + std::make_pair("ha", create_half_adder_tt()), + std::make_pair("and", std::vector{create_and_tt()}), + std::make_pair("xor", std::vector{create_xor_tt()}), + std::make_pair("or", std::vector{create_or_tt()}), + std::make_pair("xnor", std::vector{create_xnor_tt()}), + std::make_pair("fo2", std::vector{create_fan_out_tt()}), + std::make_pair("nor", std::vector{create_nor_tt()}), + std::make_pair("nand", std::vector{create_nand_tt()}), + std::make_pair("inv", std::vector{create_not_tt()}), + std::make_pair("wire", std::vector{create_id_tt()})}; + + const sidb_simulation_parameters parameters{2, -0.32}; + const quicksim_params qs_params{parameters}; + const quickexact_params qe_params{parameters}; + const time_to_solution_params tts_params{}; + + for (const auto& [gate, truth_table] : gates) + { + for (const auto& file : std::filesystem::directory_iterator(fmt::format("{}{}", folder, gate))) + { + const auto layout = read_sqd_layout(file.path().string()); + + double runtime_exhaustive = 0; + double runtime_quickexact = 0; + double tts_quicksim = 0; + std::size_t instances = 0; + double quicksim_accuracy_mean = 0.0; + double quicksim_single_runtime = 0.0; + + // simulate layout with no input pattern + const auto exhaustive_results_layout = exhaustive_ground_state_simulation(layout, parameters); + time_to_solution_stats stats{}; + time_to_solution(layout, qs_params, tts_params, &stats); + const auto quickexact_results_layout = quickexact(layout, qe_params); + + runtime_exhaustive += mockturtle::to_seconds(exhaustive_results_layout.simulation_runtime); + runtime_quickexact += mockturtle::to_seconds(quickexact_results_layout.simulation_runtime); + tts_quicksim += stats.time_to_solution; + instances += 1; + quicksim_accuracy_mean += stats.acc; + quicksim_single_runtime += stats.mean_single_runtime; + + // simulate layout with all input patterns + auto bii = bdl_input_iterator{layout}; + const auto num_input_patterns = truth_table.front().num_bits(); + + for (auto i = 0u; i < num_input_patterns; ++i, ++bii) + { + const auto exhaustive_results = exhaustive_ground_state_simulation(*bii, parameters); + time_to_solution_stats tts_stats{}; + time_to_solution(*bii, qs_params, tts_params, &tts_stats); + const auto quickexact_results = quickexact(*bii, qe_params); + + runtime_exhaustive += mockturtle::to_seconds(exhaustive_results.simulation_runtime); + runtime_quickexact += mockturtle::to_seconds(quickexact_results.simulation_runtime); + tts_quicksim += stats.time_to_solution; + + instances += 1; + quicksim_accuracy_mean += stats.acc; + quicksim_single_runtime += stats.mean_single_runtime; + } + quicksim_accuracy_mean = quicksim_accuracy_mean / static_cast(instances); + simulation_exp(gate, instances, runtime_exhaustive, runtime_quickexact, quicksim_accuracy_mean, + quicksim_single_runtime, tts_quicksim); + simulation_exp.save(); + simulation_exp.table(); + } + } + return EXIT_SUCCESS; +} diff --git a/include/fiction/algorithms/simulation/sidb/time_to_solution.hpp b/include/fiction/algorithms/simulation/sidb/time_to_solution.hpp index 9fdb496d9..9737ff6be 100644 --- a/include/fiction/algorithms/simulation/sidb/time_to_solution.hpp +++ b/include/fiction/algorithms/simulation/sidb/time_to_solution.hpp @@ -93,8 +93,8 @@ struct time_to_solution_stats * @param ps Pointer to a struct where the results (time_to_solution, acc, single runtime) are stored. */ template -void time_to_solution(Lyt& lyt, const quicksim_params& quicksim_params, const time_to_solution_params& tts_params = {}, - time_to_solution_stats* ps = nullptr) noexcept +void time_to_solution(const Lyt& lyt, const quicksim_params& quicksim_params, + const time_to_solution_params& tts_params = {}, time_to_solution_stats* ps = nullptr) noexcept { static_assert(is_cell_level_layout_v, "Lyt is not a cell-level layout"); static_assert(has_sidb_technology_v, "Lyt is not an SiDB layout"); From 2cee1b6c9b84a1a0b7141bfafb967099425de424 Mon Sep 17 00:00:00 2001 From: Drewniok Date: Mon, 20 May 2024 15:35:53 +0200 Subject: [PATCH 2/3] :art: implement Marcel's suggestions. --- .../sidb_simulation/runtime_analysis.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/experiments/sidb_simulation/runtime_analysis.cpp b/experiments/sidb_simulation/runtime_analysis.cpp index 65617547b..ab16e5e59 100644 --- a/experiments/sidb_simulation/runtime_analysis.cpp +++ b/experiments/sidb_simulation/runtime_analysis.cpp @@ -31,11 +31,11 @@ int main() // NOLINT "Benchmark", "Gate Name", "#Instances", - "Exhaustive Runtime in s", - "QuickExact Runtime in s", - "Average QuickSim Accuracy of all instances", - "QuickSim Single Runtime in s", - "Sum of TTS of QuickSim in s"}; + "Exhaustive Runtime [s]", + "QuickExact Runtime [s]", + "Average QuickSim Accuracy", + "QuickSim Single Runtime [s]", + "Total QuickSim TTS [s]"}; static const std::string folder = fmt::format("{}bestagon_gates_type_tags/", EXPERIMENTS_PATH); @@ -53,9 +53,9 @@ int main() // NOLINT std::make_pair("inv", std::vector{create_not_tt()}), std::make_pair("wire", std::vector{create_id_tt()})}; - const sidb_simulation_parameters parameters{2, -0.32}; - const quicksim_params qs_params{parameters}; - const quickexact_params qe_params{parameters}; + const sidb_simulation_parameters sim_params{2, -0.32}; + const quicksim_params qs_params{sim_params}; + const quickexact_params qe_params{sim_params}; const time_to_solution_params tts_params{}; for (const auto& [gate, truth_table] : gates) @@ -72,7 +72,7 @@ int main() // NOLINT double quicksim_single_runtime = 0.0; // simulate layout with no input pattern - const auto exhaustive_results_layout = exhaustive_ground_state_simulation(layout, parameters); + const auto exhaustive_results_layout = exhaustive_ground_state_simulation(layout, sim_params); time_to_solution_stats stats{}; time_to_solution(layout, qs_params, tts_params, &stats); const auto quickexact_results_layout = quickexact(layout, qe_params); @@ -90,7 +90,7 @@ int main() // NOLINT for (auto i = 0u; i < num_input_patterns; ++i, ++bii) { - const auto exhaustive_results = exhaustive_ground_state_simulation(*bii, parameters); + const auto exhaustive_results = exhaustive_ground_state_simulation(*bii, sim_params); time_to_solution_stats tts_stats{}; time_to_solution(*bii, qs_params, tts_params, &tts_stats); const auto quickexact_results = quickexact(*bii, qe_params); From e40b903a76031bfad7efda93425632da260fbb1c Mon Sep 17 00:00:00 2001 From: Drewniok Date: Mon, 20 May 2024 15:36:49 +0200 Subject: [PATCH 3/3] :art: add missing header. --- experiments/sidb_simulation/runtime_analysis.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/experiments/sidb_simulation/runtime_analysis.cpp b/experiments/sidb_simulation/runtime_analysis.cpp index ab16e5e59..ee4b30bdd 100644 --- a/experiments/sidb_simulation/runtime_analysis.cpp +++ b/experiments/sidb_simulation/runtime_analysis.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include