filter.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* Remove terms that involve a given symbol or expression. For example...
  2. filter(x^2 + x + 1, x) => 1
  3. filter(x^2 + x + 1, x^2) => x + 1
  4. */
  5. #include "stdafx.h"
  6. #include "defs.h"
  7. void
  8. eval_filter(void)
  9. {
  10. p1 = cdr(p1);
  11. push(car(p1));
  12. eval();
  13. p1 = cdr(p1);
  14. while (iscons(p1)) {
  15. push(car(p1));
  16. eval();
  17. filter();
  18. p1 = cdr(p1);
  19. }
  20. }
  21. /* For example...
  22. push(F)
  23. push(X)
  24. filter()
  25. F = pop()
  26. */
  27. void
  28. filter(void)
  29. {
  30. save();
  31. p2 = pop();
  32. p1 = pop();
  33. filter_main();
  34. restore();
  35. }
  36. void
  37. filter_main(void)
  38. {
  39. if (car(p1) == symbol(ADD))
  40. filter_sum();
  41. else if (istensor(p1))
  42. filter_tensor();
  43. else if (find(p1, p2))
  44. push_integer(0);
  45. else
  46. push(p1);
  47. }
  48. void
  49. filter_sum(void)
  50. {
  51. push_integer(0);
  52. p1 = cdr(p1);
  53. while (iscons(p1)) {
  54. push(car(p1));
  55. push(p2);
  56. filter();
  57. add();
  58. p1 = cdr(p1);
  59. }
  60. }
  61. void
  62. filter_tensor(void)
  63. {
  64. int i, n;
  65. n = p1->u.tensor->nelem;
  66. p3 = alloc_tensor(n);
  67. p3->u.tensor->ndim = p1->u.tensor->ndim;
  68. for (i = 0; i < p1->u.tensor->ndim; i++)
  69. p3->u.tensor->dim[i] = p1->u.tensor->dim[i];
  70. for (i = 0; i < n; i++) {
  71. push(p1->u.tensor->elem[i]);
  72. push(p2);
  73. filter();
  74. p3->u.tensor->elem[i] = pop();
  75. }
  76. push(p3);
  77. }