Skip to content

Commit

Permalink
✨ Added temperature-aware operational domain simulation. (#646)
Browse files Browse the repository at this point in the history
* 📝 Update pyfiction docstrings

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

* 📝 Update pyfiction docstrings

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

* ✨ add an option to simulate the critical temperature on top of the operational domain.

* 📝 Update pyfiction docstrings

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

* ✅ add unit test.

* 📝 Update pyfiction docstrings

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

* ☔ increase coverage by adding more tests.

* 🎨 small fix.

* 📝 Update pyfiction docstrings

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

* 🎨 small update.

* 📝 Update pyfiction docstrings

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

* 🎨 Restructuring and implementation of Marcel's feedback.

* 🎨 implementation of Marcel's feedback.

* 📝 Update pyfiction docstrings

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

* 🎨 update CLI.

* 🎨 restructuring of the constant namespace.

* 🎨 renaming.

* 📝 Update pyfiction docstrings

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

* 🎨 small fix.

* 🎨 small fix.

* 🎨 small fix.

* 🎨 small fix for ``-DFICTION_ALGLIB:BOOL=OFF``.

* 📝 small update.

* 📝 Update pyfiction docstrings

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

* 📝 small update.

* 🎨 implement Marcel's feedback.

* 🎨 small fix.

* 🎨 small fix.

* 📝 Update pyfiction docstrings

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

* 📝 update docu.

* 📝 update docu.

* 📝 small fix.

* 🎨 small fix.

* 📝 small update.

* 📝 Update pyfiction docstrings

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

* 📝 small update.

* 💚 try to fix windows CI.

* 🎨 integrate Marcel's feedback.

* 🎨 small fix.

* 📝 Update pyfiction docstrings

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

* 🎨 clang-tidy fix.

* 📝 try to fix issue.

* 🎨 implement Marcel's feedback.

* 📝 Update pyfiction docstrings

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

* 🎨 implement Marcel's feedback.

* 🐍 expose operational analysis strategy.

* 🎨 small fix and add docu.

* 🐍 add missing functionality.

* 🎨 Small consistency adjustments, code simplifications, and additional test cases

* 📝 Update pyfiction docstrings

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

* ✅ add additional test.

---------

Signed-off-by: GitHub Actions <[email protected]>
Co-authored-by: GitHub Actions <[email protected]>
Co-authored-by: Marcel Walter <[email protected]>
  • Loading branch information
3 people authored Feb 13, 2025
1 parent 4915141 commit 8ab616d
Show file tree
Hide file tree
Showing 58 changed files with 2,308 additions and 920 deletions.
18 changes: 18 additions & 0 deletions bindings/mnt/pyfiction/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@
create_xor_tt,
## properties
critical_path_length_and_throughput,
critical_temperature_domain,
critical_temperature_domain_contour_tracing,
critical_temperature_domain_flood_fill,
critical_temperature_domain_grid_search,
critical_temperature_domain_random_sampling,
critical_temperature_gate_based,
critical_temperature_non_gate_based,
critical_temperature_params,
Expand Down Expand Up @@ -201,6 +206,7 @@
offset_area,
offset_coordinate,
offset_volume,
operational_analysis_strategy,
operational_condition,
operational_domain,
operational_domain_contour_tracing,
Expand Down Expand Up @@ -304,13 +310,16 @@
wiring_reduction,
wiring_reduction_params,
wiring_reduction_stats,
write_critical_temperature_domain,
write_critical_temperature_domain_to_string,
write_dot_layout,
write_dot_network,
write_fgl_layout,
write_fqca_layout,
write_fqca_layout_params,
write_operational_domain,
write_operational_domain_params,
write_operational_domain_to_string,
write_qca_layout,
write_qca_layout_params,
write_qca_layout_svg,
Expand Down Expand Up @@ -408,6 +417,11 @@
"create_xor_tt",
## properties
"critical_path_length_and_throughput",
"critical_temperature_domain",
"critical_temperature_domain_contour_tracing",
"critical_temperature_domain_flood_fill",
"critical_temperature_domain_grid_search",
"critical_temperature_domain_random_sampling",
"critical_temperature_gate_based",
"critical_temperature_non_gate_based",
"critical_temperature_params",
Expand Down Expand Up @@ -508,6 +522,7 @@
"offset_area",
"offset_coordinate",
"offset_volume",
"operational_analysis_strategy",
"operational_condition",
"operational_domain",
"operational_domain_contour_tracing",
Expand Down Expand Up @@ -611,13 +626,16 @@
"wiring_reduction",
"wiring_reduction_params",
"wiring_reduction_stats",
"write_critical_temperature_domain",
"write_critical_temperature_domain_to_string",
"write_dot_layout",
"write_dot_network",
"write_fgl_layout",
"write_fqca_layout",
"write_fqca_layout_params",
"write_operational_domain",
"write_operational_domain_params",
"write_operational_domain_to_string",
"write_qca_layout",
"write_qca_layout_params",
"write_qca_layout_svg",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,16 @@ inline void is_operational(pybind11::module& m)
.value("REJECT_KINKS", fiction::is_operational_params::operational_condition::REJECT_KINKS,
DOC(fiction_is_operational_params_operational_condition_REJECT_KINKS));

py::enum_<fiction::is_operational_params::operational_analysis_strategy>(
m, "operational_analysis_strategy", DOC(fiction_is_operational_params_operational_analysis_strategy))
.value("SIMULATION_ONLY", fiction::is_operational_params::operational_analysis_strategy::SIMULATION_ONLY,
DOC(fiction_is_operational_params_operational_analysis_strategy_SIMULATION_ONLY))
.value("FILTER_ONLY", fiction::is_operational_params::operational_analysis_strategy::FILTER_ONLY,
DOC(fiction_is_operational_params_operational_analysis_strategy_FILTER_ONLY))
.value("FILTER_THEN_SIMULATION",
fiction::is_operational_params::operational_analysis_strategy::FILTER_THEN_SIMULATION,
DOC(fiction_is_operational_params_operational_analysis_strategy_FILTER_THEN_SIMULATION));

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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include "pyfiction/documentation.hpp"
#include "pyfiction/types.hpp"

#include <fiction/algorithms/simulation/sidb/is_operational.hpp>
#include <fiction/algorithms/simulation/sidb/operational_domain.hpp>

#include <pybind11/operators.h>
Expand Down Expand Up @@ -45,6 +44,28 @@ void operational_domain(pybind11::module& m)
py::arg("stats") = nullptr, DOC(fiction_operational_domain_contour_tracing));
}

template <typename Lyt>
void critical_temperature_domain(pybind11::module& m)
{
namespace py = pybind11;

m.def("critical_temperature_domain_grid_search", &fiction::operational_domain_grid_search<Lyt, py_tt>,
py::arg("lyt"), py::arg("spec"), py::arg("params") = fiction::operational_domain_params{},
py::arg("stats") = nullptr, DOC(fiction_operational_domain_grid_search));

m.def("critical_temperature_domain_random_sampling", &fiction::operational_domain_random_sampling<Lyt, py_tt>,
py::arg("lyt"), py::arg("spec"), py::arg("samples"), py::arg("params") = fiction::operational_domain_params{},
py::arg("stats") = nullptr, DOC(fiction_operational_domain_random_sampling));

m.def("critical_temperature_domain_flood_fill", &fiction::operational_domain_flood_fill<Lyt, py_tt>, py::arg("lyt"),
py::arg("spec"), py::arg("samples"), py::arg("params") = fiction::operational_domain_params{},
py::arg("stats") = nullptr, DOC(fiction_operational_domain_flood_fill));

m.def("critical_temperature_domain_contour_tracing", &fiction::operational_domain_contour_tracing<Lyt, py_tt>,
py::arg("lyt"), py::arg("spec"), py::arg("samples"), py::arg("params") = fiction::operational_domain_params{},
py::arg("stats") = nullptr, DOC(fiction_operational_domain_contour_tracing));
}

} // namespace detail

inline void operational_domain(pybind11::module& m)
Expand All @@ -54,7 +75,7 @@ inline void operational_domain(pybind11::module& m)
py::class_<fiction::parameter_point>(m, "parameter_point", DOC(fiction_parameter_point))
.def(py::init<>(), DOC(fiction_parameter_point_parameter_point))
.def(py::init<const std::vector<double>>(), py::arg("values"), DOC(fiction_parameter_point_parameter_point_2))
.def_readwrite("parameters", &fiction::parameter_point::parameters, DOC(fiction_parameter_point))
.def("get_parameters", &fiction::parameter_point::get_parameters, DOC(fiction_parameter_point_get_parameters))

.def(py::self == py::self, py::arg("other"), DOC(fiction_parameter_point_operator_eq))
.def(py::self != py::self, py::arg("other"), DOC(fiction_parameter_point_operator_ne))
Expand All @@ -71,28 +92,36 @@ inline void operational_domain(pybind11::module& m)

;

py::class_<fiction::operational_domain<fiction::parameter_point, fiction::operational_status>>(
m, "operational_domain", DOC(fiction_operational_domain))
// todu update docu
py::class_<fiction::critical_temperature_domain>(m, "critical_temperature_domain",
DOC(fiction_critical_temperature_domain))
.def(py::init<>())
.def_readwrite("dimensions",
&fiction::operational_domain<fiction::parameter_point, fiction::operational_status>::dimensions,
DOC(fiction_operational_domain_dimensions))
.def_readwrite(
"influence_information",
&fiction::operational_domain<fiction::parameter_point, fiction::operational_status>::operational_values,
DOC(fiction_operational_domain_operational_values))

.def("get_value",
&fiction::operational_domain<fiction::parameter_point, fiction::operational_status>::get_value,
py::arg("point"), DOC(fiction_operational_domain_get_value))

.def("add_value",
&fiction::operational_domain<fiction::parameter_point, fiction::operational_status>::add_value,
py::arg("key"), py::arg("value"), DOC(fiction_operational_domain_add_value))

.def("get_domain",
&fiction::operational_domain<fiction::parameter_point, fiction::operational_status>::get_domain,
DOC(fiction_operational_domain_get_domain))
.def(py::init<const std::vector<fiction::sweep_parameter>>(), py::arg("dims"))
.def("add_dimension", &fiction::critical_temperature_domain::add_dimension, py::arg("dim"),
DOC(fiction_critical_temperature_domain_add_dimension))
.def("get_dimension", &fiction::critical_temperature_domain::get_dimension, py::arg("index"),
DOC(fiction_critical_temperature_domain_get_dimension))
.def("get_number_of_dimensions", &fiction::critical_temperature_domain::get_number_of_dimensions,
DOC(fiction_critical_temperature_domain_get_number_of_dimensions))
.def("contains", &fiction::critical_temperature_domain::contains, py::arg("key"))
.def("add_value", &fiction::critical_temperature_domain::add_value, py::arg("key"), py::arg("value"))
.def("size", &fiction::critical_temperature_domain::size)

;

py::class_<fiction::operational_domain>(m, "operational_domain", DOC(fiction_operational_domain))
.def(py::init<>(), DOC(fiction_operational_domain_operational_domain))
.def(py::init<const std::vector<fiction::sweep_parameter>>(), py::arg("dims"),
DOC(fiction_operational_domain_operational_domain_2))
.def("add_dimension", &fiction::operational_domain::add_dimension, py::arg("dim"),
DOC(fiction_operational_domain_add_dimension))
.def("get_dimension", &fiction::operational_domain::get_dimension, py::arg("index"),
DOC(fiction_operational_domain_get_dimension))
.def("get_number_of_dimensions", &fiction::operational_domain::get_number_of_dimensions,
DOC(fiction_operational_domain_get_number_of_dimensions))
.def("contains", &fiction::operational_domain::contains, py::arg("key"))
.def("add_value", &fiction::operational_domain::add_value, py::arg("key"), py::arg("value"))
.def("size", &fiction::operational_domain::size)

;

Expand All @@ -118,9 +147,7 @@ inline void operational_domain(pybind11::module& m)
.def_readwrite("operational_params", &fiction::operational_domain_params::operational_params,
DOC(fiction_operational_domain_params_operational_params))
.def_readwrite("sweep_dimensions", &fiction::operational_domain_params::sweep_dimensions,
DOC(fiction_operational_domain_params_sweep_dimensions))

;
DOC(fiction_operational_domain_params_sweep_dimensions));

py::class_<fiction::operational_domain_stats>(m, "operational_domain_stats", DOC(fiction_operational_domain_stats))
.def(py::init<>())
Expand All @@ -146,6 +173,9 @@ inline void operational_domain(pybind11::module& m)

detail::operational_domain<py_sidb_100_lattice>(m);
detail::operational_domain<py_sidb_111_lattice>(m);

detail::critical_temperature_domain<py_sidb_100_lattice>(m);
detail::critical_temperature_domain<py_sidb_111_lattice>(m);
}

} // namespace pyfiction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,20 @@ inline void physically_valid_parameters(pybind11::module& m)
{
namespace py = pybind11;

py::class_<fiction::operational_domain<fiction::parameter_point, uint64_t>>(m, "physically_valid_parameters_domain")
py::class_<fiction::sidb_simulation_domain<fiction::parameter_point, uint64_t>>(
m, "physically_valid_parameters_domain")
.def(py::init<>())
.def_readwrite("dimensions", &fiction::operational_domain<fiction::parameter_point, uint64_t>::dimensions)

.def(
"get_excited_state_number_for_parameter",
[](const fiction::operational_domain<fiction::parameter_point, uint64_t>& domain,
const fiction::parameter_point& pp)
[](const fiction::sidb_simulation_domain<fiction::parameter_point, uint64_t>& domain,
const fiction::parameter_point& pp)
{
const auto result = domain.get_value(pp);
const auto result = domain.contains(pp);

// Check if the result has a value
if (result.has_value())
{
return result.value();
return std::get<0>(result.value());
}
// If no value is present, raise a Python ValueError
throw py::value_error(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,73 @@
#include "pyfiction/documentation.hpp"
#include "pyfiction/types.hpp"

#include <fiction/algorithms/simulation/sidb/is_operational.hpp>
#include <fiction/algorithms/simulation/sidb/operational_domain.hpp>
#include <fiction/io/write_operational_domain.hpp>

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

#include <string>
#include <string_view>

namespace pyfiction
{

namespace detail
{
inline void write_operational_domain(pybind11::module& m)
{
namespace py = pybind11;

// Function pointer for writing to a file
void (*write_operational_domain_pointer)(const fiction::operational_domain&, const std::string_view&,
const fiction::write_operational_domain_params&) =
&fiction::write_operational_domain;

// Define function using function pointer
m.def("write_operational_domain", write_operational_domain_pointer, py::arg("opdom"), py::arg("filename"),
py::arg("params"), DOC(fiction_write_operational_domain));

m.def(
"write_operational_domain_to_string",
[](const fiction::operational_domain& opdom,
const fiction::write_operational_domain_params& params = {}) -> std::string
{
std::ostringstream oss;
fiction::write_operational_domain(opdom, oss, params);
return oss.str();
},
py::arg("opdom"), py::arg("params") = fiction::write_operational_domain_params{});
}

inline void write_critical_temperature_domain(pybind11::module& m)
{
namespace py = pybind11;

// Function pointer for writing to a file
void (*write_critical_temperature_domain_pointer)(
const fiction::critical_temperature_domain&, const std::string_view&,
const fiction::write_operational_domain_params&) = &fiction::write_operational_domain;

// Define function using function pointer
m.def("write_critical_temperature_domain", write_critical_temperature_domain_pointer, py::arg("opdom"),
py::arg("filename"), py::arg("params"), DOC(fiction_critical_temperature_domain));

m.def(
"write_critical_temperature_domain_to_string",
[](const fiction::critical_temperature_domain& opdom,
const fiction::write_operational_domain_params& params = {}) -> std::string
{
std::ostringstream oss;
fiction::write_operational_domain(opdom, oss, params);
return oss.str();
},
py::arg("opdom"), py::arg("params") = fiction::write_operational_domain_params{});
}

} // namespace detail

inline void write_operational_domain(pybind11::module& m)
{
namespace py = pybind11;
Expand All @@ -36,16 +96,10 @@ inline void write_operational_domain(pybind11::module& m)
.def_readwrite("non_operational_tag", &fiction::write_operational_domain_params::non_operational_tag,
DOC(fiction_write_operational_domain_params_non_operational_tag))
.def_readwrite("writing_mode", &fiction::write_operational_domain_params::writing_mode,
DOC(fiction_write_operational_domain_params_writing_mode))

;
DOC(fiction_write_operational_domain_params_writing_mode));

void (*write_operational_domain_pointer)(
const fiction::operational_domain<fiction::parameter_point, fiction::operational_status>&,
const std::string_view&, const fiction::write_operational_domain_params&) = &fiction::write_operational_domain;

m.def("write_operational_domain", write_operational_domain_pointer, py::arg("opdom"), py::arg("filename"),
py::arg("params") = fiction::write_operational_domain_params{}, DOC(fiction_write_operational_domain));
detail::write_operational_domain(m);
detail::write_critical_temperature_domain(m);
}

} // namespace pyfiction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ inline void write_qca_layout_svg_impl(pybind11::module& m)
void write_svg_layout(pybind11::module& m)
{
namespace py = pybind11;
namespace py = pybind11;

py::enum_<fiction::write_sidb_layout_svg_params::color_mode>(m, "color_mode",
DOC(fiction_write_sidb_layout_svg_params_color_mode))
Expand All @@ -90,7 +89,11 @@ void write_svg_layout(pybind11::module& m)
.def_readwrite("sidb_border_width", &fiction::write_sidb_layout_svg_params::sidb_border_width,
DOC(fiction_write_sidb_layout_svg_params_sidb_border_width))
.def_readwrite("color_background", &fiction::write_sidb_layout_svg_params::color_background,
DOC(fiction_write_sidb_layout_svg_params_color_background));
DOC(fiction_write_sidb_layout_svg_params_color_background))
.def_readwrite("lattice_mode", &fiction::write_sidb_layout_svg_params::lattice_mode,
DOC(fiction_write_sidb_layout_svg_params_lattice_mode))

;

py::class_<fiction::write_qca_layout_svg_params>(m, "write_qca_layout_svg_params",
DOC(fiction_write_qca_layout_svg_params))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ template <typename Technology>
void fcn_technology_cell_level_layout(pybind11::module& m)
{
namespace py = pybind11;
namespace py = pybind11;

// fetch technology name
auto tech_name = std::string{fiction::tech_impl_name<Technology>};
Expand Down
Loading

0 comments on commit 8ab616d

Please sign in to comment.