Mercurial > octave
view libcruft/fsqp/fsqpd1.f @ 2329:30c606bec7a8
[project @ 1996-07-19 01:29:05 by jwe]
Initial revision
author | jwe |
---|---|
date | Fri, 19 Jul 1996 01:29:55 +0000 |
parents | |
children |
line wrap: on
line source
subroutine FSQPD1(miter,nparam,nob,nobL,nineqn,neq,neqn,ncnstr, * nctotl,nrowa,feasb,epskt,epseqn,xl,xu,indxob, * indxcn,iact,iskip,istore,iw,leniw,x,di,d,g,gm, * gradg,f,gradf,grdpsf,penp,a,bl,bu,clamda, * cllamd,cvec,bj,hess,hess1,span,backup,signeq, * w,lenw,obj,constr,gradob,gradcn) c c FSQP Version 3.3 : main routine for the optimization c c implicit real*8(a-h,o-z) integer miter,nparam,nob,nobL,nineqn,neq,neqn,ncnstr,nctotl,nrowa, * leniw,lenw integer indxob(1),indxcn(1),iact(1),iskip(1), * istore(1),iw(leniw) c integer indxob(nob),indxcn(ncnstr),iact(nob+nineqn+neqn),iskip(1), c * istore(nineqn+nob+neqn),iw(leniw) double precision epskt,epseqn double precision xl(nparam),xu(nparam),x(nparam+1),di(nparam+1), * d(nparam+1),g(1),gm(1),gradg(nparam,1), * f(1),gradf(nparam,1),grdpsf(nparam),penp(1), * a(nrowa,1),bl(1),bu(1),clamda(1), * cllamd(1),cvec(nparam+1),bj(1), * hess(nparam,nparam),hess1(1),span(1), * backup(1),signeq(1),w(lenw) c double precision xl(nparam),xu(nparam),x(nparam+1),di(nparam+1), c * d(nparam+1),g(ncnstr),gm(4*neqn),gradg(nparam,ncnstr), c * f(nob),gradf(nparam,nob),grdpsf(nparam),penp(neqn), c * a(nrowa,1),bl(nctotl),bu(nctotl),clamda(nctotl+nparam+1), c * cllamd(nctotl),cvec(nparam+1),bj(nrowa), c * hess(nparam,nparam),hess1(nparam+1,nparam+1),span(1), c * backup(nob+ncnstr),signeq(neqn),w(lenw) external obj,constr,gradob,gradcn logical feasb c integer nnineq,M,ncallg,ncallf,mode,io,iprint,info,ipd,iter,nstop, * initvl,ipspan,ipyes,lstype double precision bigbnd,tolfea,epsmac,rteps,udelta,valnom logical dlfeas,local,update,first common /fsqpp1/nnineq,M,ncallg,ncallf,mode,lstype,nstop, * /fsqpp2/io,iprint,ipspan,ipyes,info,ipd,iter,initvl, * /fsqpp3/epsmac,rteps,udelta,valnom, * /fsqpq1/bigbnd,tolfea, c * /fsqp1/rentry, * /fsqplo/dlfeas,local,update,first c c bj(1+) is equivalent to bl(nparam+3+) c integer i,iskp,nfs,ncf,ncg,nn,non,nstart,nrst,ncnst1,nctot1 double precision Cbar,Ck,dbar,fM,fMp,steps,d0nm,dummy, * sktnom,scvneq,grdftd,dmax1,psf c initvl=1 first=.true. nrst=0 ipd=0 if(iter.eq.0) call diagnl(nparam,1.d0,hess) if(.not.feasb) goto 5 first=.true. if(iter.gt.0) iter=iter-1 if(iter.ne.0) call diagnl(nparam,1.d0,hess) 5 Cbar=1.d-02 Ck=Cbar dbar=5.0d0 nstart=1 ncallf=0 nstop=1 nfs=0 non=miter if(mode.eq.0) goto 10 nfs=M non=0 10 if(feasb) then nn=nineqn+neqn ncnst1=ncnstr nctot1=nctotl else nn=0 ncnst1=ncnstr-nineqn-neqn nctot1=nnineq-nineqn+neq-neqn+nparam if(nob.gt.1) nctot1=nctot1+1 endif scvneq=0.d0 do 100 i=1,ncnst1 valnom=g(indxcn(i)) backup(i)=valnom if(feasb.and.i.gt.nineqn.and.i.le.nn) then gm(i-nineqn)=valnom*signeq(i-nineqn) scvneq=scvneq+dabs(valnom) endif if(.not.feasb.or.i.gt.nn) goto 20 iact(i)=indxcn(i) istore(i)=0 if(i.gt.nineqn) penp(i-nineqn)=10.d0 20 call gradcn(nparam,indxcn(i),x,gradg(1,indxcn(i)),constr) 100 continue call nullvc(nparam,grdpsf) psf=0.d0 if(.not.feasb.or.neqn.eq.0) goto 110 call resign(nparam,neqn,psf,grdpsf,penp,g(nnineq+1), * gradg(1,nnineq+1),signeq,12,12) 110 fM=-bigbnd do 140 i=1,nob if(.not.feasb) goto 120 iact(nn+i)=i istore(nn+i)=0 call obj(nparam,i,x,f(i)) valnom=f(i) backup(i+ncnst1)=valnom call gradob(nparam,i,x,gradf(1,i),obj) ncallf=ncallf+1 if(nobL.ne.nob) fM=dmax1(fM,-f(i)) goto 130 120 valnom=f(i) iact(i)=i istore(i)=0 call gradcn(nparam,indxob(i),x,gradf(1,i),constr) 130 fM=dmax1(fM,f(i)) 140 continue fMp=fM-psf span(1)=fM c if(iprint.lt.3.or..not.first.or.ipyes.gt.0) goto 600 do 300 i=1,nob if(.not.feasb) goto 250 if(nob.gt.1) * call sbout2(io,nparam,i,'gradf(j,',')',gradf(1,i)) if(nob.eq.1) * call sbout1(io,nparam,'gradf(j) ', * dummy,gradf(1,1),2,2) goto 300 250 call sbout2(io,nparam,indxob(i),'gradg(j,',')',gradf(1,i)) 300 continue 310 if(ncnstr.eq.0) goto 410 do 400 i=1,ncnst1 400 call sbout2(io,nparam,i,'gradg(j,',')',gradg(1,i)) if(neqn.eq.0) goto 410 call sbout1(io,nparam,'grdpsf(j) ',dummy,grdpsf,2,2) call sbout1(io,neqn,'P ',dummy,penp,2,2) 410 do 500 i=1,nparam 500 call sbout2(io,nparam,i,'hess (j,',')',hess(1,i)) c c main loop of the algorithm c 600 nstop=1 601 continue call out(miter,nparam,nob,nineqn,nn,neqn,ncnst1,x,g, * f,fM,psf,steps,sktnom,d0nm,feasb) if(nstop.ne.0) goto 810 if(.not.feasb) goto 801 do 700 i=1,ncnst1 700 g(i)=backup(i) do 800 i=1,nob 800 f(i)=backup(i+ncnst1) 801 return 810 continue if(ipspan.ge.10.and.iprint.ge.2.and.ipyes.eq.0) * write(io,9900) iter call dir(nparam,nob,nobL,nineqn,neq,neqn,nn,ncnst1,nctot1,nrowa, * feasb,steps,epskt,epseqn,sktnom,scvneq,Ck,d0nm,grdftd, * xl,xu,indxob,indxcn,iact,iskp,iskip,istore,iw,leniw, * x,di,d,g,gradg,f,fM,fMp,psf,gradf,grdpsf,penp,a, * bl,bu,clamda,cllamd,cvec,bj,hess,hess1,w,lenw, * backup,signeq,obj,constr) if(nstop.eq.0) goto 601 first=.false. if(update) goto 820 call step(nparam,nob,nobL,nineqn,neq,neqn,nn,ncnst1,ncg,ncf, * indxob,indxcn,iact,iskp,iskip,istore,feasb,grdftd, * f,fM,fMp,psf,penp,steps,scvneq,bu,x,di,d,g,w, * backup,signeq,obj,constr) if(nstop.eq.0) goto 601 820 call hesian(nparam,nob,nobL,nineqn,neq,neqn,nn,ncnst1,nctot1, * nfs,nstart,feasb,bigbnd,bu,x,f,fM,fMp,psf, * gradf,grdpsf,penp,g,gm,gradg,indxob,indxcn,cllamd, * bl,clamda,di,hess,d,steps,nrst,signeq,span, * obj,constr,gradob,gradcn, * hess1,cvec,bj,w,lenw,iw,leniw) if(nstop.eq.0) goto 601 if(mode.eq.0) goto 601 if(d0nm.gt.dbar) Ck=dmax1(dble(0.5*Ck),Cbar) if(d0nm.le.dbar.and.dlfeas) Ck=Ck if(d0nm.le.dbar.and..not.dlfeas) Ck=10.0*Ck goto 601 9900 format(1x,9hiteration,t22,i22) end