aboutsummaryrefslogtreecommitdiff
path: root/math/llsq/ldp.f
blob: a083f35bea6f758836fb67968a78ecc3d3804292 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
subroutine ldp (g,mdg,m,n,h,x,xnorm,w,index,ier)
c     c.l.lawson and r.j.hanson, jet propulsion laboratory, 1974 mar 1
c     to appear in 'solving least squares problems', prentice-hall, 1974
c
c	     **********  least distance programming  **********
c
      integer index(m)
      dimension g(mdg,n), h(m), x(n), w(1)
      zero=0.
      one=1.
      if (n.le.0) go to 120
	  do 10 j=1,n
   10	  x(j)=zero
      xnorm=zero
      if (m.le.0) go to 110
c
c     the declared dimension of w() must be at least (n+1)*(m+2)+2*m.
c
c      first (n+1)*m locs of w()   =  matrix e for problem nnls.
c	next	 n+1 locs of w()   =  vector f for problem nnls.
c	next	 n+1 locs of w()   =  vector z for problem nnls.
c	next	   m locs of w()   =  vector y for problem nnls.
c	next	   m locs of w()   =  vector wdual for problem nnls.
c     copy g**t into first n rows and m columns of e.
c     copy h**t into row n+1 of e.
c
      iw=0
	  do 30 j=1,m
	      do 20 i=1,n
	      iw=iw+1
   20	      w(iw)=g(j,i)
	  iw=iw+1
   30	  w(iw)=h(j)
      if=iw+1
c				 store n zeros followed by a one into f.
	  do 40 i=1,n
	  iw=iw+1
   40	  w(iw)=zero
      w(iw+1)=one
c
      np1=n+1
      iz=iw+2
      iy=iz+np1
      iwdual=iy+m
c
      call nnls (w,np1,np1,m,w(if),w(iy),rnorm,w(iwdual),w(iz),index,
     *		 ier)
c		       use the following return if unsuccessful in nnls.
      if (ier.ne.0) return
      if (rnorm) 130,130,50
   50 fac=one
      iw=iy-1
	  do 60 i=1,m
	  iw=iw+1
c				here we are using the solution vector y.
   60	  fac=fac-h(i)*w(iw)
c
      if (diff(one+fac,one)) 130,130,70
   70 fac=one/fac
	  do 90 j=1,n
	  iw=iy-1
	      do 80 i=1,m
	      iw=iw+1
c				here we are using the solution vector y.
   80	      x(j)=x(j)+g(i,j)*w(iw)
   90	  x(j)=x(j)*fac
	  do 100 j=1,n
  100	  xnorm=xnorm+x(j)**2
      xnorm=sqrt(xnorm)
c			      successful return.
  110 ier=0
      return
c			      error return.	  n .le. 0.
  120 ier=2
      return
c			      returning with constraints not compatible.
  130 ier=4
      return
      end