Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Extended BDL input iterator to support different SiDB input representations #521

Merged
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
06ca5f6
:sparkles: Added an option to decide how input patterns are implement…
Drewniok Sep 3, 2024
baffb45
:alembic: add experiment for temperature simulation.
Drewniok Sep 3, 2024
432ebc9
:memo: Update pyfiction docstrings
actions-user Sep 3, 2024
362a6fe
🎨 Incorporated pre-commit fixes
pre-commit-ci[bot] Sep 3, 2024
4f321c6
:memo: update docu.
Drewniok Sep 3, 2024
abc6a1e
🎨 Incorporated pre-commit fixes
pre-commit-ci[bot] Sep 3, 2024
0fa2a02
:memo: small fix.
Drewniok Sep 3, 2024
c875577
:art: small fix.
Drewniok Sep 4, 2024
f607f27
:art: small fix to avoid window compile issue.
Drewniok Sep 4, 2024
de5d56d
:memo: Update pyfiction docstrings
actions-user Sep 4, 2024
7ba193e
:rotating_light: implement clang-tidy warning.
Drewniok Sep 4, 2024
aef5d7f
Merge remote-tracking branch 'origin/update_bdl_input_iterator_and_te…
Drewniok Sep 4, 2024
bfe7b12
🎨 Incorporated pre-commit fixes
pre-commit-ci[bot] Sep 4, 2024
704e540
:memo: update docu.
Drewniok Sep 4, 2024
6ff3711
:art: small fix.
Drewniok Sep 4, 2024
f098907
:art: small fix.
Drewniok Sep 5, 2024
4d00092
:memo: Update pyfiction docstrings
actions-user Sep 5, 2024
8832857
:art: implement Marcel's feedback.
Drewniok Sep 6, 2024
455ae7a
🎨 Incorporated pre-commit fixes
pre-commit-ci[bot] Sep 6, 2024
8164a01
:memo: Update pyfiction docstrings
actions-user Sep 6, 2024
c0514f4
:memo: add changelog entry.
Drewniok Sep 6, 2024
8906f74
Merge remote-tracking branch 'origin/update_bdl_input_iterator_and_te…
Drewniok Sep 6, 2024
10b1e97
:memo: fix changelog entry.
Drewniok Sep 6, 2024
4dae22d
Merge branch 'main' into update_bdl_input_iterator_and_temperature_ex…
Drewniok Sep 6, 2024
dcef85c
Merge branch 'main' into update_bdl_input_iterator_and_temperature_ex…
Drewniok Sep 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -32,8 +32,8 @@ void bdl_input_iterator(pybind11::module& m, const std::string& lattice)

py::class_<fiction::bdl_input_iterator<Lyt>>(m, fmt::format("bdl_input_iterator_{}", lattice).c_str(),
DOC(fiction_bdl_input_iterator))
.def(py::init<const Lyt&, const fiction::detect_bdl_pairs_params&>(), "lyt"_a,
"params"_a = fiction::detect_bdl_pairs_params{}, DOC(fiction_bdl_input_iterator_bdl_input_iterator))
.def(py::init<const Lyt&, const fiction::bdl_input_iterator_params&>(), "lyt"_a,
"params"_a = fiction::bdl_input_iterator_params{}, DOC(fiction_bdl_input_iterator_bdl_input_iterator))
.def(
"__next__",
[](fiction::bdl_input_iterator<Lyt>& self) -> Lyt&
@@ -102,6 +102,30 @@ void bdl_input_iterator(pybind11::module& m, const std::string& lattice)

inline void bdl_input_iterator(pybind11::module& m)
{
namespace py = pybind11;
using namespace py::literals;

/**
* Input BDL configuration
*/
py::enum_<typename fiction::bdl_input_iterator_params::input_bdl_configuration>(m, "input_bdl_configuration")
.value("PERTURBER_ABSENCE_ENCODED",
fiction::bdl_input_iterator_params::input_bdl_configuration::PERTURBER_ABSENCE_ENCODED,
DOC(fiction_bdl_input_iterator_params_input_bdl_configuration_PERTURBER_ABSENCE_ENCODED))
.value("PERTURBER_DISTANCE_ENCODED",
fiction::bdl_input_iterator_params::input_bdl_configuration::PERTURBER_DISTANCE_ENCODED,
DOC(fiction_bdl_input_iterator_params_input_bdl_configuration_PERTURBER_DISTANCE_ENCODED));

/**
* BDL input iterator parameters.
*/
py::class_<fiction::bdl_input_iterator_params>(m, "bdl_input_iterator_params")
.def(py::init<>())
.def_readwrite("input_bdl_config", &fiction::bdl_input_iterator_params::input_bdl_config,
DOC(fiction_bdl_input_iterator_params_input_bdl_config))
.def_readwrite("bdl_pairs_params", &fiction::bdl_input_iterator_params::bdl_pairs_params,
DOC(fiction_bdl_input_iterator_params_bdl_pairs_params));

// NOTE be careful with the order of the following calls! Python will resolve the first matching overload!

detail::bdl_input_iterator<py_sidb_100_lattice>(m, "100");
Original file line number Diff line number Diff line change
@@ -67,11 +67,9 @@ inline void critical_temperature(pybind11::module& m)
.def("report", &fiction::critical_temperature_stats::report, DOC(fiction_critical_temperature_stats_report))
.def_readonly("algorithm_name", &fiction::critical_temperature_stats::algorithm_name,
DOC(fiction_critical_temperature_stats_algorithm_name))
.def_readonly("critical_temperature", &fiction::critical_temperature_stats::critical_temperature,
DOC(fiction_critical_temperature_stats_critical_temperature))
.def_readonly("num_valid_lyt", &fiction::critical_temperature_stats::num_valid_lyt,
DOC(fiction_critical_temperature_stats_num_valid_lyt))
.def_readonly("energy_between_ground_state_and_first_erroneous",
.def_readonly("is_ground_state_transparent",
&fiction::critical_temperature_stats::energy_between_ground_state_and_first_erroneous,
DOC(fiction_critical_temperature_stats_energy_between_ground_state_and_first_erroneous))

@@ -91,8 +89,8 @@ inline void critical_temperature(pybind11::module& m)
DOC(fiction_critical_temperature_params_confidence_level))
.def_readwrite("max_temperature", &fiction::critical_temperature_params::max_temperature,
DOC(fiction_critical_temperature_params_max_temperature))
.def_readwrite("bdl_params", &fiction::critical_temperature_params::bdl_params,
DOC(fiction_critical_temperature_params_bdl_params));
.def_readwrite("input_bdl_iterator_params", &fiction::critical_temperature_params::input_bdl_iterator_params,
DOC(fiction_critical_temperature_params_input_bdl_iterator_params));

// NOTE be careful with the order of the following calls! Python will resolve the first matching overload!

Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@ void is_operational(pybind11::module& m)
"params"_a = fiction::is_operational_params{}, DOC(fiction_is_operational));

m.def("operational_input_patterns", &fiction::operational_input_patterns<Lyt, py_tt>, "lyt"_a, "spec"_a,
"params"_a = fiction::is_operational_params{}, DOC(fiction_is_operational));
"params"_a = fiction::is_operational_params{}, DOC(fiction_operational_input_patterns));
}

} // namespace detail
@@ -47,11 +47,11 @@ inline void is_operational(pybind11::module& m)
py::class_<fiction::is_operational_params>(m, "is_operational_params", DOC(fiction_is_operational_params))
.def(py::init<>())
.def_readwrite("simulation_parameters", &fiction::is_operational_params::simulation_parameters,
DOC(fiction_is_operational_params))
DOC(fiction_is_operational_params_simulation_parameters))
.def_readwrite("sim_engine", &fiction::is_operational_params::sim_engine,
DOC(fiction_is_operational_params_sim_engine))
.def_readwrite("bdl_params", &fiction::is_operational_params::bdl_params,
DOC(fiction_is_operational_params_bdl_params));
.def_readwrite("input_bdl_iterator_params", &fiction::is_operational_params::input_bdl_iterator_params,
DOC(fiction_is_operational_params_input_bdl_iterator_params));

// NOTE be careful with the order of the following calls! Python will resolve the first matching overload!

80 changes: 56 additions & 24 deletions bindings/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
Original file line number Diff line number Diff line change
@@ -524,7 +524,7 @@ Parameter ``lyt``:
The SiDB BDL layout to iterate over.

Parameter ``params``:
Parameters for the BDL pair detection.)doc";
Parameters for the BDL input iterator.)doc";

static const char *__doc_fiction_bdl_input_iterator_current_input_index =
R"doc(The current input index. There are :math:`2^n` possible input states
@@ -703,6 +703,38 @@ Parameter ``other``:
The difference between the current input index and the given
iterator ones.)doc";

static const char *__doc_fiction_bdl_input_iterator_params = R"doc(Parameters for the BDL input iterator.)doc";

static const char *__doc_fiction_bdl_input_iterator_params_2 = R"doc(Parameters for the BDL input iterator.)doc";

static const char *__doc_fiction_bdl_input_iterator_params_bdl_pairs_params = R"doc(Parameters to detect BDL pairs.)doc";

static const char *__doc_fiction_bdl_input_iterator_params_input_bdl_config =
R"doc(The `input_bdl_config` member allows selection between different modes
for handling input BDLs.)doc";

static const char *__doc_fiction_bdl_input_iterator_params_input_bdl_configuration =
R"doc(This enum defines how BDL inputs are manipulated within the algorithm.
According to existing literature, there are two main approaches for
handling BDL inputs:

1. A perturber is used to set the input to `1`, while the absence of a
perturber represents a `0` (as described in
https://ieeexplore.ieee.org/abstract/document/8963859). 2. An input of
`1` is generated by placing a perturber closer to the target, whereas
a `0` is produced by positioning the perturber farther away (as
described in https://dl.acm.org/doi/10.1145/3489517.3530525).)doc";

static const char *__doc_fiction_bdl_input_iterator_params_input_bdl_configuration_PERTURBER_ABSENCE_ENCODED =
R"doc(A perturber is used to set the input to `1`, while the absence of a
perturber represents a `0` (as described in
https://ieeexplore.ieee.org/abstract/document/8963859).)doc";

static const char *__doc_fiction_bdl_input_iterator_params_input_bdl_configuration_PERTURBER_DISTANCE_ENCODED =
R"doc(An input of `1` is generated by placing a perturber closer to the BDL
wire, whereas a `0` is produced by positioning the perturber farther
away (as described in https://dl.acm.org/doi/10.1145/3489517.3530525).)doc";

static const char *__doc_fiction_bdl_input_iterator_set_all_inputs =
R"doc(Sets all input cells of the layout according to the current input
index. The input index is interpreted as a binary number, where the
@@ -3075,8 +3107,6 @@ static const char *__doc_fiction_critical_temperature_params_alpha =
R"doc(Alpha parameter for the *QuickSim* algorithm (only applicable if
engine == APPROXIMATE).)doc";

static const char *__doc_fiction_critical_temperature_params_bdl_params = R"doc(Parameters for the BDL pair detection algorithms.)doc";

static const char *__doc_fiction_critical_temperature_params_confidence_level =
R"doc(Probability threshold for ground state population. The temperature at
which the simulation finds the ground state to be populated with a
@@ -3086,6 +3116,8 @@ probability of erroneous calculations of the gate.)doc";

static const char *__doc_fiction_critical_temperature_params_engine = R"doc(Simulation mode to determine the *Critical Temperature*.)doc";

static const char *__doc_fiction_critical_temperature_params_input_bdl_iterator_params = R"doc(Parameters for the BDL input iterator.)doc";

static const char *__doc_fiction_critical_temperature_params_iteration_steps =
R"doc(Number of iteration steps for the *QuickSim* algorithm (only
applicable if engine == APPROXIMATE).)doc";
@@ -3116,8 +3148,6 @@ static const char *__doc_fiction_critical_temperature_stats_algorithm_name =
R"doc(Name of the algorithm used to compute the physically valid charge
distributions.)doc";

static const char *__doc_fiction_critical_temperature_stats_critical_temperature = R"doc(*Critical Temperature* of the given layout (unit: K).)doc";

static const char *__doc_fiction_critical_temperature_stats_energy_between_ground_state_and_first_erroneous =
R"doc(Energy difference between the ground state and the first (erroneous)
excited state (unit: meV).)doc";
@@ -4155,6 +4185,8 @@ static const char *__doc_fiction_detail_critical_temperature_impl = R"doc()doc";

static const char *__doc_fiction_detail_critical_temperature_impl_bii = R"doc(Iterator that iterates over all possible input states.)doc";

static const char *__doc_fiction_detail_critical_temperature_impl_critical_temperature = R"doc(Critical temperature [K].)doc";

static const char *__doc_fiction_detail_critical_temperature_impl_critical_temperature_impl = R"doc()doc";

static const char *__doc_fiction_detail_critical_temperature_impl_determine_critical_temperature =
@@ -4164,23 +4196,6 @@ Parameter ``energy_state_type``:
All energies of all physically valid charge distributions with the
corresponding state type (i.e. transparent, erroneous).)doc";

static const char *__doc_fiction_detail_critical_temperature_impl_energy_between_ground_state_and_first_erroneous =
R"doc(The energy difference between the ground state and the first erroneous
state is determined. Additionally, the state type of the ground state
is determined and returned.

Parameter ``energy_and_state_type``:
All energies of all physically valid charge distributions with the
corresponding state type (i.e. transparent, erroneous).

Parameter ``min_energy``:
Minimal energy of all physically valid charge distributions of a
given layout (unit: eV).

Returns:
State type (i.e. transparent, erroneous) of the ground state is
returned.)doc";

static const char *__doc_fiction_detail_critical_temperature_impl_gate_based_simulation =
R"doc(*Gate-based Critical Temperature* Simulation of a SiDB layout for a
given Boolean function.
@@ -4198,6 +4213,23 @@ R"doc(Returns the critical temperature.
Returns:
The critical temperature (unit: K).)doc";

static const char *__doc_fiction_detail_critical_temperature_impl_is_ground_state_transparent =
R"doc(The energy difference between the ground state and the first erroneous
state is determined. Additionally, the state type of the ground state
is determined and returned.

Parameter ``energy_and_state_type``:
All energies of all physically valid charge distributions with the
corresponding state type (i.e. transparent, erroneous).

Parameter ``min_energy``:
Minimal energy of all physically valid charge distributions of a
given layout (unit: eV).

Returns:
State type (i.e. transparent, erroneous) of the ground state is
returned.)doc";

static const char *__doc_fiction_detail_critical_temperature_impl_layout = R"doc(SiDB cell-level layout.)doc";

static const char *__doc_fiction_detail_critical_temperature_impl_non_gate_based_simulation =
@@ -12562,7 +12594,7 @@ Parameter ``params``:

static const char *__doc_fiction_is_operational_params = R"doc(Parameters for the `is_operational` algorithm.)doc";

static const char *__doc_fiction_is_operational_params_bdl_params = R"doc(Parameters for the BDL pair detection algorithms.)doc";
static const char *__doc_fiction_is_operational_params_input_bdl_iterator_params = R"doc(Parameters for the BDL input iterator.)doc";

static const char *__doc_fiction_is_operational_params_sim_engine =
R"doc(The simulation engine to be used for the operational domain
@@ -12616,7 +12648,7 @@ static const char *__doc_fiction_is_sidb_gate_design_impossible_params =
R"doc(This struct contains parameters to determine if SiDB gate design is
impossible.)doc";

static const char *__doc_fiction_is_sidb_gate_design_impossible_params_detect_bdl_params = R"doc(Parameters used to determine BDL pairs.)doc";
static const char *__doc_fiction_is_sidb_gate_design_impossible_params_input_bdl_iterator_params = R"doc(Parameters for the BDL input iterator.)doc";

static const char *__doc_fiction_is_sidb_gate_design_impossible_params_simulation_params = R"doc(All parameters for physical SiDB simulations.)doc";

Original file line number Diff line number Diff line change
@@ -30,8 +30,8 @@ def test_siqad_and_gate_100_lattice(self):
params.displacement_variations = [1, 1]
params.operational_params.simulation_parameters = sidb_simulation_parameters(2, -0.28)

params.operational_params.bdl_params.maximum_distance = 2.0
params.operational_params.bdl_params.minimum_distance = 0.2
params.operational_params.input_bdl_iterator_params.bdl_pairs_params.maximum_distance = 2.0
params.operational_params.input_bdl_iterator_params.bdl_pairs_params.minimum_distance = 0.2

# only offset_coordinate(4, 5) and offset_coordinate(10,12) are affected by displacement
params.fixed_sidbs = {offset_coordinate(0, 1), offset_coordinate(2, 3), offset_coordinate(20, 1),
16 changes: 10 additions & 6 deletions cli/cmd/simulation/temp.hpp
Original file line number Diff line number Diff line change
@@ -68,6 +68,7 @@ class temp_command : public command
{
// reset statistics
stats = {};
ct = 0.0;

if (params.confidence_level <= 0 || params.confidence_level > 1)
{
@@ -143,12 +144,12 @@ class temp_command : public command

const auto tt_ptr = ts.current();

fiction::critical_temperature_gate_based(*lyt_ptr, std::vector<fiction::tt>{*tt_ptr}, params,
&stats);
ct = fiction::critical_temperature_gate_based(*lyt_ptr, std::vector<fiction::tt>{*tt_ptr},
params, &stats);
}
else
{
fiction::critical_temperature_non_gate_based(*lyt_ptr, params, &stats);
ct = fiction::critical_temperature_non_gate_based(*lyt_ptr, params, &stats);
}

if (stats.num_valid_lyt == 0)
@@ -159,8 +160,7 @@ class temp_command : public command
else
{
env->out() << fmt::format("[i] critical temperature of {} is {}{} K", get_name(lyt_ptr),
(stats.critical_temperature == params.max_temperature ? "> " : ""),
stats.critical_temperature)
(ct == params.max_temperature ? "> " : ""), ct)
<< std::endl;

if (stats.num_valid_lyt > 1)
@@ -198,6 +198,10 @@ class temp_command : public command
* Critical temperature statistics.
*/
fiction::critical_temperature_stats stats{};
/**
* Critical temperature.
*/
double ct = 0.0;
Drewniok marked this conversation as resolved.
Show resolved Hide resolved

/**
* Logs the resulting information in a log file.
@@ -212,7 +216,7 @@ class temp_command : public command
{"epsilon_r", stats.simulation_parameters.epsilon_r},
{"lambda_tf", stats.simulation_parameters.lambda_tf},
{"mu_minus", stats.simulation_parameters.mu_minus}}},
{"Critical temperature", stats.critical_temperature},
{"Critical temperature", ct},
{"Number of stable states", stats.num_valid_lyt},
{"Energy difference between ground state and first erroneous state",
stats.energy_between_ground_state_and_first_erroneous}};
2 changes: 2 additions & 0 deletions docs/algorithms/iterators.rst
Original file line number Diff line number Diff line change
@@ -23,6 +23,8 @@ BDL Input Iterator
.. tab:: C++
**Header:** ``fiction/algorithms/iter/bdl_input_iterator.hpp``

.. doxygenstruct:: fiction::bdl_input_iterator_params
:members:
.. doxygenclass:: fiction::bdl_input_iterator
:members:

10 changes: 10 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.

The format is based on `Keep a Changelog <https://keepachangelog.com/en/1.0.0/>`_.

Unreleased```
-------------

Added
#####
- Experiments:
- Script to simulate the critical temperature of SiQAD and Bestagon gates
- Algorithms:
- Added support for different ways of implementing input information in SiDB technology to the BDL input iterator

v0.6.4 - 2024-08-30
-------------------

6 changes: 4 additions & 2 deletions docs/publications.rst
Original file line number Diff line number Diff line change
@@ -115,7 +115,7 @@ Furthermore, if you use any of the design automation algorithms, please consider
year={2023}
}

`QuickSim experiment script <https://github.com/cda-tum/fiction/tree/main/experiments/sidb_simulation>`_
`QuickSim experiment script <https://github.com/cda-tum/fiction/tree/main/experiments/sidb_simulation/electrostatic_ground_state>`_

* :ref:`QuickExact <quickexact>` (``quickexact``):

@@ -129,7 +129,7 @@ Furthermore, if you use any of the design automation algorithms, please consider
year={2024}
}

`QuickExact experiment script <https://github.com/cda-tum/fiction/tree/main/experiments/sidb_simulation>`_
`QuickExact experiment script <https://github.com/cda-tum/fiction/tree/main/experiments/sidb_simulation/electrostatic_ground_state>`_

* :ref:`Critical temperature simulation <critical_temperature>` (``critical_temperature``):

@@ -143,6 +143,8 @@ Furthermore, if you use any of the design automation algorithms, please consider
year={2023}
}

`Critical temperature experiment scripts <https://github.com/cda-tum/fiction/tree/main/experiments/sidb_simulation/temperature>`_

* :ref:`Operational domain computation <opdom>` (``opdom``):

.. code-block:: tex
Original file line number Diff line number Diff line change
@@ -13,9 +13,9 @@
#include "fiction/types.hpp"
#include "fiction/utils/truth_table_utils.hpp"
#include "fiction_experiments.hpp"
#include "mockturtle/utils/stopwatch.hpp"

#include <fmt/format.h>
#include <mockturtle/utils/stopwatch.hpp>

#include <array>
#include <cstdlib>
Loading
Loading