# TEST_OPT Optimization of a Scalar Function Test Problems

TEST_OPT is a FORTRAN90 library which defines test problems for the scalar function optimization problem.

The scalar function optimization problem is to find a value for the N-dimensional vector X which minimizes the value of the given scalar function F(X). The function F(X) is not usually defined as the sum of squares of other functions. The minimum function value is not guaranteed to be zero.

Any system of M nonlinear functions in N unknowns can be turned into a scalar optimization problem. One way to do this is to define the functional F(X) to be the sum of the squares of the original nonlinear functions. The minimizer of F will then minimize the sum of the squares of the residuals. Since this process involves squaring, it can be less accurate than dealing directly with the original nonlinear functions: that is to say, the derived optimization problem may be more convenient to solve, but might provide less accurate results than applying a nonlinear solver to the original system.

If a function F(X) is differentiable, then at an optimum, the gradient vector must vanish. Thus, it is also possible to start with an optimization problem involving F(X) and turn it into a problem in which we seek a zero of the nonlinear functions represented by the gradient of F. Of course, the gradient must be zero at a mininum, but the converse does not hold; thus unless we know more about F, it is not safe to try to replace the optimization problem by a nonlinear function solution.

For each test problem, routines are provided to evaluate the function, gradient vector, and hessian matrix. Routines are also provided to indicate the number of variables, the problem title, a suitable starting point, and a minimizing solution, if known.

The functions defined include:

1. The Fletcher-Powell helical valley function,
N = 3.
2. The Biggs EXP6 function,
N = 6.
3. The Gaussian function,
N = 3.
4. The Powell badly scaled function,
N = 2.
5. The Box 3-dimensional function,
N = 3.
6. The variably dimensioned function,
1 <= N.
7. The Watson function,
2 <= N.
8. The penalty function #1,
1 <= N.
9. The penalty function #2,
1 <= N.
10. The Brown badly scaled function,
N = 2.
11. The Brown and Dennis function,
N = 4.
12. The Gulf R&D function,
N = 3.
13. The trigonometric function,
1 <= N.
14. The extended Rosenbrock parabolic valley function,
1 <= N.
15. The extended Powell singular quartic function,
4 <= N.
16. The Beale function,
N = 2.
17. The Wood function,
N = 4.
1 <= N.
19. Leon's cubic valley function,
N = 2.
20. Gregory and Karney's Tridiagonal Matrix Function,
1 <= N.
21. The Hilbert function,
1 <= N.
22. The De Jong Function F1,
N = 3.
23. The De Jong Function F2,
N = 2.
24. The De Jong Function F3 (discontinuous),
N = 5.
25. The De Jong Function F4 (Gaussian noise),
N = 30.
26. The De Jong Function F5,
N = 2.
27. The Schaffer Function F6,
N = 2.
28. The Schaffer Function F7,
N = 2.
29. The Goldstein Price Polynomial,
N = 2.
30. The Branin RCOS Function,
N = 2.
31. The Shekel SQRN5 Function,
N = 4.
32. The Shekel SQRN7 Function,
N = 4.
33. The Shekel SQRN10 Function,
N = 4.
34. The Six-Hump Camel-Back Polynomial,
N = 2.
35. The Shubert Function,
N = 2.
36. The Stuckman Function,
N = 2.
37. The Easom Function,
N = 2.
38. The Bohachevsky Function #1,
N = 2.
39. The Bohachevsky Function #2,
N = 2.
40. The Bohachevsky Function #3,
N = 2.
41. The Colville Polynomial,
N = 4.
42. The Powell 3D function,
N = 3.
43. The Himmelblau function,
N = 2.

### Languages:

TEST_OPT is available in a FORTRAN90 version and a MATLAB version.

### Related Data and Programs:

ASA047, a FORTRAN90 library which minimizes a scalar function of several variables using the Nelder-Mead algorithm.

BRENT, a FORTRAN90 library which contains Richard Brent's routines for finding the zero, local minimizer, or global minimizer of a scalar function of a scalar argument, without the use of derivative information.

COMPASS_SEARCH, a FORTRAN90 library which seeks the minimizer of a scalar function of several variables using compass search, a direct search algorithm that does not use derivatives.

DQED, a FORTRAN90 library which solves constrained least squares problems.

ENTRUST, a MATLAB program which minimizes a scalar function of several variables using trust region methods, by Jeff Borggaard and Gene Cliff.

MINPACK, a FORTRAN90 library which carries out the least squares minimization of the residual of a set of linear or nonlinear equations.

NELDER_MEAD, a MATLAB program which minimizes a scalar function of several variables using the Nelder-Mead algorithm.

NL2SOL, a FORTRAN90 library which implements an adaptive nonlinear least-squares algorithm.

PRAXIS, a FORTRAN90 library which minimizes a scalar function of several variables.

TEST_NLS, a FORTRAN90 library which defines a number of problems for nonlinear least squares solvers.

TEST_NONLIN, a FORTRAN90 library which defines a number of problems for nonlinear equation solvers.

TEST_OPT_CON, a FORTRAN90 library which defines test problems for the minimization of a scalar function of several variables, with the search constrained to lie within a specified hyper-rectangle.

TEST_OPTIMIZATION, a FORTRAN90 library which defines test problems for the minimization of a scalar function of several variables, as described by Molga and Smutnicki.

TOMS611, a FORTRAN90 library which minimizes a scalar functional of multiple variables.

### Reference:

1. Evelyn Beale,
On an Iterative Method for Finding a Local Minimum of a Function of More than One Variable,
Technical Report 25,
Statistical Techniques Research Group,
Princeton University, 1958.
2. F K Branin, A widely convergent method for finding multiple solutions of simultaneous nonlinear equations,
IBM Journal of Research and Development,
pages 504-522, September 1972.
3. Richard Brent,
Algorithms for Minimization without Derivatives,
Dover, 2002,
ISBN: 0-486-41998-3,
LC: QA402.5.B74.
4. John Dennis, David Gay, Phuong Vu,
A new nonlinear equations test problem,
Technical Report 83-16,
Mathematical Sciences Department,
Rice University, 1983.
5. John Dennis, Robert Schnabel,
Numerical Methods for Unconstrained Optimization and Nonlinear Equations,
SIAM, 1996,
ISBN13: 978-0-898713-64-0,
LC: QA402.5.D44.
6. Noel deVilliers, David Glasser,
A continuation method for nonlinear regression,
SIAM Journal on Numerical Analysis,
Volume 18, 1981, pages 1139-1154.
7. Eric Easom,
A survey of global optimization techniques,
Master of Engineering thesis,
University of Louisville, Louisville, Kentucky, 1990.
8. Chris Fraley,
Solution of nonlinear least-squares problems,
Technical Report STAN-CS-1165,
Computer Science Department,
Stanford University, 1987.
9. Chris Fraley,
Software performance on nonlinear least-squares problems,
Technical Report SOL 88-17,
Systems Optimization Laboratory,
Department of Operations Research,
Stanford University, 1988.
10. Allen Goldstein, J Price,
On descent from local minima,
Mathematics of Computation,
Volume 25, Number 115, 1971.
11. David Himmelblau,
Applied Nonlinear Programming,
McGraw Hill, 1972,
ISBN13: 978-0070289215,
LC: T57.8.H55.
12. A Leon,
A Comparison of Eight Known Optimizing Procedures,
in Recent Advances in Optimization Techniques,
edited by Abraham Lavi, Thomas Vogl,
Wiley, 1966.
13. JJ McKeown,
Specialized versus general-purpose algorithms for functions that are sums of squared terms,
Mathematical Programming,
Volume 9, 1975, pages 57-68.
14. JJ McKeown,
On algorithms for sums of squares problems,
in Towards Global Optimization,
edited by L Dixon, Gabor Szego,
North-Holland, 1975, pages 229-257.
15. Zbigniew Michalewicz,
Genetic Algorithms + Data Structures = Evolution Programs,
Third Edition,
Springer, 1996,
ISBN: 3-540-60676-9,
LC: QA76.618.M53.
16. Jorge More, Burton Garbow, Kenneth Hillstrom,
Testing unconstrained optimization software,
ACM Transactions on Mathematical Software,
Volume 7, Number 1, March 1981, pages 17-41.
17. Jorge More, Burton Garbow, Kenneth Hillstrom,
Algorithm 566: FORTRAN Subroutines for Testing unconstrained optimization software,
ACM Transactions on Mathematical Software,
Volume 7, Number 1, March 1981, pages 136-140.
18. Michael Powell,
An Efficient Method for Finding the Minimum of a Function of Several Variables Without Calculating Derivatives,
Computer Journal,
Volume 7, Number 2, 1964, pages 155-162.
19. Douglas Salane,
A continuation approach for solving large residual nonlinear least squares problems,
SIAM Journal on Scientific and Statistical Computing,
Volume 8, 1987, pages 655-671.
20. Bruno Shubert,
A sequential method seeking the global maximum of a function,
SIAM Journal on Numerical Analysis,
Volume 9, pages 379-388, 1972.

### List of Routines:

• P00_F evaluates the objective function for any problem.
• P00_G evaluates the gradient for any problem.
• P00_GDIF approximates the gradient via finite differences.
• P00_H evaluates the Hessian for any problem.
• P00_HDIF approximates the Hessian via finite differences.
• P00_PROBLEM_NUM returns the number of problems available.
• P00_N returns the number of variables for any problem.
• P00_SOL returns the solution for any problem.
• P00_START returns a starting point for optimization for any problem.
• P00_TITLE returns a title for any problem.
• P01_F evaluates the objective function for problem 1.
• P01_G evaluates the gradient for problem 1.
• P01_H evaluates the Hessian for problem 1.
• P01_N returns the number of variables for problem 1.
• P01_SOL returns the solution for problem 1.
• P01_START returns a starting point for optimization for problem 1.
• P01_TITLE returns a title for problem 1.
• P02_F evaluates the objective function for problem 2.
• P02_G evaluates the gradient for problem 2.
• P02_H evaluates the Hessian for problem 2.
• P02_N returns the number of variables for problem 2.
• P02_SOL returns the solution for problem 2.
• P02_START returns a starting point for optimization for problem 2.
• P02_TITLE returns a title for problem 2.
• P03_F evaluates the objective function for problem 3.
• P03_G evaluates the gradient for problem 3.
• P03_YVEC is an auxilliary routine for problem 3.
• P03_H evaluates the Hessian for problem 3.
• P03_N returns the number of variables for problem 3.
• P03_SOL returns the solution for problem 3.
• P03_START returns a starting point for optimization for problem 3.
• P03_TITLE returns a title for problem 3.
• P04_F evaluates the objective function for problem 4.
• P04_G evaluates the gradient for problem 4.
• P04_H evaluates the Hessian for problem 4.
• P04_N returns the number of variables for problem 4.
• P04_SOL returns the solution for problem 4.
• P04_START returns a starting point for optimization for problem 4.
• P04_TITLE returns a title for problem 4.
• P05_F evaluates the objective function for problem 5.
• P05_G evaluates the gradient for problem 5.
• P05_H evaluates the Hessian for problem 5.
• P05_N returns the number of variables for problem 5.
• P05_SOL returns the solution for problem 5.
• P05_START returns a starting point for optimization for problem 5.
• P05_TITLE returns a title for problem 5.
• P06_F evaluates the objective function for problem 6.
• P06_G evaluates the gradient for problem 6.
• P06_H evaluates the Hessian for problem 6.
• P06_N returns the number of variables for problem 6.
• P06_SOL returns the solution for problem 6.
• P06_START returns a starting point for optimization for problem 6.
• P06_TITLE returns a title for problem 6.
• P07_F evaluates the objective function for problem 7.
• P07_G evaluates the gradient for problem 7.
• P07_H evaluates the Hessian for problem 7.
• P07_N returns the number of variables for problem 7.
• P07_SOL returns the solution for problem 7.
• P07_START returns a starting point for optimization for problem 7.
• P07_TITLE returns a title for problem 7.
• P08_F evaluates the objective function for problem 8.
• P08_G evaluates the gradient for problem 8.
• P08_H evaluates the Hessian for problem 8.
• P08_N returns the number of variables for problem 8.
• P08_SOL returns the solution for problem 8.
• P08_START returns a starting point for optimization for problem 8.
• P08_TITLE returns a title for problem 8.
• P09_F evaluates the objective function for problem 9.
• P09_G evaluates the gradient for problem 9.
• P09_H evaluates the Hessian for problem 9.
• P09_N returns the number of variables for problem 9.
• P09_SOL returns the solution for problem 9.
• P09_START returns a starting point for optimization for problem 9.
• P09_TITLE returns a title for problem 9.
• P10_F evaluates the objective function for problem 10.
• P10_G evaluates the gradient for problem 10.
• P10_H evaluates the Hessian for problem 10.
• P10_N returns the number of variables for problem 10.
• P10_SOL returns the solution for problem 10.
• P10_START returns a starting point for optimization for problem 10.
• P10_TITLE returns a title for problem 10.
• P11_F evaluates the objective function for problem 11.
• P11_G evaluates the gradient for problem 11.
• P11_H evaluates the Hessian for problem 11.
• P11_N returns the number of variables for problem 11.
• P11_SOL returns the solution for problem 11.
• P11_START returns a starting point for optimization for problem 11.
• P11_TITLE returns a title for problem 11.
• P12_F evaluates the objective function for problem 12.
• P12_G evaluates the gradient for problem 12.
• P12_H evaluates the Hessian for problem 12.
• P12_N returns the number of variables for problem 12.
• P12_SOL returns the solution for problem 12.
• P12_START returns a starting point for optimization for problem 12.
• P12_TITLE returns a title for problem 12.
• P13_F evaluates the objective function for problem 13.
• P13_G evaluates the gradient for problem 13.
• P13_H evaluates the Hessian for problem 13.
• P13_N returns the number of variables for problem 13.
• P13_SOL returns the solution for problem 13.
• P13_START returns a starting point for optimization for problem 13.
• P13_TITLE returns a title for problem 13.
• P14_F evaluates the objective function for problem 14.
• P14_G evaluates the gradient for problem 14.
• P14_H evaluates the Hessian for problem 14.
• P14_N returns the number of variables for problem 14.
• P14_SOL returns the solution for problem 14.
• P14_START returns a starting point for optimization for problem 14.
• P14_TITLE returns a title for problem 14.
• P15_F evaluates the objective function for problem 15.
• P15_G evaluates the gradient for problem 15.
• P15_H evaluates the Hessian for problem 15.
• P15_N returns the number of variables for problem 15.
• P15_SOL returns the solution for problem 15.
• P15_START returns a starting point for optimization for problem 15.
• P15_TITLE returns a title for problem 15.
• P16_F evaluates the objective function for problem 16.
• P16_G evaluates the gradient for problem 16.
• P16_H evaluates the Hessian for problem 16.
• P16_N returns the number of variables for problem 16.
• P16_SOL returns the solution for problem 16.
• P16_START returns a starting point for optimization for problem 16.
• P16_TITLE returns a title for problem 16.
• P17_F evaluates the objective function for problem 17.
• P17_G evaluates the gradient for problem 17.
• P17_H evaluates the Hessian for problem 17.
• P17_N returns the number of variables for problem 17.
• P17_SOL returns the solution for problem 17.
• P17_START returns a starting point for optimization for problem 17.
• P17_TITLE returns a title for problem 17.
• P18_F evaluates the objective function for problem 18.
• P18_FVEC is an auxilliary routine for problem 18.
• P18_G evaluates the gradient for problem 18.
• P18_H evaluates the Hessian for problem 18.
• P18_N returns the number of variables for problem 18.
• P18_SOL returns the solution for problem 18.
• P18_START returns a starting point for optimization for problem 18.
• P18_TITLE returns a title for problem 18.
• P19_F evaluates the objective function for problem 19.
• P19_G evaluates the gradient for problem 19.
• P19_H evaluates the Hessian for problem 19.
• P19_N returns the number of variables for problem 19.
• P19_SOL returns the solution for problem 19.
• P19_START returns a starting point for optimization for problem 19.
• P19_TITLE returns a title for problem 19.
• P20_F evaluates the objective function for problem 20.
• P20_G evaluates the gradient for problem 20.
• P20_H evaluates the Hessian for problem 20.
• P20_N returns the number of variables for problem 20.
• P20_SOL returns the solution for problem 20.
• P20_START returns a starting point for optimization for problem 20.
• P20_TITLE returns a title for problem 20.
• P21_F evaluates the objective function for problem 21.
• P21_G evaluates the gradient for problem 21.
• P21_H evaluates the Hessian for problem 21.
• P21_N returns the number of variables for problem 21.
• P21_SOL returns the solution for problem 21.
• P21_START returns a starting point for optimization for problem 21.
• P21_TITLE returns a title for problem 21.
• P22_F evaluates the objective function for problem 22.
• P22_G evaluates the gradient for problem 22.
• P22_H evaluates the Hessian for problem 22.
• P22_N returns the number of variables for problem 22.
• P22_SOL returns the solution for problem 22.
• P22_START returns a starting point for optimization for problem 22.
• P22_TITLE returns a title for problem 22.
• P23_F evaluates the objective function for problem 23.
• P23_G evaluates the gradient for problem 23.
• P23_H evaluates the Hessian for problem 23.
• P23_N returns the number of variables for problem 23.
• P23_SOL returns the solution for problem 23.
• P23_START returns a starting point for optimization for problem 23.
• P23_TITLE returns a title for problem 23.
• P24_F evaluates the objective function for problem 24.
• P24_G evaluates the gradient for problem 24.
• P24_H evaluates the Hessian for problem 24.
• P24_N returns the number of variables for problem 24.
• P24_SOL returns the solution for problem 24.
• P24_START returns a starting point for optimization for problem 24.
• P24_TITLE returns a title for problem 24.
• P25_F evaluates the objective function for problem 25.
• P25_G evaluates the gradient for problem 25.
• P25_H evaluates the Hessian for problem 25.
• P25_N returns the number of variables for problem 25.
• P25_P_GET gets the value of a parameter for problem 25.
• P25_P_SET sets the value of a parameter for problem 25.
• P25_P_VAL sets or gets the value of a parameter for problem 25.
• P25_SOL returns the solution for problem 25.
• P25_START returns a starting point for optimization for problem 25.
• P25_TITLE returns a title for problem 25.
• P26_F evaluates the objective function for problem 26.
• P26_G evaluates the gradient for problem 26.
• P26_H evaluates the Hessian for problem 26.
• P26_N returns the number of variables for problem 26.
• P26_SOL returns the solution for problem 26.
• P26_START returns a starting point for optimization for problem 26.
• P26_TITLE returns a title for problem 26.
• P27_F evaluates the objective function for problem 27.
• P27_G evaluates the gradient for problem 27.
• P27_H evaluates the Hessian for problem 27.
• P27_N returns the number of variables for problem 27.
• P27_SOL returns the solution for problem 27.
• P27_START returns a starting point for optimization for problem 27.
• P27_TITLE returns a title for problem 27.
• P28_F evaluates the objective function for problem 28.
• P28_G evaluates the gradient for problem 28.
• P28_H evaluates the Hessian for problem 28.
• P28_N returns the number of variables for problem 28.
• P28_SOL returns the solution for problem 28.
• P28_START returns a starting point for optimization for problem 28.
• P28_TITLE returns a title for problem 28.
• P29_F evaluates the objective function for problem 29.
• P29_G evaluates the gradient for problem 29.
• P29_H evaluates the Hessian for problem 29.
• P29_N returns the number of variables for problem 29.
• P29_SOL returns the solution for problem 29.
• P29_START returns a starting point for optimization for problem 29.
• P29_TITLE returns a title for problem 29.
• P30_F evaluates the objective function for problem 30.
• P30_G evaluates the gradient for problem 30.
• P30_H evaluates the Hessian for problem 30.
• P30_N returns the number of variables for problem 30.
• P30_SOL returns the solution for problem 30.
• P30_START returns a starting point for optimization for problem 30.
• P30_TITLE returns a title for problem 30.
• P31_F evaluates the objective function for problem 31.
• P31_G evaluates the gradient for problem 31.
• P31_H evaluates the Hessian for problem 31.
• P31_N returns the number of variables for problem 31.
• P31_SOL returns the solution for problem 31.
• P31_START returns a starting point for optimization for problem 31.
• P31_TITLE returns a title for problem 31.
• P32_F evaluates the objective function for problem 32.
• P32_G evaluates the gradient for problem 32.
• P32_H evaluates the Hessian for problem 32.
• P32_N returns the number of variables for problem 32.
• P32_SOL returns the solution for problem 32.
• P32_START returns a starting point for optimization for problem 32.
• P32_TITLE returns a title for problem 32.
• P33_F evaluates the objective function for problem 33.
• P33_G evaluates the gradient for problem 33.
• P33_H evaluates the Hessian for problem 33.
• P33_N returns the number of variables for problem 33.
• P33_SOL returns the solution for problem 33.
• P33_START returns a starting point for optimization for problem 33.
• P33_TITLE returns a title for problem 33.
• P34_F evaluates the objective function for problem 34.
• P34_G evaluates the gradient for problem 34.
• P34_H evaluates the Hessian for problem 34.
• P34_N returns the number of variables for problem 34.
• P34_SOL returns the solution for problem 34.
• P34_START returns a starting point for optimization for problem 34.
• P34_TITLE returns a title for problem 34.
• P35_F evaluates the objective function for problem 35.
• P35_G evaluates the gradient for problem 35.
• P35_H evaluates the Hessian for problem 35.
• P35_N returns the number of variables for problem 35.
• P35_SOL returns the solution for problem 35.
• P35_START returns a starting point for optimization for problem 35.
• P35_TITLE returns a title for problem 35.
• P36_F evaluates the objective function for problem 36.
• P36_G evaluates the gradient for problem 36.
• P36_H evaluates the Hessian for problem 36.
• P36_P_INIT initializes parameters for problem 36.
• P36_P_GET gets the values of the parameters for problem 36.
• P36_P_SET sets parameters for problem 36.
• P36_P_VAL sets or gets parameters for problem 36.
• P36_N returns the number of variables for problem 36.
• P36_SOL returns the solution for problem 36.
• P36_START returns a starting point for optimization for problem 36.
• P36_TITLE returns a title for problem 36.
• P37_F evaluates the objective function for problem 37.
• P37_G evaluates the gradient for problem 37.
• P37_H evaluates the Hessian for problem 37.
• P37_N returns the number of variables for problem 37.
• P37_SOL returns the solution for problem 37.
• P37_START returns a starting point for optimization for problem 37.
• P37_TITLE returns a title for problem 37.
• P38_F evaluates the objective function for problem 38.
• P38_G evaluates the gradient for problem 38.
• P38_H evaluates the Hessian for problem 38.
• P38_N returns the number of variables for problem 38.
• P38_SOL returns the solution for problem 38.
• P38_START returns a starting point for optimization for problem 38.
• P38_TITLE returns a title for problem 38.
• P39_F evaluates the objective function for problem 39.
• P39_G evaluates the gradient for problem 39.
• P39_H evaluates the Hessian for problem 39.
• P39_N returns the number of variables for problem 39.
• P39_SOL returns the solution for problem 39.
• P39_START returns a starting point for optimization for problem 39.
• P39_TITLE returns a title for problem 39.
• P40_F evaluates the objective function for problem 40.
• P40_G evaluates the gradient for problem 40.
• P40_H evaluates the Hessian for problem 40.
• P40_N returns the number of variables for problem 40.
• P40_SOL returns the solution for problem 40.
• P40_START returns a starting point for optimization for problem 40.
• P40_TITLE returns a title for problem 40.
• P41_F evaluates the objective function for problem 41.
• P41_G evaluates the gradient for problem 41.
• P41_H evaluates the Hessian for problem 41.
• P41_N returns the number of variables for problem 41.
• P41_SOL returns the solution for problem 41.
• P41_START returns a starting point for optimization for problem 41.
• P41_TITLE returns a title for problem 41.
• P42_F evaluates the objective function for problem 42.
• P42_G evaluates the gradient for problem 42.
• P42_H evaluates the Hessian for problem 42.
• P42_N returns the number of variables for problem 42.
• P42_SOL returns the solution for problem 42.
• P42_START returns a starting point for optimization for problem 42.
• P42_TITLE returns a title for problem 42.
• P43_F evaluates the objective function for problem 43.
• P43_G evaluates the gradient for problem 43.
• P43_H evaluates the Hessian for problem 43.
• P43_N returns the number of variables for problem 43.
• P43_SOL returns the solution for problem 43.
• P43_START returns a starting point for optimization for problem 43.
• P43_TITLE returns a title for problem 43.
• NORMAL_01_SAMPLE samples the standard Normal PDF.
• R8_UNIFORM returns a scaled pseudorandom R8.
• R8_UNIFORM_01 returns a unit pseudorandom R8.
• R8VEC_EVEN returns N evenly spaced double precision values.
• TIMESTAMP prints the current YMDHMS date as a time stamp.

You can go up one level to the FORTRAN90 source codes.

Last revised on 17 October 2011.