Source code for efmlrs.preprocessing.compressions.echelon
from efmlrs.util.log import *
from efmlrs.util.data import *
[docs]def find_redundant_metabolites(smatrix, inner_counter):
"""
Calculates the reduced row echelon form of the stoichiometric matrix. Finds metabolites that are redundant due to
conservation relations.
:param smatrix: sympy matrix that contains the stoichiometric matrix
:param int inner_counter: integer that counts iterative steps of nullspace compression
:return: list redundant_metas: list of metabolites to be removed
"""
print("Start reduced row echelon form calculations", str(inner_counter), ". This may take a while")
echelon = smatrix.T.rref(simplify=True, pivots=False)
columns = echelon.shape[1]
rows = echelon.shape[0]
redundant_metas = []
j = 0
for i in range(0, rows):
row = echelon.row(i)
while j < columns and row[j] != 1:
redundant_metas.append(j)
j += 1
j += 1
return redundant_metas
[docs]def remove_redundant_metabolites(smatrix, metabolites, redundant_metas):
"""
Removes redundant metabolites from stoichiometric matrix and from list of metabolite names. Writes compression
information to log file. (https://academic.oup.com/bioinformatics/article/24/19/2229/246674)
:param smatrix: sympy matrix that contains the stoichiometric matrix
:param list metabolites: list of metabolite names
:param list redundant_metas: list of metabolites to be removed
:return:
- smatrix - sympy matrix reduced stoichiometric matrix
- metabolites - list of reduced metabolite names
"""
for i in reversed(redundant_metas):
log_delete_meta(metabolites[i])
del (metabolites[i])
smatrix.row_del(i)
return smatrix, metabolites
[docs]def run(smatrix, metabolites):
"""
Entry point for echelon compression. Iteratively finds inconsistencies due to conservation relations of metabolites
in the reduced row echelon form of the stoichiometric matrix and removes them.
:param smatrix: sympy matrix that contains the stoichiometric matrix
:param list metabolites: list of metabolite names
:return:
- smatrix - sympy matrix reduced stoichiometric matrix
- metabolites - list of reduced metabolite names
"""
log_module()
inner_counter = 1
while 1:
redundant_metas = find_redundant_metabolites(smatrix, inner_counter)
if len(redundant_metas) == 0:
break
smatrix, metabolites = remove_redundant_metabolites(smatrix, metabolites, redundant_metas)
inner_counter += 1
return smatrix, metabolites