#include "symbol.h"
#include "print.h"
#include "archive.h"
-#include "debugmsg.h"
#include "utils.h"
namespace GiNaC {
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)
{
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);
}
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);
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)) {
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());
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
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
* @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)
ex power::evalf(int level) const
{
- debugmsg("power evalf",LOGLEVEL_MEMBER_FUNCTION);
-
ex ebasis;
ex eexponent;
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;