Skip to content

Commit

Permalink
✨ Extended BDL input iterator to support different SiDB input represe…
Browse files Browse the repository at this point in the history
…ntations (#521)

* ✨ Added an option to decide how input patterns are implemented in terms of perturber placement.

* ⚗️ add experiment for temperature simulation.

* 📝 Update pyfiction docstrings

Signed-off-by: GitHub Actions <[email protected]>

* 🎨 Incorporated pre-commit fixes

* 📝 update docu.

* 🎨 Incorporated pre-commit fixes

* 📝 small fix.

* 🎨 small fix.

* 🎨 small fix to avoid window compile issue.

* 📝 Update pyfiction docstrings

Signed-off-by: GitHub Actions <[email protected]>

* 🚨 implement clang-tidy warning.

* 🎨 Incorporated pre-commit fixes

* 📝 update docu.

* 🎨 small fix.

* 🎨 small fix.

* 📝 Update pyfiction docstrings

Signed-off-by: GitHub Actions <[email protected]>

* 🎨 implement Marcel's feedback.

* 🎨 Incorporated pre-commit fixes

* 📝 Update pyfiction docstrings

Signed-off-by: GitHub Actions <[email protected]>

* 📝 add changelog entry.

* 📝 fix changelog entry.

---------

Signed-off-by: GitHub Actions <[email protected]>
Co-authored-by: GitHub Actions <[email protected]>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
3 people authored Sep 7, 2024
1 parent 1547f0c commit 2541fdb
Show file tree
Hide file tree
Showing 25 changed files with 765 additions and 231 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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&
Expand Down Expand Up @@ -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");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand All @@ -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!

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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!

Expand Down
80 changes: 56 additions & 24 deletions bindings/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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";
Expand Down Expand Up @@ -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";
Expand Down Expand Up @@ -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 =
Expand All @@ -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.
Expand All @@ -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 =
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
16 changes: 10 additions & 6 deletions cli/cmd/simulation/temp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class temp_command : public command
{
// reset statistics
stats = {};
ct = 0.0;

if (params.confidence_level <= 0 || params.confidence_level > 1)
{
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -198,6 +198,10 @@ class temp_command : public command
* Critical temperature statistics.
*/
fiction::critical_temperature_stats stats{};
/**
* Critical temperature.
*/
double ct = 0.0;

/**
* Logs the resulting information in a log file.
Expand All @@ -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}};
Expand Down
2 changes: 2 additions & 0 deletions docs/algorithms/iterators.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down
10 changes: 10 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
-------------------

Expand Down
6 changes: 4 additions & 2 deletions docs/publications.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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``):

Expand All @@ -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``):

Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Loading

0 comments on commit 2541fdb

Please sign in to comment.