diff --git a/src/tools/LatticeReduction.cpp b/src/tools/LatticeReduction.cpp index 5cbbb23642f2a3873a44af3bafd761f07737d8e5..db010fe947e5307d24874fea9f73df99dc3809d7 100644 --- a/src/tools/LatticeReduction.cpp +++ b/src/tools/LatticeReduction.cpp @@ -21,10 +21,11 @@ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ #include "Exception.h" #include "LatticeReduction.h" +#include <stdio.h> namespace PLMD{ -const double epsilon=1e-28; +const double epsilon=1e-14; void LatticeReduction::sort(Vector v[3]){ for(int i=0;i<3;i++) for(int j=i+1;j<3;j++) if(modulo2(v[i])>modulo2(v[j])){ @@ -36,6 +37,7 @@ void LatticeReduction::sort(Vector v[3]){ void LatticeReduction::reduce(Vector&a,Vector&b){ double ma=modulo2(a); double mb=modulo2(b); + unsigned counter=0; while(true){ if(mb>ma){ Vector t(a); a=b; b=t; @@ -44,6 +46,8 @@ void LatticeReduction::reduce(Vector&a,Vector&b){ a-=b*floor(dotProduct(a,b)/modulo2(b)+0.5); ma=modulo2(a); if(mb<=ma+epsilon) break; + counter++; + if(counter%10000==0) fprintf(stderr,"WARNING: LatticeReduction::reduce stuck after %u iterations\n",counter); } Vector t(a); a=b; b=t; @@ -100,6 +104,7 @@ void LatticeReduction::reduceFast(Tensor&t){ v[0]=t.getRow(0); v[1]=t.getRow(1); v[2]=t.getRow(2); + unsigned counter=0; while(true){ sort(v); reduce(v[0],v[1]); @@ -129,6 +134,8 @@ void LatticeReduction::reduceFast(Tensor&t){ } } if(modulo2(best)+epsilon>=modulo2(v[2])) break; + counter++; + if(counter%10000==0) fprintf(stderr,"WARNING: LatticeReduction::reduceFast stuck after %u iterations\n",counter); v[2]=best; } sort(v);