shared_ptr<mat> filtering(const mat& mrating, mpq& msim){ cout<<"collaborative filtering..."<<endl; shared_ptr<mat> pm_predict(new mat(mrating)); mat& m_predict = *pm_predict; int max_row_index = base ? nitem : nuser; for(mpq_i i=msim.begin(); i!=msim.end(); ++i){ cout<<(i->first+1) * 100 / max_row_index<<"%\r"; cout.flush(); // get current row row ri(m_predict, i->first); pq& q = i->second; // pop all sim rows for(;!q.empty(); q.pop()){ int index = q.top().first; double sim = q.top().second; crow rj(mrating, index); switch(sim_summing){ case 0: ri += rj * sim; break; case 1: for(crow::const_iterator j=rj.begin(); j!=rj.end(); ++j){ int col = j.index(); double v = 1 - ( 1 - ri(col) ) * ( 1 - *j * sim ); if(v) ri(col) = v; } break; default: break; } } } cout<<endl; if(vm.count("verbose")) cout<<"prediction matrix:\n"<<m_predict<<endl; return pm_predict; }