Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / filter.cpp
blob1b040cd50e08375f14c10133414d906d4ab79325
1 /* Remove terms that involve a given symbol or expression. For example...
3 filter(x^2 + x + 1, x) => 1
5 filter(x^2 + x + 1, x^2) => x + 1
6 */
8 #include "stdafx.h"
9 #include "defs.h"
11 void
12 eval_filter(void)
14 p1 = cdr(p1);
15 push(car(p1));
16 eval();
17 p1 = cdr(p1);
18 while (iscons(p1)) {
19 push(car(p1));
20 eval();
21 filter();
22 p1 = cdr(p1);
26 /* For example...
28 push(F)
29 push(X)
30 filter()
31 F = pop()
34 void
35 filter(void)
37 save();
38 p2 = pop();
39 p1 = pop();
40 filter_main();
41 restore();
44 void
45 filter_main(void)
47 if (car(p1) == symbol(ADD))
48 filter_sum();
49 else if (istensor(p1))
50 filter_tensor();
51 else if (find(p1, p2))
52 push_integer(0);
53 else
54 push(p1);
57 void
58 filter_sum(void)
60 push_integer(0);
61 p1 = cdr(p1);
62 while (iscons(p1)) {
63 push(car(p1));
64 push(p2);
65 filter();
66 add();
67 p1 = cdr(p1);
71 void
72 filter_tensor(void)
74 int i, n;
75 n = p1->u.tensor->nelem;
76 p3 = alloc_tensor(n);
77 p3->u.tensor->ndim = p1->u.tensor->ndim;
78 for (i = 0; i < p1->u.tensor->ndim; i++)
79 p3->u.tensor->dim[i] = p1->u.tensor->dim[i];
80 for (i = 0; i < n; i++) {
81 push(p1->u.tensor->elem[i]);
82 push(p2);
83 filter();
84 p3->u.tensor->elem[i] = pop();
86 push(p3);