Listing 2: Access routines and example main program.
#include "FuncObject.h"
CFuncObject::CFuncObject ( )
{
}
CFuncObject::CFuncObject ( const double& a, const double& b )
{
m_vdDataArray.resize ( 2 );
m_iNVar = 2;
m_vdDataArray[0] = a;
m_vdDataArray[1] = b;
}
double CFuncObject::operator ( ) ( const valarray<double> v ) const
{
return (v[1]-1.0)*(v[1]-1.0) + (v[0]-2.0)*(v[0]-2.0) ;
}
valarray< double > CFuncObject::operator ( ) ( ) const
{
return ( m_vdDataArray );
}
#if !defined( FUNCOBJECT_H_INCLUDED )
#define FUNCOBJECT_H_INCLUDED
#include <valarray>
using namespace std;
class CFuncObject
{
public:
CFuncObject ( );
CFuncObject ( const double& , const double& );
double operator ( ) ( const valarray<double> v ) const;
valarray< double > operator( ) ( ) const;
// NOTE THAT COPYING THE FUNCTION OBJECT INTO THE SIMPLEX OBJECT
// IMPLIES THAT BOTH A COPY CONSTRUCTOR AND AN ASSIGNMENT
// OPERATOR
// WILL BE REQUIRED FOR FULL SAFETY
// THE VALARRAY SEEMS TO BE COPIED CORRECTLY SINCE DELETING THE
// ORIGINAL
// FUNCOBJECT DOES NOT PERTURB OPERATION, BUT POINTERS IN THE
// FUNCOBJECT
// CLEARLY COULD GENERATE TROUBLE FROM A SHALLOW COPY
private:
valarray<double> m_vdDataArray;
int m_iNVar;
};
#endif // (FUNCOBJECT_H_INCLUDED)
#include <stdlib.h>
#include <cstdio>
#include <iostream>
#include <cmath>
#include <valarray>
// #include "publishedsimplexsource.h"
#include "simplex.h"
#include "FuncObject.h"
using namespace std;
typedef valarray<double> vd;
void OutputVector ( const valarray<double>& dV );
void OutputVector ( const valarray<double>& dV )
{
int i;
cout << "{ ";
int nVar = dV.size( );
for ( i=0; i<nVar; ++i )
{
cout << dV[i];
if ( i < nVar - 1 ) cout << ", ";
}
cout << " }" << endl;
}
int main (void)
{
valarray<double> VOutput;
CFuncObject f ( 11.0, -5.0 );
simplex<CFuncObject> s( f );
f.~CFuncObject( );
// s.SetMaximumIterations( 5000 );
// s.SetLimitingFractionalChange( 0.0 );
pair<double,vd> pReturn = s.fnMinimize( );
cout << endl << " final FOM " << pReturn.first << endl;
// cout << endl << " final FOM " << s.GetFinalFOM( ) << endl;
// cout << " total interations performed " <<
// s.GetTotalIterations( ) << endl;
cout << "best point found = ";
cout << pReturn.second[0] << " " << pReturn.second[1] << endl;
// OutputVector( s.GetFinalVector( ) );
// cout << "best point found (again) = ";
// OutputVector( pReturn.second );
// s.OutputSimplex( );
return ( EXIT_SUCCESS );
}