📄 blockedsymm.cc
字号:
ExEnv::errn() << indent << "BlockedSymmSCMatrix::" << "accumulate_symmetric_product(SCMatrix*a): bad dim\n"; abort(); } int mxnb = (d->blocks()->nblock() > la->nblocks_) ? d->blocks()->nblock() : la->nblocks_; int &mi = (d->blocks()->nblock()==1) ? zero : i; for (i=0; i < mxnb; i++) if (mats_[mi].nonnull() && la->mats_[i].nonnull()) mats_[mi]->accumulate_symmetric_product(la->mats_[i].pointer());}// computes this += a + a.tvoidBlockedSymmSCMatrix::accumulate_symmetric_sum(SCMatrix*a){ // make sure that the argument is of the correct type BlockedSCMatrix* la = require_dynamic_cast<BlockedSCMatrix*>(a,"BlockedSymmSCMatrix::" "accumulate_symmetric_sum"); if (!dim()->equiv(la->rowdim()) || !dim()->equiv(la->coldim())) { ExEnv::errn() << indent << "BlockedSymmSCMatrix::" << "accumulate_symmetric_sum(SCMatrix*a): bad dim\n"; abort(); } for (int i=0; i < d->blocks()->nblock(); i++) if (mats_[i].nonnull()) mats_[i]->accumulate_symmetric_sum(la->mats_[i].pointer());}voidBlockedSymmSCMatrix::accumulate_symmetric_outer_product(SCVector*a){ // make sure that the argument is of the correct type BlockedSCVector* la = require_dynamic_cast<BlockedSCVector*>(a,"BlockedSymmSCMatrix::" "accumulate_symmetric_outer_product"); if (!dim()->equiv(la->dim())) { ExEnv::errn() << indent << "BlockedSymmSCMatrix::" << "accumulate_symmetric_outer_product(SCMatrix*a): bad dim\n"; abort(); } for (int i=0; i < d->blocks()->nblock(); i++) if (mats_[i].nonnull()) mats_[i]->accumulate_symmetric_outer_product(la->vecs_[i].pointer());}// this += a * b * transpose(a)voidBlockedSymmSCMatrix::accumulate_transform(SCMatrix*a,SymmSCMatrix*b, SCMatrix::Transform t){ int i, zero=0; // do the necessary castdowns BlockedSCMatrix*la = require_dynamic_cast<BlockedSCMatrix*>(a,"%s::accumulate_transform", class_name()); BlockedSymmSCMatrix*lb = require_dynamic_cast<BlockedSymmSCMatrix*>( b,"%s::accumulate_transform", class_name()); // check the dimensions if (t == SCMatrix::NormalTransform) { if (!dim()->equiv(la->rowdim()) || !lb->dim()->equiv(la->coldim())) { ExEnv::outn() << indent << "BlockedSymmSCMatrix::accumulate_transform: bad dim (not transposed)\n"; ExEnv::outn() << "target dim:" << endl; dim()->print(); ExEnv::outn() << "source dim" << endl; b->dim()->print(); ExEnv::outn() << "transform dims" << endl; a->rowdim()->print(); a->coldim()->print(); abort(); } } else { if (!dim()->equiv(la->coldim()) || !lb->dim()->equiv(la->rowdim())) { ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate_transform: bad dim\n"; abort(); } } int mxnb = (d->blocks()->nblock() > la->nblocks_) ? d->blocks()->nblock() : la->nblocks_; int &mi = (d->blocks()->nblock()==1) ? zero : i; int &bi = (lb->d->blocks()->nblock()==1) ? zero : i; for (i=0; i < mxnb; i++) { if (mats_[mi].null() || la->mats_[i].null() || lb->mats_[bi].null()) continue; mats_[mi]->accumulate_transform(la->mats_[i].pointer(), lb->mats_[bi].pointer(),t); }}// this += a * b * transpose(a)voidBlockedSymmSCMatrix::accumulate_transform(SCMatrix*a,DiagSCMatrix*b, SCMatrix::Transform t){ int i, zero=0; // do the necessary castdowns BlockedSCMatrix*la = require_dynamic_cast<BlockedSCMatrix*>(a,"%s::accumulate_transform", class_name()); BlockedDiagSCMatrix*lb = require_dynamic_cast<BlockedDiagSCMatrix*>(b,"%s::accumulate_transform", class_name()); // check the dimensions if (!dim()->equiv(la->rowdim()) || !lb->dim()->equiv(la->coldim())) { ExEnv::errn() << indent << "BlockedSymmSCMatrix::accumulate_transform: bad dim\n"; abort(); } int mxnb = (d->blocks()->nblock() > la->nblocks_) ? d->blocks()->nblock() : la->nblocks_; int &mi = (d->blocks()->nblock()==1) ? zero : i; int &bi = (lb->d->blocks()->nblock()==1) ? zero : i; for (i=0; i < mxnb; i++) { if (mats_[mi].null() || la->mats_[i].null() || lb->mats_[bi].null()) continue; mats_[mi]->accumulate_transform(la->mats_[i].pointer(), lb->mats_[bi].pointer()); }}voidBlockedSymmSCMatrix::accumulate_transform(SymmSCMatrix*a,SymmSCMatrix*b){ SymmSCMatrix::accumulate_transform(a,b);}voidBlockedSymmSCMatrix::element_op(const Ref<SCElementOp>& op){ BlockedSCElementOp *bop = dynamic_cast<BlockedSCElementOp*>(op.pointer()); int nb = d->blocks()->nblock(); op->defer_collect(1); for (int i=0; i < nb; i++) { if (bop) bop->working_on(i); if (mats_[i].nonnull()) mats_[i]->element_op(op); } op->defer_collect(0); if (op->has_collect()) op->collect(messagegrp());}voidBlockedSymmSCMatrix::element_op(const Ref<SCElementOp2>& op, SymmSCMatrix* m){ BlockedSymmSCMatrix *lm = require_dynamic_cast<BlockedSymmSCMatrix*>(m, "BlockedSymSCMatrix::element_op"); if (!dim()->equiv(lm->dim())) { ExEnv::errn() << indent << "BlockedSymmSCMatrix: bad element_op\n"; abort(); } BlockedSCElementOp2 *bop = dynamic_cast<BlockedSCElementOp2*>(op.pointer()); int nb = d->blocks()->nblock(); op->defer_collect(1); for (int i=0; i < nb; i++) { if (bop) bop->working_on(i); if (mats_[i].nonnull()) mats_[i]->element_op(op,lm->mats_[i].pointer()); } op->defer_collect(0); if (op->has_collect()) op->collect(messagegrp());}voidBlockedSymmSCMatrix::element_op(const Ref<SCElementOp3>& op, SymmSCMatrix* m,SymmSCMatrix* n){ BlockedSymmSCMatrix *lm = require_dynamic_cast<BlockedSymmSCMatrix*>(m, "BlockedSymSCMatrix::element_op"); BlockedSymmSCMatrix *ln = require_dynamic_cast<BlockedSymmSCMatrix*>(n, "BlockedSymSCMatrix::element_op"); if (!dim()->equiv(lm->dim()) || !dim()->equiv(ln->dim())) { ExEnv::errn() << indent << "BlockedSymmSCMatrix: bad element_op\n"; abort(); } BlockedSCElementOp3 *bop = dynamic_cast<BlockedSCElementOp3*>(op.pointer()); int nb = d->blocks()->nblock(); op->defer_collect(1); for (int i=0; i < nb; i++) { if (bop) bop->working_on(i); if (mats_[i].nonnull()) mats_[i]->element_op(op,lm->mats_[i].pointer(), ln->mats_[i].pointer()); } op->defer_collect(0); if (op->has_collect()) op->collect(messagegrp());}voidBlockedSymmSCMatrix::vprint(const char *title, ostream& os, int prec) const{ int len = (title) ? strlen(title) : 0; char *newtitle = new char[len + 80]; for (int i=0; i < d->blocks()->nblock(); i++) { if (mats_[i].null()) continue; sprintf(newtitle,"%s: block %d",title,i+1); mats_[i]->print(newtitle, os, prec); } delete[] newtitle;}RefSCDimensionBlockedSymmSCMatrix::dim(int i) const{ return d->blocks()->subdim(i);}intBlockedSymmSCMatrix::nblocks() const{ return d->blocks()->nblock();}RefSymmSCMatrixBlockedSymmSCMatrix::block(int i){ return mats_[i];}Ref<SCMatrixSubblockIter>BlockedSymmSCMatrix::local_blocks(SCMatrixSubblockIter::Access access){ Ref<SCMatrixCompositeSubblockIter> iter = new SCMatrixCompositeSubblockIter(access,nblocks()); for (int i=0; i<nblocks(); i++) { if (block(i).null()) iter->set_iter(i, new SCMatrixNullSubblockIter(access)); else iter->set_iter(i, block(i)->local_blocks(access)); } Ref<SCMatrixSubblockIter> ret = iter.pointer(); return ret;}Ref<SCMatrixSubblockIter>BlockedSymmSCMatrix::all_blocks(SCMatrixSubblockIter::Access access){ Ref<SCMatrixCompositeSubblockIter> iter = new SCMatrixCompositeSubblockIter(access,nblocks()); for (int i=0; i<nblocks(); i++) { if (block(i).null()) iter->set_iter(i, new SCMatrixNullSubblockIter(access)); else iter->set_iter(i, block(i)->all_blocks(access)); } Ref<SCMatrixSubblockIter> ret = iter.pointer(); return ret;}voidBlockedSymmSCMatrix::save(StateOut&s){ int ndim = n(); s.put(ndim); int has_subblocks = 1; s.put(has_subblocks); s.put(nblocks()); for (int i=0; i<nblocks(); i++) { block(i).save(s); }}voidBlockedSymmSCMatrix::restore(StateIn& s){ int ndimt, ndim = n(); s.get(ndimt); if (ndimt != ndim) { ExEnv::errn() << indent << "BlockedSymmSCMatrix::restore(): bad dimension" << endl; abort(); } int has_subblocks; s.get(has_subblocks); if (has_subblocks) { int nblock; s.get(nblock); if (nblock != nblocks()) { ExEnv::errn() << indent << "BlockedSymmSCMatrix::restore(): nblock differs\n" << endl; abort(); } for (int i=0; i<nblocks(); i++) { block(i).restore(s); } } else { ExEnv::errn() << indent << "BlockedSymmSCMatrix::restore(): no subblocks--cannot restore" << endl; abort(); }}voidBlockedSymmSCMatrix::convert_accumulate(SymmSCMatrix*a){ // ok, are we converting a non-blocked matrix to a blocked one, or are // we converting a blocked matrix from one specialization to another? if (dynamic_cast<BlockedSymmSCMatrix*>(a)) { BlockedSymmSCMatrix *ba = dynamic_cast<BlockedSymmSCMatrix*>(a); if (ba->nblocks() == this->nblocks()) { for (int i=0; i < nblocks(); i++) mats_[i]->convert_accumulate(ba->mats_[i]); } else { ExEnv::errn() << indent << "BlockedSymmSCMatrix::convert_accumulate: " << "can't convert from BlockedSymmSCMatrix with different nblock" << endl; abort(); } } else { if (nblocks()==1) { mats_[0]->convert_accumulate(a); } else { ExEnv::errn() << indent << "BlockedSymmSCMatrix::convert_accumulate: " << "can't convert from SymmSCMatrix when nblocks != 1" << endl; abort(); } }}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -