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
00035
00036
00037
00038
00039
00040
00041
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
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
00109
00110 enums = [md.sm.rnames, md.sm.cnames, md.Params]
00111
00112
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:
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
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