1function runtime = runAnalyzer(self, options)
7 options = self.getOptions;
9line_ack(
'LQNS', options.verbose);
11line_debug(options,
'LQNS: starting (method=%s, multiserver=%s)', options.method, options.config.multiserver);
13% see _kb/06-solver-catalog.md (Wrappers: three ways to reach an external binary)
15useRemote = isfield(options.config,
'remote') && options.config.remote;
16if isunix && ~useRemote
18 if isfield(options.config,
'container')
19 reqContainer = options.config.container;
21 if isempty(reqContainer) && ~SolverLQNS.hasLocalBinary()
22 % Native lqns absent: transparently fall back to a Docker image.
23 reqContainer = 'auto';
25 if ~isempty(reqContainer)
26 dockerImage = SolverLQNS.getDockerImage(reqContainer);
30% Snap-confined Docker cannot bind-mount the system temp dir; stage the model
31% under HOME when dispatching through Docker so the volume mount
is visible.
32dirpath = lineTempName('lqns', ~isempty(dockerImage));
33filename = [dirpath,filesep,'model.lqnx'];
34self.model.writeXML(filename);
36%self.runAnalyzerChecks(options);
37Solver.resetRandomGeneratorSeed(options.seed);
46multiserver_praqma = '';
51 switch options.config.multiserver
53 multiserver_praqma='-Pmultiserver=conway';
55 multiserver_praqma='-Pmultiserver=rolia';
57 multiserver_praqma='-Pmultiserver=zhou';
59 multiserver_praqma='-Pmultiserver=suri';
61 multiserver_praqma='-Pmultiserver=reiser';
63 multiserver_praqma='-Pmultiserver=schmidt';
65 multiserver_praqma='-Pmultiserver=rolia';
70 % switch options.method
71 % case {
'default',
'lqns'}
72 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' --iteration-limit=',num2str(options.iter_max),
' -Pstop-on-message-loss=false -x ',filename]);
74 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' --iteration-limit=',num2str(options.iter_max),
' -Playering=srvn -Pstop-on-message-loss=false -x ',filename]);
76 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' --iteration-limit=',num2str(options.iter_max),
' -Pmva=exact -Pstop-on-message-loss=false -x ',filename]);
78 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' --iteration-limit=',num2str(options.iter_max),
' -Playering=srvn -Pmva=exact -Pstop-on-message-loss=false -x ',filename]);
79 %
case {
'sim',
'lqsim'}
80 % cmd=[
'lqsim ',verbose,
' ',multiserver_praqma,
' -A ',num2str(options.samples),
',3 -Pstop-on-message-loss=false -x ',filename]);
81 %
case {
'lqnsdefault'}
82 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -x ',filename]);
84 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' --iteration-limit=',num2str(options.iter_max),
' -Pstop-on-message-loss=false -x ',filename]);
87 % --iteration-limit seems faulty as of 6.2.27
90 case {
'default',
'lqns'}
91 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pstop-on-message-loss=false -x ',filename];
93 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Playering=srvn -Pstop-on-message-loss=false -x ',filename];
95 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pmva=exact -Pstop-on-message-loss=false -x ',filename];
96 case {
'srvn.exactmva'}
97 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Playering=srvn -Pmva=exact -Pstop-on-message-loss=false -x ',filename];
99 cmd=[
'lqsim ',verbose,
' ',multiserver_praqma,
' -A ',num2str(options.samples),
',3 -Pstop-on-message-loss=false -x ',filename];
101 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -x ',filename];
103 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pstop-on-message-loss=false -x ',filename];
106 switch options.method
107 case {
'default',
'lqns'}
108 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pstop-on-message-loss=false -x ',filename,
' 2>&1'];
110 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Playering=srvn -Pstop-on-message-loss=false -x ',filename,
' 2>&1'];
112 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pmva=exact -Pstop-on-message-loss=false -x ',filename,
' 2>&1'];
113 case {
'srvn.exactmva'}
114 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Playering=srvn -Pmva=exact -Pstop-on-message-loss=false -x ',filename,
' 2>&1'];
116 cmd=[
'lqsim ',verbose,
' ',multiserver_praqma,
' -A ',num2str(options.samples),
' -Pstop-on-message-loss=false -x ',filename,
' 2>&1'];
118 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -x ',filename,
' 2>&1'];
120 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pstop-on-message-loss=false -x ',filename,
' 2>&1'];
124 switch options.method
125 %
case {
'default',
'lqns'}
126 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -i ',num2str(options.iter_max),
' -Pstop-on-message-loss=false -x ',filename]);
128 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -i ',num2str(options.iter_max),
' -Playering=srvn -Pstop-on-message-loss=false -x ',filename]);
130 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -i ',num2str(options.iter_max),
' -Pmva=exact -Pstop-on-message-loss=false -x ',filename]);
132 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -i ',num2str(options.iter_max),
' -Playering=srvn -Pmva=exact -Pstop-on-message-loss=false -x ',filename]);
133 %
case {
'sim',
'lqsim'}
134 % cmd=[
'lqsim ',verbose,
' ',multiserver_praqma,
' -A ',num2str(options.samples),
',3 -Pstop-on-message-loss=false -x ',filename]);
135 %
case {
'lqnsdefault'}
136 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -x ',filename]);
138 % cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -i ',num2str(options.iter_max),
' -Pstop-on-message-loss=false -x ',filename]);
139 case {
'default',
'lqns'}
140 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pstop-on-message-loss=false -x ',filename];
142 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Playering=srvn -Pstop-on-message-loss=false -x ',filename];
144 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pmva=exact -Pstop-on-message-loss=false -x ',filename];
145 case {
'srvn.exactmva'}
146 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Playering=srvn -Pmva=exact -Pstop-on-message-loss=false -x ',filename];
148 %cmd=[
'lqsim ',verbose,
' ',multiserver_praqma,
' -Pstop-on-message-loss=false -x ',filename];
149 cmd=[
'lqsim ',verbose,
' ',multiserver_praqma,
' -A ',num2str(options.samples),
' -Pstop-on-message-loss=false -x ',filename];
151 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -x ',filename];
153 cmd=[
'lqns ',verbose,
' ',multiserver_praqma,
' -Pstop-on-message-loss=false -x ',filename];
156if ~isempty(dockerImage)
157 % see _kb/06-solver-catalog.md (Wrappers: three ways to reach an external binary)
158 [~, hostUid] = unix(
'id -u'); hostUid = strtrim(hostUid);
159 [~, hostGid] = unix(
'id -g'); hostGid = strtrim(hostGid);
160 dockerPrefix = [
'docker run --rm --user ', hostUid,
':', hostGid, ...
161 ' -v ', dirpath,
':', dirpath,
' -w ', dirpath,
' ', dockerImage,
' '];
162 if strncmp(cmd,
'lqns ', 5)
163 cmd = [dockerPrefix, 'lqns.original ', cmd(6:end)];
164 elseif strncmp(cmd, 'lqsim ', 6)
165 cmd = [dockerPrefix, 'lqsim ', cmd(7:end)];
170% line_printf('\nLQNS model: %s',filename);
171 line_printf('\nLQNS command: %s\n',cmd);
174% Check for remote execution
176 line_debug(options, 'LQNS: using remote execution at %s', options.config.remote_url);
178 line_printf('\nUsing remote LQNS at: %s\n', options.config.remote_url);
180 self.runRemoteLQNS(filename, options);
182 line_debug(options, 'LQNS: using local execution, command: %s', cmd);
183 % see _kb/06-solver-catalog.md (Wrappers: LQNS/lqsim LD_LIBRARY_PATH GLIBCXX strip)
184 if isunix && isempty(dockerImage)
185 cmd = ['env -u LD_LIBRARY_PATH ', cmd];
189self.parseXMLResults(filename);