[GiNaC-devel] Custom power evaluation
Sheplyakov Alexei
varg at theor.jinr.ru
Fri Oct 27 18:00:53 CEST 2006
Hello,
On Fri, Oct 27, 2006 at 12:37:03PM +0100, Vladimir Kisil wrote:
> Following my previous message on the subject
> (http://www.ginac.de/pipermail/ginac-devel/2006-October/001071.html) I
> am including the full patch. Its functionality is now described in
> ginac.info.
[snipped]
While I certainly like the idea, I dislike the proposed implementation
very much. Keep on reading to find out why.
> +It is not unusual to use some objects which have special properties with
> +respect to exponentiation. For example, if a symbol @code{s} may take
> +only values @math{-1} or @math{1} then @math{s^2=1}. Other examples are
[snipped]
GiNaC offers ex::map() method for implementation of such custom
evaluation rules. Frankly, I don't understand why it is not enough...
> + at example
> + virtual ex basic::eval_power_basis(const ex & exp) const;
> + virtual ex basic::eval_power_exponent(const ex & basis) const;
> + at end example
Adding more methods to the `basic' class does not sound like good
idea to me. What if someone implements custom evaluation rules, say,
for the `mul' class? E.g. foosymbol times barfunction is always zero.
Add even more methods to basic?
[snip]
> + at example
> + your_class::info(info_flags::is_power_basis);
> + your_class::info(info_flags::is_power_exponent);
> + at end example
Likewise, I think adding even more stuff to info_flags is bad idea.
[huge snip]
> +ex basic::eval_power_basis(const ex & exp) const
> +{
> + std::cerr << "WARNING: virtual method basic::eval_power_basis is called," << std::endl
> + << " did you forget to redefine it in the derived class?" << std::endl;
> + return power(*this, exp).hold();
> +}
Spamming to std{out,err} is a MORTAL SIN. NEVER, EVER do this.
Either return the expression unevaluated or throw an exception.
> + // user defined classes may provide their own virtual methods for power evaluation
> + if (ebasis.info(info_flags::is_power_basis))
> + return ebasis.eval_power_basis(eexponent);
> +
> + if (eexponent.info(info_flags::is_power_exponent))
> + return eexponent.eval_power_exponent(ebasis);
This slows down a bit evaluation of *every* power expression, including
those which do not provide such a method. GiNaC's performance is not
exactly brilliant, why reduce it even more?
Best regards,
Alexei
--
All science is either physics or stamp collecting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
URL: <http://www.ginac.de/pipermail/ginac-devel/attachments/20061027/afc14e97/attachment.sig>
More information about the GiNaC-devel
mailing list