/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #include #include "itkPointSetToListSampleAdaptor.h" #include "itkGaussianMixtureModelComponent.h" int itkGaussianMixtureModelComponentTest(int argc, char * argv[]) { using PointSetType = itk::PointSet; using DataSampleType = itk::Statistics::PointSetToListSampleAdaptor; using ComponentType = itk::Statistics::GaussianMixtureModelComponent; if (argc < 2) { std::cout << "ERROR: data file name argument missing." << std::endl; return EXIT_FAILURE; } char * dataFileName = argv[1]; int dataSize = 2000; using ParametersType = itk::Array; unsigned int numberOfClasses = 2; ParametersType params(6); std::vector initialParameters(numberOfClasses); params[0] = 80.0; params[1] = 80.0; params[2] = 814.95741; params[3] = 38.40308; params[4] = 38.40308; params[5] = 817.64446; initialParameters[0] = params; params[0] = 180.0; params[1] = 180.0; params[2] = 859.785295; params[3] = -3.617316; params[4] = -3.617316; params[5] = 848.991508; initialParameters[1] = params; itk::Array trueProportions(numberOfClasses); trueProportions[0] = 0.5; trueProportions[1] = 0.5; itk::Array initialProportions(numberOfClasses); initialProportions[0] = 0.5; initialProportions[1] = 0.5; /* Loading point data */ auto pointSet = PointSetType::New(); PointSetType::PointsContainerPointer pointsContainer = PointSetType::PointsContainer::New(); pointsContainer->Reserve(dataSize); pointSet->SetPoints(pointsContainer); PointSetType::PointsContainerIterator p_iter = pointsContainer->Begin(); PointSetType::PointType point; double temp; std::ifstream dataStream(dataFileName); if (!dataStream) { std::cout << "ERROR: fail to open the data file." << std::endl; return EXIT_FAILURE; } while (p_iter != pointsContainer->End()) { for (unsigned int i = 0; i < PointSetType::PointDimension; ++i) { dataStream >> temp; point[i] = temp; } p_iter.Value() = point; ++p_iter; } dataStream.close(); /* Importing the point set to the sample */ auto sample = DataSampleType::New(); sample->SetPointSet(pointSet); /* Preparing the gaussian mixture components */ using ComponentPointer = ComponentType::Pointer; std::vector components; for (unsigned int i = 0; i < numberOfClasses; ++i) { components.push_back(ComponentType::New()); (components[i])->SetSample(sample); (components[i])->SetParameters(initialParameters[i]); } ComponentPointer testComponent = ComponentType::New(); std::cout << testComponent->GetNameOfClass() << std::endl; testComponent->Print(std::cout); std::cout << "Test passed." << std::endl; return EXIT_SUCCESS; }