4 years agoFinilized 1.6.3 release. release_1-6-3
Richard Kreckel [Thu, 27 Nov 2014 21:29:39 +0000 (21:29 +0000)]
Finilized 1.6.3 release.

Updated NEWS file, moved some comments so Doxygen won't be confused.

4 years agoPrepare for 1.6.3 release.
Alexei Sheplyakov [Sun, 19 Jan 2014 17:50:23 +0000 (19:50 +0200)]
Prepare for 1.6.3 release.

4 years agoUpdate copyright statements.
Richard Kreckel [Tue, 14 Oct 2014 19:41:20 +0000 (19:41 +0000)]
Update copyright statements.

4 years agoThe FSF has moved (long ago).
Richard Kreckel [Tue, 14 Oct 2014 19:27:34 +0000 (19:27 +0000)]
The FSF has moved (long ago).

Update some its postal address in some remaining places.

4 years agoFix log() error in multiple polylog G.
Stefan Weinzierl [Sun, 12 Oct 2014 18:30:41 +0000 (18:30 +0000)]
Fix log() error in multiple polylog G.

Tobias Huber reported the following bug:
> G({-0.18784426860496276*I,-0.1579006477353911*I,+0.18784426860496276*I,-0.18784426860496276*I},1);
log_eval(): log(0)

The problem is the sorting operation in G_do_trafo. This operation should
1) put the elements in increasing order of |x|
2) put equal elements next to each other (which then will avoid the log(0) problem).

The current code fails for goal 2) if we have complex numbers of equal absolute
value, one number occuring more than once, in an initial order like in the example
Entries 1,3,4 of the list all have the same absolute value, entries 1 and 4 are
equal. In the sorting operation 1 and 4 should be put next to each other.
Previously, the sorting operation would give 2,1,3,4. What we would like to have
is either 2,1,4,3 or 2,3,1,4. It is clear that the key for the sorting operation
cannot be |x| alone. If |x1|=|x2| we have to use the phase as well.

This patch takes the phase into account in the sorting.

4 years agoFix evaluation of some G-polylogs.
Stefan Weinzierl [Sun, 12 Oct 2014 18:24:07 +0000 (18:24 +0000)]
Fix evaluation of some G-polylogs.

This patch corrects and supersedes the patches
97ef604e "G_numeric: fix numeric evaluation with trailing zeros and y != 1."
9e80b0d3 "G_numeric: fix evaluation with y == 1".

The original motivation for 97ef604e was to make sure that Hoelder convolution
is only used if there no trailing zeros.

Patch 97ef604e delegated the case of trailing zeros to G_do_trafo, which correctly
removes the trailing zeros, but in addition also performed the transformation
described in sect. 5.3 of hep-ph/0410259 ("convergence transformation").
The inappropriate call of the convergence transformation is the cause of the new bug
reported at

The patch 9e80b0d3 cures the symptons mentioned in the above bug report,
but fails for other cases, like evalf( G({-2,2,-2,0},2) ).

What should be done is the following: If trailing zeros are detected in G_numeric,
these should be removed and the result should be returned to G_numeric. The
routine G_numeric decides then what to do next: either calling the convergence
transformation, or Hoelder convolution or direct summation. What is needed is a
subroutine, which just removes trailing zeros, but does not perform the convergence

With the present code the minimal modification to achieve this goal is to add an
additional boolean parameter flag_trailing_zeros_only to G_do_trafo (and its
dependent sub-routines), so G_do_trafo can be called for the removal of trailing
zeros only.

This patch implements this and uses G_do_trafo to remove trailing zeros only for
the case at hand.

4 years agoG_numeric: fix evaluation with y == 1
Alexei Sheplyakov [Fri, 12 Sep 2014 13:50:51 +0000 (17:50 +0400)]
G_numeric: fix evaluation with y == 1

Do apply Hoelder convolution if y == 1 even if there are trailing zeros.
Fixes the regression introduced by commit 97ef604e ("G_numeric: fix
numeric evaluation with trailing zeros and y != 1.")

4 years agoAdd more ex::is_polynomial() tests
Alexei Sheplyakov [Sun, 7 Sep 2014 18:56:02 +0000 (22:56 +0400)]
Add more ex::is_polynomial() tests

Improves commit 92da4c16 ('[bugfix] ex::is_polynomial(x): fix miscomputations')
a little bit.

4 years agoProviding default (un)archiving for cliffordunit class.
Vladimir V. Kisil [Mon, 18 Aug 2014 20:29:01 +0000 (21:29 +0100)]
Providing default (un)archiving for cliffordunit class.

Signed-off-by: Vladimir V. Kisil <>
4 years ago[bugfix] ex::is_polynomial(x): fix miscomputations
Richard Kreckel [Fri, 25 Jul 2014 23:11:11 +0000 (23:11 +0000)]
[bugfix] ex::is_polynomial(x): fix miscomputations

The function power::is_polynomial(x) sometimes returned false,
even if x did not occur in the power object.

Thanks to Rubel Zilibowitz for reporting this bug.

Similarly, mul::is_polynomial(x) sometimes returned true, even
if x occurred only in the denominator of a rational function.

The function mul::is_polynomial(x) does a simpler version of
power::is_polynomial(x) on its factors. (It's simpler because the
exponents cannot be functions of x.)

4 years agoFix example of symmetrization in tutorial.
Richard Kreckel [Tue, 22 Jul 2014 07:48:25 +0000 (07:48 +0000)]
Fix example of symmetrization in tutorial.

The old example was illegal C++. Thanks to Rubel Zilibowitz for
reporting this error.

4 years ago[bugfix] log_series: avoid infinite recursion
Alexei Sheplyakov [Tue, 1 Jul 2014 18:46:11 +0000 (21:46 +0300)]
[bugfix] log_series: avoid infinite recursion

Check if the argument is on a branch cut check if it actually depends
on the expansion variable before trying to expand around a different
point in order to avoid the infinite recursion (or rather a segfault
due to a stack overflow).

Thanks to Mario Prausa for a bugreport.

5 years agoFix an infinite loop in factor_multivariate.
Alexei Sheplyakov [Sun, 18 May 2014 10:24:40 +0000 (13:24 +0300)]
Fix an infinite loop in factor_multivariate.

Make sure the leading coefficient is really factorized (take care of
the integer content).

5 years agoG_do_hoelder: fix the transformation of the imaginary part.
Stefan Weinzierl [Sat, 12 Apr 2014 11:32:20 +0000 (14:32 +0300)]
G_do_hoelder: fix the transformation of the imaginary part.

The G_do_hoelder function transforms the arguments as z -> 1-z.
If z has an imaginary part, the sign of the imagniary part transforms
as s -> -s.
In the special case where z is real and > 1, the transformed value is
real and < 0. For (transformed) real negative values of z the sign of
the imaginary part is not relevant (there are no branch cuts). The code
requires that in this case the sign takes the default value +1.
This is now fixed.

5 years agoG_numeric: fix numeric evaluation with trailing zeros and y != 1.
Stefan Weinzierl [Wed, 12 Feb 2014 20:07:40 +0000 (22:07 +0200)]
G_numeric: fix numeric evaluation with trailing zeros and y != 1.

Make sure G_numeric makes use of scaling relation (G_do_hoelder) only if
there are no traling zeros. Use G_do_trafo otherwise (which can handle
trailing zeros).

5 years ago[docs] remind users tho send EOF marker when doing input from cin.
Richard Kreckel [Mon, 3 Feb 2014 08:02:53 +0000 (08:02 +0000)]
[docs] remind users tho send EOF marker when doing input from cin.

The example program waiting infinitely for EOF has confused at least one
user: <>

5 years agoBinary compatibilty has been broken, update the library version.
Alexei Sheplyakov [Sun, 2 Feb 2014 17:55:22 +0000 (19:55 +0200)]
Binary compatibilty has been broken, update the library version.

commit 798d53ebb4da4e8e3865ed7bd7f31412fe2be3a7 (`Make it possible to override
info() for functions.') overrides the function::info() virtual method. This
breaks binary compatibility (adds a new entry in the middle of the vtable of
the `function' class).

The experimental proof of the above statement: ginsh linked with the previous
release of libginac segfaults if is upgraded to the current

Thereore bump the library version.

5 years ago[build] Document that Python is required for building GiNaC.
Alexei Sheplyakov [Sun, 2 Feb 2014 10:56:46 +0000 (12:56 +0200)]
[build] Document that Python is required for building GiNaC.

5 years ago[build] Fix `make pdf' for out of the source (auto* tools) build.
Alexei Sheplyakov [Sun, 2 Feb 2014 15:49:18 +0000 (17:49 +0200)]
[build] Fix `make pdf' for out of the source (auto* tools) build.

5 years ago[build] Include the generated sources (function.{h,cpp}) into the tarball.
Alexei Sheplyakov [Sun, 2 Feb 2014 15:47:38 +0000 (17:47 +0200)]
[build] Include the generated sources (function.{h,cpp}) into the tarball.

5 years ago[build] Include CMake related files into the tarball.
Alexei Sheplyakov [Sat, 1 Feb 2014 16:56:29 +0000 (18:56 +0200)]
[build] Include CMake related files into the tarball.

5 years ago[build] Include the helper scripts into the tarball.
Alexei Sheplyakov [Sat, 1 Feb 2014 16:50:37 +0000 (18:50 +0200)]
[build] Include the helper scripts into the tarball.

5 years agocheck: auto* tools build: compile and run check_mul_info.
Alexei Sheplyakov [Fri, 31 Jan 2014 19:46:26 +0000 (21:46 +0200)]
check: auto* tools build: compile and run check_mul_info.

5 years ago[build] ginsh: fix `make distcheck' failure.
Alexei Sheplyakov [Tue, 28 Jan 2014 06:59:48 +0000 (08:59 +0200)]
[build] ginsh: fix `make distcheck' failure.

5 years agolog_eval: don't apply the log(x^p) -> p*log(x) rule.
Alexei Sheplyakov [Sat, 18 Jan 2014 12:13:46 +0000 (14:13 +0200)]
log_eval: don't apply the log(x^p) -> p*log(x) rule.

Automatically transforming log(p^2) into 2 log(p) might be quite annoying.
Perhaps this transformation should be moved to expand() and applied only
if expand_options::expand_transcendental is specified.

5 years agoLi_eval(): avoid the "numeric::operator>(): complex inequality" exception.
Stefan Weinzierl [Tue, 28 Jan 2014 06:58:06 +0000 (08:58 +0200)]
Li_eval(): avoid the "numeric::operator>(): complex inequality" exception.

Basically the problem is that 1 + 0.0*I is equal to 1, but checking if
the former is positive results in the the "numeric::operator>(): complex
inequality" exception. This behavior is definitely inconsistent and should
be fixed.

As a work around teach Li_eval and convert_parameter_Li_to_H to explicitly
convert 1 + 0.0*I to 1 (and -1 + 0.0*I to -1, respectively).

[Alexei Sheplyakov: comment the code a little bit, otherwise it looks weird]

5 years agoFix S_num for arguments close to the sixth root of unity or its conjugate.
Stefan Weinzierl [Sun, 12 Jan 2014 22:31:22 +0000 (22:31 +0000)]
Fix S_num for arguments close to the sixth root of unity or its conjugate.

The method S_num within the Nielsen polylogs used to map the region
abs(x)<=1 && abs(x)>0.95 && abs(1-x)<=1 && abs(1-x)>0.95 infinitely many times
onto itself. This infinite recursion is now avoided.

This however reveals the next problem: The numerical convergence in this
region is very slow. Within the Nielsen polylogs there is no transformation
available to improve the convergence. However we can use the (1-x)/(1+x)
transformation within the harmonic polylogs. In order to avoid another
infinite recursion I have inserted a few hold()'s in the method H_evalf,
otherwise we would fall back immediately again to Nielsen polylogs. The hold()s
should have been there anyway.

5 years agoFix G3_evalf and G3_eval for real and negative x.
Stefan Weinzierl [Sun, 12 Jan 2014 22:19:56 +0000 (22:19 +0000)]
Fix G3_evalf and G3_eval for real and negative x.

The user supplied signs of the imaginary parts are only relevant for x real
and positive. A negative sign in the case of x real and negative is irrelevant
(there is no branch cut) and led to wrong results. This is now avoided.

5 years agoWithin mLi_numeric, set signs of the imaginary parts correctly for G_numeric.
Stefan Weinzierl [Sun, 12 Jan 2014 22:07:28 +0000 (22:07 +0000)]
Within mLi_numeric, set signs of the imaginary parts correctly for G_numeric.

5 years agoAvoid calling log(1-x) for x=1 in Li_projection.
Stefan Weinzierl [Sun, 12 Jan 2014 21:58:12 +0000 (21:58 +0000)]
Avoid calling log(1-x) for x=1 in Li_projection.

5 years agoFix evaluation of log(p^a) -> a*log(p), if p>0 and a is real.
Vladimir V. Kisil [Sat, 28 Dec 2013 23:58:40 +0000 (23:58 +0000)]
Fix evaluation of log(p^a) -> a*log(p), if p>0 and a is real.

This evaluation was broken with commit e5c76f659e2e882d.

5 years agoexpairseq::match(): no side effects if match failed. Fixes spurious match failures.
Matthias Dellweg [Tue, 10 Dec 2013 08:55:28 +0000 (10:55 +0200)]
expairseq::match(): no side effects if match failed. Fixes spurious match failures.

> match(sin(y)*exp(b)+sin(x)*exp(a), sin($0)*exp(a)+exp(b)*sin($1))

The reason is that expairseq::match() might assign a wildcard even if
the match fails. The first attempted submatch is sin(y)*exp(b) with
sin($0)*exp(a). It fails (as it should) but $0 == y gets assigned as
a side effect (which is wrong). Next submatch is sin(x)*exp(a) with
sin($0)*exp(a) (the same pattern as in the first submatch). This one
fails because of spurious $0 == y assignment.

Due to the unpredicatable term ordering the sequence of submatches might
be different and the match might succeed (as it should). This makes
debugging a bit more funny.

Signed-off-by: Matthias Dellweg <>
[Alexei Sheplyakov: figure out the cause of the problem, make a test case]

5 years agoExpansion rules for exp(), log(), and abs().
Vladimir V. Kisil [Sun, 3 Nov 2013 20:21:00 +0000 (22:21 +0200)]
Expansion rules for exp(), log(), and abs().

exp(a + b) -> exp(a)*exp(b)
log(a*b) -> log(a) + log(b)
abs(z*w) -> abs(z)*abs(w)

log and exp are transformed only if expand_options::expand_transcendental
is given.

Signed-off-by: Vladimir V. Kisil <>
5 years agoIntroduce expand_options::expand_transcendental.
Vladimir V. Kisil [Sat, 2 Nov 2013 19:06:53 +0000 (21:06 +0200)]
Introduce expand_options::expand_transcendental.

In general expand() treats the argument as a rational expression (and
leave transcendental functions as they are). However sometimes it's
convenient to expand transcendental functions too, like

log(a*b) = log(a) + log(b)
exp(a + b) = exp(a)*exp(b)

Applying such transformation by default doesn't seem to be a smart idea
(think of log(p^2/mu^2) transformed to 2*log(p) - 2*log(mu)). Therefore
introduce expand_options::expand_transcendental. As the name implies expand()
tries to transform transcendental functions only if this flag is set.

Signed-off-by: Vladimir V. Kisil <>
5 years agoKeep CLang/libc++ happy.
Richard Kreckel [Sun, 3 Nov 2013 12:49:07 +0000 (12:49 +0000)]
Keep CLang/libc++ happy.

5 years agoabs() and conjugate() provide some info() now.
Vladimir V. Kisil [Wed, 11 Sep 2013 08:26:30 +0000 (09:26 +0100)]
abs() and conjugate() provide some info() now.

5 years agoMake it possible to override info() for functions.
Vladimir V. Kisil [Wed, 11 Sep 2013 08:26:30 +0000 (09:26 +0100)]
Make it possible to override info() for functions.

Signed-off-by: Vladimir V. Kisil <>
5 years agoPower with a real base and even exponent reports that it's non-negative
Vladimir V. Kisil [Thu, 1 Aug 2013 13:37:45 +0000 (14:37 +0100)]
Power with a real base and even exponent reports that it's non-negative

Signed-off-by: Vladimir V. Kisil <>
5 years agoImprove abs_eval(): abs(conjugate(z)) => abs(z), ...
Vladimir V. Kisil [Thu, 1 Aug 2013 13:37:45 +0000 (14:37 +0100)]
Improve abs_eval(): abs(conjugate(z)) => abs(z), ...

... abs(step(z)) => step(z)

Signed-off-by: Vladimir V. Kisil <>
5 years agoFunctions can define a custom expand() now.
Vladimir V. Kisil [Mon, 7 Oct 2013 05:04:30 +0000 (08:04 +0300)]
Functions can define a custom expand() now.

Signed-off-by: Vladimir V. Kisil <>
5 years agoMore evaluation rules: abs(x^n) => abs(x)^n (x > 0, n is real).
Vladimir V. Kisil [Wed, 31 Jul 2013 08:48:24 +0000 (09:48 +0100)]
More evaluation rules: abs(x^n) => abs(x)^n (x > 0, n is real).

A simple test is added as well.

Signed-off-by: Vladimir V. Kisil <>
5 years agoTransform abs(x)^n => x^n if x is real and n is even.
Vladimir V. Kisil [Tue, 30 Jul 2013 15:40:38 +0000 (16:40 +0100)]
Transform abs(x)^n => x^n if x is real and n is even.

While at it add some .hold() to returns which cannot be processed further.

Signed-off-by: Vladimir V. Kisil <>
5 years agomul::info(): cache the result of the positiveness/negativeness checks, ...
Alexei Sheplyakov [Sun, 13 Oct 2013 10:16:16 +0000 (13:16 +0300)]
mul::info(): cache the result of the positiveness/negativeness checks, ...

... and use the cached result if possible.

5 years agoIntroduce status_flags::{is_positive,is_negative,purely_indefinite}
Alexei Sheplyakov [Sat, 3 Aug 2013 14:01:42 +0000 (17:01 +0300)]
Introduce status_flags::{is_positive,is_negative,purely_indefinite}

Quite a number of transformations can be applied if the expression
is known to be positive (negative) (for instance, sqrt(x^2*y^2) = x*y
if x >= 0 and y >= 0). However the check itself might be quite expensive.
Hence a few status_flags are introduced to cache the result.

5 years agoAdd subdir-objects to Automake options.
Richard Kreckel [Fri, 11 Oct 2013 21:11:35 +0000 (23:11 +0200)]
Add subdir-objects to Automake options.

This option is needed to keep automake 1.14 happy.

5 years ago[build] fix ginsh build for automake <=1.11.
Richard Kreckel [Sun, 11 Aug 2013 11:16:15 +0000 (13:16 +0200)]
[build] fix ginsh build for automake <=1.11.

automake <=1.11 and automake >=1.12 have different conventions for naming
C++ header files made by yacc.  To work with both, we write our own rule
rather than using automake's.

5 years ago[build] auto* tools based build: fix `make dist'.
Alexei Sheplyakov [Sun, 11 Aug 2013 06:59:53 +0000 (09:59 +0300)]
[build] auto* tools based build: fix `make dist'.

5 years agoimprove mul::info(): the product of two negative terms is positive, ...
Vladimir V. Kisil [Mon, 29 Jul 2013 16:25:25 +0000 (17:25 +0100)]
improve mul::info(): the product of two negative terms is positive, ...

... and the product of a positive and non-negative terms is non-negative.

5 years agoFix build from git repository.
Richard Kreckel [Wed, 31 Jul 2013 21:33:44 +0000 (21:33 +0000)]
Fix build from git repository.

To make automake aware of lex and yacc files, they must be renamed.

5 years agoAdd support for Texinfo-5.0.
Richard Kreckel [Wed, 31 Jul 2013 20:42:16 +0000 (20:42 +0000)]
Add support for Texinfo-5.0.

Recent versions of Texinfo complained about misplaced @subsection.
Change them into @appendixsection.

5 years agoShut up recent texinfo warning.
Richard Kreckel [Tue, 30 Jul 2013 18:19:49 +0000 (18:19 +0000)]
Shut up recent texinfo warning.

It seems like dircategory has to come before the first node.

5 years agoShut up recent automake warning.
Richard Kreckel [Mon, 29 Jul 2013 08:05:22 +0000 (08:05 +0000)]
Shut up recent automake warning.

'INCLUDES' was the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS').

5 years agoAdd the case of c1=-1 and c2>0 to the rewriting rule of exponents: (x^c1)^c2 -> x...
Vladimir V. Kisil [Sun, 28 Jul 2013 22:25:01 +0000 (23:25 +0100)]
Add the case of c1=-1 and c2>0 to the rewriting rule of exponents: (x^c1)^c2 -> x^(c1 * c2)

5 years ago[bugfix] factor_univariate(): handle polinomials over rationals (no segfaults any...
Alexei Sheplyakov [Sun, 28 Jul 2013 15:43:06 +0000 (18:43 +0300)]
[bugfix] factor_univariate(): handle polinomials over rationals (no segfaults any more).

6 years agoAdd symbol::set_TeX_name(string) member function.
Richard Kreckel [Wed, 23 Jan 2013 08:19:26 +0000 (09:19 +0100)]
Add symbol::set_TeX_name(string) member function.

This allows setting a symbol's TeX-name after construction.

6 years agoMake FindCLN actually work without pkg-config.
Alexei Sheplyakov [Fri, 27 Jul 2012 19:04:54 +0000 (22:04 +0300)]
Make FindCLN actually work without pkg-config.

6 years agoTrick CTest so the test suite runs when cross-compiling.
Alexei Sheplyakov [Fri, 27 Jul 2012 18:56:40 +0000 (21:56 +0300)]
Trick CTest so the test suite runs when cross-compiling.

The test suite can be run in some cross-compilation setups (say, MinGW
on Linux). Howerver CTest's add_test command does not add the .exe
suffix on its own, as a result `make test' fails. Let's help add_test a bit.

6 years agoWork around Tex Live 2012 versus doxygen problem.
Alexei Sheplyakov [Fri, 27 Jul 2012 18:55:35 +0000 (21:55 +0300)]
Work around Tex Live 2012 versus doxygen problem.

TeX Live 2012 seems to dislike files produces by doxygen (1.8.x.y).
In particular, makeindex(1) program creates invalid index entries like


(note the trailing underscore in the page number). This breaks automatic
builds and is very annoying. This patch works around the problem by
post-processing the generated *.ind file. This hack is a bit crude, however
it gets the job done (a proper fix is welcome, though).

6 years ago[build] GiNaC can be built with CMake now.
Alexei Sheplyakov [Mon, 30 May 2011 23:50:01 +0000 (02:50 +0300)]
[build] GiNaC can be built with CMake now.

Known issues:

* no make dist
* no make install-pdf

6 years ago[build] Move library version info into the version.h file.
Alexei Sheplyakov [Thu, 23 Feb 2012 20:20:44 +0000 (22:20 +0200)]
[build] Move library version info into the version.h file.

The point is to have this info easily available for both build systems.

6 years ago[build] Rewrite ginsh related sed scripts in python.
Alexei Sheplyakov [Tue, 10 Jan 2012 05:48:29 +0000 (08:48 +0300)]
[build] Rewrite ginsh related sed scripts in python.

This makes build scripts more portable and human readable.

6 years ago[build] Move archive version info into version.h (for non autotools build).
Alexei Sheplyakov [Sun, 29 May 2011 14:15:42 +0000 (17:15 +0300)]
[build] Move archive version info into version.h (for non autotools build).

The canonical location for all version info is the ginac/version.h file
now (so we can have two build systems without duplicating the version info
in and CMakeLists.txt).

6 years ago[build] Define package version number in version.h (for non autotools build).
Alexei Sheplyakov [Sun, 29 May 2011 13:27:49 +0000 (16:27 +0300)]
[build] Define package version number in version.h (for non autotools build).

6 years ago[build] include config.h conditionally to not break non-autotools build.
Alexei Sheplyakov [Sun, 29 May 2011 13:18:39 +0000 (16:18 +0300)]
[build] include config.h conditionally to not break non-autotools build.

6 years agoConvert into C++ (well, almost) source and header.
Alexei Sheplyakov [Sun, 29 May 2011 12:26:37 +0000 (15:26 +0300)]
Convert into C++ (well, almost) source and header.

The code is much more readable now, as it's (almost) plain C++ (except
simple pythonic `preprocessor' instructions). As a side effect perl is
no longer necessary for building GiNaC.

6 years ago[bugfix] Always #include <lst.h> before using lst. Fixes build error on MinGW.
Alexei Sheplyakov [Tue, 17 Jul 2012 03:32:45 +0000 (06:32 +0300)]
[bugfix] Always #include <lst.h> before using lst. Fixes build error on MinGW.

[temp.expl.spec] says:

6 If a template, a member template or the member of a class template
  is explicitly specialized then that specialization shall be declared
  before the first use of that specialization that would cause an implicit
  instantiation to take place, in every translation unit in which such a
  use occurs; no diagnostic is required. If the program does not provide
  a definition for an explicit specialization and either the specialization
  is used in a way that would cause an implicit instantiation to take place
  or the member is a virtual member function, the program is ill-formed,
  no diagnostic required. An implicit instantiation is never generated for
  an explicit specialization that is declared but not defined.

Apparently we are breaking this rule (presumably since the commit 99901bd5c742
`Parser can now read GiNaC lists (lst) defined by braces.'). In particular,
parser.cpp does not include lst.h (neither directly nor indirectly) which
contains explicit specialization of lst::info(). However, parser.cpp
(indirectly) includes both container.h and registar.h, so the GiNaC::lst type
is declared (and is complete) before the first usage. Thus lst::info() gets
implicitly instantiated (using the general definition provided in container.h)
when compiling the parser.cpp file, and libginac fails to link properly due
to mutliply defined symbols:

libtool: link: ccache i686-w64-mingw32-g++ -shared -nostdlib /usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/../lib/dllcrt2.o /usr/lib/gcc/i686-w64-mingw32/4.6/crtbegin.o  .libs/add.o .libs/archive.o .libs/basic.o .libs/clifford.o .libs/color.o .libs/constant.o .libs/ex.o .libs/excompiler.o .libs/expair.o .libs/expairseq.o .libs/exprseq.o .libs/fail.o .libs/factor.o .libs/fderivative.o .libs/function.o .libs/idx.o .libs/indexed.o .libs/inifcns.o .libs/inifcns_trans.o .libs/inifcns_gamma.o .libs/inifcns_nstdsums.o .libs/integral.o .libs/lst.o .libs/matrix.o .libs/mul.o .libs/ncmul.o .libs/normal.o .libs/numeric.o .libs/operators.o .libs/power.o .libs/registrar.o .libs/relational.o .libs/remember.o .libs/pseries.o .libs/print.o .libs/symbol.o .libs/symmetry.o .libs/tensor.o .libs/utils.o .libs/wildcard.o .libs/parse_binop_rhs.o .libs/parser.o .libs/parse_context.o .libs/default_reader.o .libs/lexer.o .libs/parser_compat.o .libs/mod_gcd.o .libs/cra_garner.o .libs/upoly_io.o .libs/gcd_uvar.o .libs/chinrem_gcd.o .libs/collect_vargs.o .libs/divide_in_z_p.o .libs/mgcd.o .libs/optimal_vars_finder.o .libs/pgcd.o .libs/primpart_content.o   -L/home/build/GiNaC.pkg/mk/ginac/../../build-tree/inst/all/opt/i686-w64-mingw32/ginac/lib -lcln -L/usr/lib/gcc/i686-w64-mingw32/4.6 -L/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/../lib -L/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt /usr/lib/gcc/i686-w64-mingw32/4.6/crtend.o  -O2 -march=i686 -Wl,--enable-auto-import -Wl,--export-all-symbols   -o .libs/libginac-2.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/libginac.dll.a
Creating library file: .libs/libginac.dll.a
.libs/parser.o: In function `_ZNK5GiNaC9containerISt4listE4infoEj':
/home/build/GiNaC.pkg/mk/ginac/../../ginac/ginac/container.h:359: multiple definition of `GiNaC::container<std::list>::info(unsigned int) const'
.libs/lst.o:/usr/include/c++/4.6/bits/vector.tcc:390: first defined here
collect2: ld returned 1 exit status
make[4]: *** [] Error 1
make[4]: Leaving directory `/home/build/GiNaC.pkg/build-tree/build/ginac-1.6.2/ginac'
make[3]: *** [all] Error 2

Thanks to Robert Durkacz for reporting.

7 years ago[BUGFIX] numeric::info(nonnegative): correctly handle complex numbers.
Alexei Sheplyakov [Tue, 28 Feb 2012 14:12:56 +0000 (16:12 +0200)]
[BUGFIX] numeric::info(nonnegative): correctly handle complex numbers.

numeric::info(info_flags::nonnegative) returns true for an arbitrary
complex number with non-zero imaginary part.

Thanks to Burcin Erocal for reporting.

7 years agoMerge branch 'master' of git://
Alexei Sheplyakov [Thu, 23 Feb 2012 15:44:00 +0000 (17:44 +0200)]
Merge branch 'master' of git://

7 years agoconfigure: correctly set rpath for linking with CLN ...
Alexei Sheplyakov [Thu, 23 Feb 2012 13:16:55 +0000 (15:16 +0200)]
configure: correctly set rpath for linking with CLN ...

... as to not break tests for libreadline and dlopen().


When using GCC 4.6 the configure script fails to find libreadline and
libdl, although both libraries are definitely installed. See for
more details.


Apparently GCC 4.6 dislikes the -R/the/path switch (libtool way to say
-Wl,-rpath,/the/path in a cross platform manner). Previous versions of
GCC used to ignore the -R switch, however, GCC 4.6 errors out instead.
Thus the configure script fails to detect readline and dlopen.


Set the rpath (for linking with CLN) using the compiler friendly syntax
(i.e. -Wl,-rpath -Wl,/the/path instead of -R/the/path).

7 years agoDocumentation: Update branch cut convention
Richard B. Kreckel [Thu, 8 Dec 2011 16:59:16 +0000 (16:59 +0000)]
Documentation: Update branch cut convention

Now that C++11 is out, there is no more need for oracling
about how it might eventually standardize the branch cuts of
elementary and inverse trigonometric and hyperbolic functions.

7 years agoPreparing for release 1.6.2. release_1-6-2
Jens Vollinga [Sun, 6 Nov 2011 14:10:50 +0000 (15:10 +0100)]
Preparing for release 1.6.2.

7 years agoParser can now read GiNaC lists (lst) defined by braces.
Jens Vollinga [Fri, 28 Oct 2011 19:09:33 +0000 (21:09 +0200)]
Parser can now read GiNaC lists (lst) defined by braces.
This commit completes the bug fix in commit

7 years agoFix warning "control reaches end of non-void function".
Richard Kreckel [Sat, 22 Oct 2011 19:37:13 +0000 (21:37 +0200)]
Fix warning "control reaches end of non-void function".

Being careful about this is required to pass the openSUSE build process.

7 years agoQuick and dirty bug fix for the parser to read GiNaC::lst again.
Jens Vollinga [Tue, 26 Jul 2011 18:39:29 +0000 (20:39 +0200)]
Quick and dirty bug fix for the parser to read GiNaC::lst again.
The parser only accepts lst in the form lst(...) not {...}, though.
Function prototype can now have a argument size of 0 to indicate
functions with an arbitrary number of arguments (like lst).

7 years agoFixed a bug in the code for subsitutions in indexed expressions.
Jens Vollinga [Fri, 22 Jul 2011 21:27:37 +0000 (23:27 +0200)]
Fixed a bug in the code for subsitutions in indexed expressions.
subs_options::no_index_renaming was ignored.
Thanks to Gerhard Hejc for reporting and suggesting a fix.

7 years agoPreparing for release. release_1-6-1
Jens Vollinga [Mon, 18 Jul 2011 19:24:09 +0000 (21:24 +0200)]
Preparing for release.

7 years agoBe more careful before converting to indexed.
Vladimir V. Kisil [Thu, 23 Jun 2011 14:20:59 +0000 (16:20 +0200)]
Be more careful before converting to indexed.

This patch makes GiNaC pass it's test suite when compiled with

7 years agoMade yyerror() string argument constant to avoid an compile error with
Jens Vollinga [Tue, 21 Jun 2011 19:36:16 +0000 (21:36 +0200)]
Made yyerror() string argument constant to avoid an compile error with
gcc 4.6.

7 years agoRelax assertion in clifford ctor.
Richard Kreckel [Sun, 12 Jun 2011 21:10:07 +0000 (23:10 +0200)]
Relax assertion in clifford ctor.

Class clifford can be constructed with an idx object, now, not just
with a varidx.

7 years agoCare about refcounts when reclaiming memory allocated for static objects.
Richard Kreckel [Tue, 31 May 2011 06:46:32 +0000 (08:46 +0200)]
Care about refcounts when reclaiming memory allocated for static objects.

With commit aff357309f6 we started freeing numeric flyweights when the library
usage count drops to zero. But that triggers assertions in basic::~basic
when compiled with -DDO_GINAC_ASSERT because these flyweights are still being
used by their matching ex objects (their refcount is still 1). Instead of
removing that assertion, let's just call the ex::~ex manually and let it do
the freeing.

7 years agoJanitorial commit.
Richard Kreckel [Fri, 27 May 2011 06:51:05 +0000 (08:51 +0200)]
Janitorial commit.

Remove some assertions that have been wrong since a while, in particular since
8ba901b532b, when we started to factor numerical factors from power objects.

Fix some broken indentation. Fix some comment errors. Remove unused variable.

7 years agoconfigure: correctly warn about missing flex and/or bison.
Alexei Sheplyakov [Wed, 25 May 2011 09:18:27 +0000 (12:18 +0300)]
configure: correctly warn about missing flex and/or bison.

This version correctly handles out of source builds, does not break
cross compilation, and contains no bashisms.

8 years ago[build] configure: don't abuse AC_CHECK_FILE. Unbreaks the cross-compilation.
Alexei Sheplyakov [Mon, 23 May 2011 21:37:09 +0000 (00:37 +0300)]
[build] configure: don't abuse AC_CHECK_FILE. Unbreaks the cross-compilation.

Checking for ginsh_parser.h in configure is not a good idea, since it
1) produces a bogus warning during an out of source build,
2) breaks cross-compilation.

Solution: just skip that bogus check (auto* tools do a similar check in
the run-time *for a reason*).

8 years agoPreparing for release 1.6.0. release_1-6-0
Jens Vollinga [Sun, 22 May 2011 19:43:39 +0000 (21:43 +0200)]
Preparing for release 1.6.0.

8 years agoThis patch fixes a bug on machines where char is unsigned by default, by
Jens Vollinga [Sun, 22 May 2011 14:19:17 +0000 (16:19 +0200)]
This patch fixes a bug on machines where char is unsigned by default, by
extending the type of clifford_max_label to include all 257 possible
return values. Thanks to Martin Guy for the bug report and patch.

8 years agoRemoved autogen stuff from the configuration.
Jens Vollinga [Sun, 22 May 2011 13:49:50 +0000 (15:49 +0200)]
Removed autogen stuff from the configuration.

8 years agoUpdate the supported platforms/compilers list.
Alexei Sheplyakov [Sun, 22 May 2011 12:17:35 +0000 (15:17 +0300)]
Update the supported platforms/compilers list.

8 years agoParser: don't bother to generate 3 (C++) functions with autogen.
Alexei Sheplyakov [Sun, 22 May 2011 12:15:42 +0000 (15:15 +0300)]
Parser: don't bother to generate 3 (C++) functions with autogen.

8 years agoFix a typo in the GCD testcase.
Alexei Sheplyakov [Sun, 22 May 2011 12:15:07 +0000 (15:15 +0300)]
Fix a typo in the GCD testcase.

8 years agoLimiting the costly symmetrization tests inside simplify_indexed() to
Jens Vollinga [Fri, 20 May 2011 23:30:08 +0000 (01:30 +0200)]
Limiting the costly symmetrization tests inside simplify_indexed() to
cases where at least one antisymmetric or cyclic non-free index is
involved. Thanks to P.G.Clark for reporting the problem.

8 years agoChanged naming convention for the library. Now, it is only
Jens Vollinga [Fri, 20 May 2011 21:30:38 +0000 (23:30 +0200)]
Changed naming convention for the library. Now, it is only
without the release version included (instead of, for
example). Since the previous commit broke the ABI, we are free to
implement this long planned change now.

8 years agoFixed a bug introduced in last commit.
Richard Kreckel [Fri, 20 May 2011 20:20:57 +0000 (22:20 +0200)]
Fixed a bug introduced in last commit.

Before, sqrt(2)*x used to be a polynomial in x.
Now, it is a polynomial in x again.

8 years agoFixed a bug in is_polynomial() that caused expressions like
Jens Vollinga [Fri, 20 May 2011 11:55:35 +0000 (13:55 +0200)]
Fixed a bug in is_polynomial() that caused expressions like
sqrt(x*x+1)*sqrt(x+1) to be wrongly identified as polynomials in x.
Thanks to Florent Hivert for reporting.

8 years ago./configure now gives more information/warnings about missing utilities.
Jens Vollinga [Fri, 20 May 2011 09:54:27 +0000 (11:54 +0200)]
./configure now gives more information/warnings about missing utilities.

8 years agoAvoiding a spurious missing ginac_parser.h error when doing a parallel
Jens Vollinga [Thu, 19 May 2011 08:29:14 +0000 (10:29 +0200)]
Avoiding a spurious missing ginac_parser.h error when doing a parallel
build (make -j..).

8 years agoThe patch improves the run time at the expense of using more RAM in some
Jens Vollinga [Thu, 19 May 2011 07:44:11 +0000 (09:44 +0200)]
The patch improves the run time at the expense of using more RAM in some
situations. Please note: it doesn't improve the actual algorithm
(iteration over all permutations). Thanks to Alexei Sheplyakov.

8 years agoFix mul::conjugate().
Richard Kreckel [Sun, 15 May 2011 16:40:44 +0000 (18:40 +0200)]
Fix mul::conjugate().

Overwrite conjugate() for mul objects because the base class's conjugate
function is incorrect at branch cuts when exponents are fractional (roots).
This has been reported as Sage #10964.

While at it, fix some funny indentation and remove unneeded tests.

8 years agoUpdated the news about changes done since the last release (2010-07-06).
Jens Vollinga [Tue, 10 May 2011 21:44:57 +0000 (23:44 +0200)]
Updated the news about changes done since the last release (2010-07-06).

8 years agoAdd conjugate() methods to functions cosh, sinh, tanh.
Vladimir V. Kisil [Sat, 9 Apr 2011 10:40:38 +0000 (12:40 +0200)]
Add conjugate() methods to functions cosh, sinh, tanh.

8 years ago[docs] Update the supported platforms/compilers list.
Alexei Sheplyakov [Thu, 3 Mar 2011 21:16:34 +0000 (23:16 +0200)]
[docs] Update the supported platforms/compilers list.