comparison COBRAxy/utils/CBS_backend.py @ 4:41f35c2f0c7b draft

Uploaded
author luca_milaz
date Wed, 18 Sep 2024 10:59:10 +0000
parents
children
comparison
equal deleted inserted replaced
3:1f3ac6fd9867 4:41f35c2f0c7b
1 from swiglpk import *
2 import random
3 import pandas as pd
4 import numpy as np
5 import cobra as cb
6
7 # Initialize LP problem
8 def initialize_lp_problem(S):
9
10 len_vector=len(S.keys())
11 values=list(S.values())
12 indexes=list(S.keys())
13 ia = intArray(len_vector+1);
14 ja = intArray(len_vector+1);
15 ar = doubleArray(len_vector+1);
16
17 i=0
18 ind_row=[indexes[i][0]+1 for i in range(0, len(values) )]
19 ind_col=[indexes[i][1]+1 for i in range(0, len(values) )]
20 for i in range(1, len(values) + 1):
21 ia[i]=ind_row[i-1]
22 ja[i]=ind_col[i-1]
23 ar[i] = values[i-1]
24
25 nrows=S.shape[0]
26 ncol=S.shape[1]
27
28 return len_vector, values, indexes, ia, ja, ar, nrows, ncol
29
30
31
32 # Solve LP problem from the structure of the metabolic model
33 def create_and_solve_lp_problem(lb,ub,nrows, ncol, len_vector, ia, ja, ar,
34 obj_coefs,reactions,return_lp=False):
35
36
37 lp = glp_create_prob();
38 glp_set_prob_name(lp, "sample");
39 glp_set_obj_dir(lp, GLP_MAX);
40 glp_add_rows(lp, nrows);
41 eps = 1e-16
42 for i in range(nrows):
43 glp_set_row_name(lp, i+1, "constrain_"+str(i+1));
44 glp_set_row_bnds(lp, i+1, GLP_FX, 0.0, 0.0);
45 glp_add_cols(lp, ncol);
46 for i in range(ncol):
47 glp_set_col_name(lp, i+1, "flux_"+str(i+1));
48 glp_set_col_bnds(lp, i+1, GLP_DB,lb[i]-eps,ub[i]+eps);
49 glp_load_matrix(lp, len_vector, ia, ja, ar);
50
51 try:
52 fluxes,Z=solve_lp_problem(lp,obj_coefs,reactions)
53 if return_lp:
54 return fluxes,Z,lp
55 else:
56 glp_delete_prob(lp);
57 return fluxes,Z
58 except Exception as e:
59 glp_delete_prob(lp)
60 raise Exception(e)
61
62
63 # Solve LP problem from the structure of the metabolic model
64 def solve_lp_problem(lp,obj_coefs,reactions):
65
66 # Set the coefficients of the objective function
67 i=1
68 for ind_coef in obj_coefs:
69 glp_set_obj_coef(lp, i, ind_coef);
70 i+=1
71
72 # Initialize the parameters
73 params=glp_smcp()
74 params.presolve=GLP_ON
75 params.msg_lev = GLP_MSG_ALL
76 params.tm_lim=4000
77 glp_init_smcp(params)
78
79 # Solve the problem
80 glp_scale_prob(lp,GLP_SF_AUTO)
81
82 value=glp_simplex(lp, params)
83
84 Z = glp_get_obj_val(lp);
85
86 if value == 0:
87 fluxes = []
88 for i in range(len(reactions)): fluxes.append(glp_get_col_prim(lp, i+1))
89 return fluxes,Z
90 else:
91 raise Exception("error in LP problem. Problem:",str(value))
92
93
94 # Create LP structure
95 def create_lp_structure(model):
96
97 reactions=[el.id for el in model.reactions]
98 coefs_obj=[reaction.objective_coefficient for reaction in model.reactions]
99
100 # Lower and upper bounds
101 lb=[reaction.lower_bound for reaction in model.reactions]
102 ub=[reaction.upper_bound for reaction in model.reactions]
103
104 # Create S matrix
105 S=cb.util.create_stoichiometric_matrix(model,array_type="dok")
106
107 return S,lb,ub,coefs_obj,reactions
108
109 # CBS sampling interface
110 def randomObjectiveFunctionSampling(model, nsample, coefficients_df, df_sample):
111
112 S,lb,ub,coefs_obj,reactions = create_lp_structure(model)
113 len_vector, values, indexes, ia, ja, ar, nrow, ncol = initialize_lp_problem(S)
114
115 for i in range(nsample):
116
117 coefs_obj=coefficients_df.iloc[:,i].values
118
119 if coefs_obj[-1]==1: #minimize
120 coefs_obj= coefs_obj[0:-1] * -1
121 else:
122 coefs_obj=coefs_obj[0:-1]
123
124 fluxes,Z = create_and_solve_lp_problem(lb,ub, nrow, ncol, len_vector,
125 ia, ja, ar, coefs_obj,reactions,return_lp=False)
126 df_sample.loc[i] = fluxes
127 pass
128
129 def randomObjectiveFunctionSampling_cobrapy(model, nsample, coefficients_df, df_sample):
130
131 for i in range(nsample):
132
133 dict_coeff={}
134 if(coefficients_df.iloc[-1][i]==1):
135 type_problem = -1 #minimize
136 else:
137 type_problem = 1
138
139 for rxn in [reaction.id for reaction in model.reactions]:
140 dict_coeff[model.reactions.get_by_id(rxn)] = coefficients_df.loc[rxn][i] * type_problem
141
142 model.objective = dict_coeff
143 solution = model.optimize().fluxes
144 for rxn, flux in solution.items():
145 df_sample.loc[i][rxn] = flux
146
147 pass
148
149 # Create random coefficients for CBS
150 def randomObjectiveFunction(model, n_samples, df_fva, seed=0):
151
152
153 #reactions = model.reactions
154 reactions = [reaction.id for reaction in model.reactions]
155 cont=seed
156 list_ex=reactions.copy()
157 list_ex.append("type_of_problem")
158 coefficients_df = pd.DataFrame(index=list_ex,columns=[str(i) for i in range(n_samples)])
159
160 for i in range(0, n_samples):
161
162 cont=cont+1
163 random.seed(cont)
164
165 # Genera un numero casuale tra 0 e 1
166 threshold = random.random() #coefficiente tra 0 e 1
167
168 for reaction in reactions:
169
170 cont=cont+1
171 random.seed(cont)
172
173 val=random.random()
174
175 if val>threshold:
176
177 cont=cont+1
178 random.seed(cont)
179
180 c=2*random.random()-1 #coefficiente tra -1 e 1
181
182 val_max=np.max([df_fva.loc[reaction,"minimum"],df_fva.loc[reaction,"maximum"]])
183
184 if val_max!=0: #solo se la fva รจ diversa da zero
185 coefficients_df.loc[reaction,str(i)] = c/val_max #divido per la fva
186 else:
187 coefficients_df.loc[reaction,str(i)] = 0
188
189 else:
190 coefficients_df.loc[reaction,str(i)] = 0
191
192 cont=cont+1
193 random.seed(cont)
194
195 if random.random()<0.5:
196 coefficients_df.loc["type_of_problem",str(i)] = 0 #maximize
197 else:
198 coefficients_df.loc["type_of_problem",str(i)] = 1 #minimize
199
200 return coefficients_df