diff --git a/dynare++/tl/testing/factory.cc b/dynare++/tl/testing/factory.cc index a2fbc1842..10fd23ef6 100644 --- a/dynare++/tl/testing/factory.cc +++ b/dynare++/tl/testing/factory.cc @@ -3,52 +3,49 @@ #include "factory.hh" -#include -#include - void Factory::init(const Symmetry &s, const IntSequence &nvs) { IntSequence sym(s); - long int seed = sym[0]; + decltype(mtgen)::result_type seed = sym[0]; seed = 256*seed + nvs[0]; if (sym.size() > 1) seed = 256*seed + sym[1]; if (nvs.size() > 1) seed = 256*seed + nvs[0]; - srand48(seed); + mtgen.seed(seed); } void Factory::init(int dim, int nv) { - long int seed = dim; + decltype(mtgen)::result_type seed = dim; seed = 256*seed + nv; - srand48(seed); + mtgen.seed(seed); } double -Factory::get() const +Factory::get() { - return 1.0*(drand48()-0.5); + return dis(mtgen)-0.5; } void -Factory::fillMatrix(TwoDMatrix &m) const +Factory::fillMatrix(TwoDMatrix &m) { Vector &d = m.getData(); for (int i = 0; i < d.length(); i++) d[i] = get(); } -Vector * +Vector Factory::makeVector(int n) { init(n, n*n); - auto *v = new Vector(n); + Vector v(n); for (int i = 0; i < n; i++) - (*v)[i] = get(); + v[i] = get(); return v; } diff --git a/dynare++/tl/testing/factory.hh b/dynare++/tl/testing/factory.hh index f7b78c21a..dca4e5009 100644 --- a/dynare++/tl/testing/factory.hh +++ b/dynare++/tl/testing/factory.hh @@ -4,6 +4,8 @@ #ifndef FACTORY_H #define FACTORY_H +#include + #include "symmetry.hh" #include "int_sequence.hh" #include "twod_matrix.hh" @@ -13,11 +15,14 @@ class Factory { + std::mt19937 mtgen; + std::uniform_real_distribution<> dis; + void init(const Symmetry &s, const IntSequence &nvs); void init(int dim, int nv); - void fillMatrix(TwoDMatrix &m) const; + void fillMatrix(TwoDMatrix &m); public: - double get() const; + double get(); // this can be used with UGSTensor, FGSTensor template _Ttype * @@ -47,25 +52,23 @@ public: int symnum = nvs.size(); auto *res = new _Ctype(symnum); for (int dim = 1; dim <= maxdim; dim++) - { - if (symnum == 1) - { - // full symmetry - Symmetry sym{dim}; - auto *t = make<_Ttype>(r, sym, nvs); - res->insert(t); - } - else - { - // general symmetry - for (int i = 0; i <= dim; i++) - { - Symmetry sym{i, dim-i}; - auto *t = make<_Ttype>(r, sym, nvs); - res->insert(t); - } - } - } + if (symnum == 1) + { + // full symmetry + Symmetry sym{dim}; + auto *t = make<_Ttype>(r, sym, nvs); + res->insert(t); + } + else + { + // general symmetry + for (int i = 0; i <= dim; i++) + { + Symmetry sym{i, dim-i}; + auto *t = make<_Ttype>(r, sym, nvs); + res->insert(t); + } + } return res; } @@ -82,7 +85,7 @@ public: return p; } - Vector *makeVector(int n); + Vector makeVector(int n); }; #endif diff --git a/dynare++/tl/testing/tests.cc b/dynare++/tl/testing/tests.cc index d3fa67673..623aefdb6 100644 --- a/dynare++/tl/testing/tests.cc +++ b/dynare++/tl/testing/tests.cc @@ -431,25 +431,25 @@ bool TestRunnable::folded_contraction(int r, int nv, int dim) { Factory fact; - Vector *x = fact.makeVector(nv); + Vector x{fact.makeVector(nv)}; auto *forig = fact.make(r, nv, dim); auto *f = new FFSTensor(*forig); clock_t ctime = clock(); for (int d = dim-1; d > 0; d--) { - FFSTensor *fnew = new FFSTensor(*f, ConstVector(*x)); + FFSTensor *fnew = new FFSTensor(*f, ConstVector(x)); delete f; f = fnew; } ctime = clock() - ctime; Vector res(forig->nrows()); res.zeros(); - f->multaVec(res, *x); + f->multaVec(res, x); UFSTensor u(*forig); clock_t utime = clock(); - URSingleTensor ux(*x, dim); + URSingleTensor ux(x, dim); Vector v(u.nrows()); v.zeros(); u.multaVec(v, ux.getData()); @@ -464,7 +464,6 @@ TestRunnable::folded_contraction(int r, int nv, int dim) << "\terror norm1: " << v.getNorm1() << '\n'; delete f; - delete x; return (v.getMax() < 1.e-10); } @@ -473,7 +472,7 @@ bool TestRunnable::unfolded_contraction(int r, int nv, int dim) { Factory fact; - Vector *x = fact.makeVector(nv); + Vector x{fact.makeVector(nv)}; auto *forig = fact.make(r, nv, dim); UFSTensor uorig(*forig); @@ -482,17 +481,17 @@ TestRunnable::unfolded_contraction(int r, int nv, int dim) clock_t ctime = clock(); for (int d = dim-1; d > 0; d--) { - UFSTensor *unew = new UFSTensor(*u, ConstVector(*x)); + UFSTensor *unew = new UFSTensor(*u, ConstVector(x)); delete u; u = unew; } ctime = clock() - ctime; Vector res(uorig.nrows()); res.zeros(); - u->multaVec(res, *x); + u->multaVec(res, x); clock_t utime = clock(); - URSingleTensor ux(*x, dim); + URSingleTensor ux(x, dim); Vector v(uorig.nrows()); v.zeros(); uorig.multaVec(v, ux.getData()); @@ -507,7 +506,6 @@ TestRunnable::unfolded_contraction(int r, int nv, int dim) << "\terror norm1: " << v.getNorm1() << '\n'; delete u; - delete x; return (v.getMax() < 1.e-10); } @@ -516,7 +514,7 @@ bool TestRunnable::poly_eval(int r, int nv, int maxdim) { Factory fact; - Vector *x = fact.makeVector(nv); + Vector x{fact.makeVector(nv)}; Vector out_ft(r); out_ft.zeros(); @@ -532,13 +530,13 @@ TestRunnable::poly_eval(int r, int nv, int maxdim) FTensorPolynomial *fp = fact.makePoly(r, nv, maxdim); clock_t ft_cl = clock(); - fp->evalTrad(out_ft, *x); + fp->evalTrad(out_ft, x); ft_cl = clock() - ft_cl; std::cout << "\ttime for folded power eval: " << static_cast(ft_cl)/CLOCKS_PER_SEC << '\n'; clock_t fh_cl = clock(); - fp->evalHorner(out_fh, *x); + fp->evalHorner(out_fh, x); fh_cl = clock() - fh_cl; std::cout << "\ttime for folded horner eval: " << static_cast(fh_cl)/CLOCKS_PER_SEC << '\n'; @@ -548,13 +546,13 @@ TestRunnable::poly_eval(int r, int nv, int maxdim) } clock_t ut_cl = clock(); - up->evalTrad(out_ut, *x); + up->evalTrad(out_ut, x); ut_cl = clock() - ut_cl; std::cout << "\ttime for unfolded power eval: " << static_cast(ut_cl)/CLOCKS_PER_SEC << '\n'; clock_t uh_cl = clock(); - up->evalHorner(out_uh, *x); + up->evalHorner(out_uh, x); uh_cl = clock() - uh_cl; std::cout << "\ttime for unfolded horner eval: " << static_cast(uh_cl)/CLOCKS_PER_SEC << '\n'; @@ -571,7 +569,6 @@ TestRunnable::poly_eval(int r, int nv, int maxdim) << "\tunfolded horner error norm max: " << max_uh << '\n'; delete up; - delete x; return (max_ft+max_fh+max_uh < 1.0e-10); }