How to save and load data in parallel while optimizing?

16 views (last 30 days)
Hello every one,
I am optimizing 30 equations with Genetic Algorithm and need to save data in each time step and load it in the next time step. This makes my optimization too long, which is not efficient. I ran it in parallel, but it messed up the data. Would you help me with solving this issue if you have any similar experiences?
here is the part of the code that shows how I save data and reload them:
Data = [t ; y(15) ; y(22) ; y(29) ; y(30)];
if t ==0
fileID = fopen('Data.txt','w'); fprintf(fileID, '%f %f %f %f %f \n', Data); fclose(fileID);
else
fileID = fopen('Data.txt','a'); fprintf(fileID, '%f %f %f %f %f \n', Data); fclose(fileID);
end
if t >Tau_D
Data = load ('Data.txt','Data');
for i = 1 : size (Data,1)-1
if t - Tau_D < Data(i+1,1) && t - Tau_D >= Data(i,1)
CD = Data(i,2);
end
end
end
if t > Tau_t
for i = 1 : size (Data,1)-1
if t - Tau_t < Data(i+1,1) && t - Tau_t >= Data(i,1)
CD8T = Data(i,3);
IgM = Data(i,4);
IgG = Data(i,5);
end
end
end
  6 Comments
Hamideh Hayati
Hamideh Hayati on 7 Jul 2020
Edited: Hamideh Hayati on 7 Jul 2020
Here is my code.
When I want to optimize it using GA each time step takes more than 10hrs! Is there anyway I can run all the optimization in parallel, but the part that I save the data?
% clear
% clc
% x = [0.0000300000000000000;0.100000000000000;0.100000000000000;4.00000000000000e-05;3;0.0300000000000000;0.00100000000000000;3.00000000000000e-05;0.300000000000000;3.00000000000000e-05;0.0200000000000000;0.000400000000000000;0.00400000000000000;4.00000000000000e-05;0.0100000000000000;0.00200000000000000;0.00200000000000000;0.0300000000000000;0.00100000000000000;10;250;0.750000000000000;1.00000000000000e-05;1.75000000000000;150;2;5000;2.50000000000000;2;4;125;0.0100000000000000;3;4500;2.25000000000000;1.25000000000000;4;15000;0.00300000000000000;3;1;5000;1;0.0100000000000000;0.00100000000000000;0.150000000000000;0.0400000000000000;0.0800000000000000;2;0.400000000000000;1];
% %
% Funcs1(x)
function OBJs = Funcs(x)
%% Experimental values
V_titer = [
0.9835 37726.56787
1.01926 6062.2564
1.05501 17790.83495
1.12976 632.66712
1.12976 3354.94803
1.20126 350.12793
1.20126 3538.77773
1.27276 13559.7835
1.27276 58088.92462
1.41577 1856.68101
1.41577 17790.83495
1.41577 587110.51785
1.45152 342719.52373
1.45152 169648.19036
1.88703 342719.52373
1.89678 3413869.87967
1.89678 2.03378E7
1.91628 6138882.6509
2.32579 5.39061E7
2.3648 5653078.70558
2.40055 3236528.79993
2.77756 6.20463E7
2.77756 3.27119E7
2.81331 1.92813E7
2.83281 2249672.66094
3.20657 3315966.63643
3.24232 3.27119E7
3.26182 5791828.69661
3.63558 2811910.88586
3.67458 1.87284E7
3.67458 2.20856E7
3.71034 5962831.26565
3.71034 2185156.36199
4.1036 318674.13567
4.1231 640663.96252
4.1426 3618433.43002
4.15885 1.92813E7
4.57161 1852993.60195
4.57161 3236528.79993
4.98112 1748236.95593
5.02012 3315966.63643
5.03962 1.0415E7
5.41339 366796.1254
5.46864 2185156.36199
5.48814 589964.65805
5.89765 193381.48179
5.89765 61569.68899
6.36566 58088.92462
6.36566 39409.64429
6.36566 19040.66992
6.75892 6425.51473
7.22694 617.51084
7.26269 186.39282
8.16297 582.60065
8.16297 353.54039
9.00474 0.50228
9.00474 1.07029
9.05999 16.90021
9.95702 0.57813
9.99602 3.54582];
E_I = [0.12054 112.36703
0.76203 397.13355
1.36102 1403.57055
1.78996 4616.88557
2.43145 13393.49947
2.90291 38622.50622
3.45938 145788.19554
4.01586 393626.6632
4.57233 931704.47044
5.34521 2515592.70917
6.11422 3756162.10501
7.01463 2886738.01875
7.65612 1586904.00524
8.46764 547023.14531
8.9816 177613.13371
9.62309 57325.24033
10.17957 18612.95205
10.86743 6007.3933
11.4239 1826.29614
11.934 589.44326
12.49048 218.31313
13.09332 57.83596
13.6498 22.8781
13.81983 12.5766];
M = [
3 165e3
6 224e3];
NK = [0.11893 99925.13276
2.10808 193851.60036
4.05151 283357.9989
6.07496 585303.9668
7.94217 475631.00316];
CD4_T = [
1.14024 1603582.83354
3.05396 838440.05876
4.93698 357632.72734
6.69719 676308.22237
8.5802 748776.76697
10.43252 613160.67874
12.20296 107027.21498];
CD8_T_E = [
1.45309515856432 284.835318872487
1.93755389144806 284.835318872487
2.66424199077368 357.688556440946
3.73408835922528 211.982081303999
4.62226270284547 211.982081303999
5.4498797048552 211.982081303999
6.09582468203352 357.688556440946
7.00418480619054 19973.4227717537
7.08492792833783 649.101506714869
7.24641417263241 5147.78892656841
7.65012978336886 66.275606167037
7.65012978336886 5384.56194866596
7.73087290551616 11868.5000922605
7.73087290551616 12742.7389430822
8.05384539410532 1541.55366692872
8.47774678537859 10976.0479320466
8.47774678537859 3381.09791553281
8.55848990752588 12979.5119651798
8.96220551826234 37822.4659760309
9.12369176255692 42321.1533958844
9.60815049544066 51901.3541361393
9.68889361758795 57875.3196167545
10.3550243753031 30446.0756722225
10.6779968638923 11121.7544071836
10.8394831081868 18133.8785231496
11.0009693524814 21448.7008325154
11.0817124746287 6404.50727462464
11.162455596776 10320.3687939303
11.5863569880493 19827.7162966168
11.6671001101966 20938.7281695361
11.8285863544912 12087.0598049659
12.070815720933 9136.50368344258
12.5552744538168 25218.8558766841
12.9589900645532 7078.39972213308
13.1204763088478 6258.80079948768
14.7555245323304 4127.84360060969
14.8362676544777 5384.56194866596
16.5520590001076 2124.37956747654
16.9759603913809 1541.55366692872
20.5690293269354 1395.84719179176
20.9727449376718 2798.27201498498
28.3203690530752 139.128843735525
28.7442704443485 66.275606167037
35.4459495825736 60
79.8950383246571 503.395031577908];
D_m = [
1.00468 256170.3902
2.72837 312452.41906
4.28293 696193.52496
5.8858 1446620.57649
7.31953 726892.81343
8.99491 651850.10828];
IgM_E = [0.25689 15.12029
1.36648 15.12029
1.70145 26.18941
1.95268 13.97025
2.89479 14.54527
4.00438 3.47615
4.00438 26.76443
4.92555 13.97025
5.09304 19.14543
5.26053 27.91447
5.42801 59.39679
5.61643 38.40858
5.78392 97.20432
5.86766 32.51463
5.86766 19.14543
5.86766 53.50284
6.11889 83.26009
6.20263 121.64264
6.20263 7.50128
6.20263 111.72356
6.20263 162.90029
6.20263 169.36926
6.20263 74.49105
6.20263 13.97025
6.28638 176.84451
6.28638 25.61439
6.37012 192.08253
6.37012 214.22078
6.37012 41.28367
6.45386 157.72511
6.45386 64.57196
6.53761 58.82177
6.53761 69.17212
6.62135 136.7369
6.62135 129.83667
6.62135 152.40618
6.62135 113.44862
6.87258 146.08097
6.87258 220.54599
6.95632 176.26949
6.95632 105.97336
7.04006 77.36615
7.04006 95.47926
7.04006 190.35747
7.04006 196.10766
7.12381 89.58531
7.20755 206.60177
7.31223 225.86492
7.31223 246.13436
7.31223 253.75336
7.39597 154.275
7.39597 185.03854
7.39597 167.6442
7.39597 146.08097
7.47971 154.85002
7.56346 211.77694
7.56346 301.47998
7.56346 140.18702
7.56346 220.54599
7.6472 310.82404
7.6472 200.70782
7.73094 278.19169
7.81469 229.31504
7.89843 136.16188
7.98217 190.35747
7.98217 211.77694
8.06591 291.56089
8.14966 287.53576
8.14966 222.84607
8.14966 259.50356
8.2334 296.16105
8.40089 128.54288
8.40089 183.8885
8.48463 247.85941
8.48463 237.36531
8.48463 154.85002
8.48463 144.35591
8.56837 284.5169
8.56837 200.70782
8.56837 210.05188
8.65211 118.76755
8.65211 114.02364
8.73586 187.33862
8.8196 231.04009
8.8196 266.54755
8.90334 168.21922
8.90334 161.75025
8.98709 225.14615
8.98709 243.25926
8.98709 173.39439
9.09176 308.38021
9.09176 176.26949
9.09176 179.86336
9.25925 105.97336
9.25925 116.32371
9.25925 127.39284
9.25925 192.08253
9.34299 125.09276
9.34299 187.91364
9.34299 150.10611
9.42674 139.612
9.42674 179.28834
9.42674 198.98276
9.51048 144.35591
9.51048 101.80447
9.59422 172.81937
9.59422 120.4926
9.59422 158.87515
9.59422 192.65755
9.92919 185.61356
9.92919 208.90185
10.01294 247.28439];
IgG_E = [1.1848 5.72282
1.81757 5.72282
2.34124 5.72282
2.86491 5.72282
3.41039 4.24916
3.84679 4.24916
4.45773 4.24916
5.26506 2.77551
5.35234 2.77551
6.22512 5.72282
6.57423 17.51208
6.74879 24.88037
6.74879 37.03805
7.46884 57.66926
7.9925 80.14255
8.4289 141.29935
8.4289 125.08911
8.51617 99.66851
8.51617 227.87675
8.79983 265.08662
8.88711 153.45703
8.88711 205.40347
9.23622 280.19161
9.23622 174.08824
9.3235 238.19236
9.49806 492.02994
9.58533 221.98212
9.58533 463.66202
9.75989 238.19236
9.93445 436.76777
9.93445 187.71958
10.02173 351.66402];
%% Parameters
beta_E = x(1);
phi = x(2);
delta_ER = x(3);
%----------------------ODE #2-----------------------------------------%
%----------------------ODE #3-----------------------------------------%
c_K = x(4);
kappa_E = x(5);
%----------------------ODE #4-----------------------------------------%
%epsilon_1 = 0;
pi_V = x(6);
%
%
pi_M_I = x(7);
c_M = x(8);
c_IgM = x(9);7.8e-2;
c_IgG = x(10);4.5e-8;
%---------------------ODE #5------------------------------------------%
% epsilon_2 = 0;
alpha =x(11);%1.8e-2;
V_50 = x(12);%3.9e-4;
% delta_M_R = 0.04;
% ---------------------ODE #6------------------------------------------%
lambda = x(13);%2.2e-3;
% delta_M_A = 0.04;
%---------------------ODE #7------------------------------------------%
% delta_M_I = 0.04;
% ---------------------ODE #8------------------------------------------%
pi_F = x(14);
delta_F = x(15);
%---------------------ODE #9------------------------------------------%
% S_k = 5e5;
delta_k = x(16);
phi_k = x(17);
%---------------------ODE #11------------------------------------------%
% S_k = 5e5;
beta_D = x(18);
delta_D = x(19);
%---------------------ODE #12------------------------------------------%
delta_D_I = x(20);
% ---------------------ODE #13------------------------------------------%
K_D = x(21);
% tau_D = 3; %x(29);
delta_DM = x(22);
%---------------------ODE #14------------------------------------------%
delta_HN = x(23);
pi_H1 = x(24); pi_H2 = x(25);
%---------------------ODE #15------------------------------------------%
rho_H1 = x(26); rho_H2 = x(27);
delta_H1 = x(28); delta_H2 = x(29);
%---------------------ODE #16------------------------------------------%
delta_TN = x(30);
pi_T1 = x(31); pi_T2 = x(32);
%---------------------ODE #17------------------------------------------%
rho_T1 = x(33); rho_T2 = x(34);
delta_T1 = x(35); delta_T2 = x(36);
pi_B1 = x(37);3; pi_B2 = x(38);1e4;
delta_B = x(39);2e-3;
rho_B1 = x(40);1.5;2.6;h = x(41);0; rho_B2 = x(42);4e3;
delta_BA = x(43);0.1;0.9; pi_S = x(44);1e-3; pi_L = x(45);1e-3;8e-9;
delta_S = x(46);0.1;
delta_L = x(47);3e-2;
pi_AS = x(48);6e-1; pi_AL = x(49);2e-1; delta_AS =x(50);2; delta_AL =x(51);2;
%% ICs
initial_val(1) = 14e7;
E0 = initial_val(1);
initial_val(2) = 0;
initial_val(3) = 0;
initial_val(4) = 1e2;
initial_val(5) = 1e3;171e3;
initial_val(6) = 0;
initial_val(7) = 0;
initial_val(8) = 0;
initial_val(9) = 0;
initial_val(10) = 1e3;99925.13276;
initial_val(11) = 0;
initial_val(12) = 1e3;99925.13276;
initial_val(13) = 0;
initial_val(14) = 1e3;2e5;
initial_val(15) = 0;
initial_val(16) = 0;
initial_val(17) = 1e3;
initial_val(18) = 1e3;
initial_val(19) = 0;
initial_val(20) = 1e3;
initial_val(21) = 1e3;
initial_val(22) = 0;
initial_val(23) = 1e3;
initial_val(24) = 1e3;
initial_val(25) = 0 ;
initial_val(26) = 1e3;
initial_val(27) = 0 ;
initial_val(28) = 0 ;
initial_val(29) = 0;
initial_val(30) = 0;
initial_val(31) = 0;
initial_val(32) = 0;
initial_val(33) = 0;
%% Main body
j = 1;
[t,y] = ode23t(@f,[0 10],initial_val,j);
plot(t,y)
%% ODEs
function dydt = f(t,y)
Tau_t = 5; Tau_D = 2;
dydt = zeros(33,1);
if t >Tau_D
Data = load ('Data.txt','Data');
for i = 1 : size (Data,1)-1
if t - Tau_D < Data(i+1,1) && t - Tau_D >= Data(i,1)
CD = Data(i,2);
end
end
end
%
if t > Tau_t
for i = 1 : size (Data,1)-1
if t - Tau_t < Data(i+1,1) && t - Tau_t >= Data(i,1)
CD8T = Data(i,3);
IgM = Data(i,4);
IgG = Data(i,5);
end
end
end
Data = [t ; y(15) ; y(22) ; y(29) ; y(30)];
if t ==0
fileID = fopen('Data.txt','w'); fprintf(fileID, '%f %f %f %f %f \n', Data); fclose(fileID);
else
fileID = fopen('Data.txt','a'); fprintf(fileID, '%f %f %f %f %f \n', Data); fclose(fileID);
end
delta_E_IL = 4;
delta_E_I = 2;
epsilon_1 = 0; c_V =1.5;
epsilon_2 = 0;
delta_M_A = 0.04;
delta_M_R = 0.04; MR0=171e3;
delta_M_I = 0.04;
NK0 = 99925.13276; CD0 =0;2e5; HN0 = 1e3;357632.72734; TN0 = 1e3;95289.89712; BN0 = 1e3;95289.89712;
dydt(1) = -beta_E*y(1)*y(4) -phi*y(1)*y(9) +delta_ER*y(13); %d/dt E=-?_E VE -?FE+?_(E_R ) E_R-?_E E
dydt(2) = beta_E*y(1)*y(4) -delta_E_IL*y(2); %d/dt E_IL=?_E VE -?_(E_IL ) E_IL-?_k E_IL K
if t>Tau_t
dydt(3) = delta_E_IL*y(2) -delta_E_I*y(3) -c_K*y(11)*y(3) -kappa_E*CD8T*y(3);%; %d/dt E_I=?_(E_IL ) E_IL-?_(E_I ) E_I-?_E E_I ?T_E (t-?_T)-?_k E_I K
dydt(4) = (1-epsilon_1)*(pi_V*y(3)+ pi_M_I*y(7)) -c_V*y(4) -c_M*y(6)*y(4) -c_IgM*IgM - c_IgG*IgG; %d/dt V=(1-?_1)(?_V E_I+?_(M_I ) M_I)-c_V V-?_V VA(t)-?_E VE
dydt(31) = CD8T; dydt(32) = IgM; dydt(33) = IgG;
else
dydt(3) = delta_E_IL*y(2) -delta_E_I*y(3) -c_K*y(11)*y(3); %d/dt E_I=?_(E_IL ) E_IL-?_(E_I ) E_I-?_E E_I ?T_E (t-?_T)-?_k E_I K
dydt(4) = (1-epsilon_1)*(pi_V*y(3)+ pi_M_I*y(7)) -c_V*y(4) -c_M*y(6)*y(4); %d/dt V=(1-?_1)(?_V E_I+?_(M_I ) M_I)-c_V V-?_V VA(t)-?_E VE
end
%---------------------------------------------------------------%
dydt(5) = delta_M_R*(MR0-y(5)) -(1-epsilon_2)*alpha*y(4)*y(5)/(V_50+y(4)); %d/dt M_R=s-((1-?_2)?VM_R)/(V_50+V)-?_(M_R ) M_R
dydt(6) = (1-epsilon_2)*alpha*y(4)*y(5)/(V_50+y(4)) -lambda*y(4)*y(6) -delta_M_A*y(6); %d/dt M_A=((1-?_2)?VM_R)/(V_50+V)-?M_A V-?_(M_A ) M_A
dydt(7) = lambda*y(4)*y(6) -delta_M_I*y(7); %d/dt M_I=?M_A V-?_(M_I ) M_I
dydt(8) = y(6) + y(7);
dydt(9) = pi_F*y(3) -delta_F*y(9); %d/dt F=?_F M_A-?_F F
dydt(10) =delta_k*(NK0-y(10)) -phi_k*y(9)*y(10); %d/dt K=S_k+?_k E_I-?_k K
dydt(11) = phi_k*y(9)*y(10) - delta_k*y(11);
dydt(12) = y(10)+y(11);
dydt(13) = phi*y(1)*y(9) -delta_ER*y(13); %d/dt E_R=?FE-?_ER E_R
dydt(14) = -beta_D*y(4)*y(14) -delta_D*(y(14)-CD0); %d/dt D=?_D D_0-?_D D-?_D DV
dydt(15) = beta_D*y(4)*y(14) -delta_D_I*y(15); %d/dt D_I=?_D DV-?_(D_I ) D_I
if t > Tau_D
K_D = 200; delta_DM = 5e-1;
dydt(16) = K_D*CD -delta_DM*y(16); %d/dt D_M=k_D D_I (t-?_D)-?_DM D_M
dydt(17) = y(15) +y(16);
pi_H1 = 1.5; pi_H2 = 1e2;
pi_H = pi_H1*y(16)/(y(16)+pi_H2);
delta_HN = 2e-3; %---------delet
dydt(18) = delta_HN*(HN0-y(18)) -pi_H*y(18); %d/dt H_N=?_HN H_N0-?_HN H_N-?_H ?(D?_M)H_N
rho_H1 = 1.51; rho_H2 = 4e3;
rho_H = rho_H1*y(16)/(y(16)+rho_H2);
delta_H1 = 0.4; delta_H2 = 1;
delta_H = delta_H1*y(16)/(y(16)+delta_H2);
dydt(19) = pi_H*y(18) +rho_H*y(19) -delta_H*y(19); %d/dt H_E=?_H (D_M ) H_N+?_H (D_M)H_E-?_H (D_M)H_E
dydt(20) = y(18)+y(19);
pi_T1 = 3; pi_T2 = 1e2;
pi_T = pi_T1*y(16)/(y(16)+pi_T2);
delta_TN = 2e-3;
dydt(21) = delta_TN*(TN0-y(21)) -pi_T*y(21); %d/dt T_N=?_(T_N ) T_N0-?_(T_N ) T_N-?_T ?(D?_M)T_N
rho_T1 = 2.6; rho_T2 = 4e3;
rho_T = rho_T1*y(16)/(y(16)+rho_T2);
delta_T1 = 0.75; delta_T2 = 1;
delta_T = delta_T1*y(16)/(y(16)+delta_T2);
dydt(22) = pi_T*y(21) +rho_T*y(22) -delta_T*y(22); %d/dt T_E=?_T (D_M ) T_N+?_T (D_M)T_E-?_T (D_M)T_E
dydt(23) = y(21) + y(22);
pi_B1 = 3; pi_B2 = 1e4;
pi_B = pi_B1*y(16)/(y(16)+pi_B2);
delta_B = 2e-3;
dydt(24) = delta_B*(BN0-y(24)) -pi_B*y(24); %d/dt B_N=?_B B_N0-?_B H_N-?_B ?(D?_M)B_N
rho_B1 = 1.5;2.6;h = 0; rho_B2 = 4e3;
rho_BA = rho_B1*(y(16)+h*y(19))/(y(16)+h*y(19)+rho_B2);
delta_BA = 0.1;0.9; pi_S = 1e-3; pi_L = 1e-3;8e-9;
dydt(25) = pi_B*y(24) +rho_BA*y(25) -delta_BA*y(25)- pi_S*y(25) - pi_L*y(19)*y(25);
dydt(26) = y(24) +y(25);
delta_S = 0.1;
dydt(27) = pi_S*y(25) -delta_S*y(27);
delta_L = 3e-2;
dydt(28) = pi_L*y(19)*y(25) -delta_L*y(28);
pi_AS = 6e-1; pi_AL = 2e-1; delta_AS =2; delta_AL =2;
dydt(29) = pi_AS*y(27) -delta_AS*y(29);
dydt(30) = pi_AL*y(28) -delta_AL*y(30);
end
end
%% objectives
DIFF1 = 1e+10;
DIFF2 = 1e+10;
DIFF3 = 1e+10;
DIFF4 = 1e+10;
tspan = 1e-4;
for ii = 1: size(y,1)
for iii = 1 : size(V_titer,1)
if abs(V_titer(iii,1) - t(ii)) <= tspan
DIFF1(iii,1) = V_titer(iii,2) - y(ii,4);
end
end
for iii = 1 : size(CD8_T_E,1)
if abs(CD8_T_E(iii,1) - t(ii)) <= tspan
DIFF2(iii,1) = CD8_T_E(iii,2) - y(ii,31);
end
end
for iii = 1 : size(IgM_E,1)
if abs(IgM_E(iii,1) - t(ii)) <= tspan
DIFF3(iii,1) = IgM_E(iii,2) - y(ii,32);
end
end
for iii = 1 : size(IgG_E,1)
if abs(IgG_E(iii,1) - t(ii)) <= tspan
DIFF4(iii,1) = IgG_E(iii,2) - y(ii,33);
end
end
end
OBJs (1)= sqrt(sum(DIFF1.^2)/size(V_titer,1)+sum(DIFF2.^2)/size(CD8_T_E,1))
OBJs(2) = sqrt(sum(DIFF3.^2)/size(IgM_E,1)+sum(DIFF4.^2)/size(IgG_E,1))
end
Mohammad Sami
Mohammad Sami on 8 Jul 2020
I would suggest you need to centralise the reading and writing of the data to the file.
Multiple threads trying to read and write from the same file will cause errors.
Use the function parfeval to call the processing in the parallel and pass in all the data the function needs to work. Ideally your function will not read nor write to the file.
The functions will then compute the values on parallel processes. You can then fetch the results on the main thread and update your files.
More information is available in the documentation on how to use parfeval.

Sign in to comment.

Answers (1)

Rohith Nomula
Rohith Nomula on 7 Jul 2020
Use parfor - parallel for loop in MATLAB
Then use a cell array to store all the values assigned in the looping state
% declare variables outside parallel for loop
parfor i=1:fileLength
% your condition
CD8T{i} = Data(i,3);
IgM{i} = Data(i,4);
IgG{i} = Data(i,5);
end
This works well for optimization
You can use it in both for loops
  1 Comment
Hamideh Hayati
Hamideh Hayati on 7 Jul 2020
Edited: Hamideh Hayati on 7 Jul 2020
Thanks Rohith,
But it is the loading data that is taking too long, not assigning data to the variables.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!