exam_archive.cpp (ginac-1.7.11.tar.bz2) | : | exam_archive.cpp (ginac-1.8.0.tar.bz2) | ||
---|---|---|---|---|
skipping to change at line 30 | skipping to change at line 30 | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 U SA | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 U SA | |||
*/ | */ | |||
#include "ginac.h" | #include "ginac.h" | |||
using namespace GiNaC; | using namespace GiNaC; | |||
#include <fstream> | #include <fstream> | |||
#include <iostream> | #include <iostream> | |||
using namespace std; | using namespace std; | |||
#include <cln/cln.h> | ||||
unsigned exam_archive() | unsigned exam_archive() | |||
{ | { | |||
unsigned result = 0; | unsigned result = 0; | |||
cout << "examining archiving system" << flush; | ||||
symbol x("x"), y("y"), mu("mu"), dim("dim", "\\Delta"); | symbol x("x"), y("y"), mu("mu"), dim("dim", "\\Delta"); | |||
ex e, f; | ex e, f; | |||
// This expression is complete nonsense but it contains every type of | // This expression is complete nonsense but it contains every type of | |||
// GiNaC object | // GiNaC object | |||
e = -42 * x * pow(y, sin(y*Catalan)) * dirac_ONE() | e = -42 * x * pow(y, sin(y*Catalan)) * dirac_ONE() | |||
* epsilon_tensor(idx(fail(), 3), idx(0, 3), idx(y/2, 3)) | * epsilon_tensor(idx(fail(), 3), idx(0, 3), idx(y/2, 3)) | |||
+ lorentz_g( | + lorentz_g( | |||
varidx(lst{x, -11*y, acos(2*x).series(x==3-5*I, 3)} * color_ONE() | varidx(lst{x, -11*y, acos(2*x).series(x==3-5*I, 3)} * color_ONE() | |||
* metric_tensor(varidx(log(cos(128.0/(x*y))), 5), varidx(2, 5)), zeta(3)), | * metric_tensor(varidx(log(cos(128.0/(x*y))), 5), varidx(2, 5)), zeta(3)), | |||
skipping to change at line 79 | skipping to change at line 79 | |||
ex difference = (f - e).expand(); | ex difference = (f - e).expand(); | |||
if (!difference.is_zero()) { | if (!difference.is_zero()) { | |||
clog << "archiving/unarchiving " << e << endl | clog << "archiving/unarchiving " << e << endl | |||
<< "erroneously returned " << f << endl; | << "erroneously returned " << f << endl; | |||
++result; | ++result; | |||
} | } | |||
return result; | return result; | |||
} | } | |||
/** numeric::archive used to fail if the real part of a complex number | ||||
* is a rational number and the imaginary part is a floating point one. */ | ||||
unsigned numeric_complex_bug() | ||||
{ | ||||
using namespace cln; | ||||
struct archive_unarchive_check | ||||
{ | ||||
unsigned operator()(const cl_N& n) const | ||||
{ | ||||
ex e = numeric(n); | ||||
archive ar; | ||||
ar.archive_ex(e, "test"); | ||||
ex check = ar.unarchive_ex(lst{}, "test"); | ||||
if (!check.is_equal(e)) { | ||||
clog << __FILE__ << ':' << __LINE__ << ": expecte | ||||
d: " << e << ", got " << check << endl; | ||||
return 1; | ||||
} | ||||
return 0; | ||||
} | ||||
} checker; | ||||
unsigned result = 0; | ||||
const cl_I one(1); | ||||
const cl_R three_fp = cl_float(3.0); | ||||
std::vector<cl_N> numbers = { | ||||
complex(one, one), | ||||
complex(one, three_fp), | ||||
complex(three_fp, one), | ||||
complex(three_fp, three_fp) | ||||
}; | ||||
for (auto & n : numbers) { | ||||
result += checker(n); | ||||
} | ||||
return result; | ||||
} | ||||
int main(int argc, char** argv) | int main(int argc, char** argv) | |||
{ | { | |||
return exam_archive(); | unsigned result = 0; | |||
cout << "examining archiving system" << flush; | ||||
result += exam_archive(); cout << '.' << flush; | ||||
result += numeric_complex_bug(); cout << '.' << flush; | ||||
return result; | ||||
} | } | |||
End of changes. 4 change blocks. | ||||
3 lines changed or deleted | 46 lines changed or added |