GiSTpenalty * MTentry::Penalty (const GiSTentry &newEntry, MTpenalty *minPenalty) const // in this case we can avoid to compute some distances by using some stored information: // minPenalty (the minimum penalty achieved so far), // newEntry.key->distance (the distance of the entry from the parent of this entry, stored in the SearchMinPenalty method) and maxradius. { assert (newEntry.IsA() == MTENTRY_CLASS); if (((MTkey *) newEntry.Key())->distance > 0 && minPenalty) { // in this case is possible to prune some entries using triangular inequality double distPen = fabs(((MTkey *) newEntry.Key())->distance - Key()->distance) - MaxRadius(); MTpenalty *tmpPen = NULL; if (distPen >= 0) { tmpPen = new MTpenalty (distPen, 0); } else { tmpPen = new MTpenalty (distPen + MaxRadius() - MaxDist(), 0); } if (!((*tmpPen)<(*minPenalty))) { // larger than or equal to minPenalty delete tmpPen; return new MTpenalty (MAXDOUBLE, 0); // avoid to compute this distance } delete tmpPen; } return Penalty (newEntry); }
GiSTpenalty * MTentry::Penalty (const GiSTentry &newEntry) const { assert (newEntry.IsA() == MTENTRY_CLASS); const MTentry& entry= (const MTentry &) newEntry; double dist = object().distance (entry.object()) + entry.MaxRadius(); double retval = dist - MaxRadius(); if (retval < 0) { // indicates that entry is contained retval = -MaxDist() + dist; } // if the entry can fit in (more than) a node without enlarging its radius, we assign it to its nearest node return new MTpenalty (retval, dist); }
Pairing * TripletThetaPhiPredictor::run(HitCollection & hits, const DetectorGeometry & geom, const GeometrySupplement & geomSupplement, const Dictionary & dict, int nThreads, const TripletConfigurations & layerTriplets, const Grid & grid, const Pairing & pairs){ uint nPairs = pairs.pairing.get_count(); LOG << "Initializing prefix sum for prediction..."; clever::vector<uint, 1> m_prefixSum(0, nPairs+1, ctx); LOG << "done[" << m_prefixSum.get_count() << "]" << std::endl; uint nGroups = (uint) std::max(1.0f, ceil(((float) nPairs)/nThreads)); LOG << "Running predict kernel..."; cl_event evt = predictCount.run( //detector geometry geom.transfer.buffer(RadiusDict()), dict.transfer.buffer(Radius()), geomSupplement.transfer.buffer(MinRadius()), geomSupplement.transfer.buffer(MaxRadius()), grid.transfer.buffer(Boundary()), layerTriplets.transfer.buffer(Layer3()), grid.config.nLayers, grid.config.MIN_Z, grid.config.sectorSizeZ(), grid.config.nSectorsZ, grid.config.MIN_PHI, grid.config.sectorSizePhi(), grid.config.nSectorsPhi, //configuration layerTriplets.transfer.buffer(sigmaZ()), layerTriplets.transfer.buffer(sigmaPhi()), layerTriplets.minRadiusCurvature(), // input pairs.pairing.get_mem(), nPairs, hits.transfer.buffer(GlobalX()), hits.transfer.buffer(GlobalY()), hits.transfer.buffer(GlobalZ()), hits.transfer.buffer(EventNumber()), hits.transfer.buffer(DetectorLayer()), hits.transfer.buffer(DetectorId()), hits.transfer.buffer(HitId()), // output m_prefixSum.get_mem(), //thread config range(nGroups * nThreads), range(nThreads)); TripletThetaPhiPredictor::events.push_back(evt); LOG << "done" << std::endl; if(PROLIX){ PLOG << "Fetching prefix sum for prediction..."; std::vector<uint> vPrefixSum(m_prefixSum.get_count()); transfer::download(m_prefixSum,vPrefixSum,ctx); PLOG << "done" << std::endl; PLOG << "Prefix sum: "; for(auto i : vPrefixSum){ PLOG << i << " ; "; } PLOG << std::endl; } //Calculate prefix sum PrefixSum prefixSum(ctx); evt = prefixSum.run(m_prefixSum.get_mem(), m_prefixSum.get_count(), nThreads, TripletThetaPhiPredictor::events); uint nFoundTripletCandidates; transfer::downloadScalar(m_prefixSum, nFoundTripletCandidates, ctx, true, m_prefixSum.get_count()-1, 1, &evt); if(PROLIX){ PLOG << "Fetching prefix sum for prediction..."; std::vector<uint> vPrefixSum(m_prefixSum.get_count()); transfer::download(m_prefixSum,vPrefixSum,ctx); PLOG << "done" << std::endl; PLOG << "Prefix sum: "; for(auto i : vPrefixSum){ PLOG << i << " ; "; } PLOG << std::endl; } LOG << "Initializing triplet candidates..."; Pairing * m_triplets = new Pairing(ctx, nFoundTripletCandidates, grid.config.nEvents, layerTriplets.size()); LOG << "done[" << m_triplets->pairing.get_count() << "]" << std::endl; LOG << "Running predict store kernel..."; evt = predictStore.run( //geometry geom.transfer.buffer(RadiusDict()), dict.transfer.buffer(Radius()), geomSupplement.transfer.buffer(MinRadius()), geomSupplement.transfer.buffer(MaxRadius()), grid.transfer.buffer(Boundary()), layerTriplets.transfer.buffer(Layer3()), grid.config.nLayers, grid.config.MIN_Z, grid.config.sectorSizeZ(), grid.config.nSectorsZ, grid.config.MIN_PHI, grid.config.sectorSizePhi(), grid.config.nSectorsPhi, //configuration layerTriplets.transfer.buffer(sigmaZ()), layerTriplets.transfer.buffer(sigmaPhi()), layerTriplets.size(), layerTriplets.minRadiusCurvature(), //input pairs.pairing.get_mem(), pairs.pairing.get_count(), hits.transfer.buffer(GlobalX()), hits.transfer.buffer(GlobalY()), hits.transfer.buffer(GlobalZ()), hits.transfer.buffer(EventNumber()), hits.transfer.buffer(DetectorLayer()), hits.transfer.buffer(DetectorId()), //oracle m_prefixSum.get_mem(), // output m_triplets->pairing.get_mem(), m_triplets->pairingOffsets.get_mem(), //thread config range(nGroups * nThreads), range(nThreads)); TripletThetaPhiPredictor::events.push_back(evt); LOG << "done" << std::endl; LOG << "Running filter offset monotonize kernel..."; nGroups = (uint) std::max(1.0f, ceil(((float) m_triplets->pairingOffsets.get_count())/nThreads)); evt = predictOffsetMonotonizeStore.run( m_triplets->pairingOffsets.get_mem(), m_triplets->pairingOffsets.get_count(), range(nGroups * nThreads), range(nThreads)); TripletThetaPhiPredictor::events.push_back(evt); LOG << "done" << std::endl; if(PROLIX){ PLOG << "Fetching triplet candidates..."; std::vector<uint2> cands = m_triplets->getPairings(); PLOG <<"done[" << cands.size() << "]" << std::endl; PLOG << "Candidates:" << std::endl; for(uint i = 0; i < nFoundTripletCandidates; ++i){ PLOG << "[" << i << "] " << cands[i].x << "-" << cands[i].y << std::endl; } PLOG << "Fetching candidates offets..."; std::vector<uint> candOffsets = m_triplets->getPairingOffsets(); PLOG <<"done[" << candOffsets.size() << "]" << std::endl; PLOG << "Candidate Offsets:" << std::endl; for(uint i = 0; i < candOffsets.size(); ++i){ PLOG << "[" << i << "] " << candOffsets[i] << std::endl; } } return m_triplets; }