ParaMonte MATLAB 3.0.0
Parallel Monte Carlo and Machine Learning Library
See the latest version documentation.
Cascade.m
Go to the documentation of this file.
1%> \brief
2%> This is the abstract class for generating instances of objects
3%> that contain the specifications of a cascade of figures (plots).<br>
4%>
5%> \details
6%> This is a generic class for generating multiple separate
7%> cascading figures each containing a single plot (axes).<br>
8%>
9%> \devnote
10%> While dynamic addition of class attributes is not ideal, the current
11%> design was deemed unavoidable and best, given the constraints of the
12%> MATLAB language and visualization tools.<br>
13%>
14%> \note
15%> See the list of class attributes below,
16%> also those of the superclass [pm.matlab.Handle](@ref Handle).<br>
17%>
18%> \see
19%> [pm.vis.Cascade](@ref Cascade)<br>
20%> [pm.vis.Subplot](@ref Subplot)<br>
21%> [pm.vis.Figure](@ref Figure)<br>
22%> [pm.vis.Corner](@ref Corner)<br>
23%> [pm.vis.Plot](@ref Plot)<br>
24%> [pm.vis.Tile](@ref Tile)<br>
25%>
26%> \final
27%>
28%> \author
29%> \FatemehBagheri, May 20 2024, 1:25 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
30%> \AmirShahmoradi, May 16 2016, 9:03 AM, Oden Institute for Computational Engineering and Sciences (ICES), UT Austin<br>
31classdef Cascade < pm.matlab.Handle
32
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34
35 properties(Access = public)
36 %>
37 %> ``window``
38 %>
39 %> The cell array of scalar objects of superclass [pm.vis.Plot](@ref Plot)
40 %> representing the cascade of plots to display.<br>
41 %>
42 window = [];
43 %>
44 %> ``template``
45 %>
46 %> The scalar object of superclass [pm.vis.Plot](@ref Plot)
47 %> representing the template of the cascade of plots to display.<br>
48 %>
49 template = [];
50 end
51
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54 methods(Access = public)
55
56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57
58 %> \brief
59 %> Construct and return an object of class [pm.vis.Cascade](@ref Cascade).<br>
60 %>
61 %> \details
62 %> This is the custom constructor of the class [pm.vis.Cascade](@ref Cascade).<br>
63 %>
64 %> \param[in] template : The input scalar object of superclass [pm.vis.Plot](@ref Plot).<br>
65 %> It serves as the template based upon which the cascade of plots are constructed.<br>
66 %> \param[in] varargin : Any ``property, value`` pair of the parent object.<br>
67 %> If the property is a ``struct()``, then its value must be given as a cell array,
68 %> with consecutive elements representing the struct ``property-name, property-value`` pairs.<br>
69 %> Note that all of these property-value pairs can be also directly set via the
70 %> parent object attributes, before calling the [pm.vis.Cascade.make()](@ref Cascade::make) method.<br>
71 %>
72 %> \return
73 %> ``self`` : The scalar output object of class [pm.vis.Cascade](@ref Cascade).<br>
74 %>
75 %> \interface{Cascade}
76 %> \code{.m}
77 %>
78 %> plot = pm.vis.Cascade(template);
79 %> plot = pm.vis.Cascade(template, varargin);
80 %>
81 %> \endcode
82 %>
83 %> \note
84 %> The input ``varargin`` can also contain the components
85 %> of the ``plot`` component of the parent object.<br>
86 %>
87 %> \example{Cascade}
88 %> \include{lineno} example/vis/Cascade/main.m
89 %> \vis{Cascade}
90 %> \image html example/vis/Cascade/Cascade.window.1.png width=700
91 %> \image html example/vis/Cascade/Cascade.window.2.png width=700
92 %> \image html example/vis/Cascade/Cascade.window.3.png width=700
93 %>
94 %> \final{Cascade}
95 %>
96 %> \author
97 %> \JoshuaOsborne, May 21 2024, 6:20 AM, University of Texas at Arlington<br>
98 %> \AmirShahmoradi, July 5 2024, 1:07 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
99 function self = Cascade(template, varargin)
100 self.template = template;
101 self.reset(varargin{:});
102 end
103
104 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
105
106 %> \brief
107 %> Reset the properties of the cascade of plots to the original default settings.<br>
108 %>
109 %> \details
110 %> Use this method when you change many attributes of the plot and
111 %> you want to clean up and go back to the default settings.<br>
112 %>
113 %> \param[inout] self : The input/output parent object of class [pm.vis.Cascade](@ref Cascade)
114 %> which is **implicitly** passed to this dynamic method (not by the user).<br>
115 %> \param[in] varargin : Any ``property, value`` pair of the parent object.<br>
116 %> If the property is a ``struct()``, then its value must be given as a cell array,
117 %> with consecutive elements representing the struct ``property-name, property-value`` pairs.<br>
118 %> Note that all of these property-value pairs can be also directly set via the
119 %> parent object attributes, before calling the [pm.vis.Cascade.make()](@ref Cascade::make) method.<br>
120 %>
121 %> \note
122 %> The input ``varargin`` can also contain the components
123 %> of the ``template`` component of the parent object.
124 %>
125 %> \interface{reset}
126 %> \code{.m}
127 %>
128 %> pm.vis.Cascade.reset() % reset the plot to the default settings.
129 %> pm.vis.Cascade.reset(varargin) % reset the plot to the default settings and to those specified via ``varargin``.
130 %>
131 %> \endcode
132 %>
133 %> \final{reset}
134 %>
135 %> \author
136 %> \JoshuaOsborne, May 21 2024, 6:25 AM, University of Texas at Arlington<br>
137 %> \FatemehBagheri, May 20 2024, 1:25 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
138 %> \AmirShahmoradi, May 16 2016, 9:03 AM, Oden Institute for Computational Engineering and Sciences (ICES), UT Austin<br>
139 function reset(self, varargin)
140
141 if ~isempty(varargin)
142 [varpar, varsub] = pm.matlab.hashmap.popKeyVal(["template", "window"], varargin);
143 if ~isempty(varpar)
144 self.hash2comp(varpar);
145 end
146 if ~isempty(varsub)
147 self.template.reset(varsub{:});
148 end
149 end
150
151 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
152 %%%% RULE 0: Any non-MATLAB-default setting must be preferably set in premake() method to override user null values.
153 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154
155 end
156
157 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
158
159 %> \brief
160 %> Configure the cascade settings and specifications,
161 %> make the cascade of plots, and return nothing.<br>
162 %>
163 %> \details
164 %> In making the figure, this method calls the ``make()``
165 %> methods of each of the plot objects stored in the
166 %> ``window`` component.<br>
167 %>
168 %> \warning
169 %> This method has side-effects by manipulating
170 %> the existing attributes of the parent object.<br>
171 %>
172 %> \param[inout] self : The input/output parent object of class [pm.vis.Cascade](@ref Cascade)
173 %> which is **implicitly** passed to this dynamic method (not by the user).<br>
174 %> \param[in] varargin : Any ``property, value`` pair of the parent object.<br>
175 %> If the property is a ``struct()``, then its value must be given as a cell array,
176 %> with consecutive elements representing the struct ``property-name, property-value`` pairs.<br>
177 %> Note that all of these property-value pairs can be also directly set via the parent object attributes,
178 %> before calling the [pm.vis.Cascade.make()](@ref Cascade::make) method.<br>
179 %>
180 %> \interface{make}
181 %> \code{.m}
182 %>
183 %> p = pm.vis.Cascade.make(varargin);
184 %>
185 %> \endcode
186 %>
187 %> \note
188 %> The input ``varargin`` can also contain the components
189 %> of the ``template`` component of the parent object.<br>
190 %>
191 %> \example{Cascade}
192 %> \include{lineno} example/vis/Cascade/main.m
193 %> \vis{Cascade}
194 %> \image html example/vis/Cascade/Cascade.window.1.png width=700
195 %> \image html example/vis/Cascade/Cascade.window.2.png width=700
196 %>
197 %> \image html example/vis/Cascade/Cascade.window.3.png width=700
198 %> \final{make}
199 %>
200 %> \author
201 %> \JoshuaOsborne, May 21 2024, 6:27 AM, University of Texas at Arlington<br>
202 %> \FatemehBagheri, May 20 2024, 1:25 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
203 %> \AmirShahmoradi, May 16 2016, 9:03 AM, Oden Institute for Computational Engineering and Sciences (ICES), UT Austin<br>
204 function make(self, varargin)
205
206 self.premake(varargin{:});
207
208 %%%% First set the cascade dimensions.
209
210 isHeatmap = isa(self.template, "pm.vis.PlotHeatmap");
211 isEllipsoid = isa(self.template, "pm.vis.PlotEllipse") || isa(self.template, "pm.vis.PlotEllipse3");
212
213 if isHeatmap
214
215 %%%% Set the data for the Heatmap.
216
217 hdf = struct();
218 hdf.colx = self.template.subplot.colx;
219 hdf.rows = self.template.subplot.rows;
220 if ~iscell(self.template.subplot.colx) && ~isempty(self.template.subplot.colx)
221 hdf.colx = {hdf.colx};
222 end
223 if ~iscell(self.template.subplot.rows) && ~isempty(self.template.subplot.rows)
224 hdf.rows = {hdf.rows};
225 end
226
227 %%%% Test the data size consistency.
228
229 nplt = max(numel(hdf.colx), numel(hdf.rows));
230 if (nplt ~= size(self.template.subplot.rows, 1) && size(self.template.subplot.rows, 1) > 1) ...
231 || (nplt ~= size(self.template.subplot.colx, 1) && size(self.template.subplot.colx, 1) > 1)
232 help("pm.vis.CascadeHeatmap");
233 disp("size(self.template.subplot.rows)");
234 disp( size(self.template.subplot.rows) );
235 disp("size(self.template.subplot.colx)");
236 disp( size(self.template.subplot.colx) );
237 error ( newline ...
238 + "The size of the ``rows`` and ``colx`` attributes of the ``subplot`` component" + newline ...
239 + "of the input template ``Plot`` object must equal along the first dimension." + newline ...
240 + "For more information, see the documentation displayed above." + newline ...
241 + newline ...
242 );
243 end
244
245 elseif isEllipsoid
246
247 nplt = max([1, numel(self.template.subplot.dimx), numel(self.template.subplot.dimy)]);
248
249 else
250
251 lencolx = 0;
252 if isprop(self.template.subplot, "colx")
253 lencolx = pm.array.len(self.template.subplot.colx);
254 end
255
256 lencoly = 0;
257 if isprop(self.template.subplot, "coly")
258 lencoly = pm.array.len(self.template.subplot.coly);
259 end
260
261 lencolz = 0;
262 if isprop(self.template.subplot, "colz")
263 lencolz = pm.array.len(self.template.subplot.colz);
264 end
265
266 lencolc = 0;
267 if isprop(self.template.subplot, "colc")
268 lencolc = pm.array.len(self.template.subplot.colc);
269 end
270
271 nplt = max([lencolx, lencoly, lencolz, lencolc]);
272
273 end
274
275 %%%% Define the cascade.
276 %%%% The following code block may be improved in
277 %%%% the future to avoid full data copy to subplots.
278
279 self.window = cell(nplt);
280 for iplt = 1 : nplt
281 copyStream = getByteStreamFromArray(self.template);
282 self.window{iplt} = getArrayFromByteStream(copyStream);
283 if isHeatmap
284 if ~isempty(hdf.colx)
285 self.window{iplt}.subplot.colx = hdf.colx{min(iplt, numel(hdf.colx))};
286 end
287 if ~isempty(hdf.rows)
288 self.window{iplt}.subplot.rows = hdf.rows{min(iplt, numel(hdf.rows))};
289 end
290 elseif isEllipsoid
291 if ~isempty(self.template.subplot.dimx)
292 self.window{iplt}.subplot.dimx = self.template.subplot.dimx(min(iplt, numel(self.template.subplot.dimx)));
293 end
294 if ~isempty(self.template.subplot.dimy)
295 self.window{iplt}.subplot.dimy = self.template.subplot.dimy(min(iplt, numel(self.template.subplot.dimy)));
296 end
297 else
298 if 1 < lencolx
299 self.window{iplt}.subplot.colx = self.template.subplot.colx(iplt);
300 end
301 if 1 < lencoly
302 self.window{iplt}.subplot.coly = self.template.subplot.coly(iplt);
303 end
304 if 1 < lencolz
305 self.window{iplt}.subplot.colz = self.template.subplot.colz(iplt);
306 end
307 if 1 < lencolc
308 self.window{iplt}.subplot.colc = self.template.subplot.colc(iplt);
309 end
310 end
311 self.window{iplt}.make();
312 end
313
314 end % function
315
316 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
317
318 %> \brief
319 %> Export the current cascade of figures to the specified external files.<br>
320 %>
321 %> \details
322 %> This method is merely a wrapper around
323 %> all ``savefig`` methods of the figure objects in
324 %> the ``window`` component of the parent cascade object.<br>
325 %>
326 %> \param[inout] self : The input/output parent object of class [pm.vis.Cascade](@ref Cascade)
327 %> which is **implicitly** passed to this dynamic method (not by the user).<br>
328 %> \param[in] files : The input vector of MATLAB strings or cell array of char vectors that must be
329 %> of the same length as the length of the ``window`` component of the parent object.<br>
330 %> containing the paths to the external files to contain the visualizations.<br>
331 %> For more information, see the corresponding argument of the ``savefig``
332 %> method of class [pm.vis.figure.Figure](@ref Figure).<br>
333 %> (**optional**. If ``files`` or any elements of it are is missing or empty,
334 %> the default will be set by the ``savefig`` method of the corresponding
335 %> cascade figure in the ``window`` component.)
336 %>
337 %> \param[in] varargin : Any optional key-val pair that is accepted by
338 %> the ``savefig`` method of class [pm.vis.figure.Figure](@ref Figure).<br>
339 %> For more information, see the ``savefig`` method of class [pm.vis.figure.Figure](@ref Figure).<br>
340 %>
341 %> \interface{savefigs}
342 %> \code{.m}
343 %>
344 %> c.savefigs();
345 %> c.savefigs(files);
346 %> c.savefigs(files, varargin);
347 %>
348 %> \endcode
349 %>
350 %> \example{Cascade}
351 %> \include{lineno} example/vis/Cascade/main.m
352 %> \vis{Cascade}
353 %> \image html example/vis/Cascade/Cascade.window.1.png width=700
354 %> \image html example/vis/Cascade/Cascade.window.2.png width=700
355 %> \image html example/vis/Cascade/Cascade.window.3.png width=700
356 %>
357 %> \final{savefigs}
358 %>
359 %> \author
360 %> \JoshuaOsborne, May 21 2024, 6:29 AM, University of Texas at Arlington<br>
361 %> \FatemehBagheri, May 20 2024, 1:25 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
362 %> \AmirShahmoradi, May 16 2016, 9:03 AM, Oden Institute for Computational Engineering and Sciences (ICES), UT Austin<br>
363 function savefigs(self, files, varargin)
364 if nargin < 2 || isempty(files)
365 files = strings(length(self.window), 1);
366 end
367 if length(files) ~= length(self.window)
368 help("pm.vis.Cascade");
369 error ( newline ...
370 + "The condition ``length(files) == length(self.window)`` must hold." + newline ...
371 + "For more information, see the documentation displayed above." + newline ...
372 + newline ...
373 );
374 end
375 %%%%
376 %%%% Starting from the last is important
377 %%%% to ensure all figures have been already created,
378 %%%% otherwise, the next figure to be generate will
379 %%%% become active over the previous images that
380 %%%% are being saved, corrupting the export.
381 %%%%
382 %%%% \todo
383 %%%% Assuming all figures are generated sequentially from the first to the last,
384 %%%% the following fix to export figures from the last to the first should work.
385 %%%% However, this is only a temporary fix. An ideal solution must ensure all
386 %%%% figures have been generated before starting to export any figure.
387 %%%%
388 for iwin = length(self.window) : -1 : 1
389 self.window{iwin}.savefig(files(iwin), varargin{:});
390 end
391 end
392
393 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
394
395 end
396
397 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
398
399 methods(Access = public, Hidden)
400
401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
402
403 %> \brief
404 %> Configure the cascade of plots settings and specifications and return nothing.<br>
405 %>
406 %> \warning
407 %> This method has side-effects by manipulating
408 %> the existing attributes of the parent object.<br>
409 %>
410 %> \param[inout] self : The input/output parent object of class [pm.vis.Cascade](@ref Cascade)
411 %> which is **implicitly** passed to this dynamic method (not by the user).<br>
412 %> \param[in] varargin : Any ``property, value`` pair of the parent object.<br>
413 %> If the property is a ``struct()``, then its value must be given as a cell array,
414 %> with consecutive elements representing the struct ``property-name, property-value`` pairs.<br>
415 %> Note that all of these property-value pairs can be also directly set via the
416 %> parent object attributes, before calling the ``premake()`` method.<br>
417 %>
418 %> \interface{premake}
419 %> \code{.m}
420 %>
421 %> c = pm.vis.Cascade.premake(varargin);
422 %>
423 %> \endcode
424 %>
425 %> \example{premake}
426 %> \code{.m}
427 %>
428 %> cv = pm.vis.Cascade(pm.vis.PlotLine(rand(100, 10)));
429 %> c.premake("figure", {"color", "white"})
430 %> cv.make("coly", 1:3)
431 %>
432 %> \endcode
433 %>
434 %> \final{premake}
435 %>
436 %> \author
437 %> \JoshuaOsborne, May 21 2024, 6:31 AM, University of Texas at Arlington<br>
438 %> \FatemehBagheri, May 20 2024, 1:25 PM, NASA Goddard Space Flight Center (GSFC), Washington, D.C.<br>
439 %> \AmirShahmoradi, May 16 2016, 9:03 AM, Oden Institute for Computational Engineering and Sciences (ICES), UT Austin<br>
440 function premake(self, varargin)
441
442 if ~isempty(varargin)
443 [varpar, varsub] = pm.matlab.hashmap.popKeyVal(["template", "window"], varargin);
444 if ~isempty(varpar)
445 self.hash2comp(varpar);
446 end
447 if ~isempty(varsub)
448 self.template.premake(varsub{:});
449 end
450 end
451
452 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
453 %%%% These settings must happen here so that they can be reset every time user nullifies the values.
454 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
455
456 end
457
458 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
459
460 end
461
462 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
463
464end
function name(in vendor)
Return the MPI library name as used in naming the ParaMonte MATLAB shared libraries.
function list()
Return a list of MATLAB strings containing the names of OS platforms supported by the ParaMonte MATLA...
This is the abstract class for generating instances of objects that contain the specifications of a c...
Definition: Cascade.m:32
function make(in self, in varargin)
Configure the cascade settings and specifications, make the cascade of plots, and return nothing.
function savefigs(in self, in files, in varargin)
Export the current cascade of figures to the specified external files.
function premake(in self, in varargin)
Configure the cascade of plots settings and specifications and return nothing.
function reset(in self, in varargin)
Reset the properties of the cascade of plots to the original default settings.
Property template
Definition: Cascade.m:53
Property window
Definition: Cascade.m:45
function Cascade(in template, in varargin)
Construct and return an object of class pm.vis.Cascade.
This is the base class for generating instances of figures containing a symmetric square grid or corn...
Definition: Corner.m:19
This is the abstract class for generating instances of objects that contain the specifications of var...
Definition: Figure.m:27
This is the base class for generating subclass of MATLAB handle superclass whose annoying methods are...
Definition: Handle.m:24
This is the base class for generating instances of objects that contain the specifications of various...
Definition: Plot.m:29
This is the abstract class for generating instances of axes with various types of plots from one or m...
Definition: Subplot.m:188
This is the abstract class for generating instances of objects that contain the specifications of var...
Definition: Tile.m:9
function clean()
Remove all paths that contain the ParaMonte lib directory from the MATLAB path variable.
function copy(in from, in to, in fields)
Copy the contents of the struct/object from to the struct/object to recursively and without destroyin...
function len(in obj)
Return a scalar MATLAB whole-number containing the length of the input scalar or vector object.
function savefig(in varargin)
Export figures in a publication-quality format.
function which(in vendor)
Return the a MATLAB string containing the path to the first mpiexec executable binary found in system...