]> www.ginac.de Git - ginac.git/log
14 years agosymmetry::calchash(): be careful to not dereference past-the-end iterator.
Alexei Sheplyakov [Sat, 8 Aug 2009 10:07:14 +0000 (13:07 +0300)]
symmetry::calchash(): be careful to not dereference past-the-end iterator.
(cherry picked from commit 526825bcee294cb20e37d8db6d5040ba0f8c428f)

14 years agocheck_parameter_G: fix pontential increment of end().
Alexei Sheplyakov [Sat, 8 Aug 2009 10:06:36 +0000 (13:06 +0300)]
check_parameter_G: fix pontential increment of end().

Incrementing past-the-end iterator is not permitted by the standard, see
(cherry picked from commit 49a44f7d55ec0d6686d3c32c7081a07d10c93274)

14 years agoG_eval: fix incorrect use of STL iterator.
Alexei Sheplyakov [Sat, 8 Aug 2009 10:02:47 +0000 (13:02 +0300)]
G_eval: fix incorrect use of STL iterator.

According to [lib.bidirectional.iterators] it's not OK to decrement
an iterator pointing to the beginning of the sequence. Fortunately random
access iterators provided by (current versions of) gcc/libstdc++ don't have
this silly limitation, so the code which works with pointers works with
iterators without any changes at all. However,
 - there's no guarantee that the current behavior won't change in the future
 - some non-GNU compilers are not that smart (i.e. the program segfaults
   upon when decrementing beginning-of-the-sequence iterator).
(cherry picked from commit dda45abd8a2c408f8b3eb7959a10dfb2468ecc3a)

14 years agoFix the compliation error *for real* ... and restore performance
Alexei Sheplyakov [Sat, 8 Aug 2009 08:43:12 +0000 (11:43 +0300)]
Fix the compliation error *for real* ... and restore performance

Commit 8bf0597dde55e4c94a2ff39f1d8130902e3d7a9b (titled as 'Fixed the parser
such that it can read in user defined classes again.') made the parser a bit
slower, especially if the input contains many terms of user-defined type.
The reason for that is quite simple: we throw and catch an exception every
time we construct an object of user-defined type:

       // dirty hack to distinguish between serial numbers of functions and real
       // pointers.
       GiNaC::function* f = NULL;
       try {
               unsigned serial = (unsigned)(unsigned long)(void *)(reader->second);
               f = new GiNaC::function(serial, args);
       catch ( std::runtime_error ) {
               if ( f ) delete f;
               ex ret = reader->second(args);
               return ret;

Fortunately functions are aligned and we can use much more efficient
technique to distinguish between serial and pointers to functions.

14 years agoFix the compliation error *for real*
Alexei Sheplyakov [Fri, 7 Aug 2009 20:22:18 +0000 (23:22 +0300)]
Fix the compliation error *for real*

14 years agoFixed memory leak.
Jens Vollinga [Fri, 31 Jul 2009 15:54:16 +0000 (17:54 +0200)]
Fixed memory leak.

14 years agoFixed the fix in commit f059ebe117d15292e0d262e6e8e232e835c7e33c.
Jens Vollinga [Fri, 31 Jul 2009 13:29:17 +0000 (15:29 +0200)]
Fixed the fix in commit f059ebe117d15292e0d262e6e8e232e835c7e33c.

14 years agoFixed dirty hack in parser to distinguish between serial numbers and pointers.
Jens Vollinga [Fri, 31 Jul 2009 12:41:08 +0000 (14:41 +0200)]
Fixed dirty hack in parser to distinguish between serial numbers and pointers.

14 years agoFixed the parser such that it can read in user defined classes again.
Jens Vollinga [Fri, 31 Jul 2009 10:48:58 +0000 (12:48 +0200)]
Fixed the parser such that it can read in user defined classes again.
Fixed default reader to parse also pow, sqrt and power.

14 years agoFixed cast that caused compile error on 64bit machines.
Jens Vollinga [Fri, 31 Jul 2009 09:14:01 +0000 (11:14 +0200)]
Fixed cast that caused compile error on 64bit machines.

14 years agoPreparing for release 1.5.3. release_1-5-3
Jens Vollinga [Thu, 30 Jul 2009 17:04:32 +0000 (19:04 +0200)]
Preparing for release 1.5.3.

14 years agoAllow underscores in identifiers.
Jens Vollinga [Wed, 15 Jul 2009 03:19:07 +0000 (05:19 +0200)]
Allow underscores in identifiers.
(cherry picked from commit 619879b5bd86a99334affe1f05d17616cc2c1898)

14 years agoAllow user defined functions to be parsed.
Jens Vollinga [Wed, 15 Jul 2009 06:26:33 +0000 (08:26 +0200)]
Allow user defined functions to be parsed.

This patch is an ugly hack that does the same as the commit
but without changing the ABI (so it can be used in ginac_1-5).

14 years agoPreparing for release 1.5.2. release_1-5-2
Jens Vollinga [Fri, 10 Jul 2009 13:21:09 +0000 (15:21 +0200)]
Preparing for release 1.5.2.

14 years agoFixed manual to correctly explain return_type_tinfo().
Jens Vollinga [Fri, 10 Jul 2009 07:54:09 +0000 (09:54 +0200)]
Fixed manual to correctly explain return_type_tinfo().
(cherry picked from commit feed241b95f7dbd6294795b4afc2bcae41880c31)

14 years agoRaised required version of CLN to 1.2.2.
Jens Vollinga [Wed, 10 Jun 2009 09:28:34 +0000 (11:28 +0200)]
Raised required version of CLN to 1.2.2.

14 years agoAdded include for cstdio header.
Jens Vollinga [Fri, 24 Apr 2009 21:37:44 +0000 (23:37 +0200)]
Added include for cstdio header.
gcc 4.0 does not include cstdio as part of other headers like string
anymore. As a result, gcc 4.0 complained about EOF being undefined.

14 years agoRepairing the preparing of the release. release_1-5-1
Jens Vollinga [Wed, 25 Feb 2009 14:03:38 +0000 (15:03 +0100)]
Repairing the preparing of the release.

14 years agoPreparing for release.
Jens Vollinga [Wed, 25 Feb 2009 12:07:18 +0000 (13:07 +0100)]
Preparing for release.

14 years agocalchash(): work around broken RTTI.
Alexei Sheplyakov [Mon, 23 Feb 2009 12:08:42 +0000 (14:08 +0200)]
calchash(): work around broken RTTI.

Due to the strange (although permitted by the standard) behaviour of C++
RTTI on woe32 calchash() returns different hash values for equal objects.
As a result automatic evaluation gets spectacularly broken:

examining clifford objects.....({1+t,2+x,3+y,4+z}) - ({1+t,2+x,3+y,4+z}) erroneously returned -{1+t,2+x,3+y,4+z}+{1+t,2+x,3+y,4+z} instead of 0
({1+t,2+x,3+y,4+z}) - ({1+t,2+x,3+y,4+z}) erroneously returned -{1+t,2+x,3+y,4+z}+{1+t,2+x,3+y,4+z} instead of 0
.({1+t,2+x,3+y,4+z}) - ({1+t,2+x,3+y,4+z}) erroneously returned -{1+t,2+x,3+y,4+z}+{1+t,2+x,3+y,4+z} instead of 0
({1+t,2+x,3+y,4+z}) - ({1+t,2+x,3+y,4+z}) erroneously returned {1+t,2+x,3+y,4+z}-{1+t,2+x,3+y,4+z} instead of 0
.......FAIL: exam_clifford.exe

This patch works around `features' of woe32 RTTI, so calchash() works

14 years agoFix compilation failure due to (template) operator- defined in factor.cpp
Alexei Sheplyakov [Mon, 23 Feb 2009 12:03:16 +0000 (14:03 +0200)]
Fix compilation failure due to (template) operator- defined in factor.cpp

GiNaC 1.5.0 fails to compile with g++ 3.4.
The fix is simple: declare (and define) operator- (and operator+) only
for (univariate) polynomials.

14 years agoUnivariate GCD timing: use sr_gcd when appropriate. release_1-5-0
Alexei Sheplyakov [Mon, 16 Feb 2009 14:23:16 +0000 (16:23 +0200)]
Univariate GCD timing: use sr_gcd when appropriate.

The benchmark consists of two parts:
1) timing of different GCD calculation methods (i.e. subresultant PRS,
   heuristic, chinese remaindering).
2) timing of different implementations of the same method. The purpose
   is to find out how (in)efficient GiNaC::ex is as a representation
   of (univariate) polynomials (as a side note, the result is a bit
   depressing -- using coefficient vector instead of GiNaC:ex makes
   GCD calculation 50x -- 1000x faster).

Now GiNaC uses modular (chinese remaindering) GCD by default, so part 2)
got broken, i.e. instead of (intended) timings

a) (heuristic, GiNaC::ex) versus (heuristic, coefficient vector)
b) (PRS, GiNaC::ex) versus (PRS, coefficient vector)

one gets

a') (heuristic, GiNaC::ex) versus (heuristic, coefficient vector)
b') (chinese remaindering, GiNaC::ex) versus (PRS, coefficient vector)

Set the gcd_options::use_sr_gcd to restore the meaning of the benchmark.

Note: this patch does not affect the library proper.

14 years agoPolished NEWS a little bit.
Alexei Sheplyakov [Mon, 16 Feb 2009 14:24:15 +0000 (16:24 +0200)]
Polished NEWS a little bit.

14 years agoAdded release date.
Jens Vollinga [Tue, 17 Feb 2009 13:38:17 +0000 (14:38 +0100)]
Added release date.

14 years agoAdjusted NEWS and INSTALL documentation.
Jens Vollinga [Fri, 6 Feb 2009 15:49:47 +0000 (16:49 +0100)]
Adjusted NEWS and INSTALL documentation.

14 years agoMissed to change one date in function.pl.
Jens Vollinga [Fri, 6 Feb 2009 15:35:22 +0000 (16:35 +0100)]
Missed to change one date in function.pl.

14 years agoChanged name of debugging macro (to avoid warning cause by multiple definition).
Jens Vollinga [Fri, 6 Feb 2009 15:24:58 +0000 (16:24 +0100)]
Changed name of debugging macro (to avoid warning cause by multiple definition).

14 years agoFixed returning of test result (++result was +result).
Jens Vollinga [Fri, 6 Feb 2009 15:22:58 +0000 (16:22 +0100)]
Fixed returning of test result (++result was +result).

14 years agoPrettified source code.
Jens Vollinga [Fri, 6 Feb 2009 15:07:10 +0000 (16:07 +0100)]
Prettified source code.

- Added copyright and GPL licencing to new files.
- Increased year to 2009.
- Changed guarding macros in header to uniform pattern without leading or
  trailing __ (double underscores).
- Put includes of system wide header consistently below own includes (help
  a tiny bit to clarify dependencies).

14 years agoFix chinese_remainder() so modular GCD actually works.
Alexei Sheplyakov [Fri, 6 Feb 2009 06:57:32 +0000 (08:57 +0200)]
Fix chinese_remainder() so modular GCD actually works.

14 years agoAutomake now needs to be version >=1.8. Older versions like 1.7.9 do not create
Jens Vollinga [Fri, 6 Feb 2009 12:13:06 +0000 (13:13 +0100)]
Automake now needs to be version >=1.8. Older versions like 1.7.9 do not create
the directory m4 in a VPATH build.

14 years agoRenamed files *.tcc and *.hpp to *.h.
Jens Vollinga [Thu, 5 Feb 2009 09:54:21 +0000 (10:54 +0100)]
Renamed files *.tcc and *.hpp to *.h.

14 years agoFixed compile errors introduced in previous commit
Jens Vollinga [Tue, 3 Feb 2009 12:50:33 +0000 (13:50 +0100)]
Fixed compile errors introduced in previous commit

14 years agoImplement modular multivariate GCD (based on chinese remaindering algorithm).
Alexei Sheplyakov [Mon, 19 Jan 2009 06:45:38 +0000 (08:45 +0200)]
Implement modular multivariate GCD (based on chinese remaindering algorithm).

Both algorithm and implementation are a bit inefficient:

* algorithm does not make use of sparseness of inputs (and most of
  multivariate polynomials are quite sparse)
* GiNaC's expressions are essentially immutable. Thus some simple
  operations (i.e. multiplying a polynomial by an element of the base ring)
  are prohibitively expensive.
* All numbers (i.e. GiNaC::numeric objects) are heap allocated.

Still it's much faster (~5x on bivariate polynomials, ~100x on 3-variate
ones) than (subresultant) PRS algorithm, so gcd() uses modular algorithm
by default.

14 years agoImprove (fix?) smod: now it really converts into symmetric representation...
Alexei Sheplyakov [Mon, 19 Jan 2009 06:44:36 +0000 (08:44 +0200)]
Improve (fix?) smod: now it really converts into symmetric representation...

... instead of clumsy convention inspirited by some proprietary CAS.

14 years agoFix copy-paste error in GINACLIB_MICRO_VERSION.
Alexei Sheplyakov [Mon, 19 Jan 2009 06:43:50 +0000 (08:43 +0200)]
Fix copy-paste error in GINACLIB_MICRO_VERSION.

14 years agoFixed bug in binomial(). binomial(n,0) erroneously returned 0.
Jens Vollinga [Thu, 8 Jan 2009 09:26:50 +0000 (10:26 +0100)]
Fixed bug in binomial(). binomial(n,0) erroneously returned 0.

14 years agoSmall fixes to avoid compile warnings (-Wall).
Jens Vollinga [Thu, 18 Dec 2008 11:19:35 +0000 (12:19 +0100)]
Small fixes to avoid compile warnings (-Wall).

14 years agoFixed bug in multivariate factorization. Fractional numerical content was not
Jens Vollinga [Thu, 18 Dec 2008 10:10:50 +0000 (11:10 +0100)]
Fixed bug in multivariate factorization. Fractional numerical content was not
extracted and led to a not so finite running behavior. Added new checks for that

Added static keywords to hide debugging output operators.

14 years agoAdded new items.
Jens Vollinga [Mon, 1 Dec 2008 09:26:38 +0000 (10:26 +0100)]
Added new items.

14 years ago[PATCH] [build] Simplify generation of ginac/version.h
Alexei Sheplyakov [Mon, 1 Dec 2008 09:13:12 +0000 (10:13 +0100)]
[PATCH] [build] Simplify generation of ginac/version.h

14 years ago[PATCH] Fix GiNaC library version information.
Alexei Sheplyakov [Mon, 1 Dec 2008 09:12:25 +0000 (10:12 +0100)]
[PATCH] Fix GiNaC library version information.

The libtool naming scheme cannot guarantee that on all systems, the numbering
is consecutive. It only guarantees that it is increasing. This doesn't matter,
though: there is not incurred cost for numbers that are omitted, except for
shrinking the available space of leftover numbers. Not something we need to
worry about yet.  ;-)  On the other hand, tricks which we were using to make
version numbers consecutive on GNU/Linux break versioning on other OSes.

14 years agoFixed a problem in polynomial divide by deactivating a recursion that lead to a
Jens Vollinga [Mon, 1 Dec 2008 08:54:53 +0000 (09:54 +0100)]
Fixed a problem in polynomial divide by deactivating a recursion that lead to a
significant slowdown in sqrfree() and sometimes to a infinite loop.

14 years agoAdded section about factor(). Made appropriate changes at other places.
Jens Vollinga [Fri, 14 Nov 2008 11:00:52 +0000 (12:00 +0100)]
Added section about factor(). Made appropriate changes at other places.

14 years agoAdded many comments.
Jens Vollinga [Thu, 13 Nov 2008 15:36:02 +0000 (16:36 +0100)]
Added many comments.

14 years agoFixed lots of bugs in factor_multivariate().
Jens Vollinga [Thu, 13 Nov 2008 10:13:05 +0000 (11:13 +0100)]
Fixed lots of bugs in factor_multivariate().

factor_univariate() takes now the content of the polynomial into accout when
choosing a prime. It also returns the chosen prime. This supports the
factor_multivariate() code.

Polynomials are expanded before calling factor_sqrfree(). This avoids problems
with some input polynomials.

Added static qualifiers to all hidden functions.

14 years agoFixed a bug in squarefree(). Some polynomials were erroneously classified as
Jens Vollinga [Tue, 11 Nov 2008 09:33:29 +0000 (10:33 +0100)]
Fixed a bug in squarefree(). Some polynomials were erroneously classified as
square free (e.g. x^prime+1).

Fixed a bug in multivar_diophant() causing  sporadically an infinite loop.

Improved lifting bound code.

Univariate lifting can now use a cache for the modular factors. At the moment,
this gives no measurable speed gain.

14 years agoAdded modular square free factorization.
Jens Vollinga [Mon, 10 Nov 2008 12:38:11 +0000 (13:38 +0100)]
Added modular square free factorization.
Completed distinct degree factorization.
Univariate polynomial factorization uses now upoly.
Merged class Partition and function split into class factor_partition.

14 years agoStupid error: did the revert on the wrong branch (master instead of ginac_1-4).
Jens Vollinga [Thu, 6 Nov 2008 13:18:01 +0000 (14:18 +0100)]
Stupid error: did the revert on the wrong branch (master instead of ginac_1-4).

Revert "Revert "[portability] GiNaC::compile_ex works on OpenBSD now.""

This reverts commit a6854a8a0f1e5db722320f5d7ccb9097053500cf.

14 years agoRevert "[portability] GiNaC::compile_ex works on OpenBSD now."
Jens Vollinga [Thu, 6 Nov 2008 13:13:54 +0000 (14:13 +0100)]
Revert "[portability] GiNaC::compile_ex works on OpenBSD now."

This reverts commit 375a7aa1f13fa6061c278eb2c2447fd91521b45d.

14 years agoUnivariate Hensel lifting now uses upoly.
Jens Vollinga [Thu, 6 Nov 2008 13:11:02 +0000 (14:11 +0100)]
Univariate Hensel lifting now uses upoly.
Changed q_matrix code.

14 years agoEquip ginac-examples.texi with directory entry for info.
Paul Irofti [Tue, 4 Nov 2008 14:55:34 +0000 (17:55 +0300)]
Equip ginac-examples.texi with directory entry for info.

14 years ago[portability] GiNaC::compile_ex works on OpenBSD now.
Alexei Sheplyakov [Mon, 3 Nov 2008 16:17:16 +0000 (19:17 +0300)]
[portability] GiNaC::compile_ex works on OpenBSD now.

* acinclude.m4: check for dlopen() in libdl and in libc itself.

Thanks to Paul Irofti for a bug report and a suggestion.

14 years ago[build] Set correct rpath for linking with CLN...
Alexei Sheplyakov [Mon, 3 Nov 2008 14:34:29 +0000 (17:34 +0300)]
[build] Set correct rpath for linking with CLN...

... so users won't get 'error while loading shared libraries: no such file
or directory'. Also embed rpath into pkg-config meta data, so

g++ `pkg-config --cflags --libs ginac` foo.cc

actually works without any additional effort from the user side.

14 years ago[bugfix] integer_cra: check if arguments contain at least 2 moduli
Alexei Sheplyakov [Thu, 23 Oct 2008 13:48:14 +0000 (17:48 +0400)]
[bugfix] integer_cra: check if arguments contain at least 2 moduli

While at it, also fix exam_cra so it does not produce pointless inputs.

14 years agoexam_cra: explicitly #include <limits>. This should make g++ 4.3 happy.
Alexei Sheplyakov [Tue, 21 Oct 2008 06:09:33 +0000 (10:09 +0400)]
exam_cra: explicitly #include <limits>. This should make g++ 4.3 happy.

14 years agoChanged debugging facilities in factor.cpp.
Jens Vollinga [Wed, 5 Nov 2008 12:56:53 +0000 (13:56 +0100)]
Changed debugging facilities in factor.cpp.

14 years agoFixed some minor spelling errors.
Jens Vollinga [Wed, 5 Nov 2008 10:31:35 +0000 (11:31 +0100)]
Fixed some minor spelling errors.

14 years agoChanged code from using cl_UP_MI to using umodpoly. The cl_UP_MI interface was
Jens Vollinga [Wed, 5 Nov 2008 10:22:19 +0000 (11:22 +0100)]
Changed code from using cl_UP_MI to using umodpoly. The cl_UP_MI interface was
inconvenient to use and caused several very difficult bugs (some were still
unresolved before changing to umodpoly!).

Fixed severe bug in multivariate factorization. The condition that all modular
factors should be relatively prime in the base ring was violated. This caused
the factorization sometimes to go into an infinite loop.

14 years agoAdded code for distinct degree factorization.
Jens Vollinga [Mon, 3 Nov 2008 14:50:31 +0000 (15:50 +0100)]
Added code for distinct degree factorization.

14 years agotutorial: simplify the instructions on writing extension classes.
Alexei Sheplyakov [Sun, 19 Oct 2008 16:21:33 +0000 (20:21 +0400)]
tutorial: simplify the instructions on writing extension classes.

Don't mention (un)archiving while describing the `mystring' class
(the minimalistic extension class), so readers have less chances to get

14 years agoDon't force every algebraic class to implement archiving/unarchiving.
Alexei Sheplyakov [Sun, 19 Oct 2008 15:39:30 +0000 (19:39 +0400)]
Don't force every algebraic class to implement archiving/unarchiving.

So people who don't use (un)archiving don't need to bother with it.

14 years agotutorial: don't mention custom RTTI any more (as it does not exist).
Alexei Sheplyakov [Fri, 17 Oct 2008 13:57:27 +0000 (17:57 +0400)]
tutorial: don't mention custom RTTI any more (as it does not exist).

14 years agosymbol: make get_domain() a virtual method, remove symbol::domain.
Alexei Sheplyakov [Thu, 16 Oct 2008 11:43:32 +0000 (15:43 +0400)]
symbol: make get_domain() a virtual method, remove symbol::domain.

This cuts yet another 4 bytes from GiNaC::symbol. While at it, fix a memory
leak in ginsh.

14 years agosymbol: don't bother to set TeX name if user did not specified one.
Alexei Sheplyakov [Thu, 16 Oct 2008 11:43:32 +0000 (15:43 +0400)]
symbol: don't bother to set TeX name if user did not specified one.

Same for the usual name. As a result we use less memory (and the output
is exactly the same).

14 years agosymbol: remove return_type_tinfo() and return_type() (shrink symbol by 8 bytes)
Alexei Sheplyakov [Fri, 17 Oct 2008 10:56:54 +0000 (14:56 +0400)]
symbol: remove return_type_tinfo() and return_type() (shrink symbol by 8 bytes)

Bloating symbol to the state sizeof(symbol) == 64 is not appreciated at all.
If someone needs/wants non-commutative symbols or other fancy stuff, please
derive from class symbol and do whatever you want.

14 years agoWipe out remnants of custom RTTI.
Alexei Sheplyakov [Fri, 17 Oct 2008 09:41:01 +0000 (13:41 +0400)]
Wipe out remnants of custom RTTI.

Custom RTTI considered harmful, final part.

14 years agoregistered_class_info: use typeid() instead of tinfo_static.
Alexei Sheplyakov [Wed, 15 Oct 2008 11:32:11 +0000 (15:32 +0400)]
registered_class_info: use typeid() instead of tinfo_static.

(Custom RTTI considered harmful, part 5).

Since custom RTTI is going to be removed, registered_class_info needs to be
re-organazied. Now tinfo_key is a (const) pointer to std::type_info.

14 years agoA better return_type_tinfo() mechanism.
Alexei Sheplyakov [Fri, 17 Oct 2008 09:15:03 +0000 (13:15 +0400)]
A better return_type_tinfo() mechanism.

return_type_tinfo() is used in order to distingish between non-commutative
objects of different type. However, often it's necessary to distingish
between non-commutative objects of the same type, for example, between
gamma matrices with different representation label. return_type_tinfo()
does not provide any clean way to do that. Hence, introduce return_type_t
type which holds representation label along with type information, and
use it for return_type_tinfo().

14 years agocalchash(): use type_info::name() instead of tinfo().
Alexei Sheplyakov [Wed, 15 Oct 2008 11:32:11 +0000 (15:32 +0400)]
calchash(): use type_info::name() instead of tinfo().

Custom RTTI considered harmful, part 4.

The hash value of the object of different types should be different whenever
possible. Hence calcash() needs a unique per type number. Previously we used
tinfo_key for this. typeinfo::name() (a *pointer* to implementation dependent
string) is also unique for each class, so it's just as good as tinfo() is.

14 years agoindexed::eval: use standard C++ RTTI.
Alexei Sheplyakov [Wed, 15 Oct 2008 11:32:11 +0000 (15:32 +0400)]
indexed::eval: use standard C++ RTTI.

Custom RTTI considered harmful, part 3.

14 years agobasic, expairseq: use standard C++ RTTI in compare(), is_equal(), match(), etc.
Alexei Sheplyakov [Wed, 15 Oct 2008 11:32:11 +0000 (15:32 +0400)]
basic, expairseq: use standard C++ RTTI in compare(), is_equal(), match(), etc.

Custom RTTI considered harmful, part 2.

* basic.cpp: use standard C++ RTTI in compare(), is_equal(), operator=(),
* expairseq.cpp: use standard C++ RTTI in match(), make_flat(),

14 years agois_exactly_a: use typeid() to check the type of expression.
Alexei Sheplyakov [Wed, 15 Oct 2008 11:32:11 +0000 (15:32 +0400)]
is_exactly_a: use typeid() to check the type of expression.

Custom RTTI considered harmful, part 1.

Custom run time type information (RTTI) system implemented in GiNaC have
several serious drawbacks, such as

1. It makes writing GiNaC classes unnecessary cumbersome.
2. It wastes sizeof(void *) bytes per object, for small objects like
   symbol, numeric, etc. this overhead is considerable.

It turns out that GiNaC's RTTI is not any faster than the standard one
(at least on GNU/Linux and Solaris with GNU C++ library and compiler).
So, GiNaC RTTI have no reasons to exit any more.

14 years agoptr.h: use unsigned int to store reference counts (in order to save memory).
Alexei Sheplyakov [Wed, 15 Oct 2008 06:16:07 +0000 (10:16 +0400)]
ptr.h: use unsigned int to store reference counts (in order to save memory).

We'll hardly ever get more than 2^32 references to the same object. So using
size_t to store reference count only wastes 4 bytes per object (on 64-bit
architecture). Use unsigned int instead.

14 years agoRewritten heuristic and PRS GCD for univariate polynomials, added benchmark.
Alexei Sheplyakov [Sun, 19 Oct 2008 17:27:14 +0000 (21:27 +0400)]
Rewritten heuristic and PRS GCD for univariate polynomials, added benchmark.

Using a better data structure for univariate polynomials makes GCD 10 -- 300
times faster (and less memory hungry).

14 years agopolynomial: introduce a helper function to divide polynomial by ring element.
Alexei Sheplyakov [Tue, 14 Oct 2008 06:44:07 +0000 (10:44 +0400)]
polynomial: introduce a helper function to divide polynomial by ring element.

14 years agomod_gcd: naive hack to chose a 'good' prime (to speed up gcd computation).
Alexei Sheplyakov [Tue, 14 Oct 2008 06:37:42 +0000 (10:37 +0400)]
mod_gcd: naive hack to chose a 'good' prime (to speed up gcd computation).

15 years ago[bugfix] remainder_in_ring: using exact division is plain wrong.
Alexei Sheplyakov [Mon, 29 Sep 2008 05:58:35 +0000 (09:58 +0400)]
[bugfix] remainder_in_ring: using exact division is plain wrong.

15 years ago[bugfix] normalize_in_ring: don't set the leading coefficient to 1.
Alexei Sheplyakov [Mon, 29 Sep 2008 05:53:46 +0000 (09:53 +0400)]
[bugfix] normalize_in_ring: don't set the leading coefficient to 1.

The coefficient ring is not a field, so the leading coefficient don't
have to be 1.

15 years ago[trivial] excompiler.cpp: shut up some silly compiler warnings.
Alexei Sheplyakov [Thu, 25 Sep 2008 09:19:57 +0000 (13:19 +0400)]
[trivial] excompiler.cpp: shut up some silly compiler warnings.

GCC warns about 'comparison between signed and unsigned integer expressions'.
In this case such comparison is harmless, but still it's a bit annoying.

15 years agoMerge branch 'master' of git://ffmssmsc.jinr.ru:443/varg/ginac
Jens Vollinga [Tue, 30 Sep 2008 09:47:25 +0000 (11:47 +0200)]
Merge branch 'master' of git://ffmssmsc.jinr.ru:443/varg/ginac

15 years agoReplaced class UniPoly by cl_UP_MI.
Jens Vollinga [Mon, 29 Sep 2008 15:38:46 +0000 (17:38 +0200)]
Replaced class UniPoly by cl_UP_MI.

15 years ago- Added options argument to factor(). Added flag factor_options::all that lets
Jens Vollinga [Fri, 26 Sep 2008 09:07:02 +0000 (11:07 +0200)]
- Added options argument to factor(). Added flag factor_options::all that lets
  factor() act on all polynomial subexpressions.
- Added more comments.

15 years agoImplemented modular GCD algorithm for univariate polynomials.
Alexei Sheplyakov [Sat, 20 Sep 2008 19:18:46 +0000 (23:18 +0400)]
Implemented modular GCD algorithm for univariate polynomials.

15 years agoWipe out the old (bison/flex generated) parser.
Alexei Sheplyakov [Sun, 14 Sep 2008 03:13:01 +0000 (07:13 +0400)]
Wipe out the old (bison/flex generated) parser.

Bison generated parser has a number of problems:

1. Bad performance. Parsing a sum seems to be O(N^{2 + a}) (a > 0).
   For example, parsing a sum (actually, a univariate polynomial) of 32768
   terms takes about 90 sec. on my box, parsing a sum of 10^6 terms takes
2. The user is expected to provide list of all symbols in the expression.
   Often this is very annoying (and useless), sometimes it is not possible
   at all.
3. Parser is not reentrant (bison *can* produce reentrant parsers, but that
   won't solve other problems).
4. Parser is difficult to extend.

Since the new parser handles almost everything (useful) as the old one, let's
remove the latter.

15 years agocheck: time_parser.cpp: don't run the same benchmark twice.
Alexei Sheplyakov [Sun, 14 Sep 2008 02:57:21 +0000 (06:57 +0400)]
check: time_parser.cpp: don't run the same benchmark twice.

Since ex(const string&, lst&) ctor uses the new parser now comparing its
performance (and result) with one of direct invocation of the parser is

15 years agoDocument the new parser, provide an example.
Alexei Sheplyakov [Sun, 14 Sep 2008 02:41:12 +0000 (06:41 +0400)]
Document the new parser, provide an example.

15 years agoUse the new parser in the ex(const string&, lst&) ctor.
Alexei Sheplyakov [Sun, 14 Sep 2008 02:24:29 +0000 (06:24 +0400)]
Use the new parser in the ex(const string&, lst&) ctor.

Note: this is certainly not the optimal way to use the parser. It's provided
for backward compatibility only.

15 years agoParser can parse (some) floating point numbers now.
Alexei Sheplyakov [Sun, 14 Sep 2008 02:01:53 +0000 (06:01 +0400)]
Parser can parse (some) floating point numbers now.

15 years agoparser: add necessary checks to operator() to stop accepting nonsense.
Alexei Sheplyakov [Sat, 13 Sep 2008 23:26:33 +0000 (03:26 +0400)]
parser: add necessary checks to operator() to stop accepting nonsense.

Since the parser is recursive parse_* methods (in particular,
parse_binop_rhs()) does NOT check if the last unparsed token is valid.
Thus parse_expression() stops if it encounters an unknown token. That's
why parser::operator() needs to make sure nothing is left in the input

15 years ago[bugfix] parser::parse_literal_expr(): don't forget to consume the token...
Alexei Sheplyakov [Sat, 13 Sep 2008 22:36:16 +0000 (02:36 +0400)]
[bugfix] parser::parse_literal_expr(): don't forget to consume the token...

... so parser won't process it twice (and get either spurious error or
wrong result).

15 years ago[bugfix]: parser::parse_unary_expr() parses '-a-b' correctly now.
Alexei Sheplyakov [Sat, 13 Sep 2008 23:19:05 +0000 (03:19 +0400)]
[bugfix]: parser::parse_unary_expr() parses '-a-b' correctly now.

Also added regression test.

15 years agoginac.h: include parser.hpp
Alexei Sheplyakov [Sat, 13 Sep 2008 01:12:31 +0000 (05:12 +0400)]
ginac.h: include parser.hpp

15 years agoparser: change order of the constructor optional arguments.
Alexei Sheplyakov [Sat, 13 Sep 2008 00:55:23 +0000 (04:55 +0400)]
parser: change order of the constructor optional arguments.

Functions/methods having multiple optional arguments are not very convenient
to use in C++ (to put it mildly). Shuffle parser ctor arguments so not so
frequently used argument is the last one.

15 years agoparser: allow read/write access to symbol table and strictness.
Alexei Sheplyakov [Sat, 13 Sep 2008 00:40:12 +0000 (04:40 +0400)]
parser: allow read/write access to symbol table and strictness.

Intended usage:

parser reader;
ifstream input_file1, input_file2;
// read the first file...
ex e1 = reader(input_file1);
// ... add extra entry into the symbol table used by parser
symbol x;
parser.get_syms()["x"] = x;
// Disable the parser to introduce new symbols, e.g. to ensure the expression
// in input_file2 contains the same symbols as e1 (read from input_file1).
parser.strict = true;
ex e2;
try {
e2 = reader(input_file2);
} catch (...) {

15 years agoparser: map input strings onto arbitrary expressions (not only symbols).
Alexei Sheplyakov [Sat, 13 Sep 2008 00:30:22 +0000 (04:30 +0400)]
parser: map input strings onto arbitrary expressions (not only symbols).

So it's possible to make abbreviations, e.g.

symbol x;
symtab table;
table["x"] = x + log(x) + 1;
parser reader(table);
ex e = reader("1 + x^2 + 5*x^3");

15 years ago[BUGFIX] parser.hpp: fix include guard so the header is actually usable.
Alexei Sheplyakov [Sat, 13 Sep 2008 00:21:27 +0000 (04:21 +0400)]
[BUGFIX] parser.hpp: fix include guard so the header is actually usable.

15 years ago[nitpick] power::expand_add(): don't use int instead of std::size_t.
Alexei Sheplyakov [Fri, 12 Sep 2008 15:55:36 +0000 (19:55 +0400)]
[nitpick] power::expand_add(): don't use int instead of std::size_t.

This shuts a few 'comparison between signed and unsigned integer expressions'

15 years ago[nitpick] inifcns_nstdsums: don't use int instead of std::size_t.
Alexei Sheplyakov [Fri, 12 Sep 2008 15:55:36 +0000 (19:55 +0400)]
[nitpick] inifcns_nstdsums: don't use int instead of std::size_t.

This shuts up quite a number of 'comparison between signed and unsigned
integer expressions'  warnings.

15 years ago[nitpick] don't use int instead of std::size_t.
Alexei Sheplyakov [Fri, 12 Sep 2008 15:55:36 +0000 (19:55 +0400)]
[nitpick] don't use int instead of std::size_t.

This shuts up (some of) 'comparison between signed and unsigned integer
expressions'  warnings.