[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] (no subject)
From: |
Konstantinos Poulios |
Subject: |
[Getfem-commits] (no subject) |
Date: |
Wed, 20 Feb 2019 03:33:51 -0500 (EST) |
branch: master
commit 05f69a3e91911c0739c03b27ab9360b731aba604
Author: Konstantinos Poulios <address@hidden>
Date: Wed Feb 20 08:58:49 2019 +0100
Code simplifications and whitespace
---
src/getfem/bgeot_tensor.h | 20 +-
src/getfem/getfem_generic_assembly.h | 14 +-
.../getfem_generic_assembly_compile_and_exec.h | 10 +-
src/getfem/getfem_model_solvers.h | 238 ++++-----
src/getfem_generic_assembly_interpolation.cc | 8 +-
src/getfem_generic_assembly_semantic.cc | 3 +-
src/getfem_generic_assembly_workspace.cc | 76 ++-
src/getfem_mesh.cc | 2 +-
src/getfem_model_solvers.cc | 24 +-
src/getfem_models.cc | 109 ++--
src/gmm/gmm_vector.h | 570 ++++++++++-----------
11 files changed, 526 insertions(+), 548 deletions(-)
diff --git a/src/getfem/bgeot_tensor.h b/src/getfem/bgeot_tensor.h
index 43d779d..f424c2d 100644
--- a/src/getfem/bgeot_tensor.h
+++ b/src/getfem/bgeot_tensor.h
@@ -62,7 +62,7 @@ namespace bgeot {
} else resize(1);
}
- void reset(void) { std::fill(begin(), end(), 0); }
+ void reset() { std::fill(begin(), end(), 0); }
inline bool finished(const multi_index &m) {
if (m.size() == 0)
@@ -83,7 +83,7 @@ namespace bgeot {
: std::vector<size_type>(4)
{ (*this)[0] = i; (*this)[1] = j; (*this)[2] = k; (*this)[3] = l; }
- multi_index(void) {}
+ multi_index() {}
bool is_equal(const multi_index &m) const {
if (this->size() != m.size()) return false;
@@ -92,7 +92,7 @@ namespace bgeot {
return true;
}
- size_type total_size(void) const {
+ size_type total_size() const {
size_type s = 1;
for (size_type k = 0; k < this->size(); ++k) s *= (*this)[k];
return s;
@@ -194,10 +194,10 @@ namespace bgeot {
return *(this->begin() + d);
}
- inline size_type size(void) const { return std::vector<T>::size(); }
+ inline size_type size() const { return std::vector<T>::size(); }
inline size_type size(size_type i) const { return sizes_[i]; }
- inline const multi_index &sizes(void) const { return sizes_; }
- inline size_type order(void) const { return sizes_.size(); }
+ inline const multi_index &sizes() const { return sizes_; }
+ inline size_type order() const { return sizes_.size(); }
void init(const multi_index &c) {
auto it = c.begin();
@@ -236,7 +236,7 @@ namespace bgeot {
}
inline void adjust_sizes(const multi_index &mi) { init(mi); }
- inline void adjust_sizes(void) { init(); }
+ inline void adjust_sizes() { init(); }
inline void adjust_sizes(size_type i) { init(i); }
inline void adjust_sizes(size_type i, size_type j) { init(i, j); }
inline void adjust_sizes(size_type i, size_type j, size_type k)
@@ -294,8 +294,8 @@ namespace bgeot {
+ sizeof(*this) + sizes_.memsize() + coeff.memsize();
}
- std::vector<T> &as_vector(void) { return *this; }
- const std::vector<T> &as_vector(void) const { return *this; }
+ std::vector<T> &as_vector() { return *this; }
+ const std::vector<T> &as_vector() const { return *this; }
tensor<T>& operator +=(const tensor<T>& w)
@@ -325,7 +325,7 @@ namespace bgeot {
tensor(const multi_index &c) { init(c); }
tensor(size_type i, size_type j, size_type k, size_type l)
{ init(multi_index(i, j, k, l)); }
- tensor(void) {}
+ tensor() {}
};
template<class T> void tensor<T>::mat_transp_reduction
diff --git a/src/getfem/getfem_generic_assembly.h
b/src/getfem/getfem_generic_assembly.h
index 5dd045c..5b91109 100644
--- a/src/getfem/getfem_generic_assembly.h
+++ b/src/getfem/getfem_generic_assembly.h
@@ -108,7 +108,7 @@ namespace getfem {
std::map<var_trans_pair, base_tensor> &derivatives,
bool compute_derivatives) const = 0;
virtual void finalize() const = 0;
- virtual std::string expression(void) const { return std::string(); }
+ virtual std::string expression() const { return std::string(); }
virtual ~virtual_interpolate_transformation() {}
};
@@ -143,9 +143,9 @@ namespace getfem {
public:
- const mesh_im &mim(void) const { return mim_; }
+ const mesh_im &mim() const { return mim_; }
virtual const mesh_region &give_region(const mesh &m,
- size_type cv, short_type f) const = 0;
+ size_type cv, short_type f) const = 0;
// virtual void init(const ga_workspace &workspace) const = 0;
// virtual void finalize() const = 0;
@@ -367,7 +367,7 @@ namespace getfem {
const mesh_region &rg,
const std::string &expr, size_type add_derivative_order,
bool scalar_expr, size_type for_interpolation,
- const std::string varname_interpolation);
+ const std::string varname_interpolation);
std::shared_ptr<model_real_sparse_matrix> K;
@@ -409,7 +409,7 @@ namespace getfem {
size_type add_expression(const std::string &expr, const mesh_im &mim,
const mesh_region &rg=mesh_region::all_convexes(),
size_type add_derivative_order = 2,
- const std::string &secondary_dom = "");
+ const std::string &secondary_dom = "");
/* Internal use */
void add_function_expression(const std::string &expr);
/* Internal use */
@@ -448,9 +448,9 @@ namespace getfem {
const model_real_plain_vector &VV);
bool used_variables(std::vector<std::string> &vl,
- std::vector<std::string> &vl_test1,
+ std::vector<std::string> &vl_test1,
std::vector<std::string> &vl_test2,
- std::vector<std::string> &dl,
+ std::vector<std::string> &dl,
size_type order);
bool variable_exists(const std::string &name) const;
diff --git a/src/getfem/getfem_generic_assembly_compile_and_exec.h
b/src/getfem/getfem_generic_assembly_compile_and_exec.h
index e64a1d5..36588f5 100644
--- a/src/getfem/getfem_generic_assembly_compile_and_exec.h
+++ b/src/getfem/getfem_generic_assembly_compile_and_exec.h
@@ -212,14 +212,14 @@ namespace getfem {
void ga_exec(ga_instruction_set &gis, ga_workspace &workspace);
void ga_function_exec(ga_instruction_set &gis);
void ga_compile(ga_workspace &workspace, ga_instruction_set &gis,
- size_type order);
+ size_type order);
void ga_compile_function(ga_workspace &workspace,
- ga_instruction_set &gis, bool scalar);
+ ga_instruction_set &gis, bool scalar);
void ga_compile_interpolation(ga_workspace &workspace,
- ga_instruction_set &gis);
+ ga_instruction_set &gis);
void ga_interpolation_exec(ga_instruction_set &gis,
- ga_workspace &workspace,
- ga_interpolation_context &gic);
+ ga_workspace &workspace,
+ ga_interpolation_context &gic);
void ga_interpolation_single_point_exec
(ga_instruction_set &gis, ga_workspace &workspace,
const fem_interpolation_context &ctx_x, const base_small_vector &Normal,
diff --git a/src/getfem/getfem_model_solvers.h
b/src/getfem/getfem_model_solvers.h
index 278e7ba..6aa3b5e 100644
--- a/src/getfem/getfem_model_solvers.h
+++ b/src/getfem/getfem_model_solvers.h
@@ -233,10 +233,10 @@ namespace getfem {
// Dummy linesearch for the newton with step control
struct newton_search_with_step_control : public abstract_newton_line_search {
-
+
virtual void init_search(double /*r*/, size_t /*git*/, double /*R0*/ = 0.0)
{ GMM_ASSERT1(false, "Not to be used"); }
-
+
virtual double next_try(void)
{ GMM_ASSERT1(false, "Not to be used"); }
@@ -245,7 +245,7 @@ namespace getfem {
newton_search_with_step_control() {}
};
-
+
struct quadratic_newton_line_search : public abstract_newton_line_search {
double R0_, R1_;
@@ -408,9 +408,11 @@ namespace getfem {
/*********************************************************************/
template <typename PB>
- void Newton_with_step_control(PB &pb, gmm::iteration &iter,
- const abstract_linear_solver<typename PB::MATRIX,
- typename PB::VECTOR> &linear_solver) {
+ void Newton_with_step_control
+ (PB &pb, gmm::iteration &iter,
+ const abstract_linear_solver<typename PB::MATRIX,
+ typename PB::VECTOR> &linear_solver)
+ {
typedef typename gmm::linalg_traits<typename PB::VECTOR>::value_type T;
typedef typename gmm::number_traits<T>::magnitude_type R;
gmm::iteration iter_linsolv0 = iter;
@@ -436,103 +438,103 @@ namespace getfem {
// GMM_ASSERT1(ls, "Internal error");
size_type nit = 0, stagn = 0;
R coeff = R(2);
-
+
scalar_type crit = pb.residual_norm() / approx_eln;
if (iter.finished(crit)) return;
for(;;) {
-
+
crit = gmm::vect_dist1(pb.residual(), gmm::scaled(b0, R(1)-alpha))
- / approx_eln;
- if (!iter.converged(crit)) {
- gmm::iteration iter_linsolv = iter_linsolv0;
- if (iter.get_noisy() > 1)
- cout << "starting tangent matrix computation" << endl;
-
- int is_singular = 1;
- while (is_singular) { // Linear system solve
- pb.compute_tangent_matrix();
- gmm::clear(dr);
- gmm::copy(gmm::scaled(pb.residual(), pb.scale_residual()), b);
- gmm::add(gmm::scaled(b0,alpha-R(1)), b);
- if (iter.get_noisy() > 1) cout << "starting linear solver" << endl;
- iter_linsolv.init();
- linear_solver(pb.tangent_matrix(), dr, b, iter_linsolv);
- if (!iter_linsolv.converged()) {
- is_singular++;
- if (is_singular <= 4) {
- if (iter.get_noisy())
- cout << "Singular tangent matrix:"
- " perturbation of the state vector." << endl;
- pb.perturbation();
- pb.compute_residual();
- } else {
- if (iter.get_noisy())
- cout << "Singular tangent matrix: perturbation failed, "
- << "aborting." << endl;
- return;
- }
- }
- else is_singular = 0;
- }
- if (iter.get_noisy() > 1) cout << "linear solver done" << endl;
-
-
- gmm::add(dr, pb.state_vector());
- pb.compute_residual();
- R res = gmm::vect_dist1(pb.residual(), gmm::scaled(b0, R(1)-alpha));
- R dec = R(1)/R(2), coeff2 = coeff * R(1.5);
-
- while (dec > R(1E-5) && res >= res0 * coeff) {
- gmm::add(gmm::scaled(dr, -dec), pb.state_vector());
- pb.compute_residual();
- R res2 = gmm::vect_dist1(pb.residual(), gmm::scaled(b0, R(1)-alpha));
- if (res2 < res*R(0.95) || res2 >= res0 * coeff2) {
- dec /= R(2); res = res2; coeff2 *= R(1.5);
- } else {
- gmm::add(gmm::scaled(dr, dec), pb.state_vector());
- break;
- }
- }
- dec *= R(2);
-
- nit++;
- coeff = std::max(R(1.05), coeff*R(0.93));
- bool near_end = (iter.get_iteration() > iter.get_maxiter()/2);
- bool cut = (alpha < R(1)) && near_end;
- if ((res > minres && nit > 4) || cut) {
- stagn++;
-
- if ((stagn > 10 && alpha > alpha0 + R(5E-2)) || cut) {
- alpha = (alpha + alpha0) / R(2);
- if (near_end) alpha = R(1);
- gmm::copy(Xi, pb.state_vector());
- pb.compute_residual();
- res = gmm::vect_dist1(pb.residual(), gmm::scaled(b0, R(1)-alpha));
- nit = 0;
- stagn = 0; coeff = R(2);
- }
- }
- if (res < minres || (alpha == R(1) && nit < 10)) stagn = 0;
- res0 = res;
- if (nit < 5) minres = res0; else minres = std::min(minres, res0);
-
- if (iter.get_noisy())
- cout << "step control [" << std::setw(8) << alpha0 << ","
- << std::setw(8) << alpha << "," << std::setw(10) << dec << "]";
- ++iter;
- // crit = std::min(res / approx_eln,
- // gmm::vect_norm1(dr) / std::max(1E-25,pb.state_norm()));
- crit = res / approx_eln;
+ / approx_eln;
+ if (!iter.converged(crit)) {
+ gmm::iteration iter_linsolv = iter_linsolv0;
+ if (iter.get_noisy() > 1)
+ cout << "starting tangent matrix computation" << endl;
+
+ int is_singular = 1;
+ while (is_singular) { // Linear system solve
+ pb.compute_tangent_matrix();
+ gmm::clear(dr);
+ gmm::copy(gmm::scaled(pb.residual(), pb.scale_residual()), b);
+ gmm::add(gmm::scaled(b0,alpha-R(1)), b);
+ if (iter.get_noisy() > 1) cout << "starting linear solver" << endl;
+ iter_linsolv.init();
+ linear_solver(pb.tangent_matrix(), dr, b, iter_linsolv);
+ if (!iter_linsolv.converged()) {
+ is_singular++;
+ if (is_singular <= 4) {
+ if (iter.get_noisy())
+ cout << "Singular tangent matrix:"
+ " perturbation of the state vector." << endl;
+ pb.perturbation();
+ pb.compute_residual();
+ } else {
+ if (iter.get_noisy())
+ cout << "Singular tangent matrix: perturbation failed, "
+ << "aborting." << endl;
+ return;
+ }
+ }
+ else is_singular = 0;
+ }
+ if (iter.get_noisy() > 1) cout << "linear solver done" << endl;
+
+
+ gmm::add(dr, pb.state_vector());
+ pb.compute_residual();
+ R res = gmm::vect_dist1(pb.residual(), gmm::scaled(b0, R(1)-alpha));
+ R dec = R(1)/R(2), coeff2 = coeff * R(1.5);
+
+ while (dec > R(1E-5) && res >= res0 * coeff) {
+ gmm::add(gmm::scaled(dr, -dec), pb.state_vector());
+ pb.compute_residual();
+ R res2 = gmm::vect_dist1(pb.residual(), gmm::scaled(b0, R(1)-alpha));
+ if (res2 < res*R(0.95) || res2 >= res0 * coeff2) {
+ dec /= R(2); res = res2; coeff2 *= R(1.5);
+ } else {
+ gmm::add(gmm::scaled(dr, dec), pb.state_vector());
+ break;
+ }
+ }
+ dec *= R(2);
+
+ nit++;
+ coeff = std::max(R(1.05), coeff*R(0.93));
+ bool near_end = (iter.get_iteration() > iter.get_maxiter()/2);
+ bool cut = (alpha < R(1)) && near_end;
+ if ((res > minres && nit > 4) || cut) {
+ stagn++;
+
+ if ((stagn > 10 && alpha > alpha0 + R(5E-2)) || cut) {
+ alpha = (alpha + alpha0) / R(2);
+ if (near_end) alpha = R(1);
+ gmm::copy(Xi, pb.state_vector());
+ pb.compute_residual();
+ res = gmm::vect_dist1(pb.residual(), gmm::scaled(b0, R(1)-alpha));
+ nit = 0;
+ stagn = 0; coeff = R(2);
+ }
+ }
+ if (res < minres || (alpha == R(1) && nit < 10)) stagn = 0;
+ res0 = res;
+ if (nit < 5) minres = res0; else minres = std::min(minres, res0);
+
+ if (iter.get_noisy())
+ cout << "step control [" << std::setw(8) << alpha0 << ","
+ << std::setw(8) << alpha << "," << std::setw(10) << dec << "]";
+ ++iter;
+ // crit = std::min(res / approx_eln,
+ // gmm::vect_norm1(dr) /
std::max(1E-25,pb.state_norm()));
+ crit = res / approx_eln;
}
-
+
if (iter.finished(crit)) {
- if (iter.converged() && alpha < R(1)) {
- R a = alpha;
- alpha = std::min(R(1), alpha*R(3) - alpha0*R(2));
- alpha0 = a;
- gmm::copy(pb.state_vector(), Xi);
- nit = 0; stagn = 0; coeff = R(2);
- } else return;
+ if (iter.converged() && alpha < R(1)) {
+ R a = alpha;
+ alpha = std::min(R(1), alpha*R(3) - alpha0*R(2));
+ alpha0 = a;
+ gmm::copy(pb.state_vector(), Xi);
+ nit = 0; stagn = 0; coeff = R(2);
+ } else return;
}
}
}
@@ -544,9 +546,11 @@ namespace getfem {
/* ***************************************************************** */
template <typename PB>
- void classical_Newton(PB &pb, gmm::iteration &iter,
- const abstract_linear_solver<typename PB::MATRIX,
- typename PB::VECTOR> &linear_solver) {
+ void classical_Newton
+ (PB &pb, gmm::iteration &iter,
+ const abstract_linear_solver<typename PB::MATRIX,
+ typename PB::VECTOR> &linear_solver)
+ {
typedef typename gmm::linalg_traits<typename PB::VECTOR>::value_type T;
typedef typename gmm::number_traits<T>::magnitude_type R;
gmm::iteration iter_linsolv0 = iter;
@@ -750,10 +754,10 @@ namespace getfem {
#elif GETFEM_PARA_LEVEL > 1 && GETFEM_PARA_SOLVER == MUMPS_PARA_SOLVER
if (md.is_symmetric())
return std::make_shared
- <linear_solver_distributed_mumps_sym<MATRIX, VECTOR>>();
+ <linear_solver_distributed_mumps_sym<MATRIX, VECTOR>>();
else
- return std::make_shared
- <linear_solver_distributed_mumps<MATRIX, VECTOR>>();
+ return std::make_shared
+ <linear_solver_distributed_mumps<MATRIX, VECTOR>>();
#else
size_type ndof = md.nb_dof(), max3d = 15000, dim = md.leading_dimension();
# ifdef GMM_USES_MUMPS
@@ -762,24 +766,24 @@ namespace getfem {
if ((ndof<300000 && dim<=2) || (ndof<max3d && dim<=3) || (ndof<1000)) {
# ifdef GMM_USES_MUMPS
if (md.is_symmetric())
- return std::make_shared<linear_solver_mumps_sym<MATRIX, VECTOR>>();
+ return std::make_shared<linear_solver_mumps_sym<MATRIX, VECTOR>>();
else
- return std::make_shared<linear_solver_mumps<MATRIX, VECTOR>>();
+ return std::make_shared<linear_solver_mumps<MATRIX, VECTOR>>();
# else
return std::make_shared<linear_solver_superlu<MATRIX, VECTOR>>();
# endif
}
else {
if (md.is_coercive())
- return std::make_shared
- <linear_solver_cg_preconditioned_ildlt<MATRIX, VECTOR>>();
+ return std::make_shared
+ <linear_solver_cg_preconditioned_ildlt<MATRIX, VECTOR>>();
else {
if (dim <= 2)
- return std::make_shared
- <linear_solver_gmres_preconditioned_ilut<MATRIX,VECTOR>>();
- else
- return std::make_shared
- <linear_solver_gmres_preconditioned_ilu<MATRIX,VECTOR>>();
+ return std::make_shared
+ <linear_solver_gmres_preconditioned_ilut<MATRIX,VECTOR>>();
+ else
+ return std::make_shared
+ <linear_solver_gmres_preconditioned_ilu<MATRIX,VECTOR>>();
}
}
#endif
@@ -800,7 +804,7 @@ namespace getfem {
return std::make_shared<linear_solver_mumps<MATRIX, VECTOR>>();
# else
return std::make_shared
- <linear_solver_distributed_mumps<MATRIX, VECTOR>>();
+ <linear_solver_distributed_mumps<MATRIX, VECTOR>>();
# endif
#else
GMM_ASSERT1(false, "Mumps is not interfaced");
@@ -808,16 +812,16 @@ namespace getfem {
}
else if (bgeot::casecmp(name, "cg/ildlt") == 0)
return std::make_shared
- <linear_solver_cg_preconditioned_ildlt<MATRIX, VECTOR>>();
+ <linear_solver_cg_preconditioned_ildlt<MATRIX, VECTOR>>();
else if (bgeot::casecmp(name, "gmres/ilu") == 0)
return std::make_shared
- <linear_solver_gmres_preconditioned_ilu<MATRIX, VECTOR>>();
+ <linear_solver_gmres_preconditioned_ilu<MATRIX, VECTOR>>();
else if (bgeot::casecmp(name, "gmres/ilut") == 0)
return std::make_shared
- <linear_solver_gmres_preconditioned_ilut<MATRIX, VECTOR>>();
+ <linear_solver_gmres_preconditioned_ilut<MATRIX, VECTOR>>();
else if (bgeot::casecmp(name, "gmres/ilutp") == 0)
return std::make_shared
- <linear_solver_gmres_preconditioned_ilutp<MATRIX, VECTOR>>();
+ <linear_solver_gmres_preconditioned_ilutp<MATRIX, VECTOR>>();
else if (bgeot::casecmp(name, "auto") == 0)
return default_linear_solver<MATRIX, VECTOR>(md);
else
diff --git a/src/getfem_generic_assembly_interpolation.cc
b/src/getfem_generic_assembly_interpolation.cc
index 08ad1e8..60951cd 100644
--- a/src/getfem_generic_assembly_interpolation.cc
+++ b/src/getfem_generic_assembly_interpolation.cc
@@ -570,7 +570,7 @@ namespace getfem {
var.varname, var.transname, 1);
if (tree.root)
ga_semantic_analysis(tree, local_workspace, dummy_mesh(),
- 1, false, true);
+ 1, false, true);
ga_compile_interpolation(pwi.workspace(), pwi.gis());
}
}
@@ -815,8 +815,8 @@ namespace getfem {
m_x.trans_of_convex(adj_face.cv));
bool converged = true;
gic.invert(ctx_x.xreal(), P_ref, converged);
- bool is_in = (ctx_x.pgt()->convex_ref()->is_in(P_ref) < 1E-4);
- GMM_ASSERT1(is_in && converged, "Geometric transformation inversion "
+ bool is_in = (ctx_x.pgt()->convex_ref()->is_in(P_ref) < 1E-4);
+ GMM_ASSERT1(is_in && converged, "Geometric transformation inversion "
"has failed in neighbour transformation");
face_num = adj_face.f;
cv = adj_face.cv;
@@ -962,7 +962,7 @@ namespace getfem {
public:
virtual const mesh_region &give_region(const mesh &,
- size_type, short_type) const
+ size_type, short_type) const
{ return region; }
// virtual void init(const ga_workspace &workspace) const = 0;
// virtual void finalize() const = 0;
diff --git a/src/getfem_generic_assembly_semantic.cc
b/src/getfem_generic_assembly_semantic.cc
index 9f70cc3..905dc62 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -513,7 +513,8 @@ namespace getfem {
pnode->test_function_type = t_type;
for (size_type i = 0; i < n; ++i)
for (size_type j = 0; j < n; ++j)
- pnode->tensor()(i,j) = (i==j) ? scalar_type(1) :
scalar_type(0);
+ pnode->tensor()(i,j) = (i==j) ? scalar_type(1)
+ : scalar_type(0);
}
}
}
diff --git a/src/getfem_generic_assembly_workspace.cc
b/src/getfem_generic_assembly_workspace.cc
index 506ad16..55a5bcf 100644
--- a/src/getfem_generic_assembly_workspace.cc
+++ b/src/getfem_generic_assembly_workspace.cc
@@ -300,7 +300,7 @@ namespace getfem {
GMM_ASSERT1(false, "A secondary domain with the same "
"name already exists");
if (transformations.find(name) != transformations.end())
- GMM_ASSERT1(name.compare("neighbour_elt"), "neighbour_elt is a "
+ GMM_ASSERT1(name != "neighbour_elt", "neighbour_elt is a "
"reserved interpolate transformation name");
transformations[name] = ptrans;
}
@@ -446,9 +446,11 @@ namespace getfem {
}
if (!found) {
- ind_tree = trees.size(); remain = false;
+ ind_tree = trees.size();
+ remain = false;
trees.push_back(tree_description());
- trees.back().mim = &mim; trees.back().m = &m;
+ trees.back().mim = &mim;
+ trees.back().m = &m;
trees.back().rg = &rg;
trees.back().secondary_domain = tree.secondary_domain;
trees.back().ptree = new ga_tree;
@@ -488,17 +490,6 @@ namespace getfem {
}
}
- ga_workspace::m_tree::~m_tree() { if (ptree) delete ptree; }
- ga_workspace::m_tree::m_tree(const m_tree& o)
- : ptree(o.ptree), meshdim(o.meshdim), ignore_X(o.ignore_X)
- { if (o.ptree) ptree = new ga_tree(*(o.ptree)); }
- ga_workspace::m_tree &ga_workspace::m_tree::operator =(const m_tree& o) {
- if (ptree) delete ptree;
- ptree = o.ptree; meshdim = o.meshdim; ignore_X = o.ignore_X;
- if (o.ptree) ptree = new ga_tree(*(o.ptree));
- return *this;
- }
-
size_type ga_workspace::add_expression(const std::string &expr,
const mesh_im &mim,
const mesh_region &rg_,
@@ -543,11 +534,11 @@ namespace getfem {
}
}
- for (size_type i = 0; i < ltrees.size(); ++i) {
- if (ltrees[i].root) {
- // cout << "adding tree " << ga_tree_to_string(ltrees[i]) << endl;
- max_order = std::max(ltrees[i].root->nb_test_functions(), max_order);
- add_tree(ltrees[i], mim.linked_mesh(), mim, rg, expr,
+ for (ga_tree <ree : ltrees) {
+ if (ltree.root) {
+ // cout << "adding tree " << ga_tree_to_string(ltree) << endl;
+ max_order = std::max(ltree.root->nb_test_functions(), max_order);
+ add_tree(ltree, mim.linked_mesh(), mim, rg, expr,
add_derivative_order, true, 0, "");
}
}
@@ -630,22 +621,18 @@ namespace getfem {
size_type order) {
bool islin = true;
std::set<var_trans_pair> vll, dll;
- for (size_type i = 0; i < vl.size(); ++i)
- vll.insert(var_trans_pair(vl[i], ""));
- for (size_type i = 0; i < dl.size(); ++i)
- dll.insert(var_trans_pair(dl[i], ""));
+ for (const std::string &v : vl) vll.insert(var_trans_pair(v, ""));
+ for (const std::string &d : dl) dll.insert(var_trans_pair(d, ""));
- for (size_type i = 0; i < trees.size(); ++i) {
- ga_workspace::tree_description &td = trees[i];
+ for (const ga_workspace::tree_description &td : trees) {
std::set<var_trans_pair> dllaux;
bool fv = ga_extract_variables(td.ptree->root, *this, *(td.m),
dllaux, false);
- if (td.order == order) {
- for (std::set<var_trans_pair>::iterator it = dllaux.begin();
- it!=dllaux.end(); ++it)
- dll.insert(*it);
- }
+ if (td.order == order)
+ for (const auto &t : dllaux)
+ dll.insert(t);
+
switch (td.order) {
case 0: break;
case 1:
@@ -659,7 +646,7 @@ namespace getfem {
}
bool found = false;
for (const std::string &t : vl_test1)
- if (td.name_test1.compare(t) == 0)
+ if (td.name_test1 == t)
found = true;
if (!found)
vl_test1.push_back(td.name_test1);
@@ -683,8 +670,8 @@ namespace getfem {
}
bool found = false;
for (size_type j = 0; j < vl_test1.size(); ++j)
- if ((td.name_test1.compare(vl_test1[j]) == 0) &&
- (td.name_test2.compare(vl_test2[j]) == 0))
+ if ((td.name_test1 == vl_test1[j]) &&
+ (td.name_test2 == vl_test2[j]))
found = true;
if (!found) {
vl_test1.push_back(td.name_test1);
@@ -697,11 +684,11 @@ namespace getfem {
}
vl.clear();
for (const auto &var : vll)
- if (vl.size() == 0 || var.varname.compare(vl.back()))
+ if (vl.size() == 0 || var.varname != vl.back())
vl.push_back(var.varname);
dl.clear();
for (const auto &var : dll)
- if (dl.size() == 0 || var.varname.compare(dl.back()))
+ if (dl.size() == 0 || var.varname != dl.back())
dl.push_back(var.varname);
return islin;
@@ -926,9 +913,7 @@ namespace getfem {
std::string ga_workspace::extract_constant_term(const mesh &m) {
std::string constant_term;
- for (size_type i = 0; i < trees.size(); ++i) {
- ga_workspace::tree_description &td = trees[i];
-
+ for (const ga_workspace::tree_description &td : trees) {
if (td.order == 1) {
ga_tree local_tree = *(td.ptree);
if (local_tree.root)
@@ -950,8 +935,7 @@ namespace getfem {
std::string ga_workspace::extract_order0_term() {
std::string term;
- for (size_type i = 0; i < trees.size(); ++i) {
- ga_workspace::tree_description &td = trees[i];
+ for (const ga_workspace::tree_description &td : trees) {
if (td.order == 0) {
ga_tree &local_tree = *(td.ptree);
if (term.size())
@@ -970,9 +954,8 @@ namespace getfem {
std::string ga_workspace::extract_order1_term(const std::string &varname) {
std::string term;
- for (size_type i = 0; i < trees.size(); ++i) {
- ga_workspace::tree_description &td = trees[i];
- if (td.order == 1 && td.name_test1.compare(varname) == 0) {
+ for (const ga_workspace::tree_description &td : trees) {
+ if (td.order == 1 && td.name_test1 == varname) {
ga_tree &local_tree = *(td.ptree);
if (term.size())
term += "+("+ga_tree_to_string(local_tree)+")";
@@ -989,13 +972,12 @@ namespace getfem {
std::string ga_workspace::extract_Neumann_term(const std::string &varname) {
std::string result;
- for (size_type i = 0; i < trees.size(); ++i) {
- ga_workspace::tree_description &td = trees[i];
- if (td.order == 1 && td.name_test1.compare(varname) == 0) {
+ for (const ga_workspace::tree_description &td : trees) {
+ if (td.order == 1 && td.name_test1 == varname) {
ga_tree &local_tree = *(td.ptree);
if (local_tree.root)
ga_extract_Neumann_term(local_tree, varname, *this,
- local_tree.root, result);
+ local_tree.root, result);
}
}
return result;
diff --git a/src/getfem_mesh.cc b/src/getfem_mesh.cc
index edf8d96..e189e6e 100644
--- a/src/getfem_mesh.cc
+++ b/src/getfem_mesh.cc
@@ -363,7 +363,7 @@ namespace getfem {
}
bgeot::mesh_structure::sup_convex(ic);
if (sup_points)
- for (size_type ip = 0; ip < ipt.size(); ++ip) sup_point(ipt[ip]);
+ for (const size_type &ip : ipt) sup_point(ip);
trans_exists.sup(ic);
sup_convex_from_regions(ic);
if (Bank_info.get()) Bank_sup_convex_from_green(ic);
diff --git a/src/getfem_model_solvers.cc b/src/getfem_model_solvers.cc
index 00da7d2..2a45398 100644
--- a/src/getfem_model_solvers.cc
+++ b/src/getfem_model_solvers.cc
@@ -29,7 +29,7 @@ namespace getfem {
static rmodel_plsolver_type rdefault_linear_solver(const model &md) {
return default_linear_solver<model_real_sparse_matrix,
model_real_plain_vector>(md);
- }
+ }
static cmodel_plsolver_type cdefault_linear_solver(const model &md) {
return default_linear_solver<model_complex_sparse_matrix,
@@ -49,7 +49,7 @@ namespace getfem {
max_ratio_reached = false;
}
- double default_newton_line_search::next_try(void) {
+ double default_newton_line_search::next_try() {
alpha_old = alpha; ++it;
// alpha *= 0.5;
if (alpha >= 0.4) alpha *= 0.5; else alpha *= alpha_mult;
@@ -60,7 +60,7 @@ namespace getfem {
// cout << "r = " << r << " alpha = " << alpha_old << " count_pat = " <<
count_pat << endl;
if (!max_ratio_reached && r < first_res * alpha_max_ratio) {
alpha_max_ratio_reached = alpha_old; r_max_ratio_reached = r;
- it_max_ratio_reached = it; max_ratio_reached = true;
+ it_max_ratio_reached = it; max_ratio_reached = true;
}
if (max_ratio_reached &&
r < r_max_ratio_reached * 0.5 &&
@@ -71,9 +71,9 @@ namespace getfem {
if (count == 0 || r < conv_r)
{ conv_r = r; conv_alpha = alpha_old; count = 1; }
if (conv_r < first_res) ++count;
-
+
if (r < first_res * alpha_min_ratio)
- { count_pat = 0; return true; }
+ { count_pat = 0; return true; }
if (count>=5 || (alpha < alpha_min && max_ratio_reached) || alpha<1e-15) {
if (conv_r < first_res * 0.99) count_pat = 0;
if (/*gmm::random() * 50. < -log(conv_alpha)-4.0 ||*/ count_pat >= 3)
@@ -91,10 +91,10 @@ namespace getfem {
/* ***************************************************************** */
template <typename MATRIX, typename VECTOR, typename PLSOLVER>
- void compute_init_values(model &md, gmm::iteration &iter,
- PLSOLVER lsolver,
- abstract_newton_line_search &ls, const MATRIX &K,
- const VECTOR &rhs) {
+ void compute_init_values(model &md, gmm::iteration &iter,
+ PLSOLVER lsolver,
+ abstract_newton_line_search &ls, const MATRIX &K,
+ const VECTOR &rhs) {
VECTOR state(md.nb_dof());
md.from_variables(state);
@@ -103,7 +103,7 @@ namespace getfem {
scalar_type dt = md.get_time_step();
scalar_type ddt = md.get_init_time_step();
scalar_type t = md.get_time();
-
+
// Solve for ddt
md.set_time_step(ddt);
gmm::iteration iter1 = iter;
@@ -148,9 +148,9 @@ namespace getfem {
else {
model_pb<MATRIX, VECTOR> mdpb(md, ls, state, rhs, K);
if (dynamic_cast<newton_search_with_step_control *>(&ls))
- Newton_with_step_control(mdpb, iter, *lsolver);
+ Newton_with_step_control(mdpb, iter, *lsolver);
else
- classical_Newton(mdpb, iter, *lsolver);
+ classical_Newton(mdpb, iter, *lsolver);
}
md.to_variables(state); // copy the state vector into the model variables
}
diff --git a/src/getfem_models.cc b/src/getfem_models.cc
index 6754dd0..e7c9315 100644
--- a/src/getfem_models.cc
+++ b/src/getfem_models.cc
@@ -705,7 +705,7 @@ namespace getfem {
"Cannot explicitly resize a fem variable or data");
GMM_ASSERT1(variables[name].pim_data == 0,
"Cannot explicitly resize an im data");
- GMM_ASSERT1(size, "Variable of null size are not allowed");
+ GMM_ASSERT1(size, "Variables of null size are not allowed");
variables[name].qdims.resize(1);
variables[name].qdims[0] = size;
variables[name].set_size();
@@ -742,32 +742,32 @@ namespace getfem {
void model::add_initialized_matrix_data(const std::string &name,
const base_matrix &M) {
- this->add_fixed_size_data(name, bgeot::multi_index(gmm::mat_nrows(M),
- gmm::mat_ncols(M)));
- GMM_ASSERT1(!(this->is_complex()), "Sorry, complex version to be done");
- gmm::copy(M.as_vector(), this->set_real_variable(name));
+ add_fixed_size_data(name, bgeot::multi_index(gmm::mat_nrows(M),
+ gmm::mat_ncols(M)));
+ GMM_ASSERT1(!(is_complex()), "Sorry, complex version to be done");
+ gmm::copy(M.as_vector(), set_real_variable(name));
}
void model::add_initialized_matrix_data(const std::string &name,
const base_complex_matrix &M) {
- this->add_fixed_size_data(name, bgeot::multi_index(gmm::mat_nrows(M),
- gmm::mat_ncols(M)));
- GMM_ASSERT1(!(this->is_complex()), "Sorry, complex version to be done");
- gmm::copy(M.as_vector(), this->set_complex_variable(name));
+ add_fixed_size_data(name, bgeot::multi_index(gmm::mat_nrows(M),
+ gmm::mat_ncols(M)));
+ GMM_ASSERT1(!(is_complex()), "Sorry, complex version to be done");
+ gmm::copy(M.as_vector(), set_complex_variable(name));
}
void model::add_initialized_tensor_data(const std::string &name,
const base_tensor &t) {
- this->add_fixed_size_data(name, t.sizes(), 1);
- GMM_ASSERT1(!(this->is_complex()), "Sorry, complex version to be done");
- gmm::copy(t.as_vector(), this->set_real_variable(name));
+ add_fixed_size_data(name, t.sizes(), 1);
+ GMM_ASSERT1(!(is_complex()), "Sorry, complex version to be done");
+ gmm::copy(t.as_vector(), set_real_variable(name));
}
void model::add_initialized_tensor_data(const std::string &name,
const base_complex_tensor &t) {
- this->add_fixed_size_data(name, t.sizes(), 1);
- GMM_ASSERT1(!(this->is_complex()), "Sorry, complex version to be done");
- gmm::copy(t.as_vector(), this->set_complex_variable(name));
+ add_fixed_size_data(name, t.sizes(), 1);
+ GMM_ASSERT1(!(is_complex()), "Sorry, complex version to be done");
+ gmm::copy(t.as_vector(), set_complex_variable(name));
}
void model::add_im_data(const std::string &name, const im_data &im_data,
@@ -1035,13 +1035,13 @@ namespace getfem {
is_symmetric_ = is_symmetric_ && pbr->is_symmetric();
is_coercive_ = is_coercive_ && pbr->is_coercive();
- for (size_type i=0; i < varnames.size(); ++i)
- GMM_ASSERT1(variables.find(varnames[i]) != variables.end(),
- "Undefined model variable " << varnames[i]);
+ for (const auto &vname : varnames)
+ GMM_ASSERT1(variables.count(vname),
+ "Undefined model variable " << vname);
// cout << "dl == " << datanames << endl;
- for (size_type i=0; i < datanames.size(); ++i)
- GMM_ASSERT1(variables.find(datanames[i]) != variables.end(),
- "Undefined model data or variable " << datanames[i]);
+ for (const auto &dname : datanames)
+ GMM_ASSERT1(variables.count(dname),
+ "Undefined model data or variable " << dname);
return ib;
}
@@ -1072,25 +1072,23 @@ namespace getfem {
GMM_ASSERT1(valid_bricks[ib], "Inexistent brick");
touch_brick(ib);
bricks[ib].vlist = vl;
- for (size_type i=0; i < vl.size(); ++i)
- GMM_ASSERT1(variables.find(vl[i]) != variables.end(),
- "Undefined model variable " << vl[i]);
+ for (const auto &v : vl)
+ GMM_ASSERT1(variables.count(v), "Undefined model variable " << v);
}
void model::change_data_of_brick(size_type ib, const varnamelist &dl) {
GMM_ASSERT1(valid_bricks[ib], "Inexistent brick");
touch_brick(ib);
bricks[ib].dlist = dl;
- for (size_type i=0; i < dl.size(); ++i)
- GMM_ASSERT1(variables.find(dl[i]) != variables.end(),
- "Undefined model variable " << dl[i]);
+ for (const auto &v : dl)
+ GMM_ASSERT1(variables.count(v), "Undefined model variable " << v);
}
void model::change_mims_of_brick(size_type ib, const mimlist &ml) {
GMM_ASSERT1(valid_bricks[ib], "Inexistent brick");
touch_brick(ib);
bricks[ib].mims = ml;
- for (size_type i = 0; i < ml.size(); ++i) add_dependency(*(ml[i]));
+ for (const auto &mim : ml) add_dependency(*mim);
}
void model::change_update_flag_of_brick(size_type ib, bool flag) {
@@ -1170,11 +1168,11 @@ namespace getfem {
if (name_v.size()) {
if (is_complex()) {
- model_complex_plain_vector v0 = this->complex_variable(name_v);
- gmm::copy(v0, this->set_complex_variable(name_previous_v));
+ model_complex_plain_vector v0 = complex_variable(name_v);
+ gmm::copy(v0, set_complex_variable(name_previous_v));
} else {
- const model_real_plain_vector &v0 = this->real_variable(name_v);
- gmm::copy(v0, this->set_real_variable(name_previous_v));
+ const model_real_plain_vector &v0 = real_variable(name_v);
+ gmm::copy(v0, set_real_variable(name_previous_v));
}
}
}
@@ -1803,16 +1801,14 @@ namespace getfem {
void model::first_iter() {
context_check(); if (act_size_to_be_done) actualize_sizes();
- for (VAR_SET::iterator it = variables.begin(); it != variables.end(); ++it)
- it->second.clear_temporaries();
+ for (auto && v : variables) v.second.clear_temporaries();
set_dispatch_coeff();
for (dal::bv_visitor ib(active_bricks); !ib.finished(); ++ib) {
brick_description &brick = bricks[ib];
- bool cplx = is_complex() && brick.pbr->is_complex();
if (brick.pdispatch) {
- if (cplx)
+ if (is_complex() && brick.pbr->is_complex())
brick.pdispatch->next_complex_iter(*this, ib, brick.vlist,
brick.dlist,
brick.cmatlist, brick.cveclist,
@@ -1831,9 +1827,8 @@ namespace getfem {
for (dal::bv_visitor ib(active_bricks); !ib.finished(); ++ib) {
brick_description &brick = bricks[ib];
- bool cplx = is_complex() && brick.pbr->is_complex();
if (brick.pdispatch) {
- if (cplx)
+ if (is_complex() && brick.pbr->is_complex())
brick.pdispatch->next_complex_iter(*this, ib, brick.vlist,
brick.dlist,
brick.cmatlist, brick.cveclist,
@@ -1845,18 +1840,14 @@ namespace getfem {
}
}
- for (VAR_SET::iterator it = variables.begin(); it != variables.end();
- ++it) {
- for (size_type i = 1; i < it->second.n_iter; ++i) {
+ for (auto &&v : variables)
+ for (size_type i = 1; i < v.second.n_iter; ++i) {
if (is_complex())
- gmm::copy(it->second.complex_value[i-1],
- it->second.complex_value[i]);
+ gmm::copy(v.second.complex_value[i-1], v.second.complex_value[i]);
else
- gmm::copy(it->second.real_value[i-1],
- it->second.real_value[i]);
- it->second.v_num_data[i] = act_counter();
+ gmm::copy(v.second.real_value[i-1], v.second.real_value[i]);
+ v.second.v_num_data[i] = act_counter();
}
- }
}
bool model::is_var_newer_than_brick(const std::string &varname,
@@ -2731,18 +2722,18 @@ namespace getfem {
const model_real_plain_vector &
model::real_variable(const std::string &name) const {
- if (is_old(name)) return real_variable(no_old_prefix_name(name), 1);
- else return real_variable(name, size_type(-1));
+ return is_old(name) ? real_variable(no_old_prefix_name(name), 1)
+ : real_variable(name, size_type(-1));
}
const model_real_plain_vector &
model::real_variable(const std::string &name, size_type niter) const {
GMM_ASSERT1(!complex_version, "This model is a complex one");
- GMM_ASSERT1(!is_old(name), "Please don't use Old_ prefix in combination
with"
- " variable version");
+ GMM_ASSERT1(!is_old(name), "Please don't use Old_ prefix in combination "
+ "with variable version");
context_check();
auto it = variables.find(name);
- GMM_ASSERT1(it!=variables.end(), "Undefined variable " << name);
+ GMM_ASSERT1(it != variables.end(), "Undefined variable " << name);
if (act_size_to_be_done && it->second.is_fem_dofs) {
if (it->second.filter != VDESCRFILTER_NO)
actualize_sizes();
@@ -2757,8 +2748,8 @@ namespace getfem {
const model_complex_plain_vector &
model::complex_variable(const std::string &name) const {
- if (is_old(name)) return complex_variable(no_old_prefix_name(name), 1);
- else return complex_variable(name, size_type(-1));
+ return is_old(name) ? complex_variable(no_old_prefix_name(name), 1)
+ : complex_variable(name, size_type(-1));
}
const model_complex_plain_vector &
@@ -2784,8 +2775,8 @@ namespace getfem {
model_real_plain_vector &
model::set_real_variable(const std::string &name) const {
- if (is_old(name)) return set_real_variable(no_old_prefix_name(name), 1);
- else return set_real_variable(name, size_type(-1));
+ return is_old(name) ? set_real_variable(no_old_prefix_name(name), 1)
+ : set_real_variable(name, size_type(-1));
}
@@ -2811,10 +2802,10 @@ namespace getfem {
return it->second.real_value[niter];
}
-model_complex_plain_vector &
+ model_complex_plain_vector &
model::set_complex_variable(const std::string &name) const {
- if (is_old(name)) return set_complex_variable(no_old_prefix_name(name), 1);
- else return set_complex_variable(name, size_type(-1));
+ return is_old(name) ? set_complex_variable(no_old_prefix_name(name), 1)
+ : set_complex_variable(name, size_type(-1));
}
model_complex_plain_vector &
diff --git a/src/gmm/gmm_vector.h b/src/gmm/gmm_vector.h
index e69931d..dbc4029 100644
--- a/src/gmm/gmm_vector.h
+++ b/src/gmm/gmm_vector.h
@@ -53,7 +53,7 @@ namespace gmm {
V *pm;
size_type l;
-
+
public :
operator T() const { return pm->r(l); }
@@ -92,7 +92,7 @@ namespace gmm {
V *pm;
size_type l;
-
+
public :
operator std::complex<T>() const { return pm->r(l); }
@@ -139,21 +139,21 @@ namespace gmm {
{ return std::complex<T>(*this)* v; }
std::complex<T> operator /(std::complex<T> v)
{ return std::complex<T>(*this)/ v; }
- };
+ };
+
-
template<typename T, typename V> inline
bool operator ==(T v, const ref_elt_vector<T, V> &re) { return (v==T(re)); }
template<typename T, typename V> inline
bool operator !=(T v, const ref_elt_vector<T, V> &re) { return (v!=T(re)); }
template<typename T, typename V> inline
- T &operator +=(T &v, const ref_elt_vector<T, V> &re)
+ T &operator +=(T &v, const ref_elt_vector<T, V> &re)
{ v += T(re); return v; }
template<typename T, typename V> inline
T &operator -=(T &v, const ref_elt_vector<T, V> &re)
{ v -= T(re); return v; }
template<typename T, typename V> inline
- T &operator *=(T &v, const ref_elt_vector<T, V> &re)
+ T &operator *=(T &v, const ref_elt_vector<T, V> &re)
{ v *= T(re); return v; }
template<typename T, typename V> inline
T &operator /=(T &v, const ref_elt_vector<T, V> &re)
@@ -224,7 +224,7 @@ namespace gmm {
size_type i; // Current index.
T* p; // Pointer to the current position.
dsvector<T> *v; // Pointer to the vector.
-
+
typedef T value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
@@ -233,20 +233,20 @@ namespace gmm {
typedef ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
typedef dsvector_iterator<T> iterator;
-
+
reference operator *() const { return *p; }
pointer operator->() const { return &(operator*()); }
iterator &operator ++() {
for (size_type k = (i & 15); k < 15; ++k)
- { ++p; ++i; if (*p != T(0)) return *this; }
+ { ++p; ++i; if (*p != T(0)) return *this; }
v->next_pos(*(const_cast<const_pointer *>(&(p))), i);
return *this;
}
iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }
iterator &operator --() {
for (size_type k = (i & 15); k > 0; --k)
- { --p; --i; if (*p != T(0)) return *this; }
+ { --p; --i; if (*p != T(0)) return *this; }
v->previous_pos(p, i);
return *this;
}
@@ -256,10 +256,10 @@ namespace gmm {
{ return (i == it.i && p == it.p && v == it.v); }
bool operator !=(const iterator &it) const
{ return !(it == *this); }
-
- size_type index(void) const { return i; }
- dsvector_iterator(void) : i(size_type(-1)), p(0), v(0) {}
+ size_type index() const { return i; }
+
+ dsvector_iterator() : i(size_type(-1)), p(0), v(0) {}
dsvector_iterator(dsvector<T> &w) : i(size_type(-1)), p(0), v(&w) {};
};
@@ -268,7 +268,7 @@ namespace gmm {
size_type i; // Current index.
const T* p; // Pointer to the current position.
const dsvector<T> *v; // Pointer to the vector.
-
+
typedef T value_type;
typedef const value_type* pointer;
typedef const value_type& reference;
@@ -276,19 +276,19 @@ namespace gmm {
typedef ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
typedef dsvector_const_iterator<T> iterator;
-
+
reference operator *() const { return *p; }
pointer operator->() const { return &(operator*()); }
iterator &operator ++() {
for (size_type k = (i & 15); k < 15; ++k)
- { ++p; ++i; if (*p != T(0)) return *this; }
+ { ++p; ++i; if (*p != T(0)) return *this; }
v->next_pos(p, i);
return *this;
}
iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }
iterator &operator --() {
for (size_type k = (i & 15); k > 0; --k)
- { --p; --i; if (*p != T(0)) return *this; }
+ { --p; --i; if (*p != T(0)) return *this; }
v->previous_pos(p, i);
return *this;
}
@@ -298,17 +298,17 @@ namespace gmm {
{ return (i == it.i && p == it.p && v == it.v); }
bool operator !=(const iterator &it) const
{ return !(it == *this); }
-
- size_type index(void) const { return i; }
- dsvector_const_iterator(void) : i(size_type(-1)), p(0) {}
+ size_type index() const { return i; }
+
+ dsvector_const_iterator() : i(size_type(-1)), p(0) {}
dsvector_const_iterator(const dsvector_iterator<T> &it)
: i(it.i), p(it.p), v(it.v) {}
dsvector_const_iterator(const dsvector<T> &w)
: i(size_type(-1)), p(0), v(&w) {};
};
-
+
/**
Sparse vector built on distribution sort principle.
Read and write access have a constant complexity depending only on the
@@ -323,7 +323,7 @@ namespace gmm {
typedef const T * const_pointer;
typedef void * void_pointer;
typedef const void * const_void_pointer;
-
+
protected:
size_type n; // Potential vector size
size_type depth; // Number of row of pointer arrays
@@ -337,10 +337,10 @@ namespace gmm {
void_pointer p = root_ptr;
if (!p) return 0;
for (size_type k = 0; k < depth; ++k) {
- p = ((void **)(p))[(i & my_mask) >> my_shift];
- if (!p) return 0;
- my_mask = (my_mask >> 4);
- my_shift -= 4;
+ p = ((void **)(p))[(i & my_mask) >> my_shift];
+ if (!p) return 0;
+ my_mask = (my_mask >> 4);
+ my_shift -= 4;
}
GMM_ASSERT1(my_shift == 0, "internal error");
GMM_ASSERT1(my_mask == 15, "internal error");
@@ -351,32 +351,32 @@ namespace gmm {
GMM_ASSERT1(i < n, "index " << i << " out of range (size " << n << ")");
size_type my_mask = mask, my_shift = shift;
if (!root_ptr) {
- if (depth) {
- root_ptr = new void_pointer[16];
- std::memset(root_ptr, 0, 16*sizeof(void_pointer));
- } else {
- root_ptr = new T[16];
- for (size_type l = 0; l < 16; ++l) ((T *)(root_ptr))[l] = T(0);
- }
+ if (depth) {
+ root_ptr = new void_pointer[16];
+ std::memset(root_ptr, 0, 16*sizeof(void_pointer));
+ } else {
+ root_ptr = new T[16];
+ for (size_type l = 0; l < 16; ++l) ((T *)(root_ptr))[l] = T(0);
+ }
}
void_pointer p = root_ptr;
for (size_type k = 0; k < depth; ++k) {
- size_type j = (i & my_mask) >> my_shift;
- void_pointer q = ((void_pointer *)(p))[j];
- if (!q) {
- if (k+1 != depth) {
- q = new void_pointer[16];
- std::memset(q, 0, 16*sizeof(void_pointer));
- } else {
- q = new T[16];
- for (size_type l = 0; l < 16; ++l) ((T *)(q))[l] = T(0);
- }
- ((void_pointer *)(p))[j] = q;
- }
- p = q;
- my_mask = (my_mask >> 4);
- my_shift -= 4;
+ size_type j = (i & my_mask) >> my_shift;
+ void_pointer q = ((void_pointer *)(p))[j];
+ if (!q) {
+ if (k+1 != depth) {
+ q = new void_pointer[16];
+ std::memset(q, 0, 16*sizeof(void_pointer));
+ } else {
+ q = new T[16];
+ for (size_type l = 0; l < 16; ++l) ((T *)(q))[l] = T(0);
+ }
+ ((void_pointer *)(p))[j] = q;
+ }
+ p = q;
+ my_mask = (my_mask >> 4);
+ my_shift -= 4;
}
GMM_ASSERT1(my_shift == 0, "internal error");
GMM_ASSERT1(my_mask == 15, "internal error " << my_mask);
@@ -392,65 +392,65 @@ namespace gmm {
void rec_del(void_pointer p, size_type my_depth) {
if (my_depth) {
- for (size_type k = 0; k < 16; ++k)
- if (((void_pointer *)(p))[k])
- rec_del(((void_pointer *)(p))[k], my_depth-1);
- delete[] ((void_pointer *)(p));
+ for (size_type k = 0; k < 16; ++k)
+ if (((void_pointer *)(p))[k])
+ rec_del(((void_pointer *)(p))[k], my_depth-1);
+ delete[] ((void_pointer *)(p));
} else {
- delete[] ((T *)(p));
+ delete[] ((T *)(p));
}
}
void rec_clean(void_pointer p, size_type my_depth, double eps) {
if (my_depth) {
- for (size_type k = 0; k < 16; ++k)
- if (((void_pointer *)(p))[k])
- rec_clean(((void_pointer *)(p))[k], my_depth-1, eps);
+ for (size_type k = 0; k < 16; ++k)
+ if (((void_pointer *)(p))[k])
+ rec_clean(((void_pointer *)(p))[k], my_depth-1, eps);
} else {
- for (size_type k = 0; k < 16; ++k)
- if (gmm::abs(((T *)(p))[k]) <= eps) ((T *)(p))[k] = T(0);
+ for (size_type k = 0; k < 16; ++k)
+ if (gmm::abs(((T *)(p))[k]) <= eps) ((T *)(p))[k] = T(0);
}
}
void rec_clean_i(void_pointer p, size_type my_depth, size_type my_mask,
- size_type i, size_type base) {
+ size_type i, size_type base) {
if (my_depth) {
- my_mask = (my_mask >> 4);
- for (size_type k = 0; k < 16; ++k)
- if (((void_pointer *)(p))[k] && (base + (k+1)*(mask+1)) >= i)
- rec_clean_i(((void_pointer *)(p))[k], my_depth-1, my_mask,
- i, base + k*(my_mask+1));
+ my_mask = (my_mask >> 4);
+ for (size_type k = 0; k < 16; ++k)
+ if (((void_pointer *)(p))[k] && (base + (k+1)*(mask+1)) >= i)
+ rec_clean_i(((void_pointer *)(p))[k], my_depth-1, my_mask,
+ i, base + k*(my_mask+1));
} else {
- for (size_type k = 0; k < 16; ++k)
- if (base+k > i) ((T *)(p))[k] = T(0);
+ for (size_type k = 0; k < 16; ++k)
+ if (base+k > i) ((T *)(p))[k] = T(0);
}
}
-
-
+
+
size_type rec_nnz(void_pointer p, size_type my_depth) const {
size_type nn = 0;
if (my_depth) {
- for (size_type k = 0; k < 16; ++k)
- if (((void_pointer *)(p))[k])
- nn += rec_nnz(((void_pointer *)(p))[k], my_depth-1);
+ for (size_type k = 0; k < 16; ++k)
+ if (((void_pointer *)(p))[k])
+ nn += rec_nnz(((void_pointer *)(p))[k], my_depth-1);
} else {
- for (size_type k = 0; k < 16; ++k)
- if (((const T *)(p))[k] != T(0)) nn++;
+ for (size_type k = 0; k < 16; ++k)
+ if (((const T *)(p))[k] != T(0)) nn++;
}
return nn;
}
void copy_rec(void_pointer &p, const_void_pointer q, size_type my_depth) {
if (my_depth) {
- p = new void_pointer[16];
- std::memset(p, 0, 16*sizeof(void_pointer));
- for (size_type l = 0; l < 16; ++l)
- if (((const const_void_pointer *)(q))[l])
- copy_rec(((void_pointer *)(p))[l],
- ((const const_void_pointer *)(q))[l], my_depth-1);
+ p = new void_pointer[16];
+ std::memset(p, 0, 16*sizeof(void_pointer));
+ for (size_type l = 0; l < 16; ++l)
+ if (((const const_void_pointer *)(q))[l])
+ copy_rec(((void_pointer *)(p))[l],
+ ((const const_void_pointer *)(q))[l], my_depth-1);
} else {
- p = new T[16];
- for (size_type l = 0; l < 16; ++l) ((T *)(p))[l] = ((const T *)(q))[l];
+ p = new T[16];
+ for (size_type l = 0; l < 16; ++l) ((T *)(p))[l] = ((const T *)(q))[l];
}
}
@@ -462,75 +462,75 @@ namespace gmm {
}
void next_pos_rec(void_pointer p, size_type my_depth, size_type my_mask,
- const_pointer &pp, size_type &i, size_type base) const {
+ const_pointer &pp, size_type &i, size_type base) const {
size_type ii = i;
if (my_depth) {
- my_mask = (my_mask >> 4);
- for (size_type k = 0; k < 16; ++k)
- if (((void_pointer *)(p))[k] && (base + (k+1)*(my_mask+1)) >= i) {
- next_pos_rec(((void_pointer *)(p))[k], my_depth-1, my_mask,
- pp, i, base + k*(my_mask+1));
- if (i != size_type(-1)) return; else i = ii;
- }
- i = size_type(-1); pp = 0;
+ my_mask = (my_mask >> 4);
+ for (size_type k = 0; k < 16; ++k)
+ if (((void_pointer *)(p))[k] && (base + (k+1)*(my_mask+1)) >= i) {
+ next_pos_rec(((void_pointer *)(p))[k], my_depth-1, my_mask,
+ pp, i, base + k*(my_mask+1));
+ if (i != size_type(-1)) return; else i = ii;
+ }
+ i = size_type(-1); pp = 0;
} else {
- for (size_type k = 0; k < 16; ++k)
- if (base+k > i && ((const_pointer)(p))[k] != T(0))
- { i = base+k; pp = &(((const_pointer)(p))[k]); return; }
- i = size_type(-1); pp = 0;
+ for (size_type k = 0; k < 16; ++k)
+ if (base+k > i && ((const_pointer)(p))[k] != T(0))
+ { i = base+k; pp = &(((const_pointer)(p))[k]); return; }
+ i = size_type(-1); pp = 0;
}
}
void previous_pos_rec(void_pointer p, size_type my_depth, size_type
my_mask,
- const_pointer &pp, size_type &i,
- size_type base) const {
+ const_pointer &pp, size_type &i,
+ size_type base) const {
size_type ii = i;
if (my_depth) {
- my_mask = (my_mask >> 4);
- for (size_type k = 15; k != size_type(-1); --k)
- if (((void_pointer *)(p))[k] && ((base + k*(my_mask+1)) < i)) {
- previous_pos_rec(((void_pointer *)(p))[k], my_depth-1,
- my_mask, pp, i, base + k*(my_mask+1));
- if (i != size_type(-1)) return; else i = ii;
- }
- i = size_type(-1); pp = 0;
+ my_mask = (my_mask >> 4);
+ for (size_type k = 15; k != size_type(-1); --k)
+ if (((void_pointer *)(p))[k] && ((base + k*(my_mask+1)) < i)) {
+ previous_pos_rec(((void_pointer *)(p))[k], my_depth-1,
+ my_mask, pp, i, base + k*(my_mask+1));
+ if (i != size_type(-1)) return; else i = ii;
+ }
+ i = size_type(-1); pp = 0;
} else {
- for (size_type k = 15; k != size_type(-1); --k)
- if (base+k < i && ((const_pointer)(p))[k] != T(0))
- { i = base+k; pp = &(((const_pointer)(p))[k]); return; }
- i = size_type(-1); pp = 0;
+ for (size_type k = 15; k != size_type(-1); --k)
+ if (base+k < i && ((const_pointer)(p))[k] != T(0))
+ { i = base+k; pp = &(((const_pointer)(p))[k]); return; }
+ i = size_type(-1); pp = 0;
}
}
-
-
+
+
public:
void clean(double eps) { if (root_ptr) rec_clean(root_ptr, depth); }
void resize(size_type n_) {
if (n_ != n) {
- n = n_;
- if (n_ < n) { // Depth unchanged (a choice)
- if (root_ptr) rec_clean_i(root_ptr, depth, mask, n_, 0);
- } else {
- // may change the depth (add some levels)
- size_type my_depth = 0, my_shift = 0, my_mask = 1; if (n_) --n_;
- while (n_) { n_ /= 16; ++my_depth; my_shift += 4; my_mask *= 16; }
- my_mask--; if (my_shift) my_shift -= 4; if (my_depth) --my_depth;
- if (my_depth > depth || depth == 0) {
- if (root_ptr) {
- for (size_type k = depth; k < my_depth; ++k) {
- void_pointer *q = new void_pointer [16];
- std::memset(q, 0, 16*sizeof(void_pointer));
- q[0] = root_ptr; root_ptr = q;
- }
- }
- mask = my_mask; depth = my_depth; shift = my_shift;
- }
- }
+ n = n_;
+ if (n_ < n) { // Depth unchanged (a choice)
+ if (root_ptr) rec_clean_i(root_ptr, depth, mask, n_, 0);
+ } else {
+ // may change the depth (add some levels)
+ size_type my_depth = 0, my_shift = 0, my_mask = 1; if (n_) --n_;
+ while (n_) { n_ /= 16; ++my_depth; my_shift += 4; my_mask *= 16; }
+ my_mask--; if (my_shift) my_shift -= 4; if (my_depth) --my_depth;
+ if (my_depth > depth || depth == 0) {
+ if (root_ptr) {
+ for (size_type k = depth; k < my_depth; ++k) {
+ void_pointer *q = new void_pointer [16];
+ std::memset(q, 0, 16*sizeof(void_pointer));
+ q[0] = root_ptr; root_ptr = q;
+ }
+ }
+ mask = my_mask; depth = my_depth; shift = my_shift;
+ }
+ }
}
}
-
- void clear(void) { if (root_ptr) rec_del(root_ptr, depth); root_ptr = 0; }
-
+
+ void clear() { if (root_ptr) rec_del(root_ptr, depth); root_ptr = 0; }
+
void next_pos(const_pointer &pp, size_type &i) const {
if (!root_ptr || i >= n) { pp = 0, i = size_type(-1); return; }
next_pos_rec(root_ptr, depth, mask, pp, i, 0);
@@ -542,29 +542,29 @@ namespace gmm {
previous_pos_rec(root_ptr, depth, mask, pp, i, 0);
}
- iterator begin(void) {
- iterator it(*this);
+ iterator begin() {
+ iterator it(*this);
if (n && root_ptr) {
- it.i = 0; it.p = const_cast<T *>(read_access(0));
- if (!(it.p) || *(it.p) == T(0))
- next_pos(*(const_cast<const_pointer *>(&(it.p))), it.i);
+ it.i = 0; it.p = const_cast<T *>(read_access(0));
+ if (!(it.p) || *(it.p) == T(0))
+ next_pos(*(const_cast<const_pointer *>(&(it.p))), it.i);
}
return it;
}
- iterator end(void) { return iterator(*this); }
+ iterator end() { return iterator(*this); }
- const_iterator begin(void) const {
+ const_iterator begin() const {
const_iterator it(*this);
if (n && root_ptr) {
- it.i = 0; it.p = read_access(0);
- if (!(it.p) || *(it.p) == T(0)) next_pos(it.p, it.i);
+ it.i = 0; it.p = read_access(0);
+ if (!(it.p) || *(it.p) == T(0)) next_pos(it.p, it.i);
}
return it;
}
- const_iterator end(void) const { return const_iterator(*this); }
-
+ const_iterator end() const { return const_iterator(*this); }
+
inline ref_elt_vector<T, dsvector<T> > operator [](size_type c)
{ return ref_elt_vector<T, dsvector<T> >(this, c); }
@@ -580,22 +580,22 @@ namespace gmm {
{ const T *p = read_access(c); if (p) return *p; else return T(0); }
inline T operator [](size_type c) const { return r(c); }
-
- size_type nnz(void) const
+
+ size_type nnz() const
{ if (root_ptr) return rec_nnz(root_ptr, depth); else return 0; }
- size_type size(void) const { return n; }
+ size_type size() const { return n; }
void swap(dsvector<T> &v) {
std::swap(n, v.n); std::swap(root_ptr, v.root_ptr);
std::swap(depth, v.depth); std::swap(shift, v.shift);
std::swap(mask, v.mask);
}
-
+
/* Constructors */
dsvector(const dsvector<T> &v) { init(0); copy(v); }
dsvector<T> &operator =(const dsvector<T> &v) { copy(v); return *this; }
explicit dsvector(size_type l){ init(l); }
- dsvector(void) { init(0); }
+ dsvector() { init(0); }
~dsvector() { if (root_ptr) rec_del(root_ptr, depth); root_ptr = 0; }
};
@@ -621,10 +621,10 @@ namespace gmm {
{ o->clear(); }
static void do_clear(this_type &v) { v.clear(); }
static value_type access(const origin_type *o, const const_iterator &,
- const const_iterator &, size_type i)
+ const const_iterator &, size_type i)
{ return (*o)[i]; }
static reference access(origin_type *o, const iterator &, const iterator &,
- size_type i)
+ size_type i)
{ return (*o)[i]; }
static void resize(this_type &v, size_type n) { v.resize(n); }
};
@@ -635,12 +635,12 @@ namespace gmm {
/******* Optimized operations for dsvector<T> ****************************/
template <typename T> inline void copy(const dsvector<T> &v1,
- dsvector<T> &v2) {
+ dsvector<T> &v2) {
GMM_ASSERT2(v1.size() == v2.size(), "dimensions mismatch");
v2 = v1;
}
template <typename T> inline void copy(const dsvector<T> &v1,
- const dsvector<T> &v2) {
+ const dsvector<T> &v2) {
GMM_ASSERT2(v1.size() == v2.size(), "dimensions mismatch");
v2 = const_cast<dsvector<T> &>(v1);
}
@@ -655,23 +655,23 @@ namespace gmm {
}
template <typename T> inline
void copy(const simple_vector_ref<const dsvector<T> *> &v1,
- dsvector<T> &v2)
+ dsvector<T> &v2)
{ copy(*(v1.origin), v2); }
template <typename T> inline
void copy(const simple_vector_ref<dsvector<T> *> &v1, dsvector<T> &v2)
{ copy(*(v1.origin), v2); }
template <typename T> inline
void copy(const simple_vector_ref<dsvector<T> *> &v1,
- const simple_vector_ref<dsvector<T> *> &v2)
+ const simple_vector_ref<dsvector<T> *> &v2)
{ copy(*(v1.origin), v2); }
template <typename T> inline
void copy(const simple_vector_ref<const dsvector<T> *> &v1,
- const simple_vector_ref<dsvector<T> *> &v2)
+ const simple_vector_ref<dsvector<T> *> &v2)
{ copy(*(v1.origin), v2); }
-
+
template <typename T>
inline size_type nnz(const dsvector<T>& l) { return l.nnz(); }
-
+
/*************************************************************************/
/* */
/* Class wsvector: sparse vector optimized for random write operations, */
@@ -679,7 +679,7 @@ namespace gmm {
/* Based on std::map */
/* */
/*************************************************************************/
-
+
template<typename T> struct wsvector_iterator
: public std::map<size_type, T>::iterator {
typedef typename std::map<size_type, T>::iterator base_it_type;
@@ -689,12 +689,12 @@ namespace gmm {
// typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
-
+
reference operator *() const { return (base_it_type::operator*()).second; }
pointer operator->() const { return &(operator*()); }
- size_type index(void) const { return (base_it_type::operator*()).first; }
+ size_type index() const { return (base_it_type::operator*()).first; }
- wsvector_iterator(void) {}
+ wsvector_iterator() {}
wsvector_iterator(const base_it_type &it) : base_it_type(it) {}
};
@@ -707,12 +707,12 @@ namespace gmm {
// typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
-
+
reference operator *() const { return (base_it_type::operator*()).second; }
pointer operator->() const { return &(operator*()); }
- size_type index(void) const { return (base_it_type::operator*()).first; }
+ size_type index() const { return (base_it_type::operator*()).first; }
- wsvector_const_iterator(void) {}
+ wsvector_const_iterator() {}
wsvector_const_iterator(const wsvector_iterator<T> &it)
: base_it_type(it) {}
wsvector_const_iterator(const base_it_type &it) : base_it_type(it) {}
@@ -725,7 +725,7 @@ namespace gmm {
*/
template<typename T> class wsvector : public std::map<size_type, T> {
public:
-
+
typedef typename std::map<int, T>::size_type size_type;
typedef std::map<size_type, T> base_type;
typedef typename base_type::iterator iterator;
@@ -733,11 +733,11 @@ namespace gmm {
protected:
size_type nbl;
-
+
public:
void clean(double eps);
void resize(size_type);
-
+
inline ref_elt_vector<T, wsvector<T> > operator [](size_type c)
{ return ref_elt_vector<T, wsvector<T> >(this, c); }
@@ -750,9 +750,9 @@ namespace gmm {
inline void wa(size_type c, const T &e) {
GMM_ASSERT2(c < nbl, "out of range");
if (e != T(0)) {
- iterator it = this->lower_bound(c);
- if (it != this->end() && it->first == c) it->second += e;
- else base_type::operator [](c) = e;
+ iterator it = this->lower_bound(c);
+ if (it != this->end() && it->first == c) it->second += e;
+ else base_type::operator [](c) = e;
}
}
@@ -764,18 +764,18 @@ namespace gmm {
}
inline T operator [](size_type c) const { return r(c); }
-
- size_type nb_stored(void) const { return base_type::size(); }
- size_type size(void) const { return nbl; }
+
+ size_type nb_stored() const { return base_type::size(); }
+ size_type size() const { return nbl; }
void swap(wsvector<T> &v)
{ std::swap(nbl, v.nbl); std::map<size_type, T>::swap(v); }
-
+
/* Constructors */
void init(size_type l) { nbl = l; this->clear(); }
explicit wsvector(size_type l){ init(l); }
- wsvector(void) { init(0); }
+ wsvector() { init(0); }
};
template<typename T> void wsvector<T>::clean(double eps) {
@@ -815,10 +815,10 @@ namespace gmm {
{ o->clear(); }
static void do_clear(this_type &v) { v.clear(); }
static value_type access(const origin_type *o, const const_iterator &,
- const const_iterator &, size_type i)
+ const const_iterator &, size_type i)
{ return (*o)[i]; }
static reference access(origin_type *o, const iterator &, const iterator &,
- size_type i)
+ size_type i)
{ return (*o)[i]; }
static void resize(this_type &v, size_type n) { v.resize(n); }
};
@@ -829,7 +829,7 @@ namespace gmm {
/******* Optimized BLAS for wsvector<T> **********************************/
template <typename T> inline void copy(const wsvector<T> &v1,
- wsvector<T> &v2) {
+ wsvector<T> &v2) {
GMM_ASSERT2(vect_size(v1) == vect_size(v2), "dimensions mismatch");
v2 = v1;
}
@@ -844,7 +844,7 @@ namespace gmm {
}
template <typename T> inline
void copy(const simple_vector_ref<const wsvector<T> *> &v1,
- wsvector<T> &v2)
+ wsvector<T> &v2)
{ copy(*(v1.origin), v2); }
template <typename T> inline
void copy(const simple_vector_ref<wsvector<T> *> &v1, wsvector<T> &v2)
@@ -853,9 +853,9 @@ namespace gmm {
template <typename T> inline void clean(wsvector<T> &v, double eps) {
typedef typename number_traits<T>::magnitude_type R;
typename wsvector<T>::iterator it = v.begin(), ite = v.end(), itc;
- while (it != ite)
+ while (it != ite)
if (gmm::abs((*it).second) <= R(eps))
- { itc=it; ++it; v.erase(itc); } else ++it;
+ { itc=it; ++it; v.erase(itc); } else ++it;
}
template <typename T>
@@ -881,7 +881,7 @@ namespace gmm {
size_type c; T e;
/* e is initialized by default to avoid some false warnings of valgrind.
(from http://valgrind.org/docs/manual/mc-manual.html:
-
+
When memory is read into the CPU's floating point registers, the
relevant V bits are read from memory and they are immediately
checked. If any are invalid, an uninitialised value error is
@@ -890,7 +890,7 @@ namespace gmm {
does not have to track the validity status of the floating-point
registers.
*/
- elt_rsvector_(void) : e(0) {}
+ elt_rsvector_() : e(0) {}
elt_rsvector_(size_type cc) : c(cc), e(0) {}
elt_rsvector_(size_type cc, const T &ee) : c(cc), e(ee) {}
bool operator < (const elt_rsvector_ &a) const { return c < a.c; }
@@ -921,8 +921,8 @@ namespace gmm {
bool operator ==(const iterator &i) const { return it == i.it; }
bool operator !=(const iterator &i) const { return !(i == *this); }
- size_type index(void) const { return it->c; }
- rsvector_iterator(void) {}
+ size_type index() const { return it->c; }
+ rsvector_iterator() {}
rsvector_iterator(const IT &i) : it(i) {}
};
@@ -940,7 +940,7 @@ namespace gmm {
reference operator *() const { return it->e; }
pointer operator->() const { return &(operator*()); }
- size_type index(void) const { return it->c; }
+ size_type index() const { return it->c; }
iterator &operator ++() { ++it; return *this; }
iterator operator ++(int) { iterator tmp = *this; ++(*this); return tmp; }
@@ -950,18 +950,18 @@ namespace gmm {
bool operator ==(const iterator &i) const { return it == i.it; }
bool operator !=(const iterator &i) const { return !(i == *this); }
- rsvector_const_iterator(void) {}
+ rsvector_const_iterator() {}
rsvector_const_iterator(const rsvector_iterator<T> &i) : it(i.it) {}
rsvector_const_iterator(const IT &i) : it(i) {}
};
/**
sparse vector built upon std::vector. Read access is fast,
- but insertion is O(n)
+ but insertion is O(n)
*/
template<typename T> class rsvector : public std::vector<elt_rsvector_<T> > {
public:
-
+
typedef std::vector<elt_rsvector_<T> > base_type_;
typedef typename base_type_::iterator iterator;
typedef typename base_type_::const_iterator const_iterator;
@@ -969,14 +969,14 @@ namespace gmm {
typedef T value_type;
protected:
- size_type nbl; /* size of the vector. */
-
+ size_type nbl; // size of the vector
+
public:
void sup(size_type j);
void base_resize(size_type n) { base_type_::resize(n); }
void resize(size_type);
-
+
ref_elt_vector<T, rsvector<T> > operator [](size_type c)
{ return ref_elt_vector<T, rsvector<T> >(this, c); }
@@ -986,16 +986,16 @@ namespace gmm {
void swap_indices(size_type i, size_type j);
inline T operator [](size_type c) const { return r(c); }
-
- size_type nb_stored(void) const { return base_type_::size(); }
- size_type size(void) const { return nbl; }
- void clear(void) { base_type_::resize(0); }
+
+ size_type nb_stored() const { return base_type_::size(); }
+ size_type size() const { return nbl; }
+ void clear() { base_type_::resize(0); }
void swap(rsvector<T> &v)
{ std::swap(nbl, v.nbl); std::vector<elt_rsvector_<T> >::swap(v); }
/* Constructeurs */
explicit rsvector(size_type l) : nbl(l) { }
- rsvector(void) : nbl(0) { }
+ rsvector() : nbl(0) { }
};
template <typename T>
@@ -1012,18 +1012,18 @@ namespace gmm {
switch (situation) {
case 1 : a = *iti; a.c = j; it = iti; ++it; ite = this->end();
- for (; it != ite && it->c <= j; ++it, ++iti) *iti = *it;
- *iti = a;
- break;
+ for (; it != ite && it->c <= j; ++it, ++iti) *iti = *it;
+ *iti = a;
+ break;
case 2 : a = *itj; a.c = i; it = itj; ite = this->begin();
- if (it != ite) {
- --it;
- while (it->c >= i) { *itj = *it; --itj; if (it==ite) break; --it; }
- }
- *itj = a;
- break;
+ if (it != ite) {
+ --it;
+ while (it->c >= i) { *itj = *it; --itj; if (it==ite) break; --it; }
+ }
+ *itj = a;
+ break;
case 3 : std::swap(iti->e, itj->e);
- break;
+ break;
}
}
}
@@ -1033,8 +1033,8 @@ namespace gmm {
elt_rsvector_<T> ev(j);
iterator it = std::lower_bound(this->begin(), this->end(), ev);
if (it != this->end() && it->c == j) {
- for (iterator ite = this->end() - 1; it != ite; ++it) *it = *(it+1);
- base_resize(nb_stored()-1);
+ for (iterator ite = this->end() - 1; it != ite; ++it) *it = *(it+1);
+ base_resize(nb_stored()-1);
}
}
}
@@ -1042,7 +1042,7 @@ namespace gmm {
template<typename T> void rsvector<T>::resize(size_type n) {
if (n < nbl) {
for (size_type i = 0; i < nb_stored(); ++i)
- if (base_type_::operator[](i).c >= n) { base_resize(i); break; }
+ if (base_type_::operator[](i).c >= n) { base_resize(i); break; }
}
nbl = n;
}
@@ -1053,24 +1053,24 @@ namespace gmm {
else {
elt_rsvector_<T> ev(c, e);
if (nb_stored() == 0) {
- base_type_::push_back(ev);
+ base_type_::push_back(ev);
}
else {
- iterator it = std::lower_bound(this->begin(), this->end(), ev);
- if (it != this->end() && it->c == c) it->e = e;
- else {
- size_type ind = it - this->begin(), nb = this->nb_stored();
+ iterator it = std::lower_bound(this->begin(), this->end(), ev);
+ if (it != this->end() && it->c == c) it->e = e;
+ else {
+ size_type ind = it - this->begin(), nb = this->nb_stored();
if (nb - ind > 1100)
GMM_WARNING2("Inefficient addition of element in rsvector with "
<< this->nb_stored() - ind << " non-zero entries");
- base_type_::push_back(ev);
- if (ind != nb) {
- it = this->begin() + ind;
- iterator ite = this->end(); --ite; iterator itee = ite;
- for (; ite != it; --ite) { --itee; *ite = *itee; }
- *it = ev;
- }
- }
+ base_type_::push_back(ev);
+ if (ind != nb) {
+ it = this->begin() + ind;
+ iterator ite = this->end(); --ite; iterator itee = ite;
+ for (; ite != it; --ite) { --itee; *ite = *itee; }
+ *it = ev;
+ }
+ }
}
}
}
@@ -1080,31 +1080,31 @@ namespace gmm {
if (e != T(0)) {
elt_rsvector_<T> ev(c, e);
if (nb_stored() == 0) {
- base_type_::push_back(ev);
+ base_type_::push_back(ev);
}
else {
- iterator it = std::lower_bound(this->begin(), this->end(), ev);
- if (it != this->end() && it->c == c) it->e += e;
- else {
- size_type ind = it - this->begin(), nb = this->nb_stored();
+ iterator it = std::lower_bound(this->begin(), this->end(), ev);
+ if (it != this->end() && it->c == c) it->e += e;
+ else {
+ size_type ind = it - this->begin(), nb = this->nb_stored();
if (nb - ind > 1100)
GMM_WARNING2("Inefficient addition of element in rsvector with "
<< this->nb_stored() - ind << " non-zero entries");
- base_type_::push_back(ev);
- if (ind != nb) {
- it = this->begin() + ind;
- iterator ite = this->end(); --ite; iterator itee = ite;
- for (; ite != it; --ite) { --itee; *ite = *itee; }
- *it = ev;
- }
- }
+ base_type_::push_back(ev);
+ if (ind != nb) {
+ it = this->begin() + ind;
+ iterator ite = this->end(); --ite; iterator itee = ite;
+ for (; ite != it; --ite) { --itee; *ite = *itee; }
+ *it = ev;
+ }
+ }
}
}
}
-
+
template <typename T> T rsvector<T>::r(size_type c) const {
- GMM_ASSERT2(c < nbl, "out of range. Index " << c
- << " for a length of " << nbl);
+ GMM_ASSERT2(c < nbl, "out of range. Index " << c
+ << " for a length of " << nbl);
if (nb_stored() != 0) {
elt_rsvector_<T> ev(c);
const_iterator it = std::lower_bound(this->begin(), this->end(), ev);
@@ -1137,10 +1137,10 @@ namespace gmm {
{ o->clear(); }
static void do_clear(this_type &v) { v.clear(); }
static value_type access(const origin_type *o, const const_iterator &,
- const const_iterator &, size_type i)
+ const const_iterator &, size_type i)
{ return (*o)[i]; }
static reference access(origin_type *o, const iterator &, const iterator &,
- size_type i)
+ size_type i)
{ return (*o)[i]; }
static void resize(this_type &v, size_type n) { v.resize(n); }
};
@@ -1151,7 +1151,7 @@ namespace gmm {
/******* Optimized operations for rsvector<T> ****************************/
template <typename T> inline void copy(const rsvector<T> &v1,
- rsvector<T> &v2) {
+ rsvector<T> &v2) {
GMM_ASSERT2(vect_size(v1) == vect_size(v2), "dimensions mismatch");
v2 = v1;
}
@@ -1166,39 +1166,39 @@ namespace gmm {
}
template <typename T> inline
void copy(const simple_vector_ref<const rsvector<T> *> &v1,
- rsvector<T> &v2)
+ rsvector<T> &v2)
{ copy(*(v1.origin), v2); }
template <typename T> inline
void copy(const simple_vector_ref<rsvector<T> *> &v1, rsvector<T> &v2)
{ copy(*(v1.origin), v2); }
template <typename V, typename T> inline void add(const V &v1,
- rsvector<T> &v2) {
+ rsvector<T> &v2) {
if ((const void *)(&v1) != (const void *)(&v2)) {
GMM_ASSERT2(vect_size(v1) == vect_size(v2), "dimensions mismatch");
- add_rsvector(v1, v2, typename linalg_traits<V>::storage_type());
+ add_rsvector(v1, v2, typename linalg_traits<V>::storage_type());
}
}
- template <typename V, typename T>
+ template <typename V, typename T>
inline void add_rsvector(const V &v1, rsvector<T> &v2, abstract_dense)
{ add(v1, v2, abstract_dense(), abstract_sparse()); }
- template <typename V, typename T>
+ template <typename V, typename T>
inline void add_rsvector(const V &v1, rsvector<T> &v2, abstract_skyline)
{ add(v1, v2, abstract_skyline(), abstract_sparse()); }
- template <typename V, typename T>
+ template <typename V, typename T>
void add_rsvector(const V &v1, rsvector<T> &v2, abstract_sparse) {
add_rsvector(v1, v2, typename linalg_traits<V>::index_sorted());
}
- template <typename V, typename T>
+ template <typename V, typename T>
void add_rsvector(const V &v1, rsvector<T> &v2, linalg_false) {
add(v1, v2, abstract_sparse(), abstract_sparse());
}
- template <typename V, typename T>
+ template <typename V, typename T>
void add_rsvector(const V &v1, rsvector<T> &v2, linalg_true) {
typename linalg_traits<V>::const_iterator it1 = vect_const_begin(v1),
ite1 = vect_const_end(v1);
@@ -1227,16 +1227,16 @@ namespace gmm {
if ((const void *)(&v1) != (const void *)(&v2)) {
GMM_ASSERT2(vect_size(v1) == vect_size(v2), "dimensions mismatch");
if (same_origin(v1, v2))
- GMM_WARNING2("a conflict is possible in vector copy\n");
+ GMM_WARNING2("a conflict is possible in vector copy\n");
copy_rsvector(v1, v2, typename linalg_traits<V>::storage_type());
}
}
- template <typename V, typename T>
+ template <typename V, typename T>
void copy_rsvector(const V &v1, rsvector<T> &v2, abstract_dense)
{ copy_vect(v1, v2, abstract_dense(), abstract_sparse()); }
- template <typename V, typename T>
+ template <typename V, typename T>
void copy_rsvector(const V &v1, rsvector<T> &v2, abstract_skyline)
{ copy_vect(v1, v2, abstract_skyline(), abstract_sparse()); }
@@ -1244,7 +1244,7 @@ namespace gmm {
void copy_rsvector(const V &v1, rsvector<T> &v2, abstract_sparse) {
copy_rsvector(v1, v2, typename linalg_traits<V>::index_sorted());
}
-
+
template <typename V, typename T2>
void copy_rsvector(const V &v1, rsvector<T2> &v2, linalg_true) {
typedef typename linalg_traits<V>::value_type T1;
@@ -1271,7 +1271,7 @@ namespace gmm {
v2.base_resize(nn);
std::sort(v2.begin(), v2.end());
}
-
+
template <typename T> inline void clean(rsvector<T> &v, double eps) {
typedef typename number_traits<T>::magnitude_type R;
typename rsvector<T>::iterator it = v.begin(), ite = v.end();
@@ -1280,7 +1280,7 @@ namespace gmm {
typename rsvector<T>::iterator itc = it;
size_type erased = 1;
for (++it; it != ite; ++it)
- { *itc = *it; if (gmm::abs((*it).e) <= R(eps)) ++erased; else ++itc; }
+ { *itc = *it; if (gmm::abs((*it).e) <= R(eps)) ++erased; else ++itc; }
v.base_resize(v.nb_stored() - erased);
}
}
@@ -1294,7 +1294,7 @@ namespace gmm {
clean(*pv, eps);
svr->begin_ = vect_begin(*pv); svr->end_ = vect_end(*pv);
}
-
+
template <typename T>
inline size_type nnz(const rsvector<T>& l) { return l.nb_stored(); }
@@ -1316,8 +1316,8 @@ namespace gmm {
base_iterator it;
size_type shift;
-
-
+
+
iterator &operator ++()
{ ++it; ++shift; return *this; }
iterator &operator --()
@@ -1336,21 +1336,21 @@ namespace gmm {
{ iterator tmp = *this; return (tmp -= i); }
difference_type operator -(const iterator &i) const
{ return it - i.it; }
-
+
reference operator *() const
{ return *it; }
reference operator [](int ii)
{ return *(it + ii); }
-
+
bool operator ==(const iterator &i) const
{ return it == i.it; }
bool operator !=(const iterator &i) const
{ return !(i == *this); }
bool operator < (const iterator &i) const
{ return it < i.it; }
- size_type index(void) const { return shift; }
+ size_type index() const { return shift; }
- slvector_iterator(void) {}
+ slvector_iterator() {}
slvector_iterator(const base_iterator &iter, size_type s)
: it(iter), shift(s) {}
};
@@ -1367,8 +1367,8 @@ namespace gmm {
base_iterator it;
size_type shift;
-
-
+
+
iterator &operator ++()
{ ++it; ++shift; return *this; }
iterator &operator --()
@@ -1387,21 +1387,21 @@ namespace gmm {
{ iterator tmp = *this; return (tmp -= i); }
difference_type operator -(const iterator &i) const
{ return it - i.it; }
-
+
value_type operator *() const
{ return *it; }
value_type operator [](int ii)
{ return *(it + ii); }
-
+
bool operator ==(const iterator &i) const
{ return it == i.it; }
bool operator !=(const iterator &i) const
{ return !(i == *this); }
bool operator < (const iterator &i) const
{ return it < i.it; }
- size_type index(void) const { return shift; }
+ size_type index() const { return shift; }
- slvector_const_iterator(void) {}
+ slvector_const_iterator() {}
slvector_const_iterator(const slvector_iterator<T>& iter)
: it(iter.it), shift(iter.shift) {}
slvector_const_iterator(const base_iterator &iter, size_type s)
@@ -1412,7 +1412,7 @@ namespace gmm {
/** skyline vector.
*/
template <typename T> class slvector {
-
+
public :
typedef slvector_iterator<T> iterators;
typedef slvector_const_iterator<T> const_iterators;
@@ -1427,17 +1427,17 @@ namespace gmm {
public :
- size_type size(void) const { return size_; }
- size_type first(void) const { return shift; }
- size_type last(void) const { return shift + data.size(); }
+ size_type size() const { return size_; }
+ size_type first() const { return shift; }
+ size_type last() const { return shift + data.size(); }
ref_elt_vector<T, slvector<T> > operator [](size_type c)
{ return ref_elt_vector<T, slvector<T> >(this, c); }
- typename std::vector<T>::iterator data_begin(void) { return data.begin(); }
- typename std::vector<T>::iterator data_end(void) { return data.end(); }
- typename std::vector<T>::const_iterator data_begin(void) const
+ typename std::vector<T>::iterator data_begin() { return data.begin(); }
+ typename std::vector<T>::iterator data_end() { return data.end(); }
+ typename std::vector<T>::const_iterator data_begin() const
{ return data.begin(); }
- typename std::vector<T>::const_iterator data_end(void) const
+ typename std::vector<T>::const_iterator data_end() const
{ return data.end(); }
void w(size_type c, const T &e);
@@ -1450,7 +1450,7 @@ namespace gmm {
inline T operator [](size_type c) const { return r(c); }
void resize(size_type);
- void clear(void) { data.resize(0); shift = 0; }
+ void clear() { data.resize(0); shift = 0; }
void swap(slvector<T> &v) {
std::swap(data, v.data);
std::swap(shift, v.shift);
@@ -1458,7 +1458,7 @@ namespace gmm {
}
- slvector(void) : data(0), shift(0), size_(0) {}
+ slvector() : data(0), shift(0), size_(0) {}
explicit slvector(size_type l) : data(0), shift(0), size_(l) {}
slvector(size_type l, size_type d, size_type s)
: data(d), shift(s), size_(l) {}
@@ -1477,7 +1477,7 @@ namespace gmm {
size_type s = data.size();
if (!s) { data.resize(1); shift = c; }
else if (c < shift) {
- data.resize(s + shift - c);
+ data.resize(s + shift - c);
typename std::vector<T>::iterator it = data.begin(),it2=data.end()-1;
typename std::vector<T>::iterator it3 = it2 - shift + c;
for (; it3 >= it; --it3, --it2) *it2 = *it3;
@@ -1496,7 +1496,7 @@ namespace gmm {
size_type s = data.size();
if (!s) { data.resize(1, e); shift = c; return; }
else if (c < shift) {
- data.resize(s + shift - c);
+ data.resize(s + shift - c);
typename std::vector<T>::iterator it = data.begin(),it2=data.end()-1;
typename std::vector<T>::iterator it3 = it2 - shift + c;
for (; it3 >= it; --it3, --it2) *it2 = *it3;
@@ -1513,8 +1513,8 @@ namespace gmm {
}
data[c - shift] += e;
}
-
-
+
+
template <typename T> struct linalg_traits<slvector<T> > {
typedef slvector<T> this_type;
typedef this_type origin_type;
@@ -1541,10 +1541,10 @@ namespace gmm {
{ o->clear(); }
static void do_clear(this_type &v) { v.clear(); }
static value_type access(const origin_type *o, const const_iterator &,
- const const_iterator &, size_type i)
+ const const_iterator &, size_type i)
{ return (*o)[i]; }
static reference access(origin_type *o, const iterator &, const iterator &,
- size_type i)
+ size_type i)
{ return (*o)[i]; }
static void resize(this_type &v, size_type n) { v.resize(n); }
};