18 #ifndef itkParallelSparseFieldLevelSetImageFilter_h
19 #define itkParallelSparseFieldLevelSetImageFilter_h
26 #include <condition_variable>
36 template <
typename TNodeIndexType>
74 template <
typename TNeighborhoodType>
93 return m_ArrayIndex[i];
99 return m_NeighborhoodOffset[i];
111 return m_StrideTable[i];
118 m_ArrayIndex.clear();
119 m_NeighborhoodOffset.clear();
123 Print(std::ostream & os)
const;
254 template <
typename TInputImage,
typename TOutputImage>
284 static constexpr
unsigned int ImageDimension = TOutputImage::ImageDimension;
326 itkGetConstMacro(IsoSurfaceValue,
ValueType);
333 const unsigned int indexZ = index[m_SplitAxis];
335 const unsigned int ThreadNum = this->GetThreadNumber(indexZ);
338 return m_Data[ThreadNum].m_Layers[0];
341 #ifdef ITK_USE_CONCEPT_CHECKING
353 PrintSelf(std::ostream & os,
Indent indent)
const override;
360 double m_ConstantGradientValue{ 1.0 };
429 GenerateData()
override;
436 CopyInputToOutput()
override;
446 Initialize()
override;
453 ConstructActiveLayer();
457 InitializeActiveLayerValues();
463 ConstructLayer(
const StatusType & from,
const StatusType & to);
467 ProcessStatusList(LayerType * InputList,
468 const StatusType & ChangeToStatus,
469 const StatusType & SearchForStatus,
477 PropagateAllLayerValues();
487 PropagateLayerValues(
const StatusType & from,
488 const StatusType & to,
489 const StatusType & promote,
490 unsigned int InOrOut);
497 InitializeBackgroundPixels();
506 ThreadedInitializeData(
ThreadIdType ThreadId,
const ThreadRegionType & ThreadRegion);
518 ComputeInitialThreadBoundaries();
522 GetThreadNumber(
unsigned int splitAxisValue);
526 GetThreadRegionSplitByBoundary(
ThreadIdType ThreadId, ThreadRegionType & ThreadRegion);
544 inline virtual ValueType
551 return (value + static_cast<ValueType>(dt) * change);
559 ThreadedProcessPixelEnteringActiveLayer(
const IndexType & itkNotUsed(index),
560 const ValueType & itkNotUsed(value),
571 ThreadedApplyUpdate(
const TimeStepType & dt,
ThreadIdType ThreadId);
592 ThreadedUpdateActiveLayerValues(
const TimeStepType & dt,
593 LayerType * StatusUpList,
594 LayerType * StatusDownList,
600 CopyInsertList(
ThreadIdType ThreadId, LayerPointerType FromListPtr, LayerPointerType ToListPtr);
604 ClearList(
ThreadIdType ThreadId, LayerPointerType ListPtr);
609 CopyInsertInterNeighborNodeTransferBufferLayers(
ThreadIdType ThreadId,
610 LayerPointerType InputList,
611 unsigned int InOrOut,
612 unsigned int BufferLayerNumber);
617 ClearInterNeighborNodeTransferBufferLayers(
ThreadIdType ThreadId,
618 unsigned int InOrOut,
619 unsigned int BufferLayerNumber);
629 ThreadedProcessFirstLayerStatusLists(
unsigned int InputLayerNumber,
630 unsigned int OutputLayerNumber,
631 const StatusType & SearchForStatus,
632 unsigned int InOrOut,
633 unsigned int BufferLayerNumber,
642 ThreadedProcessStatusList(
unsigned int InputLayerNumber,
643 unsigned int OutputLayerNumber,
644 const StatusType & ChangeToStatus,
645 const StatusType & SearchForStatus,
646 unsigned int InOrOut,
647 unsigned int BufferLayerNumber,
654 ThreadedProcessOutsideList(
unsigned int InputLayerNumber,
655 const StatusType & ChangeToStatus,
656 unsigned int InOrOut,
657 unsigned int BufferLayerNumber,
662 ThreadedPropagateLayerValues(
const StatusType & from,
663 const StatusType & to,
664 const StatusType & promote,
665 unsigned int InorOut,
671 GetThreadRegionSplitUniformly(
ThreadIdType ThreadId, ThreadRegionType & ThreadRegion);
679 ThreadedPostProcessOutput(
const ThreadRegionType & regionToProcess);
706 SignalNeighbor(
unsigned int SemaphoreArrayNumber,
ThreadIdType ThreadId);
709 WaitForNeighbor(
unsigned int SemaphoreArrayNumber,
ThreadIdType ThreadId);
725 unsigned int m_SplitAxis{ 0 };
728 unsigned int m_ZSize{ 0 };
732 bool m_BoundaryChanged{
false };
735 unsigned int * m_Boundary{
nullptr };
738 int * m_GlobalZHistogram{
nullptr };
742 unsigned int * m_MapZToThreadNumber{
nullptr };
746 int * m_ZCumulativeFrequency{
nullptr };
785 std::mutex m_Lock[2];
786 std::condition_variable m_Condition[2];
794 itkAlignedTypedef(ITK_CACHE_LINE_ALIGNMENT, ThreadDataPadded, ThreadData);
798 ThreadData * m_Data{
nullptr };
802 bool m_Stop{
false };
808 bool m_InterpolateSurfaceLocation{
true };
813 bool m_BoundsCheckingActive{
false };
817 #ifndef ITK_MANUAL_INSTANTIATION
818 # include "itkParallelSparseFieldLevelSetImageFilter.hxx"