Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/management/src/G4KDMap.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 #include "G4KDMap.hh"
 27 #include "globals.hh"
 28 #include "G4KDNode.hh"
 29 #include <algorithm>
 30 
 31 using namespace std;
 32 
 33 using _deq_iterator = std::deque<G4KDNode_Base *>::iterator;
 34 
 35 G4bool __1DSortOut::sortOutNDim::operator()(G4KDNode_Base* const & lhs,
 36                                             G4KDNode_Base* const & rhs) //const
 37 {
 38   return (*lhs)[fDimension] < (*rhs)[fDimension];
 39 }
 40 
 41 __1DSortOut::__1DSortOut(std::size_t dimension) :
 42     fSortOutNDim(dimension)
 43 {
 44 }
 45 
 46 __1DSortOut::__1DSortOut(const __1DSortOut& right)  
 47 = default;
 48 
 49 G4int __1DSortOut::GetDimension()
 50 {
 51   return (G4int)fSortOutNDim.fDimension;
 52 }
 53 
 54 G4KDNode_Base* __1DSortOut::GetMidle(std::size_t& main_middle)
 55 {
 56   std::size_t contSize = fContainer.size();
 57   main_middle = (std::size_t) ceil(contSize / 2.); // ceil = round up
 58   return fContainer[main_middle];
 59 }
 60 
 61 _deq_iterator __1DSortOut::Insert(G4KDNode_Base* pos)
 62 {
 63   return fContainer.insert(fContainer.end(), pos);
 64 }
 65 
 66 G4KDNode_Base* __1DSortOut::PopOutMiddle()
 67 {
 68   std::size_t middle;
 69   G4KDNode_Base* pos = GetMidle(middle);
 70   auto deq_pos = fContainer.begin() + middle;
 71 
 72   if(deq_pos == fContainer.end()) return nullptr; // this is a double check
 73 
 74   fContainer.erase(deq_pos);
 75   return pos;
 76 }
 77 
 78 void __1DSortOut::Sort()
 79 {
 80   sort(fContainer.begin(), fContainer.end(), fSortOutNDim);
 81 }
 82 
 83 void __1DSortOut::Erase(_deq_iterator& deq_pos)
 84 {
 85   fContainer.erase(deq_pos);
 86 }
 87 
 88 void G4KDMap::Insert(G4KDNode_Base* pos)
 89 {
 90   vector<_deq_iterator>& vit = fMap[pos];
 91 
 92   std::size_t maxSize = fSortOut.size();
 93 
 94   G4cout << "G4KDMap::Insert : " << maxSize << G4endl;
 95 
 96   vit.reserve(maxSize);
 97 
 98   for (std::size_t i = 0; i < fSortOut.size(); ++i)
 99   {
100     vit[i] = fSortOut[i].Insert(pos);
101 
102 //    if(*(vit[i]) != pos)
103 //    {
104 //      G4cout << "insert wrong iterator" << G4endl;
105 //      abort();
106 //    }
107   }
108   /*
109    std::map<G4KDNode*, std::vector<_deq_iterator> >::iterator fMap_it
110    = fMap.begin();
111 
112    for( ; fMap_it != fMap.end() ; fMap_it++)
113    {
114    std::vector<_deq_iterator>&  vit = fMap_it->second;
115 
116    G4KDNode* tmpNode = fMap_it->first;
117 
118    for(std::size_t i = 0 ; i < fSortOut.size() ; i++)
119    {
120    G4cout << "i = " << i << G4endl;
121    G4cout << "vit[i] = " << *(vit[i]) << G4endl;
122    if(*(vit[i]) != tmpNode)
123    {
124    G4cout << "!!!! Wrong iterator" << G4endl;
125    abort();
126    }
127    }
128 
129    }
130    */
131 
132   fIsSorted = false;
133 }
134 
135 G4KDNode_Base* G4KDMap::PopOutMiddle(std::size_t dimension)
136 {
137   G4cout << "_____________" << G4endl;
138   G4cout << "G4KDMap::PopOutMiddle ( "<< dimension << " )" << G4endl;
139 
140   if(!fIsSorted) Sort();
141   G4KDNode_Base* output_node = fSortOut[dimension].PopOutMiddle();
142 
143   if(output_node == nullptr) return nullptr;
144 
145   G4cout << "output_node : " << output_node << G4endl;
146   G4cout << "output_node : " << output_node->GetAxis() << G4endl;
147 
148   auto fMap_it
149   = fMap.find(output_node);
150 
151 
152    if(fMap_it == fMap.end())
153    {
154      G4cout << "fMap_it == fMap.end()" << G4endl;
155      G4cout << "output_node = " << output_node << G4endl;
156      return output_node;
157    }
158 
159   std::vector<_deq_iterator>& vit = fMap_it->second;
160 
161   /*
162    if(fMap_it->first != output_node)
163    {
164    G4cout << "fMap_it->first ! output_node"<< G4endl;
165    G4cout << "fMap_it->first = " << fMap_it->first << G4endl;
166    abort();
167    }
168    */
169 
170   for(std::size_t i = 0; i < fSortOut.size(); ++i)
171   {
172     if(i != dimension)
173     {
174       G4cout << "i = " << i << G4endl;
175 
176       /*
177        // G4cout << "i = " << i << G4endl;
178        // G4cout << "vit[i] = " << *(vit[i]) << G4endl;
179        if(*(vit[i]) != output_node)
180        {
181        G4cout << "deleting wrong iterator" << G4endl;
182        abort();
183        }
184        */
185       fSortOut[i].Erase(vit[i]);
186     }
187   }
188 
189   fMap.erase(fMap_it);
190 
191   return output_node;
192 }
193 
194 void G4KDMap::Sort()
195 {
196   for (auto & i : fSortOut)
197   {
198     i.Sort();
199   }
200 
201   fIsSorted = true;
202 }
203