void SymmetricGeomEquil( Matrix<F>& A, Matrix<Base<F>>& d, bool progress ) { DEBUG_ONLY(CSE cse("SymmetricGeomEquil")) // TODO: Ensure A is symmetric typedef Base<F> Real; const Int n = A.Height(); Ones( d, n, 1 ); // TODO: Expose these as control parameters const Int minIter = 3; const Int maxIter = 10; const Real damp = Real(1)/Real(1000); const Real relTol = Real(9)/Real(10); // Compute the original ratio of the maximum to minimum nonzero auto maxAbs = MaxAbsLoc( A ); const Real maxAbsVal = maxAbs.value; if( maxAbsVal == Real(0) ) return; const Real minAbsVal = MinAbsNonzero( A, maxAbsVal ); Real ratio = maxAbsVal / minAbsVal; if( progress ) cout << " Original ratio is " << maxAbsVal << "/" << minAbsVal << "=" << ratio << endl; Matrix<Real> scales; Zeros( scales, n, 1 ); const Real sqrtDamp = Sqrt(damp); for( Int iter=0; iter<maxIter; ++iter ) { // Geometrically equilibrate the columns
const Int n = A.Width(); Ones( dRowA, mA, 1 ); Ones( dRowB, mB, 1 ); Ones( dCol, n, 1 ); // TODO: Expose these as control parameters const Int minIter = 3; const Int maxIter = 6; const Real relTol = Real(9)/Real(10); // TODO: Incorporate damping //const Real damp = Real(1)/Real(1000); //const Real sqrtDamp = Sqrt(damp); // Compute the original ratio of the maximum to minimum nonzero auto maxAbsA = MaxAbsLoc( A ); auto maxAbsB = MaxAbsLoc( B ); const Real maxAbsVal = Max(maxAbsA.value,maxAbsB.value); if( maxAbsVal == Real(0) ) return; const Real minAbsValA = MinAbsNonzero( A, maxAbsVal ); const Real minAbsValB = MinAbsNonzero( B, maxAbsVal ); const Real minAbsVal = Min(minAbsValA,minAbsValB); Real ratio = maxAbsVal / minAbsVal; if( progress && A.Grid().Rank() == 0 ) Output("Original ratio is ",maxAbsVal,"/",minAbsVal,"=",ratio); DistMatrix<Real,MC,STAR> rowScaleA(A.Grid()), rowScaleB(A.Grid()); DistMatrix<Real,MR,STAR> colScale(A.Grid()), colScaleB(B.Grid()); const Int indent = PushIndent();