[GiNaC-devel] remove_dirac_ONE() and documentation patches
Vladimir V. Kisil
kisilv at maths.leeds.ac.uk
Wed Jun 5 21:51:10 CEST 2019
Dear All,
I finally managed to check Alexey's proposition to wrap the
throwing remove_dirac_ONE function. It indeed prevents my Windows app
from crashing. Thus I attach the respective light-weighted patches.
Best wishes,
Vladimir
--
Vladimir V. Kisil http://www.maths.leeds.ac.uk/~kisilv/
Book: Geometry of Mobius Transformations http://goo.gl/EaG2Vu
Software: Geometry of cycles http://moebinv.sourceforge.net/
>>>>> On Thu, 23 May 2019 15:32:12 +0400, Alexey Sheplyakov <asheplyakov at YANDEX.ru> said:
ASh> Hi,
ASh> 23.05.2019, 10:44, "Vladimir V. Kisil"
ASh> <kisilv at maths.leeds.ac.uk>:
>> Dear Alexey,
>>
>> I am attaching another iteration of the patch as
>> suggested. The exception-free method is used internally for a
>> better protection.
ASh> Firstly making two almost identical copies of remove_dirac_ONE
ASh> is definitely a bad idea. Two possible approaches are:
ASh> a) wrap exception-throwing remove_dirac_ONE like this
ASh> ex remove_dirac_ONE(const ex& e, bool& success, unsigned char
ASh> rl, unsigned options) { ex ret; try {
ASh> ret = remove_dirac_ONE(e, rl, options); }
ASh> catch (...) { success = false;
ASh> ret = _ex0; } return ret; }
ASh> This way exceptions will propagate within ginac.dll itself
ASh> only, and there's no code duplication.
ASh> b) alternatively one could move the actual computation to
ASh> non-throwing variant of remove_dirac_ONE, and make a wrapper
ASh> which does throw exceptions:
ASh> ex remove_dirac_ONE(const ex& e, unsigned char rl, unsigned
ASh> options) { bool success = true; ex ret =
ASh> remove_dirac_ONE(e, success, rl, options); if (!success) {
ASh> // perhaps non-throwing variant should set an integer
ASh> status instead of a bool flag, so a more specific exception can
ASh> be thrown throw std::runtime_error("some meaningful
ASh> error message here"); } return ret; }
ASh> Secondly I don't quite get what's the point of replacing the
ASh> throwing variant of remove_dirac_ONE, and throwing the very
ASh> same exception manually:
>> + bool success; + if (! ex_to<idx>(mu).is_dim_numeric())
>> throw(std::invalid_argument("clifford_to_lst(): index should have
>> a numeric dimension")); unsigned int D =
>> ex_to<numeric>(ex_to<idx>(mu).get_dim()).to_int(); @@ -1341,7
>> +1399,9 @@ lst clifford_to_lst(const ex & e, const ex & c, bool
>> algebraic) || (! is_a<numeric>(pow(c.subs(mu == i,
>> subs_options::no_pattern), 2)))) algebraic = false; lst V; - ex
>> v0 =
>> remove_dirac_ONE(canonicalize_clifford(e+clifford_prime(e)))/2; +
>> ex v0 =
>> remove_dirac_ONE(canonicalize_clifford(e+clifford_prime(e)),
>> success)/2; + if (!success) +
>> throw(std::invalid_argument("clifford_to_lst(): the argument is
>> not a Clifford vector"));
ASh> I.e. why can't we keep calling
ASh> ex v0 =
ASh> remove_dirac_ONE(canonicalize_clifford(e+clifford_prime(e)))/2;
ASh> and have remove_dirac_ONE throw an appropriate exception?
>> Previously remote_dirac_ONE() reported that an expression is not
>> a Clifford scalar by throwing an exception. This produced
>> crashes in Qt applications on Windows.
ASh> Not really. Throwing exceptions across shared libraries (DLLs)
ASh> on Windows is a little bit tricky, but it's certainly possible.
ASh> The crucial point is to make all DLLs use the same C++ runtime
ASh> (which implies the C++ runtime should be linked dynamically
ASh> into all DLLs linked into the application).
ASh> Also patching just remove_dirac_ONE is sort of pointless, since
ASh> most GiNaC methods and functions throw exceptions too.
ASh> Best regards, Alexey
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Suggest-ios-binary-flag-for-archiving-files.patch
Type: text/x-diff
Size: 1429 bytes
Desc: Archiving doc
URL: <http://www.ginac.de/pipermail/ginac-devel/attachments/20190605/2e03c207/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-Additional-examples-on-number-conversions.patch
Type: text/x-diff
Size: 1209 bytes
Desc: Number conversions
URL: <http://www.ginac.de/pipermail/ginac-devel/attachments/20190605/2e03c207/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0003-Modify-remove_dirac_ONE-to-eliminate-exceptions.patch
Type: text/x-diff
Size: 6947 bytes
Desc: remove_dirac_ONE
URL: <http://www.ginac.de/pipermail/ginac-devel/attachments/20190605/2e03c207/attachment-0002.bin>
More information about the GiNaC-devel
mailing list