void Dets ( const ElementalMatrix<Real>& xPre, ElementalMatrix<Real>& dPre, const ElementalMatrix<Int>& ordersPre, const ElementalMatrix<Int>& firstIndsPre, Int cutoff ) { DEBUG_CSE AssertSameGrids( xPre, dPre, ordersPre, firstIndsPre ); ElementalProxyCtrl ctrl; ctrl.colConstrain = true; ctrl.colAlign = 0; DistMatrixReadProxy<Real,Real,VC,STAR> xProx( xPre, ctrl ); DistMatrixWriteProxy<Real,Real,VC,STAR> dProx( dPre, ctrl ); DistMatrixReadProxy<Int,Int,VC,STAR> ordersProx( ordersPre, ctrl ), firstIndsProx( firstIndsPre, ctrl ); auto& x = xProx.GetLocked(); auto& d = dProx.Get(); auto& orders = ordersProx.GetLocked(); auto& firstInds = firstIndsProx.GetLocked(); auto Rx = x; soc::Reflect( Rx, orders, firstInds ); soc::Dots( x, Rx, d, orders, firstInds, cutoff ); }
void GetMappedDiagonal ( const DistMatrix<T,U,V>& A, AbstractDistMatrix<S>& dPre, function<S(const T&)> func, Int offset ) { EL_DEBUG_CSE EL_DEBUG_ONLY(AssertSameGrids( A, dPre )) ElementalProxyCtrl ctrl; ctrl.colConstrain = true; ctrl.colAlign = A.DiagonalAlign(offset); ctrl.rootConstrain = true; ctrl.root = A.DiagonalRoot(offset); DistMatrixWriteProxy<S,S,DiagCol<U,V>(),DiagRow<U,V>()> dProx( dPre, ctrl ); auto& d = dProx.Get(); d.Resize( A.DiagonalLength(offset), 1 ); if( d.Participating() ) { const Int diagShift = d.ColShift(); const Int iStart = diagShift + Max(-offset,0); const Int jStart = diagShift + Max( offset,0); const Int colStride = A.ColStride(); const Int rowStride = A.RowStride(); const Int iLocStart = (iStart-A.ColShift()) / colStride; const Int jLocStart = (jStart-A.RowShift()) / rowStride; const Int iLocStride = d.ColStride() / colStride; const Int jLocStride = d.ColStride() / rowStride; const Int localDiagLength = d.LocalHeight(); S* dBuf = d.Buffer(); const T* ABuf = A.LockedBuffer(); const Int ldim = A.LDim(); EL_PARALLEL_FOR for( Int k=0; k<localDiagLength; ++k ) { const Int iLoc = iLocStart + k*iLocStride; const Int jLoc = jLocStart + k*jLocStride; dBuf[k] = func(ABuf[iLoc+jLoc*ldim]); } } }
void SymmetricRuizEquil ( ElementalMatrix<F>& APre, ElementalMatrix<Base<F>>& dPre, Int maxIter, bool progress ) { DEBUG_CSE typedef Base<F> Real; ElementalProxyCtrl control; control.colConstrain = true; control.rowConstrain = true; control.colAlign = 0; control.rowAlign = 0; DistMatrixReadWriteProxy<F,F,MC,MR> AProx( APre, control ); DistMatrixWriteProxy<Real,Real,MC,STAR> dProx( dPre, control ); auto& A = AProx.Get(); auto& d = dProx.Get(); const Int n = A.Height(); Ones( d, n, 1 ); DistMatrix<Real,MR,STAR> scales(A.Grid()); const Int indent = PushIndent(); for( Int iter=0; iter<maxIter; ++iter ) { // Rescale the columns (and rows) // ------------------------------ ColumnMaxNorms( A, scales ); EntrywiseMap( scales, function<Real(Real)>(DampScaling<Real>) ); EntrywiseMap( scales, function<Real(Real)>(SquareRootScaling<Real>) ); DiagonalScale( LEFT, NORMAL, scales, d ); // TODO: Replace with SymmetricDiagonalSolve DiagonalSolve( RIGHT, NORMAL, scales, A ); DiagonalSolve( LEFT, NORMAL, scales, A ); } SetIndent( indent ); }