MATLAB Answers


Class with static variables in parallel global optimization algorithm

Asked by Omar Kamel on 8 Feb 2019
Latest activity Edited by Matt J
on 21 Mar 2019
I have a global optimization program dealing with large matrices (several gigabytes of data), so in order to save memory, a class with static variables was implemented similar to the implementation in Static Data, and then one object of this class is created, initialized and passed as an argument to a function handle acting as the objective function of global multistage optimization algorithm (Particle Swarm + Pattern Search). When parallelization in optimoptions is true:
optimoptions( ...
'UseParallel', true);
The optimization always yields false results, but when parallelization is turned off, it works correctly.
Thanks in advance!


Sign in to comment.

2 Answers

Answer by Matt J
on 8 Feb 2019
Edited by Matt J
on 8 Feb 2019

All variables are cloned when parallelization is used. Each parallel worker operates with an independent copy of any variable sent to it.


This is the code of the class:
classdef cDampingConstData
methods (Static )
function out = setget_A_0_0(data)
persistent Var;
if nargin
Var = data;
out = Var;
function out = setget_delta_A_to_delta_d(data)
persistent Var;
if nargin
Var = data;
out = Var;
Okay, but we also need to see how it is used in the optimization.
Sorry for the late reply.
%create object and initialize
dampingModelDataObject = cDampingConstData; %create object of type cDampingConstData
dampingModelDataObject.setget_delta_A_to_delta_d(delta_A_to_delta_d); %initialize object with fields
dampingModelDataObject.setget_A_0_0(A_0_0); %initialize object with fields
dampingModelDataObject.setget_states_num(A_0_0); %initialize object with fields
%objective function handler, object is passed to it with another constant inputs and d as variable
fun = @(d) DampIT.SumModalDamping_sparse_oo(reshape(d,1,1,num_damping_coefficients), dampingModelDataObject,targetModalDamping);
%optimization options
options = optimoptions('particleswarm', 'Display', 'iter', ...
'HybridFcn', {@patternsearch, patternsearch_hybrid_options}, ... %hybrid optimization
'MaxTime', obj.settings.pp_swarm_maxTime, ...
'MaxIterations', obj.settings.pp_swarm_maxIter, ...
'FunctionTolerance', obj.settings.pp_swarm_tolFun, ...
'PlotFcn', { @pswplotbestf}, ...
'SwarmSize', obj.settings.pp_swarm_swarmSize, ...
'OutputFcn', memLog_swarm, ...
'UseParallel', useparallel_flag, ... %true
'UseVectorized', false, ...
'MaxStallIterations', obj.settings.pp_swarm_maxStallIter, ...
'InitialSwarmMatrix', InitialSwarmMatrix);
%problem settings
problem.solver = 'particleswarm';
problem.objective = fun;
problem.nvars = num_damping_coefficients; = x_start;
problem.ub = x_end;
problem.options = options;
%start optimization
[d_optimized, fval, exitflag, output] = particleswarm(problem);

Sign in to comment.

Answer by Walter Roberson
on 14 Feb 2019

Look again at the link you provided . Notice the point about static data not being saved with an object . The process of sending variables to parallel workers involves save and load.


I couldn't understand your answer.
What I want to implement is that: save a matrix in memory (constant matrix), pass this matrix to a function that is evaluated with parfor, so every worker shoud use only the instance that is saved only 1 time in the memory
parfor i = 1:1000
out = some_function(constant_matrix, variable_data)
This constant_matrix is created before this parfor command.
However, that saves the matrix once per worker, not "only 1 time in the memory". If you strictly need "only 1 time in the memory" then you should look in the File Exchange for which uses operating system shared memory.

Sign in to comment.