• Main Page
  • Namespaces
  • Classes
  • Files
  • File List

/home/mark/model/software/ScrumPy/ScrumPy/Kinetic/CGen.py

00001 Preamble = """
00002 /*
00003 Automatically generated c code from ScrumPy
00004 Not recomended for human consumption !
00005 */
00006 #include<math.h>
00007 #include<stdlib.h>
00008 #include <ScampiModelBase.h>
00009 
00010 """
00011 
00012 MetNames = "MetNames"
00013 RateNames= "RateNames"
00014 ParamNames = "ParamNames"
00015 
00016 MetVals = "MetVals"
00017 DiffVals = "DiffVals"
00018 RateVals = "RateVals"
00019 ParamVals = "ParamVals"
00020 
00021 DFA_Name = "DiffFunArray"
00022 RFA_Name =  "RateFunArray"
00023 CFA_Name = "ConsFunArray"
00024 
00025 DiffFunArray =    "static double  (*  "+DFA_Name +"[])() "
00026 RateFunArray =   "static double  (*  "+RFA_Name +"[])() "
00027 ConsFunArray =  "static double  (*"  +CFA_Name + "[])() "
00028 
00029 
00030 FuncPre = "Func_"
00031 FuncPost = "(void){ return "
00032 
00033 
00034 ##def InitMD(md):
00035 ##    """ pre: md is a model descriptor
00036 ##      post: md can be used with all other functions in this module
00037 ##    """
00038 ##    cons = md.DepMets.keys()  # put dependendent metabolites at the end of the sm
00039 ##    cons.sort()
00040 ##    for con in cons:
00041 ##        md.sm.MakeLastRow(md.DepMets[con][0])
00042 ##
00043 
00044 def TypeValMap(md):
00045     """ pre: md is a model descriptor
00046       post : return a dictionary mapping ids to MetVals, ParamVals or RateVals as appropriate
00047     """
00048     tvm = {}
00049     for met in md.sm.rnames:
00050         tvm[met] = MetVals
00051     for reac in md.sm.cnames:
00052         tvm[reac] = RateVals
00053     for param in md.Params:
00054         tvm[param] = ParamVals
00055     return tvm
00056 
00057 
00058        
00059 def Str2CFun(Str, tm):
00060     """ pre: tm = TypeValMap
00061        post: returns str mapping identifiers to array values
00062     """
00063   
00064     for char in ["*", "/", "+", "-", "(", ")", ","]:
00065         Str = Str.replace(char, " "+char + " ")
00066 
00067     Str = Str.split()
00068     rv = ""
00069 
00070     for tok in Str:
00071         if tm.has_key(tok):
00072             tok = tm[tok] + "[" + tok + "]"
00073     
00074         rv += tok                       # no, leave it as it is
00075 
00076     rv += " ; } ;\n"
00077     
00078     return rv
00079 
00080 
00081 def FuncArray(Name, funcs):
00082     
00083     rv  = "\n" + Name + "={"
00084     if len(funcs) !=0:
00085         for func in funcs[:-1]:
00086             rv += func + ","
00087         rv  += funcs[-1]
00088     return rv + " } ; \n"
00089 
00090 
00091 
00092 
00093 def Quote(string):
00094     return '"' + string + '"'
00095 
00096 def VecDecls(md):
00097     nMets = str(len(md.sm))
00098     nRates = str(len(md.sm.cnames))
00099     nParams = str(len(md.Params))
00100     rv =""
00101     for vec,n  in (MetVals, nMets), (DiffVals, nMets), (RateVals,nRates), (ParamVals,nParams):
00102         rv += 'double ' + vec+'[' + n + '] ;\n'
00103  
00104     return rv
00105 
00106 def Enums(md):
00107     rv = "\n"
00108     #cons = md.ConsDic.keys()
00109     #cons.sort()
00110     enums = [md.sm.rnames, md.sm.cnames, md.Params]
00111     #if len(cons) >0:
00112     #    enums.append(cons)
00113     for enum in enums :
00114         rv += "enum { "
00115         for i in enum[:-1]:
00116             rv += i+", "
00117         rv += enum[-1] + " } ;\n"
00118     
00119     return rv
00120 
00121 def NameArrays(md):
00122     rv = ""
00123     mets = md.sm.rnames
00124     rates = md.sm.cnames
00125 
00126     for Ars in (MetNames,mets),(RateNames,rates),(ParamNames,md.Params):
00127         rv += "const char *"+ Ars[0] + "[]={"
00128         for name in Ars[1][:-1]:
00129             rv += Quote(name)+','
00130         rv += Quote(Ars[1][-1])+ "};\n\n"
00131     return rv
00132 
00133 def DiffEqns(md):
00134     
00135     funcs = []
00136     rv = ""
00137     diffdic = md.sm.Copy(float).ToDict()
00138     for met in md.sm.rnames:                  # musn't use diffdic.keys() - maintain order !
00139         func = FuncPre + met
00140         rv += "double " + func + FuncPost
00141         funcs.append(func)
00142         for reac,coeff in diffdic[met]:
00143             rv += "+" + str(coeff) + "*" + RateVals +"[" + reac +"]"
00144         rv += ";}\n"
00145         
00146     return rv + FuncArray(DiffFunArray, funcs)
00147 
00148 def RateEqns(md):
00149     rv = ""
00150     funcs = []
00151     tm = TypeValMap(md)
00152     for reac in md.sm.cnames:
00153         func = FuncPre + reac
00154         funcs.append(func)
00155         rv +=  "double " + func + FuncPost
00156         rv += Str2CFun(md.KinDic[reac], tm)
00157 
00158     return rv + FuncArray(RateFunArray, funcs)
00159         
00160 
00161 def ConsEqns(md):
00162     
00163     funcs = []
00164     rv = ""
00165     cons = md.ConsDic.keys()
00166 
00167     for con in cons:
00168         func = FuncPre + "CONS_"+con
00169         funcs.append(func)
00170         func += FuncPost
00171         rv += "double " + func + "("+ParamVals+"[" +md.conpard[con] +"]-(" 
00172         for name,val in md.ConsDic[con]:
00173             if val ==1:
00174                 rv += "+" + MetVals + "[" + name + "]"
00175             else:
00176                 rv += "+" + "(" + str(float(val)) + " * " + MetVals + "[" + name + "])"
00177 
00178         rv += " ) ); } \n\n"
00179         #rv += " ) / " + str(float(depcoeff)) + "); } \n\n"
00180 
00181     return rv + FuncArray(ConsFunArray, funcs)
00182 
00183 def Struct(md):
00184     name = md.Model.ModelName
00185     structname = "Actual_" + name
00186     rv = "ScampiModel " + structname + "={\n"
00187     rv += Quote(name)+",\n"
00188     rv += str(len(md.sm.cnames)) +",\n"
00189     
00190     for s in RateNames, RFA_Name, RateVals:
00191         rv += s + ",\n"
00192         
00193     for v in len(md.sm), len(md.ConsDic), len(md.sm) -len(md.ConsDic):
00194         rv += str(v) + ",\n"
00195         
00196     for s in MetNames, DFA_Name, CFA_Name, DiffVals,MetVals:
00197         rv += s + ",\n"
00198 
00199     lp = str(len(md.Params))
00200     for s in lp, ParamNames, ParamVals:
00201         rv += s + ",\n"
00202 
00203     rv += "&" + name +"Time,\n0,\n0\n } ;\n"
00204     rv += "ScampiModel_ptr " + name + " =&" + structname + " ;\n"
00205 
00206     return rv
00207     
00208     
00209     
00210         
00211     
00212     
00213             
00214         
00215         
00216     
00217     
00218     
00219     
00220     
00221     
00222     
00223     
00224     
00225     

Generated on Tue Sep 4 2012 15:38:01 for ScrumPy by  doxygen 1.7.1