chiark / gitweb /
symbolic.py: more ccode wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 18 Nov 2017 18:36:40 +0000 (18:36 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 18 Nov 2017 18:36:40 +0000 (18:36 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
symbolic.py

index e44846eda32231448a75212d992cde586fdeb8ae..bbcef81c51a13ee561e8f27645a7a179b4d9ccc9 100755 (executable)
@@ -153,25 +153,41 @@ dbg('result_dirnscaled')
 
 params = ('sh','th','la','mu','gamma','kappa')
 
+def cprint(s):
+  print(s)
+
+def cassign(v, assign_to, tmp_prefix):
+  sym_iter = map((lambda i: symbols('%s%d' % (tmp_prefix,i))),
+                 itertools.count())
+  (defs, vs) = cse(v, symbols=sym_iter)
+  for defname, defval in defs:
+    cprint(ccode(defval, assign_to=defname))
+    v = vs[0]
+  if isinstance(v,Matrix) and v.cols > 1:
+    for ix in range(0, v.cols):
+      cprint(ccode(v.col(ix), '%s[%d]' % (assign_to, ix)))
+  else:
+    cprint(ccode(v, assign_to=assign_to))
+  
+
 def gen_diff(current, smalls):
+  global j
   if not smalls:
+    j = zeros(len(params),0)
     for param in params:
       global d
       paramv = eval(param)
       d = diff(current, paramv)
       dbg('d')
-      print(ccode(d, assign_to='FOO'))
-      (defs, v) = cse(d, symbols=map((lambda i: symbols('tmp%d' % i)),
-                                     itertools.count()))
-      for vn, val in defs:
-        print(ccode(val, assign_to=vn))
-      print(ccode(v[0], assign_to='BAR'))
+      j = j.row_join(d)
+    dbg('j')
+    cassign((j,), 'j', 'jtmp')
   else:
     small = smalls[0]
     smalls = smalls[1:]
-    print('if ',small,' nonsmall {')
+    cprint('if (!is_small(' + ccode(small) + ')) {')
     gen_diff(current, smalls)
-    print('} else { /* %s small */' % small)
+    cprint('} else { /* %s small */' % small)
     gen_diff(current.replace(
       sinc(small),
       1 - small*small/factorial(3) - small**4/factorial(5),