1function result = runRemoteLQNS(self, filename, options)
2% RUNREMOTELQNS Execute LQNS via remote REST API
4% @brief Executes LQNS solver via a remote Docker container running lqns-rest API
5% @param filename Path to the LQNX model file (without extension)
6% @param options Solver options including remote configuration
7% @
return result Response from the remote server
9% This method sends the LQNX model to a remote lqns-rest server
for execution.
10% The server URL
is configured via options.config.remote_url.
11% Upon successful execution, the LQXO response
is written to disk
for parsing.
14modelFile = [filename,
'.lqnx'];
15if ~exist(modelFile,
'file')
16 % Try without extension
if already includes it
19modelContent = fileread(modelFile);
22baseUrl = options.config.remote_url;
23if ~endsWith(baseUrl,
'/')
24 baseUrl = [baseUrl, '/'];
27% Determine endpoint based on method
30 url = [baseUrl,
'api/v1/solve/lqsim'];
32 url = [baseUrl,
'api/v1/solve/lqns'];
35% Build request structure
37request.model =
struct();
38request.model.content = modelContent;
39request.model.base64 =
false;
42request.options =
struct();
43request.options.include_raw_output =
true;
45% Add pragmas based on method
48 request.options.blocks = 30;
49 if options.samples > 0
50 request.options.run_time = options.samples;
53 request.options.pragmas =
struct();
56 switch options.config.multiserver
58 request.options.pragmas.multiserver =
'rolia';
60 request.options.pragmas.multiserver = options.config.multiserver;
63 % Method-specific pragmas
66 request.options.pragmas.layering =
'srvn';
68 request.options.pragmas.mva =
'exact';
70 request.options.pragmas.layering =
'srvn';
71 request.options.pragmas.mva =
'exact';
74 request.options.pragmas.stop_on_message_loss =
false;
78webOpts = weboptions(...
79 'MediaType',
'application/json', ...
81 'ContentType',
'json');
85 response = webwrite(url, request, webOpts);
87 line_error(mfilename,
'Remote LQNS execution failed: %s', ME.message);
88 result =
struct(
'status',
'error',
'error', ME.message);
92% Check response status
93if isfield(response,
'status')
94 if strcmp(response.status, 'error') || strcmp(response.status, 'failed')
96 if isfield(response, 'error')
97 errorMsg = response.error;
99 line_error(mfilename, 'Remote solver returned error: %s', errorMsg);
105% Write LQXO response to file for parsing by existing code
106if isfield(response, 'raw_output') && isstruct(response.raw_output)
107 if isfield(response.raw_output, 'lqxo') && ~isempty(response.raw_output.lqxo)
108 lqxoFile = [filename, '.lqxo'];
109 fid = fopen(lqxoFile, 'w');
111 fprintf(fid, '%s', response.raw_output.lqxo);
114 line_warning(mfilename, 'Could not write LQXO file: %s', lqxoFile);