Class with static variables in parallel global optimization algorithm

2 views (last 30 days)
Hello,
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!

Answers (2)

Matt J
Matt J on 8 Feb 2019
Edited: 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.
  5 Comments
Omar Kamel
Omar Kamel on 14 Feb 2019
Edited: Omar Kamel on 14 Feb 2019
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;
problem.lb = x_start;
problem.ub = x_end;
problem.options = options;
%start optimization
[d_optimized, fval, exitflag, output] = particleswarm(problem);

Sign in to comment.


Walter Roberson
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.
  3 Comments
Walter Roberson
Walter Roberson on 21 Mar 2019
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 https://www.mathworks.com/matlabcentral/fileexchange/28572-sharedmatrix which uses operating system shared memory.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!