-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathmatlab.py
More file actions
115 lines (97 loc) · 3.47 KB
/
matlab.py
File metadata and controls
115 lines (97 loc) · 3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
"""Runs RAT from the MATLAB API."""
import json
import tempfile
import warnings
from pathlib import Path
from ..outputs import Results
from ..project import Project
from ..wrappers import MatlabWrapper
RUNNER = """function executeRAT()
cur_dir = pwd;
cd('{rat_path}');
addPaths;
cd(cur_dir);
project = jsonToProject('{project}');
controls = jsonToControls('{control}');
customControls = customControl();
customControls.update(controls);
customControls.filePath = '{ipc_path}';
if any(strcmpi(controls.procedure, {{procedures.DE.value, procedures.Simplex.value}}))
useLivePlot(1);
end
for i=1:project.customFile.rowCount
addpath(project.customFile.varTable{{i, 5}});
end
[project, results] = RAT(project, customControls);
projectToJson(project, '{project}');
resultsToJson(results, '{result}');
close all
end
"""
CONTROL = """classdef customControl < controlsClass
properties(Hidden = true)
filePath = ''
end
methods
function update(obj, controls)
propNames = properties(controls);
for i = 1:length(propNames)
obj.(propNames{i}) = controls.(propNames{i});
end
end
function path = getIPCFilePath(obj)
path = obj.filePath;
end
end
end
"""
def run_matlab_directly(project, controls, matlab_rat_path, ipc_path="", stdout=None, stderr=None):
"""Run User provided MATLAB RAT for the given project and controls inputs.
Parameters
----------
project : RAT.Project or dict
The project model (or equivalent json dict), which defines the physical system under study.
controls : RAT.Controls or dict
The controls model (or equivalent json dict), which defines algorithmic properties.
matlab_rat_path : str
The path to MATLAB RAT folder.
ipc_path : str, optional
IPC path for MATLAB to use
stdout : io.TextIOBase, optional
Text stream for MATLAB console output
stderr : io.TextIOBase, optional
Text stream for MATLAB console error output
"""
if MatlabWrapper.loader is None:
raise ImportError(MatlabWrapper.loader_error_message) from None
engine = MatlabWrapper.loader.result()
with tempfile.TemporaryDirectory() as tmp:
project_file = Path(tmp, "project.json")
control_file = Path(tmp, "controls.json")
result_file = Path(tmp, "results.json")
runner_file = Path(tmp, "executeRAT.m")
custom_controls_file = Path(tmp, "customControl.m")
with open(custom_controls_file, "w") as f:
f.write(CONTROL)
with open(runner_file, "w") as f:
f.write(
RUNNER.format(
project=project_file,
control=control_file,
result=result_file,
rat_path=matlab_rat_path,
ipc_path=ipc_path,
)
)
controls.save(control_file) if not isinstance(controls, dict) else control_file.write_text(json.dumps(controls))
with warnings.catch_warnings(): # Avoid warning about relative paths
warnings.simplefilter("ignore")
project.save(project_file) if not isinstance(project, dict) else project_file.write_text(
json.dumps(project)
)
engine.addpath(tmp, nargout=0)
engine.executeRAT(nargout=0, stdout=stdout, stderr=stderr)
engine.rmpath(tmp, nargout=0)
project = Project.load(project_file)
results = Results.load(result_file)
return project, results