#include "itkParticleSwarmOptimizerSAXWriter.h"
#include "itksys/SystemTools.hxx"
{
int
ParticleSwarmOptimizerSAXWriter::CanWriteFile(const char * name)
{
std::ofstream ofs(name);
int yes = ofs.is_open();
if (yes)
{
ofs.close();
}
return yes;
}
int
ParticleSwarmOptimizerSAXWriter::WriteFile()
{
try
{
if (!this->CanWriteFile(this->m_Filename.c_str()))
{
ExceptionObject
e(__FILE__, __LINE__);
std::string message = "Cannot write to ";
message += this->m_Filename;
message += "!\n";
e.SetDescription(message.c_str());
}
if (this->m_InputObject == nullptr)
{
itkExceptionMacro("Object to be written is null!\n");
}
std::ofstream ofs(this->m_Filename.c_str());
ofs << "<optimizer type=\"ParticleSwarmOptimizer\"";
ofs << " NumberOfParticles=\""
<< this->m_InputObject->GetNumberOfParticles() << '"';
ofs << " MaximumNumberOfIterations=\""
<< this->m_InputObject->GetMaximalNumberOfIterations() << '"';
ofs << " InertiaCoefficient=\""
<< this->m_InputObject->GetInertiaCoefficient() << '"';
ofs << " GlobalCoefficient=\""
<< this->m_InputObject->GetGlobalCoefficient() << '"';
ofs << " PersonalCoefficient=\""
<< this->m_InputObject->GetPersonalCoefficient() << '"';
ofs << " FunctionConvergenceTolerance=\""
<< this->m_InputObject->GetFunctionConvergenceTolerance() << '"';
ofs << " ConvergedPercentageToStop=\""
<< this->m_InputObject->GetPercentageParticlesConverged() << '"';
ofs << '>';
ofs << '\n';
// write the lower bound
ofs << " <bound id=\"lower\"";
ofs << " value=\"";
for (const auto & bound : this->m_InputObject->GetParameterBounds())
{
ofs << ' ' << bound.first;
}
ofs << '"';
ofs << "/>";
ofs << '\n';
// write the upper bound
ofs << " <bound id=\"upper\"";
ofs << " value=\"";
for (const auto & bound : this->m_InputObject->GetParameterBounds())
{
ofs << ' ' << bound.second;
}
ofs << '"';
ofs << "/>";
ofs << '\n';
ofs << " <ParametersConvergenceTolerance>";
Array<double> ptols =
this->m_InputObject->GetParametersConvergenceTolerance();
for (unsigned int i = 0; i < ptols.GetSize(); ++i)
{
ofs << ' ' << ptols[i];
}
ofs << "</ParametersConvergenceTolerance>";
ofs << '\n';
ofs << "</optimizer>";
ofs << '\n';
ofs.close();
return 1;
}
catch (...)
{
return 0;
}
}
}