18 #ifndef __otbVectorDataToDSValidatedVectorDataFilter_txx
19 #define __otbVectorDataToDSValidatedVectorDataFilter_txx
29 template <
class TVectorData,
class TPrecision>
32 m_CriterionFormula(
"((Belief + Plausibility)/2.)"),
33 m_CriterionThreshold(0.5),
36 this->SetNumberOfRequiredInputs(1);
38 m_Parser = ParserType::New();
42 template <
class TVectorData,
class TPrecision>
47 bool alreadyExist =
false;
49 if (model.size() != 4)
51 itkExceptionMacro(<<
"Wrong model! Size(=" << model.size() <<
") > 4" )
53 else if (model[0]<0 || model[1]<model[0] || model[2]<model[1] || model[2]>1)
55 itkExceptionMacro(<<
"Wrong model! Values have to be 0<=v1<=v2<=v3<=1" )
57 else if (model[3]<.75 || model[3]>1.0)
59 itkExceptionMacro(<<
"Wrong model! Values have to be 0.75<=v4<=1" )
63 for (
unsigned int i=0; i<m_DescriptorModels.size(); ++i)
65 if (m_DescriptorModels[i].first.compare(key) == 0)
67 for (
unsigned int j=0; j<4; ++j)
69 m_DescriptorModels[i].second.at(j) = model[j];
76 m_DescriptorModels.push_back(std::pair<std::string, std::vector<double> >(key, model));
84 template <
class TVectorData,
class TPrecision>
89 m_DescriptorModels.clear();
92 template <
class TVectorData,
class TPrecision>
97 for (
unsigned int i=0; i<model.size(); ++i)
99 this->AddDescriptor(model[i].first, model[i].second);
104 template <
class TVectorData,
class TPrecision>
110 if( m_DescriptorModels.size() == 0 )
112 itkExceptionMacro(<<
"No defined Descriptor. Please add a descriptor model.");
115 for (
unsigned int i=0; i<m_DescriptorModels.size(); ++i)
118 std::string fuzName, fuzName_;
119 fuzName = m_DescriptorModels[i].first;
120 fuzName_ = m_DescriptorModels[i].first +
"_";
122 fuz->SetMembership(fuzName,
125 m_DescriptorModels[i].second[0],
126 m_DescriptorModels[i].second[1],
128 m_DescriptorModels[i].second[3]);
129 fuz->SetMembership(fuzName_,
130 m_DescriptorModels[i].second[1],
131 m_DescriptorModels[i].second[2],
135 m_DescriptorModels[i].second[3]);
137 m_FuzzyVars.push_back(fuz);
139 m_Universe.insert(fuzName);
140 m_Universe.insert(fuzName_);
144 m_Parser->SetExpr(m_CriterionFormula);
145 m_Parser->DefineVar(
"Belief", &m_Bel);
146 m_Parser->DefineVar(
"Plausibility", &m_Plau);
149 this->GetOutput(0)->SetMetaDataDictionary(this->GetInput()->GetMetaDataDictionary());
151 typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get();
153 typename DataNodeType::Pointer document = DataNodeType::New();
156 this->GetOutput(0)->GetDataTree()->Add(document, root);
158 typename DataNodeType::Pointer folder = DataNodeType::New();
161 this->GetOutput(0)->GetDataTree()->Add(folder, document);
162 this->GetOutput(0)->SetProjectionRef(this->GetInput()->GetProjectionRef());
168 if (!itVector.
Get()->IsRoot() && !itVector.
Get()->IsDocument() && !itVector.
Get()->IsFolder())
170 typename DataNodeType::Pointer currentGeometry = itVector.
Get();
173 for (
unsigned int i=0; i<m_DescriptorModels.size(); ++i)
175 if (currentGeometry->HasField(m_DescriptorModels[i].first))
178 std::string fuzName, fuzName_;
179 fuzName = m_DescriptorModels[i].first;
180 fuzName_ = m_DescriptorModels[i].first +
"_";
183 mass->InitializePowerSetMasses(m_Universe);
188 mass->SetMass(H, m_FuzzyVars[i]->GetMembership(fuzName, currentGeometry->GetFieldAsDouble(fuzName)));
189 mass->SetMass(H_, m_FuzzyVars[i]->GetMembership(fuzName_, currentGeometry->GetFieldAsDouble(fuzName)));
191 mass->EstimateUncertainty();
193 jointMassFilter->PushBackInput(mass);
196 jointMassFilter->Update();
197 m_Bel = jointMassFilter->GetOutput()->GetBelief(m_BeliefHypothesis);
198 m_Plau = jointMassFilter->GetOutput()->GetPlausibility(m_PlausibilityHypothesis);
200 if (m_Parser->Eval() >= m_CriterionThreshold)
202 currentGeometry->SetNodeId(this->GetNextID());
203 currentGeometry->SetFieldAsDouble(
"Belief", m_Bel);
204 currentGeometry->SetFieldAsDouble(
"Plausi", m_Plau);
205 this->GetOutput(0)->GetDataTree()->Add(currentGeometry, folder);
214 template <
class TVectorData,
class TPrecision>
219 Superclass::PrintSelf(os, indent);