Skip to content

Commit 857e523

Browse files
authored
Merge branch 'main' into added-test-for-issue-#667
2 parents 4baf5c7 + bbb9a09 commit 857e523

File tree

55 files changed

+1364
-583
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1364
-583
lines changed

.github/workflows/pyfiction-pypi-deployment.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ jobs:
121121
enable-cache: true
122122

123123
- name: Build wheels
124-
uses: pypa/cibuildwheel@v2.22
124+
uses: pypa/cibuildwheel@v2.23
125125

126126
- name: Upload wheel as an artifact
127127
uses: actions/upload-artifact@v4

.pre-commit-config.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ repos:
5555

5656
# Python linting using ruff
5757
- repo: https://github.com/astral-sh/ruff-pre-commit
58-
rev: v0.9.6
58+
rev: v0.9.10
5959
hooks:
6060
- id: ruff
6161
args: ["--fix", "--show-fixes"]
@@ -76,14 +76,14 @@ repos:
7676

7777
# Format configuration files with prettier
7878
- repo: https://github.com/rbubley/mirrors-prettier
79-
rev: v3.5.1
79+
rev: v3.5.3
8080
hooks:
8181
- id: prettier
8282
types_or: [yaml, markdown, html, css, scss, javascript, json]
8383

8484
# Check JSON schemata
8585
- repo: https://github.com/python-jsonschema/check-jsonschema
86-
rev: 0.31.1
86+
rev: 0.31.3
8787
hooks:
8888
- id: check-github-workflows
8989
- id: check-readthedocs

CITATION.cff

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ authors:
1717
given-names: "Robert"
1818
orcid: "0000-0002-4993-7860"
1919
title: "The Munich Nanotech Toolkit (MNT)"
20-
version: 0.6.9
20+
version: 0.6.10
2121
doi: 10.1109/NANO61778.2024.10628747
2222
url: "https://github.com/cda-tum/fiction"

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
1818
# Set the project name and version
1919
project(
2020
fiction
21-
VERSION 0.6.9
21+
VERSION 0.6.10
2222
DESCRIPTION
2323
"An open-source design automation framework for Field-coupled Nanotechnologies"
2424
HOMEPAGE_URL "https://github.com/cda-tum/fiction"

bindings/mnt/pyfiction/include/pyfiction/algorithms/simulation/sidb/operational_domain.hpp

+13-11
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,23 @@ void critical_temperature_domain(pybind11::module& m)
4949
{
5050
namespace py = pybind11;
5151

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

56-
m.def("critical_temperature_domain_random_sampling", &fiction::operational_domain_random_sampling<Lyt, py_tt>,
57-
py::arg("lyt"), py::arg("spec"), py::arg("samples"), py::arg("params") = fiction::operational_domain_params{},
58-
py::arg("stats") = nullptr, DOC(fiction_operational_domain_random_sampling));
56+
m.def("critical_temperature_domain_random_sampling",
57+
&fiction::critical_temperature_domain_random_sampling<Lyt, py_tt>, py::arg("lyt"), py::arg("spec"),
58+
py::arg("samples"), py::arg("params") = fiction::operational_domain_params{}, py::arg("stats") = nullptr,
59+
DOC(fiction_critical_temperature_domain_random_sampling));
5960

60-
m.def("critical_temperature_domain_flood_fill", &fiction::operational_domain_flood_fill<Lyt, py_tt>, py::arg("lyt"),
61-
py::arg("spec"), py::arg("samples"), py::arg("params") = fiction::operational_domain_params{},
62-
py::arg("stats") = nullptr, DOC(fiction_operational_domain_flood_fill));
63-
64-
m.def("critical_temperature_domain_contour_tracing", &fiction::operational_domain_contour_tracing<Lyt, py_tt>,
61+
m.def("critical_temperature_domain_flood_fill", &fiction::critical_temperature_domain_flood_fill<Lyt, py_tt>,
6562
py::arg("lyt"), py::arg("spec"), py::arg("samples"), py::arg("params") = fiction::operational_domain_params{},
66-
py::arg("stats") = nullptr, DOC(fiction_operational_domain_contour_tracing));
63+
py::arg("stats") = nullptr, DOC(fiction_critical_temperature_domain_flood_fill));
64+
65+
m.def("critical_temperature_domain_contour_tracing",
66+
&fiction::critical_temperature_domain_contour_tracing<Lyt, py_tt>, py::arg("lyt"), py::arg("spec"),
67+
py::arg("samples"), py::arg("params") = fiction::operational_domain_params{}, py::arg("stats") = nullptr,
68+
DOC(fiction_critical_temperature_domain_contour_tracing));
6769
}
6870

6971
} // namespace detail

bindings/mnt/pyfiction/include/pyfiction/algorithms/simulation/sidb/quicksim.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ inline void quicksim(pybind11::module& m)
4646
.def_readwrite("alpha", &fiction::quicksim_params::alpha, DOC(fiction_quicksim_params_alpha))
4747
.def_readwrite("number_threads", &fiction::quicksim_params::number_threads,
4848
DOC(fiction_quicksim_params_number_threads))
49+
.def_readwrite("timeout", &fiction::quicksim_params::timeout, DOC(fiction_quicksim_params_timeout));
4950

50-
;
51+
;
5152

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

bindings/mnt/pyfiction/include/pyfiction/algorithms/simulation/sidb/random_sidb_layout_generator.hpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,20 @@ void random_layout_generator(pybind11::module& m)
2626
{
2727
namespace py = pybind11;
2828

29-
m.def("generate_random_sidb_layout", &fiction::generate_random_sidb_layout<Lyt>, py::arg("lyt_skeleton"),
29+
m.def("generate_random_sidb_layout", &fiction::generate_random_sidb_layout<Lyt>,
3030
py::arg("params") = fiction::generate_random_sidb_layout_params<fiction::cell<Lyt>>{},
31-
DOC(fiction_generate_random_sidb_layout));
31+
py::arg("lyt_skeleton"), DOC(fiction_generate_random_sidb_layout));
3232

3333
m.def("generate_multiple_random_sidb_layouts", &fiction::generate_multiple_random_sidb_layouts<Lyt>,
34-
py::arg("lyt_skeleton"),
3534
py::arg("params") = fiction::generate_random_sidb_layout_params<fiction::cell<Lyt>>{},
36-
DOC(fiction_generate_multiple_random_sidb_layouts));
35+
py::arg("lyt_skeleton"), DOC(fiction_generate_multiple_random_sidb_layouts));
3736
}
3837

3938
} // namespace detail
4039

4140
inline void random_sidb_layout_generator(pybind11::module& m)
4241
{
4342
namespace py = pybind11;
44-
namespace py = pybind11;
4543

4644
py::enum_<typename fiction::generate_random_sidb_layout_params<fiction::offset::ucoord_t>::positive_charges>(
4745
m, "positive_charges", DOC(fiction_generate_random_sidb_layout_params_positive_charges))
@@ -70,6 +68,9 @@ inline void random_sidb_layout_generator(pybind11::module& m)
7068
.def_readwrite("positive_sidbs",
7169
&fiction::generate_random_sidb_layout_params<fiction::offset::ucoord_t>::positive_sidbs,
7270
DOC(fiction_generate_random_sidb_layout_params_positive_sidbs))
71+
.def_readwrite("simulation_parameters",
72+
&fiction::generate_random_sidb_layout_params<fiction::offset::ucoord_t>::simulation_parameters,
73+
DOC(fiction_generate_random_sidb_layout_params_simulation_parameters))
7374
.def_readwrite("maximal_attempts",
7475
&fiction::generate_random_sidb_layout_params<fiction::offset::ucoord_t>::maximal_attempts,
7576
DOC(fiction_generate_random_sidb_layout_params_maximal_attempts))
@@ -85,6 +86,7 @@ inline void random_sidb_layout_generator(pybind11::module& m)
8586
// NOTE be careful with the order of the following calls! Python will resolve the first matching overload!
8687
detail::random_layout_generator<py_sidb_100_lattice>(m);
8788
detail::random_layout_generator<py_sidb_111_lattice>(m);
89+
detail::random_layout_generator<py_sidb_layout>(m);
8890
}
8991

9092
} // namespace pyfiction

bindings/mnt/pyfiction/include/pyfiction/algorithms/simulation/sidb/sidb_simulation_result.hpp

+64-5
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,77 @@
1414
#include <pybind11/pybind11.h>
1515
#include <pybind11/stl.h>
1616

17+
#include <any>
18+
#include <cstdint>
19+
#include <stdexcept>
1720
#include <string>
21+
#include <unordered_map>
1822

1923
namespace pyfiction
2024
{
2125

2226
namespace detail
2327
{
2428

29+
namespace py = pybind11;
30+
31+
// Helper function to convert std::any to Python objects
32+
inline py::object convert_any_to_py(const std::any& value)
33+
{
34+
try
35+
{
36+
if (value.type() == typeid(int))
37+
{
38+
return py::int_(std::any_cast<int>(value));
39+
}
40+
else if (value.type() == typeid(double))
41+
{
42+
return py::float_(std::any_cast<double>(value));
43+
}
44+
else if (value.type() == typeid(bool))
45+
{
46+
return py::bool_(std::any_cast<bool>(value));
47+
}
48+
else if (value.type() == typeid(std::string))
49+
{
50+
return py::str(std::any_cast<std::string>(value));
51+
}
52+
else if (value.type() == typeid(uint64_t))
53+
{
54+
return pybind11::int_(std::any_cast<uint64_t>(value));
55+
}
56+
else
57+
{
58+
throw std::runtime_error(std::string("Unsupported type in std::any: ") + value.type().name());
59+
}
60+
}
61+
catch (const std::exception& e)
62+
{
63+
throw std::runtime_error(std::string("Error in convert_any_to_py: ") + e.what());
64+
}
65+
}
66+
67+
inline py::dict convert_map_to_py(const std::unordered_map<std::string, std::any>& map)
68+
{
69+
pybind11::dict result;
70+
for (const auto& [key, value] : map)
71+
{
72+
try
73+
{
74+
result[key.c_str()] = convert_any_to_py(value);
75+
}
76+
catch (const std::exception& e)
77+
{
78+
throw std::runtime_error(fmt::format("Error converting key: {}", e.what()));
79+
}
80+
}
81+
return result;
82+
}
83+
2584
template <typename Lyt>
2685
void sidb_simulation_result(pybind11::module& m, const std::string& lattice = "")
2786
{
2887
namespace py = pybind11;
29-
namespace py = pybind11;
3088

3189
py::class_<fiction::sidb_simulation_result<Lyt>>(m, fmt::format("sidb_simulation_result{}", lattice).c_str(),
3290
DOC(fiction_sidb_simulation_result))
@@ -39,16 +97,17 @@ void sidb_simulation_result(pybind11::module& m, const std::string& lattice = ""
3997
DOC(fiction_sidb_simulation_result_charge_distributions))
4098
.def_readwrite("simulation_parameters", &fiction::sidb_simulation_result<Lyt>::simulation_parameters,
4199
DOC(fiction_sidb_simulation_result_simulation_parameters))
42-
.def_readwrite("additional_simulation_parameters",
43-
&fiction::sidb_simulation_result<Lyt>::additional_simulation_parameters,
44-
DOC(fiction_sidb_simulation_result_additional_simulation_parameters));
100+
.def_property_readonly(
101+
"additional_simulation_parameters", [](const fiction::sidb_simulation_result<Lyt>& self)
102+
{ return convert_map_to_py(self.additional_simulation_parameters); },
103+
DOC(fiction_sidb_simulation_result_additional_simulation_parameters));
45104
}
46105

47106
} // namespace detail
48107

49108
inline void sidb_simulation_result(pybind11::module& m)
50109
{
51-
// NOTE be careful with the order of the following calls! Python will resolve the first matching overload!
110+
// Define simulation result for specific lattices
52111
detail::sidb_simulation_result<py_sidb_100_lattice>(m, "_100");
53112
detail::sidb_simulation_result<py_sidb_111_lattice>(m, "_111");
54113
}

bindings/mnt/pyfiction/include/pyfiction/layouts/gate_level_layout.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ void gate_level_layout(pybind11::module& m, const std::string& topology)
6565
.def("is_nor", &GateLyt::is_nor, DOC(fiction_gate_level_layout_is_nor))
6666
.def("is_xor", &GateLyt::is_xor, DOC(fiction_gate_level_layout_is_xor))
6767
.def("is_xnor", &GateLyt::is_xnor, DOC(fiction_gate_level_layout_is_xnor))
68+
.def("is_lt", &GateLyt::is_lt, DOC(fiction_gate_level_layout_is_lt))
69+
.def("is_le", &GateLyt::is_le, DOC(fiction_gate_level_layout_is_le))
70+
.def("is_gt", &GateLyt::is_gt, DOC(fiction_gate_level_layout_is_gt))
71+
.def("is_ge", &GateLyt::is_ge, DOC(fiction_gate_level_layout_is_ge))
6872
.def("is_maj", &GateLyt::is_maj, DOC(fiction_gate_level_layout_is_maj))
6973
.def("is_fanout", &GateLyt::is_fanout, DOC(fiction_gate_level_layout_is_fanout))
7074
.def("is_wire", &GateLyt::is_wire, DOC(fiction_gate_level_layout_is_wire))
@@ -100,6 +104,14 @@ void gate_level_layout(pybind11::module& m, const std::string& topology)
100104
DOC(fiction_gate_level_layout_create_xor))
101105
.def("create_xnor", &GateLyt::create_xnor, py::arg("a"), py::arg("b"), py::arg("t") = fiction::tile<GateLyt>{},
102106
DOC(fiction_gate_level_layout_create_xnor))
107+
.def("create_lt", &GateLyt::create_lt, py::arg("a"), py::arg("b"), py::arg("t") = fiction::tile<GateLyt>{},
108+
DOC(fiction_gate_level_layout_create_lt))
109+
.def("create_le", &GateLyt::create_le, py::arg("a"), py::arg("b"), py::arg("t") = fiction::tile<GateLyt>{},
110+
DOC(fiction_gate_level_layout_create_le))
111+
.def("create_gt", &GateLyt::create_gt, py::arg("a"), py::arg("b"), py::arg("t") = fiction::tile<GateLyt>{},
112+
DOC(fiction_gate_level_layout_create_gt))
113+
.def("create_ge", &GateLyt::create_ge, py::arg("a"), py::arg("b"), py::arg("t") = fiction::tile<GateLyt>{},
114+
DOC(fiction_gate_level_layout_create_ge))
103115
.def("create_maj", &GateLyt::create_maj, py::arg("a"), py::arg("b"), py::arg("c"),
104116
py::arg("t") = fiction::tile<GateLyt>{}, DOC(fiction_gate_level_layout_create_maj))
105117

0 commit comments

Comments
 (0)