Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ratapi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from ratapi.outputs import BayesResults, Results
from ratapi.project import Project
from ratapi.run import run
from ratapi.utils import convert, plotting
from ratapi.utils import convert, matlab, plotting

with suppress(ImportError): # orsopy is an optional dependency
from ratapi.utils import orso as orso
Expand All @@ -26,4 +26,5 @@
"run",
"plotting",
"convert",
"matlab",
]
67 changes: 67 additions & 0 deletions ratapi/utils/matlab.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
"""Runs RAT from the MATLAB API."""

import os
import tempfile
import warnings
from pathlib import Path

from ..outputs import Results
from ..project import Project
from ..wrappers import MatlabWrapper

RUNNER = """function executeRAT()
project = jsonToProject('{project}');
controls = jsonToControls('{control}');
[project, results] = RAT(project, controls);

projectToJson(project, '{project}');
resultsToJson(results, '{result}');
end
"""


def run_matlab_directly(project, controls, matlab_rat_path):
"""Run User provided MATLAB RAT for the given project and controls inputs.

Parameters
----------
project : RAT.Project
The project model, which defines the physical system under study.
controls : RAT.Controls
The controls model, which defines algorithmic properties.
matlab_rat_path : str
The path to MATLAB RAT folder.
"""
if MatlabWrapper.loader is None:
raise ImportError(MatlabWrapper.loader_error_message) from None

engine = MatlabWrapper.loader.result()
cur_dir = os.getcwd()

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")

with open(runner_file, "w") as f:
f.write(RUNNER.format(project=project_file, control=control_file, result=result_file))

with warnings.catch_warnings(): # Avoid warning about relative paths
warnings.simplefilter("ignore")
project.save(project_file)
controls.save(control_file)

engine.cd(matlab_rat_path, nargout=0)
engine.eval("addPaths", nargout=0)
engine.cd(cur_dir, nargout=0)

engine.addpath(tmp, nargout=0)
for file in project.custom_files:
engine.addpath(str(file.path), nargout=0)

engine.executeRAT(nargout=0)

project = Project.load(project_file)
results = Results.load(result_file)
return project, results
Loading