"""
CBMPy: CBMultiCore module
=========================
PySCeS Constraint Based Modelling (http://cbmpy.sourceforge.net)
Copyright (C) 2009-2017 Brett G. Olivier, VU University Amsterdam, Amsterdam, The Netherlands
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
Author: Brett G. Olivier
Contact email: bgoli@users.sourceforge.net
Last edit: $Author: bgoli $ ($Id: CBMultiCore.py 575 2017-04-13 12:18:44Z bgoli $)
"""
# preparing for Python 3 port
from __future__ import division, print_function
from __future__ import absolute_import
#from __future__ import unicode_literals
import os, time, subprocess, itertools, shutil, numpy
try:
import pickle
except ImportError:
import cPickle as pickle
from . import CBSolver
from . import _multicorefva
MULTIFVAFILE = __file__.replace('CBMultiCore', '_multicorefva')
del _multicorefva
#try:
#from . import _multicoreenvfva
#MULTIENVFVAFILE = __file__.replace('CBMultiCore','_multicoreenvfva')
#del _multicoreenvfva
#HAVE_MULTIENV = True
#except ImportError as ex:
#print(ex)
#HAVE_MULTIENV = False
from .CBConfig import __CBCONFIG__ as __CBCONFIG__
[docs]def grouper(n, iterable, padvalue=None):
"grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
return itertools.izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
[docs]def runMultiCoreFVA(fba, selected_reactions=None, pre_opt=True, tol=None, objF2constr=True, rhs_sense='lower',\
optPercentage=100.0, work_dir=None, quiet=True, debug=False, oldlpgen=False, markupmodel=True, procs=2):
"""
Run a multicore FVA where:
- *fba* is an fba model instance
- *procs* [default=2] number of processing threads (optimum seems to be about the number of physical cores)
"""
#CBSolver.analyzeModel(fba, oldlpgen=False)
#cplx_FluxVariabilityAnalysis(fba, selected_reactions=None, pre_opt=True, tol=None, objF2constr=True, rhs_sense='lower', optPercentage=100.0, work_dir=None, quiet=True, debug=False, oldlpgen=False, markupmodel=True)
fba.FVAARGS = [selected_reactions, pre_opt, tol, objF2constr, rhs_sense, optPercentage, work_dir, True, False, False, False]
fN = str(time.time()).split('.')[0]
fba.serializeToDisk(fN, protocol=-1)
fN = os.path.abspath(fN)
subprocess.call(['python', MULTIFVAFILE, str(procs), fN])
F = file(fN, 'rb')
res = pickle.load(F)
F.close()
os.remove(fN)
fva = res[0]
fvan = res[1]
if len(fva) == 1:
fva = fva[0]
fvan = fvan[0]
elif len(fva) > 1:
fva = numpy.vstack(fva)
fvan2 = []
for n_ in fvan:
fvan2 += n_
fvan = fvan2
# print 'Reaction, Reduced Costs, Variability Min, Variability Max, abs(Max-Min), MinStatus, MaxStatus'
if markupmodel:
for R in range(len(fvan)):
REAC = fba.getReaction(fvan[R])
REAC.setValue(fva[R][0])
REAC.fva_max = fva[R][3]
REAC.fva_min = fva[R][2]
REAC.reduced_costs = fva[R][1]
return fva, fvan
#if HAVE_MULTIENV:
#def runMultiCoreMultiEnvFVA(lp, selected_reactions=None, tol=None, rhs_sense='lower', optPercentage=100.0, work_dir=None, debug=False, procs=2):
#"""
#Run a multicore FVA where:
#- *lp* is a multienvironment lp model instance
#- *procs* [default=2] number of processing threads (optimum seems to be about the number of physical cores)
#"""
#fN = os.path.join(work_dir, str(time.time()).split('.')[0])
#lp.write(fN+'.lp', filetype='lp')
#MEargs = [fN+'.lp', selected_reactions, tol, rhs_sense, optPercentage, work_dir, debug]
#print(MEargs)
#print(fN)
#F = file(fN, 'wb')
#pickle.dump(MEargs, F, protocol=-1)
#F.close()
#subprocess.call(['python', MULTIENVFVAFILE, str(procs), fN])
#F = file(fN, 'rb')
#res = pickle.load(F)
#F.close()
#os.remove(fN)
#fva = res[0]
#fvan = res[1]
#if len(fva) == 1:
#fva = fva[0]
#fvan = fvan[0]
#elif len(fva) > 1:
#fva = numpy.vstack(fva)
#fvan2 = []
#for n_ in fvan:
#fvan2 += n_
#fvan = fvan2
#return fva, fvan
#else:
#def runMultiCoreMultiEnvFVA(lp, selected_reactions=None, tol=None, rhs_sense='lower', optPercentage=100.0, work_dir=None, debug=False, procs=2):
#raise RuntimeError('\nMultiCore module not present')