]> www.ginac.de Git - ginac.git/blobdiff - ginac/power.cpp
* Added output-support for Python bindings and LaTeX printing for
[ginac.git] / ginac / power.cpp
index a5db62b78c0bf5503df15d1ed74e3feb5e4e4b25..72ec5aa368ae65c3bc8565309e379074e00d134e 100644 (file)
@@ -36,7 +36,6 @@
 #include "symbol.h"
 #include "print.h"
 #include "archive.h"
-#include "debugmsg.h"
 #include "utils.h"
 
 namespace GiNaC {
@@ -46,13 +45,10 @@ GINAC_IMPLEMENT_REGISTERED_CLASS(power, basic)
 typedef std::vector<int> intvector;
 
 //////////
-// default ctor, dtor, copy ctor assignment operator and helpers
+// default ctor, dtor, copy ctor, assignment operator and helpers
 //////////
 
-power::power() : inherited(TINFO_power)
-{
-       debugmsg("power default ctor",LOGLEVEL_CONSTRUCT);
-}
+power::power() : inherited(TINFO_power) { }
 
 void power::copy(const power & other)
 {
@@ -75,7 +71,6 @@ DEFAULT_DESTROY(power)
 
 power::power(const archive_node &n, const lst &sym_lst) : inherited(n, sym_lst)
 {
-       debugmsg("power ctor from archive_node", LOGLEVEL_CONSTRUCT);
        n.find_ex("basis", basis, sym_lst);
        n.find_ex("exponent", exponent, sym_lst);
 }
@@ -121,8 +116,6 @@ static void print_sym_pow(const print_context & c, const symbol &x, int exp)
 
 void power::print(const print_context & c, unsigned level) const
 {
-       debugmsg("power print", LOGLEVEL_PRINT);
-
        if (is_a<print_tree>(c)) {
 
                inherited::print(c, level);
@@ -166,6 +159,14 @@ void power::print(const print_context & c, unsigned level) const
                        c.s << ')';
                }
 
+       } else if (is_a<print_python_repr>(c)) {
+
+               c.s << class_name() << '(';
+               basis.print(c);
+               c.s << ',';
+               exponent.print(c);
+               c.s << ')';
+
        } else {
 
                if (exponent.is_equal(_ex1_2)) {
@@ -186,7 +187,10 @@ void power::print(const print_context & c, unsigned level) const
                                        c.s << "(";
                        }
                        basis.print(c, precedence());
-                       c.s << '^';
+                       if (is_a<print_python>(c))
+                               c.s << "**";
+                       else
+                               c.s << '^';
                        if (is_a<print_latex>(c))
                                c.s << '{';
                        exponent.print(c, precedence());
@@ -245,8 +249,10 @@ int power::degree(const ex & s) const
                        return ex_to<numeric>(exponent).to_int();
                else
                        return basis.degree(s) * ex_to<numeric>(exponent).to_int();
-       }
-       return 0;
+       } else if (basis.has(s))
+               throw(std::runtime_error("power::degree(): undefined degree because of non-integer exponent"));
+       else
+               return 0;
 }
 
 int power::ldegree(const ex & s) const 
@@ -256,8 +262,10 @@ int power::ldegree(const ex & s) const
                        return ex_to<numeric>(exponent).to_int();
                else
                        return basis.ldegree(s) * ex_to<numeric>(exponent).to_int();
-       }
-       return 0;
+       } else if (basis.has(s))
+               throw(std::runtime_error("power::ldegree(): undefined degree because of non-integer exponent"));
+       else
+               return 0;
 }
 
 ex power::coeff(const ex & s, int n) const
@@ -303,8 +311,6 @@ ex power::coeff(const ex & s, int n) const
  *  @param level cut-off in recursive evaluation */
 ex power::eval(int level) const
 {
-       debugmsg("power eval",LOGLEVEL_MEMBER_FUNCTION);
-       
        if ((level==1) && (flags & status_flags::evaluated))
                return *this;
        else if (level == -max_recursion_level)
@@ -478,8 +484,6 @@ ex power::eval(int level) const
 
 ex power::evalf(int level) const
 {
-       debugmsg("power evalf",LOGLEVEL_MEMBER_FUNCTION);
-       
        ex ebasis;
        ex eexponent;
        
@@ -490,7 +494,7 @@ ex power::evalf(int level) const
                throw(std::runtime_error("max recursion level reached"));
        } else {
                ebasis = basis.evalf(level-1);
-               if (!is_ex_exactly_of_type(exponent,numeric))
+               if (!is_exactly_a<numeric>(exponent))
                        eexponent = exponent.evalf(level-1);
                else
                        eexponent = exponent;