!*..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..* !| .**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**. | !| | | | !| | | | !| | PBDC - THE PROXIMAL BUNDLE METHOD FOR NONSMOOTH DC OPTIMIZATION | | !| | (version 2) | | !| | | | !| | | | !| | | | !| | by Kaisa Joki (last modified August 2015) | | !| | | | !| | | | !| | | | !| | NEW features : | | !| | | | !| | * Possibility to use simple stepsize determination after | | !| | each 'main iteration'. | | !| | | | !| | * During each round of 'main iteration' utilizes OpenMP | | !| | to calculate subproblems in parallel. However if you DO NOT | | !| | WANT to use this feature then | | !| | 1) in Makefile DELETE '-fopenmp' from line 5 | | !| | 2) in pbdc.f95 COMMENT lines 412-415 | | !| | | | !| | | | !| | The software is free for academic teaching and research purposes but I | | !| | ask you to refer the reference given below, if you use it. | | !| | | | !| | | | !| .**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**. | !*..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..* !| | !| | !| Utilizes new version of PLQDF1 by Ladislav Luksan as a quadratic solver. | !| | !| Utilizes PVMM by Ladislav Luksan as a norm minimization solver. This subroutine | !| uses PQSUBS and MQSUBS by Ladislav Luksan. PVMM is a VARIABLE METRIC ALGORITHM | !| for UNCONSTRAINED and LINEARLY CONSTRAINED OPTIMIZATION. | !| | !| The subroutine PVMM together with PQSUBS and MQSUBS is licensed by | !| the GNU Lesser General Public License (LGPL). | !| | !| | !| .**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**. | !*..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..* !| | !| | !| Codes include: | !| | !| tpbdc.f95 - Main program for PBDC (this file) | !| constants.f95 - Double precision (also some parameters) | !| bundle1.f95 - Bundle of DC component f_1 | !| bundle2.f95 - Bundle of DC component f_2 | !| functions.f95 - User-specified DC components f_1 and f_2 together with | !| subgradients of DC components. Contains also user-specified | !| initial values for parameters | !| norm_min.f95 - Solver for the norm minimization problem | !| fun.f95 - Defines objective funtion and gradient of the norm | !| minimization problem | !| pbdc.f95 - PBDC method | !| | !| plqdf1.f - Quadratic solver by Ladislav Luksan | !| pvmm.f - Variable metric method by Ladislav Luksan | !| mqsubs.f - Basic modules for PVMM (by Ladislav Luksan) | !| pqsubs.f - Matrix modules for PVMM (by Ladislav Luksan) | !| | !| Makefile - Makefile | !| | !| testproblems.f95 - Contains test problems used in [1] | !| | !| | !| To USE the software MODIFY tpbdc.f95 and functions.f95 as needed | !| | !| | !| References: | !| | !| [1] Kaisa Joki, Adil M. Bagirov, Napsu Karmitsa and Marko M. Mäkelä: | !| "New Proximal Bundle Method for Nonsmooth DC Optimization." | !| TUCS Technical Report No. 1130, Turku Centre for Computer Science, | !| Turku, 2015. | !| | !| .**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**. | !*..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..**..* PROGRAM tpbdc USE constants, ONLY : dp ! double precision (i.e. accuracy) USE functions ! INFORMATION from the USER USE bundle1 ! The BUNDLE of the DC component f_1 USE bundle2 ! The BUNDLE of the DC component f_2 USE pbdc ! PBDC method IMPLICIT NONE ! 'user_n' is the number of variables in the problem (USER specifies this in MODULE functions.f95) REAL (KIND=dp), DIMENSION(user_n) :: x_0 ! The starting point in the PBDC method (specified by USER) REAL (KIND=dp), DIMENSION(user_n) :: x_solution ! The solution obtained to the problem REAL(KIND=dp) :: f_solution ! The objective function value at the solution 'x_solution' INTEGER, DIMENSION(6) :: counter ! Contains the values of different counteres: ! counter(1) = iter_counter: the number of 'main iterations' executed ! counter(2) = subprob_counter: the number of subproblems solved ! counter(3) = f_counter: the number of function values evaluated for DC component ! counter(4) = subgrad1_counter: the number of subgradients calculated for f_1 ! counter(5) = subgrad2_counter: the number of subgradients calculated for f_2 ! counter(6) = stop_cond_counter: the number of times approximate stopping condition was tested during the algorithm INTEGER :: iprint ! Variable that specifies print option (specified by USER): ! iprint = 0 : print is suppressed ! iprint = 1 : basic print of final result ! iprint = -1: basic print of final result (without the solution vector) ! iprint = 2 : extended print of final result ! iprint = -2: extended print of final result (without the solution vector) ! iprint = 3 : basic print of intermediate results and extended print of final results ! iprint = -3: basic print of intermediate results and extended print of final results (without the solution vector) ! iprint = 4 : extended print of intermediate results and extended print of final results ! iprint = -4: extended print of intermediate results and extended print of final results (without the solution vectors) ! iprint = 5 : prints each step of the PBDC algorithm (i.e. everything is printed step by step) (NOT recommended) ! ! If 'iprint' <= -5 .OR. 'iprint' >= 6 then DEFAULT value 'iprint'=1 is used INTEGER :: mrounds ! The maximum number of 'main iterations' (specified by USER). ! If 'mrounds' <=0 then DEFAULT value 'mrounds'=5000 is used INTEGER :: mit ! The maximum number of rounds during one 'main iteration' (specified by USER). ! If 'mit' <=0 then DEFAULT value 'mit'=1000 is used INTEGER :: termination ! The reason for termination in PBDC: ! 1 - the stopping condition is satisfied (i.e. criticality) ! 2 - the approximate stopping condition is satisfied (i.e. eps-criticality) ! 3 - the maximum number 'mrounds' of rounds is executed in one main iteration ! 4 - the maximum number of 'main iterations' is executed LOGICAL :: agg_used ! If .TRUE. then aggregation is used in PBDC (specified by USER). LOGICAL :: stepsize_used ! If .TRUE. then simple stepsize determination is done in PBDC after each 'main iteration' (specified by USER). INTEGER :: i mrounds = 100000 ! maximum number of 'main iterations' mit = 100000 ! maximum number of rounds during one 'main iteration' iprint = -3 ! basic print of intermediate results and extended print of final results (without solution vector) agg_used = .TRUE. ! Aggregation is used stepsize_used = .FALSE. ! Simple stepsize determination is not used !-------------------------------------------------------------------------------------- ! The starting points for the test problems presented in MODULE testproblems.f95 and in the article [1] ! Problem 6.1. ! x_0 = (/ 2.0_dp, 2.0_dp /) ! Problem 6.2. (L1 version of Rosenbrock) ! x_0 = (/ -1.20_dp, 1.0_dp /) ! Problem 6.3. ! x_0 = (/ 1.0_dp, 3.0_dp, 3.0_dp, 1.0_dp /) ! Problem 6.4 (for any user_n) DO i = 1, user_n/2 x_0(i) = 1.0_dp * i END DO DO i = (user_n/2 + 1), user_n x_0(i) = -1.0_dp * i END DO ! Problem 6.5. ! x_0 = 0.0_dp ! Problem 6.6. ! x_0 = (/ 10.0_dp, 1.0_dp /) ! Problem 6.7. ! x_0 = (/ -2.0_dp, 1.0_dp /) ! Problem 6.8. ! x_0 = (/ 0.5_dp, 0.5_dp, 0.5_dp /) ! Problem 6.9. ! x_0= (/ 4.0_dp, 2.0_dp, 4.0_dp, 2.0_dp/) ! Problem 6.10. ! DO i = 1, user_n ! x_0(i) = 0.1_dp * i ! END DO !-------------------------------------------------------------------------------------- WRITE(*,*) '------------------------------------------------------------------' WRITE(*,*) '** START ** START ** START ** START ** START ** START ** START **' WRITE(*,*) '------------------------------------------------------------------' WRITE(*,*) ' ' CALL bundle_algorithm( x_0, x_solution, f_solution, mit, & & mrounds, termination, counter, agg_used, stepsize_used, iprint ) WRITE(*,*) ' ' WRITE(*,*) '------------------------------------------------------------------' WRITE(*,*) '** END ** END ** END ** END ** END ** END ** END ** END ** END **' WRITE(*,*) '------------------------------------------------------------------' WRITE(*,*) ' ' END PROGRAM tpbdc