// Lipchitz constant approximation.
Standard_Real aLC = 9.0; // Default value.
+ Standard_Boolean isConstLockedFlag = Standard_False;
if (C1.GetType() == GeomAbs_Line)
- aLC = Min(aLC, 1.0 / C2.Resolution(1.0));
+ {
+ Standard_Real aMaxDer = 1.0 / C2.Resolution(1.0);
+ if (aLC > aMaxDer)
+ {
+ isConstLockedFlag = Standard_True;
+ aLC = aMaxDer;
+ }
+ }
if (C2.GetType() == GeomAbs_Line)
- aLC = Min(aLC, 1.0 / C1.Resolution(1.0));
+ {
+ Standard_Real aMaxDer = 1.0 / C1.Resolution(1.0);
+ if (aLC > aMaxDer)
+ {
+ isConstLockedFlag = Standard_True;
+ aLC = aMaxDer;
+ }
+ }
Extrema_GlobOptFuncCCC2 aFunc (C1, C2);
math_GlobOptMin aFinder(&aFunc, myLowBorder, myUppBorder, aLC);
+ aFinder.SetLipConstState(isConstLockedFlag);
Standard_Real aDiscTol = 1.0e-2;
Standard_Real aValueTol = 1.0e-2;
Standard_Real aSameTol = myCurveMinTol / (aDiscTol);
myB(1, myN),
myGlobA(1, myN),
myGlobB(1, myN),
+ myIsConstLocked(Standard_False),
myX(1, myN),
myTmp(1, myN),
myV(1, myN),
return;
}
- // Compute initial value for myC.
- computeInitialValues();
+ if (!myIsConstLocked)
+ {
+ // Compute initial value for myC.
+ computeInitialValues();
+ }
myE1 = minLength * myTol;
myE2 = maxLength * myTol;
myIsFindSingleSolution = isFindSingleSolution;
if (isFindSingleSolution)
{
- // Run local optimization
- // if current value better than optimal.
+ // Run local optimization if current value better than optimal.
myE3 = 0.0;
}
else
return;
}
+ myLastStep = 0.0;
isFirstCellFilterInvoke = Standard_True;
computeGlobalExtremum(myN);
aLipConst *= Sqrt(myN) / aStep;
if (aLipConst < myC * 0.1)
myC = Max(aLipConst * 0.1, 0.01);
- else if (aLipConst > myC * 10)
- myC = Min(myC * 2, 30.0);
+ else if (aLipConst > myC * 5)
+ myC = Min(myC * 5, 50.0);
// Clear all solutions except one.
if (myY.Size() != myN)
Standard_Real d; // Functional in moved point.
Standard_Real val = RealLast(); // Local extrema computed in moved point.
Standard_Real aStepBestValue = RealLast();
- Standard_Real aRealStep = 0.0;
math_Vector aStepBestPoint(1, myN);
Standard_Boolean isInside = Standard_False;
Standard_Real r;
{
isInside = Standard_False;
myFunc->Value(myX, d);
- r = (d + myZ * myC * myV(1) - myF) * myZ;
+ r = (d + myZ * myC * myLastStep - myF) * myZ;
if(r > myE3)
{
isInside = computeLocalExtremum(myX, val, myTmp);
if (CheckFunctionalStopCriteria())
return; // Best possible value is obtained.
- aRealStep = myE2 + Abs(myF - d) / myC;
- myV(1) = Min(aRealStep, myMaxV(1));
+ myV(1) = Min(myE2 + Abs(myF - d) / myC, myMaxV(1));
+ myLastStep = myV(1);
}
else
{
myDone = Standard_False;
}
+
+//=======================================================================
+//function : SetLipConstState
+//purpose :
+//=======================================================================
+void math_GlobOptMin::SetLipConstState(const Standard_Boolean theFlag)
+{
+ myIsConstLocked = theFlag;
+}
\ No newline at end of file
//! Set functional minimal value.
Standard_EXPORT void SetFunctionalMinimalValue(const Standard_Real theMinimalValue);
+ //! Lock/Unlock Lipchitz constant for internal modifications.
+ Standard_EXPORT void SetLipConstState(const Standard_Boolean theFlag);
+
//! Get functional minimal value.
Standard_EXPORT Standard_Real GetFunctionalMinimalValue();
Standard_Real myInitC; // Lipchitz constant initial value.
Standard_Boolean myIsFindSingleSolution; // Default value is false.
Standard_Real myFunctionalMinimalValue; // Default value is -Precision::Infinite
+ Standard_Boolean myIsConstLocked; // Is constant locked for modifications.
// Output.
Standard_Boolean myDone;
math_Vector myTmp; // Current modified solution.
math_Vector myV; // Steps array.
math_Vector myMaxV; // Max Steps array.
+ Standard_Real myLastStep; // Last step.
math_Vector myExpandCoeff; // Define expand coefficient between neighboring indiced dimensions.
NCollection_Array1<Standard_Real> myCellSize;