From 0b03eb0ccb873dad2412ce453a0ba64f8e40004c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Thu, 11 Mar 2021 19:00:50 +0000 Subject: [PATCH 01/15] [FIX] Now properly updating S matrix upon adding const/vars --- src/cobamp/core/linear_systems.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index 4d90e6e..aefcd6c 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -141,7 +141,7 @@ class LinearSystem(): __model: Linear model as an instance of the solver. """ __metaclass__ = abc.ABCMeta - model = None + model: optlang.Model = None def was_built(self): if self.model != None: @@ -348,7 +348,15 @@ def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=Fa if len(coefs) > 0: constraint.set_linear_coefficients(coefs) + var_name_map = {v:i for i,v in enumerate(self.model.variables)} + cns_name_map = {v:i for i,v in enumerate(self.model.constraints)} + + v_ids, c_ids =[[nmap[k.name] for k in container] + for container, nmap in zip([vars,constraints],[var_name_map,cns_name_map])] + self.model.update() + self.S[c_ids,v_ids] = S + def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_rows=None, vars=None, names=None): """ @@ -361,8 +369,11 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_row vars: names: """ + if not vars: vars = self.model.variables + + # dummy = self.dummy_variable() if names != None: constraints = [self.empty_constraint(b_lb[i], b_ub[i], name=names[i]) for i in range(S_new.shape[0])] @@ -376,11 +387,14 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_row self.model.add(constraints, sloppy=True) self.model.update() + self.S = np.vstack(self.S, np.zeros([S_new.shape[0], len(self.model.variables)])) self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero) + # self.model.update() # self.model.remove(dummy) self.model.update() + return constraints def remove_from_model(self, index, what): @@ -435,6 +449,8 @@ def add_variables_to_model(self, var_names, lb, ub, var_types): self.model.add(vars) self.model.update() + self.S = np.hstack(self.S, np.zeros([len(self.model.constraints), len(vars)])) + return vars def get_stuff(self, what, index): From 5ef0b785ff97b31d55f3c3df532f3f5c80d8e834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Thu, 11 Mar 2021 19:07:55 +0000 Subject: [PATCH 02/15] [FIX] Corrected h/vstack parameters --- src/cobamp/core/linear_systems.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index aefcd6c..f70215e 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -387,7 +387,7 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_row self.model.add(constraints, sloppy=True) self.model.update() - self.S = np.vstack(self.S, np.zeros([S_new.shape[0], len(self.model.variables)])) + self.S = np.vstack([self.S, np.zeros([S_new.shape[0], len(self.model.variables)])]) self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero) @@ -449,7 +449,7 @@ def add_variables_to_model(self, var_names, lb, ub, var_types): self.model.add(vars) self.model.update() - self.S = np.hstack(self.S, np.zeros([len(self.model.constraints), len(vars)])) + self.S = np.hstack([self.S, np.zeros([len(self.model.constraints), len(vars)])]) return vars From ba856410ec5b872cf042f6436d5b33892443e050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Fri, 12 Mar 2021 10:46:51 +0000 Subject: [PATCH 03/15] [FIX] build_problem now resets self.S to avoid duplication --- src/cobamp/core/linear_systems.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index f70215e..c94b84d 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -327,6 +327,7 @@ def populate_model_from_matrix(self, S, var_types, lb, ub, b_lb, b_ub, var_names only_nonzero: indicator_rows: """ + self.S = np.zeros([0,0]) self.add_variables_to_model(var_names, lb, ub, var_types) self.add_rows_to_model(S, b_lb, b_ub, only_nonzero, indicator_rows) From 47692a82ac15c7de6c79cbe17ce3c874b2ec528e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Fri, 12 Mar 2021 12:29:09 +0000 Subject: [PATCH 04/15] [FIX] No longer updating if matrix is empty --- src/cobamp/core/linear_systems.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index c94b84d..e508387 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -349,14 +349,16 @@ def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=Fa if len(coefs) > 0: constraint.set_linear_coefficients(coefs) - var_name_map = {v:i for i,v in enumerate(self.model.variables)} - cns_name_map = {v:i for i,v in enumerate(self.model.constraints)} + var_name_map = {v.name:i for i,v in enumerate(self.model.variables)} + cns_name_map = {v.name:i for i,v in enumerate(self.model.constraints)} - v_ids, c_ids =[[nmap[k.name] for k in container] + v_ids, c_ids =[np.array([nmap[k.name] for k in container]) for container, nmap in zip([vars,constraints],[var_name_map,cns_name_map])] self.model.update() - self.S[c_ids,v_ids] = S + + if len(c_ids) > 0 and len(v_ids) > 0: + self.S[c_ids[:,None],v_ids] = S def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_rows=None, vars=None, names=None): From f2311e561b33b8d93e49a08dc8c20a09311d5ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Fri, 12 Mar 2021 12:30:02 +0000 Subject: [PATCH 05/15] [FIX] Casting status to string --- src/cobamp/core/optimization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cobamp/core/optimization.py b/src/cobamp/core/optimization.py index 82ffbda..e3b4401 100644 --- a/src/cobamp/core/optimization.py +++ b/src/cobamp/core/optimization.py @@ -148,7 +148,7 @@ def x(self): return array(list(self.__value_map.values())) def __repr__(self): - return '<'+self.status().capitalize()+' Solution - objective: '+\ + return '<'+str(self.status()).capitalize()+' Solution - objective: '+\ str(self.objective_value())+'; at '+hex(id(self))+'>' From 3335f786c717b1ad426ab96bd3f916e88d68928b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 15:53:50 +0000 Subject: [PATCH 06/15] [ADD] Constraints are now populated by chunking --- src/cobamp/core/linear_systems.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index e508387..bd38d70 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -10,7 +10,7 @@ CUSTOM_DEFAULT_SOLVER = None SOLVER_ORDER = ['CPLEX', 'GUROBI', 'GLPK', 'MOSEK', 'SCIPY'] - +MAX_DIM_CONST = 2000 def get_default_solver(): if CUSTOM_DEFAULT_SOLVER: @@ -332,6 +332,15 @@ def populate_model_from_matrix(self, S, var_types, lb, ub, b_lb, b_ub, var_names self.add_rows_to_model(S, b_lb, b_ub, only_nonzero, indicator_rows) def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=False): + if S.shape[0] > MAX_DIM_CONST: + runs = np.array_split(np.array(range(S.shape[0])), max(S.shape[0] // MAX_DIM_CONST, 1)) + for run in runs: + subs, subc, subv = S[runs,:],[constraints[k] for k in run],[vars[k] for k in run] + self._populate_constraints_from_matrix(subs, subc, subv) + else: + self._populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero) + + def _populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=False): """ Args: S: Two-dimensional np.ndarray instance @@ -339,6 +348,8 @@ def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=Fa vars: list of variable instances only_nonzero: """ + + if not only_nonzero: coef_list = [{vars[j]: S[i, j] for j in range(S.shape[1])} for i in range(S.shape[0])] else: From 0028a5019e8217192c52b155c94157b9ffd16175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 16:10:04 +0000 Subject: [PATCH 07/15] [FIX] corrected wrong index --- src/cobamp/core/linear_systems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index bd38d70..5b6d839 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -335,7 +335,7 @@ def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=Fa if S.shape[0] > MAX_DIM_CONST: runs = np.array_split(np.array(range(S.shape[0])), max(S.shape[0] // MAX_DIM_CONST, 1)) for run in runs: - subs, subc, subv = S[runs,:],[constraints[k] for k in run],[vars[k] for k in run] + subs, subc, subv = S[run,:],[constraints[k] for k in run],[vars[k] for k in run] self._populate_constraints_from_matrix(subs, subc, subv) else: self._populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero) From be9f0d5ecedf1907a018e6dd9f201f1da64857c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 16:11:58 +0000 Subject: [PATCH 08/15] [FIX] correcting wrong list subsetting --- src/cobamp/core/linear_systems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index 5b6d839..756b6d8 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -335,7 +335,7 @@ def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=Fa if S.shape[0] > MAX_DIM_CONST: runs = np.array_split(np.array(range(S.shape[0])), max(S.shape[0] // MAX_DIM_CONST, 1)) for run in runs: - subs, subc, subv = S[run,:],[constraints[k] for k in run],[vars[k] for k in run] + subs, subc, subv = S[run,:], [constraints[k] for k in run], vars self._populate_constraints_from_matrix(subs, subc, subv) else: self._populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero) From c3af6438dcff5aa0f7488350a2a5b252ce9970f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 16:22:36 +0000 Subject: [PATCH 09/15] [FIX] add sparse matrix representation to save memory --- src/cobamp/core/linear_systems.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index 756b6d8..f73bb77 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -6,11 +6,12 @@ import numpy as np import optlang +import scipy.sparse as sprs from optlang.symbolics import Zero CUSTOM_DEFAULT_SOLVER = None SOLVER_ORDER = ['CPLEX', 'GUROBI', 'GLPK', 'MOSEK', 'SCIPY'] -MAX_DIM_CONST = 2000 +MAX_DIM_CONST = 100000 def get_default_solver(): if CUSTOM_DEFAULT_SOLVER: @@ -327,7 +328,7 @@ def populate_model_from_matrix(self, S, var_types, lb, ub, b_lb, b_ub, var_names only_nonzero: indicator_rows: """ - self.S = np.zeros([0,0]) + self.S = sprs.csr_matrix(np.zeros([0,0])) self.add_variables_to_model(var_names, lb, ub, var_types) self.add_rows_to_model(S, b_lb, b_ub, only_nonzero, indicator_rows) @@ -401,7 +402,7 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_row self.model.add(constraints, sloppy=True) self.model.update() - self.S = np.vstack([self.S, np.zeros([S_new.shape[0], len(self.model.variables)])]) + self.S = sprs.vstack([self.S, sprs.csr_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]) self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero) @@ -463,7 +464,7 @@ def add_variables_to_model(self, var_names, lb, ub, var_types): self.model.add(vars) self.model.update() - self.S = np.hstack([self.S, np.zeros([len(self.model.constraints), len(vars)])]) + self.S = sprs.hstack([self.S, sprs.csr_matrix(np.zeros([len(self.model.constraints), len(vars)]))]) return vars From d4278023dbe058cb4f213ace12e673695e93600a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 16:24:01 +0000 Subject: [PATCH 10/15] [FIX] remove self from func arguments --- src/cobamp/core/linear_systems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index f73bb77..6ea1d15 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -339,7 +339,7 @@ def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=Fa subs, subc, subv = S[run,:], [constraints[k] for k in run], vars self._populate_constraints_from_matrix(subs, subc, subv) else: - self._populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero) + self._populate_constraints_from_matrix(S, constraints, vars, only_nonzero) def _populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=False): """ From 4348c6335b209012c657be6f2c5df34c1826c31b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 16:26:35 +0000 Subject: [PATCH 11/15] [FIX] changed to csc matrix (usually more columns than rows) --- src/cobamp/core/linear_systems.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index 6ea1d15..4561b14 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -328,7 +328,7 @@ def populate_model_from_matrix(self, S, var_types, lb, ub, b_lb, b_ub, var_names only_nonzero: indicator_rows: """ - self.S = sprs.csr_matrix(np.zeros([0,0])) + self.S = sprs.csc_matrix(np.zeros([0,0])) self.add_variables_to_model(var_names, lb, ub, var_types) self.add_rows_to_model(S, b_lb, b_ub, only_nonzero, indicator_rows) @@ -402,7 +402,7 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_row self.model.add(constraints, sloppy=True) self.model.update() - self.S = sprs.vstack([self.S, sprs.csr_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]) + self.S = sprs.vstack([self.S, sprs.csc_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]) self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero) @@ -464,7 +464,7 @@ def add_variables_to_model(self, var_names, lb, ub, var_types): self.model.add(vars) self.model.update() - self.S = sprs.hstack([self.S, sprs.csr_matrix(np.zeros([len(self.model.constraints), len(vars)]))]) + self.S = sprs.hstack([self.S, sprs.csc_matrix(np.zeros([len(self.model.constraints), len(vars)]))]) return vars From fed608d7b65cdc3ddd05cc514a8c266941245f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 17:07:55 +0000 Subject: [PATCH 12/15] [FIX] convert vstack output to csc --- src/cobamp/core/linear_systems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index 4561b14..6eb6d65 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -402,7 +402,7 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_row self.model.add(constraints, sloppy=True) self.model.update() - self.S = sprs.vstack([self.S, sprs.csc_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]) + self.S = sprs.vstack([self.S, sprs.csc_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]).tocsc() self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero) From 98fb38f7f6896462d4262c91e7923570a1dde98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 18:00:50 +0000 Subject: [PATCH 13/15] [ADD] update option (if matrix is already available) --- src/cobamp/core/linear_systems.py | 36 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index 6eb6d65..549ca02 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -328,20 +328,20 @@ def populate_model_from_matrix(self, S, var_types, lb, ub, b_lb, b_ub, var_names only_nonzero: indicator_rows: """ - self.S = sprs.csc_matrix(np.zeros([0,0])) - self.add_variables_to_model(var_names, lb, ub, var_types) - self.add_rows_to_model(S, b_lb, b_ub, only_nonzero, indicator_rows) + self.S = sprs.csc_matrix(S) + self.add_variables_to_model(var_names, lb, ub, var_types, update=False) + self.add_rows_to_model(S, b_lb, b_ub, only_nonzero, indicator_rows, update=False) - def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=False): + def populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=False, update=True): if S.shape[0] > MAX_DIM_CONST: runs = np.array_split(np.array(range(S.shape[0])), max(S.shape[0] // MAX_DIM_CONST, 1)) for run in runs: subs, subc, subv = S[run,:], [constraints[k] for k in run], vars - self._populate_constraints_from_matrix(subs, subc, subv) + self._populate_constraints_from_matrix(subs, subc, subv, update) else: - self._populate_constraints_from_matrix(S, constraints, vars, only_nonzero) + self._populate_constraints_from_matrix(S, constraints, vars, only_nonzero, update) - def _populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=False): + def _populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=False, update=True): """ Args: S: Two-dimensional np.ndarray instance @@ -368,12 +368,13 @@ def _populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=F for container, nmap in zip([vars,constraints],[var_name_map,cns_name_map])] self.model.update() + if update: + if len(c_ids) > 0 and len(v_ids) > 0: + self.S[c_ids[:,None],v_ids] = S - if len(c_ids) > 0 and len(v_ids) > 0: - self.S[c_ids[:,None],v_ids] = S - - def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_rows=None, vars=None, names=None): + def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, + indicator_rows=None, vars=None, names=None, update=True): """ Args: S_new: @@ -402,7 +403,8 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, indicator_row self.model.add(constraints, sloppy=True) self.model.update() - self.S = sprs.vstack([self.S, sprs.csc_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]).tocsc() + if update: + self.S = sprs.vstack([self.S, sprs.csc_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]).tocsc() self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero) @@ -434,7 +436,7 @@ def remove_from_model(self, index, what): self.model.update() - def add_columns_to_model(self, S_new, var_names, lb, ub, var_types, only_nonzero=False): + def add_columns_to_model(self, S_new, var_names, lb, ub, var_types, only_nonzero=False, update=True): """ Args: S_new: @@ -443,11 +445,11 @@ def add_columns_to_model(self, S_new, var_names, lb, ub, var_types, only_nonzero ub: var_types: """ - vars = self.add_variables_to_model(var_names, lb, ub, var_types) + vars = self.add_variables_to_model(var_names, lb, ub, var_types, update=update) self.populate_constraints_from_matrix(S_new, self.model.constraints, vars, only_nonzero=only_nonzero) - def add_variables_to_model(self, var_names, lb, ub, var_types): + def add_variables_to_model(self, var_names, lb, ub, var_types, update=True): """ Args: @@ -463,8 +465,8 @@ def add_variables_to_model(self, var_names, lb, ub, var_types): zip(var_names, lb, ub, var_types)] self.model.add(vars) self.model.update() - - self.S = sprs.hstack([self.S, sprs.csc_matrix(np.zeros([len(self.model.constraints), len(vars)]))]) + if update: + self.S = sprs.hstack([self.S, sprs.csc_matrix(np.zeros([len(self.model.constraints), len(vars)]))]) return vars From 8fb4c1ec918dd83970fa81b5d6b07b04ae6507c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Mon, 15 Mar 2021 18:06:10 +0000 Subject: [PATCH 14/15] [FIX] update is now False --- src/cobamp/core/linear_systems.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cobamp/core/linear_systems.py b/src/cobamp/core/linear_systems.py index 549ca02..9646a1a 100644 --- a/src/cobamp/core/linear_systems.py +++ b/src/cobamp/core/linear_systems.py @@ -368,6 +368,7 @@ def _populate_constraints_from_matrix(self, S, constraints, vars, only_nonzero=F for container, nmap in zip([vars,constraints],[var_name_map,cns_name_map])] self.model.update() + if update: if len(c_ids) > 0 and len(v_ids) > 0: self.S[c_ids[:,None],v_ids] = S @@ -406,7 +407,7 @@ def add_rows_to_model(self, S_new, b_lb, b_ub, only_nonzero=False, if update: self.S = sprs.vstack([self.S, sprs.csc_matrix(np.zeros([S_new.shape[0], len(self.model.variables)]))]).tocsc() - self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero) + self.populate_constraints_from_matrix(S_new, constraints, vars, only_nonzero, update) # self.model.update() # self.model.remove(dummy) @@ -447,7 +448,8 @@ def add_columns_to_model(self, S_new, var_names, lb, ub, var_types, only_nonzero """ vars = self.add_variables_to_model(var_names, lb, ub, var_types, update=update) - self.populate_constraints_from_matrix(S_new, self.model.constraints, vars, only_nonzero=only_nonzero) + self.populate_constraints_from_matrix(S_new, self.model.constraints, vars, only_nonzero=only_nonzero, + update=update) def add_variables_to_model(self, var_names, lb, ub, var_types, update=True): From 79a06793f9f45e0e1037920bd3ac1f2787d45670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Vieira?= Date: Thu, 6 May 2021 17:07:33 +0100 Subject: [PATCH 15/15] [FIX] getter method for stoichiometric matrix --- src/cobamp/core/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cobamp/core/models.py b/src/cobamp/core/models.py index c9a35d1..2b33ffa 100644 --- a/src/cobamp/core/models.py +++ b/src/cobamp/core/models.py @@ -242,7 +242,7 @@ def get_stoichiometric_matrix(self, rows=None, columns=None): col_index = [self.decode_index(i, 'reaction') for i in columns] if columns else None if rows and columns: - return self.__S[row_index, col_index] + return self.__S[array(row_index)[:,None], array(col_index)] elif rows: return self.__S[row_index, :] elif columns: