WRAP_NON_TEMPLATE_CLASS("itk::AmoebaOptimizer")

  SET(MANAGED_TYPE_TEMPLATE ${MANAGED_ITK_SOURCE_COMMON_PATH}/itkManagedSingleValuedNonLinearOptimizer_TYPE.cxx.in)

  BEGIN_MANAGED_PROPERTY("Maximize" GETSET)
    SET(MANAGED_PROPERTY_SUMMARY   "Get/set if the optimizer maximizes or minimizes the cost function.")
    SET(MANAGED_PROPERTY_TYPE      "bool")
    SET(MANAGED_PROPERTY_SET_BODY  "m_PointerToNative->SetMaximize( value );")
    SET(MANAGED_PROPERTY_GET_BODY  "return m_PointerToNative->GetMaximize();")
  END_MANAGED_PROPERTY()

  BEGIN_MANAGED_PROPERTY("Minimize" GETSET)
    SET(MANAGED_PROPERTY_SUMMARY   "Get/set if the optimizer maximizes or minimizes the cost function.")
    SET(MANAGED_PROPERTY_TYPE      "bool")
    SET(MANAGED_PROPERTY_SET_BODY  "m_PointerToNative->SetMinimize( value );")
    SET(MANAGED_PROPERTY_GET_BODY  "return m_PointerToNative->GetMinimize();")
  END_MANAGED_PROPERTY()
  
  BEGIN_MANAGED_PROPERTY("MaximumNumberOfIterations" GETSET)
    SET(MANAGED_PROPERTY_SUMMARY   "Get/set the maximum number of iterations. The optimization algorithm will terminate after the maximum number of iterations has been reached. The default value is 500.")
    SET(MANAGED_PROPERTY_TYPE      "unsigned int")
    SET(MANAGED_PROPERTY_SET_BODY  "m_PointerToNative->SetMaximumNumberOfIterations( value );")
    SET(MANAGED_PROPERTY_GET_BODY  "return m_PointerToNative->GetMaximumNumberOfIterations();")
  END_MANAGED_PROPERTY()

  BEGIN_MANAGED_PROPERTY("AutomaticInitialSimplex" GETSET)
    SET(MANAGED_PROPERTY_SUMMARY   "Get/set the mode which determines how the amoeba algorithm defines the initial simplex. Default is AutomaticInitialSimplexOn. If AutomaticInitialSimplex is on, the initial simplex is created with a default size. If AutomaticInitialSimplex is off, then InitialSimplexDelta will be used to define the initial simplex, setting the ith corner of the simplex as [x0[0], x0[1], ..., x0[i]+InitialSimplexDelta[i], ..., x0[d-1]]..")
    SET(MANAGED_PROPERTY_TYPE      "bool")
    SET(MANAGED_PROPERTY_SET_BODY  "m_PointerToNative->SetAutomaticInitialSimplex( value );")
    SET(MANAGED_PROPERTY_GET_BODY  "return m_PointerToNative->GetAutomaticInitialSimplex();")
  END_MANAGED_PROPERTY()

  BEGIN_MANAGED_PROPERTY("InitialSimplexDelta" GETSET)
    SET(MANAGED_PROPERTY_SUMMARY   "Get/set the deltas that are used to define the initial simplex when AutomaticInitialSimplex is off.")
    SET(MANAGED_PROPERTY_TYPE      "itkArray<double>^")
    SET(MANAGED_PROPERTY_SET_BODY  "m_PointerToNative->SetInitialSimplexDelta( itk::ManagedTypes::ToNativeArray<double>(value) );")
    SET(MANAGED_PROPERTY_GET_BODY  "return itk::ManagedTypes::ToManagedArray<double>( m_PointerToNative->GetInitialSimplexDelta() );")
  END_MANAGED_PROPERTY()
  
  BEGIN_MANAGED_PROPERTY("ParametersConvergenceTolerance" GETSET)
    SET(MANAGED_PROPERTY_SUMMARY   "Get/set the congergence tolerance. The optimization algorithm will terminate when the simplex diameter and the difference in cost function at the corners of the simplex falls below user specified thresholds. The simplex diameter threshold is set via method SetParametersConvergenceTolerance() with the default value being 1e-8. The cost function convergence threshold is set via method SetFunctionConvergenceTolerance() with the default value being 1e-4.")
    SET(MANAGED_PROPERTY_TYPE      "double")
    SET(MANAGED_PROPERTY_SET_BODY  "m_PointerToNative->SetParametersConvergenceTolerance( value );")
    SET(MANAGED_PROPERTY_GET_BODY  "return m_PointerToNative->GetParametersConvergenceTolerance();")
  END_MANAGED_PROPERTY()

  BEGIN_MANAGED_METHOD("GetValue")
    SET(MANAGED_METHOD_INTERFACE       OFF)
    SET(MANAGED_METHOD_SUMMARY         "Get the current value.")
    SET(MANAGED_METHOD_RETURN_TYPE     "double")
    SET(MANAGED_METHOD_PARAMS          "void")
    SET(MANAGED_METHOD_TYPE_BODY       "return m_PointerToNative->GetValue();")
  END_MANAGED_METHOD()

END_WRAP_NON_TEMPLATE_CLASS()
