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

✨ Added temperature-aware operational domain simulation. #646

Merged
merged 79 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from 60 commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
9477cf8
:memo: Update pyfiction docstrings
actions-user Dec 12, 2024
35fed45
Merge branch 'cda-tum:main' into main
Drewniok Dec 26, 2024
bc905b7
Merge branch 'cda-tum:main' into main
Drewniok Jan 2, 2025
f188a69
Merge branch 'cda-tum:main' into main
Drewniok Jan 7, 2025
65ec0a5
Merge branch 'cda-tum:main' into main
Drewniok Jan 8, 2025
24c2421
Merge branch 'cda-tum:main' into main
Drewniok Jan 9, 2025
4113659
:memo: Update pyfiction docstrings
actions-user Jan 9, 2025
72e08f4
Merge branch 'cda-tum:main' into main
Drewniok Jan 11, 2025
dfb71fb
Merge branch 'cda-tum:main' into main
Drewniok Jan 12, 2025
d5c5ff5
Merge branch 'cda-tum:main' into main
Drewniok Jan 13, 2025
9d45592
Merge branch 'cda-tum:main' into main
Drewniok Jan 13, 2025
dfaf039
Merge branch 'cda-tum:main' into main
Drewniok Jan 14, 2025
af15694
Merge branch 'cda-tum:main' into main
Drewniok Jan 15, 2025
74dfaab
Merge branch 'cda-tum:main' into main
Drewniok Jan 19, 2025
5598bce
Merge branch 'cda-tum:main' into main
Drewniok Jan 23, 2025
7a1cde8
Merge branch 'cda-tum:main' into main
Drewniok Jan 24, 2025
ecb1fbb
Merge branch 'cda-tum:main' into main
Drewniok Jan 25, 2025
f6b0cb1
:sparkles: add an option to simulate the critical temperature on top …
Drewniok Jan 25, 2025
fe90a6f
:memo: Update pyfiction docstrings
actions-user Jan 25, 2025
beb9625
:white_check_mark: add unit test.
Drewniok Jan 25, 2025
2f8c088
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Jan 25, 2025
7507fc2
:memo: Update pyfiction docstrings
actions-user Jan 25, 2025
592c66f
:umbrella: increase coverage by adding more tests.
Drewniok Jan 26, 2025
e2b8fee
:art: small fix.
Drewniok Jan 26, 2025
d2df7f0
:memo: Update pyfiction docstrings
actions-user Jan 26, 2025
9c7966a
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Jan 26, 2025
3a488cd
:art: small update.
Drewniok Jan 27, 2025
de898eb
:memo: Update pyfiction docstrings
actions-user Jan 27, 2025
8c6bd0a
Merge branch 'cda-tum:main' into main
Drewniok Jan 28, 2025
eb9815e
:art: Restructuring and implementation of Marcel's feedback.
Drewniok Jan 30, 2025
fc8e96d
Merge branch 'cda-tum:main' into main
Drewniok Jan 30, 2025
f80ae12
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Jan 30, 2025
d36f178
:art: implementation of Marcel's feedback.
Drewniok Jan 30, 2025
5672bfc
:memo: Update pyfiction docstrings
actions-user Jan 30, 2025
43c586d
:art: update CLI.
Drewniok Jan 30, 2025
60b55a1
:art: restructuring of the constant namespace.
Drewniok Jan 30, 2025
5f3fc36
:art: renaming.
Drewniok Jan 30, 2025
0e02c6b
:memo: Update pyfiction docstrings
actions-user Jan 30, 2025
a5f214a
:art: small fix.
Drewniok Jan 30, 2025
14160e5
:art: small fix.
Drewniok Jan 30, 2025
66d8662
:art: small fix.
Drewniok Jan 30, 2025
5f003a1
:art: small fix for ``-DFICTION_ALGLIB:BOOL=OFF``.
Drewniok Jan 30, 2025
93f7b15
:memo: small update.
Drewniok Jan 30, 2025
02693f8
:memo: Update pyfiction docstrings
actions-user Jan 30, 2025
06988cf
:memo: small update.
Drewniok Jan 30, 2025
1a5433f
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Feb 2, 2025
d44cbfd
:art: implement Marcel's feedback.
Drewniok Feb 2, 2025
06d2bf0
Merge remote-tracking branch 'origin/add_fom_to_operational_domain' i…
Drewniok Feb 2, 2025
f7dc106
:art: small fix.
Drewniok Feb 2, 2025
b919ecb
:art: small fix.
Drewniok Feb 2, 2025
5d60209
:memo: Update pyfiction docstrings
actions-user Feb 2, 2025
dbf41e4
:memo: update docu.
Drewniok Feb 2, 2025
05b4458
:memo: update docu.
Drewniok Feb 2, 2025
683c66d
:memo: small fix.
Drewniok Feb 3, 2025
dcc9c1c
:art: small fix.
Drewniok Feb 3, 2025
0060839
:memo: small update.
Drewniok Feb 3, 2025
2aab191
:memo: Update pyfiction docstrings
actions-user Feb 3, 2025
1e4c1a3
:memo: small update.
Drewniok Feb 3, 2025
8b41506
:green_heart: try to fix windows CI.
Drewniok Feb 3, 2025
7c44884
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Feb 4, 2025
e453686
:art: integrate Marcel's feedback.
Drewniok Feb 7, 2025
d1ef260
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Feb 7, 2025
42578f1
:art: small fix.
Drewniok Feb 7, 2025
b85d7b7
:memo: Update pyfiction docstrings
actions-user Feb 7, 2025
e01c681
:art: clang-tidy fix.
Drewniok Feb 7, 2025
04a70c8
Merge remote-tracking branch 'origin/add_fom_to_operational_domain' i…
Drewniok Feb 7, 2025
6242649
:memo: try to fix issue.
Drewniok Feb 7, 2025
c2d5e22
:art: implement Marcel's feedback.
Drewniok Feb 9, 2025
3795f52
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Feb 9, 2025
a771949
:memo: Update pyfiction docstrings
actions-user Feb 9, 2025
39fc729
:art: implement Marcel's feedback.
Drewniok Feb 9, 2025
17f0038
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Feb 10, 2025
503dbdf
Merge branch 'main' into add_fom_to_operational_domain
Drewniok Feb 10, 2025
6f0f9a4
:snake: expose operational analysis strategy.
Drewniok Feb 12, 2025
a26d7f5
:art: small fix and add docu.
Drewniok Feb 12, 2025
17a1e69
:snake: add missing functionality.
Drewniok Feb 12, 2025
9853247
:art: Small consistency adjustments, code simplifications, and additi…
marcelwa Feb 12, 2025
fc8f14e
:memo: Update pyfiction docstrings
actions-user Feb 12, 2025
4fc00df
:white_check_mark: add additional test.
Drewniok Feb 12, 2025
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
16 changes: 16 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 @@ -304,13 +309,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 +416,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 @@ -611,13 +624,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 @@ -8,13 +8,13 @@
#include "pyfiction/documentation.hpp"
Drewniok marked this conversation as resolved.
Show resolved Hide resolved
#include "pyfiction/types.hpp"

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

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

#include <string>
#include <vector>
Drewniok marked this conversation as resolved.
Show resolved Hide resolved

namespace pyfiction
Expand All @@ -28,21 +28,49 @@ void operational_domain(pybind11::module& m)
{
namespace py = pybind11;

m.def("operational_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(fmt::format("operational_domain_grid_search").c_str(), &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("operational_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(fmt::format("operational_domain_random_sampling").c_str(),
&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("operational_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{},
m.def(fmt::format("operational_domain_flood_fill").c_str(), &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("operational_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));
m.def(fmt::format("operational_domain_contour_tracing").c_str(),
&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));
Drewniok marked this conversation as resolved.
Show resolved Hide resolved
}

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

m.def(fmt::format("critical_temperature_domain_grid_search").c_str(),
&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(fmt::format("critical_temperature_domain_random_sampling").c_str(),
&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(fmt::format("critical_temperature_domain_flood_fill").c_str(),
&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(fmt::format("critical_temperature_domain_contour_tracing").c_str(),
&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
Expand Down Expand Up @@ -71,28 +99,41 @@ 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))
py::class_<fiction::critical_temperature_domain>(m, "critical_temperature_domain", DOC(fiction_operational_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_readwrite("dimensions", &fiction::critical_temperature_domain::dimensions,
DOC(fiction_critical_temperature_domain_dimensions))
.def("get_value", &fiction::critical_temperature_domain::get_value, py::arg("point"))
.def("add_value", &fiction::critical_temperature_domain::add_value, py::arg("key"), py::arg("value"))
.def("number_of_values", &fiction::critical_temperature_domain::number_of_values)
.def("for_each",
[](const fiction::critical_temperature_domain& self, const py::function& py_callback)
{
self.for_each(
[&py_callback](const auto& key, const auto& value)
{
py_callback(key, value); // Pass the key and value to the Python callback
});
Drewniok marked this conversation as resolved.
Show resolved Hide resolved
})

.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))
py::class_<fiction::operational_domain>(m, "operational_domain", DOC(fiction_operational_domain))
.def(py::init<>())
.def_readwrite("dimensions", &fiction::operational_domain::dimensions,
DOC(fiction_operational_domain_dimensions))
.def("get_value", &fiction::operational_domain::get_value, py::arg("point"))
.def("add_value", &fiction::operational_domain::add_value, py::arg("key"), py::arg("value"))
.def("number_of_values", &fiction::operational_domain::number_of_values)
.def("for_each",
[](const fiction::operational_domain& self, const py::function& py_callback)
{
self.for_each(
[&py_callback](const auto& key, const auto& value)
{
py_callback(key, value); // Pass the key and value to the Python callback
});
Drewniok marked this conversation as resolved.
Show resolved Hide resolved
})

;

Expand All @@ -118,9 +159,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 +185,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>>(
Drewniok marked this conversation as resolved.
Show resolved Hide resolved
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);

// 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"
Drewniok marked this conversation as resolved.
Show resolved Hide resolved
#include "pyfiction/types.hpp"

#include <fiction/algorithms/simulation/sidb/is_operational.hpp>
#include <fiction/algorithms/simulation/sidb/operational_domain.hpp>
Drewniok marked this conversation as resolved.
Show resolved Hide resolved
#include <fiction/io/write_operational_domain.hpp>
Drewniok marked this conversation as resolved.
Show resolved Hide resolved

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

#include <string>
#include <string_view>
Drewniok marked this conversation as resolved.
Show resolved Hide resolved

Drewniok marked this conversation as resolved.
Show resolved Hide resolved
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 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
Loading