Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4KDMap.cc
Go to the documentation of this file.
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
31using namespace std;
32
33using _deq_iterator = std::deque<G4KDNode_Base *>::iterator;
34
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
47= default;
48
53
54G4KDNode_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
62{
63 return fContainer.insert(fContainer.end(), pos);
64}
65
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
79{
80 sort(fContainer.begin(), fContainer.end(), fSortOutNDim);
81}
82
84{
85 fContainer.erase(deq_pos);
86}
87
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
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
195{
196 for (auto & i : fSortOut)
197 {
198 i.Sort();
199 }
200
201 fIsSorted = true;
202}
std::deque< G4KDNode_Base * >::iterator _deq_iterator
Definition G4KDMap.cc:33
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
void Insert(G4KDNode_Base *pos)
Definition G4KDMap.cc:88
void Sort()
Definition G4KDMap.cc:194
G4KDNode_Base * PopOutMiddle(std::size_t dimension)
Definition G4KDMap.cc:135
G4int GetAxis() const
Definition G4KDNode.hh:79
__1DSortOut(std::size_t dimension)
Definition G4KDMap.cc:41
G4KDNode_Base * GetMidle(std::size_t &)
Definition G4KDMap.cc:54
std::deque< G4KDNode_Base * >::iterator Insert(G4KDNode_Base *)
Definition G4KDMap.cc:61
G4KDNode_Base * PopOutMiddle()
Definition G4KDMap.cc:66
G4int GetDimension()
Definition G4KDMap.cc:49
void Erase(std::deque< G4KDNode_Base * >::iterator &)
Definition G4KDMap.cc:83
void Sort()
Definition G4KDMap.cc:78
sortOutNDim fSortOutNDim
Definition G4KDMap.hh:88
std::deque< G4KDNode_Base * > fContainer
Definition G4KDMap.hh:87
G4bool operator()(G4KDNode_Base *const &lhs, G4KDNode_Base *const &rhs)
Definition G4KDMap.cc:35
std::size_t fDimension
Definition G4KDMap.hh:84