Skip to content

Commit b89eb00

Browse files
authored
Updates inputs, outputs, and build process (#143)
* Removes limits struct from input to RAT * Renames "layerSlds" as "layers" * Updates submodule and build * Updates submodule * Updates defines.h
1 parent 5a26412 commit b89eb00

File tree

10 files changed

+158
-313
lines changed

10 files changed

+158
-313
lines changed

RATapi/inputs.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import RATapi
1111
import RATapi.controls
1212
import RATapi.wrappers
13-
from RATapi.rat_core import Checks, Control, Limits, NameStore, ProblemDefinition
13+
from RATapi.rat_core import Checks, Control, NameStore, ProblemDefinition
1414
from RATapi.utils.enums import Calculations, Languages, LayerModels, TypeOptions
1515

1616
parameter_field = {
@@ -113,7 +113,7 @@ def __len__(self):
113113
return len(self.files)
114114

115115

116-
def make_input(project: RATapi.Project, controls: RATapi.Controls) -> tuple[ProblemDefinition, Limits, Control]:
116+
def make_input(project: RATapi.Project, controls: RATapi.Controls) -> tuple[ProblemDefinition, Control]:
117117
"""Construct the inputs required for the compiled RAT code using the data defined in the input project and controls.
118118
119119
Parameters
@@ -127,28 +127,14 @@ def make_input(project: RATapi.Project, controls: RATapi.Controls) -> tuple[Prob
127127
-------
128128
problem : RAT.rat_core.ProblemDefinition
129129
The problem input used in the compiled RAT code.
130-
limits : RAT.rat_core.Limits
131-
A list of min/max values for each parameter defined in the project.
132130
cpp_controls : RAT.rat_core.Control
133131
The controls object used in the compiled RAT code.
134132
135133
"""
136-
limits = Limits()
137-
138-
for class_list in RATapi.project.parameter_class_lists:
139-
setattr(
140-
limits,
141-
parameter_field[class_list],
142-
[[element.min, element.max] for element in getattr(project, class_list)],
143-
)
144-
145-
if project.model == LayerModels.CustomXY:
146-
controls.calcSldDuringFit = True
147-
148134
problem = make_problem(project)
149135
cpp_controls = make_controls(controls)
150136

151-
return problem, limits, cpp_controls
137+
return problem, cpp_controls
152138

153139

154140
def make_problem(project: RATapi.Project) -> ProblemDefinition:

RATapi/outputs.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,13 @@ class Results:
141141
The background for each contrast defined over the simulation range.
142142
resolutions : list
143143
The resolution for each contrast defined over the simulation range.
144-
layerSlds : list
145-
The array of layer parameter values for each contrast.
146144
sldProfiles : list
147145
The SLD profiles for each contrast.
146+
layers : list
147+
The array of layer parameter values for each contrast.
148148
resampledLayers : list
149-
If resampling is used, the SLD for each contrast after resampling has been performed.
149+
If resampling is used, the array of layer parameter values for each contrast after resampling has been
150+
performed.
150151
calculationResults : CalculationResults
151152
The chi-squared fit results from the final calculation and fit.
152153
contrastParams : ContrastParams
@@ -164,8 +165,8 @@ class Results:
164165
shiftedData: list
165166
backgrounds: list
166167
resolutions: list
167-
layerSlds: list
168168
sldProfiles: list
169+
layers: list
169170
resampledLayers: list
170171
calculationResults: CalculationResults
171172
contrastParams: ContrastParams
@@ -323,8 +324,6 @@ class DreamOutput(RATResult):
323324
The runtime of the DREAM algorithm in seconds.
324325
iteration : float
325326
The number of iterations performed.
326-
modelOutput : float
327-
Unused. Will always be 0.
328327
AR : np.ndarray
329328
A two-column array where ``DreamOutput.AR[i, 0]`` is an iteration number
330329
and ``DreamOutput.AR[i, 1]`` is the average acceptance rate of chain step
@@ -344,7 +343,6 @@ class DreamOutput(RATResult):
344343
outlierChains: np.ndarray
345344
runtime: float
346345
iteration: float
347-
modelOutput: float
348346
AR: np.ndarray
349347
R_stat: np.ndarray
350348
CR: np.ndarray
@@ -483,7 +481,6 @@ def make_results(
483481
outlierChains=bayes_results.dreamOutput.outlierChains,
484482
runtime=bayes_results.dreamOutput.runtime,
485483
iteration=bayes_results.dreamOutput.iteration,
486-
modelOutput=bayes_results.dreamOutput.modelOutput,
487484
AR=bayes_results.dreamOutput.AR,
488485
R_stat=bayes_results.dreamOutput.R_stat,
489486
CR=bayes_results.dreamOutput.CR,
@@ -502,8 +499,8 @@ def make_results(
502499
shiftedData=output_results.shiftedData,
503500
backgrounds=output_results.backgrounds,
504501
resolutions=output_results.resolutions,
505-
layerSlds=output_results.layerSlds,
506502
sldProfiles=output_results.sldProfiles,
503+
layers=output_results.layers,
507504
resampledLayers=output_results.resampledLayers,
508505
calculationResults=calculation_results,
509506
contrastParams=contrast_params,
@@ -524,8 +521,8 @@ def make_results(
524521
shiftedData=output_results.shiftedData,
525522
backgrounds=output_results.backgrounds,
526523
resolutions=output_results.resolutions,
527-
layerSlds=output_results.layerSlds,
528524
sldProfiles=output_results.sldProfiles,
525+
layers=output_results.layers,
529526
resampledLayers=output_results.resampledLayers,
530527
calculationResults=calculation_results,
531528
contrastParams=contrast_params,

RATapi/run.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def run(project, controls):
109109

110110
horizontal_line = "\u2500" * 107 + "\n"
111111
display_on = controls.display != Display.Off
112-
problem_definition, limits, cpp_controls = make_input(project, controls)
112+
problem_definition, cpp_controls = make_input(project, controls)
113113

114114
if display_on:
115115
print("Starting RAT " + horizontal_line)
@@ -118,7 +118,6 @@ def run(project, controls):
118118
with ProgressBar(display=display_on), TextOutput(display=display_on):
119119
problem_definition, output_results, bayes_results = RATapi.rat_core.RATMain(
120120
problem_definition,
121-
limits,
122121
cpp_controls,
123122
)
124123
end = time.time()

cpp/RAT

Submodule RAT updated 205 files

cpp/includes/defines.h

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,6 @@ runtime : float
237237
The runtime of the DREAM algorithm in seconds.
238238
iteration : float
239239
The number of iterations performed.
240-
modelOutput : float
241-
Unused. Will always be 0.
242240
AR : np.ndarray[np.float]
243241
A two-column array where ``DreamOutput.AR[i, 0]`` is an iteration number
244242
and ``DreamOutput.AR[i, 1]`` is the average acceptance rate of chain step
@@ -259,7 +257,6 @@ struct DreamOutput
259257
py::array_t<real_T> outlierChains;
260258
real_T runtime;
261259
real_T iteration;
262-
real_T modelOutput;
263260
py::array_t<real_T> AR;
264261
py::array_t<real_T> R_stat;
265262
py::array_t<real_T> CR;
@@ -354,12 +351,12 @@ backgrounds : list
354351
The background for each contrast defined over the simulation range.
355352
resolutions : list
356353
The resolution for each contrast defined over the simulation range.
357-
layerSlds : list
358-
The array of layer parameter values for each contrast.
359354
sldProfiles : list
360355
The SLD profiles for each contrast.
356+
layers : list
357+
The array of layer parameter values for each contrast.
361358
resampledLayers : list
362-
If resampling is used, the SLD for each contrast after resampling has been performed.
359+
If resampling is used, the array of layer parameter values for each contrast after resampling has been performed.
363360
calculationResults : RATapi.rat_core.Calculation
364361
The chi-squared fit results from the final calculation and fit.
365362
contrastParams : RATapi.rat_core.ContrastParams
@@ -377,46 +374,15 @@ struct OutputResult {
377374
py::list shiftedData;
378375
py::list backgrounds;
379376
py::list resolutions;
380-
py::list layerSlds;
381377
py::list sldProfiles;
378+
py::list layers;
382379
py::list resampledLayers;
383380
Calculation calculationResults {};
384381
ContrastParams contrastParams {};
385382
py::array_t<real_T> fitParams;
386383
py::list fitNames;
387384
};
388385

389-
const std::string docsLimits = R"(The Python binding for the C++ limit struct which contains
390-
Min and max values for each parameter defined in the project.
391-
392-
Parameters
393-
----------
394-
params : np.ndarray[np.float]
395-
Limits for params in the problem definition.
396-
backgroundParams : np.ndarray[np.float]
397-
Limits for backgroundParams in the problem definition.
398-
scalefactors : np.ndarray[np.float]
399-
Limits for scalefactors in the problem definition.
400-
bulkIns : np.ndarray[np.float]
401-
Limits for bulkIns in the problem definition.
402-
bulkOuts : np.ndarray[np.float]
403-
Limits for bulkOuts in the problem definition.
404-
resolutionParams : np.ndarray[np.float]
405-
Limits for resolutionParams in the problem definition.
406-
domainRatios : np.ndarray[np.float]
407-
Limits for domainRatios in the problem definition.
408-
)";
409-
410-
struct Limits {
411-
py::array_t<real_T> params;
412-
py::array_t<real_T> backgroundParams;
413-
py::array_t<real_T> scalefactors;
414-
py::array_t<real_T> bulkIns;
415-
py::array_t<real_T> bulkOuts;
416-
py::array_t<real_T> resolutionParams;
417-
py::array_t<real_T> domainRatios;
418-
};
419-
420386
const std::string docsNameStore = R"(The Python binding for the C++ names struct which
421387
contains names of all parameters in the project.
422388

cpp/rat.cpp

Lines changed: 12 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -301,21 +301,6 @@ RAT::b_ProblemDefinition createProblemDefinitionStruct(const ProblemDefinition&
301301
}
302302

303303

304-
RAT::ProblemLimits createProblemLimitsStruct(const Limits& limits)
305-
{
306-
RAT::ProblemLimits limits_struct;
307-
limits_struct.params = customCaller("Limits.params", pyArrayToRatArray2d, limits.params);
308-
limits_struct.backgroundParams = customCaller("Limits.backgroundParams", pyArrayToRatArray2d, limits.backgroundParams);
309-
limits_struct.scalefactors = customCaller("Limits.scalefactors", pyArrayToRatArray2d, limits.scalefactors);
310-
limits_struct.bulkIns = customCaller("Limits.bulkIns", pyArrayToRatArray2d, limits.bulkIns);
311-
limits_struct.bulkOuts = customCaller("Limits.bulkOuts", pyArrayToRatArray2d, limits.bulkOuts);
312-
limits_struct.resolutionParams = customCaller("Limits.resolutionParams", pyArrayToRatArray2d, limits.resolutionParams);
313-
limits_struct.domainRatios = customCaller("Limits.domainRatios", pyArrayToRatArray2d, limits.domainRatios);
314-
315-
return limits_struct;
316-
}
317-
318-
319304
RAT::Controls createControlsStruct(const Control& control)
320305
{
321306
RAT::Controls control_struct;
@@ -391,26 +376,26 @@ OutputResult OutputResultFromStruct(const RAT::Results result)
391376
output_result.resolutions.append(array);
392377
}
393378

394-
for (int32_T idx0{0}; idx0 < result.layerSlds.size(0); idx0++) {
379+
for (int32_T idx0{0}; idx0 < result.sldProfiles.size(0); idx0++) {
395380
py::list inner_list;
396-
for (int32_T idx1{0}; idx1 < result.layerSlds.size(1); idx1++) {
397-
auto tmp = result.layerSlds[idx0 + result.layerSlds.size(0) * idx1];
381+
for (int32_T idx1{0}; idx1 < result.sldProfiles.size(1); idx1++) {
382+
auto tmp = result.sldProfiles[idx0 + result.sldProfiles.size(0) * idx1];
398383
auto array = py::array_t<real_T, py::array::f_style>({tmp.f1.size(0), tmp.f1.size(1)});
399384
std::memcpy(array.request().ptr, tmp.f1.data(), array.nbytes());
400385
inner_list.append(array);
401386
}
402-
output_result.layerSlds.append(inner_list);
387+
output_result.sldProfiles.append(inner_list);
403388
}
404389

405-
for (int32_T idx0{0}; idx0 < result.sldProfiles.size(0); idx0++) {
390+
for (int32_T idx0{0}; idx0 < result.layers.size(0); idx0++) {
406391
py::list inner_list;
407-
for (int32_T idx1{0}; idx1 < result.sldProfiles.size(1); idx1++) {
408-
auto tmp = result.sldProfiles[idx0 + result.sldProfiles.size(0) * idx1];
392+
for (int32_T idx1{0}; idx1 < result.layers.size(1); idx1++) {
393+
auto tmp = result.layers[idx0 + result.layers.size(0) * idx1];
409394
auto array = py::array_t<real_T, py::array::f_style>({tmp.f1.size(0), tmp.f1.size(1)});
410395
std::memcpy(array.request().ptr, tmp.f1.data(), array.nbytes());
411396
inner_list.append(array);
412397
}
413-
output_result.sldProfiles.append(inner_list);
398+
output_result.layers.append(inner_list);
414399
}
415400

416401
for (int32_T idx0{0}; idx0 < result.resampledLayers.size(0); idx0++) {
@@ -548,7 +533,6 @@ BayesResults bayesResultsFromStruct(const RAT::BayesResults results)
548533
bayesResults.dreamOutput.outlierChains = pyArray2dFromBoundedArray<coder::bounded_array<real_T, 2000U, 2U>>(results.dreamOutput.outlierChains);
549534
bayesResults.dreamOutput.runtime = results.dreamOutput.runtime;
550535
bayesResults.dreamOutput.iteration = results.dreamOutput.iteration;
551-
bayesResults.dreamOutput.modelOutput = results.dreamOutput.modelOutput;
552536
bayesResults.dreamOutput.R_stat = pyArrayFromRatArray2d(results.dreamOutput.R_stat);
553537
bayesResults.dreamOutput.CR = pyArrayFromRatArray2d(results.dreamOutput.CR);
554538
bayesResults.dreamOutput.AR = pyArray2dFromBoundedArray<coder::bounded_array<real_T, 2000U, 2U>>(results.dreamOutput.AR);
@@ -582,8 +566,6 @@ Parameters
582566
----------
583567
problem_def : Rat.rat_core.ProblemDefinition
584568
The project input for the RAT calculation.
585-
limits : RATapi.rat_core.Limits
586-
Min and max values for each parameter defined in the problem definition.
587569
control : RATapi.rat_core.Control
588570
The controls object for the RAT calculation.
589571
@@ -597,16 +579,15 @@ bayes_result : Rat.rat_core.BayesResults
597579
The extra results if RAT calculation is Bayesian.
598580
)";
599581

600-
py::tuple RATMain(const ProblemDefinition& problem_def, const Limits& limits, const Control& control)
582+
py::tuple RATMain(const ProblemDefinition& problem_def, const Control& control)
601583
{
602584
RAT::b_ProblemDefinition problem_def_struct = createProblemDefinitionStruct(problem_def);
603-
RAT::ProblemLimits limits_struct = createProblemLimitsStruct(limits);
604585
RAT::Controls control_struct = createControlsStruct(control);
605586
// Output
606587
RAT::Results results;
607588
RAT::BayesResults bayesResults;
608589
// Call the entry-point
609-
RAT::RATMain(&problem_def_struct, &limits_struct, &control_struct, &results, &bayesResults);
590+
RAT::RATMain(&problem_def_struct, &control_struct, &results, &bayesResults);
610591
// Copy result to output
611592
auto out_problem_def = problemDefinitionFromStruct(problem_def_struct);
612593
out_problem_def.customFiles = problem_def.customFiles.attr("copy")();
@@ -802,7 +783,6 @@ PYBIND11_MODULE(rat_core, m) {
802783
.def_readwrite("outlierChains", &DreamOutput::outlierChains)
803784
.def_readwrite("runtime", &DreamOutput::runtime)
804785
.def_readwrite("iteration", &DreamOutput::iteration)
805-
.def_readwrite("modelOutput", &DreamOutput::modelOutput)
806786
.def_readwrite("AR", &DreamOutput::AR)
807787
.def_readwrite("R_stat", &DreamOutput::R_stat)
808788
.def_readwrite("CR", &DreamOutput::CR);
@@ -836,8 +816,8 @@ PYBIND11_MODULE(rat_core, m) {
836816
.def_readwrite("shiftedData", &OutputResult::shiftedData)
837817
.def_readwrite("backgrounds", &OutputResult::backgrounds)
838818
.def_readwrite("resolutions", &OutputResult::resolutions)
839-
.def_readwrite("layerSlds", &OutputResult::layerSlds)
840819
.def_readwrite("sldProfiles", &OutputResult::sldProfiles)
820+
.def_readwrite("layers", &OutputResult::layers)
841821
.def_readwrite("resampledLayers", &OutputResult::resampledLayers)
842822
.def_readwrite("calculationResults", &OutputResult::calculationResults)
843823
.def_readwrite("contrastParams", &OutputResult::contrastParams)
@@ -912,39 +892,6 @@ PYBIND11_MODULE(rat_core, m) {
912892
return chk;
913893
}));
914894

915-
py::class_<Limits>(m, "Limits", docsLimits.c_str())
916-
.def(py::init<>())
917-
.def_readwrite("params", &Limits::params)
918-
.def_readwrite("backgroundParams", &Limits::backgroundParams)
919-
.def_readwrite("scalefactors", &Limits::scalefactors)
920-
.def_readwrite("bulkIns", &Limits::bulkIns)
921-
.def_readwrite("bulkOuts", &Limits::bulkOuts)
922-
.def_readwrite("resolutionParams", &Limits::resolutionParams)
923-
.def_readwrite("domainRatios", &Limits::domainRatios)
924-
.def(py::pickle(
925-
[](const Limits &lim) { // __getstate__
926-
/* Return a tuple that fully encodes the state of the object */
927-
return py::make_tuple(lim.params, lim.backgroundParams, lim.scalefactors, lim.bulkIns, lim.bulkOuts,
928-
lim.resolutionParams, lim.domainRatios);
929-
},
930-
[](py::tuple t) { // __setstate__
931-
if (t.size() != 7)
932-
throw std::runtime_error("Encountered invalid state unpickling Limits object!");
933-
934-
/* Create a new C++ instance */
935-
Limits lim;
936-
937-
lim.params = t[0].cast<py::array_t<real_T>>();
938-
lim.backgroundParams = t[1].cast<py::array_t<real_T>>();
939-
lim.scalefactors = t[2].cast<py::array_t<real_T>>();
940-
lim.bulkIns = t[3].cast<py::array_t<real_T>>();
941-
lim.bulkOuts = t[4].cast<py::array_t<real_T>>();
942-
lim.resolutionParams = t[5].cast<py::array_t<real_T>>();
943-
lim.domainRatios = t[6].cast<py::array_t<real_T>>();
944-
945-
return lim;
946-
}));
947-
948895
py::class_<Control>(m, "Control", docsControl.c_str())
949896
.def(py::init<>())
950897
.def_readwrite("parallel", &Control::parallel)
@@ -1150,7 +1097,7 @@ PYBIND11_MODULE(rat_core, m) {
11501097
return p;
11511098
}));
11521099

1153-
m.def("RATMain", &RATMain, docsRATMain.c_str(), py::arg("problem_def"), py::arg("limits"), py::arg("control"));
1100+
m.def("RATMain", &RATMain, docsRATMain.c_str(), py::arg("problem_def"), py::arg("control"));
11541101

11551102
m.def("makeSLDProfileXY", &makeSLDProfileXY, docsMakeSLDProfileXY.c_str(),
11561103
py::arg("bulk_in"), py::arg("bulk_out"), py::arg("ssub"), py::arg("layers"), py::arg("number_of_repeats") = DEFAULT_NREPEATS);

0 commit comments

Comments
 (0)