chiark / gitweb /
symbolic.py: prep for actual output
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 18 Nov 2017 18:03:53 +0000 (18:03 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 18 Nov 2017 18:03:53 +0000 (18:03 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
symbolic.py

index c034b3746f681f95918c697d050874f17ebf9c1b..e44846eda32231448a75212d992cde586fdeb8ae 100755 (executable)
@@ -151,26 +151,36 @@ q_dirn_dirnscaled = q_dirn_sqparm * gamma
 result_dirnscaled = q_sqparm.col_join(q_dirn_dirnscaled)
 dbg('result_dirnscaled')
 
-for sm_sh in ((), (sh*sh*la,)):
-  for sm_th in ((), (th*th*la,)):
-    smalls = sm_sh + sm_th
-    result_fordiff = result_dirnscaled
-    for small in smalls:
-      result_fordiff = result_fordiff.replace(
-        sinc(small),
-        1 - small*small/factorial(3) - small**4/factorial(5)
-      )
-    print(smalls)
-    dbg('result_fordiff');
-    for v in 'sh','th','la','mu','gamma','kappa':
-      dbg('diff(result_fordiff,%s)' % v)
-      d = diff(result_fordiff,eval(v))
+params = ('sh','th','la','mu','gamma','kappa')
+
+def gen_diff(current, smalls):
+  if not smalls:
+    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'))
+  else:
+    small = smalls[0]
+    smalls = smalls[1:]
+    print('if ',small,' nonsmall {')
+    gen_diff(current, smalls)
+    print('} else { /* %s small */' % small)
+    gen_diff(current.replace(
+      sinc(small),
+      1 - small*small/factorial(3) - small**4/factorial(5),
+      ),
+      smalls
+    )
+    print('} /* %s small */' % small)
+
+gen_diff(result_dirnscaled, (sh*sh*la, th*th*la))
 
 #bad = q_orgcoords[0]
 #badd = diff(bad, la)