Skip to content

Commit ca0ceb3

Browse files
committed
Added scoring to advisers
1 parent 0e9901d commit ca0ceb3

2 files changed

Lines changed: 90 additions & 20 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
44

55
[project]
66
name = "PyOpenMagnetics"
7-
version = "1.1.1"
7+
version = "1.1.2"
88
requires-python = ">=3.8"
99
authors = [
1010
{ name="Alfonso Martinez", email="Alfonso_VII@hotmail.com" },

src/advisers.cpp

Lines changed: 89 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,31 @@ json calculate_advised_cores(json inputsJson, json weightsJson, int maximumNumbe
2424
coreAdviser.set_mode(coreMode);
2525
auto masMagnetics = coreAdviser.get_advised_core(inputs, weights, maximumNumberResults);
2626

27-
json results = json::array();
28-
for (auto& masMagnetic : masMagnetics) {
29-
json aux;
30-
to_json(aux, masMagnetic.first);
31-
results.push_back(aux);
27+
auto scoringsPerFilter = coreAdviser.get_scorings();
28+
29+
json results = json();
30+
results["data"] = json::array();
31+
for (auto& [masMagnetic, scoring] : masMagnetics) {
32+
std::string name = masMagnetic.get_magnetic().get_manufacturer_info().value().get_reference().value();
33+
json result;
34+
json masJson;
35+
to_json(masJson, masMagnetic);
36+
result["mas"] = masJson;
37+
result["scoring"] = scoring;
38+
if (scoringsPerFilter.count(name)) {
39+
json filterScorings;
40+
for (auto& [filter, filterScore] : scoringsPerFilter[name]) {
41+
filterScorings[std::string(magic_enum::enum_name(filter))] = filterScore;
42+
}
43+
result["scoringPerFilter"] = filterScorings;
44+
}
45+
results["data"].push_back(result);
3246
}
47+
48+
sort(results["data"].begin(), results["data"].end(), [](json& b1, json& b2) {
49+
return b1["scoring"] > b2["scoring"];
50+
});
51+
3352
OpenMagnetics::settings.reset();
3453

3554
return results;
@@ -51,13 +70,31 @@ json calculate_advised_magnetics(json inputsJson, int maximumNumberResults, json
5170
magneticAdviser.set_core_mode(coreMode);
5271
auto masMagnetics = magneticAdviser.get_advised_magnetic(inputs, maximumNumberResults);
5372

54-
json results = json::array();
73+
auto scoringsPerFilter = magneticAdviser.get_scorings();
74+
75+
json results = json();
76+
results["data"] = json::array();
5577
for (auto& [masMagnetic, scoring] : masMagnetics) {
56-
json aux;
57-
to_json(aux, masMagnetic);
58-
results.push_back(aux);
78+
std::string name = masMagnetic.get_magnetic().get_manufacturer_info().value().get_reference().value();
79+
json result;
80+
json masJson;
81+
to_json(masJson, masMagnetic);
82+
result["mas"] = masJson;
83+
result["scoring"] = scoring;
84+
if (scoringsPerFilter.count(name)) {
85+
json filterScorings;
86+
for (auto& [filter, filterScore] : scoringsPerFilter[name]) {
87+
filterScorings[std::string(magic_enum::enum_name(filter))] = filterScore;
88+
}
89+
result["scoringPerFilter"] = filterScorings;
90+
}
91+
results["data"].push_back(result);
5992
}
6093

94+
sort(results["data"].begin(), results["data"].end(), [](json& b1, json& b2) {
95+
return b1["scoring"] > b2["scoring"];
96+
});
97+
6198
return results;
6299
}
63100
catch (const std::exception &exc) {
@@ -83,7 +120,7 @@ json calculate_advised_magnetics_from_catalog(json inputsJson, json catalogJson,
83120
OpenMagnetics::MagneticAdviser magneticAdviser;
84121
auto masMagnetics = magneticAdviser.get_advised_magnetic(inputs, catalog, maximumNumberResults);
85122

86-
auto scorings = magneticAdviser.get_scorings();
123+
auto scoringsPerFilter = magneticAdviser.get_scorings();
87124

88125
json results = json();
89126
results["data"] = json::array();
@@ -94,6 +131,13 @@ json calculate_advised_magnetics_from_catalog(json inputsJson, json catalogJson,
94131
to_json(masJson, masMagnetic);
95132
result["mas"] = masJson;
96133
result["scoring"] = scoring;
134+
if (scoringsPerFilter.count(name)) {
135+
json filterScorings;
136+
for (auto& [filter, filterScore] : scoringsPerFilter[name]) {
137+
filterScorings[std::string(magic_enum::enum_name(filter))] = filterScore;
138+
}
139+
result["scoringPerFilter"] = filterScorings;
140+
}
97141
results["data"].push_back(result);
98142
}
99143

@@ -129,7 +173,7 @@ json calculate_advised_magnetics_from_cache(json inputsJson, json filterFlowJson
129173
OpenMagnetics::MagneticAdviser magneticAdviser;
130174
auto masMagnetics = magneticAdviser.get_advised_magnetic(inputs, OpenMagnetics::magneticsCache.get(), filterFlow, maximumNumberResults);
131175

132-
auto scorings = magneticAdviser.get_scorings();
176+
auto scoringsPerFilter = magneticAdviser.get_scorings();
133177

134178
json results = json();
135179
results["data"] = json::array();
@@ -140,6 +184,13 @@ json calculate_advised_magnetics_from_cache(json inputsJson, json filterFlowJson
140184
to_json(masJson, masMagnetic);
141185
result["mas"] = masJson;
142186
result["scoring"] = scoring;
187+
if (scoringsPerFilter.count(name)) {
188+
json filterScorings;
189+
for (auto& [filter, filterScore] : scoringsPerFilter[name]) {
190+
filterScorings[std::string(magic_enum::enum_name(filter))] = filterScore;
191+
}
192+
result["scoringPerFilter"] = filterScorings;
193+
}
143194
results["data"].push_back(result);
144195
}
145196

@@ -171,13 +222,19 @@ void register_adviser_bindings(py::module& m) {
171222
core_mode_json: Core selection mode - "AVAILABLE_CORES" or "STANDARD_CORES".
172223
173224
Returns:
174-
JSON array of recommended cores sorted by score (best first).
175-
Each element contains core data with functional and processed descriptions.
225+
JSON object with "data" array containing ranked results.
226+
Each result has:
227+
- "mas": Mas object with magnetic data
228+
- "scoring": Overall float score
229+
- "scoringPerFilter": Object with individual scores per filter
230+
(e.g., {"COST": 0.8, "EFFICIENCY": 0.9, "DIMENSIONS": 0.7})
176231
177232
Example:
178233
>>> inputs = PyMKF.process_inputs(raw_inputs)
179234
>>> weights = {"COST": 1, "EFFICIENCY": 1, "DIMENSIONS": 0.5}
180-
>>> cores = PyMKF.calculate_advised_cores(inputs, weights, 10, "AVAILABLE_CORES")
235+
>>> result = PyMKF.calculate_advised_cores(inputs, weights, 10, "AVAILABLE_CORES")
236+
>>> for item in result["data"]:
237+
... print(f"Score: {item['scoring']}, Per filter: {item['scoringPerFilter']}")
181238
)pbdoc",
182239
py::arg("inputs_json"), py::arg("weights_json"),
183240
py::arg("max_results"), py::arg("core_mode_json"));
@@ -197,12 +254,18 @@ void register_adviser_bindings(py::module& m) {
197254
core_mode_json: Core selection mode - "AVAILABLE_CORES" or "STANDARD_CORES".
198255
199256
Returns:
200-
JSON array of complete Mas objects sorted by score (best first).
201-
Each Mas contains: magnetic (core + coil), inputs, and optionally outputs.
257+
JSON object with "data" array containing ranked results.
258+
Each result has:
259+
- "mas": Mas object with magnetic, inputs, and optionally outputs
260+
- "scoring": Overall float score
261+
- "scoringPerFilter": Object with individual scores per filter
262+
(e.g., {"COST": 0.8, "LOSSES": 0.9, "DIMENSIONS": 0.7})
202263
203264
Example:
204265
>>> inputs = PyMKF.process_inputs(raw_inputs)
205-
>>> magnetics = PyMKF.calculate_advised_magnetics(inputs, 5, "AVAILABLE_CORES")
266+
>>> result = PyMKF.calculate_advised_magnetics(inputs, 5, "AVAILABLE_CORES")
267+
>>> for item in result["data"]:
268+
... print(f"Score: {item['scoring']}, Per filter: {item['scoringPerFilter']}")
206269
)pbdoc",
207270
py::arg("inputs_json"), py::arg("max_results"), py::arg("core_mode_json"));
208271

@@ -220,14 +283,17 @@ void register_adviser_bindings(py::module& m) {
220283
221284
Returns:
222285
JSON object with "data" array containing ranked results.
223-
Each result has "mas" (Mas object) and "scoring" (float score).
286+
Each result has:
287+
- "mas": Mas object with magnetic data
288+
- "scoring": Overall float score
289+
- "scoringPerFilter": Object with individual scores per filter
224290
225291
Example:
226292
>>> inputs = PyMKF.process_inputs(raw_inputs)
227293
>>> catalog = [magnetic1, magnetic2, magnetic3]
228294
>>> result = PyMKF.calculate_advised_magnetics_from_catalog(inputs, catalog, 5)
229295
>>> for item in result["data"]:
230-
... print(f"Score: {item['scoring']}")
296+
... print(f"Score: {item['scoring']}, Per filter: {item['scoringPerFilter']}")
231297
)pbdoc",
232298
py::arg("inputs_json"), py::arg("catalog_json"), py::arg("max_results"));
233299

@@ -247,6 +313,10 @@ void register_adviser_bindings(py::module& m) {
247313
Returns:
248314
JSON object with "data" array containing ranked results,
249315
or error string if cache is empty.
316+
Each result has:
317+
- "mas": Mas object with magnetic data
318+
- "scoring": Overall float score
319+
- "scoringPerFilter": Object with individual scores per filter
250320
251321
Note:
252322
Cache must be populated before calling this function.

0 commit comments

Comments
 (0)