@@ -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