21 #ifndef otbImageRegionAdaptativeSplitter_hxx
22 #define otbImageRegionAdaptativeSplitter_hxx
34 template <
unsigned int VImageDimension>
38 this->SetImageRegion(region);
39 this->SetRequestedNumberOfSplits(requestedNumber);
41 std::lock_guard<std::mutex> mutexHolder(m_Lock);
46 this->EstimateSplitMap();
50 return m_StreamVector.size();
53 template <
unsigned int VImageDimension>
58 this->SetImageRegion(region);
59 std::lock_guard<std::mutex> mutexHolder(m_Lock);
64 this->EstimateSplitMap();
68 return m_StreamVector.at(i);
71 template <
unsigned int VImageDimension>
75 m_StreamVector.clear();
78 if (m_RequestedNumberOfSplits == 1 || m_RequestedNumberOfSplits == 0)
80 m_StreamVector.push_back(m_ImageRegion);
85 if (m_TileHint[0] == 0 || m_TileHint[1] == 0 || VImageDimension != 2)
91 unsigned int nbSplits = splitter->
GetNumberOfSplits(m_ImageRegion, m_RequestedNumberOfSplits);
93 for (
unsigned int i = 0; i < nbSplits; ++i)
95 m_StreamVector.push_back(splitter->
GetSplit(i, m_RequestedNumberOfSplits, m_ImageRegion));
107 firstTileCovered[0] = m_ImageRegion.GetIndex()[0] / m_TileHint[0];
108 firstTileCovered[1] = m_ImageRegion.GetIndex()[1] / m_TileHint[1];
109 tilesPerDim[0] = (m_ImageRegion.GetIndex()[0] + m_ImageRegion.GetSize()[0] + m_TileHint[0] - 1) / m_TileHint[0] - firstTileCovered[0];
110 tilesPerDim[1] = (m_ImageRegion.GetIndex()[1] + m_ImageRegion.GetSize()[1] + m_TileHint[1] - 1) / m_TileHint[1] - firstTileCovered[1];
112 unsigned int totalTiles = tilesPerDim[0] * tilesPerDim[1];
115 if (totalTiles >= m_RequestedNumberOfSplits)
125 while (totalTiles / (groupTiles[0] * groupTiles[1]) > m_RequestedNumberOfSplits)
127 if (groupTiles[i] < tilesPerDim[i])
136 splitsPerDim[0] = tilesPerDim[0] / groupTiles[0];
137 splitsPerDim[1] = tilesPerDim[1] / groupTiles[1];
140 if (tilesPerDim[0] % groupTiles[0] > 0)
143 if (tilesPerDim[1] % groupTiles[1] > 0)
147 for (
unsigned int splity = 0; splity < splitsPerDim[1]; ++splity)
149 for (
unsigned int splitx = 0; splitx < splitsPerDim[0]; ++splitx)
156 newSplitSize[0] = groupTiles[0] * m_TileHint[0];
157 newSplitSize[1] = groupTiles[1] * m_TileHint[1];
159 newSplitIndex[0] = firstTileCovered[0] * m_TileHint[0] + splitx * newSplitSize[0];
160 newSplitIndex[1] = firstTileCovered[1] * m_TileHint[1] + splity * newSplitSize[1];
162 newSplit.SetIndex(newSplitIndex);
163 newSplit.SetSize(newSplitSize);
165 bool cropped = newSplit.Crop(m_ImageRegion);
170 m_StreamVector.push_back(newSplit);
184 while (totalTiles * (divideTiles[0] * divideTiles[1]) < m_RequestedNumberOfSplits && (divideTiles[0] < m_TileHint[0] || divideTiles[1] < m_TileHint[1]))
186 if (divideTiles[i] < m_TileHint[i])
195 splitSize[0] = (m_TileHint[0] + divideTiles[0] - 1) / divideTiles[0];
196 splitSize[1] = (m_TileHint[1] + divideTiles[1] - 1) / divideTiles[1];
199 tileHintRegion.SetSize(m_TileHint);
201 for (
unsigned int tiley = 0; tiley < tilesPerDim[1]; ++tiley)
203 for (
unsigned int tilex = 0; tilex < tilesPerDim[0]; ++tilex)
205 for (
unsigned int divy = 0; divy < divideTiles[1]; ++divy)
207 for (
unsigned int divx = 0; divx < divideTiles[0]; ++divx)
213 newSplitIndex[0] = (tilex + firstTileCovered[0]) * m_TileHint[0] + divx * splitSize[0];
214 newSplitIndex[1] = (tiley + firstTileCovered[1]) * m_TileHint[1] + divy * splitSize[1];
216 newSplit.SetIndex(newSplitIndex);
217 newSplit.SetSize(splitSize);
219 tileHintRegion.SetIndex(0, tilex * m_TileHint[0]);
220 tileHintRegion.SetIndex(1, tiley * m_TileHint[1]);
222 bool cropped = newSplit.Crop(m_ImageRegion);
229 cropped = newSplit.Crop(tileHintRegion);
232 m_StreamVector.push_back(newSplit);
248 template <
unsigned int VImageDimension>
251 Superclass::PrintSelf(os, indent);
252 os << indent <<
"IsUpToDate: " << (m_IsUpToDate ?
"true" :
"false") << std::endl;
253 os << indent <<
"ImageRegion: " << m_ImageRegion << std::endl;
254 os << indent <<
"Tile hint: " << m_TileHint << std::endl;
255 os << indent <<
"Requested number of splits: " << m_RequestedNumberOfSplits << std::endl;
256 os << indent <<
"Actual number of splits: " << m_StreamVector.size() << std::endl;
itk::ImageRegion< VImageDimension > RegionType
itk::Index< VImageDimension > IndexType
void PrintSelf(std::ostream &os, itk::Indent indent) const override
itk::Size< VImageDimension > SizeType
unsigned int GetNumberOfSplits(const RegionType ®ion, unsigned int requestedNumber) override
RegionType GetSplit(unsigned int i, unsigned int numberOfPieces, const RegionType ®ion) override
RegionType GetSplit(unsigned int i, unsigned int numberOfPieces, const RegionType ®ion) override
unsigned int GetNumberOfSplits(const RegionType ®ion, unsigned int requestedNumber) override
itk::SmartPointer< Self > Pointer
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.