mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-09-18 14:27:39 +03:00
0025720: Incorrect code of math classes can lead to unpredicted behavior of algorithms
The calling of virtual methods has been removed from constructors & destructors: math_BissecNewton math_BrentMinimum math_FRPR math_FunctionSetRoot math_NewtonFunctionSetRoot math_NewtonMinimum math_Powell
This commit is contained in:
@@ -25,58 +25,49 @@
|
||||
#include <math_Gauss.hxx>
|
||||
#include <math_Jacobi.hxx>
|
||||
|
||||
//============================================================================
|
||||
math_NewtonMinimum::math_NewtonMinimum(math_MultipleVarFunctionWithHessian& F,
|
||||
const math_Vector& StartingPoint,
|
||||
const Standard_Real Tolerance,
|
||||
const Standard_Integer NbIterations,
|
||||
const Standard_Real Convexity,
|
||||
const Standard_Boolean WithSingularity)
|
||||
//============================================================================
|
||||
: TheLocation(1, F.NbVariables()),
|
||||
TheGradient(1, F.NbVariables()),
|
||||
TheStep(1, F.NbVariables(), 10*Tolerance),
|
||||
TheHessian(1, F.NbVariables(), 1, F.NbVariables() )
|
||||
//=======================================================================
|
||||
//function : math_NewtonMinimum
|
||||
//purpose : Constructor
|
||||
//=======================================================================
|
||||
math_NewtonMinimum::math_NewtonMinimum(
|
||||
const math_MultipleVarFunctionWithHessian& theFunction,
|
||||
const Standard_Real theTolerance,
|
||||
const Standard_Integer theNbIterations,
|
||||
const Standard_Real theConvexity,
|
||||
const Standard_Boolean theWithSingularity
|
||||
)
|
||||
: TheStatus (math_NotBracketed),
|
||||
TheLocation(1, theFunction.NbVariables()),
|
||||
TheGradient(1, theFunction.NbVariables()),
|
||||
TheStep (1, theFunction.NbVariables(), 10.0 * theTolerance),
|
||||
TheHessian (1, theFunction.NbVariables(), 1, theFunction.NbVariables()),
|
||||
PreviousMinimum (0.0),
|
||||
TheMinimum (0.0),
|
||||
MinEigenValue (0.0),
|
||||
XTol (theTolerance),
|
||||
CTol (theConvexity),
|
||||
nbiter (0),
|
||||
NoConvexTreatement(theWithSingularity),
|
||||
Convex (Standard_True),
|
||||
Done (Standard_False),
|
||||
Itermax (theNbIterations)
|
||||
{
|
||||
XTol = Tolerance;
|
||||
CTol = Convexity;
|
||||
Itermax = NbIterations;
|
||||
NoConvexTreatement = WithSingularity;
|
||||
Convex = Standard_True;
|
||||
// Done = Standard_True;
|
||||
// TheStatus = math_OK;
|
||||
Perform ( F, StartingPoint);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
math_NewtonMinimum::math_NewtonMinimum(math_MultipleVarFunctionWithHessian& F,
|
||||
const Standard_Real Tolerance,
|
||||
const Standard_Integer NbIterations,
|
||||
const Standard_Real Convexity,
|
||||
const Standard_Boolean WithSingularity)
|
||||
//============================================================================
|
||||
: TheLocation(1, F.NbVariables()),
|
||||
TheGradient(1, F.NbVariables()),
|
||||
TheStep(1, F.NbVariables(), 10*Tolerance),
|
||||
TheHessian(1, F.NbVariables(), 1, F.NbVariables() )
|
||||
{
|
||||
XTol = Tolerance;
|
||||
CTol = Convexity;
|
||||
Itermax = NbIterations;
|
||||
NoConvexTreatement = WithSingularity;
|
||||
Convex = Standard_True;
|
||||
Done = Standard_False;
|
||||
TheStatus = math_NotBracketed;
|
||||
}
|
||||
//============================================================================
|
||||
//=======================================================================
|
||||
//function : ~math_NewtonMinimum
|
||||
//purpose : Destructor
|
||||
//=======================================================================
|
||||
math_NewtonMinimum::~math_NewtonMinimum()
|
||||
{
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//=======================================================================
|
||||
//function : Perform
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void math_NewtonMinimum::Perform(math_MultipleVarFunctionWithHessian& F,
|
||||
const math_Vector& StartingPoint)
|
||||
//============================================================================
|
||||
const math_Vector& StartingPoint)
|
||||
{
|
||||
math_Vector Point1 (1, F.NbVariables());
|
||||
Point1 = StartingPoint;
|
||||
@@ -191,26 +182,20 @@ void math_NewtonMinimum::Perform(math_MultipleVarFunctionWithHessian& F,
|
||||
TheLocation = *precedent;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
Standard_Boolean math_NewtonMinimum::IsConverged() const
|
||||
//============================================================================
|
||||
{
|
||||
return ( (TheStep.Norm() <= XTol ) ||
|
||||
( Abs(TheMinimum-PreviousMinimum) <= XTol*Abs(PreviousMinimum) ));
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//=======================================================================
|
||||
//function : Dump
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void math_NewtonMinimum::Dump(Standard_OStream& o) const
|
||||
//============================================================================
|
||||
{
|
||||
o<< "math_Newton Optimisation: ";
|
||||
o << " Done =" << Done << endl;
|
||||
o << " Status = " << (Standard_Integer)TheStatus << endl;
|
||||
o <<" Location Vector = " << Location() << endl;
|
||||
o <<" Minimum value = "<< Minimum()<< endl;
|
||||
o <<" Previous value = "<< PreviousMinimum << endl;
|
||||
o <<" Number of iterations = " <<NbIterations() << endl;
|
||||
o <<" Convexity = " << Convex << endl;
|
||||
o <<" Eigen Value = " << MinEigenValue << endl;
|
||||
o<< "math_Newton Optimisation: ";
|
||||
o << " Done =" << Done << endl;
|
||||
o << " Status = " << (Standard_Integer)TheStatus << endl;
|
||||
o << " Location Vector = " << Location() << endl;
|
||||
o << " Minimum value = "<< Minimum()<< endl;
|
||||
o << " Previous value = "<< PreviousMinimum << endl;
|
||||
o << " Number of iterations = " <<NbIterations() << endl;
|
||||
o << " Convexity = " << Convex << endl;
|
||||
o << " Eigen Value = " << MinEigenValue << endl;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user