18#ifndef itkParallelSparseFieldLevelSetImageFilter_h
19#define itkParallelSparseFieldLevelSetImageFilter_h
27#include <condition_variable>
37template <
typename TNodeIndexType>
75template <
typename TNeighborhoodType>
80 using OffsetType =
typename NeighborhoodType::OffsetType;
81 using RadiusType =
typename NeighborhoodType::RadiusType;
83 static constexpr unsigned int Dimension = NeighborhoodType::Dimension;
250template <
typename TInputImage,
typename TOutputImage>
334 return m_Data[ThreadNum].m_Layers[0];
482 unsigned int InOrOut);
543 return (value +
static_cast<ValueType>(dt) * change);
603 unsigned int InOrOut,
604 unsigned int BufferLayerNumber);
610 unsigned int InOrOut,
611 unsigned int BufferLayerNumber);
622 unsigned int OutputLayerNumber,
624 unsigned int InOrOut,
625 unsigned int BufferLayerNumber,
635 unsigned int OutputLayerNumber,
638 unsigned int InOrOut,
639 unsigned int BufferLayerNumber,
648 unsigned int InOrOut,
649 unsigned int BufferLayerNumber,
657 unsigned int InOrOut,
809#ifndef ITK_MANUAL_INSTANTIATION
810# include "itkParallelSparseFieldLevelSetImageFilter.hxx"
typename FiniteDifferenceFunctionType::TimeStepType TimeStepType
typename FiniteDifferenceFunctionType::NeighborhoodScalesType NeighborhoodScalesType
FiniteDifferenceImageFilter()
FiniteDifferenceFunction< TOutputImage > FiniteDifferenceFunctionType
typename FiniteDifferenceFunctionType::RadiusType RadiusType
Templated n-dimensional image class.
SmartPointer< Self > Pointer
Control indentation during Print() invocation.
A specialized memory management object for allocating and destroying contiguous blocks of objects.
SmartPointer< Self > Pointer
A convenience class for storing indices which reference neighbor pixels within a neighborhood.
std::vector< OffsetType > m_NeighborhoodOffset
const OffsetType & GetNeighborhoodOffset(unsigned int i) const
unsigned int GetStride(unsigned int i)
const RadiusType & GetRadius() const
std::vector< unsigned int > m_ArrayIndex
const unsigned int & GetArrayIndex(unsigned int i) const
unsigned int m_StrideTable[Dimension]
const unsigned int & GetSize() const
~ParallelSparseFieldCityBlockNeighborList()
typename NeighborhoodType::RadiusType RadiusType
void Print(std::ostream &os, Indent indent) const
TNeighborhoodType NeighborhoodType
typename NeighborhoodType::OffsetType OffsetType
static constexpr unsigned int Dimension
ParallelSparseFieldCityBlockNeighborList()
typename FiniteDifferenceFunctionType::TimeStepType TimeStepType
SparseFieldLayer< LayerNodeType > LayerType
void ConstructLayer(const StatusType &from, const StatusType &to)
LayerNodeStorageType::Pointer m_LayerNodeStore
OutputImageType::Pointer m_ShiftedImage
void CopyInsertList(ThreadIdType ThreadId, LayerPointerType FromListPtr, LayerPointerType ToListPtr)
virtual void ThreadedProcessPixelEnteringActiveLayer(const IndexType &index, const ValueType &value, ThreadIdType ThreadId)
void ThreadedAllocateData(ThreadIdType ThreadId)
ValueType m_IsoSurfaceValue
void ComputeInitialThreadBoundaries()
void ClearInterNeighborNodeTransferBufferLayers(ThreadIdType ThreadId, unsigned int InOrOut, unsigned int BufferLayerNumber)
std::vector< TimeStepType > m_TimeStepList
void GenerateData() override
FiniteDifferenceImageFilter< TInputImage, TOutputImage > Superclass
virtual void ThreadedApplyUpdate(const TimeStepType &dt, ThreadIdType ThreadId)
unsigned int * m_MapZToThreadNumber
void AllocateUpdateBuffer() override
void ProcessStatusList(LayerType *InputList, const StatusType &ChangeToStatus, const StatusType &SearchForStatus, ThreadIdType ThreadId)
unsigned int GetThreadNumber(unsigned int splitAxisValue)
static StatusType m_StatusActiveChangingUp
void ThreadedProcessFirstLayerStatusLists(unsigned int InputLayerNumber, unsigned int OutputLayerNumber, const StatusType &SearchForStatus, unsigned int InOrOut, unsigned int BufferLayerNumber, ThreadIdType ThreadId)
void ThreadedLoadBalance2(ThreadIdType ThreadId)
virtual TimeStepType ThreadedCalculateChange(ThreadIdType ThreadId)
void GetThreadRegionSplitUniformly(ThreadIdType ThreadId, ThreadRegionType &ThreadRegion)
itkAlignedTypedef(ITK_CACHE_LINE_ALIGNMENT, ThreadDataPadded, ThreadData)
ParallelSparseFieldLevelSetImageFilter()
void CopyInputToOutput() override
Offset< Self::ImageDimension > OffsetType
typename OutputImageType::RegionType ThreadRegionType
void ThreadedInitializeData(ThreadIdType ThreadId, const ThreadRegionType &ThreadRegion)
std::vector< LayerPointerType > LayerListType
void SignalNeighborsAndWait(ThreadIdType ThreadId)
static StatusType m_StatusActiveChangingDown
typename LayerType::Pointer LayerPointerType
OutputImageType::Pointer m_OutputImage
bool m_BoundsCheckingActive
SmartPointer< Self > Pointer
virtual void CheckLoadBalance()
StatusType m_NumberOfLayers
void ThreadedPostProcessOutput(const ThreadRegionType ®ionToProcess)
void ClearList(ThreadIdType ThreadId, LayerPointerType ListPtr)
SmartPointer< const Self > ConstPointer
ParallelSparseFieldLevelSetImageFilter Self
void CopyInsertInterNeighborNodeTransferBufferLayers(ThreadIdType ThreadId, LayerPointerType List, unsigned int InOrOut, unsigned int BufferLayerNumber)
void InitializeActiveLayerValues()
StatusImageType::Pointer m_StatusImageTemp
double m_ConstantGradientValue
static constexpr unsigned int ImageDimension
static ValueType m_ValueOne
TOutputImage OutputImageType
ObjectStore< LayerNodeType > LayerNodeStorageType
static ValueType m_ValueZero
bool m_InterpolateSurfaceLocation
void ThreadedUpdateActiveLayerValues(const TimeStepType &dt, LayerType *UpList, LayerType *DownList, ThreadIdType ThreadId)
static StatusType m_StatusNull
typename OutputImageType::PixelType PixelType
static StatusType m_StatusChanging
void PropagateAllLayerValues()
void ThreadedProcessOutsideList(unsigned int InputLayerNumber, const StatusType &ChangeToStatus, unsigned int InOrOut, unsigned int BufferLayerNumber, ThreadIdType ThreadId)
TimeStepType CalculateChange() override
int * m_ZCumulativeFrequency
ThreadIdType m_NumOfWorkUnits
void ApplyUpdate(const TimeStepType &) override
itkPadStruct(ITK_CACHE_LINE_ALIGNMENT, ThreadDataUnaligned, ThreadDataPadded)
void ThreadedPropagateLayerValues(const StatusType &from, const StatusType &to, const StatusType &promote, unsigned int InOrOut, ThreadIdType ThreadId)
OutputImageType::Pointer m_OutputImageTemp
void SignalNeighbor(unsigned int SemaphoreArrayNumber, ThreadIdType ThreadId)
virtual void InitializeBackgroundPixels()
StatusImageType::Pointer m_StatusImage
void PropagateLayerValues(const StatusType &from, const StatusType &to, const StatusType &promote, unsigned int InOrOut)
~ParallelSparseFieldLevelSetImageFilter() override=default
void ConstructActiveLayer()
unsigned int * m_Boundary
virtual ValueType ThreadedCalculateUpdateValue(const ThreadIdType ThreadId, const IndexType index, const TimeStepType &dt, const ValueType &value, const ValueType &change)
ParallelSparseFieldCityBlockNeighborList< NeighborhoodIterator< OutputImageType > > m_NeighborList
void PrintSelf(std::ostream &os, Indent indent) const override
void Initialize() override
ParallelSparseFieldLevelSetNode< IndexType > LayerNodeType
typename OutputImageType::IndexType IndexType
static StatusType m_StatusBoundaryPixel
LayerPointerType GetActiveListForIndex(const IndexType index)
TInputImage InputImageType
void GetThreadRegionSplitByBoundary(ThreadIdType ThreadId, ThreadRegionType &ThreadRegion)
Image< StatusType, Self::ImageDimension > StatusImageType
typename OutputImageType::ValueType ValueType
void ThreadedLoadBalance1(ThreadIdType ThreadId)
virtual void ThreadedInitializeIteration(ThreadIdType ThreadId)
void WaitForNeighbor(unsigned int SemaphoreArrayNumber, ThreadIdType ThreadId)
BooleanStdVectorType m_ValidTimeStepList
void ThreadedProcessStatusList(unsigned int InputLayerNumber, unsigned int OutputLayerNumber, const StatusType &ChangeToStatus, const StatusType &SearchForStatus, unsigned int InOrOut, unsigned int BufferLayerNumber, ThreadIdType ThreadId)
ParallelSparseFieldLevelSetNode * Previous
ParallelSparseFieldLevelSetNode * Next
Implements transparent reference counting.
A very simple linked list that is used to manage nodes in a layer of a sparse field level-set solver.
SmartPointer< Self > Pointer
#define itkConceptMacro(name, concept)
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
unsigned int ThreadIdType
std::vector< Boolean > BooleanStdVectorType
Represent a n-dimensional offset between two n-dimensional indexes of n-dimensional image.
std::condition_variable m_Condition[2]
LayerPointerType UpList[2]
unsigned int m_SemaphoreArrayNumber
LayerPointerType DownList[2]
ThreadRegionType ThreadRegion
LayerListType * m_LoadTransferBufferLayers
LayerPointerType ** m_InterNeighborNodeTransferBufferLayers[2]
LayerNodeStorageType::Pointer m_LayerNodeStore