quasiNewton_mod

link to source code

Dependency Diagrams:

quasiNewton_mod.svg

Direct Dependency Diagram

quasiNewton_mod_rev.svg

Reverse Dependency Diagram

Description

MODULE quasiNewton_mod (prefix=’qna’ category=’1. High-level functionality’)

Purpose

The n1qn3 routine, and its supporting subroutines. The original code was modified to support MPI parallelization.

Quick access

Routines

dcube(), ddd(), ddds(), mupdts(), n1qn3a(), nlis0(), qna_n1qn3()

Needed modules

  • midasmpi_mod: MODULE midasMpi_mod (prefix=’mmpi’ category=’8. Low-level utilities and constants’)

Variables

Subroutines and functions

subroutine  quasinewton_mod/dcube(t, f, fp, ta, fa, fpa, tlower, tupper)
Purpose

[to be completed]

Arguments
  • t [real ]

  • f [real ]

  • fp [real ]

  • ta [real ]

  • fa [real ]

  • fpa [real ]

  • tlower [real ]

  • tupper [real ]

Called from

nlis0()

subroutine  quasinewton_mod/ddd(prosca, dtonb, dtcab, n, sscale, nm, depl, aux, jmin, jmax, precos, diag, ybar, sbar, izs, rzs, dzs)
Purpose

Calcule le produit H.g ou

  • H est une matrice construite par la formule de bfgs inverse a nm memoires a partir de la matrice diagonale diag dans un espace hilbertien dont le produit scalaire est donne par prosca (cf. J. Nocedal, Math. of Comp. 35/151 (1980) 773-782)

  • g est un vecteur de dimension n (en general le gradient)

  • la matrice diag apparait donc comme un preconditionneur diagonal

Arguments
  • depl (n) [real ] ::

    g (en entree), = H g (en sortie)

    • la matrice H est memorisee par les vecteurs des tableaux

  • ybar (n,1) [real ] ::

    sbar et les pointeurs jmin, jmax

    • alpha(nm) est une zone de travail

  • izs (1) [integer ] :: 1),rzs(1),dzs(1) sont des zones de travail pour prosca

  • prosca [external]

  • dtonb [external]

  • dtcab [external]

  • n [integer ]

  • sscale [logical ]

  • nm [integer ]

  • aux (n) [real ]

  • jmin [integer ]

  • jmax [integer ]

  • precos [real ]

  • diag (n) [real ]

  • sbar (n,1) [real ]

  • rzs (1) [real ]

  • dzs (1) [real ]

Needed modules

  • ddd__user__routines

Called from

n1qn3a()

subroutine  quasinewton_mod/ddds(prosca, dtonb, dtcab, n, sscale, nm, depl, aux, jmin, jmax, precos, diag, ybar, sbar, izs, rzs, dzs)
Purpose

This subroutine has the same role as ddd (computation of the product H.g). It supposes however that the (y,s) pairs are not stored in core memory, but on a devise chosen by the user.

Arguments
  • prosca [external]

  • dtonb [external]

  • dtcab [external]

  • n [integer ]

  • sscale [logical ]

  • nm [integer ]

  • depl (n) [real ]

  • aux (n) [real ]

  • jmin [integer ]

  • jmax [integer ]

  • precos [real ]

  • diag (n) [real ]

  • ybar (n) [real ]

  • sbar (n) [real ]

  • izs (1) [integer ]

  • rzs (1) [real ]

  • dzs (1) [real ]

Needed modules

  • ddds__user__routines

Called from

n1qn3a()

subroutine  quasinewton_mod/mupdts(sscale, inmemo, n, m, nrz)
Arguments
  • sscale [logical ]

  • inmemo [logical ]

  • n [integer ]

  • m [integer ]

  • nrz [integer ]

Called from

qna_n1qn3()

subroutine  quasinewton_mod/qna_n1qn3(simul, prosca, dtonb, dtcab, n, x, f, g, dxmin, df1, epsg, impres, io, mode, niter, nsim, iz, dz, ndz, izs, rzs, dzs)
Purpose

N1QN3, Version 2.0c, June 1995 Jean Charles Gilbert, Claude Lemarechal, INRIA.

Double precision version of M1QN3.

N1qn3 has two running modes: the SID (Scalar Initial Scaling) mode and the DIS (Diagonal Initial Scaling) mode. Both do not require the same amount of storage, the same subroutines, … In the description below, items that differ in the DIS mode with respect to the SIS mode are given in brakets.

Use the following subroutines:

  • N1QN3A

  • DDD, DDDS

  • NLIS0 + DCUBE (Dec 88)

  • MUPDT

The following routines are proposed to the user in case the Euclidean scalar product is used: DUCLID, DTONBE, DTCABE.

La sous-routine N1QN3 est une interface entre le programme appelant et la sous-routine N1QN3A, le minimiseur proprement dit.

Le module PROSCA est sense realiser le produit scalaire de deux vecteurs de Rn; le module DTONB est sense realiser le changement de coordonnees correspondant au changement de bases: base euclidienne -> base orthonormale (pour le produit scalaire PROSCA); le module CTBAB fait la transformation inverse: base orthonormale -> base euclidienne.

Iz is an integer working zone for N1QN3A, its dimension is 5. It is formed of 5 scalars that are set by the optimizer:

  • the dimension of the problem,

  • a identifier of the scaling mode,

  • the number of updates,

  • two pointers.

Dz est la zone de travail pour N1QN3A, de dimension ndz. Elle est subdivisee en

  • 3 [ou 4] vecteurs de dimension n: d,gg,[diag,]aux

  • m vecteurs de dimension n: ybar

  • m vecteurs de dimension n: sbar

m est alors le plus grand entier tel que

  • m*(2*n+1)+3*n .le. ndz [m*(2*n+1)+4*n .le. ndz)]

  • soit m := (ndz-3*n) / (2*n+1) [m := (ndz-4*n) / (2*n+1)].

Il faut avoir m >= 1, donc ndz >= 5n+1 [ndz >= 6n+1].

A chaque iteration la metrique est formee a partir d’un multiple de l’identite [d’une matrice diagonale] D qui est mise a jour m fois par la formule de BFGS en utilisant les m couples {y,s} les plus recents.

Arguments
  • simul [external]

  • prosca [external]

  • dtonb [external]

  • dtcab [external]

  • n [integer ]

  • x (n) [real ]

  • f [real ]

  • g (n) [real ]

  • dxmin [real ]

  • df1 [real ]

  • epsg [real ]

  • impres [integer ]

  • io [integer ]

  • mode [integer ]

  • niter [integer ]

  • nsim [integer ]

  • iz (5) [integer ]

  • dz (ndz) [real ]

  • ndz [integer ]

  • izs (1) [integer ]

  • rzs (1) [real ]

  • dzs (1) [real ]

Needed modules

  • qna_n1qn3__user__routines

Called from

minimize(), quasinewtonminimization()

Call to

mupdts(), n1qn3a()

subroutine  quasinewton_mod/n1qn3a(simul, prosca, dtonb, dtcab, n, x, f, g, dxmin, df1, epsg, impres, io, mode, niter, nsim, inmemo, m, jmin, jmax, d, gg, diag, aux, ybar, sbar, izs, rzs, dzs)
Purpose

Code d’optimisation proprement dit.

Arguments
  • simul [external]

  • prosca [external]

  • dtonb [external]

  • dtcab [external]

  • n [integer ]

  • x (n) [real ]

  • f [real ]

  • g (n) [real ]

  • dxmin [real ]

  • df1 [real ]

  • epsg [real ]

  • impres [integer ]

  • io [integer ]

  • mode [integer ]

  • niter [integer ]

  • nsim [integer ]

  • inmemo [logical ]

  • m [integer ]

  • jmin [integer ]

  • jmax [integer ]

  • d (n) [real ]

  • gg (n) [real ]

  • diag (n) [real ]

  • aux (n) [real ]

  • ybar (n,1) [real ]

  • sbar (n,1) [real ]

  • izs (1) [integer ]

  • rzs (1) [real ]

  • dzs (1) [real ]

Needed modules

  • n1qn3a__user__routines

Called from

qna_n1qn3()

Call to

ddd(), ddds(), nlis0(), mmpi_allreduce_sumreal8scalar()

subroutine  quasinewton_mod/nlis0(n, simul, prosca, xn, fn, fpn, t, tmin, tmax, d, g, amd, amf, imp, io, logic, nap, napmax, x, izs, rzs, dzs)
Purpose

en sortie logic =

  • 0 descente serieuse

  • 1 descente bloquee

  • 4 nap > napmax

  • 5 retour a l’utilisateur

  • 6 fonction et gradient pas d’accord

  • < 0 contrainte implicite active

Arguments
  • n [integer ]

  • simul [external]

  • prosca [external]

  • xn (n) [real ]

  • fn [real ]

  • fpn [real ]

  • t [real ]

  • tmin [real ]

  • tmax [real ]

  • d (n) [real ]

  • g (n) [real ]

  • amd [real ]

  • amf [real ]

  • imp [integer ]

  • io [integer ]

  • logic [integer ]

  • nap [integer ]

  • napmax [integer ]

  • x (n) [real ]

  • izs (*) [integer ]

  • rzs (*) [real ]

  • dzs (*) [real ]

Needed modules

  • nlis0__user__routines

Called from

n1qn3a()

Call to

dcube()