ParaMonte MATLAB 3.0.0
Parallel Monte Carlo and Machine Learning Library
See the latest version documentation.
FileContentsReport.m
Go to the documentation of this file.
1%> \brief
2%> This is the base class for generating objects
3%> that contain the contents of a report file
4%> generated by a ParaMonte sampler.<br>
5%>
6%> \details
7%> This class is meant to be primarily internally
8%> used by the ParaMonte MATLAB library samplers.<br>
9%> See the documentation of the class constructor.
10%>
11%> \note
12%> See below for information on the attributes (properties).<br>
13%>
14%> \note
15%> See below for information on the methods.<br>
16%>
17%> \final{FileContentsReport}
18%>
19%> \author
20%> \JoshuaOsborne, May 21 2024, 1:13 AM, University of Texas at Arlington<br>
21%> \FatemehBagheri, May 20 2024, 1:25 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
22%> \AmirShahmoradi, May 16 2016, 9:03 AM, Oden Institute for Computational Engineering and Sciences (ICES), UT Austin<br>
23classdef FileContentsReport < pm.io.FileContents
24
25 properties(Access = public)
26 %>
27 %> ``stats``
28 %>
29 %> The scalar MATLAB ``struct`` containing the set of
30 %> computed properties extracted from the report file.<br>
31 %>
32 stats = struct();
33 %>
34 %> ``contents``
35 %>
36 %> The scalar MATLAB string containing the entire
37 %> contents of the report file with all Carriage Return
38 %> characters removed (relevant only to Windows OS).<br>
39 %>
40 contents = [];
41 %>
42 %> ``lineList``
43 %>
44 %> The vector of MATLAB strings containing the set of
45 %> all lines in the report file with all Carriage Return
46 %> and New Line characters removed.<br>
47 %>
48 lineList = [];
49 %>
50 %> ``vis``
51 %>
52 %> The scalar MATLAB ``struct`` containing the set of
53 %> predefined visualizations for the output data.<br>
54 %>
55 vis = [];
56 %>
57 %> ``banner``
58 %>
59 %> The scalar MATLAB ``string`` containing the ParaMonte
60 %> library banner as appearing in the report file.<br>
61 %>
62 banner = "";
63 % %
64 % % ``setup``
65 % %
66 % % The scalar MATLAB ``struct`` containing the sampler
67 % % setup information extracted from the report file.
68 % %
69 % setup = struct();
70 % %
71 % % ``spec``
72 % %
73 % % The scalar MATLAB ``struct`` containing the set of
74 % % simulation specifications extracted from the report file.
75 % %
76 % spec = struct();
77 end
78
79 properties(Hidden)
80 %>
81 %> ``lineListLen``
82 %>
83 %> This is an internal class variable inaccessible to the end users.<br>
84 %>
85 lineListLen = [];
86 %>
87 %> ``indentLen``
88 %>
89 %> The scalar MATLAB integer representing the number of indentation
90 %> characters at the beginning of each description line in the report file.<br>
91 %> This is an internal class variable inaccessible to the end users.<br>
92 %>
93 indentLen = 4; % indent length of the records
94 %>
95 %> ``dsymLen``
96 %>
97 %> The scalar MATLAB integer representing the minimum length of two of decoration symbols.<br>
98 %> This is an internal class variable inaccessible to the end users.<br>
99 %>
100 dsymLen = 2;
101 %>
102 %> ``dsym``
103 %>
104 %> The scalar MATLAB string representing the decoration symbol used in
105 %> the report file, to be determined at runtime (currently ``%``).<br>
106 %> This is an internal class variable inaccessible to the end users.<br>
107 %>
108 dsym = '';
109 %>
110 %> ``prefix``
111 %>
112 %> The scalar MATLAB string representing the prefix used in the description lines of the report file.<br>
113 %> This is an internal class variable inaccessible to the end users.<br>
114 %>
115 prefix = ' - NOTE: ';
116 %>
117 %> ``method``
118 %>
119 %> The scalar MATLAB string representing the sample name.<br>
120 %> This is an internal class variable inaccessible to the end users.<br>
121 %>
122 method = '';
123 %iend = 0;
124 end
125
126 methods(Access = public)
128 %> \brief
129 %> Return a scalar object of class [pm.sampling.FileContentsReport](@ref FileContentsReport).<br>
130 %> \details
131 %> This is the constructor of the class [pm.sampling.FileContentsReport](@ref FileContentsReport).<br>
132 %>
133 %> \param[in] file : The input scalar MATLAB string containing the path to an external report file.<br>
134 %> \param[in] silent : See the corresponding argument of [pm.io.FileContents](@ref FileContents) class.<br>
135 %> (**optional**. The default is set by [pm.io.FileContents](@ref FileContents).)
136 %> \param[in] method : The input scalar MATLAB string
137 %> containing the sampling method name.<br>
138 %> The input value must be any of the following:<br>
139 %> <ol>
140 %> <li> ``"ParaDRAM"``
141 %> <li> ``"ParaDISE"``
142 %> <li> ``"ParaNest"``
143 %> </ol>
144 %> (**optional**. If missing, some of the report file contents may not be properly parsed.)
145 %>
146 %> \return
147 %> ``self`` : The output scalar object of class [pm.sampling.FileContentsReport](@ref FileContentsReport).<br>
148 %>
149 %> \interface{FileContentsReport}
150 %> \code{.m}
151 %>
152 %> contents = pm.sampling.FileContentsReport(file)
153 %> contents = pm.sampling.FileContentsReport(file, [])
154 %> contents = pm.sampling.FileContentsReport(file, silent)
155 %> contents = pm.sampling.FileContentsReport(file, [], [])
156 %> contents = pm.sampling.FileContentsReport(file, silent, [])
157 %> contents = pm.sampling.FileContentsReport(file, silent, method)
158 %>
159 %> \endcode
160 %>
161 %> \example{FileContentsReport}
162 %> \include{lineno} example/sampling/FileContentsReport/main.m
163 %> \vis{FileContentsReport}
164 %> <br><br>
165 %> \image html example/sampling/Paradram/himmelblau/Paradram.himmelblau.parallelism.speedup.scaling.strong.sameeff.png width=700
166 %> <br><br>
167 %> \image html example/sampling/Paradram/himmelblau/Paradram.himmelblau.parallelism.speedup.scaling.strong.zeroeff.png width=700
168 %>
169 %> \final{FileContentsReport}
170 %>
171 %> \author
172 %> \JoshuaOsborne, May 21 2024, 1:30 AM, University of Texas at Arlington<br>
173 %> \FatemehBagheri, May 20 2024, 1:25 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
174 %> \AmirShahmoradi, May 16 2016, 9:03 AM, Oden Institute for Computational Engineering and Sciences (ICES), UT Austin<br>
175 function self = FileContentsReport(file, silent, method)
176
177 if nargin < 2
178 silent = [];
179 end
180 self = self@pm.io.FileContents(file, silent);
181 if 2 < nargin
182 self.method = convertStringsToChars(method);
183 self.prefix = [self.method, self.prefix];
184 end
185
186 %%%%
187 %%%% remove any CARRIAGE RETURN.
188 %%%%
190 self.contents = strrep(fileread(file), char(13), '');
191 self.contents = strrep(self.contents, newline, [' ', newline]);
192 self.lineList = strsplit(self.contents, newline);
193 self.lineListLen = length(self.lineList);
194 iend = 1; % the line we are about to parse.
195
196 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
197 %%%% determine the decoration symbol and read the banner.
198 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
199
200 %%%%
201 %%%% Here we assume the first non-empty line starts with the symbol character (likely ``%``).
202 %%%%
203
204 ibeg = self.skipNull(iend);
205 failed = self.lineListLen < ibeg || length(self.lineList{ibeg}) < 4;
206 if ~failed
207 line = self.lineList{ibeg};
208 failed = any(line(1) ~= line(2 : 4));
209 if ~failed
210 iend = self.skipFull(ibeg + 1);
211 failed = self.lineListLen < iend;
212 end
213 end
214 if ~failed
215 self.dsym = line(1);
216 self.banner = self.concat(self.lineList(ibeg : iend));
217 else
218 self.warn(line, "Failed to detect the decoration symbol used in the report file.");
219 end
220
221 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
222 %%%% read the ParaMonte MATLAB library interface specifications
223 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
224
225 %self.setup.library.interface = self.parseSection("interface.specifications");
226
227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
228 %%%% read the ParaMonte MATLAB library compiler version
229 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
230
231 %self.setup.library.compiler.version = self.parseSection("compiler.version");
232
233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
234 %%%% read the ParaMonte MATLAB library compiler options
235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
236
237 %self.setup.library.compiler.options = self.parseSection("compiler.options");
238
239 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
240 %%%% read the Runtime platform specifications
241 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
242
243 %self.setup.platform = self.parseSection("runtime.platform.specifications");
244
245 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
246 %%%% read the simulation environment
247 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
248
249 %self.setup.io = self.parseSection("simulation.environment");
250
251 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
252 %%%% read the simulation specifications
253 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
254
255 %self.spec.base = self.parseSection("simulation.specifications.base");
256 %if self.method == "ParaDRAM" || self.method == "ParaDISE"
257 % self.spec.mcmc = self.parseSection("simulation.specifications.mcmc");
258 % self.spec.dram = self.parseSection("simulation.specifications.dram");
259 %elseif self.method == "ParaNest"
260 % self.spec.nest = self.parseSection("simulation.specifications.nest");
261 %end
262
263 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
264 %%%% statistics: this must be always the last item to parse
265 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
266
267 self.checkpoint("parsing the simulation statistics...", 1);
268
269 while true
270
271 item = self.lineList{iend};
272 if ~self.silent
273 self.spinner.spin(iend / self.lineListLen);
274 end
275 if strcmp(item(1 : min(6, length(item))), 'stats.')
276
277 %%%%
278 %%%% First non-empty line.
279 %%%%
280
281 ibeg = self.skipNull(iend + 1);
282 failed = self.lineListLen < ibeg;
283 if ~failed
284 iend = self.skipFull(ibeg + 1);
285 failed = self.lineListLen < iend;
286 if ~failed
287 % Retrieve the value.
288 % The strategy is to read all values as table by dumping
289 % the value in a temporary file and reading it as a table.
290 tempfile = tempname();
291 fid = fopen(tempfile, "w");
292 fprintf(fid, self.concat(strtrim(self.lineList(ibeg : iend - 1))));
293 fclose(fid);
294 df = readtable(tempfile);
295 %if numel(df.Properties.VariableNames) == 1
296 % if strcmpi(df.Properties.VariableNames(1), "Var1")
297 % df.Properties.VariableNames(1) = "value";
298 % end
299 %end
300 %self.(strtrim(item)).df = df;
301 eval(['self.', strtrim(item), '.df = df;']);
302 end
303 end
304
305 %%%%
306 %%%% Retrieve the description.
307 %%%%
308
309 ibeg = self.skipNull(iend + 1);
310 iend = self.skipFull(ibeg + 1);
311 if ~all(self.isdesc(self.lineList(ibeg : iend - 1)))
312 self.warn(string(ibeg) + "-" + string(iend), "A description record does not contain """ + string(self.prefix) + """");
313 else
314 % Concatenate lines and remove prefixes from each description lines.
315 desc = strrep(self.concat(strtrim(self.lineList(ibeg : iend - 1))), self.prefix, '');
316 eval(['self.', strtrim(item), '.description = desc;']);
317 %self.(strtrim(item)).description = desc;
318 end
319
320 end % new item found
321
322 iend = iend + 1;
323 if self.lineListLen < iend
324 break;
325 end
326
327 end % while
328
329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
330
331 self.checkpoint();
332
333 %%%%
334 %%%% Add the parallel scaling visualizations.
335 %%%%
336
337 silent_kws = {"silent", self.silent};
338
339 try
340 for parcond = ["sameeff", "zeroeff"]
341 self.stats.parallelism.speedup.scaling.strong.(parcond).vis = struct();
342 self.stats.parallelism.speedup.scaling.strong.(parcond).vis.desc ...
343 = "This component is added in the post-processing phase to facilitate quick " ...
344 + "visualization of the parallel scaling behavior of the sampler under the " + parcond + " parallel conditions.";
345 self.stats.parallelism.speedup.scaling.strong.(parcond).vis.lineScatter = ...
346 pm.vis.PlotLineScatter ( self.stats.parallelism.speedup.scaling.strong.(parcond).df ...
347 , "colx", 1, "coly", 2, "colc", 2, "axes", {"xscale", "log"} ...
348 , "scatter", {"size", 10, "color", pm.vis.color.rgb("red")} ...
349 ..., "colormap", {"enabled", false, "map", "autumn"} ...
350 , "plot", {"linewidth", 2.5} ...
351 , silent_kws{:} ...
352 );
353 end
354 catch me
355 warning ( newline ...
356 + "Failed to create the visualizations for the parallelization scaling behavior of the sampler." + newline ...
357 + "It is possible that the component ``stats.parallelism.speedup.scaling.strong.(parcond).df`` of the " + newline ...
358 + "output ``report`` object of class ``pm.sampling.FileContentsReport`` does not exist, where " + newline ...
359 + "the string `parcond` can be either ``optimal`` or ``perfect``." + newline ...
360 + "Here is the error message:" + newline ...
361 + newline ...
362 + string(me.identifier) + newline + string(me.message) + newline ...
363 + newline ...
364 );
365 end
366
367 %%%%
368 %%%% Add the parallel process contribution visualizations.
369 %%%%
370
371 try
372 %%%%
373 %%%% Set up the Cyclic Geometric fit to parallel processes contributions.
374 %%%%
375
376 cgfit = @(iproc, successProb, normFac, processCount) ...
377 successProb .* normFac .* (1 - successProb).^(iproc - 1) ./ (1 - (1 - successProb).^processCount);
378
379 %%%%
380 %%%% Set up the data frame containing the processes contributions and its Cyclic Geometric fit to parallel processes contributions.
381 %%%%
382
383 dfpc = self.stats.parallelism.process.contribution.count.current.df;
384 dfpc.cyclicGeometricFit = cgfit ( dfpc.processID ...
385 , self.stats.parallelism.process.contribution.count.current.fit.df.successProb ...
386 , self.stats.parallelism.process.contribution.count.current.fit.df.normFac ...
387 , self.stats.parallelism.process.count.current.df.Var1 ...
388 );
389 self.stats.parallelism.process.contribution.count.current.vis = struct();
390 self.stats.parallelism.process.contribution.count.current.vis.desc = ...
391 "This component is added in the post-processing phase to facilitate quick " + ...
392 "visualization of the contributions of the parallel processes to the final chain.";
393 self.stats.parallelism.process.contribution.count.current.vis.line = ...
394 pm.vis.PlotLine ( dfpc ...
395 , "colx", "processID", "coly", 2:3, "axes", {"xscale", "log", "yscale", "log"} ...
396 , "ylabel", {"txt", "Accepted-Sample Contribution"} ...
397 , "xlabel", {"txt", "Process ID"} ...
398 , "colormap", {"enabled", false} ...
399 , "legend", {"enabled", true} ...
400 , "plot", {"linewidth", 2.5} ...
401 , silent_kws{:} ...
402 );
403 catch me
404 warning ( newline ...
405 + "Failed to create the visualizations for the parallel processes contributions and their Cyclic Geomtric fit." + newline ...
406 + "It is possible that the component ``stats.parallelism.current.process.contribution`` of the " + newline ...
407 + "output ``report`` object of class ``pm.sampling.FileContentsReport`` does not exist, or " + newline ...
408 + "its sub-components are missing." + newline ...
409 + "Here is the error message:" + newline ...
410 + newline ...
411 + string(me.identifier) + newline + string(me.message) + newline ...
412 + newline ...
413 );
414 end
415
416 end % constructor
417
418 end % methods(Access = public)
419
420 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
421
422 methods(Hidden, Static)
423
424 %function reportParseFailure(topic)
425 % topic = string(strtrim(strrep(strrep(topic, newline, ' '), char(13), ' ')));
426 % warning ( newline ...
427 % + "Failed to parse the record """ + topic + """. " + newline ...
428 % + "The structure of the report file appears to have been compromised. Skipping..." + newline ...
429 % + newline ...
430 % );
431 %end
432 %
433 %function reportMissingValue(topic)
434 % topic = string(strtrim(strrep(strrep(topic, newline, ' '), char(13), ' ')));
435 % warning ( newline ...
436 % + "Failed to parse the value corresponding to the record """ + topic + """. " + newline ...
437 % + "The structure of the report file appears to have been compromised. Skipping..." + newline ...
438 % + newline ...
439 % );
440 %end
441
442 function str = concat(lines)
443 % Concatenate the elements of an input cell array by
444 % the new line character and return the result as a single string.
445 str = string(join(lines, newline));
446 end
447
448 end
449
450 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
451
452 methods(Hidden)
453
454 %function result = isSectionHeader(self, record)
455 % result = self.dsymLen < length(record) && contains(record(1 : self.dsymLen), self.dsym);
456 %end
458 %function stopBeforeNextSectionHeader(self)
459 % % NOTE: if it is already within a section header, it will skip it and find the next section header.
460 % record = self.lineList{iend};
461 % isCurrentSectionHeader = self.dsymLen < length(record) && contains(record(1 : self.dsymLen), self.dsym);
462 % while true
463 % if iend == self.lineListLen
464 % break;
465 % end
466 % record = self.lineList{iend};
467 % if self.dsymLen < length(record) && contains(record(1 : self.dsymLen), self.dsym)
468 % if isCurrentSectionHeader
469 % iend = iend + 1;
470 % continue;
471 % else
472 % iend = iend - 1;
473 % break;
474 % end
475 % else
476 % isCurrentSectionHeader = false;
477 % iend = iend + 1;
478 % continue;
479 % end
480 % end
481 %end
482 %
483 %function skipCurrentSectionHeader(self)
484 % while true
485 % record = self.lineList{iend};
486 % if self.dsymLen < length(record) && contains(record(1 : self.dsymLen), self.dsym)
487 % iend = iend + 1;
488 % if iend == self.lineListLen
489 % break;
490 % end
491 % continue;
492 % else
493 % break;
494 % end
495 % end
496 %end
497 %
498 %function section = parseSection(self, topic)
499 % ilineLastSuccess = iend;
500 % topic = lower(topic);
501 % section = [];
502 % topicFound = false;
503 % while true
504 % iend = iend + 1;
505 % if self.lineListLen <= iend
506 % break;
507 % end
508 % record = lower(self.lineList{iend});
509 % if contains(record, topic)
510 % topicFound = true;
511 % break;
512 % else
513 % continue;
514 % end
515 % end
516 % if topicFound
517 % self.skipCurrentSectionHeader();
518 % lineStart = iend;
519 % self.stopBeforeNextSectionHeader();
520 % section = self.concat(lineStart, iend);
521 % else
522 % self.reportParseFailure(topic);
523 % iend = ilineLastSuccess;
524 % end
525 %end
526
527 function result = isdesc(self, record)
528 result = contains(record, self.prefix);
529 end
530
531 function iend = skipNull(self, ibeg)
532 % skip the empty lines after the current
533 % until encountering the first non-empty line.
534 iend = ibeg;
535 while true
536 if self.lineListLen < iend
537 break;
538 elseif ~isempty(strtrim(self.lineList{iend}))
539 break;
540 end
541 iend = iend + 1;
542 end
543 end
544
545 function iend = skipFull(self, ibeg)
546 % skip the nonempty lines after the current
547 % until encountering the first empty line.
548 iend = ibeg;
549 while true
550 if self.lineListLen < iend
551 break;
552 elseif isempty(strtrim(self.lineList{iend}))
553 break;
554 end
555 iend = iend + 1;
556 end
557 end
558
559 end
560
561 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
562
563end
function name(in vendor)
Return the MPI library name as used in naming the ParaMonte MATLAB shared library directories.
function version(in silent)
Return a scalar MATLAB string containing the latest available ParaMonte MATLAB version newer than the...
function banner()
Return a scalar MATLAB string containing the ParaMonte MATLAB library banner.
This is the base class for generating objects that contain the contents of a report file generated by...
function skipNull(in self, in ibeg)
function isdesc(in self, in record)
function skipFull(in self, in ibeg)
static function concat(in lines)
function FileContentsReport(in file, in silent, in method)
Return a scalar object of class pm.sampling.FileContentsReport.
This is the base class for generating objects that contain the contents of a given file.
Definition: FileContents.m:27
This is the ParaDRAM class for generating instances of serial and parallel Delayed-Rejection Adaptive...
Definition: Paradram.m:18
function compiler()
Return a scalar MATLAB logical that is true if and only if the current installation of MATLAB contain...
function find(in vendor)
Return a list of scalar MATLAB strings containing the paths to all detected mpiexec binaries installe...
function parallel()
Return a scalar MATLAB logical that is true if and only if the current installation of MATLAB contain...
function statistics()
Return a scalar MATLAB logical that is true if and only if the current installation of MATLAB contain...