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.
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.
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 configure.ac and CMakeLists.txt).
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).
Alexei Sheplyakov [Sun, 29 May 2011 13:18:39 +0000 (16:18 +0300)]
[build] include config.h conditionally to not break non-autotools build.
Alexei Sheplyakov [Sun, 29 May 2011 12:26:37 +0000 (15:26 +0300)]
Convert function.pl 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.
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]: *** [libginac.la] 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.
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.
Alexei Sheplyakov [Thu, 23 Feb 2012 15:44:00 +0000 (17:44 +0200)]
Merge branch 'master' of git://github.com/AlexeiSheplyakov/GiNaC
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().
Problem:
When using GCC 4.6 the configure script fails to find libreadline and
libdl, although both libraries are definitely installed. See
http://www.ginac.de/pipermail/ginac-list/2012-January/001868.html for
more details.
Reason:
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.
Solution:
Set the rpath (for linking with CLN) using the compiler friendly syntax
(i.e. -Wl,-rpath -Wl,/the/path instead of -R/the/path).
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.
Jens Vollinga [Sun, 6 Nov 2011 14:10:50 +0000 (15:10 +0100)]
Preparing for release 1.6.2.
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
9a4f392521083d28e1c238e7898ab1d2ac5b73cd.
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.
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).
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.
Jens Vollinga [Mon, 18 Jul 2011 19:24:09 +0000 (21:24 +0200)]
Preparing for release.
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
-DDO_GINAC_ASSERT.
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.
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.
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.
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.
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.
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*).
Jens Vollinga [Sun, 22 May 2011 19:43:39 +0000 (21:43 +0200)]
Preparing for release 1.6.0.
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.
Jens Vollinga [Sun, 22 May 2011 13:49:50 +0000 (15:49 +0200)]
Removed autogen stuff from the configuration.
Alexei Sheplyakov [Sun, 22 May 2011 12:17:35 +0000 (15:17 +0300)]
Update the supported platforms/compilers list.
Alexei Sheplyakov [Sun, 22 May 2011 12:15:42 +0000 (15:15 +0300)]
Parser: don't bother to generate 3 (C++) functions with autogen.
Alexei Sheplyakov [Sun, 22 May 2011 12:15:07 +0000 (15:15 +0300)]
Fix a typo in the GCD testcase.
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.
Jens Vollinga [Fri, 20 May 2011 21:30:38 +0000 (23:30 +0200)]
Changed naming convention for the library. Now, it is only libginac.so
without the release version included (instead of libginac-1.5.so, for
example). Since the previous commit broke the ABI, we are free to
implement this long planned change now.
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.
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.
Jens Vollinga [Fri, 20 May 2011 09:54:27 +0000 (11:54 +0200)]
./configure now gives more information/warnings about missing utilities.
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..).
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.
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.
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).
Vladimir V. Kisil [Sat, 9 Apr 2011 10:40:38 +0000 (12:40 +0200)]
Add conjugate() methods to functions cosh, sinh, tanh.
Alexei Sheplyakov [Thu, 3 Mar 2011 21:16:34 +0000 (23:16 +0200)]
[docs] Update the supported platforms/compilers list.
Alexei Sheplyakov [Sat, 26 Feb 2011 08:39:29 +0000 (10:39 +0200)]
Parser: don't bother to generate 3 (C++) functions with autogen.
Alexei Sheplyakov [Wed, 9 Feb 2011 05:48:08 +0000 (07:48 +0200)]
[trivia] Fix a typo in the GCD testcase.
Richard Kreckel [Fri, 4 Feb 2011 07:59:28 +0000 (08:59 +0100)]
Extend copyright to 2011.
Richard Kreckel [Thu, 3 Feb 2011 23:20:48 +0000 (00:20 +0100)]
Fix compilation with clang.
This resolves some depending names that GCC generously accepts.
Richard Kreckel [Thu, 3 Feb 2011 23:14:00 +0000 (00:14 +0100)]
Don't try to tie the library version to the package version number.
Merge branch 'master' of git://github.com/AlexeiSheplyakov/GiNaC.tmp
Richard Kreckel [Thu, 3 Feb 2011 22:48:21 +0000 (23:48 +0100)]
Merge branch 'msvc.support' of git://github.com/AlexeiSheplyakov/GiNaC
* 'master.msvc.support' of git://github.com/AlexeiSheplyakov/GiNaC:
Omit extra qualification (as in struct foo f() vs foo f()).
[msvc] msvc cannot handle string constants above 16k
[msvc] Yet another compiler bug work around.
[msvc] Work around strange scoping and name mangling rules.
Add few defines for msvc (__func__, __alignof__).
symmetry::compare_same_type(): const-correctness fix
clifford: fix a few GCCisms (or, not).
Alexei Sheplyakov [Fri, 10 Dec 2010 17:06:17 +0000 (19:06 +0200)]
Don't try to tie the library version to the package version number.
Use curret:release:age to indicate ABI changes instead. Hard-code LT_RELEASE
to 1.5 to avoid spurious SONAME change (current code is binary-compatible
with GiNaC 1.5.8).
Alexei Sheplyakov [Fri, 10 Dec 2010 16:34:22 +0000 (18:34 +0200)]
Merge branch 'ginac_1-5' of git://ginac.de/ginac
Alexei Sheplyakov [Wed, 6 Jan 2010 17:55:43 +0000 (19:55 +0200)]
Use C style cast when converting void* into function pointer.
Building GiNaC 1.5.5 with GCC 3.4 fails with the following error:
libtool: compile: ccache g++-3.4 -DHAVE_CONFIG_H -I. -I../../ginac -I../config -I/home/pc7135/varg/target/x86_64-linux-gnu/include -O2 -g -Wall -pipe -MT builtin_fcns.lo -MD -MP -MF .deps/builtin_fcns.Tpo -c ../../ginac/parser/builtin_fcns.cpp -fPIC -DPIC -o .libs/builtin_fcns.o
../../ginac/parser/builtin_fcns.cpp: In function `GiNaC::ex (* GiNaC::encode_serial_as_reader_func(unsigned int))(const GiNaC::exvector&)':
/home/pc7135/varg/tmp/build/GiNaC/build-linux-gcc-3.4/ginac/../../ginac/parser/builtin_fcns.cpp|67| error: ISO C++ forbids casting between pointer-to-function and pointer-to-object
make[2]: *** [builtin_fcns.lo] Error 1
The C++98 standard [expr.reinterpret.cast] does not allow
reinterpret_cast<function_pointer>(void*)
reinterpret_cast<void*>(function_pointer)
But the ability to do so is important for a lot of practical uses. So soon
after the C++98 standard was approved, a language defect report was filed
on this topic, see
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195
The result is that compilers will be allowed to support reinterpret_cast
conversions of function pointers to other (pointers) types, and vice a versa.
Such conversions work with *current* compilers (GCC 4.x), but don't work
with older ones, hence this patch.
Jens Vollinga [Sun, 9 Aug 2009 21:38:48 +0000 (23:38 +0200)]
Added get_builtin_reader() that parses only the builtin GiNaC functions
and pow, sqrt, and power.
Jens Vollinga [Sun, 9 Aug 2009 21:27:10 +0000 (23:27 +0200)]
Fixed include of stdint.h (parser.cpp needs the header as well).
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.
Alexei Sheplyakov [Fri, 7 Aug 2009 20:22:18 +0000 (23:22 +0300)]
Fix the compliation error *for real*
Jens Vollinga [Fri, 31 Jul 2009 15:54:16 +0000 (17:54 +0200)]
Fixed memory leak.
Jens Vollinga [Fri, 31 Jul 2009 13:29:17 +0000 (15:29 +0200)]
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.
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.
Jens Vollinga [Fri, 31 Jul 2009 09:14:01 +0000 (11:14 +0200)]
Fixed cast that caused compile error on 64bit machines.
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
f38cbcd651246fb5c1294705d29399f3cbfddaf5
but without changing the ABI (so it can be used in ginac_1-5).
Alexei Sheplyakov [Thu, 9 Dec 2010 18:42:50 +0000 (20:42 +0200)]
Revert "Changed the parser such that it understands all defined functions"
This reverts commit
f38cbcd651246fb5c1294705d29399f3cbfddaf5, which
broke parsing user-defined classes.
Richard Kreckel [Thu, 9 Dec 2010 08:18:34 +0000 (09:18 +0100)]
Make symbol::name be initialized lazily.
This fixes symbol::get_name(), which returned an empty string instead of
"symbol" followed by the serial number if the symbol's name wasn't
specified in the constructor.
Thanks to Warren Weckesser for reporting this bug.
(cherry picked from commit
f5abf61d2cb1a1d1809d270a24fa098575b172c4)
Richard Kreckel [Thu, 9 Dec 2010 08:18:34 +0000 (09:18 +0100)]
Make symbol::name be initialized lazily.
This fixes symbol::get_name(), which returned an empty string instead of
"symbol" followed by the serial number if the symbol's name wasn't
specified in the constructor.
Thanks to Warren Weckesser for reporting this bug.
Alexei Sheplyakov [Fri, 3 Dec 2010 23:36:50 +0000 (00:36 +0100)]
[PATCH 2/2] chinrem_gcd: return correct integer content when GCD is a number.
This patch fixes a silly typo and makes chinrem_gcd work correctly with
polynomials which are "almost" (up to an integer coefficient) relatively
prime.
Thanks to Ernst Moritz Hahn for a bug report and a test case.
(cherry picked from commit
00507499530d90533cf029bd503be326d9018138)
Alexei Sheplyakov [Fri, 3 Dec 2010 23:35:06 +0000 (00:35 +0100)]
[PATCH 1/2] extract_integer_content: check for rational numbers properly.
Commit
3d09388a (titled as `[bugfix] chinrem_gcd: handle polynomials over
rationals properly.') broke extract_integer_content: now it always returns 1.
The check for rational `integer_contnent' introduced by that commit is wrong
(since integers is a subset of rationals). Rewrite the check proprerly.
(cherry picked from commit
f0fb303711b4334ce59f7da63bfa7cb49f46265f)
Alexei Sheplyakov [Fri, 3 Dec 2010 23:36:50 +0000 (00:36 +0100)]
[PATCH 2/2] chinrem_gcd: return correct integer content when GCD is a number.
This patch fixes a silly typo and makes chinrem_gcd work correctly with
polynomials which are "almost" (up to an integer coefficient) relatively
prime.
Thanks to Ernst Moritz Hahn for a bug report and a test case.
Alexei Sheplyakov [Fri, 3 Dec 2010 23:35:06 +0000 (00:35 +0100)]
[PATCH 1/2] extract_integer_content: check for rational numbers properly.
Commit
3d09388a (titled as `[bugfix] chinrem_gcd: handle polynomials over
rationals properly.') broke extract_integer_content: now it always returns 1.
The check for rational `integer_contnent' introduced by that commit is wrong
(since integers is a subset of rationals). Rewrite the check proprerly.
Jan Rheinländer [Sun, 26 Sep 2010 12:23:01 +0000 (12:23 +0000)]
Omit extra qualification (as in struct foo f() vs foo f()).
According to the Standard extra qualification like this
struct foo;
struct foo f();
is valid. However msvc does not accept such a code. So let's omit extra
qualification, as in
struct foo;
foo f();
(it's still valid C++) to make msvc happy.
Jan Rheinländer [Mon, 20 Sep 2010 13:39:15 +0000 (13:39 +0000)]
[msvc] msvc cannot handle string constants above 16k
So let's split them.
Jan Rheinländer [Mon, 20 Sep 2010 12:29:20 +0000 (12:29 +0000)]
[msvc] Yet another compiler bug work around.
msvc does not include the exprseq::info() method, giving unresolved symbols
when linking. Apparently adding a dummy function "fixes" the problem.
Jan Rheinländer [Mon, 20 Sep 2010 12:23:14 +0000 (12:23 +0000)]
[msvc] Work around strange scoping and name mangling rules.
1. msvc creates different symbols for a variable declared in
a namespace scope and (the same variable) in a class method
scope. That is,
// util.cpp
namespace GiNaC {
extern const ex _ex0; // [1]
}
// ex.h
namespace GiNaC {
class ex {
public:
bool is_zero() {
extern const ex _ex0;
// mangled name of _ex0 is different that of [1]
}
};
}
2. The mangled names for cv-qualified and cv-unqualified versions
of a type are different (which violates the requirements stated
in [basic.type.qualifier])
These msvc's "features" cause linking failures due to unresolved
external symbols.
Solution:
1. Declare variables (_ex0) in the GiNaC namespace scope (for msvc only).
2. Add corresponding cv-qualifier(s).
Jan Rheinländer [Mon, 20 Sep 2010 11:23:03 +0000 (11:23 +0000)]
Add few defines for msvc (__func__, __alignof__).
msvc does not provide the __func__ macro (which is required by C99,
btw). Also it has __alignof instead of __alignof__.
Jan Rheinländer [Mon, 20 Sep 2010 11:16:47 +0000 (11:16 +0000)]
symmetry::compare_same_type(): const-correctness fix
The method in question is const, therefore one should use const_iterator
to access indices. Some compilers (for instance, msvc) are very strict
about this, and won't accept (invalid) code using non-const iterator.
Jan Rheinländer [Mon, 20 Sep 2010 11:12:10 +0000 (11:12 +0000)]
clifford: fix a few GCCisms (or, not).
Some compilers (in particular, msvc) choke on `or' and `not'. Use
standard ! and || instead.
Alexei Sheplyakov [Tue, 23 Nov 2010 16:45:52 +0000 (17:45 +0100)]
[bugfix] chinrem_gcd: handle polynomials over rationals properly.
* extract_integer_content():
integer_content() can also return a rational number, e.g if the expression
is a polynomial over rationals (in this case expr/content is polynomial
over integers with integer content being 1). Therefore check if
integer_content() is really an integer (and if it's not just return 1,
GCD for polynomials over a field is defined up to arbitrary element of
the field).
This fixes possible segfault when computing GCD of polynomials over
rationals (this is not theoretical, see the added test case).
Thanks to Ernst Moritz Hahn for reporting this bug.
(cherry picked from commit
3d09388a8ea144a19949c216fae43ccba92e47aa)
Alexei Sheplyakov [Tue, 23 Nov 2010 16:45:52 +0000 (17:45 +0100)]
[bugfix] chinrem_gcd: handle polynomials over rationals properly.
* extract_integer_content():
integer_content() can also return a rational number, e.g if the expression
is a polynomial over rationals (in this case expr/content is polynomial
over integers with integer content being 1). Therefore check if
integer_content() is really an integer (and if it's not just return 1,
GCD for polynomials over a field is defined up to arbitrary element of
the field).
This fixes possible segfault when computing GCD of polynomials over
rationals (this is not theoretical, see the added test case).
Thanks to Ernst Moritz Hahn for reporting this bug.
Alexei Sheplyakov [Tue, 9 Nov 2010 07:27:47 +0000 (08:27 +0100)]
power::series(): handle someg (trivial) singularities of the exponent...
... so GiNaC can expand expressions like
cos(x)^(sin(x)/x) // (x -> 0)
(1 + x)^(1/x) // x -> 0
and so on.
[Reported by Camille Gillot.]
(cherry picked from commit
079c558d4f9758cd2777a2808a02d64cb1f70c8e)
Alexei Sheplyakov [Tue, 9 Nov 2010 07:27:47 +0000 (08:27 +0100)]
power::series(): handle someg (trivial) singularities of the exponent...
... so GiNaC can expand expressions like
cos(x)^(sin(x)/x) // (x -> 0)
(1 + x)^(1/x) // x -> 0
and so on.
[Reported by Camille Gillot.]
Alexei Sheplyakov [Sat, 9 Oct 2010 16:39:41 +0000 (18:39 +0200)]
mul: algebraic_subs_mul(), has(): don't write beyond the end of array
algebraic_match_mul_with_mul() iterates over operands of mul, that is
for (size_t i=0; i<e.nops(); ++i)
However, the size of arrays (`vectors' in STL speak) passed to this
function is seq.size(), which is nops() - 1 for any mul object. Thus
algebraic_match_mul_with_mul() accesses beyond the arrays limit. Usually
it's not a problem, since any reasonable implementation of std::vector<bool>
packs booleans into ints (or longs). However, some STL implementations
(in particular, the one shipped with msvc) are more picky, and access
beyond the vector<bool> limits results in a segfault. Therefore let's
play safe and allocate proper number of elements (that is, nops()) for
those arrays (subsed and currsubsed).
(cherry picked from commit
cbb93fadabbd56ba006902967b15b2b2aebb037c)
Alexei Sheplyakov [Sat, 9 Oct 2010 16:39:41 +0000 (18:39 +0200)]
mul: algebraic_subs_mul(), has(): don't write beyond the end of array
algebraic_match_mul_with_mul() iterates over operands of mul, that is
for (size_t i=0; i<e.nops(); ++i)
However, the size of arrays (`vectors' in STL speak) passed to this
function is seq.size(), which is nops() - 1 for any mul object. Thus
algebraic_match_mul_with_mul() accesses beyond the arrays limit. Usually
it's not a problem, since any reasonable implementation of std::vector<bool>
packs booleans into ints (or longs). However, some STL implementations
(in particular, the one shipped with msvc) are more picky, and access
beyond the vector<bool> limits results in a segfault. Therefore let's
play safe and allocate proper number of elements (that is, nops()) for
those arrays (subsed and currsubsed).
Alexei Sheplyakov [Mon, 4 Oct 2010 07:21:05 +0000 (09:21 +0200)]
Avoid infinite loop when unarchiving realsymbol and possymbol.
symbol::read_archive(): explicitly set status_flags::evaluated (and
status_flags::expanded) on object being unarchived. These flags get
reset by basic::operator=(const basic&) for realsymbol and possymbol,
and nothing sets (except symbol ctor), so automatic evaluation never
terminates (or rather, terminates due to a stack overflow). Therefore
it's necessary need to set status_flags::evaluated explicitly.
Thanks to Markus Fröb for a bugreport and a test case.
(cherry picked from commit
e99d0d58c1bbaa8ee73e4a90a90aa1086f2f813d)
Alexei Sheplyakov [Mon, 4 Oct 2010 07:21:05 +0000 (09:21 +0200)]
Avoid infinite loop when unarchiving realsymbol and possymbol.
symbol::read_archive(): explicitly set status_flags::evaluated (and
status_flags::expanded) on object being unarchived. These flags get
reset by basic::operator=(const basic&) for realsymbol and possymbol,
and nothing sets (except symbol ctor), so automatic evaluation never
terminates (or rather, terminates due to a stack overflow). Therefore
it's necessary need to set status_flags::evaluated explicitly.
Thanks to Markus Fröb for a bugreport and a test case.
Alexei Sheplyakov [Sat, 8 Aug 2009 10:03:38 +0000 (13:03 +0300)]
ncmul::eval(): don't write beyond the end of the vector.
Richard Kreckel [Wed, 22 Sep 2010 22:40:38 +0000 (00:40 +0200)]
Make sure add::eval() collects all numeric terms.
Apparently, add::eval() assumed that none of the elements of its epvector
has a numeric rest. However, nothing guarantees that -- in particular
evalchildren() doesn't (and actually cannot) do so. Since there are many
places where a new add is constructed directly from an epvector, enforcing
this doesn't make sense either. One example where it did fail was found by
Burgin Erocal: real_part(1+2*(sqrt(2)+1)*(sqrt(2)-1)) returned 1+2*1, not 3.
Thanks to Burcin Erocal for reporting this bug.
(cherry picked from commit
e08cda1854bdb82f6706ec269233577690ae00e4)
Richard Kreckel [Wed, 22 Sep 2010 22:40:38 +0000 (00:40 +0200)]
Make sure add::eval() collects all numeric terms.
Apparently, add::eval() assumed that none of the elements of its epvector
has a numeric rest. However, nothing guarantees that -- in particular
evalchildren() doesn't (and actually cannot) do so. Since there are many
places where a new add is constructed directly from an epvector, enforcing
this doesn't make sense either. One example where it did fail was found by
Burgin Erocal: real_part(1+2*(sqrt(2)+1)*(sqrt(2)-1)) returned 1+2*1, not 3.
Thanks to Burcin Erocal for reporting this bug.
Richard Kreckel [Wed, 15 Sep 2010 07:11:57 +0000 (09:11 +0200)]
Be more careful about final top-level substitution.
Substituting x==log(x) in exp(x) erroneously returned log(x) because of a
final subst(x==log(x)) after having eval'ed exp(log(x)) -> x. This final
substitution is wrong in the general case. On the other hand, the intent
is to syntactically substitute functions of a given kind etc. This patch
suppresses the final top-level substitution unless the intermediate result
is a container.
Thanks to Burcin Erocal for reporting this bug (originally described by
Kees van Schaik on sage-support@googlegroops.com).
Richard Kreckel [Wed, 15 Sep 2010 07:11:57 +0000 (09:11 +0200)]
Be more careful about final top-level substitution.
Substituting x==log(x) in exp(x) erroneously returned log(x) because of a
final subst(x==log(x)) after having eval'ed exp(log(x)) -> x. This final
substitution is wrong in the general case. On the other hand, the intent
is to syntactically substitute functions of a given kind etc. This patch
suppresses the final top-level substitution unless the intermediate result
is a container.
Thanks to Burcin Erocal for reporting this bug (originally described by
Kees van Schaik on sage-support@googlegroops.com).
Richard Kreckel [Mon, 13 Sep 2010 20:39:05 +0000 (22:39 +0200)]
Fix autoconf warning about AC_INIT use.
Apparently, autoconf doesn't like the angle brackets in the bug-report
argument any more. It comlains "not a literal: <ginac-list@ginac.de>".
So let's remove it. And while at it, also provide tarname and url
arguments.
Richard Kreckel [Mon, 13 Sep 2010 20:39:05 +0000 (22:39 +0200)]
Fix autoconf warning about AC_INIT use.
Apparently, autoconf doesn't like the angle brackets in the bug-report
argument any more. It comlains "not a literal: <ginac-list@ginac.de>".
So let's remove it. And while at it, also provide tarname and url
arguments.
Alexei Sheplyakov [Sun, 22 Aug 2010 20:09:18 +0000 (23:09 +0300)]
power::eval(): fix several memory leaks
While working on fsolve bug I've noticed the following in valgrind log:
==17455== 136 (56 direct, 80 indirect) bytes in 1 blocks are definitely lost in loss record 16 of 19
==17455== at 0x4C249C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==17455== by 0x516CA70: GiNaC::power::eval(int) const (power.cpp:540)
==17455== by 0x4FC1E39: GiNaC::ex::construct_from_basic(GiNaC::basic const&) (ex.cpp:310)
==17455== by 0x406FBF: main (ex.h:255)
Heap allocated objects definitely need the status_flags::dyncallocated flag.
(cherry picked from commit
5f896fa7f59bbce727e4bba23df9c4bbdbb55c29)
Alexei Sheplyakov [Sat, 21 Aug 2010 16:13:29 +0000 (19:13 +0300)]
fsolve: avoid useless numerical evaluation of the function
Don't compute f(x) if new x is outside of the interval. We don't need that
value anyway, and the function might be difficult to compute numerically or
even ill defined outside the interval.
As a result fsolve is able to find root(s) of some weird functions.
For example
fsolve((1/(sqrt(2*Pi)))*integral(t, 0, x, exp(-1/2*t^2)) == 0.5, x, 0, 100)
actually works now.
(cherry picked from commit
beeb0818e9cdb1b5de0ba2754286ad7bb2a9d032)
Alexei Sheplyakov [Thu, 19 Aug 2010 08:10:25 +0000 (11:10 +0300)]
integral::evalf(): don't attempt to ignore problems.
Don't ignore exceptions thrown by numerical integration routine.
In general, the code like this
try {
// blah-blah
} catch (std::exception& err) { }
is just plain evil. Case in the point:
fsolve((1/(sqrt(2*Pi)))*integral(t,0,x,exp(-1/2*t^2))==0.5,x,0,100)
(cherry picked from commit
515171f0bcd42099c266713c3d605cd92cedd2e2)
Alexei Sheplyakov [Wed, 18 Aug 2010 21:07:13 +0000 (00:07 +0300)]
fsolve: check if evalf() return value is actually a number.
Fixes the segfault triggered by
fsolve((1/(sqrt(2*Pi)))*integral(t,0,x,exp(-1/2*t^2))==0.5,x,0,100)
In general, ex_to is unsafe, and should be used only after proper checks.
evalf() may return non-numeric expression for various reasons (bad
convergence, floating point over- or underflow, out of memory, etc).
So let's add missing checks.
Thanks to Ernst Moritz Hahn for a bug report.
(cherry picked from commit
9993a7aac97abf383624fc5dae4beecb29531fbd)
Alexei Sheplyakov [Sun, 22 Aug 2010 20:09:18 +0000 (23:09 +0300)]
power::eval(): fix several memory leaks
While working on fsolve bug I've noticed the following in valgrind log:
==17455== 136 (56 direct, 80 indirect) bytes in 1 blocks are definitely lost in loss record 16 of 19
==17455== at 0x4C249C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==17455== by 0x516CA70: GiNaC::power::eval(int) const (power.cpp:540)
==17455== by 0x4FC1E39: GiNaC::ex::construct_from_basic(GiNaC::basic const&) (ex.cpp:310)
==17455== by 0x406FBF: main (ex.h:255)
Heap allocated objects definitely need the status_flags::dyncallocated flag.
Alexei Sheplyakov [Sat, 21 Aug 2010 16:13:29 +0000 (19:13 +0300)]
fsolve: avoid useless numerical evaluation of the function
Don't compute f(x) if new x is outside of the interval. We don't need that
value anyway, and the function might be difficult to compute numerically or
even ill defined outside the interval.
As a result fsolve is able to find root(s) of some weird functions.
For example
fsolve((1/(sqrt(2*Pi)))*integral(t, 0, x, exp(-1/2*t^2)) == 0.5, x, 0, 100)
actually works now.
Alexei Sheplyakov [Thu, 19 Aug 2010 08:10:25 +0000 (11:10 +0300)]
integral::evalf(): don't attempt to ignore problems.
Don't ignore exceptions thrown by numerical integration routine.
In general, the code like this
try {
// blah-blah
} catch (std::exception& err) { }
is just plain evil. Case in the point:
fsolve((1/(sqrt(2*Pi)))*integral(t,0,x,exp(-1/2*t^2))==0.5,x,0,100)
Alexei Sheplyakov [Wed, 18 Aug 2010 21:07:13 +0000 (00:07 +0300)]
fsolve: check if evalf() return value is actually a number.
Fixes the segfault triggered by
fsolve((1/(sqrt(2*Pi)))*integral(t,0,x,exp(-1/2*t^2))==0.5,x,0,100)
In general, ex_to is unsafe, and should be used only after proper checks.
evalf() may return non-numeric expression for various reasons (bad
convergence, floating point over- or underflow, out of memory, etc).
So let's add missing checks.
Thanks to Ernst Moritz Hahn for a bug report.
Jens Vollinga [Tue, 6 Jul 2010 13:30:23 +0000 (15:30 +0200)]
Preparing for release 1.5.8.
Jens Vollinga [Tue, 6 Jul 2010 12:38:36 +0000 (14:38 +0200)]
Removed trailing spaces.
(cherry picked from commit
dbde7117e88ba61597d6fee18615fe396c291a87)
Jens Vollinga [Tue, 6 Jul 2010 12:38:36 +0000 (14:38 +0200)]
Removed trailing spaces.