LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
runAnalyzer.m
1function runtime = runAnalyzer(self, options)
2% RUNTIME = RUN()
3% Run the solver
4
5tic;
6if nargin<2
7 options = self.getOptions;
8end
9line_ack('LQNS', options.verbose);
10
11line_debug(options, 'LQNS: starting (method=%s, multiserver=%s)', options.method, options.config.multiserver);
12
13% see _kb/06-solver-catalog.md (Wrappers: three ways to reach an external binary)
14dockerImage = '';
15useRemote = isfield(options.config, 'remote') && options.config.remote;
16if isunix && ~useRemote
17 reqContainer = '';
18 if isfield(options.config, 'container')
19 reqContainer = options.config.container;
20 end
21 if isempty(reqContainer) && ~SolverLQNS.hasLocalBinary()
22 % Native lqns absent: transparently fall back to a Docker image.
23 reqContainer = 'auto';
24 end
25 if ~isempty(reqContainer)
26 dockerImage = SolverLQNS.getDockerImage(reqContainer);
27 end
28end
29
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);
35
36%self.runAnalyzerChecks(options);
37Solver.resetRandomGeneratorSeed(options.seed);
38
39if options.verbose
40 %verbose = '-v';
41 verbose = '';
42else
43 verbose = '-a -w';
44end
45
46multiserver_praqma = '';
47switch options.method
48 case 'lqsim'
49 %no-op
50 otherwise
51 switch options.config.multiserver
52 case 'conway'
53 multiserver_praqma='-Pmultiserver=conway';
54 case 'rolia'
55 multiserver_praqma='-Pmultiserver=rolia';
56 case 'zhou'
57 multiserver_praqma='-Pmultiserver=zhou';
58 case 'suri'
59 multiserver_praqma='-Pmultiserver=suri';
60 case 'reiser'
61 multiserver_praqma='-Pmultiserver=reiser';
62 case 'schmidt'
63 multiserver_praqma='-Pmultiserver=schmidt';
64 case 'default'
65 multiserver_praqma='-Pmultiserver=rolia';
66 end
67end
68
69if isunix
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]);
73 % case {'srvn'}
74 % cmd=['lqns ',verbose,' ',multiserver_praqma,' --iteration-limit=',num2str(options.iter_max),' -Playering=srvn -Pstop-on-message-loss=false -x ',filename]);
75 % case {'exactmva'}
76 % cmd=['lqns ',verbose,' ',multiserver_praqma,' --iteration-limit=',num2str(options.iter_max),' -Pmva=exact -Pstop-on-message-loss=false -x ',filename]);
77 % case {'srvnexact'}
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]);
83 % otherwise
84 % cmd=['lqns ',verbose,' ',multiserver_praqma,' --iteration-limit=',num2str(options.iter_max),' -Pstop-on-message-loss=false -x ',filename]);
85 % end
86
87 % --iteration-limit seems faulty as of 6.2.27
88 if options.verbose
89 switch options.method
90 case {'default','lqns'}
91 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Pstop-on-message-loss=false -x ',filename];
92 case {'srvn'}
93 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Playering=srvn -Pstop-on-message-loss=false -x ',filename];
94 case {'exactmva'}
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];
98 case {'sim','lqsim'}
99 cmd=['lqsim ',verbose,' ',multiserver_praqma,' -A ',num2str(options.samples),',3 -Pstop-on-message-loss=false -x ',filename];
100 case {'lqnsdefault'}
101 cmd=['lqns ',verbose,' ',multiserver_praqma,' -x ',filename];
102 otherwise
103 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Pstop-on-message-loss=false -x ',filename];
104 end
105 else
106 switch options.method
107 case {'default','lqns'}
108 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Pstop-on-message-loss=false -x ',filename,' 2>&1'];
109 case {'srvn'}
110 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Playering=srvn -Pstop-on-message-loss=false -x ',filename,' 2>&1'];
111 case {'exactmva'}
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'];
115 case {'sim','lqsim'}
116 cmd=['lqsim ',verbose,' ',multiserver_praqma,' -A ',num2str(options.samples),' -Pstop-on-message-loss=false -x ',filename,' 2>&1'];
117 case {'lqnsdefault'}
118 cmd=['lqns ',verbose,' ',multiserver_praqma,' -x ',filename,' 2>&1'];
119 otherwise
120 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Pstop-on-message-loss=false -x ',filename,' 2>&1'];
121 end
122 end
123else
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]);
127 % case {'srvn'}
128 % cmd=['lqns ',verbose,' ',multiserver_praqma,' -i ',num2str(options.iter_max),' -Playering=srvn -Pstop-on-message-loss=false -x ',filename]);
129 % case {'exactmva'}
130 % cmd=['lqns ',verbose,' ',multiserver_praqma,' -i ',num2str(options.iter_max),' -Pmva=exact -Pstop-on-message-loss=false -x ',filename]);
131 % case {'srvnexact'}
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]);
137 % otherwise
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];
141 case {'srvn'}
142 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Playering=srvn -Pstop-on-message-loss=false -x ',filename];
143 case {'exactmva'}
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];
147 case {'sim','lqsim'}
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];
150 case {'lqnsdefault'}
151 cmd=['lqns ',verbose,' ',multiserver_praqma,' -x ',filename];
152 otherwise
153 cmd=['lqns ',verbose,' ',multiserver_praqma,' -Pstop-on-message-loss=false -x ',filename];
154 end
155end
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)];
166 end
167end
168
169if options.verbose
170% line_printf('\nLQNS model: %s',filename);
171 line_printf('\nLQNS command: %s\n',cmd);
172end
173
174% Check for remote execution
175if useRemote
176 line_debug(options, 'LQNS: using remote execution at %s', options.config.remote_url);
177 if options.verbose
178 line_printf('\nUsing remote LQNS at: %s\n', options.config.remote_url);
179 end
180 self.runRemoteLQNS(filename, options);
181else
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];
186 end
187 system(cmd);
188end
189self.parseXMLResults(filename);
190
191if ~options.keep
192 rmdir(dirpath,'s');
193end
194runtime = toc;
195end