changeset 159:0659e109f475 draft

Uploaded
author luca_milaz
date Wed, 03 Jul 2024 16:59:50 +0000
parents 5e913f9526be
children 8376012c51a5
files marea_2_0/flux_sampling.py
diffstat 1 files changed, 38 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/marea_2_0/flux_sampling.py	Wed Jul 03 12:04:23 2024 +0000
+++ b/marea_2_0/flux_sampling.py	Wed Jul 03 16:59:50 2024 +0000
@@ -7,8 +7,9 @@
 import numpy as np
 import pandas as pd
 import cobra
+import CBS_backend
+from joblib import Parallel, delayed, cpu_count
 from cobra.sampling import OptGPSampler
-#import CBS_backend
 #import utils.flux_analysis as flux_analysis
 import sys
 
@@ -123,10 +124,7 @@
     pass
 
 
-def CBS_sampler(model:cobra.Model, n_samples:int=1000, n_batches:int=1, seed:int=0)-> None:
-
-    if not os.path.exists(ARGS.output_folder + "CBS/" + ARGS.model_name):
-        os.makedirs(ARGS.output_folder + "CBS/" + ARGS.model_name)
+def CBS_sampler(model:cobra.Model, model_name:str, n_samples:int=1000, n_batches:int=1, seed:int=0)-> None:
 
     df_FVA = cobra.flux_analysis.flux_variability_analysis(model,fraction_of_optimum=0).round(6)
     
@@ -137,23 +135,45 @@
         try:
             CBS_backend.randomObjectiveFunctionSampling(model, n_samples, df_coefficients.iloc[:,i*n_samples:(i+1)*n_samples], samples)
         except Exception as e:
-        # solver has failed, try sampling with cobrapy
             utils.logWarning(
-            "Warning: GLPK solver has failed for " + ARGS.model_name + ". Trying with COBRA interface.",
+            "Warning: GLPK solver has failed for " + model_name + ". Trying with COBRA interface.",
             ARGS.out_log)
             CBS_backend.randomObjectiveFunctionSampling_cobrapy(model, n_samples, df_coefficients.iloc[:,i*n_samples:(i+1)*n_samples], 
                                                     samples)
-        samples.to_csv(ARGS.output_folder + "CBS/" +  ARGS.model_name + '_'+ str(i)+'.csv')
+        samples.to_csv(ARGS.output_folder + "CBS/" +  model_name + '_'+ str(i)+'.csv')
+
+    for i in range(0, n_batches):
+        samples_batch = pd.read_csv(ARGS.output_folder + "CBS/" +  model_name + '_'+ str(i)+'.csv')
+        samplesTotal = pd.concat([samplesTotal, samples_batch], ignore_index = True)
+
+    write_to_file(samplesTotal, ARGS.output_folder + model_name)
 
     for i in range(0, n_batches):
-        samples_batch = pd.read_csv(ARGS.output_folder + "CBS/" +  ARGS.model_name + '_'+ str(i)+'.csv')
-        samplesTotal = pd.concat([samplesTotal, samples_batch], ignore_index = True)
-    write_to_file(samplesTotal, ARGS.output_folder + "CBS/" + ARGS.model_name)
-    for i in range(0, n_batches):
-        os.remove(ARGS.output_folder + "CBS/" +  ARGS.model_name + '_'+ str(i)+'.csv')
+        os.remove(ARGS.output_folder + "CBS/" +  model_name + '_'+ str(i)+'.csv')
     pass
 
 
+def model_sampler(model_input:str, model_name:str)->None:
+
+    model = load_custom_model(
+        utils.FilePath.fromStrPath(model_input), utils.FilePath.fromStrPath(model_name).ext)
+    
+    utils.logWarning(
+        "Sampling model: " + model_name,
+        ARGS.out_log)
+    
+    name = model_name.split('.')[0]
+    
+    if ARGS.sampling_algorithm == 'OPTGP':
+        OPTGP_sampler(model, name, ARGS.n_samples, ARGS.thinning, ARGS.n_batches, ARGS.seed)
+
+    elif ARGS.sampling_algorithm == 'CBS':
+        CBS_sampler(model,  name, ARGS.n_samples, ARGS.n_batches, ARGS.seed)
+    
+    pass
+
+
+
 ################################- INPUT DATA LOADING -################################
 def load_custom_model(file_path :utils.FilePath, ext :Optional[utils.FileFormat] = None) -> cobra.Model:
     """
@@ -192,13 +212,13 @@
     if not os.path.exists('flux_sampling'):
         os.makedirs('flux_sampling')
 
-    
+    num_processors = cpu_count()
+
     global ARGS
     ARGS = process_args(sys.argv)
 
     ARGS.output_folder = 'flux_sampling'
 
-
     utils.logWarning(
         ARGS.input,
         ARGS.out_log)
@@ -206,38 +226,11 @@
     utils.logWarning(
         ARGS.name,
         ARGS.out_log)
-
-
-    # load custom model
-    #model1 = load_custom_model(utils.FilePath.fromStrPath(ARGS.inputs), "xml")
-
-    model = load_custom_model(
-        utils.FilePath.fromStrPath(ARGS.input.split(",")[0]), utils.FilePath.fromStrPath(ARGS.name.split(",")[0]).ext)
     
-    model = load_custom_model(
-        utils.FilePath.fromStrPath(ARGS.input.split(",")[1]), utils.FilePath.fromStrPath(ARGS.name.split(",")[1]).ext)
-
-    
+    models_input = ARGS.input.split(",")
+    models_name = ARGS.name.split(",")
 
-    a = pd.DataFrame(columns=["a"])
-    a.loc[0] = ["sss"]
-    a.to_csv(ARGS.output_folder+"/test1.csv")
-
-    a = pd.DataFrame(columns=["a"])
-    a.loc[0] = ["sss"]
-    a.to_csv(ARGS.output_folder+"/test2.csv")
-
-
-    '''
-    
-    if ARGS.sampling_algorithm == 'OPTGP':
-        OPTGP_sampler(model, ARGS.model_name, ARGS.n_samples, ARGS.thinning, ARGS.n_batches, ARGS.seed, ARGS.out_dir)
-
-    elif ARGS.sampling_algorithm == 'CBS':
-        CBS_sampler(model, ARGS.model_name, ARGS.n_samples, ARGS.n_batches, ARGS.seed, ARGS.out_dir)
-    else:
-        raise utils.ValueErr(ARGS.sampling_algorithm,
-        f"Algorithm \"{ARGS.sampling_algorithm}\" is not recognized, only OPTGP and CBS are supported.")'''
+    Parallel(n_jobs=num_processors)(delayed(model_sampler)(model_input, model_name) for model_input, model_name in zip(models_input, models_name))
         
 ##############################################################################
 if __name__ == "__main__":