/* $Id: ClpSimplexNonlinear.hpp 2025 2014-03-19 12:49:55Z forrest $ */
// Copyright (C) 2004, International Business Machines
// Corporation and others. All Rights Reserved.
// This code is licensed under the terms of the Eclipse Public License (EPL).
/*
Authors
John Forrest
*/
#ifndef ClpSimplexNonlinear_H
#define ClpSimplexNonlinear_H
class ClpNonlinearInfo;
class ClpQuadraticObjective;
class ClpConstraint;
#include "ClpSimplexPrimal.hpp"
/** This solves non-linear LPs using the primal simplex method
It inherits from ClpSimplexPrimal. It has no data of its own and
is never created - only cast from a ClpSimplexPrimal object at algorithm time.
If needed create new class and pass around
*/
class ClpSimplexNonlinear : public ClpSimplexPrimal {
public:
/**@name Description of algorithm */
//@{
/** Primal algorithms for reduced gradient
At present we have two algorithms:
*/
/// A reduced gradient method.
int primal();
/** Primal algorithm for quadratic
Using a semi-trust region approach as for pooling problem
This is in because I have it lying around
*/
int primalSLP(int numberPasses, double deltaTolerance,
int otherOptions=0);
/// May use a cut approach for solving any LP
int primalDualCuts(char * rowsIn, int startUp, int algorithm);
/** Primal algorithm for nonlinear constraints
Using a semi-trust region approach as for pooling problem
This is in because I have it lying around
*/
int primalSLP(int numberConstraints, ClpConstraint ** constraints,
int numberPasses, double deltaTolerance);
/** Creates direction vector. note longArray is long enough
for rows and columns. If numberNonBasic 0 then is updated
otherwise mode is ignored and those are used.
Norms are only for those > 1.0e3*dualTolerance
If mode is nonzero then just largest dj */
void directionVector (CoinIndexedVector * longArray,
CoinIndexedVector * spare1, CoinIndexedVector * spare2,
int mode,
double & normFlagged, double & normUnflagged,
int & numberNonBasic);
/// Main part.
int whileIterating (int & pivotMode);
/**
longArray has direction
pivotMode -
0 - use all dual infeasible variables
1 - largest dj
while >= 10 trying startup phase
Returns 0 - can do normal iteration (basis change)
1 - no basis change
2 - if wants singleton
3 - if time to re-factorize
If sequenceIn_ >=0 then that will be incoming variable
*/
int pivotColumn(CoinIndexedVector * longArray,
CoinIndexedVector * rowArray,
CoinIndexedVector * columnArray,
CoinIndexedVector * spare,
int & pivotMode,
double & solutionError,
double * array1);
/** Refactorizes if necessary
Checks if finished. Updates status.
lastCleaned refers to iteration at which some objective/feasibility
cleaning too place.
type - 0 initial so set up save arrays etc
- 1 normal -if good update save
- 2 restoring from saved
*/
void statusOfProblemInPrimal(int & lastCleaned, int type,
ClpSimplexProgress * progress,
bool doFactorization,
double & bestObjectiveWhenFlagged);
/** Do last half of an iteration.
Return codes
Reasons to come out normal mode
-1 normal
-2 factorize now - good iteration
-3 slight inaccuracy - refactorize - iteration done
-4 inaccuracy - refactorize - no iteration
-5 something flagged - go round again
+2 looks unbounded
+3 max iterations (iteration done)
*/
int pivotNonlinearResult();
//@}
};
#endif