def update(self, value_dict): """update matrix without propagating to model""" if len(value_dict) < 100: # TODO benchmark for heuristic for index, value in iteritems(value_dict): lil_matrix.__setitem__(self, index, value) else: matrix = lil_matrix.todok(self) matrix.update(value_dict) self = SMatrix_lil(matrix.tolil(), model=self._model) self._model._S = self
def __setitem__(self, index, value): lil_matrix.__setitem__(self, index, value) if isinstance(index[0], int): metabolites = [self._model.metabolites[index[0]]] else: metabolites = self._model.metabolites[index[0]] if isinstance(index[1], int): reactions = [self._model.reactions[index[1]]] else: reactions = self._model.reactions[index[1]] if value == 0: # remove_metabolites met_set = set(metabolites) for reaction in reactions: to_remove = met_set.intersection(reaction._metabolites) for i in to_remove: reaction.pop(i) else: # add metabolites met_dict = {met: value for met in metabolites} for reaction in reactions: reaction.add_metabolites(met_dict, combine=False)