SearchResult InventorSearcher::search(string query) { auto g = pminer.g.get(); SearchResult result; unordered_map<int, vector<QueryItem>> inventor_pats; //searching section LOG(INFO) << "Searching for query: " << query; auto enumer = pminer.search_patents(query, pat_count); LOG(INFO) << "Generating Inventor Pats... patents: " << enumer.size(); for (auto& item : enumer) { auto vi = g->Vertices(); vi->MoveTo(item.docId); for (auto edgeIt = vi->InEdges(); edgeIt->Alive(); edgeIt->Next()) { if (edgeIt->TypeName() == "PatentInventor") { int gid = edgeIt->SourceId(); inventor_pats[gid].push_back(item); } } } LOG(INFO) << "Scoring... inventors: " << inventor_pats.size(); //start caculation score for (auto& gpats : inventor_pats) { QueryItem item{gpats.first, get_score_inventor(gpats, pminer)}; if (item.score > 20 || result.size() <= 5000) result.push_back(item); } LOG(INFO) << "Sorting..."; std::sort(result.begin(), result.end()); if (result.size() > 5000) result.resize(5000); return result; }
void point_serial_transfer(Mesh &srcrend, Interp::UserFunc *ufunc, UInt num_fields, MEField<> *const *sfields, _field *const *dfields, int *iflag, SearchResult &sres) { Trace __trace("point_serial_transfer(Interp::UserFunc *ufunc, UInt num_fields, MEField<> *const *sfields, _field *const *dfields, int *iflag, SearchResult &sres)"); if (num_fields == 0) return; SearchResult::iterator sb = sres.begin(), se = sres.end(); for (; sb != se; sb++) { Search_result &sres = **sb; // Trick: Gather the data from the source field so we may call interpolate point const MeshObj &elem = *(*sb)->elem; UInt pdim = GetMeshObjTopo(elem)->parametric_dim; // Inner loop through fields for (UInt i = 0; i < num_fields; i++) { if (iflag[i] != Interp::INTERP_STD) continue; MEField<> &sfield = *sfields[i]; _field &dfield = *dfields[i]; // Load Parametric coords UInt npts = sres.nodes.size(); // number of points to interpolate std::vector<double> pcoord(pdim*npts); for (UInt np = 0; np < npts; np++) { for (UInt pd = 0; pd < pdim; pd++) pcoord[np*pdim+pd] = sres.nodes[np].pcoord[pd]; } std::vector<double> ires(npts*sfield.dim()); if (!ufunc) { MEValues<> mev(sfield.GetMEFamily()); arbq pintg(pdim, npts, &pcoord[0]); mev.Setup(elem, MEV::update_sf, &pintg); mev.ReInit(elem); mev.GetFunctionValues(sfield, &ires[0]); } else { ufunc->evaluate(srcrend, elem, sfield, npts, &pcoord[0], &ires[0]); } // Copy data to nodes for (UInt n = 0; n < npts; n++) { const MeshObj &node = *sres.nodes[n].node; for (UInt d = 0; d < dfield.dim(node); d++) ((double*)dfield.data(node))[d] = ires[n*dfield.dim(node)+d]; } } // for fields } // for searchresult }
/* * Patch interpolation, where destination and source fields are nodal. */ void patch_serial_transfer(MEField<> &src_coord_field, UInt _nfields, MEField<>* const* _sfields, _field* const *_dfields, const std::vector<Interp::FieldPair> &fpairs, SearchResult &sres, Mesh &srcmesh) { Trace __trace("patch_serial_transfer(MEField<> &src_coord_field, UInt _nfields, MEField<>* const* _sfields, _field* const *_dfields, int *iflag, SearchResult &sres)"); std::set<int> pdeg_set; std::map<int, ElemPatch<>*> patch_map; if (_nfields == 0) return; // Get mask field pointer MEField<> *src_mask_ptr = srcmesh.GetField("mask"); std::vector<MEField<>* > fields; std::vector<_field* > dfields; std::vector<int> orders; UInt nrhs = 0; for (UInt i = 0; i < _nfields; i++) { // Only process interp_patch if (fpairs[i].idata != Interp::INTERP_PATCH) continue; pdeg_set.insert(fpairs[i].patch_order); //ThrowRequire(_sfields[i]->is_nodal()); fields.push_back(_sfields[i]); dfields.push_back(_dfields[i]); orders.push_back(fpairs[i].patch_order); nrhs += _sfields[i]->dim(); // how many rhs for recovery } // Create the recovery field SearchResult::iterator sb = sres.begin(), se = sres.end(); for (; sb != se; sb++) { Search_result &sres = **sb; // Trick: Gather the data from the source field so we may call interpolate point const MeshObj &elem = *(*sb)->elem; //std::cout << "Transfer: elem:" << elem.get_id() << std::endl; { std::set<int>::iterator pi = pdeg_set.begin(), pe = pdeg_set.end(); for (; pi != pe; ++pi) { ElemPatch<> *epatch = new ElemPatch<>(); epatch->CreateElemPatch(*pi, ElemPatch<>::GAUSS_PATCH, elem, src_coord_field, src_mask_ptr, fields.size(), &fields[0], 700000 ); patch_map[*pi] = epatch; } } // Gather parametric coords into an array. UInt pdim = GetMeshObjTopo(elem)->parametric_dim; UInt npts = sres.nodes.size(); // number of points to interpolate std::vector<double> pc(pdim*npts); for (UInt np = 0; np < npts; np++) { for (UInt pd = 0; pd < pdim; pd++) { pc[np*pdim+pd] = sres.nodes[np].pcoord[pd]; } } std::map<int, std::vector<double> > result; { std::set<int>::iterator pi = pdeg_set.begin(), pe = pdeg_set.end(); for (; pi != pe; ++pi) { std::pair<std::map<int, std::vector<double> >::iterator, bool> ri = result.insert(std::make_pair(*pi, std::vector<double>())); ThrowRequire(ri.second == true); ri.first->second.resize(nrhs*npts); ElemPatch<> &epatch = *patch_map[*pi]; epatch.Eval(npts, &pc[0], &(ri.first->second[0])); } } std::vector<std::vector<double>* > field_results; for (UInt i = 0; i < dfields.size(); i++) field_results.push_back(&result[orders[i]]); // Now copy data into fields for (UInt np = 0; np < npts; np++) { const MeshObj &snode = *sres.nodes[np].node; UInt cur_field = 0; for (UInt i = 0; i < dfields.size(); i++) { const _field &dfield = *dfields[i]; std::vector<double> &results = *field_results[i]; if (dfield.OnObj(snode)) { UInt fdim = dfield.dim(snode); double *data = dfield.data(snode); for (UInt f = 0; f < fdim; f++) { data[f] = results[np*nrhs+(cur_field+f)]; } } cur_field += dfield.dim(snode); } // for fi } // for np std::map<int, ElemPatch<>*>::iterator pi = patch_map.begin(), pe = patch_map.end(); for (; pi != pe; ++pi) delete pi->second; } // for searchresult }