]> www.ginac.de Git - ginac.git/blobdiff - ginac/relational.cpp
- added print_latex() and print_csrc()
[ginac.git] / ginac / relational.cpp
index 69363765c3ffb8b2b0821b29f5ac8d3a28d7ee33..bd3b64421f75c6f1244c002a36e64b1619d7e6b9 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of relations between expressions */
 
 /*
- *  GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -95,9 +95,17 @@ void relational::print(const print_context & c, unsigned level) const
 
        } else {
 
-               if (precedence() <= level)
-                       c.s << "(";
-               lh.print(c, precedence());
+               if (is_a<print_python_repr>(c)) {
+                       c.s << class_name() << '(';
+                       lh.print(c);
+                       c.s << ',';
+                       rh.print(c);
+                       c.s << ",'";
+               } else {
+                       if (precedence() <= level)
+                               c.s << "(";
+                       lh.print(c, precedence());
+               }
                switch (o) {
                        case equal:
                                c.s << "==";
@@ -120,9 +128,13 @@ void relational::print(const print_context & c, unsigned level) const
                        default:
                                c.s << "(INVALID RELATIONAL OPERATOR)";
                }
-               rh.print(c, precedence());
-               if (precedence() <= level)
-                       c.s << ")";
+               if (is_a<print_python_repr>(c))
+                       c.s << "')";
+               else {
+                       rh.print(c, precedence());
+                       if (precedence() <= level)
+                               c.s << ")";
+               }
        }
 }
 
@@ -171,6 +183,17 @@ ex relational::eval(int level) const
        return (new relational(lh.eval(level-1),rh.eval(level-1),o))->setflag(status_flags::dynallocated | status_flags::evaluated);
 }
 
+ex relational::subs(const lst & ls, const lst & lr, bool no_pattern) const
+{
+       const ex & subsed_lh = lh.subs(ls, lr, no_pattern);
+       const ex & subsed_rh = rh.subs(ls, lr, no_pattern);
+
+       if (!are_ex_trivially_equal(lh, subsed_lh) || !are_ex_trivially_equal(rh, subsed_rh))
+               return relational(subsed_lh, subsed_rh, o).basic::subs(ls, lr, no_pattern);
+       else
+               return basic::subs(ls, lr, no_pattern);
+}
+
 ex relational::simplify_ncmul(const exvector & v) const
 {
        return lh.simplify_ncmul(v);
@@ -273,39 +296,6 @@ unsigned relational::calchash(void) const
        return v;
 }
 
-bool relational::is_equal_same_type(const basic & other) const
-{
-       GINAC_ASSERT(is_a<relational>(other));
-       const relational &oth = static_cast<const relational &>(other);
-       if (o==oth.o && lh.is_equal(oth.lh) && rh.is_equal(oth.rh))
-               return true;
-       switch (o) {
-               case equal:
-               case not_equal:
-                       if (oth.o!=o)
-                               return false;
-                       break;
-               case less:
-                       if (oth.o!=greater)
-                               return false;
-                       break;
-               case less_or_equal:
-                       if (oth.o!=greater_or_equal)
-                               return false;
-                       break;
-               case greater:
-                       if (oth.o!=less)
-                               return false;
-                       break;
-               case greater_or_equal:
-                       if (oth.o!=less_or_equal)
-                               return false;
-                       break;
-       }
-       return lh.is_equal(oth.rh) && rh.is_equal(oth.lh);
-}
-
-
 //////////
 // new virtual functions which can be overridden by derived classes
 //////////