/* * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) * * This file is part of Orfeo Toolbox * * https://www.orfeo-toolbox.org/ * * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ #ifndef otbDimensionalityReductionModelFactory_hxx #define otbDimensionalityReductionModelFactory_hxx #include "otbDimensionalityReductionModelFactory.h" #include "otbConfigure.h" #include "otbSOMModelFactory.h" #ifdef OTB_USE_SHARK #include "otbAutoencoderModelFactory.h" #include "otbPCAModelFactory.h" #endif #include "itkMutexLockHolder.h" namespace otb { #ifdef OTB_USE_SHARK template using LogAutoencoderModelFactory = AutoencoderModelFactory; #endif template using SOM2DModelFactory = SOMModelFactory; template using SOM3DModelFactory = SOMModelFactory; template using SOM4DModelFactory = SOMModelFactory; template using SOM5DModelFactory = SOMModelFactory; template typename DimensionalityReductionModelFactory::DimensionalityReductionModelTypePointer DimensionalityReductionModelFactory::CreateDimensionalityReductionModel(const std::string& path, FileModeType mode) { RegisterBuiltInFactories(); std::list possibleDimensionalityReductionModel; std::list allobjects = itk::ObjectFactoryBase::CreateAllInstance("DimensionalityReductionModel"); for (std::list::iterator i = allobjects.begin(); i != allobjects.end(); ++i) { DimensionalityReductionModelType* io = dynamic_cast(i->GetPointer()); if (io) { possibleDimensionalityReductionModel.push_back(io); } else { std::cerr << "Error DimensionalityReductionModel Factory did not return an DimensionalityReductionModel: " << (*i)->GetNameOfClass() << std::endl; } } for (typename std::list::iterator k = possibleDimensionalityReductionModel.begin(); k != possibleDimensionalityReductionModel.end(); ++k) { if (mode == ReadMode) { if ((*k)->CanReadFile(path)) { return *k; } } else if (mode == WriteMode) { if ((*k)->CanWriteFile(path)) { return *k; } } } return nullptr; } template void DimensionalityReductionModelFactory::RegisterBuiltInFactories() { itk::MutexLockHolder lockHolder(mutex); RegisterFactory(SOM2DModelFactory::New()); RegisterFactory(SOM3DModelFactory::New()); RegisterFactory(SOM4DModelFactory::New()); RegisterFactory(SOM5DModelFactory::New()); #ifdef OTB_USE_SHARK RegisterFactory(PCAModelFactory::New()); RegisterFactory(LogAutoencoderModelFactory::New()); #endif } template void DimensionalityReductionModelFactory::RegisterFactory(itk::ObjectFactoryBase* factory) { // Unregister any previously registered factory of the same class // Might be more intensive but static bool is not an option due to // ld error. itk::ObjectFactoryBase::UnRegisterFactory(factory); itk::ObjectFactoryBase::RegisterFactory(factory); } template void DimensionalityReductionModelFactory::CleanFactories() { itk::MutexLockHolder lockHolder(mutex); std::list factories = itk::ObjectFactoryBase::GetRegisteredFactories(); std::list::iterator itFac; for (itFac = factories.begin(); itFac != factories.end(); ++itFac) { // SOM 5D SOM5DModelFactory* som5dFactory = dynamic_cast*>(*itFac); if (som5dFactory) { itk::ObjectFactoryBase::UnRegisterFactory(som5dFactory); continue; } // SOM 4D SOM4DModelFactory* som4dFactory = dynamic_cast*>(*itFac); if (som4dFactory) { itk::ObjectFactoryBase::UnRegisterFactory(som4dFactory); continue; } // SOM 3D SOM3DModelFactory* som3dFactory = dynamic_cast*>(*itFac); if (som3dFactory) { itk::ObjectFactoryBase::UnRegisterFactory(som3dFactory); continue; } // SOM 2D SOM2DModelFactory* som2dFactory = dynamic_cast*>(*itFac); if (som2dFactory) { itk::ObjectFactoryBase::UnRegisterFactory(som2dFactory); continue; } #ifdef OTB_USE_SHARK // Autoencoder LogAutoencoderModelFactory* aeFactory = dynamic_cast*>(*itFac); if (aeFactory) { itk::ObjectFactoryBase::UnRegisterFactory(aeFactory); continue; } // PCA PCAModelFactory* pcaFactory = dynamic_cast*>(*itFac); if (pcaFactory) { itk::ObjectFactoryBase::UnRegisterFactory(pcaFactory); continue; } #endif } } } // end namespace otb #endif