annotate COBRAxy/utils/CBS_backend.py @ 456:a6e45049c1b9 draft default tip

Uploaded
author francesco_lapi
date Fri, 12 Sep 2025 17:28:45 +0000
parents 0a3ca20848f3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
1 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
2 CBS backend utilities using GLPK for constraint-based sampling.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
3
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
4 This module builds and solves LP problems from COBRA models, supports random
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
5 objective function generation (CBS), and provides both swiglpk-based and
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
6 COBRApy-based sampling fallbacks.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
7 """
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
8 from swiglpk import *
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
9 import random
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
10 import pandas as pd
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
11 import numpy as np
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
12 import cobra as cb
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
13
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
14 # Initialize LP problem
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
15 def initialize_lp_problem(S):
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
16 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
17 Prepare sparse matrix structures for GLPK given a stoichiometric matrix.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
18
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
19 Args:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
20 S: Stoichiometric matrix (DOK or similar) as returned by cobra.util.create_stoichiometric_matrix.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
21
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
22 Returns:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
23 tuple: (len_vector, values, indexes, ia, ja, ar, nrows, ncol)
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
24 - len_vector: number of non-zero entries
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
25 - values: list of non-zero values
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
26 - indexes: list of (row, col) indices for non-zero entries
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
27 - ia, ja, ar: GLPK-ready arrays for the sparse matrix
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
28 - nrows, ncol: matrix shape
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
29 """
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
30
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
31 len_vector=len(S.keys())
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
32 values=list(S.values())
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
33 indexes=list(S.keys())
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
34 ia = intArray(len_vector+1);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
35 ja = intArray(len_vector+1);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
36 ar = doubleArray(len_vector+1);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
37
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
38 i=0
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
39 ind_row=[indexes[i][0]+1 for i in range(0, len(values) )]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
40 ind_col=[indexes[i][1]+1 for i in range(0, len(values) )]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
41 for i in range(1, len(values) + 1):
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
42 ia[i]=ind_row[i-1]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
43 ja[i]=ind_col[i-1]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
44 ar[i] = values[i-1]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
45
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
46 nrows=S.shape[0]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
47 ncol=S.shape[1]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
48
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
49 return len_vector, values, indexes, ia, ja, ar, nrows, ncol
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
50
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
51
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
52
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
53 def create_and_solve_lp_problem(lb,ub,nrows, ncol, len_vector, ia, ja, ar,
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
54 obj_coefs,reactions,return_lp=False):
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
55 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
56 Create and solve a GLPK LP problem for a metabolic model.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
57
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
58 Args:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
59 lb, ub: Lower/upper bounds per reaction (lists of floats).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
60 nrows, ncol: Dimensions of the S matrix.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
61 len_vector, ia, ja, ar: Sparse matrix data prepared for GLPK.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
62 obj_coefs: Objective function coefficients (list of floats).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
63 reactions: Reaction identifiers (list of str), used for output mapping.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
64 return_lp: If True, also return the GLPK problem object (caller must delete).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
65
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
66 Returns:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
67 tuple: (fluxes, Z) or (fluxes, Z, lp) if return_lp=True.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
68 """
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
69
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
70
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
71 lp = glp_create_prob();
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
72 glp_set_prob_name(lp, "sample");
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
73 glp_set_obj_dir(lp, GLP_MAX);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
74 glp_add_rows(lp, nrows);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
75 eps = 1e-16
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
76 for i in range(nrows):
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
77 glp_set_row_name(lp, i+1, "constrain_"+str(i+1));
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
78 glp_set_row_bnds(lp, i+1, GLP_FX, 0.0, 0.0);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
79 glp_add_cols(lp, ncol);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
80 for i in range(ncol):
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
81 glp_set_col_name(lp, i+1, "flux_"+str(i+1));
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
82 glp_set_col_bnds(lp, i+1, GLP_DB,lb[i]-eps,ub[i]+eps);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
83 glp_load_matrix(lp, len_vector, ia, ja, ar);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
84
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
85 try:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
86 fluxes,Z=solve_lp_problem(lp,obj_coefs,reactions)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
87 if return_lp:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
88 return fluxes,Z,lp
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
89 else:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
90 glp_delete_prob(lp);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
91 return fluxes,Z
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
92 except Exception as e:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
93 glp_delete_prob(lp)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
94 raise Exception(e)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
95
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
96
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
97 def solve_lp_problem(lp,obj_coefs,reactions):
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
98 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
99 Configure and solve an LP with GLPK using provided objective coefficients.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
100
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
101 Args:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
102 lp: GLPK problem handle.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
103 obj_coefs: Objective coefficients.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
104 reactions: Reaction identifiers (unused in computation; length used for output).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
105
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
106 Returns:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
107 tuple: (fluxes, Z) where fluxes is a list of primal column values and Z is the objective value.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
108 """
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
109
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
110 # Set the coefficients of the objective function
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
111 i=1
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
112 for ind_coef in obj_coefs:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
113 glp_set_obj_coef(lp, i, ind_coef);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
114 i+=1
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
115
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
116 # Initialize the parameters
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
117 params=glp_smcp()
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
118 params.presolve=GLP_ON
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
119 params.msg_lev = GLP_MSG_ERR
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
120 params.tm_lim=4000
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
121 glp_init_smcp(params)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
122
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
123 glp_term_out(GLP_OFF)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
124
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
125 try:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
126
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
127 # Solve the problem
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
128 glp_scale_prob(lp,GLP_SF_AUTO)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
129
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
130 value=glp_simplex(lp, params)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
131
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
132 Z = glp_get_obj_val(lp);
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
133
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
134 if value == 0:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
135 fluxes = []
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
136 for i in range(len(reactions)): fluxes.append(glp_get_col_prim(lp, i+1))
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
137 return fluxes,Z
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
138 else:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
139 raise Exception("error in LP problem. Problem:",str(value))
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
140 except Exception as e:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
141 # Re-enable terminal output for error reporting
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
142 glp_term_out(GLP_ON)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
143 raise Exception(e)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
144 finally:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
145 # Re-enable terminal output after solving
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
146 glp_term_out(GLP_ON)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
147
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
148 def create_lp_structure(model):
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
149 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
150 Extract the LP structure (S matrix, bounds, objective) from a COBRA model.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
151
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
152 Args:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
153 model (cobra.Model): The COBRA model.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
154
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
155 Returns:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
156 tuple: (S, lb, ub, coefs_obj, reactions)
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
157 """
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
158
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
159 reactions=[el.id for el in model.reactions]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
160 coefs_obj=[reaction.objective_coefficient for reaction in model.reactions]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
161
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
162 # Lower and upper bounds
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
163 lb=[reaction.lower_bound for reaction in model.reactions]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
164 ub=[reaction.upper_bound for reaction in model.reactions]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
165
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
166 # Create S matrix
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
167 S=cb.util.create_stoichiometric_matrix(model,array_type="dok")
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
168
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
169 return S,lb,ub,coefs_obj,reactions
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
170
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
171 def randomObjectiveFunctionSampling(model, nsample, coefficients_df, df_sample):
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
172 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
173 Sample fluxes using GLPK by iterating over random objective functions.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
174
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
175 Args:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
176 model: COBRA model.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
177 nsample: Number of samples to generate.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
178 coefficients_df: DataFrame of objective coefficients (columns are samples; last row is type_of_problem).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
179 df_sample: Output DataFrame to fill with flux samples (index: sample, columns: reactions).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
180
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
181 Returns:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
182 None
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
183 """
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
184
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
185 S,lb,ub,coefs_obj,reactions = create_lp_structure(model)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
186 len_vector, values, indexes, ia, ja, ar, nrow, ncol = initialize_lp_problem(S)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
187
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
188 for i in range(nsample):
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
189
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
190 coefs_obj=coefficients_df.iloc[:,i].values
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
191
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
192 if coefs_obj[-1]==1: # minimize
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
193 coefs_obj= coefs_obj[0:-1] * -1
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
194 else:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
195 coefs_obj=coefs_obj[0:-1]
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
196
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
197 fluxes,Z = create_and_solve_lp_problem(lb,ub, nrow, ncol, len_vector,
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
198 ia, ja, ar, coefs_obj,reactions,return_lp=False)
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
199 df_sample.loc[i] = fluxes
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
200 return
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
201
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
202 def randomObjectiveFunctionSampling_cobrapy(model, nsample, coefficients_df, df_sample):
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
203 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
204 Fallback sampling using COBRApy's optimize with per-sample randomized objectives.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
205
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
206 Args:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
207 model: COBRA model.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
208 nsample: Number of samples to generate.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
209 coefficients_df: DataFrame of objective coefficients (columns are samples; last row is type_of_problem).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
210 df_sample: Output DataFrame to fill with flux samples (index: sample, columns: reactions).
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
211
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
212 Returns:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
213 None
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
214 """
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
215
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
216 for i in range(nsample):
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
217
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
218 dict_coeff={}
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
219 if(coefficients_df.iloc[-1][i]==1):
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
220 type_problem = -1 # minimize
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
221 else:
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
222 type_problem = 1 # maximize
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
223
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
224 for rxn in [reaction.id for reaction in model.reactions]:
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
225 dict_coeff[model.reactions.get_by_id(rxn)] = coefficients_df.loc[rxn][i] * type_problem
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
226
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
227 model.objective = dict_coeff
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
228 solution = model.optimize().fluxes
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
229 for rxn, flux in solution.items():
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
230 df_sample.loc[i][rxn] = flux
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
231
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
232 return
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
233
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
234 def randomObjectiveFunction(model, n_samples, df_fva, seed=0):
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
235 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
236 Create random objective function coefficients for CBS sampling.
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
237
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
238 The last row 'type_of_problem' encodes 0 for maximize and 1 for minimize.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
239
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
240 Args:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
241 model: COBRA model.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
242 n_samples: Number of random objectives to generate.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
243 df_fva: Flux Variability Analysis results with 'minimum' and 'maximum' per reaction.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
244 seed: Seed for reproducibility.
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
245
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
246 Returns:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
247 pandas.DataFrame: Coefficients DataFrame indexed by reaction IDs plus 'type_of_problem'.
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
248 """
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
249 # reactions = model.reactions
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
250 reactions = [reaction.id for reaction in model.reactions]
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
251 cont = seed
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
252 list_ex = reactions.copy()
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
253 list_ex.append("type_of_problem")
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
254 coefficients_df = pd.DataFrame(index=list_ex, columns=[str(i) for i in range(n_samples)])
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
255
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
256 for i in range(0, n_samples):
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
257
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
258 cont = cont + 1
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
259 random.seed(cont)
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
260
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
261 # Generate a random threshold in [0, 1]
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
262 threshold = random.random()
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
263
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
264 for reaction in reactions:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
265
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
266 cont = cont + 1
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
267 random.seed(cont)
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
268
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
269 val = random.random()
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
270
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
271 if val > threshold:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
272
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
273 cont = cont + 1
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
274 random.seed(cont)
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
275
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
276 # Coefficient in [-1, 1]
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
277 c = 2 * random.random() - 1
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
278
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
279 val_max = np.max([abs(df_fva.loc[reaction, "minimum"]), abs(df_fva.loc[reaction, "maximum"])])
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
280
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
281 if val_max != 0: # only if FVA is non-zero
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
282 coefficients_df.loc[reaction, str(i)] = c / val_max # scale by FVA
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
283 else:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
284 coefficients_df.loc[reaction, str(i)] = 0
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
285
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
286 else:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
287 coefficients_df.loc[reaction, str(i)] = 0
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
288
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
289 cont = cont + 1
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
290 random.seed(cont)
381
0a3ca20848f3 Uploaded
francesco_lapi
parents: 342
diff changeset
291
456
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
292 if random.random() < 0.5:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
293 coefficients_df.loc["type_of_problem", str(i)] = 0 # maximize
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
294 else:
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
295 coefficients_df.loc["type_of_problem", str(i)] = 1 # minimize
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
296
a6e45049c1b9 Uploaded
francesco_lapi
parents: 381
diff changeset
297 return coefficients_df