|
From: <ap...@us...> - 2025-11-24 06:05:26
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, master has been updated
via c380557ab485e0d5fc5b4c775216081f686214df (commit)
from bb404ea5eeb2a3bae0d3cea46708d36992124b09 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c380557ab485e0d5fc5b4c775216081f686214df
Author: Robert Dodier <rob...@so...>
Date: Sun Nov 23 21:32:21 2025 -0800
Package gentran: create test cases which output C, Fortran, and Ratfor code for a given expression.
In each case, the expected values, as calculated by Maxima, are baked
into the generated code, and the values calculated by the translated
code are compared to those.
Command lines: to generate the translated code,
$ maxima -b compare_var_translations.mac
where maxima is a recent enough (post-109691d) version.
To compile and run the code for each one,
$ gcc foomain.c -o foomain-c -lm
$ ./foomain-c
$ f77 foomain.f -o foomain-f
$ ./foomain-f
$ ratfor foomain.rat > foomain-rat.f
$ f77 foomain-rat.f -o foomain-rat
$ ./foomain-rat
with:
* gcc 9.4.0
* f77 reporting its version as "GNU Fortran (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010"
* ratfor built from https://github.com/arnoldrobbins/ratfor as of commit 419cf3
diff --git a/share/contrib/gentran/test/compare_var_translations.mac b/share/contrib/gentran/test/compare_var_translations.mac
new file mode 100644
index 000000000..2742a881b
--- /dev/null
+++ b/share/contrib/gentran/test/compare_var_translations.mac
@@ -0,0 +1,81 @@
+var:-((sqrt(m_piM^4+W^8*cost^2-W^8+4*P0^2*W^6)+((cost^2-1)*m_nuc^2+W^2*cost^2-W^2)*m_piM^4+sqrt(m_piM^2+P0^2)*(4*W^2*m_nuc*m_piM^2-4*W^2*m_nuc^3+4*W^4*m_nuc)+((2-2*cost^2)*m_nuc^4-4*W^2*cost^2*m_nuc^2-2*W^4*cost^2-2*W^4)*m_piM^2+(cost^2-1)*m_nuc^6+(W^2-W^2*cost^2)*m_nuc^4+(W^4-W^4*cost^2)*m_nuc^2+W^6*cost^2-W^6)/((cost^2-1)*m_piM^4+((2-2*cost^2)*m_nuc^2-2*W^2*cost^2-2*W^2)*m_piM^2+(cost^2-1)*m_nuc^4+(2*W^2-2*W^2*cost^2)*m_nuc^2+W^4*cost^2-W^4));
+
+/* should find that translated functions produce same results as original */
+
+freevars: listofvars (var);
+
+implicit_integer (varname) :=
+ block ([S1: charat (string (varname), 1)],
+ is (member (S1, ["i", "j", "k", "l", "m", "n", "I", "J", "K", "L", "M", "N"]) # false));
+
+make_type_decls (l) :=
+ block ([l1, l2a, l2b],
+ l1: makelist (if implicit_integer (x) then ['integer, x] else ['real, x], x, l),
+ [l2_real, l2_integer]: partition (l1, 'integer),
+ [ funmake (type, cons ('real, map (second, l2_real))),
+ funmake (type, cons ('integer, map (second, l2_integer))) ]);
+
+type_decls: cons (type (real, foo), make_type_decls (freevars));
+
+define (funmake (foo, freevars), buildq ([var, type_decls], block (splice (type_decls), return (var))));
+
+random_for (x, lower_limit, upper_limit) :=
+ if implicit_integer (x)
+ then lower_limit + random (upper_limit - lower_limit)
+ else lower_limit + random (float (upper_limit - lower_limit));
+
+random_values_for (l) := map (lambda ([x], random_for (x, 1, 4)), l);
+
+random_values_for_freevars: makelist (random_values_for (freevars), 20);
+
+foo_values: map (lambda ([l], apply (foo, l)), random_values_for_freevars);
+
+load (gentran);
+
+translated_foos: makelist (concat ('translated_foo, i), i, 1, length (random_values_for_freevars));
+original_foos: makelist (concat ('original_foo, i), i, 1, length (random_values_for_freevars));
+
+block ([gentranlang: 'fortran], gentranin ("foo-fortran.template", ["foomain.f"]));
+block ([gentranlang: 'ratfor, ratlinelen: 1000],
+ gentranin ("foo-ratfor.template", ["foomain.rat"]));
+
+/* need explicit type declarations for C, but gentranin disables type declaration output,
+ * so output boilerplate via printf to C output file instead of working with template.
+ */
+
+gentranlang: 'c;
+
+S: openw ("foomain.c");
+printf (S, "
+#include <stdio.h>
+#include <math.h>
+
+typedef float real;
+typedef int integer;
+");
+
+gentranpush (S);
+gentran (eval (fundef (foo)));
+
+printf (S, "
+int main (int argc, char** argv) {
+");
+
+for i thru length (random_values_for_freevars)
+ do (gentran (type (real, eval (translated_foos[i]), eval (original_foos[i])),
+ eval (translated_foos[i]): eval (funmake ('foo, random_values_for_freevars[i])),
+ eval (original_foos[i]): eval (foo_values[i]),
+ printf ("original foo%d = %g\\n", eval (i), eval (original_foos[i])),
+ printf ("translated foo%d = %g\\n", eval (i), eval (translated_foos[i])),
+ if eval (translated_foos[i]) = eval (original_foos[i])
+ then printf ("same\\n")
+ else printf ("DIFFERENCE = %g\\n", eval (translated_foos[i] - original_foos[i]))));
+
+printf (S, "
+ return (0);
+}
+");
+
+close (S);
+
+gentranpop (false);
diff --git a/share/contrib/gentran/test/foo-fortran.template b/share/contrib/gentran/test/foo-fortran.template
new file mode 100644
index 000000000..96885645d
--- /dev/null
+++ b/share/contrib/gentran/test/foo-fortran.template
@@ -0,0 +1,20 @@
+ program foomain
+
+<<
+ for i thru length (random_values_for_freevars)
+ do (gentran (eval (translated_foos[i]): eval (funmake ('foo, random_values_for_freevars[i]))),
+ gentran (eval (original_foos[i]): eval (foo_values[i])),
+ gentran (print ("original foo", eval (i), "=", eval (original_foos[i]))),
+ gentran (print ("translated foo", eval (i), "=", eval (translated_foos[i]))),
+ gentran (if eval (translated_foos[i]) = eval (original_foos[i])
+ then print ("same")
+ else print ("DIFFERENCE =", eval (translated_foos[i]) - eval (original_foos[i]))));
+>>
+
+ stop
+ end
+
+<<
+ gentran (eval (fundef (foo)));
+>>
+
diff --git a/share/contrib/gentran/test/foo-ratfor.template b/share/contrib/gentran/test/foo-ratfor.template
new file mode 100644
index 000000000..a8ddfb942
--- /dev/null
+++ b/share/contrib/gentran/test/foo-ratfor.template
@@ -0,0 +1,15 @@
+<<
+ gentran (eval (fundef (foo)));
+
+ for i thru length (random_values_for_freevars)
+ do (gentran (eval (translated_foos[i]): eval (funmake ('foo, random_values_for_freevars[i]))),
+ gentran (eval (original_foos[i]): eval (foo_values[i])),
+ gentran (print ("original foo", eval (i), "=", eval (original_foos[i]))),
+ gentran (print ("translated foo", eval (i), "=", eval (translated_foos[i]))),
+ gentran (if eval (translated_foos[i]) = eval (original_foos[i])
+ then print ("same")
+ else print ("DIFFERENCE =", eval (translated_foos[i]) - eval (original_foos[i]))));
+>>
+
+ stop
+ end
-----------------------------------------------------------------------
Summary of changes:
.../gentran/test/compare_var_translations.mac | 81 ++++++++++++++++++++++
share/contrib/gentran/test/foo-fortran.template | 20 ++++++
share/contrib/gentran/test/foo-ratfor.template | 15 ++++
3 files changed, 116 insertions(+)
create mode 100644 share/contrib/gentran/test/compare_var_translations.mac
create mode 100644 share/contrib/gentran/test/foo-fortran.template
create mode 100644 share/contrib/gentran/test/foo-ratfor.template
hooks/post-receive
--
Maxima CAS
|