-
Notifications
You must be signed in to change notification settings - Fork 1
/
runEMILiO.asv
105 lines (99 loc) · 3.81 KB
/
runEMILiO.asv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
%%runEMILiO
%growthmin - Minimum required growth coupled to metabolite production
%Solve maximization problem for target metabolite production constrained by
%minimum growth
cprod = sparse(1,prodind,1,1,Sn);
vl1=model.vl; vu1=model.vu;
vl1(growth)=growthmin;
b=sparse(Sm,1,0);
v=cplexlp(-cprod(:),[],[],model.S,b,vl1,vu1);
vpmax = v(prodind);
%%
EMtimes = sparse(1,EMmaxIter);
allsets=cell(1,EMmaxIter);
allplists=cell(1,EMmaxIter);
nsets=0;
nplists=0;
failediter=0;
% Run EMILiO
for EMiter= 1 : EMmaxIter
startEM = tic;
[setsY,plist,vlY,vuY,activevlY,activevuY,vY,KKTviol,exitflag]=EMILiO(...
model,growth,growthmin,prodind,blacklistEM,R,pvind,noConc, ...
KpY,ICEM,LPpruneFrac,MILPpruneFrac,epsProd,epsProdILP,nCuts);
elapsed=toc(startEM);
EMtimes(EMiter)=elapsed;
% If exitflag == 2, means we should increase epsProdILP
if exitflag == 2
epsProdILP = 10 * epsProdILP;
fprintf('Restarting with higher epsProd=%g, as suggested.\n',epsProdILP);
elseif exitflag == -1
fprintf('Terminating EMILiO\n'); % Because SLP suggests no solution
break;
end
if not(isempty(setsY))
nsubsets=length(setsY);
for i=1:nsubsets
if setsY{i}.vprod >= LPpruneFrac*vpmax
nsets=nsets+1;
allsets{nsets}=setsY{i};
% Rank mods in terms of importance to production
modsranked=rankmods(model,setsY{i},growth,prodind,growthmin,epsProd);
% Just blacklist most important mod
newblacklist=modsranked(1).rxn;
fprintf('Reaction %s removed at iteration %g\n',...
model.rxns{newblacklist},EMiter);
blacklistEM= union(blacklistEM, newblacklist);
end
end
% Number of plists can be different from nsets due to integer cuts
numplists = length(plist);
for i=1:numplists
nplists=nplists+1;
allplists{nplists}=plist{i};
end
end
if failediter > maxFailedIter
fprintf('Failed to find strain more than %g times. Terminating\n',maxFailedIter);
break;
end
end
allsets(nsets+1:end)=[];
allplists(nplists+1:end)=[];
%% For each of the strains, remove strategies that make little difference
insigTol = 0.001;
allsets2=cell(1,nsets);
for i=1:nsets
allsets2{i}.KO=[]; allsets2{i}.activevl=[]; allsets2{i}.activevu=[];
allsets2{i}.vld=[]; allsets2{i}.vud=[];
allsets2{i}.vl=model.vl; allsets2{i}.vu=model.vu;
end
b=sparse(Sm,1,0);
c=sparse(1,growth,1,1,Sn);
for i=1:nsets
[modsranked,dvps]=rankmods(model,allsets{i},growth,prodind,growthmin,epsProd);
sigmods = find(abs(dvps) >= insigTol*vpmax);
nsig = length(sigmods);
for j=sigmods(:)'
allsets2{i}.KO = [allsets2{i}.KO modsranked(j).KO];
if not(isempty(modsranked(j).activevl))
allsets2{i}.activevl=[allsets2{i}.activevl modsranked(j).activevl];
allsets2{i}.vld=[allsets2{i}.vld modsranked(j).vl];
allsets2{i}.vl(modsranked(j).activevl)=modsranked(j).vl;
end
if not(isempty(modsranked(j).activevu))
allsets2{i}.activevu=[allsets2{i}.activevu modsranked(j).activevu];
allsets2{i}.vud=[allsets2{i}.vud modsranked(j).vu];
allsets2{i}.vu(modsranked(j).activevu)=modsranked(j).vu;
end
end
vl2=model.vl; vu2=model.vu;
vl2(allsets2{i}.KO)=0; vu2(allsets2{i}.KO)=0;
vl2(allsets2{i}.activevl)=allsets2{i}.vld;
vu2(allsets2{i}.activevu)=allsets2{i}.vud;
[v,fval]=cplexlp(-c(:),[],[],model.S,b,vl2,vu2);
allsets2{i}.vprod = abs(v(prodind));
end
%% Now, correct for any numerical error leading to false fine-tuning to low
% flux, when it should actually be a knockout
allsets2 = knockoutnumerr(model,allsets2,growth,prodind,growthmin,epsProd);