Created
August 23, 2022 19:55
-
-
Save JackDunnNZ/f551fe378aa2c5186255cd936817981b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
c | |
c newGLMnet (5/12/14) | |
c | |
c | |
c Elastic net with squared-error loss | |
c | |
c dense predictor matrix: | |
c | |
c call elnet(ka,parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd, | |
c intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
c | |
c x(no,ni) = predictor data matrix flat file (overwritten) | |
c | |
c | |
c sparse predictor matrix: | |
c | |
c call spelnet(ka,parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, | |
c isd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
c | |
c x, ix, jx = predictor data matrix in compressed sparse row format | |
c | |
c | |
c other inputs: | |
c | |
c ka = algorithm flag | |
c ka=1 => covariance updating algorithm | |
c ka=2 => naive algorithm | |
c parm = penalty member index (0 <= parm <= 1) | |
c = 0.0 => ridge | |
c = 1.0 => lasso | |
c no = number of observations | |
c ni = number of predictor variables | |
c y(no) = response vector (overwritten) | |
c w(no)= observation weights (overwritten) | |
c jd(jd(1)+1) = predictor variable deletion flag | |
c jd(1) = 0 => use all variables | |
c jd(1) != 0 => do not use variables jd(2)...jd(jd(1)+1) | |
c vp(ni) = relative penalties for each predictor variable | |
c vp(j) = 0 => jth variable unpenalized | |
c cl(2,ni) = interval constraints on coefficient values (overwritten) | |
c cl(1,j) = lower bound for jth coefficient value (<= 0.0) | |
c cl(2,j) = upper bound for jth coefficient value (>= 0.0) | |
c ne = maximum number of variables allowed to enter largest model | |
c (stopping criterion) | |
c nx = maximum number of variables allowed to enter all models | |
c along path (memory allocation, nx > ne). | |
c nlam = (maximum) number of lamda values | |
c flmin = user control of lamda values (>=0) | |
c flmin < 1.0 => minimum lamda = flmin*(largest lamda value) | |
c flmin >= 1.0 => use supplied lamda values (see below) | |
c ulam(nlam) = user supplied lamda values (ignored if flmin < 1.0) | |
c thr = convergence threshold for each lamda solution. | |
c iterations stop when the maximum reduction in the criterion value | |
c as a result of each parameter update over a single pass | |
c is less than thr times the null criterion value. | |
c (suggested value, thr=1.0e-5) | |
c isd = predictor variable standarization flag: | |
c isd = 0 => regression on original predictor variables | |
c isd = 1 => regression on standardized predictor variables | |
c Note: output solutions always reference original | |
c variables locations and scales. | |
c intr = intercept flag | |
c intr = 0/1 => don't/do include intercept in model | |
c maxit = maximum allowed number of passes over the data for all lambda | |
c values (suggested values, maxit = 100000) | |
c | |
c output: | |
c | |
c lmu = actual number of lamda values (solutions) | |
c a0(lmu) = intercept values for each solution | |
c ca(nx,lmu) = compressed coefficient values for each solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin(lmu) = number of compressed coefficients for each solution | |
c rsq(lmu) = R**2 values for each solution | |
c alm(lmu) = lamda values corresponding to each solution | |
c nlp = actual number of passes over the data for all lamda values | |
c jerr = error flag: | |
c jerr = 0 => no error | |
c jerr > 0 => fatal error - no output returned | |
c jerr < 7777 => memory allocation error | |
c jerr = 7777 => all used predictors have zero variance | |
c jerr = 10000 => maxval(vp) <= 0.0 | |
C jerr < 0 => non fatal error - partial output: | |
c Solutions for larger lamdas (1:(k-1)) returned. | |
c jerr = -k => convergence for kth lamda value not reached | |
c after maxit (see above) iterations. | |
c jerr = -10000-k => number of non zero coefficients along path | |
c exceeds nx (see above) at kth lamda value. | |
c | |
c | |
c | |
c least-squares utility routines: | |
c | |
c | |
c uncompress coefficient vectors for all solutions: | |
c | |
c call solns(ni,nx,lmu,ca,ia,nin,b) | |
c | |
c input: | |
c | |
c ni,nx = input to elnet | |
c lmu,ca,ia,nin = output from elnet | |
c | |
c output: | |
c | |
c b(ni,lmu) = all elnet returned solutions in uncompressed format | |
c | |
c | |
c uncompress coefficient vector for particular solution: | |
c | |
c call uncomp(ni,ca,ia,nin,a) | |
c | |
c input: | |
c | |
c ni = total number of predictor variables | |
c ca(nx) = compressed coefficient values for the solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for the solution | |
c | |
c output: | |
c | |
c a(ni) = uncompressed coefficient vector | |
c referencing original variables | |
c | |
c | |
c evaluate linear model from compressed coefficients and | |
c uncompressed predictor matrix: | |
c | |
c call modval(a0,ca,ia,nin,n,x,f); | |
c | |
c input: | |
c | |
c a0 = intercept | |
c ca(nx) = compressed coefficient values for a solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for solution | |
c n = number of predictor vectors (observations) | |
c x(n,ni) = full (uncompressed) predictor matrix | |
c | |
c output: | |
c | |
c f(n) = model predictions | |
c | |
c | |
c evaluate linear model from compressed coefficients and | |
c compressed predictor matrix: | |
c | |
c call cmodval(a0,ca,ia,nin,x,ix,jx,n,f); | |
c | |
c input: | |
c | |
c a0 = intercept | |
c ca(nx) = compressed coefficient values for a solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for solution | |
c x, ix, jx = predictor matrix in compressed sparse row format | |
c n = number of predictor vectors (observations) | |
c | |
c output: | |
c | |
c f(n) = model predictions | |
c | |
c | |
c | |
c | |
c Multiple response | |
c elastic net with squared-error loss | |
c | |
c dense predictor matrix: | |
c | |
c call multelnet(parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd, | |
c jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
c | |
c x(no,ni) = predictor data matrix flat file (overwritten) | |
c | |
c | |
c sparse predictor matrix: | |
c | |
c call multspelnet(parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, | |
c isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
c | |
c x, ix, jx = predictor data matrix in compressed sparse row format | |
c | |
c other inputs: | |
c | |
c nr = number of response variables | |
c y(no,nr) = response data matrix (overwritten) | |
c jsd = response variable standardization flag | |
c jsd = 0 => regression using original response variables | |
c jsd = 1 => regression using standardized response variables | |
c Note: output solutions always reference original | |
c variables locations and scales. | |
c all other inputs same as elnet/spelnet above | |
c | |
c output: | |
c | |
c a0(nr,lmu) = intercept values for each solution | |
c ca(nx,nr,lmu) = compressed coefficient values for each solution | |
c all other outputs same as elnet/spelnet above | |
c (jerr = 90000 => bounds adjustment non convergence) | |
c | |
c | |
c | |
c multiple response least-squares utility routines: | |
c | |
c | |
c uncompress coefficient matrix for all solutions: | |
c | |
c call multsolns(ni,nx,nr,lmu,ca,ia,nin,b) | |
c | |
c input: | |
c | |
c ni,nx,nr = input to multelnet | |
c lmu,ca,ia,nin = output from multelnet | |
c | |
c output: | |
c | |
c b(ni,nr,lmu) = all multelnet returned solutions in uncompressed format | |
c | |
c | |
c uncompress coefficient matrix for particular solution: | |
c | |
c call multuncomp(ni,nr,nx,ca,ia,nin,a) | |
c | |
c input: | |
c | |
c ni,nr,nx = input to multelnet | |
c ca(nx,nr) = compressed coefficient values for the solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for the solution | |
c | |
c output: | |
c | |
c a(ni,nr) = uncompressed coefficient matrix | |
c referencing original variables | |
c | |
c | |
c evaluate linear model from compressed coefficients and | |
c uncompressed predictor matrix: | |
c | |
c call multmodval(nx,nr,a0,ca,ia,nin,n,x,f); | |
c | |
c input: | |
c | |
c nx,nr = input to multelnet | |
c a0(nr) = intercepts | |
c ca(nx,nr) = compressed coefficient values for a solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for solution | |
c n = number of predictor vectors (observations) | |
c x(n,ni) = full (uncompressed) predictor matrix | |
c | |
c output: | |
c | |
c f(nr,n) = model predictions | |
c | |
c | |
c evaluate linear model from compressed coefficients and | |
c compressed predictor matrix: | |
c | |
c call multcmodval(nx,nr,a0,ca,ia,nin,x,ix,jx,n,f); | |
c | |
c input: | |
c | |
c nx,nr = input to multelnet | |
c a0(nr) = intercepts | |
c ca(nx,nr) = compressed coefficient values for a solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for solution | |
c x, ix, jx = predictor matrix in compressed sparse row format | |
c n = number of predictor vectors (observations) | |
c | |
c output: | |
c | |
c f(nr,n) = model predictions | |
c | |
c | |
c | |
c | |
c Symmetric binomial/multinomial logistic elastic net | |
c | |
c | |
c dense predictor matrix: | |
c | |
c call lognet (parm,no,ni,nc,x,y,o,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd, | |
c intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) | |
c | |
c x(no,ni) = predictor data matrix flat file (overwritten) | |
c | |
c | |
c sparse predictor matrix: | |
c | |
c call splognet (parm,no,ni,nc,x,ix,jx,y,o,jd,vp,cl,ne,nx,nlam,flmin, | |
c ulam,thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) | |
c | |
c x, ix, jx = predictor data matrix in compressed sparse row format | |
c | |
c | |
c other inputs: | |
c | |
c parm,no,ni,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd,intr,maxit | |
c = same as elnet above. | |
c | |
c nc = number of classes (distinct outcome values) | |
c nc=1 => binomial two-class logistic regression | |
c (all output references class 1) | |
c y(no,max(2,nc)) = number of each class at each design point | |
c entries may have fractional values or all be zero (overwritten) | |
c o(no,nc) = observation off-sets for each class | |
c kopt = optimization flag | |
c kopt = 0 => Newton-Raphson (recommended) | |
c kpot = 1 => modified Newton-Raphson (sometimes faster) | |
c kpot = 2 => nonzero coefficients same for each class (nc > 1) | |
c | |
c | |
c output: | |
c | |
c lmu,ia,nin,alm,nlp = same as elent above | |
c | |
c a0(nc,lmu) = intercept values for each class at each solution | |
c ca(nx,nc,lmu) = compressed coefficient values for each class at | |
c each solution | |
c dev0 = null deviance (intercept only model) | |
c fdev(lmu) = fraction of devience explained by each solution | |
c jerr = error flag | |
c jerr = 0 => no error | |
c jerr > 0 => fatal error - no output returned | |
c jerr < 7777 => memory allocation error | |
c jerr = 7777 => all used predictors have zero variance | |
c jerr = 8000 + k => null probability < 1.0e-5 for class k | |
c jerr = 9000 + k => null probability for class k | |
c > 1.0 - 1.0e-5 | |
c jerr = 10000 => maxval(vp) <= 0.0 | |
c jerr = 90000 => bounds adjustment non convergence | |
C jerr < 0 => non fatal error - partial output: | |
c Solutions for larger lamdas (1:(k-1)) returned. | |
c jerr = -k => convergence for kth lamda value not reached | |
c after maxit (see above) iterations. | |
c jerr = -10000-k => number of non zero coefficients along path | |
c exceeds nx (see above) at kth lamda value. | |
c jerr = -20000-k => max(p*(1-p)) < 1.0e-6 at kth lamda value. | |
c o(no,nc) = training data values for last (lmu_th) solution linear | |
c combination. | |
c | |
c | |
c | |
c logistic/multinomial utilitity routines: | |
c | |
c | |
c uncompress coefficient vectors for all solutions: | |
c | |
c call lsolns(ni,nx,nc,lmu,ca,ia,nin,b) | |
c | |
c input: | |
c | |
c ni,nx,nc = input to lognet | |
c lmu,ca,ia,nin = output from lognet | |
c | |
c output: | |
c | |
c b(ni,nc,lmu) = all lognet returned solutions in uncompressed format | |
c | |
c | |
c uncompress coefficient vector for particular solution: | |
c | |
c call luncomp(ni,nx,nc,ca,ia,nin,a) | |
c | |
c input: | |
c | |
c ni, nx, nc = same as above | |
c ca(nx,nc) = compressed coefficient values (for each class) | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients | |
c | |
c output: | |
c | |
c a(ni,nc) = uncompressed coefficient vectors | |
c referencing original variables | |
c | |
c | |
c evaluate linear model from compressed coefficients and | |
c uncompressed predictor vectors: | |
c | |
c call lmodval(nt,x,nc,nx,a0,ca,ia,nin,ans); | |
c | |
c input: | |
c | |
c nt = number of observations | |
c x(nt,ni) = full (uncompressed) predictor vectors | |
c nc, nx = same as above | |
c a0(nc) = intercepts | |
c ca(nx,nc) = compressed coefficient values (for each class) | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients | |
c | |
c output: | |
c | |
c ans(nc,nt) = model predictions | |
c | |
c | |
c evaluate linear model from compressed coefficients and | |
c compressed predictor matrix: | |
c | |
c call lcmodval(nc,nx,a0,ca,ia,nin,x,ix,jx,n,f); | |
c | |
c input: | |
c | |
c nc, nx = same as above | |
c a0(nc) = intercept | |
c ca(nx,nc) = compressed coefficient values for a solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for solution | |
c x, ix, jx = predictor matrix in compressed sparse row format | |
c n = number of predictor vectors (observations) | |
c | |
c output: | |
c | |
c f(nc,n) = model predictions | |
c | |
c | |
c | |
c | |
c Poisson elastic net | |
c | |
c | |
c dense predictor matrix: | |
c | |
c call fishnet (parm,no,ni,x,y,o,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, | |
c isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) | |
c | |
c x(no,ni) = predictor data matrix flat file (overwritten) | |
c | |
c sparse predictor matrix: | |
c | |
c call spfishnet (parm,no,ni,x,ix,jx,y,o,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, | |
c isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,fdev,alm,nlp,jerr) | |
c | |
c x, ix, jx = predictor data matrix in compressed sparse row format | |
c | |
c other inputs: | |
c | |
c y(no) = observation response counts | |
c o(no) = observation off-sets | |
c parm,no,ni,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,isd,intr,maxit | |
c = same as elnet above | |
c | |
c output: | |
c | |
c lmu,a0,ca,ia,nin,alm = same as elnet above | |
c dev0,fdev = same as lognet above | |
c nlp = total number of passes over predictor variables | |
c jerr = error flag | |
c jerr = 0 => no error | |
c jerr > 0 => fatal error - no output returned | |
c jerr < 7777 => memory allocation error | |
c jerr = 7777 => all used predictors have zero variance | |
c jerr = 8888 => negative response count y values | |
c jerr = 9999 => no positive observations weights | |
c jerr = 10000 => maxval(vp) <= 0.0 | |
C jerr < 0 => non fatal error - partial output: | |
c Solutions for larger lamdas (1:(k-1)) returned. | |
c jerr = -k => convergence for kth lamda value not reached | |
c after maxit (see above) iterations. | |
c jerr = -10000-k => number of non zero coefficients along path | |
c exceeds nx (see above) at kth lamda value. | |
c o(no) = training data values for last (lmu_th) solution linear | |
c combination. | |
c | |
c | |
c Poisson utility routines: | |
c | |
c | |
c same as elnet above: | |
c | |
c call solns(ni,nx,lmu,ca,ia,nin,b) | |
c call uncomp(ni,ca,ia,nin,a) | |
c call modval(a0,ca,ia,nin,n,x,f); | |
c call cmodval(a0,ca,ia,nin,x,ix,jx,n,f); | |
c | |
c compute deviance for given uncompressed data and set of uncompressed | |
c solutions | |
c | |
c call deviance(no,ni,x,y,o,w,nsol,a0,a,flog,jerr) | |
c | |
c input: | |
c | |
c no = number of observations | |
c ni = number of predictor variables | |
c x(no,ni) = predictor data matrix flat file | |
c y(no) = observation response counts | |
c o(no) = observation off-sets | |
c w(no)= observation weights | |
c nsol = number of solutions | |
c a0(nsol) = intercept for each solution | |
c a(ni,nsol) = solution coefficient vectors (uncompressed) | |
c | |
c output: | |
c | |
c flog(nsol) = respective deviance values minus null deviance | |
c jerr = error flag - see above | |
c | |
c | |
c compute deviance for given compressed data and set of uncompressed solutions | |
c | |
c call spdeviance(no,ni,x,ix,jx,y,o,w,nsol,a0,a,flog,jerr) | |
c | |
c input: | |
c | |
c no = number of observations | |
c ni = number of predictor variables | |
c x, ix, jx = predictor data matrix in compressed sparse row format | |
c y(no) = observation response counts | |
c o(no) = observation off-sets | |
c w(no)= observation weights | |
c nsol = number of solutions | |
c a0(nsol) = intercept for each solution | |
c a(ni,nsol) = solution coefficient vectors (uncompressed) | |
c | |
c output | |
c | |
c flog(nsol) = respective deviance values minus null deviance | |
c jerr = error flag - see above | |
c | |
c | |
c compute deviance for given compressed data and compressed solutions | |
c | |
c call cspdeviance(no,x,ix,jx,y,o,w,nx,lmu,a0,ca,ia,nin,flog,jerr) | |
c | |
c input: | |
c | |
c no = number of observations | |
c x, ix, jx = predictor data matrix in compressed sparse row format | |
c y(no) = observation response counts | |
c o(no) = observation off-sets | |
c w(no)= observation weights | |
c nx = input to spfishnet | |
c lmu,a0(lmu),ca(nx,lmu),ia(nx),nin(lmu) = output from spfishnet | |
c | |
c output | |
c | |
c flog(lmu) = respective deviance values minus null deviance | |
c jerr = error flag - see above | |
c | |
c | |
c | |
c Elastic net with Cox proportional hazards model | |
c | |
c | |
c dense predictor matrix: | |
c | |
c call coxnet (parm,no,ni,x,y,d,o,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr, | |
c maxit,isd,lmu,ca,ia,nin,dev0,fdev,alm,nlp,jerr) | |
c | |
c input: | |
c | |
c x(no,ni) = predictor data matrix flat file (overwritten) | |
c y(no) = observation times | |
c d(no) = died/censored indicator | |
c d(i)=0.0 => y(i) = censoring time | |
c d(i)=1.0 => y(i) = death time | |
c o(no) = observation off-sets | |
c parm,no,ni,w,jd,vp,cl,ne,nx,nlam,flmin,ulam,thr,maxit | |
c = same as fishnet above | |
c | |
c output: | |
c | |
c lmu,ca,ia,nin,dev0,fdev,alm,nlp = same as fishnet above | |
c jerr = error flag | |
c jerr = 0 => no error - output returned | |
c jerr > 0 => fatal error - no output returned | |
c jerr < 7777 => memory allocation error | |
c jerr = 7777 => all used predictors have zero variance | |
c jerr = 8888 => all observations censored (d(i)=0.0) | |
c jerr = 9999 => no positive observations weights | |
c jerr = 10000 => maxval(vp) <= 0.0 | |
c jerr = 20000, 30000 => initialization numerical error | |
C jerr < 0 => non fatal error - partial output: | |
c Solutions for larger lamdas (1:(k-1)) returned. | |
c jerr = -k => convergence for kth lamda value not reached | |
c after maxit (see above) iterations. | |
c jerr = -10000-k => number of non zero coefficients along path | |
c exceeds nx (see above) at kth lamda value. | |
c jerr = -30000-k => numerical error at kth lambda value | |
c o(no) = training data values for last (lmu_th) solution linear | |
c combination. | |
c | |
c | |
c | |
c coxnet utility routines: | |
c | |
c | |
c same as elnet above: | |
c | |
c call solns(ni,nx,lmu,ca,ia,nin,b) | |
c call uncomp(ni,ca,ia,nin,a) | |
c | |
c | |
c evaluate linear model from compressed coefficients and | |
c uncompressed predictor matrix: | |
c | |
c call cxmodval(ca,ia,nin,n,x,f); | |
c | |
c input: | |
c | |
c ca(nx) = compressed coefficient values for a solution | |
c ia(nx) = pointers to compressed coefficients | |
c nin = number of compressed coefficients for solution | |
c n = number of predictor vectors (observations) | |
c x(n,ni) = full (uncompressed) predictor matrix | |
c | |
c output: | |
c | |
c f(n) = model predictions | |
c | |
c | |
c compute log-likelihood for given data set and vectors of coefficients | |
c | |
c call loglike(no,ni,x,y,d,o,w,nvec,a,flog,jerr) | |
c | |
c input: | |
c | |
c no = number of observations | |
c ni = number of predictor variables | |
c x(no,ni) = predictor data matrix flat file | |
c y(no) = observation times | |
c d(no) = died/censored indicator | |
c d(i)=0.0 => y(i) = censoring time | |
c d(i)=1.0 => y(i) = death time | |
c o(no) = observation off-sets | |
c w(no)= observation weights | |
c nvec = number of coefficient vectors | |
c a(ni,nvec) = coefficient vectors (uncompressed) | |
c | |
c output | |
c | |
c flog(nvec) = respective log-likelihood values | |
c jerr = error flag - see coxnet above | |
c | |
c | |
c | |
c | |
c Changing internal parameter values | |
c | |
c | |
c call chg_fract_dev(fdev) | |
c fdev = minimum fractional change in deviance for stopping path | |
c default = 1.0e-5 | |
c | |
c call chg_dev_max(devmax) | |
c devmax = maximum fraction of explained deviance for stopping path | |
c default = 0.999 | |
c | |
c call chg_min_flmin(eps) | |
c eps = minimum value of flmin (see above). default= 1.0e-6 | |
c | |
c call chg_big(big) | |
c big = large floating point number. default = 9.9e35 | |
c | |
c call chg_min_lambdas(mnlam) | |
c mnlam = minimum number of path points (lambda values) allowed | |
c default = 5 | |
c | |
c call chg_min_null_prob(pmin) | |
c pmin = minimum null probability for any class. default = 1.0e-9 | |
c | |
c call chg _max_exp(exmx) | |
c exmx = maximum allowed exponent. default = 250.0 | |
c | |
c call chg_bnorm(prec,mxit) | |
c prec = convergence threshold for multi response bounds adjustment | |
c solution. default = 1.0e-10. | |
c mxit = maximum iterations for multiresponse bounds adjustment solution | |
c default = 100. | |
c | |
c | |
c Obtain current internal parameter values | |
c | |
c call get_int_parms(fdev,eps,big,mnlam,devmax,pmin,exmx) | |
c call get_bnorm(prec,mxit); | |
c | |
c | |
c | |
subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 772 | |
data sml0,eps0,big0,mnlam0,rsqmax0,pmin0,exmx0 /1.0e-5,1.0e-6,9.9 774 | |
*e35,5,0.999,1.0e-9,250.0/ | |
sml=sml0 774 | |
eps=eps0 774 | |
big=big0 774 | |
mnlam=mnlam0 774 | |
rsqmax=rsqmax0 775 | |
pmin=pmin0 775 | |
exmx=exmx0 776 | |
return 777 | |
entry chg_fract_dev(arg) 777 | |
sml0=arg 777 | |
return 778 | |
entry chg_dev_max(arg) 778 | |
rsqmax0=arg 778 | |
return 779 | |
entry chg_min_flmin(arg) 779 | |
eps0=arg 779 | |
return 780 | |
entry chg_big(arg) 780 | |
big0=arg 780 | |
return 781 | |
entry chg_min_lambdas(irg) 781 | |
mnlam0=irg 781 | |
return 782 | |
entry chg_min_null_prob(arg) 782 | |
pmin0=arg 782 | |
return 783 | |
entry chg_max_exp(arg) 783 | |
exmx0=arg 783 | |
return 784 | |
end 785 | |
subroutine elnet (ka,parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,u 788 | |
*lam,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
real x(no,ni),y(no),w(no),vp(ni),ca(nx,nlam),cl(2,ni) 789 | |
real ulam(nlam),a0(nlam),rsq(nlam),alm(nlam) 790 | |
integer jd(*),ia(nx),nin(nlam) 791 | |
real, dimension (:), allocatable :: vq; | |
if(maxval(vp) .gt. 0.0)goto 10021 794 | |
jerr=10000 794 | |
return 794 | |
10021 continue 795 | |
allocate(vq(1:ni),stat=jerr) 795 | |
if(jerr.ne.0) return 796 | |
vq=max(0.0,vp) 796 | |
vq=vq*ni/sum(vq) 797 | |
if(ka .ne. 1)goto 10041 798 | |
call elnetu (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr, 801 | |
*isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
goto 10051 802 | |
10041 continue 803 | |
call elnetn (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,i 806 | |
*sd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
10051 continue 807 | |
10031 continue 807 | |
deallocate(vq) 808 | |
return 809 | |
end 810 | |
subroutine elnetu (parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ula 813 | |
*m,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
real x(no,ni),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 814 | |
real ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 815 | |
integer jd(*),ia(nx),nin(nlam) 816 | |
real, dimension (:), allocatable :: xm,xs,g,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(g(1:ni),stat=jerr) 821 | |
allocate(xm(1:ni),stat=ierr) 821 | |
jerr=jerr+ierr 822 | |
allocate(xs(1:ni),stat=ierr) 822 | |
jerr=jerr+ierr 823 | |
allocate(ju(1:ni),stat=ierr) 823 | |
jerr=jerr+ierr 824 | |
allocate(xv(1:ni),stat=ierr) 824 | |
jerr=jerr+ierr 825 | |
allocate(vlam(1:nlam),stat=ierr) 825 | |
jerr=jerr+ierr 826 | |
if(jerr.ne.0) return 827 | |
call chkvars(no,ni,x,ju) 828 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 829 | |
if(maxval(ju) .gt. 0)goto 10071 829 | |
jerr=7777 829 | |
return 829 | |
10071 continue 830 | |
call standard(no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr) 831 | |
if(jerr.ne.0) return 832 | |
cl=cl/ys 832 | |
if(isd .le. 0)goto 10091 832 | |
10100 do 10101 j=1,ni 832 | |
cl(:,j)=cl(:,j)*xs(j) 832 | |
10101 continue 832 | |
10102 continue 832 | |
10091 continue 833 | |
if(flmin.ge.1.0) vlam=ulam/ys 834 | |
call elnet1(parm,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,vlam,thr,maxi 836 | |
*t,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 837 | |
10110 do 10111 k=1,lmu 837 | |
alm(k)=ys*alm(k) 837 | |
nk=nin(k) 838 | |
10120 do 10121 l=1,nk 838 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 838 | |
10121 continue 838 | |
10122 continue 838 | |
a0(k)=0.0 839 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 840 | |
10111 continue 841 | |
10112 continue 841 | |
deallocate(xm,xs,g,ju,xv,vlam) 842 | |
return 843 | |
end 844 | |
subroutine standard (no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr 845 | |
*) | |
real x(no,ni),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni) 845 | |
integer ju(ni) 846 | |
real, dimension (:), allocatable :: v | |
allocate(v(1:no),stat=jerr) 849 | |
if(jerr.ne.0) return 850 | |
w=w/sum(w) 850 | |
v=sqrt(w) 851 | |
if(intr .ne. 0)goto 10141 851 | |
ym=0.0 851 | |
y=v*y 852 | |
ys=sqrt(dot_product(y,y)-dot_product(v,y)**2) 852 | |
y=y/ys 853 | |
10150 do 10151 j=1,ni 853 | |
if(ju(j).eq.0)goto 10151 853 | |
xm(j)=0.0 853 | |
x(:,j)=v*x(:,j) 854 | |
xv(j)=dot_product(x(:,j),x(:,j)) 855 | |
if(isd .eq. 0)goto 10171 855 | |
xbq=dot_product(v,x(:,j))**2 855 | |
vc=xv(j)-xbq 856 | |
xs(j)=sqrt(vc) 856 | |
x(:,j)=x(:,j)/xs(j) 856 | |
xv(j)=1.0+xbq/vc 857 | |
goto 10181 858 | |
10171 continue 858 | |
xs(j)=1.0 858 | |
10181 continue 859 | |
10161 continue 859 | |
10151 continue 860 | |
10152 continue 860 | |
goto 10191 861 | |
10141 continue 862 | |
10200 do 10201 j=1,ni 862 | |
if(ju(j).eq.0)goto 10201 863 | |
xm(j)=dot_product(w,x(:,j)) 863 | |
x(:,j)=v*(x(:,j)-xm(j)) 864 | |
xv(j)=dot_product(x(:,j),x(:,j)) 864 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 865 | |
10201 continue 866 | |
10202 continue 866 | |
if(isd .ne. 0)goto 10221 866 | |
xs=1.0 866 | |
goto 10231 867 | |
10221 continue 868 | |
10240 do 10241 j=1,ni 868 | |
if(ju(j).eq.0)goto 10241 868 | |
x(:,j)=x(:,j)/xs(j) 868 | |
10241 continue 869 | |
10242 continue 869 | |
xv=1.0 870 | |
10231 continue 871 | |
10211 continue 871 | |
ym=dot_product(w,y) 871 | |
y=v*(y-ym) 871 | |
ys=sqrt(dot_product(y,y)) 871 | |
y=y/ys 872 | |
10191 continue 873 | |
10131 continue 873 | |
g=0.0 873 | |
10250 do 10251 j=1,ni 873 | |
if(ju(j).ne.0) g(j)=dot_product(y,x(:,j)) 873 | |
10251 continue 874 | |
10252 continue 874 | |
deallocate(v) 875 | |
return 876 | |
end 877 | |
subroutine elnet1 (beta,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,ulam,t 879 | |
*hr,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
real vp(ni),g(ni),x(no,ni),ulam(nlam),ao(nx,nlam),rsqo(nlam),almo( 880 | |
*nlam),xv(ni) | |
real cl(2,ni) 881 | |
integer ju(ni),ia(nx),kin(nlam) 882 | |
real, dimension (:), allocatable :: a,da | |
integer, dimension (:), allocatable :: mm | |
real, dimension (:,:), allocatable :: c | |
allocate(c(1:ni,1:nx),stat=jerr) | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 889 | |
allocate(a(1:ni),stat=ierr) 889 | |
jerr=jerr+ierr 890 | |
allocate(mm(1:ni),stat=ierr) 890 | |
jerr=jerr+ierr 891 | |
allocate(da(1:ni),stat=ierr) 891 | |
jerr=jerr+ierr 892 | |
if(jerr.ne.0) return 893 | |
bta=beta 893 | |
omb=1.0-bta 894 | |
if(flmin .ge. 1.0)goto 10271 894 | |
eqs=max(eps,flmin) 894 | |
alf=eqs**(1.0/(nlam-1)) 894 | |
10271 continue 895 | |
rsq=0.0 895 | |
a=0.0 895 | |
mm=0 895 | |
nlp=0 895 | |
nin=nlp 895 | |
iz=0 895 | |
mnl=min(mnlam,nlam) 896 | |
10280 do 10281 m=1,nlam 897 | |
if(flmin .lt. 1.0)goto 10301 897 | |
alm=ulam(m) 897 | |
goto 10291 898 | |
10301 if(m .le. 2)goto 10311 898 | |
alm=alm*alf 898 | |
goto 10291 899 | |
10311 if(m .ne. 1)goto 10321 899 | |
alm=big 899 | |
goto 10331 900 | |
10321 continue 900 | |
alm=0.0 901 | |
10340 do 10341 j=1,ni 901 | |
if(ju(j).eq.0)goto 10341 901 | |
if(vp(j).le.0.0)goto 10341 902 | |
alm=max(alm,abs(g(j))/vp(j)) 903 | |
10341 continue 904 | |
10342 continue 904 | |
alm=alf*alm/max(bta,1.0e-3) 905 | |
10331 continue 906 | |
10291 continue 906 | |
dem=alm*omb 906 | |
ab=alm*bta 906 | |
rsq0=rsq 906 | |
jz=1 907 | |
10350 continue 907 | |
10351 continue 907 | |
if(iz*jz.ne.0) go to 10360 907 | |
nlp=nlp+1 907 | |
dlx=0.0 908 | |
10370 do 10371 k=1,ni 908 | |
if(ju(k).eq.0)goto 10371 909 | |
ak=a(k) 909 | |
u=g(k)+ak*xv(k) 909 | |
v=abs(u)-vp(k)*ab 909 | |
a(k)=0.0 911 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 912 | |
*em))) | |
if(a(k).eq.ak)goto 10371 913 | |
if(mm(k) .ne. 0)goto 10391 913 | |
nin=nin+1 913 | |
if(nin.gt.nx)goto 10372 914 | |
10400 do 10401 j=1,ni 914 | |
if(ju(j).eq.0)goto 10401 915 | |
if(mm(j) .eq. 0)goto 10421 915 | |
c(j,nin)=c(k,mm(j)) 915 | |
goto 10401 915 | |
10421 continue 916 | |
if(j .ne. k)goto 10441 916 | |
c(j,nin)=xv(j) 916 | |
goto 10401 916 | |
10441 continue 917 | |
c(j,nin)=dot_product(x(:,j),x(:,k)) 918 | |
10401 continue 919 | |
10402 continue 919 | |
mm(k)=nin 919 | |
ia(nin)=k 920 | |
10391 continue 921 | |
del=a(k)-ak 921 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 922 | |
dlx=max(xv(k)*del**2,dlx) 923 | |
10450 do 10451 j=1,ni 923 | |
if(ju(j).ne.0) g(j)=g(j)-c(j,mm(k))*del 923 | |
10451 continue 924 | |
10452 continue 924 | |
10371 continue 925 | |
10372 continue 925 | |
if(dlx.lt.thr)goto 10352 925 | |
if(nin.gt.nx)goto 10352 926 | |
if(nlp .le. maxit)goto 10471 926 | |
jerr=-m 926 | |
return 926 | |
10471 continue 927 | |
10360 continue 927 | |
iz=1 927 | |
da(1:nin)=a(ia(1:nin)) 928 | |
10480 continue 928 | |
10481 continue 928 | |
nlp=nlp+1 928 | |
dlx=0.0 929 | |
10490 do 10491 l=1,nin 929 | |
k=ia(l) 929 | |
ak=a(k) 929 | |
u=g(k)+ak*xv(k) 929 | |
v=abs(u)-vp(k)*ab 930 | |
a(k)=0.0 932 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 933 | |
*em))) | |
if(a(k).eq.ak)goto 10491 934 | |
del=a(k)-ak 934 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 935 | |
dlx=max(xv(k)*del**2,dlx) 936 | |
10500 do 10501 j=1,nin 936 | |
g(ia(j))=g(ia(j))-c(ia(j),mm(k))*del 936 | |
10501 continue 937 | |
10502 continue 937 | |
10491 continue 938 | |
10492 continue 938 | |
if(dlx.lt.thr)goto 10482 938 | |
if(nlp .le. maxit)goto 10521 938 | |
jerr=-m 938 | |
return 938 | |
10521 continue 939 | |
goto 10481 940 | |
10482 continue 940 | |
da(1:nin)=a(ia(1:nin))-da(1:nin) 941 | |
10530 do 10531 j=1,ni 941 | |
if(mm(j).ne.0)goto 10531 942 | |
if(ju(j).ne.0) g(j)=g(j)-dot_product(da(1:nin),c(j,1:nin)) 943 | |
10531 continue 944 | |
10532 continue 944 | |
jz=0 945 | |
goto 10351 946 | |
10352 continue 946 | |
if(nin .le. nx)goto 10551 946 | |
jerr=-10000-m 946 | |
goto 10282 946 | |
10551 continue 947 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 947 | |
kin(m)=nin 948 | |
rsqo(m)=rsq 948 | |
almo(m)=alm 948 | |
lmu=m 949 | |
if(m.lt.mnl)goto 10281 949 | |
if(flmin.ge.1.0)goto 10281 950 | |
me=0 950 | |
10560 do 10561 j=1,nin 950 | |
if(ao(j,m).ne.0.0) me=me+1 950 | |
10561 continue 950 | |
10562 continue 950 | |
if(me.gt.ne)goto 10282 951 | |
if(rsq-rsq0.lt.sml*rsq)goto 10282 951 | |
if(rsq.gt.rsqmax)goto 10282 952 | |
10281 continue 953 | |
10282 continue 953 | |
deallocate(a,mm,c,da) 954 | |
return 955 | |
end 956 | |
subroutine elnetn (parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam 958 | |
*,thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
real vp(ni),x(no,ni),y(no),w(no),ulam(nlam),cl(2,ni) 959 | |
real ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 960 | |
integer jd(*),ia(nx),nin(nlam) 961 | |
real, dimension (:), allocatable :: xm,xs,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(xm(1:ni),stat=jerr) 966 | |
allocate(xs(1:ni),stat=ierr) 966 | |
jerr=jerr+ierr 967 | |
allocate(ju(1:ni),stat=ierr) 967 | |
jerr=jerr+ierr 968 | |
allocate(xv(1:ni),stat=ierr) 968 | |
jerr=jerr+ierr 969 | |
allocate(vlam(1:nlam),stat=ierr) 969 | |
jerr=jerr+ierr 970 | |
if(jerr.ne.0) return 971 | |
call chkvars(no,ni,x,ju) 972 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 973 | |
if(maxval(ju) .gt. 0)goto 10581 973 | |
jerr=7777 973 | |
return 973 | |
10581 continue 974 | |
call standard1(no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr) 975 | |
if(jerr.ne.0) return 976 | |
cl=cl/ys 976 | |
if(isd .le. 0)goto 10601 976 | |
10610 do 10611 j=1,ni 976 | |
cl(:,j)=cl(:,j)*xs(j) 976 | |
10611 continue 976 | |
10612 continue 976 | |
10601 continue 977 | |
if(flmin.ge.1.0) vlam=ulam/ys 978 | |
call elnet2(parm,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,vlam,thr,maxi 980 | |
*t,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 981 | |
10620 do 10621 k=1,lmu 981 | |
alm(k)=ys*alm(k) 981 | |
nk=nin(k) 982 | |
10630 do 10631 l=1,nk 982 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 982 | |
10631 continue 982 | |
10632 continue 982 | |
a0(k)=0.0 983 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 984 | |
10621 continue 985 | |
10622 continue 985 | |
deallocate(xm,xs,ju,xv,vlam) 986 | |
return 987 | |
end 988 | |
subroutine standard1 (no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr) 989 | |
real x(no,ni),y(no),w(no),xm(ni),xs(ni),xv(ni) 989 | |
integer ju(ni) 990 | |
real, dimension (:), allocatable :: v | |
allocate(v(1:no),stat=jerr) 993 | |
if(jerr.ne.0) return 994 | |
w=w/sum(w) 994 | |
v=sqrt(w) 995 | |
if(intr .ne. 0)goto 10651 995 | |
ym=0.0 995 | |
y=v*y 996 | |
ys=sqrt(dot_product(y,y)-dot_product(v,y)**2) 996 | |
y=y/ys 997 | |
10660 do 10661 j=1,ni 997 | |
if(ju(j).eq.0)goto 10661 997 | |
xm(j)=0.0 997 | |
x(:,j)=v*x(:,j) 998 | |
xv(j)=dot_product(x(:,j),x(:,j)) 999 | |
if(isd .eq. 0)goto 10681 999 | |
xbq=dot_product(v,x(:,j))**2 999 | |
vc=xv(j)-xbq 1000 | |
xs(j)=sqrt(vc) 1000 | |
x(:,j)=x(:,j)/xs(j) 1000 | |
xv(j)=1.0+xbq/vc 1001 | |
goto 10691 1002 | |
10681 continue 1002 | |
xs(j)=1.0 1002 | |
10691 continue 1003 | |
10671 continue 1003 | |
10661 continue 1004 | |
10662 continue 1004 | |
go to 10700 1005 | |
10651 continue 1006 | |
10710 do 10711 j=1,ni 1006 | |
if(ju(j).eq.0)goto 10711 1007 | |
xm(j)=dot_product(w,x(:,j)) 1007 | |
x(:,j)=v*(x(:,j)-xm(j)) 1008 | |
xv(j)=dot_product(x(:,j),x(:,j)) 1008 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 1009 | |
10711 continue 1010 | |
10712 continue 1010 | |
if(isd .ne. 0)goto 10731 1010 | |
xs=1.0 1010 | |
goto 10741 1011 | |
10731 continue 1011 | |
10750 do 10751 j=1,ni 1011 | |
if(ju(j).eq.0)goto 10751 1011 | |
x(:,j)=x(:,j)/xs(j) 1011 | |
10751 continue 1012 | |
10752 continue 1012 | |
xv=1.0 1013 | |
10741 continue 1014 | |
10721 continue 1014 | |
ym=dot_product(w,y) 1014 | |
y=v*(y-ym) 1014 | |
ys=sqrt(dot_product(y,y)) 1014 | |
y=y/ys 1015 | |
10700 continue 1015 | |
deallocate(v) 1016 | |
return 1017 | |
end 1018 | |
subroutine elnet2(beta,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,ulam,th 1020 | |
*r,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
real vp(ni),y(no),x(no,ni),ulam(nlam),ao(nx,nlam),rsqo(nlam),almo( 1021 | |
*nlam),xv(ni) | |
real cl(2,ni) 1022 | |
integer ju(ni),ia(nx),kin(nlam) 1023 | |
real, dimension (:), allocatable :: a,g | |
integer, dimension (:), allocatable :: mm,ix | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 1028 | |
allocate(a(1:ni),stat=jerr) 1029 | |
allocate(mm(1:ni),stat=ierr) 1029 | |
jerr=jerr+ierr 1030 | |
allocate(g(1:ni),stat=ierr) 1030 | |
jerr=jerr+ierr 1031 | |
allocate(ix(1:ni),stat=ierr) 1031 | |
jerr=jerr+ierr 1032 | |
if(jerr.ne.0) return 1033 | |
bta=beta 1033 | |
omb=1.0-bta 1033 | |
ix=0 1034 | |
if(flmin .ge. 1.0)goto 10771 1034 | |
eqs=max(eps,flmin) 1034 | |
alf=eqs**(1.0/(nlam-1)) 1034 | |
10771 continue 1035 | |
rsq=0.0 1035 | |
a=0.0 1035 | |
mm=0 1035 | |
nlp=0 1035 | |
nin=nlp 1035 | |
iz=0 1035 | |
mnl=min(mnlam,nlam) 1035 | |
alm=0.0 1036 | |
10780 do 10781 j=1,ni 1036 | |
if(ju(j).eq.0)goto 10781 1036 | |
g(j)=abs(dot_product(y,x(:,j))) 1036 | |
10781 continue 1037 | |
10782 continue 1037 | |
10790 do 10791 m=1,nlam 1037 | |
alm0=alm 1038 | |
if(flmin .lt. 1.0)goto 10811 1038 | |
alm=ulam(m) 1038 | |
goto 10801 1039 | |
10811 if(m .le. 2)goto 10821 1039 | |
alm=alm*alf 1039 | |
goto 10801 1040 | |
10821 if(m .ne. 1)goto 10831 1040 | |
alm=big 1040 | |
goto 10841 1041 | |
10831 continue 1041 | |
alm0=0.0 1042 | |
10850 do 10851 j=1,ni 1042 | |
if(ju(j).eq.0)goto 10851 1042 | |
if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 1042 | |
10851 continue 1043 | |
10852 continue 1043 | |
alm0=alm0/max(bta,1.0e-3) 1043 | |
alm=alf*alm0 1044 | |
10841 continue 1045 | |
10801 continue 1045 | |
dem=alm*omb 1045 | |
ab=alm*bta 1045 | |
rsq0=rsq 1045 | |
jz=1 1046 | |
tlam=bta*(2.0*alm-alm0) 1047 | |
10860 do 10861 k=1,ni 1047 | |
if(ix(k).eq.1)goto 10861 1047 | |
if(ju(k).eq.0)goto 10861 1048 | |
if(g(k).gt.tlam*vp(k)) ix(k)=1 1049 | |
10861 continue 1050 | |
10862 continue 1050 | |
10870 continue 1050 | |
10871 continue 1050 | |
if(iz*jz.ne.0) go to 10360 1051 | |
10880 continue 1051 | |
nlp=nlp+1 1051 | |
dlx=0.0 1052 | |
10890 do 10891 k=1,ni 1052 | |
if(ix(k).eq.0)goto 10891 1052 | |
gk=dot_product(y,x(:,k)) 1053 | |
ak=a(k) 1053 | |
u=gk+ak*xv(k) 1053 | |
v=abs(u)-vp(k)*ab 1053 | |
a(k)=0.0 1055 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1056 | |
*em))) | |
if(a(k).eq.ak)goto 10891 1057 | |
if(mm(k) .ne. 0)goto 10911 1057 | |
nin=nin+1 1057 | |
if(nin.gt.nx)goto 10892 1058 | |
mm(k)=nin 1058 | |
ia(nin)=k 1059 | |
10911 continue 1060 | |
del=a(k)-ak 1060 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1061 | |
y=y-del*x(:,k) 1061 | |
dlx=max(xv(k)*del**2,dlx) 1062 | |
10891 continue 1063 | |
10892 continue 1063 | |
if(nin.gt.nx)goto 10872 1064 | |
if(dlx .ge. thr)goto 10931 1064 | |
ixx=0 1065 | |
10940 do 10941 k=1,ni 1065 | |
if(ix(k).eq.1)goto 10941 1065 | |
if(ju(k).eq.0)goto 10941 1066 | |
g(k)=abs(dot_product(y,x(:,k))) 1067 | |
if(g(k) .le. ab*vp(k))goto 10961 1067 | |
ix(k)=1 1067 | |
ixx=1 1067 | |
10961 continue 1068 | |
10941 continue 1069 | |
10942 continue 1069 | |
if(ixx.eq.1) go to 10880 1070 | |
goto 10872 1071 | |
10931 continue 1072 | |
if(nlp .le. maxit)goto 10981 1072 | |
jerr=-m 1072 | |
return 1072 | |
10981 continue 1073 | |
10360 continue 1073 | |
iz=1 1074 | |
10990 continue 1074 | |
10991 continue 1074 | |
nlp=nlp+1 1074 | |
dlx=0.0 1075 | |
11000 do 11001 l=1,nin 1075 | |
k=ia(l) 1075 | |
gk=dot_product(y,x(:,k)) 1076 | |
ak=a(k) 1076 | |
u=gk+ak*xv(k) 1076 | |
v=abs(u)-vp(k)*ab 1076 | |
a(k)=0.0 1078 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1079 | |
*em))) | |
if(a(k).eq.ak)goto 11001 1080 | |
del=a(k)-ak 1080 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1081 | |
y=y-del*x(:,k) 1081 | |
dlx=max(xv(k)*del**2,dlx) 1082 | |
11001 continue 1083 | |
11002 continue 1083 | |
if(dlx.lt.thr)goto 10992 1083 | |
if(nlp .le. maxit)goto 11021 1083 | |
jerr=-m 1083 | |
return 1083 | |
11021 continue 1084 | |
goto 10991 1085 | |
10992 continue 1085 | |
jz=0 1086 | |
goto 10871 1087 | |
10872 continue 1087 | |
if(nin .le. nx)goto 11041 1087 | |
jerr=-10000-m 1087 | |
goto 10792 1087 | |
11041 continue 1088 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 1088 | |
kin(m)=nin 1089 | |
rsqo(m)=rsq 1089 | |
almo(m)=alm 1089 | |
lmu=m 1090 | |
if(m.lt.mnl)goto 10791 1090 | |
if(flmin.ge.1.0)goto 10791 1091 | |
me=0 1091 | |
11050 do 11051 j=1,nin 1091 | |
if(ao(j,m).ne.0.0) me=me+1 1091 | |
11051 continue 1091 | |
11052 continue 1091 | |
if(me.gt.ne)goto 10792 1092 | |
if(rsq-rsq0.lt.sml*rsq)goto 10792 1092 | |
if(rsq.gt.rsqmax)goto 10792 1093 | |
10791 continue 1094 | |
10792 continue 1094 | |
deallocate(a,mm,g,ix) 1095 | |
return 1096 | |
end 1097 | |
subroutine chkvars(no,ni,x,ju) 1098 | |
real x(no,ni) 1098 | |
integer ju(ni) 1099 | |
11060 do 11061 j=1,ni 1099 | |
ju(j)=0 1099 | |
t=x(1,j) 1100 | |
11070 do 11071 i=2,no 1100 | |
if(x(i,j).eq.t)goto 11071 1100 | |
ju(j)=1 1100 | |
goto 11072 1100 | |
11071 continue 1101 | |
11072 continue 1101 | |
11061 continue 1102 | |
11062 continue 1102 | |
return 1103 | |
end 1104 | |
subroutine uncomp(ni,ca,ia,nin,a) 1105 | |
real ca(*),a(ni) 1105 | |
integer ia(*) 1106 | |
a=0.0 1106 | |
if(nin.gt.0) a(ia(1:nin))=ca(1:nin) 1107 | |
return 1108 | |
end 1109 | |
subroutine modval(a0,ca,ia,nin,n,x,f) 1110 | |
real ca(nin),x(n,*),f(n) 1110 | |
integer ia(nin) 1111 | |
f=a0 1111 | |
if(nin.le.0) return 1112 | |
11080 do 11081 i=1,n 1112 | |
f(i)=f(i)+dot_product(ca(1:nin),x(i,ia(1:nin))) 1112 | |
11081 continue 1113 | |
11082 continue 1113 | |
return 1114 | |
end 1115 | |
subroutine spelnet (ka,parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam 1118 | |
*,flmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr | |
*) | |
real x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 1119 | |
real ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 1120 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 1121 | |
real, dimension (:), allocatable :: vq; | |
if(maxval(vp) .gt. 0.0)goto 11101 1124 | |
jerr=10000 1124 | |
return 1124 | |
11101 continue 1125 | |
allocate(vq(1:ni),stat=jerr) 1125 | |
if(jerr.ne.0) return 1126 | |
vq=max(0.0,vp) 1126 | |
vq=vq*ni/sum(vq) 1127 | |
if(ka .ne. 1)goto 11121 1128 | |
call spelnetu (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,u 1131 | |
*lam,thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
goto 11131 1132 | |
11121 continue 1133 | |
call spelnetn (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,ul 1136 | |
*am,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
11131 continue 1137 | |
11111 continue 1137 | |
deallocate(vq) 1138 | |
return 1139 | |
end 1140 | |
subroutine spelnetu (parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,f 1143 | |
*lmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
real x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 1144 | |
real ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 1145 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 1146 | |
real, dimension (:), allocatable :: xm,xs,g,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(g(1:ni),stat=jerr) 1151 | |
allocate(xm(1:ni),stat=ierr) 1151 | |
jerr=jerr+ierr 1152 | |
allocate(xs(1:ni),stat=ierr) 1152 | |
jerr=jerr+ierr 1153 | |
allocate(ju(1:ni),stat=ierr) 1153 | |
jerr=jerr+ierr 1154 | |
allocate(xv(1:ni),stat=ierr) 1154 | |
jerr=jerr+ierr 1155 | |
allocate(vlam(1:nlam),stat=ierr) 1155 | |
jerr=jerr+ierr 1156 | |
if(jerr.ne.0) return 1157 | |
call spchkvars(no,ni,x,ix,ju) 1158 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 1159 | |
if(maxval(ju) .gt. 0)goto 11151 1159 | |
jerr=7777 1159 | |
return 1159 | |
11151 continue 1160 | |
call spstandard(no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys,xv,jer 1161 | |
*r) | |
if(jerr.ne.0) return 1162 | |
cl=cl/ys 1162 | |
if(isd .le. 0)goto 11171 1162 | |
11180 do 11181 j=1,ni 1162 | |
cl(:,j)=cl(:,j)*xs(j) 1162 | |
11181 continue 1162 | |
11182 continue 1162 | |
11171 continue 1163 | |
if(flmin.ge.1.0) vlam=ulam/ys 1164 | |
call spelnet1(parm,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vla 1166 | |
*m,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 1167 | |
11190 do 11191 k=1,lmu 1167 | |
alm(k)=ys*alm(k) 1167 | |
nk=nin(k) 1168 | |
11200 do 11201 l=1,nk 1168 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 1168 | |
11201 continue 1168 | |
11202 continue 1168 | |
a0(k)=0.0 1169 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 1170 | |
11191 continue 1171 | |
11192 continue 1171 | |
deallocate(xm,xs,g,ju,xv,vlam) 1172 | |
return 1173 | |
end 1174 | |
subroutine spstandard (no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys 1175 | |
*,xv,jerr) | |
real x(*),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni) 1175 | |
integer ix(*),jx(*),ju(ni) 1176 | |
w=w/sum(w) 1177 | |
if(intr .ne. 0)goto 11221 1177 | |
ym=0.0 1178 | |
ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2) 1178 | |
y=y/ys 1179 | |
11230 do 11231 j=1,ni 1179 | |
if(ju(j).eq.0)goto 11231 1179 | |
xm(j)=0.0 1179 | |
jb=ix(j) 1179 | |
je=ix(j+1)-1 1180 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) 1181 | |
if(isd .eq. 0)goto 11251 1181 | |
xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 1181 | |
vc=xv(j)-xbq 1182 | |
xs(j)=sqrt(vc) 1182 | |
xv(j)=1.0+xbq/vc 1183 | |
goto 11261 1184 | |
11251 continue 1184 | |
xs(j)=1.0 1184 | |
11261 continue 1185 | |
11241 continue 1185 | |
11231 continue 1186 | |
11232 continue 1186 | |
goto 11271 1187 | |
11221 continue 1188 | |
11280 do 11281 j=1,ni 1188 | |
if(ju(j).eq.0)goto 11281 1189 | |
jb=ix(j) 1189 | |
je=ix(j+1)-1 1189 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 1190 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 1191 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 1192 | |
11281 continue 1193 | |
11282 continue 1193 | |
if(isd .ne. 0)goto 11301 1193 | |
xs=1.0 1193 | |
goto 11311 1193 | |
11301 continue 1193 | |
xv=1.0 1193 | |
11311 continue 1194 | |
11291 continue 1194 | |
ym=dot_product(w,y) 1194 | |
y=y-ym 1194 | |
ys=sqrt(dot_product(w,y**2)) 1194 | |
y=y/ys 1195 | |
11271 continue 1196 | |
11211 continue 1196 | |
g=0.0 1197 | |
11320 do 11321 j=1,ni 1197 | |
if(ju(j).eq.0)goto 11321 1197 | |
jb=ix(j) 1197 | |
je=ix(j+1)-1 1198 | |
g(j)=dot_product(w(jx(jb:je))*y(jx(jb:je)),x(jb:je))/xs(j) 1199 | |
11321 continue 1200 | |
11322 continue 1200 | |
return 1201 | |
end 1202 | |
subroutine spelnet1(beta,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flm 1204 | |
*in,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
real g(ni),vp(ni),x(*),ulam(nlam),w(no) 1205 | |
real ao(nx,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni),xv(ni),cl(2,n 1206 | |
*i) | |
integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) 1207 | |
real, dimension (:), allocatable :: a,da | |
integer, dimension (:), allocatable :: mm | |
real, dimension (:,:), allocatable :: c | |
allocate(c(1:ni,1:nx),stat=jerr) | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 1214 | |
allocate(a(1:ni),stat=ierr) 1214 | |
jerr=jerr+ierr 1215 | |
allocate(mm(1:ni),stat=ierr) 1215 | |
jerr=jerr+ierr 1216 | |
allocate(da(1:ni),stat=ierr) 1216 | |
jerr=jerr+ierr 1217 | |
if(jerr.ne.0) return 1218 | |
bta=beta 1218 | |
omb=1.0-bta 1219 | |
if(flmin .ge. 1.0)goto 11341 1219 | |
eqs=max(eps,flmin) 1219 | |
alf=eqs**(1.0/(nlam-1)) 1219 | |
11341 continue 1220 | |
rsq=0.0 1220 | |
a=0.0 1220 | |
mm=0 1220 | |
nlp=0 1220 | |
nin=nlp 1220 | |
iz=0 1220 | |
mnl=min(mnlam,nlam) 1221 | |
11350 do 11351 m=1,nlam 1222 | |
if(flmin .lt. 1.0)goto 11371 1222 | |
alm=ulam(m) 1222 | |
goto 11361 1223 | |
11371 if(m .le. 2)goto 11381 1223 | |
alm=alm*alf 1223 | |
goto 11361 1224 | |
11381 if(m .ne. 1)goto 11391 1224 | |
alm=big 1224 | |
goto 11401 1225 | |
11391 continue 1225 | |
alm=0.0 1226 | |
11410 do 11411 j=1,ni 1226 | |
if(ju(j).eq.0)goto 11411 1226 | |
if(vp(j).le.0.0)goto 11411 1227 | |
alm=max(alm,abs(g(j))/vp(j)) 1228 | |
11411 continue 1229 | |
11412 continue 1229 | |
alm=alf*alm/max(bta,1.0e-3) 1230 | |
11401 continue 1231 | |
11361 continue 1231 | |
dem=alm*omb 1231 | |
ab=alm*bta 1231 | |
rsq0=rsq 1231 | |
jz=1 1232 | |
11420 continue 1232 | |
11421 continue 1232 | |
if(iz*jz.ne.0) go to 10360 1232 | |
nlp=nlp+1 1232 | |
dlx=0.0 1233 | |
11430 do 11431 k=1,ni 1233 | |
if(ju(k).eq.0)goto 11431 1234 | |
ak=a(k) 1234 | |
u=g(k)+ak*xv(k) 1234 | |
v=abs(u)-vp(k)*ab 1234 | |
a(k)=0.0 1236 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1237 | |
*em))) | |
if(a(k).eq.ak)goto 11431 1238 | |
if(mm(k) .ne. 0)goto 11451 1238 | |
nin=nin+1 1238 | |
if(nin.gt.nx)goto 11432 1239 | |
11460 do 11461 j=1,ni 1239 | |
if(ju(j).eq.0)goto 11461 1240 | |
if(mm(j) .eq. 0)goto 11481 1240 | |
c(j,nin)=c(k,mm(j)) 1240 | |
goto 11461 1240 | |
11481 continue 1241 | |
if(j .ne. k)goto 11501 1241 | |
c(j,nin)=xv(j) 1241 | |
goto 11461 1241 | |
11501 continue 1242 | |
c(j,nin)= (row_prod(j,k,ix,jx,x,w)-xm(j)*xm(k))/(xs(j)*xs(k)) 1244 | |
11461 continue 1245 | |
11462 continue 1245 | |
mm(k)=nin 1245 | |
ia(nin)=k 1246 | |
11451 continue 1247 | |
del=a(k)-ak 1247 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 1248 | |
dlx=max(xv(k)*del**2,dlx) 1249 | |
11510 do 11511 j=1,ni 1249 | |
if(ju(j).ne.0) g(j)=g(j)-c(j,mm(k))*del 1249 | |
11511 continue 1250 | |
11512 continue 1250 | |
11431 continue 1251 | |
11432 continue 1251 | |
if(dlx.lt.thr)goto 11422 1251 | |
if(nin.gt.nx)goto 11422 1252 | |
if(nlp .le. maxit)goto 11531 1252 | |
jerr=-m 1252 | |
return 1252 | |
11531 continue 1253 | |
10360 continue 1253 | |
iz=1 1253 | |
da(1:nin)=a(ia(1:nin)) 1254 | |
11540 continue 1254 | |
11541 continue 1254 | |
nlp=nlp+1 1254 | |
dlx=0.0 1255 | |
11550 do 11551 l=1,nin 1255 | |
k=ia(l) 1256 | |
ak=a(k) 1256 | |
u=g(k)+ak*xv(k) 1256 | |
v=abs(u)-vp(k)*ab 1256 | |
a(k)=0.0 1258 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1259 | |
*em))) | |
if(a(k).eq.ak)goto 11551 1260 | |
del=a(k)-ak 1260 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 1261 | |
dlx=max(xv(k)*del**2,dlx) 1262 | |
11560 do 11561 j=1,nin 1262 | |
g(ia(j))=g(ia(j))-c(ia(j),mm(k))*del 1262 | |
11561 continue 1263 | |
11562 continue 1263 | |
11551 continue 1264 | |
11552 continue 1264 | |
if(dlx.lt.thr)goto 11542 1264 | |
if(nlp .le. maxit)goto 11581 1264 | |
jerr=-m 1264 | |
return 1264 | |
11581 continue 1265 | |
goto 11541 1266 | |
11542 continue 1266 | |
da(1:nin)=a(ia(1:nin))-da(1:nin) 1267 | |
11590 do 11591 j=1,ni 1267 | |
if(mm(j).ne.0)goto 11591 1268 | |
if(ju(j).ne.0) g(j)=g(j)-dot_product(da(1:nin),c(j,1:nin)) 1269 | |
11591 continue 1270 | |
11592 continue 1270 | |
jz=0 1271 | |
goto 11421 1272 | |
11422 continue 1272 | |
if(nin .le. nx)goto 11611 1272 | |
jerr=-10000-m 1272 | |
goto 11352 1272 | |
11611 continue 1273 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 1273 | |
kin(m)=nin 1274 | |
rsqo(m)=rsq 1274 | |
almo(m)=alm 1274 | |
lmu=m 1275 | |
if(m.lt.mnl)goto 11351 1275 | |
if(flmin.ge.1.0)goto 11351 1276 | |
me=0 1276 | |
11620 do 11621 j=1,nin 1276 | |
if(ao(j,m).ne.0.0) me=me+1 1276 | |
11621 continue 1276 | |
11622 continue 1276 | |
if(me.gt.ne)goto 11352 1277 | |
if(rsq-rsq0.lt.sml*rsq)goto 11352 1277 | |
if(rsq.gt.rsqmax)goto 11352 1278 | |
11351 continue 1279 | |
11352 continue 1279 | |
deallocate(a,mm,c,da) 1280 | |
return 1281 | |
end 1282 | |
subroutine spelnetn(parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flm 1284 | |
*in,ulam, thr,isd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
real x(*),vp(ni),y(no),w(no),ulam(nlam),cl(2,ni) 1285 | |
real ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 1286 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 1287 | |
real, dimension (:), allocatable :: xm,xs,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(xm(1:ni),stat=jerr) 1292 | |
allocate(xs(1:ni),stat=ierr) 1292 | |
jerr=jerr+ierr 1293 | |
allocate(ju(1:ni),stat=ierr) 1293 | |
jerr=jerr+ierr 1294 | |
allocate(xv(1:ni),stat=ierr) 1294 | |
jerr=jerr+ierr 1295 | |
allocate(vlam(1:nlam),stat=ierr) 1295 | |
jerr=jerr+ierr 1296 | |
if(jerr.ne.0) return 1297 | |
call spchkvars(no,ni,x,ix,ju) 1298 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 1299 | |
if(maxval(ju) .gt. 0)goto 11641 1299 | |
jerr=7777 1299 | |
return 1299 | |
11641 continue 1300 | |
call spstandard1(no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys,xv,jerr 1301 | |
*) | |
if(jerr.ne.0) return 1302 | |
cl=cl/ys 1302 | |
if(isd .le. 0)goto 11661 1302 | |
11670 do 11671 j=1,ni 1302 | |
cl(:,j)=cl(:,j)*xs(j) 1302 | |
11671 continue 1302 | |
11672 continue 1302 | |
11661 continue 1303 | |
if(flmin.ge.1.0) vlam=ulam/ys 1304 | |
call spelnet2(parm,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vla 1306 | |
*m,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 1307 | |
11680 do 11681 k=1,lmu 1307 | |
alm(k)=ys*alm(k) 1307 | |
nk=nin(k) 1308 | |
11690 do 11691 l=1,nk 1308 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 1308 | |
11691 continue 1308 | |
11692 continue 1308 | |
a0(k)=0.0 1309 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 1310 | |
11681 continue 1311 | |
11682 continue 1311 | |
deallocate(xm,xs,ju,xv,vlam) 1312 | |
return 1313 | |
end 1314 | |
subroutine spstandard1 (no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys, 1315 | |
*xv,jerr) | |
real x(*),y(no),w(no),xm(ni),xs(ni),xv(ni) 1315 | |
integer ix(*),jx(*),ju(ni) 1316 | |
w=w/sum(w) 1317 | |
if(intr .ne. 0)goto 11711 1317 | |
ym=0.0 1318 | |
ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2) 1318 | |
y=y/ys 1319 | |
11720 do 11721 j=1,ni 1319 | |
if(ju(j).eq.0)goto 11721 1319 | |
xm(j)=0.0 1319 | |
jb=ix(j) 1319 | |
je=ix(j+1)-1 1320 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) 1321 | |
if(isd .eq. 0)goto 11741 1321 | |
xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 1321 | |
vc=xv(j)-xbq 1322 | |
xs(j)=sqrt(vc) 1322 | |
xv(j)=1.0+xbq/vc 1323 | |
goto 11751 1324 | |
11741 continue 1324 | |
xs(j)=1.0 1324 | |
11751 continue 1325 | |
11731 continue 1325 | |
11721 continue 1326 | |
11722 continue 1326 | |
return 1327 | |
11711 continue 1328 | |
11760 do 11761 j=1,ni 1328 | |
if(ju(j).eq.0)goto 11761 1329 | |
jb=ix(j) 1329 | |
je=ix(j+1)-1 1329 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 1330 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 1331 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 1332 | |
11761 continue 1333 | |
11762 continue 1333 | |
if(isd .ne. 0)goto 11781 1333 | |
xs=1.0 1333 | |
goto 11791 1333 | |
11781 continue 1333 | |
xv=1.0 1333 | |
11791 continue 1334 | |
11771 continue 1334 | |
ym=dot_product(w,y) 1334 | |
y=y-ym 1334 | |
ys=sqrt(dot_product(w,y**2)) 1334 | |
y=y/ys 1335 | |
return 1336 | |
end 1337 | |
subroutine spelnet2(beta,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flm 1339 | |
*in,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
real y(no),w(no),x(*),vp(ni),ulam(nlam),cl(2,ni) 1340 | |
real ao(nx,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni),xv(ni) 1341 | |
integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) 1342 | |
real, dimension (:), allocatable :: a,g | |
integer, dimension (:), allocatable :: mm,iy | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 1347 | |
allocate(a(1:ni),stat=jerr) 1348 | |
allocate(mm(1:ni),stat=ierr) 1348 | |
jerr=jerr+ierr 1349 | |
allocate(g(1:ni),stat=ierr) 1349 | |
jerr=jerr+ierr 1350 | |
allocate(iy(1:ni),stat=ierr) 1350 | |
jerr=jerr+ierr 1351 | |
if(jerr.ne.0) return 1352 | |
bta=beta 1352 | |
omb=1.0-bta 1352 | |
alm=0.0 1352 | |
iy=0 1353 | |
if(flmin .ge. 1.0)goto 11811 1353 | |
eqs=max(eps,flmin) 1353 | |
alf=eqs**(1.0/(nlam-1)) 1353 | |
11811 continue 1354 | |
rsq=0.0 1354 | |
a=0.0 1354 | |
mm=0 1354 | |
o=0.0 1354 | |
nlp=0 1354 | |
nin=nlp 1354 | |
iz=0 1354 | |
mnl=min(mnlam,nlam) 1355 | |
11820 do 11821 j=1,ni 1355 | |
if(ju(j).eq.0)goto 11821 1356 | |
jb=ix(j) 1356 | |
je=ix(j+1)-1 1357 | |
g(j)=abs(dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(j)) 1358 | |
11821 continue 1359 | |
11822 continue 1359 | |
11830 do 11831 m=1,nlam 1359 | |
alm0=alm 1360 | |
if(flmin .lt. 1.0)goto 11851 1360 | |
alm=ulam(m) 1360 | |
goto 11841 1361 | |
11851 if(m .le. 2)goto 11861 1361 | |
alm=alm*alf 1361 | |
goto 11841 1362 | |
11861 if(m .ne. 1)goto 11871 1362 | |
alm=big 1362 | |
goto 11881 1363 | |
11871 continue 1363 | |
alm0=0.0 1364 | |
11890 do 11891 j=1,ni 1364 | |
if(ju(j).eq.0)goto 11891 1364 | |
if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 1364 | |
11891 continue 1365 | |
11892 continue 1365 | |
alm0=alm0/max(bta,1.0e-3) 1365 | |
alm=alf*alm0 1366 | |
11881 continue 1367 | |
11841 continue 1367 | |
dem=alm*omb 1367 | |
ab=alm*bta 1367 | |
rsq0=rsq 1367 | |
jz=1 1368 | |
tlam=bta*(2.0*alm-alm0) 1369 | |
11900 do 11901 k=1,ni 1369 | |
if(iy(k).eq.1)goto 11901 1369 | |
if(ju(k).eq.0)goto 11901 1370 | |
if(g(k).gt.tlam*vp(k)) iy(k)=1 1371 | |
11901 continue 1372 | |
11902 continue 1372 | |
11910 continue 1372 | |
11911 continue 1372 | |
if(iz*jz.ne.0) go to 10360 1373 | |
10880 continue 1373 | |
nlp=nlp+1 1373 | |
dlx=0.0 1374 | |
11920 do 11921 k=1,ni 1374 | |
if(iy(k).eq.0)goto 11921 1374 | |
jb=ix(k) 1374 | |
je=ix(k+1)-1 1375 | |
gk=dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(k) 1376 | |
ak=a(k) 1376 | |
u=gk+ak*xv(k) 1376 | |
v=abs(u)-vp(k)*ab 1376 | |
a(k)=0.0 1378 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1379 | |
*em))) | |
if(a(k).eq.ak)goto 11921 1380 | |
if(mm(k) .ne. 0)goto 11941 1380 | |
nin=nin+1 1380 | |
if(nin.gt.nx)goto 11922 1381 | |
mm(k)=nin 1381 | |
ia(nin)=k 1382 | |
11941 continue 1383 | |
del=a(k)-ak 1383 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1384 | |
y(jx(jb:je))=y(jx(jb:je))-del*x(jb:je)/xs(k) 1385 | |
o=o+del*xm(k)/xs(k) 1385 | |
dlx=max(xv(k)*del**2,dlx) 1386 | |
11921 continue 1387 | |
11922 continue 1387 | |
if(nin.gt.nx)goto 11912 1388 | |
if(dlx .ge. thr)goto 11961 1388 | |
ixx=0 1389 | |
11970 do 11971 j=1,ni 1389 | |
if(iy(j).eq.1)goto 11971 1389 | |
if(ju(j).eq.0)goto 11971 1390 | |
jb=ix(j) 1390 | |
je=ix(j+1)-1 1391 | |
g(j)=abs(dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(j)) 1392 | |
if(g(j) .le. ab*vp(j))goto 11991 1392 | |
iy(j)=1 1392 | |
ixx=1 1392 | |
11991 continue 1393 | |
11971 continue 1394 | |
11972 continue 1394 | |
if(ixx.eq.1) go to 10880 1395 | |
goto 11912 1396 | |
11961 continue 1397 | |
if(nlp .le. maxit)goto 12011 1397 | |
jerr=-m 1397 | |
return 1397 | |
12011 continue 1398 | |
10360 continue 1398 | |
iz=1 1399 | |
12020 continue 1399 | |
12021 continue 1399 | |
nlp=nlp+1 1399 | |
dlx=0.0 1400 | |
12030 do 12031 l=1,nin 1400 | |
k=ia(l) 1400 | |
jb=ix(k) 1400 | |
je=ix(k+1)-1 1401 | |
gk=dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(k) 1402 | |
ak=a(k) 1402 | |
u=gk+ak*xv(k) 1402 | |
v=abs(u)-vp(k)*ab 1402 | |
a(k)=0.0 1404 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1405 | |
*em))) | |
if(a(k).eq.ak)goto 12031 1406 | |
del=a(k)-ak 1406 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1407 | |
y(jx(jb:je))=y(jx(jb:je))-del*x(jb:je)/xs(k) 1408 | |
o=o+del*xm(k)/xs(k) 1408 | |
dlx=max(xv(k)*del**2,dlx) 1409 | |
12031 continue 1410 | |
12032 continue 1410 | |
if(dlx.lt.thr)goto 12022 1410 | |
if(nlp .le. maxit)goto 12051 1410 | |
jerr=-m 1410 | |
return 1410 | |
12051 continue 1411 | |
goto 12021 1412 | |
12022 continue 1412 | |
jz=0 1413 | |
goto 11911 1414 | |
11912 continue 1414 | |
if(nin .le. nx)goto 12071 1414 | |
jerr=-10000-m 1414 | |
goto 11832 1414 | |
12071 continue 1415 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 1415 | |
kin(m)=nin 1416 | |
rsqo(m)=rsq 1416 | |
almo(m)=alm 1416 | |
lmu=m 1417 | |
if(m.lt.mnl)goto 11831 1417 | |
if(flmin.ge.1.0)goto 11831 1418 | |
me=0 1418 | |
12080 do 12081 j=1,nin 1418 | |
if(ao(j,m).ne.0.0) me=me+1 1418 | |
12081 continue 1418 | |
12082 continue 1418 | |
if(me.gt.ne)goto 11832 1419 | |
if(rsq-rsq0.lt.sml*rsq)goto 11832 1419 | |
if(rsq.gt.rsqmax)goto 11832 1420 | |
11831 continue 1421 | |
11832 continue 1421 | |
deallocate(a,mm,g,iy) 1422 | |
return 1423 | |
end 1424 | |
subroutine spchkvars(no,ni,x,ix,ju) 1425 | |
real x(*) 1425 | |
integer ix(*),ju(ni) 1426 | |
12090 do 12091 j=1,ni 1426 | |
ju(j)=0 1426 | |
jb=ix(j) 1426 | |
nj=ix(j+1)-jb 1426 | |
if(nj.eq.0)goto 12091 1427 | |
je=ix(j+1)-1 1428 | |
if(nj .ge. no)goto 12111 1428 | |
12120 do 12121 i=jb,je 1428 | |
if(x(i).eq.0.0)goto 12121 1428 | |
ju(j)=1 1428 | |
goto 12122 1428 | |
12121 continue 1428 | |
12122 continue 1428 | |
goto 12131 1429 | |
12111 continue 1429 | |
t=x(jb) 1429 | |
12140 do 12141 i=jb+1,je 1429 | |
if(x(i).eq.t)goto 12141 1429 | |
ju(j)=1 1429 | |
goto 12142 1429 | |
12141 continue 1429 | |
12142 continue 1429 | |
12131 continue 1430 | |
12101 continue 1430 | |
12091 continue 1431 | |
12092 continue 1431 | |
return 1432 | |
end 1433 | |
subroutine cmodval(a0,ca,ia,nin,x,ix,jx,n,f) 1434 | |
real ca(*),x(*),f(n) 1434 | |
integer ia(*),ix(*),jx(*) 1435 | |
f=a0 1436 | |
12150 do 12151 j=1,nin 1436 | |
k=ia(j) 1436 | |
kb=ix(k) 1436 | |
ke=ix(k+1)-1 1437 | |
f(jx(kb:ke))=f(jx(kb:ke))+ca(j)*x(kb:ke) 1438 | |
12151 continue 1439 | |
12152 continue 1439 | |
return 1440 | |
end 1441 | |
function row_prod(i,j,ia,ja,ra,w) 1442 | |
integer ia(*),ja(*) 1442 | |
real ra(*),w(*) 1443 | |
row_prod=dot(ra(ia(i)),ra(ia(j)),ja(ia(i)),ja(ia(j)), ia(i+1)-ia( 1445 | |
*i),ia(j+1)-ia(j),w) | |
return 1446 | |
end 1447 | |
function dot(x,y,mx,my,nx,ny,w) 1448 | |
real x(*),y(*),w(*) 1448 | |
integer mx(*),my(*) 1449 | |
i=1 1449 | |
j=i 1449 | |
s=0.0 1450 | |
12160 continue 1450 | |
12161 continue 1450 | |
12170 continue 1451 | |
12171 if(mx(i).ge.my(j))goto 12172 1451 | |
i=i+1 1451 | |
if(i.gt.nx) go to 12180 1451 | |
goto 12171 1452 | |
12172 continue 1452 | |
if(mx(i).eq.my(j)) go to 12190 1453 | |
12200 continue 1453 | |
12201 if(my(j).ge.mx(i))goto 12202 1453 | |
j=j+1 1453 | |
if(j.gt.ny) go to 12180 1453 | |
goto 12201 1454 | |
12202 continue 1454 | |
if(mx(i).eq.my(j)) go to 12190 1454 | |
goto 12161 1455 | |
12190 continue 1455 | |
s=s+w(mx(i))*x(i)*y(j) 1456 | |
i=i+1 1456 | |
if(i.gt.nx)goto 12162 1456 | |
j=j+1 1456 | |
if(j.gt.ny)goto 12162 1457 | |
goto 12161 1458 | |
12162 continue 1458 | |
12180 continue 1458 | |
dot=s 1459 | |
return 1460 | |
end 1461 | |
subroutine lognet (parm,no,ni,nc,x,y,g,jd,vp,cl,ne,nx,nlam,flmin,u 1463 | |
*lam,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,je | |
*rr) | |
real x(no,ni),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nlam) 1464 | |
real ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni) 1465 | |
integer jd(*),ia(nx),nin(nlam) 1466 | |
real, dimension (:), allocatable :: xm,xs,ww,vq,xv | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 12221 1470 | |
jerr=10000 1470 | |
return 1470 | |
12221 continue 1471 | |
allocate(ww(1:no),stat=jerr) 1472 | |
allocate(ju(1:ni),stat=ierr) 1472 | |
jerr=jerr+ierr 1473 | |
allocate(vq(1:ni),stat=ierr) 1473 | |
jerr=jerr+ierr 1474 | |
allocate(xm(1:ni),stat=ierr) 1474 | |
jerr=jerr+ierr 1475 | |
if(kopt .ne. 2)goto 12241 1475 | |
allocate(xv(1:ni),stat=ierr) 1475 | |
jerr=jerr+ierr 1475 | |
12241 continue 1476 | |
if(isd .le. 0)goto 12261 1476 | |
allocate(xs(1:ni),stat=ierr) 1476 | |
jerr=jerr+ierr 1476 | |
12261 continue 1477 | |
if(jerr.ne.0) return 1478 | |
call chkvars(no,ni,x,ju) 1479 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 1480 | |
if(maxval(ju) .gt. 0)goto 12281 1480 | |
jerr=7777 1480 | |
return 1480 | |
12281 continue 1481 | |
vq=max(0.0,vp) 1481 | |
vq=vq*ni/sum(vq) 1482 | |
12290 do 12291 i=1,no 1482 | |
ww(i)=sum(y(i,:)) 1482 | |
if(ww(i).gt.0.0) y(i,:)=y(i,:)/ww(i) 1482 | |
12291 continue 1483 | |
12292 continue 1483 | |
sw=sum(ww) 1483 | |
ww=ww/sw 1484 | |
if(nc .ne. 1)goto 12311 1484 | |
call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) 1485 | |
if(isd .le. 0)goto 12331 1485 | |
12340 do 12341 j=1,ni 1485 | |
cl(:,j)=cl(:,j)*xs(j) 1485 | |
12341 continue 1485 | |
12342 continue 1485 | |
12331 continue 1486 | |
call lognet2n(parm,no,ni,x,y(:,1),g(:,1),ww,ju,vq,cl,ne,nx,nlam,fl 1488 | |
*min,ulam, thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,n | |
*lp,jerr) | |
goto 12301 1489 | |
12311 if(kopt .ne. 2)goto 12351 1489 | |
call multlstandard1(no,ni,x,ww,ju,isd,intr,xm,xs,xv) 1490 | |
if(isd .le. 0)goto 12371 1490 | |
12380 do 12381 j=1,ni 1490 | |
cl(:,j)=cl(:,j)*xs(j) 1490 | |
12381 continue 1490 | |
12382 continue 1490 | |
12371 continue 1491 | |
call multlognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin, 1493 | |
*ulam,thr, intr,maxit,xv,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
goto 12391 1494 | |
12351 continue 1494 | |
call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) 1495 | |
if(isd .le. 0)goto 12411 1495 | |
12420 do 12421 j=1,ni 1495 | |
cl(:,j)=cl(:,j)*xs(j) 1495 | |
12421 continue 1495 | |
12422 continue 1495 | |
12411 continue 1496 | |
call lognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam 1498 | |
*,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
12391 continue 1499 | |
12301 continue 1499 | |
if(jerr.gt.0) return 1499 | |
dev0=2.0*sw*dev0 1500 | |
12430 do 12431 k=1,lmu 1500 | |
nk=nin(k) 1501 | |
12440 do 12441 ic=1,nc 1501 | |
if(isd .le. 0)goto 12461 1501 | |
12470 do 12471 l=1,nk 1501 | |
ca(l,ic,k)=ca(l,ic,k)/xs(ia(l)) 1501 | |
12471 continue 1501 | |
12472 continue 1501 | |
12461 continue 1502 | |
if(intr .ne. 0)goto 12491 1502 | |
a0(ic,k)=0.0 1502 | |
goto 12501 1503 | |
12491 continue 1503 | |
a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk))) 1503 | |
12501 continue 1504 | |
12481 continue 1504 | |
12441 continue 1505 | |
12442 continue 1505 | |
12431 continue 1506 | |
12432 continue 1506 | |
deallocate(ww,ju,vq,xm) 1506 | |
if(isd.gt.0) deallocate(xs) 1507 | |
if(kopt.eq.2) deallocate(xv) 1508 | |
return 1509 | |
end 1510 | |
subroutine lstandard1 (no,ni,x,w,ju,isd,intr,xm,xs) 1511 | |
real x(no,ni),w(no),xm(ni),xs(ni) 1511 | |
integer ju(ni) 1512 | |
if(intr .ne. 0)goto 12521 1513 | |
12530 do 12531 j=1,ni 1513 | |
if(ju(j).eq.0)goto 12531 1513 | |
xm(j)=0.0 1514 | |
if(isd .eq. 0)goto 12551 1514 | |
vc=dot_product(w,x(:,j)**2)-dot_product(w,x(:,j))**2 1515 | |
xs(j)=sqrt(vc) 1515 | |
x(:,j)=x(:,j)/xs(j) 1516 | |
12551 continue 1517 | |
12531 continue 1518 | |
12532 continue 1518 | |
return 1519 | |
12521 continue 1520 | |
12560 do 12561 j=1,ni 1520 | |
if(ju(j).eq.0)goto 12561 1521 | |
xm(j)=dot_product(w,x(:,j)) 1521 | |
x(:,j)=x(:,j)-xm(j) 1522 | |
if(isd .le. 0)goto 12581 1522 | |
xs(j)=sqrt(dot_product(w,x(:,j)**2)) 1522 | |
x(:,j)=x(:,j)/xs(j) 1522 | |
12581 continue 1523 | |
12561 continue 1524 | |
12562 continue 1524 | |
return 1525 | |
end 1526 | |
subroutine multlstandard1 (no,ni,x,w,ju,isd,intr,xm,xs,xv) 1527 | |
real x(no,ni),w(no),xm(ni),xs(ni),xv(ni) 1527 | |
integer ju(ni) 1528 | |
if(intr .ne. 0)goto 12601 1529 | |
12610 do 12611 j=1,ni 1529 | |
if(ju(j).eq.0)goto 12611 1529 | |
xm(j)=0.0 1530 | |
xv(j)=dot_product(w,x(:,j)**2) 1531 | |
if(isd .eq. 0)goto 12631 1531 | |
xbq=dot_product(w,x(:,j))**2 1531 | |
vc=xv(j)-xbq 1532 | |
xs(j)=sqrt(vc) 1532 | |
x(:,j)=x(:,j)/xs(j) 1532 | |
xv(j)=1.0+xbq/vc 1533 | |
12631 continue 1534 | |
12611 continue 1535 | |
12612 continue 1535 | |
return 1536 | |
12601 continue 1537 | |
12640 do 12641 j=1,ni 1537 | |
if(ju(j).eq.0)goto 12641 1538 | |
xm(j)=dot_product(w,x(:,j)) 1538 | |
x(:,j)=x(:,j)-xm(j) 1539 | |
xv(j)=dot_product(w,x(:,j)**2) 1540 | |
if(isd .le. 0)goto 12661 1540 | |
xs(j)=sqrt(xv(j)) 1540 | |
x(:,j)=x(:,j)/xs(j) 1540 | |
xv(j)=1.0 1540 | |
12661 continue 1541 | |
12641 continue 1542 | |
12642 continue 1542 | |
return 1543 | |
end 1544 | |
subroutine lognet2n(parm,no,ni,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin,u 1546 | |
*lam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jer | |
*r) | |
real x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 1547 | |
real a(nx,nlam),a0(nlam),dev(nlam),alm(nlam) 1548 | |
integer ju(ni),m(nx),kin(nlam) 1549 | |
real, dimension (:), allocatable :: b,bs,v,r,xv,q,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 1554 | |
allocate(b(0:ni),stat=jerr) 1555 | |
allocate(xv(1:ni),stat=ierr) 1555 | |
jerr=jerr+ierr 1556 | |
allocate(ga(1:ni),stat=ierr) 1556 | |
jerr=jerr+ierr 1557 | |
allocate(bs(0:ni),stat=ierr) 1557 | |
jerr=jerr+ierr 1558 | |
allocate(mm(1:ni),stat=ierr) 1558 | |
jerr=jerr+ierr 1559 | |
allocate(ixx(1:ni),stat=ierr) 1559 | |
jerr=jerr+ierr 1560 | |
allocate(r(1:no),stat=ierr) 1560 | |
jerr=jerr+ierr 1561 | |
allocate(v(1:no),stat=ierr) 1561 | |
jerr=jerr+ierr 1562 | |
allocate(q(1:no),stat=ierr) 1562 | |
jerr=jerr+ierr 1563 | |
if(jerr.ne.0) return 1564 | |
fmax=log(1.0/pmin-1.0) 1564 | |
fmin=-fmax 1564 | |
vmin=(1.0+pmin)*pmin*(1.0-pmin) 1565 | |
bta=parm 1565 | |
omb=1.0-bta 1566 | |
q0=dot_product(w,y) 1566 | |
if(q0 .gt. pmin)goto 12681 1566 | |
jerr=8001 1566 | |
return 1566 | |
12681 continue 1567 | |
if(q0 .lt. 1.0-pmin)goto 12701 1567 | |
jerr=9001 1567 | |
return 1567 | |
12701 continue 1568 | |
if(intr.eq.0.0) q0=0.5 1569 | |
ixx=0 1569 | |
al=0.0 1569 | |
bz=0.0 1569 | |
if(intr.ne.0) bz=log(q0/(1.0-q0)) 1570 | |
if(nonzero(no,g) .ne. 0)goto 12721 1570 | |
vi=q0*(1.0-q0) 1570 | |
b(0)=bz 1570 | |
v=vi*w 1571 | |
r=w*(y-q0) 1571 | |
q=q0 1571 | |
xmz=vi 1571 | |
dev1=-(bz*q0+log(1.0-q0)) 1572 | |
goto 12731 1573 | |
12721 continue 1573 | |
b(0)=0.0 1574 | |
if(intr .eq. 0)goto 12751 1574 | |
b(0)=azero(no,y,g,w,jerr) 1574 | |
if(jerr.ne.0) return 1574 | |
12751 continue 1575 | |
q=1.0/(1.0+exp(-b(0)-g)) 1575 | |
v=w*q*(1.0-q) 1575 | |
r=w*(y-q) 1575 | |
xmz=sum(v) 1576 | |
dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))) 1577 | |
12731 continue 1578 | |
12711 continue 1578 | |
if(kopt .le. 0)goto 12771 1579 | |
if(isd .le. 0 .or. intr .eq. 0)goto 12791 1579 | |
xv=0.25 1579 | |
goto 12801 1580 | |
12791 continue 1580 | |
12810 do 12811 j=1,ni 1580 | |
if(ju(j).ne.0) xv(j)=0.25*dot_product(w,x(:,j)**2) 1580 | |
12811 continue 1580 | |
12812 continue 1580 | |
12801 continue 1581 | |
12781 continue 1581 | |
12771 continue 1582 | |
dev0=dev1 1583 | |
12820 do 12821 i=1,no 1583 | |
if(y(i).gt.0.0) dev0=dev0+w(i)*y(i)*log(y(i)) 1584 | |
if(y(i).lt.1.0) dev0=dev0+w(i)*(1.0-y(i))*log(1.0-y(i)) 1585 | |
12821 continue 1586 | |
12822 continue 1586 | |
if(flmin .ge. 1.0)goto 12841 1586 | |
eqs=max(eps,flmin) 1586 | |
alf=eqs**(1.0/(nlam-1)) 1586 | |
12841 continue 1587 | |
m=0 1587 | |
mm=0 1587 | |
nlp=0 1587 | |
nin=nlp 1587 | |
mnl=min(mnlam,nlam) 1587 | |
bs=0.0 1587 | |
b(1:ni)=0.0 1588 | |
shr=shri*dev0 1589 | |
12850 do 12851 j=1,ni 1589 | |
if(ju(j).eq.0)goto 12851 1589 | |
ga(j)=abs(dot_product(r,x(:,j))) 1589 | |
12851 continue 1590 | |
12852 continue 1590 | |
12860 do 12861 ilm=1,nlam 1590 | |
al0=al 1591 | |
if(flmin .lt. 1.0)goto 12881 1591 | |
al=ulam(ilm) 1591 | |
goto 12871 1592 | |
12881 if(ilm .le. 2)goto 12891 1592 | |
al=al*alf 1592 | |
goto 12871 1593 | |
12891 if(ilm .ne. 1)goto 12901 1593 | |
al=big 1593 | |
goto 12911 1594 | |
12901 continue 1594 | |
al0=0.0 1595 | |
12920 do 12921 j=1,ni 1595 | |
if(ju(j).eq.0)goto 12921 1595 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 1595 | |
12921 continue 1596 | |
12922 continue 1596 | |
al0=al0/max(bta,1.0e-3) 1596 | |
al=alf*al0 1597 | |
12911 continue 1598 | |
12871 continue 1598 | |
al2=al*omb 1598 | |
al1=al*bta 1598 | |
tlam=bta*(2.0*al-al0) 1599 | |
12930 do 12931 k=1,ni 1599 | |
if(ixx(k).eq.1)goto 12931 1599 | |
if(ju(k).eq.0)goto 12931 1600 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 1601 | |
12931 continue 1602 | |
12932 continue 1602 | |
10880 continue 1603 | |
12940 continue 1603 | |
12941 continue 1603 | |
bs(0)=b(0) 1603 | |
if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)) 1604 | |
if(kopt .ne. 0)goto 12961 1605 | |
12970 do 12971 j=1,ni 1605 | |
if(ixx(j).gt.0) xv(j)=dot_product(v,x(:,j)**2) 1605 | |
12971 continue 1606 | |
12972 continue 1606 | |
12961 continue 1607 | |
12980 continue 1607 | |
12981 continue 1607 | |
nlp=nlp+1 1607 | |
dlx=0.0 1608 | |
12990 do 12991 k=1,ni 1608 | |
if(ixx(k).eq.0)goto 12991 1609 | |
bk=b(k) 1609 | |
gk=dot_product(r,x(:,k)) 1610 | |
u=gk+xv(k)*b(k) 1610 | |
au=abs(u)-vp(k)*al1 1611 | |
if(au .gt. 0.0)goto 13011 1611 | |
b(k)=0.0 1611 | |
goto 13021 1612 | |
13011 continue 1613 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 1614 | |
13021 continue 1615 | |
13001 continue 1615 | |
d=b(k)-bk 1615 | |
if(abs(d).le.0.0)goto 12991 1615 | |
dlx=max(dlx,xv(k)*d**2) 1616 | |
r=r-d*v*x(:,k) 1617 | |
if(mm(k) .ne. 0)goto 13041 1617 | |
nin=nin+1 1617 | |
if(nin.gt.nx)goto 12992 1618 | |
mm(k)=nin 1618 | |
m(nin)=k 1619 | |
13041 continue 1620 | |
12991 continue 1621 | |
12992 continue 1621 | |
if(nin.gt.nx)goto 12982 1622 | |
d=0.0 1622 | |
if(intr.ne.0) d=sum(r)/xmz 1623 | |
if(d .eq. 0.0)goto 13061 1623 | |
b(0)=b(0)+d 1623 | |
dlx=max(dlx,xmz*d**2) 1623 | |
r=r-d*v 1623 | |
13061 continue 1624 | |
if(dlx.lt.shr)goto 12982 1624 | |
if(nlp .le. maxit)goto 13081 1624 | |
jerr=-ilm 1624 | |
return 1624 | |
13081 continue 1625 | |
13090 continue 1625 | |
13091 continue 1625 | |
nlp=nlp+1 1625 | |
dlx=0.0 1626 | |
13100 do 13101 l=1,nin 1626 | |
k=m(l) 1626 | |
bk=b(k) 1627 | |
gk=dot_product(r,x(:,k)) 1628 | |
u=gk+xv(k)*b(k) 1628 | |
au=abs(u)-vp(k)*al1 1629 | |
if(au .gt. 0.0)goto 13121 1629 | |
b(k)=0.0 1629 | |
goto 13131 1630 | |
13121 continue 1631 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 1632 | |
13131 continue 1633 | |
13111 continue 1633 | |
d=b(k)-bk 1633 | |
if(abs(d).le.0.0)goto 13101 1633 | |
dlx=max(dlx,xv(k)*d**2) 1634 | |
r=r-d*v*x(:,k) 1635 | |
13101 continue 1636 | |
13102 continue 1636 | |
d=0.0 1636 | |
if(intr.ne.0) d=sum(r)/xmz 1637 | |
if(d .eq. 0.0)goto 13151 1637 | |
b(0)=b(0)+d 1637 | |
dlx=max(dlx,xmz*d**2) 1637 | |
r=r-d*v 1637 | |
13151 continue 1638 | |
if(dlx.lt.shr)goto 13092 1638 | |
if(nlp .le. maxit)goto 13171 1638 | |
jerr=-ilm 1638 | |
return 1638 | |
13171 continue 1639 | |
goto 13091 1640 | |
13092 continue 1640 | |
goto 12981 1641 | |
12982 continue 1641 | |
if(nin.gt.nx)goto 12942 1642 | |
13180 do 13181 i=1,no 1642 | |
fi=b(0)+g(i) 1643 | |
if(nin.gt.0) fi=fi+dot_product(b(m(1:nin)),x(i,m(1:nin))) 1644 | |
if(fi .ge. fmin)goto 13201 1644 | |
q(i)=0.0 1644 | |
goto 13191 1644 | |
13201 if(fi .le. fmax)goto 13211 1644 | |
q(i)=1.0 1644 | |
goto 13221 1645 | |
13211 continue 1645 | |
q(i)=1.0/(1.0+exp(-fi)) 1645 | |
13221 continue 1646 | |
13191 continue 1646 | |
13181 continue 1647 | |
13182 continue 1647 | |
v=w*q*(1.0-q) 1647 | |
xmz=sum(v) 1647 | |
if(xmz.le.vmin)goto 12942 1647 | |
r=w*(y-q) 1648 | |
if(xmz*(b(0)-bs(0))**2 .ge. shr)goto 13241 1648 | |
ix=0 1649 | |
13250 do 13251 j=1,nin 1649 | |
k=m(j) 1650 | |
if(xv(k)*(b(k)-bs(k))**2.lt.shr)goto 13251 1650 | |
ix=1 1650 | |
goto 13252 1651 | |
13251 continue 1652 | |
13252 continue 1652 | |
if(ix .ne. 0)goto 13271 1653 | |
13280 do 13281 k=1,ni 1653 | |
if(ixx(k).eq.1)goto 13281 1653 | |
if(ju(k).eq.0)goto 13281 1654 | |
ga(k)=abs(dot_product(r,x(:,k))) 1655 | |
if(ga(k) .le. al1*vp(k))goto 13301 1655 | |
ixx(k)=1 1655 | |
ix=1 1655 | |
13301 continue 1656 | |
13281 continue 1657 | |
13282 continue 1657 | |
if(ix.eq.1) go to 10880 1658 | |
goto 12942 1659 | |
13271 continue 1660 | |
13241 continue 1661 | |
goto 12941 1662 | |
12942 continue 1662 | |
if(nin .le. nx)goto 13321 1662 | |
jerr=-10000-ilm 1662 | |
goto 12862 1662 | |
13321 continue 1663 | |
if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)) 1663 | |
kin(ilm)=nin 1664 | |
a0(ilm)=b(0) 1664 | |
alm(ilm)=al 1664 | |
lmu=ilm 1665 | |
devi=dev2(no,w,y,q,pmin) 1666 | |
dev(ilm)=(dev1-devi)/dev0 1666 | |
if(xmz.le.vmin)goto 12862 1667 | |
if(ilm.lt.mnl)goto 12861 1667 | |
if(flmin.ge.1.0)goto 12861 1668 | |
me=0 1668 | |
13330 do 13331 j=1,nin 1668 | |
if(a(j,ilm).ne.0.0) me=me+1 1668 | |
13331 continue 1668 | |
13332 continue 1668 | |
if(me.gt.ne)goto 12862 1669 | |
if(dev(ilm).gt.devmax)goto 12862 1669 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 12862 1670 | |
12861 continue 1671 | |
12862 continue 1671 | |
g=log(q/(1.0-q)) 1672 | |
deallocate(b,bs,v,r,xv,q,mm,ga,ixx) 1673 | |
return 1674 | |
end 1675 | |
function dev2(n,w,y,p,pmin) 1676 | |
real w(n),y(n),p(n) 1677 | |
pmax=1.0-pmin 1677 | |
s=0.0 1678 | |
13340 do 13341 i=1,n 1678 | |
pi=min(max(pmin,p(i)),pmax) 1679 | |
s=s-w(i)*(y(i)*log(pi)+(1.0-y(i))*log(1.0-pi)) 1680 | |
13341 continue 1681 | |
13342 continue 1681 | |
dev2=s 1682 | |
return 1683 | |
end 1684 | |
function azero(n,y,g,q,jerr) 1685 | |
parameter(eps=1.0e-7) 1686 | |
real y(n),g(n),q(n) 1687 | |
real, dimension (:), allocatable :: e,p,w | |
allocate(e(1:n),stat=jerr) 1691 | |
allocate(p(1:n),stat=ierr) 1691 | |
jerr=jerr+ierr 1692 | |
allocate(w(1:n),stat=ierr) 1692 | |
jerr=jerr+ierr 1693 | |
az=0.0 1694 | |
azero=0.0 1694 | |
if(jerr.ne.0) return 1694 | |
e=exp(-g) 1694 | |
qy=dot_product(q,y) 1694 | |
p=1.0/(1.0+e) 1695 | |
13350 continue 1695 | |
13351 continue 1695 | |
w=q*p*(1.0-p) 1696 | |
d=(qy-dot_product(q,p))/sum(w) 1696 | |
az=az+d 1696 | |
if(abs(d).lt.eps)goto 13352 1697 | |
ea0=exp(-az) 1697 | |
p=1.0/(1.0+ea0*e) 1698 | |
goto 13351 1699 | |
13352 continue 1699 | |
azero=az 1700 | |
deallocate(e,p,w) 1701 | |
return 1702 | |
end 1703 | |
subroutine lognetn(parm,no,ni,nc,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin 1705 | |
*,ulam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,j | |
*err) | |
real x(no,ni),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam) 1706 | |
real a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni) 1707 | |
integer ju(ni),m(nx),kin(nlam) 1708 | |
real, dimension (:,:), allocatable :: q | |
real, dimension (:), allocatable :: sxp,sxpl | |
real, dimension (:), allocatable :: di,v,r,ga | |
real, dimension (:,:), allocatable :: b,bs,xv | |
integer, dimension (:), allocatable :: mm,is,ixx | |
allocate(b(0:ni,1:nc),stat=jerr) | |
allocate(xv(1:ni,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(bs(0:ni,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(q(1:no,1:nc),stat=ierr); jerr=jerr+ierr | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 1719 | |
exmn=-exmx 1720 | |
allocate(r(1:no),stat=ierr) 1720 | |
jerr=jerr+ierr 1721 | |
allocate(v(1:no),stat=ierr) 1721 | |
jerr=jerr+ierr 1722 | |
allocate(mm(1:ni),stat=ierr) 1722 | |
jerr=jerr+ierr 1723 | |
allocate(is(1:max(nc,ni)),stat=ierr) 1723 | |
jerr=jerr+ierr 1724 | |
allocate(sxp(1:no),stat=ierr) 1724 | |
jerr=jerr+ierr 1725 | |
allocate(sxpl(1:no),stat=ierr) 1725 | |
jerr=jerr+ierr 1726 | |
allocate(di(1:no),stat=ierr) 1726 | |
jerr=jerr+ierr 1727 | |
allocate(ga(1:ni),stat=ierr) 1727 | |
jerr=jerr+ierr 1728 | |
allocate(ixx(1:ni),stat=ierr) 1728 | |
jerr=jerr+ierr 1729 | |
if(jerr.ne.0) return 1730 | |
pmax=1.0-pmin 1730 | |
emin=pmin/pmax 1730 | |
emax=1.0/emin 1731 | |
pfm=(1.0+pmin)*pmin 1731 | |
pfx=(1.0-pmin)*pmax 1731 | |
vmin=pfm*pmax 1732 | |
bta=parm 1732 | |
omb=1.0-bta 1732 | |
dev1=0.0 1732 | |
dev0=0.0 1733 | |
13360 do 13361 ic=1,nc 1733 | |
q0=dot_product(w,y(:,ic)) 1734 | |
if(q0 .gt. pmin)goto 13381 1734 | |
jerr =8000+ic 1734 | |
return 1734 | |
13381 continue 1735 | |
if(q0 .lt. 1.0-pmin)goto 13401 1735 | |
jerr =9000+ic 1735 | |
return 1735 | |
13401 continue 1736 | |
if(intr .ne. 0)goto 13421 1736 | |
q0=1.0/nc 1736 | |
b(0,ic)=0.0 1736 | |
goto 13431 1737 | |
13421 continue 1737 | |
b(0,ic)=log(q0) 1737 | |
dev1=dev1-q0*b(0,ic) 1737 | |
13431 continue 1738 | |
13411 continue 1738 | |
b(1:ni,ic)=0.0 1739 | |
13361 continue 1740 | |
13362 continue 1740 | |
if(intr.eq.0) dev1=log(float(nc)) 1740 | |
ixx=0 1740 | |
al=0.0 1741 | |
if(nonzero(no*nc,g) .ne. 0)goto 13451 1742 | |
b(0,:)=b(0,:)-sum(b(0,:))/nc 1742 | |
sxp=0.0 1743 | |
13460 do 13461 ic=1,nc 1743 | |
q(:,ic)=exp(b(0,ic)) 1743 | |
sxp=sxp+q(:,ic) 1743 | |
13461 continue 1744 | |
13462 continue 1744 | |
goto 13471 1745 | |
13451 continue 1745 | |
13480 do 13481 i=1,no 1745 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 1745 | |
13481 continue 1745 | |
13482 continue 1745 | |
sxp=0.0 1746 | |
if(intr .ne. 0)goto 13501 1746 | |
b(0,:)=0.0 1746 | |
goto 13511 1747 | |
13501 continue 1747 | |
call kazero(nc,no,y,g,w,b(0,:),jerr) 1747 | |
if(jerr.ne.0) return 1747 | |
13511 continue 1748 | |
13491 continue 1748 | |
dev1=0.0 1749 | |
13520 do 13521 ic=1,nc 1749 | |
q(:,ic)=b(0,ic)+g(:,ic) 1750 | |
dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) 1751 | |
q(:,ic)=exp(q(:,ic)) 1751 | |
sxp=sxp+q(:,ic) 1752 | |
13521 continue 1753 | |
13522 continue 1753 | |
sxpl=w*log(sxp) 1753 | |
13530 do 13531 ic=1,nc 1753 | |
dev1=dev1+dot_product(y(:,ic),sxpl) 1753 | |
13531 continue 1754 | |
13532 continue 1754 | |
13471 continue 1755 | |
13441 continue 1755 | |
13540 do 13541 ic=1,nc 1755 | |
13550 do 13551 i=1,no 1755 | |
if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 1755 | |
13551 continue 1755 | |
13552 continue 1755 | |
13541 continue 1756 | |
13542 continue 1756 | |
dev0=dev0+dev1 1757 | |
if(kopt .le. 0)goto 13571 1758 | |
if(isd .le. 0 .or. intr .eq. 0)goto 13591 1758 | |
xv=0.25 1758 | |
goto 13601 1759 | |
13591 continue 1759 | |
13610 do 13611 j=1,ni 1759 | |
if(ju(j).ne.0) xv(j,:)=0.25*dot_product(w,x(:,j)**2) 1759 | |
13611 continue 1759 | |
13612 continue 1759 | |
13601 continue 1760 | |
13581 continue 1760 | |
13571 continue 1761 | |
if(flmin .ge. 1.0)goto 13631 1761 | |
eqs=max(eps,flmin) 1761 | |
alf=eqs**(1.0/(nlam-1)) 1761 | |
13631 continue 1762 | |
m=0 1762 | |
mm=0 1762 | |
nin=0 1762 | |
nlp=0 1762 | |
mnl=min(mnlam,nlam) 1762 | |
bs=0.0 1762 | |
shr=shri*dev0 1763 | |
ga=0.0 1764 | |
13640 do 13641 ic=1,nc 1764 | |
r=w*(y(:,ic)-q(:,ic)/sxp) 1765 | |
13650 do 13651 j=1,ni 1765 | |
if(ju(j).ne.0) ga(j)=max(ga(j),abs(dot_product(r,x(:,j)))) 1765 | |
13651 continue 1766 | |
13652 continue 1766 | |
13641 continue 1767 | |
13642 continue 1767 | |
13660 do 13661 ilm=1,nlam 1767 | |
al0=al 1768 | |
if(flmin .lt. 1.0)goto 13681 1768 | |
al=ulam(ilm) 1768 | |
goto 13671 1769 | |
13681 if(ilm .le. 2)goto 13691 1769 | |
al=al*alf 1769 | |
goto 13671 1770 | |
13691 if(ilm .ne. 1)goto 13701 1770 | |
al=big 1770 | |
goto 13711 1771 | |
13701 continue 1771 | |
al0=0.0 1772 | |
13720 do 13721 j=1,ni 1772 | |
if(ju(j).eq.0)goto 13721 1772 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 1772 | |
13721 continue 1773 | |
13722 continue 1773 | |
al0=al0/max(bta,1.0e-3) 1773 | |
al=alf*al0 1774 | |
13711 continue 1775 | |
13671 continue 1775 | |
al2=al*omb 1775 | |
al1=al*bta 1775 | |
tlam=bta*(2.0*al-al0) 1776 | |
13730 do 13731 k=1,ni 1776 | |
if(ixx(k).eq.1)goto 13731 1776 | |
if(ju(k).eq.0)goto 13731 1777 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 1778 | |
13731 continue 1779 | |
13732 continue 1779 | |
10880 continue 1780 | |
13740 continue 1780 | |
13741 continue 1780 | |
ix=0 1780 | |
jx=ix 1780 | |
ig=0 1781 | |
13750 do 13751 ic=1,nc 1781 | |
bs(0,ic)=b(0,ic) 1782 | |
if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) 1783 | |
xmz=0.0 1784 | |
13760 do 13761 i=1,no 1784 | |
pic=q(i,ic)/sxp(i) 1785 | |
if(pic .ge. pfm)goto 13781 1785 | |
pic=0.0 1785 | |
v(i)=0.0 1785 | |
goto 13771 1786 | |
13781 if(pic .le. pfx)goto 13791 1786 | |
pic=1.0 1786 | |
v(i)=0.0 1786 | |
goto 13801 1787 | |
13791 continue 1787 | |
v(i)=w(i)*pic*(1.0-pic) 1787 | |
xmz=xmz+v(i) 1787 | |
13801 continue 1788 | |
13771 continue 1788 | |
r(i)=w(i)*(y(i,ic)-pic) 1789 | |
13761 continue 1790 | |
13762 continue 1790 | |
if(xmz.le.vmin)goto 13751 1790 | |
ig=1 1791 | |
if(kopt .ne. 0)goto 13821 1792 | |
13830 do 13831 j=1,ni 1792 | |
if(ixx(j).gt.0) xv(j,ic)=dot_product(v,x(:,j)**2) 1792 | |
13831 continue 1793 | |
13832 continue 1793 | |
13821 continue 1794 | |
13840 continue 1794 | |
13841 continue 1794 | |
nlp=nlp+1 1794 | |
dlx=0.0 1795 | |
13850 do 13851 k=1,ni 1795 | |
if(ixx(k).eq.0)goto 13851 1796 | |
bk=b(k,ic) 1796 | |
gk=dot_product(r,x(:,k)) 1797 | |
u=gk+xv(k,ic)*b(k,ic) 1797 | |
au=abs(u)-vp(k)*al1 1798 | |
if(au .gt. 0.0)goto 13871 1798 | |
b(k,ic)=0.0 1798 | |
goto 13881 1799 | |
13871 continue 1800 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 1802 | |
*) | |
13881 continue 1803 | |
13861 continue 1803 | |
d=b(k,ic)-bk 1803 | |
if(abs(d).le.0.0)goto 13851 1804 | |
dlx=max(dlx,xv(k,ic)*d**2) 1804 | |
r=r-d*v*x(:,k) 1805 | |
if(mm(k) .ne. 0)goto 13901 1805 | |
nin=nin+1 1806 | |
if(nin .le. nx)goto 13921 1806 | |
jx=1 1806 | |
goto 13852 1806 | |
13921 continue 1807 | |
mm(k)=nin 1807 | |
m(nin)=k 1808 | |
13901 continue 1809 | |
13851 continue 1810 | |
13852 continue 1810 | |
if(jx.gt.0)goto 13842 1811 | |
d=0.0 1811 | |
if(intr.ne.0) d=sum(r)/xmz 1812 | |
if(d .eq. 0.0)goto 13941 1812 | |
b(0,ic)=b(0,ic)+d 1812 | |
dlx=max(dlx,xmz*d**2) 1812 | |
r=r-d*v 1812 | |
13941 continue 1813 | |
if(dlx.lt.shr)goto 13842 1814 | |
if(nlp .le. maxit)goto 13961 1814 | |
jerr=-ilm 1814 | |
return 1814 | |
13961 continue 1815 | |
13970 continue 1815 | |
13971 continue 1815 | |
nlp=nlp+1 1815 | |
dlx=0.0 1816 | |
13980 do 13981 l=1,nin 1816 | |
k=m(l) 1816 | |
bk=b(k,ic) 1817 | |
gk=dot_product(r,x(:,k)) 1818 | |
u=gk+xv(k,ic)*b(k,ic) 1818 | |
au=abs(u)-vp(k)*al1 1819 | |
if(au .gt. 0.0)goto 14001 1819 | |
b(k,ic)=0.0 1819 | |
goto 14011 1820 | |
14001 continue 1821 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 1823 | |
*) | |
14011 continue 1824 | |
13991 continue 1824 | |
d=b(k,ic)-bk 1824 | |
if(abs(d).le.0.0)goto 13981 1825 | |
dlx=max(dlx,xv(k,ic)*d**2) 1825 | |
r=r-d*v*x(:,k) 1826 | |
13981 continue 1827 | |
13982 continue 1827 | |
d=0.0 1827 | |
if(intr.ne.0) d=sum(r)/xmz 1828 | |
if(d .eq. 0.0)goto 14031 1828 | |
b(0,ic)=b(0,ic)+d 1829 | |
dlx=max(dlx,xmz*d**2) 1829 | |
r=r-d*v 1830 | |
14031 continue 1831 | |
if(dlx.lt.shr)goto 13972 1831 | |
if(nlp .le. maxit)goto 14051 1831 | |
jerr=-ilm 1831 | |
return 1831 | |
14051 continue 1832 | |
goto 13971 1833 | |
13972 continue 1833 | |
goto 13841 1834 | |
13842 continue 1834 | |
if(jx.gt.0)goto 13752 1835 | |
if(xmz*(b(0,ic)-bs(0,ic))**2.gt.shr) ix=1 1836 | |
if(ix .ne. 0)goto 14071 1837 | |
14080 do 14081 j=1,nin 1837 | |
k=m(j) 1838 | |
if(xv(k,ic)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 14101 1838 | |
ix=1 1838 | |
goto 14082 1838 | |
14101 continue 1839 | |
14081 continue 1840 | |
14082 continue 1840 | |
14071 continue 1841 | |
14110 do 14111 i=1,no 1841 | |
fi=b(0,ic)+g(i,ic) 1843 | |
if(nin.gt.0) fi=fi+dot_product(b(m(1:nin),ic),x(i,m(1:nin))) 1844 | |
fi=min(max(exmn,fi),exmx) 1844 | |
sxp(i)=sxp(i)-q(i,ic) 1845 | |
q(i,ic)=min(max(emin*sxp(i),exp(fi)),emax*sxp(i)) 1846 | |
sxp(i)=sxp(i)+q(i,ic) 1847 | |
14111 continue 1848 | |
14112 continue 1848 | |
13751 continue 1849 | |
13752 continue 1849 | |
s=-sum(b(0,:))/nc 1849 | |
b(0,:)=b(0,:)+s 1849 | |
di=s 1850 | |
14120 do 14121 j=1,nin 1850 | |
l=m(j) 1851 | |
if(vp(l) .gt. 0.0)goto 14141 1851 | |
s=sum(b(l,:))/nc 1851 | |
goto 14151 1852 | |
14141 continue 1852 | |
s=elc(parm,nc,cl(:,l),b(l,:),is) 1852 | |
14151 continue 1853 | |
14131 continue 1853 | |
b(l,:)=b(l,:)-s 1853 | |
di=di-s*x(:,l) 1854 | |
14121 continue 1855 | |
14122 continue 1855 | |
di=exp(di) 1855 | |
sxp=sxp*di 1855 | |
14160 do 14161 ic=1,nc 1855 | |
q(:,ic)=q(:,ic)*di 1855 | |
14161 continue 1856 | |
14162 continue 1856 | |
if(jx.gt.0)goto 13742 1856 | |
if(ig.eq.0)goto 13742 1857 | |
if(ix .ne. 0)goto 14181 1858 | |
14190 do 14191 k=1,ni 1858 | |
if(ixx(k).eq.1)goto 14191 1858 | |
if(ju(k).eq.0)goto 14191 1858 | |
ga(k)=0.0 1858 | |
14191 continue 1859 | |
14192 continue 1859 | |
14200 do 14201 ic=1,nc 1859 | |
r=w*(y(:,ic)-q(:,ic)/sxp) 1860 | |
14210 do 14211 k=1,ni 1860 | |
if(ixx(k).eq.1)goto 14211 1860 | |
if(ju(k).eq.0)goto 14211 1861 | |
ga(k)=max(ga(k),abs(dot_product(r,x(:,k)))) 1862 | |
14211 continue 1863 | |
14212 continue 1863 | |
14201 continue 1864 | |
14202 continue 1864 | |
14220 do 14221 k=1,ni 1864 | |
if(ixx(k).eq.1)goto 14221 1864 | |
if(ju(k).eq.0)goto 14221 1865 | |
if(ga(k) .le. al1*vp(k))goto 14241 1865 | |
ixx(k)=1 1865 | |
ix=1 1865 | |
14241 continue 1866 | |
14221 continue 1867 | |
14222 continue 1867 | |
if(ix.eq.1) go to 10880 1868 | |
goto 13742 1869 | |
14181 continue 1870 | |
goto 13741 1871 | |
13742 continue 1871 | |
if(jx .le. 0)goto 14261 1871 | |
jerr=-10000-ilm 1871 | |
goto 13662 1871 | |
14261 continue 1871 | |
devi=0.0 1872 | |
14270 do 14271 ic=1,nc 1873 | |
if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) 1873 | |
a0(ic,ilm)=b(0,ic) 1874 | |
14280 do 14281 i=1,no 1874 | |
if(y(i,ic).le.0.0)goto 14281 1875 | |
devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 1876 | |
14281 continue 1877 | |
14282 continue 1877 | |
14271 continue 1878 | |
14272 continue 1878 | |
kin(ilm)=nin 1878 | |
alm(ilm)=al 1878 | |
lmu=ilm 1879 | |
dev(ilm)=(dev1-devi)/dev0 1879 | |
if(ig.eq.0)goto 13662 1880 | |
if(ilm.lt.mnl)goto 13661 1880 | |
if(flmin.ge.1.0)goto 13661 1881 | |
if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne)goto 13662 1882 | |
if(dev(ilm).gt.devmax)goto 13662 1882 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 13662 1883 | |
13661 continue 1884 | |
13662 continue 1884 | |
g=log(q) 1884 | |
14290 do 14291 i=1,no 1884 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 1884 | |
14291 continue 1885 | |
14292 continue 1885 | |
deallocate(sxp,b,bs,v,r,xv,q,mm,is,ga,ixx) 1886 | |
return 1887 | |
end 1888 | |
subroutine kazero(kk,n,y,g,q,az,jerr) 1889 | |
parameter(eps=1.0e-7) 1890 | |
real y(n,kk),g(n,kk),q(n),az(kk) 1891 | |
real, dimension (:), allocatable :: s | |
real, dimension (:,:), allocatable :: e | |
allocate(e(1:n,1:kk),stat=jerr) | |
allocate(s(1:n),stat=ierr) 1896 | |
jerr=jerr+ierr 1897 | |
if(jerr.ne.0) return 1898 | |
az=0.0 1898 | |
e=exp(g) 1898 | |
14300 do 14301 i=1,n 1898 | |
s(i)=sum(e(i,:)) 1898 | |
14301 continue 1899 | |
14302 continue 1899 | |
14310 continue 1899 | |
14311 continue 1899 | |
dm=0.0 1900 | |
14320 do 14321 k=1,kk 1900 | |
t=0.0 1900 | |
u=t 1901 | |
14330 do 14331 i=1,n 1901 | |
pik=e(i,k)/s(i) 1902 | |
t=t+q(i)*(y(i,k)-pik) 1902 | |
u=u+q(i)*pik*(1.0-pik) 1903 | |
14331 continue 1904 | |
14332 continue 1904 | |
d=t/u 1904 | |
az(k)=az(k)+d 1904 | |
ed=exp(d) 1904 | |
dm=max(dm,abs(d)) 1905 | |
14340 do 14341 i=1,n 1905 | |
z=e(i,k) 1905 | |
e(i,k)=z*ed 1905 | |
s(i)=s(i)-z+e(i,k) 1905 | |
14341 continue 1906 | |
14342 continue 1906 | |
14321 continue 1907 | |
14322 continue 1907 | |
if(dm.lt.eps)goto 14312 1907 | |
goto 14311 1908 | |
14312 continue 1908 | |
az=az-sum(az)/kk 1909 | |
deallocate(e,s) 1910 | |
return 1911 | |
end 1912 | |
function elc(parm,n,cl,a,m) 1913 | |
real a(n),cl(2) 1913 | |
integer m(n) 1914 | |
fn=n 1914 | |
am=sum(a)/fn 1915 | |
if((parm .ne. 0.0) .and. (n .ne. 2))goto 14361 1915 | |
elc=am 1915 | |
go to 14370 1915 | |
14361 continue 1916 | |
14380 do 14381 i=1,n 1916 | |
m(i)=i 1916 | |
14381 continue 1916 | |
14382 continue 1916 | |
call psort7(a,m,1,n) 1917 | |
if(a(m(1)) .ne. a(m(n)))goto 14401 1917 | |
elc=a(1) 1917 | |
go to 14370 1917 | |
14401 continue 1918 | |
if(mod(n,2) .ne. 1)goto 14421 1918 | |
ad=a(m(n/2+1)) 1918 | |
goto 14431 1919 | |
14421 continue 1919 | |
ad=0.5*(a(m(n/2+1))+a(m(n/2))) 1919 | |
14431 continue 1920 | |
14411 continue 1920 | |
if(parm .ne. 1.0)goto 14451 1920 | |
elc=ad 1920 | |
go to 14370 1920 | |
14451 continue 1921 | |
b1=min(am,ad) 1921 | |
b2=max(am,ad) 1921 | |
k2=1 1922 | |
14460 continue 1922 | |
14461 if(a(m(k2)).gt.b1)goto 14462 1922 | |
k2=k2+1 1922 | |
goto 14461 1922 | |
14462 continue 1922 | |
k1=k2-1 1923 | |
14470 continue 1923 | |
14471 if(a(m(k2)).ge.b2)goto 14472 1923 | |
k2=k2+1 1923 | |
goto 14471 1924 | |
14472 continue 1924 | |
r=parm/((1.0-parm)*fn) 1924 | |
is=0 1924 | |
sm=n-2*(k1-1) 1925 | |
14480 do 14481 k=k1,k2-1 1925 | |
sm=sm-2.0 1925 | |
s=r*sm+am 1926 | |
if(s .le. a(m(k)) .or. s .gt. a(m(k+1)))goto 14501 1926 | |
is=k 1926 | |
goto 14482 1926 | |
14501 continue 1927 | |
14481 continue 1928 | |
14482 continue 1928 | |
if(is .eq. 0)goto 14521 1928 | |
elc=s 1928 | |
go to 14370 1928 | |
14521 continue 1928 | |
r2=2.0*r 1928 | |
s1=a(m(k1)) 1928 | |
am2=2.0*am 1929 | |
cri=r2*sum(abs(a-s1))+s1*(s1-am2) 1929 | |
elc=s1 1930 | |
14530 do 14531 k=k1+1,k2 1930 | |
s=a(m(k)) 1930 | |
if(s.eq.s1)goto 14531 1931 | |
c=r2*sum(abs(a-s))+s*(s-am2) 1932 | |
if(c .ge. cri)goto 14551 1932 | |
cri=c 1932 | |
elc=s 1932 | |
14551 continue 1932 | |
s1=s 1933 | |
14531 continue 1934 | |
14532 continue 1934 | |
14370 continue 1934 | |
elc=max(maxval(a-cl(2)),min(minval(a-cl(1)),elc)) 1935 | |
return 1936 | |
end 1937 | |
function nintot(ni,nx,nc,a,m,nin,is) 1938 | |
real a(nx,nc) 1938 | |
integer m(nx),is(ni) 1939 | |
is=0 1939 | |
nintot=0 1940 | |
14560 do 14561 ic=1,nc 1940 | |
14570 do 14571 j=1,nin 1940 | |
k=m(j) 1940 | |
if(is(k).ne.0)goto 14571 1941 | |
if(a(j,ic).eq.0.0)goto 14571 1941 | |
is(k)=k 1941 | |
nintot=nintot+1 1942 | |
14571 continue 1942 | |
14572 continue 1942 | |
14561 continue 1943 | |
14562 continue 1943 | |
return 1944 | |
end 1945 | |
subroutine luncomp(ni,nx,nc,ca,ia,nin,a) 1946 | |
real ca(nx,nc),a(ni,nc) 1946 | |
integer ia(nx) 1947 | |
a=0.0 1948 | |
14580 do 14581 ic=1,nc 1948 | |
if(nin.gt.0) a(ia(1:nin),ic)=ca(1:nin,ic) 1948 | |
14581 continue 1949 | |
14582 continue 1949 | |
return 1950 | |
end 1951 | |
subroutine lmodval(nt,x,nc,nx,a0,ca,ia,nin,ans) 1952 | |
real a0(nc),ca(nx,nc),x(nt,*),ans(nc,nt) 1952 | |
integer ia(nx) 1953 | |
14590 do 14591 i=1,nt 1953 | |
14600 do 14601 ic=1,nc 1953 | |
ans(ic,i)=a0(ic) 1955 | |
if(nin.gt.0) ans(ic,i)=ans(ic,i)+dot_product(ca(1:nin,ic),x(i,ia(1 1956 | |
*:nin))) | |
14601 continue 1956 | |
14602 continue 1956 | |
14591 continue 1957 | |
14592 continue 1957 | |
return 1958 | |
end 1959 | |
subroutine splognet (parm,no,ni,nc,x,ix,jx,y,g,jd,vp,cl,ne,nx,nlam 1961 | |
*,flmin, ulam,thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,al | |
*m,nlp,jerr) | |
real x(*),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nlam) 1962 | |
real ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni) 1963 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 1964 | |
real, dimension (:), allocatable :: xm,xs,ww,vq,xv | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 14621 1968 | |
jerr=10000 1968 | |
return 1968 | |
14621 continue 1969 | |
allocate(ww(1:no),stat=jerr) 1970 | |
allocate(ju(1:ni),stat=ierr) 1970 | |
jerr=jerr+ierr 1971 | |
allocate(vq(1:ni),stat=ierr) 1971 | |
jerr=jerr+ierr 1972 | |
allocate(xm(1:ni),stat=ierr) 1972 | |
jerr=jerr+ierr 1973 | |
allocate(xs(1:ni),stat=ierr) 1973 | |
jerr=jerr+ierr 1974 | |
if(kopt .ne. 2)goto 14641 1974 | |
allocate(xv(1:ni),stat=ierr) 1974 | |
jerr=jerr+ierr 1974 | |
14641 continue 1975 | |
if(jerr.ne.0) return 1976 | |
call spchkvars(no,ni,x,ix,ju) 1977 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 1978 | |
if(maxval(ju) .gt. 0)goto 14661 1978 | |
jerr=7777 1978 | |
return 1978 | |
14661 continue 1979 | |
vq=max(0.0,vp) 1979 | |
vq=vq*ni/sum(vq) 1980 | |
14670 do 14671 i=1,no 1980 | |
ww(i)=sum(y(i,:)) 1980 | |
if(ww(i).gt.0.0) y(i,:)=y(i,:)/ww(i) 1980 | |
14671 continue 1981 | |
14672 continue 1981 | |
sw=sum(ww) 1981 | |
ww=ww/sw 1982 | |
if(nc .ne. 1)goto 14691 1982 | |
call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) 1983 | |
if(isd .le. 0)goto 14711 1983 | |
14720 do 14721 j=1,ni 1983 | |
cl(:,j)=cl(:,j)*xs(j) 1983 | |
14721 continue 1983 | |
14722 continue 1983 | |
14711 continue 1984 | |
call sprlognet2n(parm,no,ni,x,ix,jx,y(:,1),g(:,1),ww,ju,vq,cl,ne,n 1987 | |
*x,nlam, flmin,ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca,ia,nin | |
*,dev0,dev, alm,nlp,jerr) | |
goto 14681 1988 | |
14691 if(kopt .ne. 2)goto 14731 1989 | |
call multsplstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs,xv) 1990 | |
if(isd .le. 0)goto 14751 1990 | |
14760 do 14761 j=1,ni 1990 | |
cl(:,j)=cl(:,j)*xs(j) 1990 | |
14761 continue 1990 | |
14762 continue 1990 | |
14751 continue 1991 | |
call multsprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nl 1993 | |
*am,flmin, ulam,thr,intr,maxit,xv,xm,xs,lmu,a0,ca,ia,nin,dev0,dev, | |
*alm,nlp,jerr) | |
goto 14771 1994 | |
14731 continue 1994 | |
call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) 1995 | |
if(isd .le. 0)goto 14791 1995 | |
14800 do 14801 j=1,ni 1995 | |
cl(:,j)=cl(:,j)*xs(j) 1995 | |
14801 continue 1995 | |
14802 continue 1995 | |
14791 continue 1996 | |
call sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,f 1999 | |
*lmin, ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca, ia,nin,dev0, | |
*dev,alm,nlp,jerr) | |
14771 continue 2000 | |
14681 continue 2000 | |
if(jerr.gt.0) return 2000 | |
dev0=2.0*sw*dev0 2001 | |
14810 do 14811 k=1,lmu 2001 | |
nk=nin(k) 2002 | |
14820 do 14821 ic=1,nc 2002 | |
if(isd .le. 0)goto 14841 2002 | |
14850 do 14851 l=1,nk 2002 | |
ca(l,ic,k)=ca(l,ic,k)/xs(ia(l)) 2002 | |
14851 continue 2002 | |
14852 continue 2002 | |
14841 continue 2003 | |
if(intr .ne. 0)goto 14871 2003 | |
a0(ic,k)=0.0 2003 | |
goto 14881 2004 | |
14871 continue 2004 | |
a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk))) 2004 | |
14881 continue 2005 | |
14861 continue 2005 | |
14821 continue 2006 | |
14822 continue 2006 | |
14811 continue 2007 | |
14812 continue 2007 | |
deallocate(ww,ju,vq,xm,xs) 2007 | |
if(kopt.eq.2) deallocate(xv) 2008 | |
return 2009 | |
end 2010 | |
subroutine multsplstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs,xv) 2011 | |
real x(*),w(no),xm(ni),xs(ni),xv(ni) 2011 | |
integer ix(*),jx(*),ju(ni) 2012 | |
if(intr .ne. 0)goto 14901 2013 | |
14910 do 14911 j=1,ni 2013 | |
if(ju(j).eq.0)goto 14911 2013 | |
xm(j)=0.0 2013 | |
jb=ix(j) 2013 | |
je=ix(j+1)-1 2014 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) 2015 | |
if(isd .eq. 0)goto 14931 2015 | |
xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 2015 | |
vc=xv(j)-xbq 2016 | |
xs(j)=sqrt(vc) 2016 | |
xv(j)=1.0+xbq/vc 2017 | |
goto 14941 2018 | |
14931 continue 2018 | |
xs(j)=1.0 2018 | |
14941 continue 2019 | |
14921 continue 2019 | |
14911 continue 2020 | |
14912 continue 2020 | |
return 2021 | |
14901 continue 2022 | |
14950 do 14951 j=1,ni 2022 | |
if(ju(j).eq.0)goto 14951 2022 | |
jb=ix(j) 2022 | |
je=ix(j+1)-1 2023 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 2024 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 2025 | |
if(isd .le. 0)goto 14971 2025 | |
xs(j)=sqrt(xv(j)) 2025 | |
xv(j)=1.0 2025 | |
14971 continue 2026 | |
14951 continue 2027 | |
14952 continue 2027 | |
if(isd.eq.0) xs=1.0 2028 | |
return 2029 | |
end 2030 | |
subroutine splstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs) 2031 | |
real x(*),w(no),xm(ni),xs(ni) 2031 | |
integer ix(*),jx(*),ju(ni) 2032 | |
if(intr .ne. 0)goto 14991 2033 | |
15000 do 15001 j=1,ni 2033 | |
if(ju(j).eq.0)goto 15001 2033 | |
xm(j)=0.0 2033 | |
jb=ix(j) 2033 | |
je=ix(j+1)-1 2034 | |
if(isd .eq. 0)goto 15021 2035 | |
vc=dot_product(w(jx(jb:je)),x(jb:je)**2) -dot_product(w(jx(jb:je) 2037 | |
*),x(jb:je))**2 | |
xs(j)=sqrt(vc) 2038 | |
goto 15031 2039 | |
15021 continue 2039 | |
xs(j)=1.0 2039 | |
15031 continue 2040 | |
15011 continue 2040 | |
15001 continue 2041 | |
15002 continue 2041 | |
return 2042 | |
14991 continue 2043 | |
15040 do 15041 j=1,ni 2043 | |
if(ju(j).eq.0)goto 15041 2043 | |
jb=ix(j) 2043 | |
je=ix(j+1)-1 2044 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 2045 | |
if(isd.ne.0) xs(j)=sqrt(dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j 2046 | |
*)**2) | |
15041 continue 2047 | |
15042 continue 2047 | |
if(isd.eq.0) xs=1.0 2048 | |
return 2049 | |
end 2050 | |
subroutine sprlognet2n (parm,no,ni,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,nl 2053 | |
*am, flmin,ulam,shri,isd,intr,maxit,kopt,xb,xs, lmu,a0,a,m,kin,de | |
*v0,dev,alm,nlp,jerr) | |
real x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 2054 | |
real a(nx,nlam),a0(nlam),dev(nlam),alm(nlam) 2055 | |
real xb(ni),xs(ni) 2055 | |
integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) 2056 | |
real, dimension (:), allocatable :: xm,b,bs,v,r,sc,xv,q,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2061 | |
allocate(b(0:ni),stat=jerr) 2062 | |
allocate(xm(0:ni),stat=ierr) 2062 | |
jerr=jerr+ierr 2063 | |
allocate(xv(1:ni),stat=ierr) 2063 | |
jerr=jerr+ierr 2064 | |
allocate(bs(0:ni),stat=ierr) 2064 | |
jerr=jerr+ierr 2065 | |
allocate(ga(1:ni),stat=ierr) 2065 | |
jerr=jerr+ierr 2066 | |
allocate(mm(1:ni),stat=ierr) 2066 | |
jerr=jerr+ierr 2067 | |
allocate(ixx(1:ni),stat=ierr) 2067 | |
jerr=jerr+ierr 2068 | |
allocate(q(1:no),stat=ierr) 2068 | |
jerr=jerr+ierr 2069 | |
allocate(r(1:no),stat=ierr) 2069 | |
jerr=jerr+ierr 2070 | |
allocate(v(1:no),stat=ierr) 2070 | |
jerr=jerr+ierr 2071 | |
allocate(sc(1:no),stat=ierr) 2071 | |
jerr=jerr+ierr 2072 | |
if(jerr.ne.0) return 2073 | |
fmax=log(1.0/pmin-1.0) 2073 | |
fmin=-fmax 2073 | |
vmin=(1.0+pmin)*pmin*(1.0-pmin) 2074 | |
bta=parm 2074 | |
omb=1.0-bta 2075 | |
q0=dot_product(w,y) 2075 | |
if(q0 .gt. pmin)goto 15061 2075 | |
jerr=8001 2075 | |
return 2075 | |
15061 continue 2076 | |
if(q0 .lt. 1.0-pmin)goto 15081 2076 | |
jerr=9001 2076 | |
return 2076 | |
15081 continue 2077 | |
if(intr.eq.0) q0=0.5 2077 | |
bz=0.0 2077 | |
if(intr.ne.0) bz=log(q0/(1.0-q0)) 2078 | |
if(nonzero(no,g) .ne. 0)goto 15101 2078 | |
vi=q0*(1.0-q0) 2078 | |
b(0)=bz 2078 | |
v=vi*w 2079 | |
r=w*(y-q0) 2079 | |
q=q0 2079 | |
xm(0)=vi 2079 | |
dev1=-(bz*q0+log(1.0-q0)) 2080 | |
goto 15111 2081 | |
15101 continue 2081 | |
b(0)=0.0 2082 | |
if(intr .eq. 0)goto 15131 2082 | |
b(0)=azero(no,y,g,w,jerr) 2082 | |
if(jerr.ne.0) return 2082 | |
15131 continue 2083 | |
q=1.0/(1.0+exp(-b(0)-g)) 2083 | |
v=w*q*(1.0-q) 2083 | |
r=w*(y-q) 2083 | |
xm(0)=sum(v) 2084 | |
dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))) 2085 | |
15111 continue 2086 | |
15091 continue 2086 | |
if(kopt .le. 0)goto 15151 2087 | |
if(isd .le. 0 .or. intr .eq. 0)goto 15171 2087 | |
xv=0.25 2087 | |
goto 15181 2088 | |
15171 continue 2089 | |
15190 do 15191 j=1,ni 2089 | |
if(ju(j).eq.0)goto 15191 2089 | |
jb=ix(j) 2089 | |
je=ix(j+1)-1 2090 | |
xv(j)=0.25*(dot_product(w(jx(jb:je)),x(jb:je)**2)-xb(j)**2) 2091 | |
15191 continue 2092 | |
15192 continue 2092 | |
15181 continue 2093 | |
15161 continue 2093 | |
15151 continue 2094 | |
b(1:ni)=0.0 2094 | |
dev0=dev1 2095 | |
15200 do 15201 i=1,no 2095 | |
if(y(i).gt.0.0) dev0=dev0+w(i)*y(i)*log(y(i)) 2096 | |
if(y(i).lt.1.0) dev0=dev0+w(i)*(1.0-y(i))*log(1.0-y(i)) 2097 | |
15201 continue 2098 | |
15202 continue 2098 | |
if(flmin .ge. 1.0)goto 15221 2098 | |
eqs=max(eps,flmin) 2098 | |
alf=eqs**(1.0/(nlam-1)) 2098 | |
15221 continue 2099 | |
m=0 2099 | |
mm=0 2099 | |
nin=0 2099 | |
o=0.0 2099 | |
svr=o 2099 | |
mnl=min(mnlam,nlam) 2099 | |
bs=0.0 2099 | |
nlp=0 2099 | |
nin=nlp 2100 | |
shr=shri*dev0 2100 | |
al=0.0 2100 | |
ixx=0 2101 | |
15230 do 15231 j=1,ni 2101 | |
if(ju(j).eq.0)goto 15231 2102 | |
jb=ix(j) 2102 | |
je=ix(j+1)-1 2102 | |
jn=ix(j+1)-ix(j) 2103 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2104 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2105 | |
ga(j)=abs((gj-svr*xb(j))/xs(j)) 2106 | |
15231 continue 2107 | |
15232 continue 2107 | |
15240 do 15241 ilm=1,nlam 2107 | |
al0=al 2108 | |
if(flmin .lt. 1.0)goto 15261 2108 | |
al=ulam(ilm) 2108 | |
goto 15251 2109 | |
15261 if(ilm .le. 2)goto 15271 2109 | |
al=al*alf 2109 | |
goto 15251 2110 | |
15271 if(ilm .ne. 1)goto 15281 2110 | |
al=big 2110 | |
goto 15291 2111 | |
15281 continue 2111 | |
al0=0.0 2112 | |
15300 do 15301 j=1,ni 2112 | |
if(ju(j).eq.0)goto 15301 2112 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2112 | |
15301 continue 2113 | |
15302 continue 2113 | |
al0=al0/max(bta,1.0e-3) 2113 | |
al=alf*al0 2114 | |
15291 continue 2115 | |
15251 continue 2115 | |
al2=al*omb 2115 | |
al1=al*bta 2115 | |
tlam=bta*(2.0*al-al0) 2116 | |
15310 do 15311 k=1,ni 2116 | |
if(ixx(k).eq.1)goto 15311 2116 | |
if(ju(k).eq.0)goto 15311 2117 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 2118 | |
15311 continue 2119 | |
15312 continue 2119 | |
10880 continue 2120 | |
15320 continue 2120 | |
15321 continue 2120 | |
bs(0)=b(0) 2120 | |
if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)) 2121 | |
15330 do 15331 j=1,ni 2121 | |
if(ixx(j).eq.0)goto 15331 2122 | |
jb=ix(j) 2122 | |
je=ix(j+1)-1 2122 | |
jn=ix(j+1)-ix(j) 2123 | |
sc(1:jn)=v(jx(jb:je)) 2124 | |
xm(j)=dot_product(sc(1:jn),x(jb:je)) 2125 | |
if(kopt .ne. 0)goto 15351 2126 | |
xv(j)=dot_product(sc(1:jn),x(jb:je)**2) 2127 | |
xv(j)=(xv(j)-2.0*xb(j)*xm(j)+xm(0)*xb(j)**2)/xs(j)**2 2128 | |
15351 continue 2129 | |
15331 continue 2130 | |
15332 continue 2130 | |
15360 continue 2130 | |
15361 continue 2130 | |
nlp=nlp+1 2130 | |
dlx=0.0 2131 | |
15370 do 15371 k=1,ni 2131 | |
if(ixx(k).eq.0)goto 15371 2132 | |
jb=ix(k) 2132 | |
je=ix(k+1)-1 2132 | |
jn=ix(k+1)-ix(k) 2132 | |
bk=b(k) 2133 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2134 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2135 | |
gk=(gk-svr*xb(k))/xs(k) 2136 | |
u=gk+xv(k)*b(k) 2136 | |
au=abs(u)-vp(k)*al1 2137 | |
if(au .gt. 0.0)goto 15391 2137 | |
b(k)=0.0 2137 | |
goto 15401 2138 | |
15391 continue 2139 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 2140 | |
15401 continue 2141 | |
15381 continue 2141 | |
d=b(k)-bk 2141 | |
if(abs(d).le.0.0)goto 15371 2141 | |
dlx=max(dlx,xv(k)*d**2) 2142 | |
if(mm(k) .ne. 0)goto 15421 2142 | |
nin=nin+1 2142 | |
if(nin.gt.nx)goto 15372 2143 | |
mm(k)=nin 2143 | |
m(nin)=k 2143 | |
sc(1:jn)=v(jx(jb:je)) 2144 | |
xm(k)=dot_product(sc(1:jn),x(jb:je)) 2145 | |
15421 continue 2146 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2147 | |
o=o+d*(xb(k)/xs(k)) 2148 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2149 | |
15371 continue 2150 | |
15372 continue 2150 | |
if(nin.gt.nx)goto 15362 2151 | |
d=0.0 2151 | |
if(intr.ne.0) d=svr/xm(0) 2152 | |
if(d .eq. 0.0)goto 15441 2152 | |
b(0)=b(0)+d 2152 | |
dlx=max(dlx,xm(0)*d**2) 2152 | |
r=r-d*v 2153 | |
svr=svr-d*xm(0) 2154 | |
15441 continue 2155 | |
if(dlx.lt.shr)goto 15362 2156 | |
if(nlp .le. maxit)goto 15461 2156 | |
jerr=-ilm 2156 | |
return 2156 | |
15461 continue 2157 | |
15470 continue 2157 | |
15471 continue 2157 | |
nlp=nlp+1 2157 | |
dlx=0.0 2158 | |
15480 do 15481 l=1,nin 2158 | |
k=m(l) 2158 | |
jb=ix(k) 2158 | |
je=ix(k+1)-1 2159 | |
jn=ix(k+1)-ix(k) 2159 | |
bk=b(k) 2160 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2161 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2162 | |
gk=(gk-svr*xb(k))/xs(k) 2163 | |
u=gk+xv(k)*b(k) 2163 | |
au=abs(u)-vp(k)*al1 2164 | |
if(au .gt. 0.0)goto 15501 2164 | |
b(k)=0.0 2164 | |
goto 15511 2165 | |
15501 continue 2166 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 2167 | |
15511 continue 2168 | |
15491 continue 2168 | |
d=b(k)-bk 2168 | |
if(abs(d).le.0.0)goto 15481 2168 | |
dlx=max(dlx,xv(k)*d**2) 2169 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2170 | |
o=o+d*(xb(k)/xs(k)) 2171 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2172 | |
15481 continue 2173 | |
15482 continue 2173 | |
d=0.0 2173 | |
if(intr.ne.0) d=svr/xm(0) 2174 | |
if(d .eq. 0.0)goto 15531 2174 | |
b(0)=b(0)+d 2174 | |
dlx=max(dlx,xm(0)*d**2) 2174 | |
r=r-d*v 2175 | |
svr=svr-d*xm(0) 2176 | |
15531 continue 2177 | |
if(dlx.lt.shr)goto 15472 2178 | |
if(nlp .le. maxit)goto 15551 2178 | |
jerr=-ilm 2178 | |
return 2178 | |
15551 continue 2179 | |
goto 15471 2180 | |
15472 continue 2180 | |
goto 15361 2181 | |
15362 continue 2181 | |
if(nin.gt.nx)goto 15322 2182 | |
sc=b(0) 2182 | |
b0=0.0 2183 | |
15560 do 15561 j=1,nin 2183 | |
l=m(j) 2183 | |
jb=ix(l) 2183 | |
je=ix(l+1)-1 2184 | |
sc(jx(jb:je))=sc(jx(jb:je))+b(l)*x(jb:je)/xs(l) 2185 | |
b0=b0-b(l)*xb(l)/xs(l) 2186 | |
15561 continue 2187 | |
15562 continue 2187 | |
sc=sc+b0 2188 | |
15570 do 15571 i=1,no 2188 | |
fi=sc(i)+g(i) 2189 | |
if(fi .ge. fmin)goto 15591 2189 | |
q(i)=0.0 2189 | |
goto 15581 2189 | |
15591 if(fi .le. fmax)goto 15601 2189 | |
q(i)=1.0 2189 | |
goto 15611 2190 | |
15601 continue 2190 | |
q(i)=1.0/(1.0+exp(-fi)) 2190 | |
15611 continue 2191 | |
15581 continue 2191 | |
15571 continue 2192 | |
15572 continue 2192 | |
v=w*q*(1.0-q) 2192 | |
xm(0)=sum(v) 2192 | |
if(xm(0).lt.vmin)goto 15322 2193 | |
r=w*(y-q) 2193 | |
svr=sum(r) 2193 | |
o=0.0 2194 | |
if(xm(0)*(b(0)-bs(0))**2 .ge. shr)goto 15631 2194 | |
kx=0 2195 | |
15640 do 15641 j=1,nin 2195 | |
k=m(j) 2196 | |
if(xv(k)*(b(k)-bs(k))**2.lt.shr)goto 15641 2196 | |
kx=1 2196 | |
goto 15642 2197 | |
15641 continue 2198 | |
15642 continue 2198 | |
if(kx .ne. 0)goto 15661 2199 | |
15670 do 15671 j=1,ni 2199 | |
if(ixx(j).eq.1)goto 15671 2199 | |
if(ju(j).eq.0)goto 15671 2200 | |
jb=ix(j) 2200 | |
je=ix(j+1)-1 2200 | |
jn=ix(j+1)-ix(j) 2201 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2202 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2203 | |
ga(j)=abs((gj-svr*xb(j))/xs(j)) 2204 | |
if(ga(j) .le. al1*vp(j))goto 15691 2204 | |
ixx(j)=1 2204 | |
kx=1 2204 | |
15691 continue 2205 | |
15671 continue 2206 | |
15672 continue 2206 | |
if(kx.eq.1) go to 10880 2207 | |
goto 15322 2208 | |
15661 continue 2209 | |
15631 continue 2210 | |
goto 15321 2211 | |
15322 continue 2211 | |
if(nin .le. nx)goto 15711 2211 | |
jerr=-10000-ilm 2211 | |
goto 15242 2211 | |
15711 continue 2212 | |
if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)) 2212 | |
kin(ilm)=nin 2213 | |
a0(ilm)=b(0) 2213 | |
alm(ilm)=al 2213 | |
lmu=ilm 2214 | |
devi=dev2(no,w,y,q,pmin) 2215 | |
dev(ilm)=(dev1-devi)/dev0 2216 | |
if(ilm.lt.mnl)goto 15241 2216 | |
if(flmin.ge.1.0)goto 15241 2217 | |
me=0 2217 | |
15720 do 15721 j=1,nin 2217 | |
if(a(j,ilm).ne.0.0) me=me+1 2217 | |
15721 continue 2217 | |
15722 continue 2217 | |
if(me.gt.ne)goto 15242 2218 | |
if(dev(ilm).gt.devmax)goto 15242 2218 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 15242 2219 | |
if(xm(0).lt.vmin)goto 15242 2220 | |
15241 continue 2221 | |
15242 continue 2221 | |
g=log(q/(1.0-q)) 2222 | |
deallocate(xm,b,bs,v,r,sc,xv,q,mm,ga,ixx) 2223 | |
return 2224 | |
end 2225 | |
subroutine sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,n 2227 | |
*lam,flmin, ulam,shri,isd,intr,maxit,kopt,xb,xs,lmu,a0,a,m,kin,dev | |
*0,dev,alm,nlp,jerr) | |
real x(*),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam),xb(ni),xs(ni) 2228 | |
real a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni) 2229 | |
integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) 2230 | |
real, dimension (:,:), allocatable :: q | |
real, dimension (:), allocatable :: sxp,sxpl | |
real, dimension (:), allocatable :: sc,xm,v,r,ga | |
real, dimension (:,:), allocatable :: b,bs,xv | |
integer, dimension (:), allocatable :: mm,is,iy | |
allocate(b(0:ni,1:nc),stat=jerr) | |
allocate(xv(1:ni,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(bs(0:ni,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(q(1:no,1:nc),stat=ierr); jerr=jerr+ierr | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2241 | |
exmn=-exmx 2242 | |
allocate(xm(0:ni),stat=ierr) 2242 | |
jerr=jerr+ierr 2243 | |
allocate(r(1:no),stat=ierr) 2243 | |
jerr=jerr+ierr 2244 | |
allocate(v(1:no),stat=ierr) 2244 | |
jerr=jerr+ierr 2245 | |
allocate(mm(1:ni),stat=ierr) 2245 | |
jerr=jerr+ierr 2246 | |
allocate(ga(1:ni),stat=ierr) 2246 | |
jerr=jerr+ierr 2247 | |
allocate(iy(1:ni),stat=ierr) 2247 | |
jerr=jerr+ierr 2248 | |
allocate(is(1:max(nc,ni)),stat=ierr) 2248 | |
jerr=jerr+ierr 2249 | |
allocate(sxp(1:no),stat=ierr) 2249 | |
jerr=jerr+ierr 2250 | |
allocate(sxpl(1:no),stat=ierr) 2250 | |
jerr=jerr+ierr 2251 | |
allocate(sc(1:no),stat=ierr) 2251 | |
jerr=jerr+ierr 2252 | |
if(jerr.ne.0) return 2253 | |
pmax=1.0-pmin 2253 | |
emin=pmin/pmax 2253 | |
emax=1.0/emin 2254 | |
pfm=(1.0+pmin)*pmin 2254 | |
pfx=(1.0-pmin)*pmax 2254 | |
vmin=pfm*pmax 2255 | |
bta=parm 2255 | |
omb=1.0-bta 2255 | |
dev1=0.0 2255 | |
dev0=0.0 2256 | |
15730 do 15731 ic=1,nc 2256 | |
q0=dot_product(w,y(:,ic)) 2257 | |
if(q0 .gt. pmin)goto 15751 2257 | |
jerr =8000+ic 2257 | |
return 2257 | |
15751 continue 2258 | |
if(q0 .lt. 1.0-pmin)goto 15771 2258 | |
jerr =9000+ic 2258 | |
return 2258 | |
15771 continue 2259 | |
if(intr.eq.0) q0=1.0/nc 2260 | |
b(1:ni,ic)=0.0 2260 | |
b(0,ic)=0.0 2261 | |
if(intr .eq. 0)goto 15791 2261 | |
b(0,ic)=log(q0) 2261 | |
dev1=dev1-q0*b(0,ic) 2261 | |
15791 continue 2262 | |
15731 continue 2263 | |
15732 continue 2263 | |
if(intr.eq.0) dev1=log(float(nc)) 2263 | |
iy=0 2263 | |
al=0.0 2264 | |
if(nonzero(no*nc,g) .ne. 0)goto 15811 2265 | |
b(0,:)=b(0,:)-sum(b(0,:))/nc 2265 | |
sxp=0.0 2266 | |
15820 do 15821 ic=1,nc 2266 | |
q(:,ic)=exp(b(0,ic)) 2266 | |
sxp=sxp+q(:,ic) 2266 | |
15821 continue 2267 | |
15822 continue 2267 | |
goto 15831 2268 | |
15811 continue 2268 | |
15840 do 15841 i=1,no 2268 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 2268 | |
15841 continue 2268 | |
15842 continue 2268 | |
sxp=0.0 2269 | |
if(intr .ne. 0)goto 15861 2269 | |
b(0,:)=0.0 2269 | |
goto 15871 2270 | |
15861 continue 2270 | |
call kazero(nc,no,y,g,w,b(0,:),jerr) 2270 | |
if(jerr.ne.0) return 2270 | |
15871 continue 2271 | |
15851 continue 2271 | |
dev1=0.0 2272 | |
15880 do 15881 ic=1,nc 2272 | |
q(:,ic)=b(0,ic)+g(:,ic) 2273 | |
dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) 2274 | |
q(:,ic)=exp(q(:,ic)) 2274 | |
sxp=sxp+q(:,ic) 2275 | |
15881 continue 2276 | |
15882 continue 2276 | |
sxpl=w*log(sxp) 2276 | |
15890 do 15891 ic=1,nc 2276 | |
dev1=dev1+dot_product(y(:,ic),sxpl) 2276 | |
15891 continue 2277 | |
15892 continue 2277 | |
15831 continue 2278 | |
15801 continue 2278 | |
15900 do 15901 ic=1,nc 2278 | |
15910 do 15911 i=1,no 2278 | |
if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 2278 | |
15911 continue 2278 | |
15912 continue 2278 | |
15901 continue 2279 | |
15902 continue 2279 | |
dev0=dev0+dev1 2280 | |
if(kopt .le. 0)goto 15931 2281 | |
if(isd .le. 0 .or. intr .eq. 0)goto 15951 2281 | |
xv=0.25 2281 | |
goto 15961 2282 | |
15951 continue 2283 | |
15970 do 15971 j=1,ni 2283 | |
if(ju(j).eq.0)goto 15971 2283 | |
jb=ix(j) 2283 | |
je=ix(j+1)-1 2284 | |
xv(j,:)=0.25*(dot_product(w(jx(jb:je)),x(jb:je)**2)-xb(j)**2) 2285 | |
15971 continue 2286 | |
15972 continue 2286 | |
15961 continue 2287 | |
15941 continue 2287 | |
15931 continue 2288 | |
if(flmin .ge. 1.0)goto 15991 2288 | |
eqs=max(eps,flmin) 2288 | |
alf=eqs**(1.0/(nlam-1)) 2288 | |
15991 continue 2289 | |
m=0 2289 | |
mm=0 2289 | |
nin=0 2289 | |
nlp=0 2289 | |
mnl=min(mnlam,nlam) 2289 | |
bs=0.0 2289 | |
svr=0.0 2289 | |
o=0.0 2290 | |
shr=shri*dev0 2290 | |
ga=0.0 2291 | |
16000 do 16001 ic=1,nc 2291 | |
v=q(:,ic)/sxp 2291 | |
r=w*(y(:,ic)-v) 2291 | |
v=w*v*(1.0-v) 2292 | |
16010 do 16011 j=1,ni 2292 | |
if(ju(j).eq.0)goto 16011 2293 | |
jb=ix(j) 2293 | |
je=ix(j+1)-1 2293 | |
jn=ix(j+1)-ix(j) 2294 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2295 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2296 | |
ga(j)=max(ga(j),abs(gj-svr*xb(j))/xs(j)) 2297 | |
16011 continue 2298 | |
16012 continue 2298 | |
16001 continue 2299 | |
16002 continue 2299 | |
16020 do 16021 ilm=1,nlam 2299 | |
al0=al 2300 | |
if(flmin .lt. 1.0)goto 16041 2300 | |
al=ulam(ilm) 2300 | |
goto 16031 2301 | |
16041 if(ilm .le. 2)goto 16051 2301 | |
al=al*alf 2301 | |
goto 16031 2302 | |
16051 if(ilm .ne. 1)goto 16061 2302 | |
al=big 2302 | |
goto 16071 2303 | |
16061 continue 2303 | |
al0=0.0 2304 | |
16080 do 16081 j=1,ni 2304 | |
if(ju(j).eq.0)goto 16081 2304 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2304 | |
16081 continue 2305 | |
16082 continue 2305 | |
al0=al0/max(bta,1.0e-3) 2305 | |
al=alf*al0 2306 | |
16071 continue 2307 | |
16031 continue 2307 | |
al2=al*omb 2307 | |
al1=al*bta 2307 | |
tlam=bta*(2.0*al-al0) 2308 | |
16090 do 16091 k=1,ni 2308 | |
if(iy(k).eq.1)goto 16091 2308 | |
if(ju(k).eq.0)goto 16091 2309 | |
if(ga(k).gt.tlam*vp(k)) iy(k)=1 2310 | |
16091 continue 2311 | |
16092 continue 2311 | |
10880 continue 2312 | |
16100 continue 2312 | |
16101 continue 2312 | |
ixx=0 2312 | |
jxx=ixx 2312 | |
ig=0 2313 | |
16110 do 16111 ic=1,nc 2313 | |
bs(0,ic)=b(0,ic) 2314 | |
if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) 2315 | |
xm(0)=0.0 2315 | |
svr=0.0 2315 | |
o=0.0 2316 | |
16120 do 16121 i=1,no 2316 | |
pic=q(i,ic)/sxp(i) 2317 | |
if(pic .ge. pfm)goto 16141 2317 | |
pic=0.0 2317 | |
v(i)=0.0 2317 | |
goto 16131 2318 | |
16141 if(pic .le. pfx)goto 16151 2318 | |
pic=1.0 2318 | |
v(i)=0.0 2318 | |
goto 16161 2319 | |
16151 continue 2319 | |
v(i)=w(i)*pic*(1.0-pic) 2319 | |
xm(0)=xm(0)+v(i) 2319 | |
16161 continue 2320 | |
16131 continue 2320 | |
r(i)=w(i)*(y(i,ic)-pic) 2320 | |
svr=svr+r(i) 2321 | |
16121 continue 2322 | |
16122 continue 2322 | |
if(xm(0).le.vmin)goto 16111 2322 | |
ig=1 2323 | |
16170 do 16171 j=1,ni 2323 | |
if(iy(j).eq.0)goto 16171 2324 | |
jb=ix(j) 2324 | |
je=ix(j+1)-1 2325 | |
xm(j)=dot_product(v(jx(jb:je)),x(jb:je)) 2326 | |
if(kopt .ne. 0)goto 16191 2327 | |
xv(j,ic)=dot_product(v(jx(jb:je)),x(jb:je)**2) 2328 | |
xv(j,ic)=(xv(j,ic)-2.0*xb(j)*xm(j)+xm(0)*xb(j)**2)/xs(j)**2 2329 | |
16191 continue 2330 | |
16171 continue 2331 | |
16172 continue 2331 | |
16200 continue 2331 | |
16201 continue 2331 | |
nlp=nlp+1 2331 | |
dlx=0.0 2332 | |
16210 do 16211 k=1,ni 2332 | |
if(iy(k).eq.0)goto 16211 2333 | |
jb=ix(k) 2333 | |
je=ix(k+1)-1 2333 | |
jn=ix(k+1)-ix(k) 2333 | |
bk=b(k,ic) 2334 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2335 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2336 | |
gk=(gk-svr*xb(k))/xs(k) 2337 | |
u=gk+xv(k,ic)*b(k,ic) 2337 | |
au=abs(u)-vp(k)*al1 2338 | |
if(au .gt. 0.0)goto 16231 2338 | |
b(k,ic)=0.0 2338 | |
goto 16241 2339 | |
16231 continue 2340 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 2342 | |
*) | |
16241 continue 2343 | |
16221 continue 2343 | |
d=b(k,ic)-bk 2343 | |
if(abs(d).le.0.0)goto 16211 2344 | |
dlx=max(dlx,xv(k,ic)*d**2) 2345 | |
if(mm(k) .ne. 0)goto 16261 2345 | |
nin=nin+1 2346 | |
if(nin .le. nx)goto 16281 2346 | |
jxx=1 2346 | |
goto 16212 2346 | |
16281 continue 2347 | |
mm(k)=nin 2347 | |
m(nin)=k 2348 | |
xm(k)=dot_product(v(jx(jb:je)),x(jb:je)) 2349 | |
16261 continue 2350 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2351 | |
o=o+d*(xb(k)/xs(k)) 2352 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2353 | |
16211 continue 2354 | |
16212 continue 2354 | |
if(jxx.gt.0)goto 16202 2355 | |
d=0.0 2355 | |
if(intr.ne.0) d=svr/xm(0) 2356 | |
if(d .eq. 0.0)goto 16301 2356 | |
b(0,ic)=b(0,ic)+d 2356 | |
dlx=max(dlx,xm(0)*d**2) 2357 | |
r=r-d*v 2357 | |
svr=svr-d*xm(0) 2358 | |
16301 continue 2359 | |
if(dlx.lt.shr)goto 16202 2359 | |
if(nlp .le. maxit)goto 16321 2359 | |
jerr=-ilm 2359 | |
return 2359 | |
16321 continue 2360 | |
16330 continue 2360 | |
16331 continue 2360 | |
nlp=nlp+1 2360 | |
dlx=0.0 2361 | |
16340 do 16341 l=1,nin 2361 | |
k=m(l) 2361 | |
jb=ix(k) 2361 | |
je=ix(k+1)-1 2362 | |
jn=ix(k+1)-ix(k) 2362 | |
bk=b(k,ic) 2363 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2364 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2365 | |
gk=(gk-svr*xb(k))/xs(k) 2366 | |
u=gk+xv(k,ic)*b(k,ic) 2366 | |
au=abs(u)-vp(k)*al1 2367 | |
if(au .gt. 0.0)goto 16361 2367 | |
b(k,ic)=0.0 2367 | |
goto 16371 2368 | |
16361 continue 2369 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 2371 | |
*) | |
16371 continue 2372 | |
16351 continue 2372 | |
d=b(k,ic)-bk 2372 | |
if(abs(d).le.0.0)goto 16341 2373 | |
dlx=max(dlx,xv(k,ic)*d**2) 2374 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2375 | |
o=o+d*(xb(k)/xs(k)) 2376 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2377 | |
16341 continue 2378 | |
16342 continue 2378 | |
d=0.0 2378 | |
if(intr.ne.0) d=svr/xm(0) 2379 | |
if(d .eq. 0.0)goto 16391 2379 | |
b(0,ic)=b(0,ic)+d 2379 | |
dlx=max(dlx,xm(0)*d**2) 2380 | |
r=r-d*v 2380 | |
svr=svr-d*xm(0) 2381 | |
16391 continue 2382 | |
if(dlx.lt.shr)goto 16332 2382 | |
if(nlp .le. maxit)goto 16411 2382 | |
jerr=-ilm 2382 | |
return 2382 | |
16411 continue 2383 | |
goto 16331 2384 | |
16332 continue 2384 | |
goto 16201 2385 | |
16202 continue 2385 | |
if(jxx.gt.0)goto 16112 2386 | |
if(xm(0)*(b(0,ic)-bs(0,ic))**2.gt.shr) ixx=1 2387 | |
if(ixx .ne. 0)goto 16431 2388 | |
16440 do 16441 j=1,nin 2388 | |
k=m(j) 2389 | |
if(xv(k,ic)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 16461 2389 | |
ixx=1 2389 | |
goto 16442 2389 | |
16461 continue 2390 | |
16441 continue 2391 | |
16442 continue 2391 | |
16431 continue 2392 | |
sc=b(0,ic)+g(:,ic) 2392 | |
b0=0.0 2393 | |
16470 do 16471 j=1,nin 2393 | |
l=m(j) 2393 | |
jb=ix(l) 2393 | |
je=ix(l+1)-1 2394 | |
sc(jx(jb:je))=sc(jx(jb:je))+b(l,ic)*x(jb:je)/xs(l) 2395 | |
b0=b0-b(l,ic)*xb(l)/xs(l) 2396 | |
16471 continue 2397 | |
16472 continue 2397 | |
sc=min(max(exmn,sc+b0),exmx) 2398 | |
sxp=sxp-q(:,ic) 2399 | |
q(:,ic)=min(max(emin*sxp,exp(sc)),emax*sxp) 2400 | |
sxp=sxp+q(:,ic) 2401 | |
16111 continue 2402 | |
16112 continue 2402 | |
s=-sum(b(0,:))/nc 2402 | |
b(0,:)=b(0,:)+s 2402 | |
sc=s 2402 | |
b0=0.0 2403 | |
16480 do 16481 j=1,nin 2403 | |
l=m(j) 2404 | |
if(vp(l) .gt. 0.0)goto 16501 2404 | |
s=sum(b(l,:))/nc 2404 | |
goto 16511 2405 | |
16501 continue 2405 | |
s=elc(parm,nc,cl(:,l),b(l,:),is) 2405 | |
16511 continue 2406 | |
16491 continue 2406 | |
b(l,:)=b(l,:)-s 2407 | |
jb=ix(l) 2407 | |
je=ix(l+1)-1 2408 | |
sc(jx(jb:je))=sc(jx(jb:je))-s*x(jb:je)/xs(l) 2409 | |
b0=b0+s*xb(l)/xs(l) 2410 | |
16481 continue 2411 | |
16482 continue 2411 | |
sc=sc+b0 2411 | |
sc=exp(sc) 2411 | |
sxp=sxp*sc 2411 | |
16520 do 16521 ic=1,nc 2411 | |
q(:,ic)=q(:,ic)*sc 2411 | |
16521 continue 2412 | |
16522 continue 2412 | |
if(jxx.gt.0)goto 16102 2412 | |
if(ig.eq.0)goto 16102 2413 | |
if(ixx .ne. 0)goto 16541 2414 | |
16550 do 16551 j=1,ni 2414 | |
if(iy(j).eq.1)goto 16551 2414 | |
if(ju(j).eq.0)goto 16551 2414 | |
ga(j)=0.0 2414 | |
16551 continue 2415 | |
16552 continue 2415 | |
16560 do 16561 ic=1,nc 2415 | |
v=q(:,ic)/sxp 2415 | |
r=w*(y(:,ic)-v) 2415 | |
v=w*v*(1.0-v) 2416 | |
16570 do 16571 j=1,ni 2416 | |
if(iy(j).eq.1)goto 16571 2416 | |
if(ju(j).eq.0)goto 16571 2417 | |
jb=ix(j) 2417 | |
je=ix(j+1)-1 2417 | |
jn=ix(j+1)-ix(j) 2418 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2419 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2420 | |
ga(j)=max(ga(j),abs(gj-svr*xb(j))/xs(j)) 2421 | |
16571 continue 2422 | |
16572 continue 2422 | |
16561 continue 2423 | |
16562 continue 2423 | |
16580 do 16581 k=1,ni 2423 | |
if(iy(k).eq.1)goto 16581 2423 | |
if(ju(k).eq.0)goto 16581 2424 | |
if(ga(k) .le. al1*vp(k))goto 16601 2424 | |
iy(k)=1 2424 | |
ixx=1 2424 | |
16601 continue 2425 | |
16581 continue 2426 | |
16582 continue 2426 | |
if(ixx.eq.1) go to 10880 2427 | |
goto 16102 2428 | |
16541 continue 2429 | |
goto 16101 2430 | |
16102 continue 2430 | |
if(jxx .le. 0)goto 16621 2430 | |
jerr=-10000-ilm 2430 | |
goto 16022 2430 | |
16621 continue 2430 | |
devi=0.0 2431 | |
16630 do 16631 ic=1,nc 2432 | |
if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) 2432 | |
a0(ic,ilm)=b(0,ic) 2433 | |
16640 do 16641 i=1,no 2433 | |
if(y(i,ic).le.0.0)goto 16641 2434 | |
devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 2435 | |
16641 continue 2436 | |
16642 continue 2436 | |
16631 continue 2437 | |
16632 continue 2437 | |
kin(ilm)=nin 2437 | |
alm(ilm)=al 2437 | |
lmu=ilm 2438 | |
dev(ilm)=(dev1-devi)/dev0 2438 | |
if(ig.eq.0)goto 16022 2439 | |
if(ilm.lt.mnl)goto 16021 2439 | |
if(flmin.ge.1.0)goto 16021 2440 | |
if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne)goto 16022 2441 | |
if(dev(ilm).gt.devmax)goto 16022 2441 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 16022 2442 | |
16021 continue 2443 | |
16022 continue 2443 | |
g=log(q) 2443 | |
16650 do 16651 i=1,no 2443 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 2443 | |
16651 continue 2444 | |
16652 continue 2444 | |
deallocate(sxp,b,bs,v,r,xv,q,mm,is,xm,sc,ga,iy) 2445 | |
return 2446 | |
end 2447 | |
subroutine lcmodval(nc,nx,a0,ca,ia,nin,x,ix,jx,n,f) 2448 | |
real a0(nc),ca(nx,nc),x(*),f(nc,n) 2448 | |
integer ia(*),ix(*),jx(*) 2449 | |
16660 do 16661 ic=1,nc 2449 | |
f(ic,:)=a0(ic) 2449 | |
16661 continue 2450 | |
16662 continue 2450 | |
16670 do 16671 j=1,nin 2450 | |
k=ia(j) 2450 | |
kb=ix(k) 2450 | |
ke=ix(k+1)-1 2451 | |
16680 do 16681 ic=1,nc 2451 | |
f(ic,jx(kb:ke))=f(ic,jx(kb:ke))+ca(j,ic)*x(kb:ke) 2451 | |
16681 continue 2452 | |
16682 continue 2452 | |
16671 continue 2453 | |
16672 continue 2453 | |
return 2454 | |
end 2455 | |
subroutine coxnet (parm,no,ni,x,y,d,g,w,jd,vp,cl,ne,nx,nlam,flmin, 2457 | |
*ulam,thr, maxit,isd,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
real x(no,ni),y(no),d(no),g(no),w(no),vp(ni),ulam(nlam) 2458 | |
real ca(nx,nlam),dev(nlam),alm(nlam),cl(2,ni) 2459 | |
integer jd(*),ia(nx),nin(nlam) 2460 | |
real, dimension (:), allocatable :: xs,ww,vq | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 16701 2464 | |
jerr=10000 2464 | |
return 2464 | |
16701 continue 2465 | |
allocate(ww(1:no),stat=jerr) 2466 | |
allocate(ju(1:ni),stat=ierr) 2466 | |
jerr=jerr+ierr 2467 | |
allocate(vq(1:ni),stat=ierr) 2467 | |
jerr=jerr+ierr 2468 | |
if(isd .le. 0)goto 16721 2468 | |
allocate(xs(1:ni),stat=ierr) 2468 | |
jerr=jerr+ierr 2468 | |
16721 continue 2469 | |
if(jerr.ne.0) return 2470 | |
call chkvars(no,ni,x,ju) 2471 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 2472 | |
if(maxval(ju) .gt. 0)goto 16741 2472 | |
jerr=7777 2472 | |
return 2472 | |
16741 continue 2473 | |
vq=max(0.0,vp) 2473 | |
vq=vq*ni/sum(vq) 2474 | |
ww=max(0.0,w) 2474 | |
sw=sum(ww) 2475 | |
if(sw .gt. 0.0)goto 16761 2475 | |
jerr=9999 2475 | |
return 2475 | |
16761 continue 2475 | |
ww=ww/sw 2476 | |
call cstandard(no,ni,x,ww,ju,isd,xs) 2477 | |
if(isd .le. 0)goto 16781 2477 | |
16790 do 16791 j=1,ni 2477 | |
cl(:,j)=cl(:,j)*xs(j) 2477 | |
16791 continue 2477 | |
16792 continue 2477 | |
16781 continue 2478 | |
call coxnet1(parm,no,ni,x,y,d,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam, 2480 | |
*thr, isd,maxit,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
if(jerr.gt.0) return 2480 | |
dev0=2.0*sw*dev0 2481 | |
if(isd .le. 0)goto 16811 2481 | |
16820 do 16821 k=1,lmu 2481 | |
nk=nin(k) 2481 | |
ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) 2481 | |
16821 continue 2481 | |
16822 continue 2481 | |
16811 continue 2482 | |
deallocate(ww,ju,vq) 2482 | |
if(isd.gt.0) deallocate(xs) 2483 | |
return 2484 | |
end 2485 | |
subroutine cstandard (no,ni,x,w,ju,isd,xs) 2486 | |
real x(no,ni),w(no),xs(ni) 2486 | |
integer ju(ni) 2487 | |
16830 do 16831 j=1,ni 2487 | |
if(ju(j).eq.0)goto 16831 2488 | |
xm=dot_product(w,x(:,j)) 2488 | |
x(:,j)=x(:,j)-xm 2489 | |
if(isd .le. 0)goto 16851 2489 | |
xs(j)=sqrt(dot_product(w,x(:,j)**2)) 2489 | |
x(:,j)=x(:,j)/xs(j) 2489 | |
16851 continue 2490 | |
16831 continue 2491 | |
16832 continue 2491 | |
return 2492 | |
end 2493 | |
subroutine coxnet1(parm,no,ni,x,y,d,g,q,ju,vp,cl,ne,nx,nlam,flmin, 2495 | |
*ulam,cthri, isd,maxit,lmu,ao,m,kin,dev0,dev,alm,nlp,jerr) | |
real x(no,ni),y(no),q(no),d(no),g(no),vp(ni),ulam(nlam) 2496 | |
real ao(nx,nlam),dev(nlam),alm(nlam),cl(2,ni) 2497 | |
integer ju(ni),m(nx),kin(nlam) 2498 | |
real, dimension (:), allocatable :: w,dk,v,xs,wr,a,as,f,dq | |
real, dimension (:), allocatable :: e,uu,ga | |
integer, dimension (:), allocatable :: jp,kp,mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2504 | |
sml=sml*100.0 2504 | |
devmax=devmax*0.99/0.999 2505 | |
allocate(e(1:no),stat=jerr) 2506 | |
allocate(uu(1:no),stat=ierr) 2506 | |
jerr=jerr+ierr 2507 | |
allocate(f(1:no),stat=ierr) 2507 | |
jerr=jerr+ierr 2508 | |
allocate(w(1:no),stat=ierr) 2508 | |
jerr=jerr+ierr 2509 | |
allocate(v(1:ni),stat=ierr) 2509 | |
jerr=jerr+ierr 2510 | |
allocate(a(1:ni),stat=ierr) 2510 | |
jerr=jerr+ierr 2511 | |
allocate(as(1:ni),stat=ierr) 2511 | |
jerr=jerr+ierr 2512 | |
allocate(xs(1:ni),stat=ierr) 2512 | |
jerr=jerr+ierr 2513 | |
allocate(ga(1:ni),stat=ierr) 2513 | |
jerr=jerr+ierr 2514 | |
allocate(ixx(1:ni),stat=ierr) 2514 | |
jerr=jerr+ierr 2515 | |
allocate(jp(1:no),stat=ierr) 2515 | |
jerr=jerr+ierr 2516 | |
allocate(kp(1:no),stat=ierr) 2516 | |
jerr=jerr+ierr 2517 | |
allocate(dk(1:no),stat=ierr) 2517 | |
jerr=jerr+ierr 2518 | |
allocate(wr(1:no),stat=ierr) 2518 | |
jerr=jerr+ierr 2519 | |
allocate(dq(1:no),stat=ierr) 2519 | |
jerr=jerr+ierr 2520 | |
allocate(mm(1:ni),stat=ierr) 2520 | |
jerr=jerr+ierr 2521 | |
if(jerr.ne.0)go to 12180 2522 | |
call groups(no,y,d,q,nk,kp,jp,t0,jerr) 2523 | |
if(jerr.ne.0) go to 12180 2523 | |
alpha=parm 2524 | |
oma=1.0-alpha 2524 | |
nlm=0 2524 | |
ixx=0 2524 | |
al=0.0 2525 | |
dq=d*q 2525 | |
call died(no,nk,dq,kp,jp,dk) 2526 | |
a=0.0 2526 | |
f(1)=0.0 2526 | |
fmax=log(huge(f(1))*0.1) 2527 | |
if(nonzero(no,g) .eq. 0)goto 16871 2527 | |
f=g-dot_product(q,g) 2528 | |
e=q*exp(sign(min(abs(f),fmax),f)) 2529 | |
goto 16881 2530 | |
16871 continue 2530 | |
f=0.0 2530 | |
e=q 2530 | |
16881 continue 2531 | |
16861 continue 2531 | |
r0=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu) 2532 | |
rr=-(dot_product(dk(1:nk),log(dk(1:nk)))+r0) 2532 | |
dev0=rr 2533 | |
16890 do 16891 i=1,no 2533 | |
if((y(i) .ge. t0) .and. (q(i) .gt. 0.0))goto 16911 2533 | |
w(i)=0.0 2533 | |
wr(i)=w(i) 2533 | |
16911 continue 2533 | |
16891 continue 2534 | |
16892 continue 2534 | |
call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu) 2535 | |
if(jerr.ne.0) go to 12180 2536 | |
if(flmin .ge. 1.0)goto 16931 2536 | |
eqs=max(eps,flmin) 2536 | |
alf=eqs**(1.0/(nlam-1)) 2536 | |
16931 continue 2537 | |
m=0 2537 | |
mm=0 2537 | |
nlp=0 2537 | |
nin=nlp 2537 | |
mnl=min(mnlam,nlam) 2537 | |
as=0.0 2537 | |
cthr=cthri*dev0 2538 | |
16940 do 16941 j=1,ni 2538 | |
if(ju(j).eq.0)goto 16941 2538 | |
ga(j)=abs(dot_product(wr,x(:,j))) 2538 | |
16941 continue 2539 | |
16942 continue 2539 | |
16950 do 16951 ilm=1,nlam 2539 | |
al0=al 2540 | |
if(flmin .lt. 1.0)goto 16971 2540 | |
al=ulam(ilm) 2540 | |
goto 16961 2541 | |
16971 if(ilm .le. 2)goto 16981 2541 | |
al=al*alf 2541 | |
goto 16961 2542 | |
16981 if(ilm .ne. 1)goto 16991 2542 | |
al=big 2542 | |
goto 17001 2543 | |
16991 continue 2543 | |
al0=0.0 2544 | |
17010 do 17011 j=1,ni 2544 | |
if(ju(j).eq.0)goto 17011 2544 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2544 | |
17011 continue 2545 | |
17012 continue 2545 | |
al0=al0/max(parm,1.0e-3) 2545 | |
al=alf*al0 2546 | |
17001 continue 2547 | |
16961 continue 2547 | |
sa=alpha*al 2547 | |
omal=oma*al 2547 | |
tlam=alpha*(2.0*al-al0) 2548 | |
17020 do 17021 k=1,ni 2548 | |
if(ixx(k).eq.1)goto 17021 2548 | |
if(ju(k).eq.0)goto 17021 2549 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 2550 | |
17021 continue 2551 | |
17022 continue 2551 | |
10880 continue 2552 | |
17030 continue 2552 | |
17031 continue 2552 | |
if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) 2553 | |
call vars(no,ni,x,w,ixx,v) 2554 | |
17040 continue 2554 | |
17041 continue 2554 | |
nlp=nlp+1 2554 | |
dli=0.0 2555 | |
17050 do 17051 j=1,ni 2555 | |
if(ixx(j).eq.0)goto 17051 2556 | |
u=a(j)*v(j)+dot_product(wr,x(:,j)) 2557 | |
if(abs(u) .gt. vp(j)*sa)goto 17071 2557 | |
at=0.0 2557 | |
goto 17081 2558 | |
17071 continue 2558 | |
at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*o 2560 | |
*mal))) | |
17081 continue 2561 | |
17061 continue 2561 | |
if(at .eq. a(j))goto 17101 2561 | |
del=at-a(j) 2561 | |
a(j)=at 2561 | |
dli=max(dli,v(j)*del**2) 2562 | |
wr=wr-del*w*x(:,j) 2562 | |
f=f+del*x(:,j) 2563 | |
if(mm(j) .ne. 0)goto 17121 2563 | |
nin=nin+1 2563 | |
if(nin.gt.nx)goto 17052 2564 | |
mm(j)=nin 2564 | |
m(nin)=j 2565 | |
17121 continue 2566 | |
17101 continue 2567 | |
17051 continue 2568 | |
17052 continue 2568 | |
if(nin.gt.nx)goto 17042 2568 | |
if(dli.lt.cthr)goto 17042 2569 | |
if(nlp .le. maxit)goto 17141 2569 | |
jerr=-ilm 2569 | |
return 2569 | |
17141 continue 2570 | |
17150 continue 2570 | |
17151 continue 2570 | |
nlp=nlp+1 2570 | |
dli=0.0 2571 | |
17160 do 17161 l=1,nin 2571 | |
j=m(l) 2572 | |
u=a(j)*v(j)+dot_product(wr,x(:,j)) 2573 | |
if(abs(u) .gt. vp(j)*sa)goto 17181 2573 | |
at=0.0 2573 | |
goto 17191 2574 | |
17181 continue 2574 | |
at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*o 2576 | |
*mal))) | |
17191 continue 2577 | |
17171 continue 2577 | |
if(at .eq. a(j))goto 17211 2577 | |
del=at-a(j) 2577 | |
a(j)=at 2577 | |
dli=max(dli,v(j)*del**2) 2578 | |
wr=wr-del*w*x(:,j) 2578 | |
f=f+del*x(:,j) 2579 | |
17211 continue 2580 | |
17161 continue 2581 | |
17162 continue 2581 | |
if(dli.lt.cthr)goto 17152 2581 | |
if(nlp .le. maxit)goto 17231 2581 | |
jerr=-ilm 2581 | |
return 2581 | |
17231 continue 2582 | |
goto 17151 2583 | |
17152 continue 2583 | |
goto 17041 2584 | |
17042 continue 2584 | |
if(nin.gt.nx)goto 17032 2585 | |
e=q*exp(sign(min(abs(f),fmax),f)) 2586 | |
call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu) 2587 | |
if(jerr .eq. 0)goto 17251 2587 | |
jerr=jerr-ilm 2587 | |
go to 12180 2587 | |
17251 continue 2588 | |
ix=0 2589 | |
17260 do 17261 j=1,nin 2589 | |
k=m(j) 2590 | |
if(v(k)*(a(k)-as(k))**2.lt.cthr)goto 17261 2590 | |
ix=1 2590 | |
goto 17262 2590 | |
17261 continue 2591 | |
17262 continue 2591 | |
if(ix .ne. 0)goto 17281 2592 | |
17290 do 17291 k=1,ni 2592 | |
if(ixx(k).eq.1)goto 17291 2592 | |
if(ju(k).eq.0)goto 17291 2593 | |
ga(k)=abs(dot_product(wr,x(:,k))) 2594 | |
if(ga(k) .le. sa*vp(k))goto 17311 2594 | |
ixx(k)=1 2594 | |
ix=1 2594 | |
17311 continue 2595 | |
17291 continue 2596 | |
17292 continue 2596 | |
if(ix.eq.1) go to 10880 2597 | |
goto 17032 2598 | |
17281 continue 2599 | |
goto 17031 2600 | |
17032 continue 2600 | |
if(nin .le. nx)goto 17331 2600 | |
jerr=-10000-ilm 2600 | |
goto 16952 2600 | |
17331 continue 2601 | |
if(nin.gt.0) ao(1:nin,ilm)=a(m(1:nin)) 2601 | |
kin(ilm)=nin 2602 | |
alm(ilm)=al 2602 | |
lmu=ilm 2603 | |
dev(ilm)=(risk(no,ni,nk,dq,dk,f,e,kp,jp,uu)-r0)/rr 2604 | |
if(ilm.lt.mnl)goto 16951 2604 | |
if(flmin.ge.1.0)goto 16951 2605 | |
me=0 2605 | |
17340 do 17341 j=1,nin 2605 | |
if(ao(j,ilm).ne.0.0) me=me+1 2605 | |
17341 continue 2605 | |
17342 continue 2605 | |
if(me.gt.ne)goto 16952 2606 | |
if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 16952 2607 | |
if(dev(ilm).gt.devmax)goto 16952 2608 | |
16951 continue 2609 | |
16952 continue 2609 | |
g=f 2610 | |
12180 continue 2610 | |
deallocate(e,uu,w,dk,v,xs,f,wr,a,as,jp,kp,dq,mm,ga,ixx) 2611 | |
return 2612 | |
end 2613 | |
subroutine cxmodval(ca,ia,nin,n,x,f) 2614 | |
real ca(nin),x(n,*),f(n) 2614 | |
integer ia(nin) 2615 | |
f=0.0 2615 | |
if(nin.le.0) return 2616 | |
17350 do 17351 i=1,n 2616 | |
f(i)=f(i)+dot_product(ca(1:nin),x(i,ia(1:nin))) 2616 | |
17351 continue 2617 | |
17352 continue 2617 | |
return 2618 | |
end 2619 | |
subroutine groups(no,y,d,q,nk,kp,jp,t0,jerr) 2620 | |
real y(no),d(no),q(no) 2620 | |
integer jp(no),kp(*) 2621 | |
17360 do 17361 j=1,no 2621 | |
jp(j)=j 2621 | |
17361 continue 2621 | |
17362 continue 2621 | |
call psort7(y,jp,1,no) 2622 | |
nj=0 2622 | |
17370 do 17371 j=1,no 2622 | |
if(q(jp(j)).le.0.0)goto 17371 2622 | |
nj=nj+1 2622 | |
jp(nj)=jp(j) 2622 | |
17371 continue 2623 | |
17372 continue 2623 | |
if(nj .ne. 0)goto 17391 2623 | |
jerr=20000 2623 | |
return 2623 | |
17391 continue 2624 | |
j=1 2624 | |
17400 continue 2624 | |
17401 if(d(jp(j)).gt.0.0)goto 17402 2624 | |
j=j+1 2624 | |
if(j.gt.nj)goto 17402 2624 | |
goto 17401 2625 | |
17402 continue 2625 | |
if(j .lt. nj-1)goto 17421 2625 | |
jerr=30000 2625 | |
return 2625 | |
17421 continue 2626 | |
t0=y(jp(j)) 2626 | |
j0=j-1 2627 | |
if(j0 .le. 0)goto 17441 2628 | |
17450 continue 2628 | |
17451 if(y(jp(j0)).lt.t0)goto 17452 2628 | |
j0=j0-1 2628 | |
if(j0.eq.0)goto 17452 2628 | |
goto 17451 2629 | |
17452 continue 2629 | |
if(j0 .le. 0)goto 17471 2629 | |
nj=nj-j0 2629 | |
17480 do 17481 j=1,nj 2629 | |
jp(j)=jp(j+j0) 2629 | |
17481 continue 2629 | |
17482 continue 2629 | |
17471 continue 2630 | |
17441 continue 2631 | |
jerr=0 2631 | |
nk=0 2631 | |
yk=t0 2631 | |
j=2 2632 | |
17490 continue 2632 | |
17491 continue 2632 | |
17500 continue 2633 | |
17501 if(d(jp(j)).gt.0.0.and.y(jp(j)).gt.yk)goto 17502 2633 | |
j=j+1 2633 | |
if(j.gt.nj)goto 17502 2633 | |
goto 17501 2634 | |
17502 continue 2634 | |
nk=nk+1 2634 | |
kp(nk)=j-1 2634 | |
if(j.gt.nj)goto 17492 2635 | |
if(j .ne. nj)goto 17521 2635 | |
nk=nk+1 2635 | |
kp(nk)=nj 2635 | |
goto 17492 2635 | |
17521 continue 2636 | |
yk=y(jp(j)) 2636 | |
j=j+1 2637 | |
goto 17491 2638 | |
17492 continue 2638 | |
return 2639 | |
end 2640 | |
subroutine outer(no,nk,d,dk,kp,jp,e,wr,w,jerr,u) 2641 | |
real d(no),dk(nk),wr(no),w(no) 2642 | |
real e(no),u(no),b,c 2642 | |
integer kp(nk),jp(no) 2643 | |
call usk(no,nk,kp,jp,e,u) 2644 | |
b=dk(1)/u(1) 2644 | |
c=dk(1)/u(1)**2 2644 | |
jerr=0 2645 | |
17530 do 17531 j=1,kp(1) 2645 | |
i=jp(j) 2646 | |
w(i)=e(i)*(b-e(i)*c) 2646 | |
if(w(i) .gt. 0.0)goto 17551 2646 | |
jerr=-30000 2646 | |
return 2646 | |
17551 continue 2647 | |
wr(i)=d(i)-e(i)*b 2648 | |
17531 continue 2649 | |
17532 continue 2649 | |
17560 do 17561 k=2,nk 2649 | |
j1=kp(k-1)+1 2649 | |
j2=kp(k) 2650 | |
b=b+dk(k)/u(k) 2650 | |
c=c+dk(k)/u(k)**2 2651 | |
17570 do 17571 j=j1,j2 2651 | |
i=jp(j) 2652 | |
w(i)=e(i)*(b-e(i)*c) 2652 | |
if(w(i) .gt. 0.0)goto 17591 2652 | |
jerr=-30000 2652 | |
return 2652 | |
17591 continue 2653 | |
wr(i)=d(i)-e(i)*b 2654 | |
17571 continue 2655 | |
17572 continue 2655 | |
17561 continue 2656 | |
17562 continue 2656 | |
return 2657 | |
end 2658 | |
subroutine vars(no,ni,x,w,ixx,v) 2659 | |
real x(no,ni),w(no),v(ni) 2659 | |
integer ixx(ni) 2660 | |
17600 do 17601 j=1,ni 2660 | |
if(ixx(j).gt.0) v(j)=dot_product(w,x(:,j)**2) 2660 | |
17601 continue 2661 | |
17602 continue 2661 | |
return 2662 | |
end 2663 | |
subroutine died(no,nk,d,kp,jp,dk) 2664 | |
real d(no),dk(nk) 2664 | |
integer kp(nk),jp(no) 2665 | |
dk(1)=sum(d(jp(1:kp(1)))) 2666 | |
17610 do 17611 k=2,nk 2666 | |
dk(k)=sum(d(jp((kp(k-1)+1):kp(k)))) 2666 | |
17611 continue 2667 | |
17612 continue 2667 | |
return 2668 | |
end 2669 | |
subroutine usk(no,nk,kp,jp,e,u) 2670 | |
real e(no),u(nk),h 2670 | |
integer kp(nk),jp(no) 2671 | |
h=0.0 2672 | |
17620 do 17621 k=nk,1,-1 2672 | |
j2=kp(k) 2673 | |
j1=1 2673 | |
if(k.gt.1) j1=kp(k-1)+1 2674 | |
17630 do 17631 j=j2,j1,-1 2674 | |
h=h+e(jp(j)) 2674 | |
17631 continue 2675 | |
17632 continue 2675 | |
u(k)=h 2676 | |
17621 continue 2677 | |
17622 continue 2677 | |
return 2678 | |
end 2679 | |
function risk(no,ni,nk,d,dk,f,e,kp,jp,u) 2680 | |
real d(no),dk(nk),f(no) 2681 | |
integer kp(nk),jp(no) 2681 | |
real e(no),u(nk),s 2682 | |
call usk(no,nk,kp,jp,e,u) 2682 | |
u=log(u) 2683 | |
risk=dot_product(d,f)-dot_product(dk,u) 2684 | |
return 2685 | |
end 2686 | |
subroutine loglike(no,ni,x,y,d,g,w,nlam,a,flog,jerr) 2687 | |
real x(no,ni),y(no),d(no),g(no),w(no),a(ni,nlam),flog(nlam) 2688 | |
real, dimension (:), allocatable :: dk,f,xm,dq,q | |
real, dimension (:), allocatable :: e,uu | |
integer, dimension (:), allocatable :: jp,kp | |
allocate(e(1:no),stat=jerr) 2694 | |
allocate(q(1:no),stat=ierr) 2694 | |
jerr=jerr+ierr 2695 | |
allocate(uu(1:no),stat=ierr) 2695 | |
jerr=jerr+ierr 2696 | |
allocate(f(1:no),stat=ierr) 2696 | |
jerr=jerr+ierr 2697 | |
allocate(dk(1:no),stat=ierr) 2697 | |
jerr=jerr+ierr 2698 | |
allocate(jp(1:no),stat=ierr) 2698 | |
jerr=jerr+ierr 2699 | |
allocate(kp(1:no),stat=ierr) 2699 | |
jerr=jerr+ierr 2700 | |
allocate(dq(1:no),stat=ierr) 2700 | |
jerr=jerr+ierr 2701 | |
allocate(xm(1:ni),stat=ierr) 2701 | |
jerr=jerr+ierr 2702 | |
if(jerr.ne.0) go to 12180 2703 | |
q=max(0.0,w) 2703 | |
sw=sum(q) 2704 | |
if(sw .gt. 0.0)goto 17651 2704 | |
jerr=9999 2704 | |
go to 12180 2704 | |
17651 continue 2705 | |
call groups(no,y,d,q,nk,kp,jp,t0,jerr) 2706 | |
if(jerr.ne.0) go to 12180 2706 | |
fmax=log(huge(e(1))*0.1) 2707 | |
dq=d*q 2707 | |
call died(no,nk,dq,kp,jp,dk) 2707 | |
gm=dot_product(q,g)/sw 2708 | |
17660 do 17661 j=1,ni 2708 | |
xm(j)=dot_product(q,x(:,j))/sw 2708 | |
17661 continue 2709 | |
17662 continue 2709 | |
17670 do 17671 lam=1,nlam 2710 | |
17680 do 17681 i=1,no 2710 | |
f(i)=g(i)-gm+dot_product(a(:,lam),(x(i,:)-xm)) 2711 | |
e(i)=q(i)*exp(sign(min(abs(f(i)),fmax),f(i))) 2712 | |
17681 continue 2713 | |
17682 continue 2713 | |
flog(lam)=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu) 2714 | |
17671 continue 2715 | |
17672 continue 2715 | |
12180 continue 2715 | |
deallocate(e,uu,dk,f,jp,kp,dq) 2716 | |
return 2717 | |
end 2718 | |
subroutine fishnet (parm,no,ni,x,y,g,w,jd,vp,cl,ne,nx,nlam,flmin,u 2720 | |
*lam,thr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
real x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam) 2721 | |
real ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) 2722 | |
integer jd(*),ia(nx),nin(nlam) 2723 | |
real, dimension (:), allocatable :: xm,xs,ww,vq | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 17701 2727 | |
jerr=10000 2727 | |
return 2727 | |
17701 continue 2728 | |
if(minval(y) .ge. 0.0)goto 17721 2728 | |
jerr=8888 2728 | |
return 2728 | |
17721 continue 2729 | |
allocate(ww(1:no),stat=jerr) 2730 | |
allocate(ju(1:ni),stat=ierr) 2730 | |
jerr=jerr+ierr 2731 | |
allocate(vq(1:ni),stat=ierr) 2731 | |
jerr=jerr+ierr 2732 | |
allocate(xm(1:ni),stat=ierr) 2732 | |
jerr=jerr+ierr 2733 | |
if(isd .le. 0)goto 17741 2733 | |
allocate(xs(1:ni),stat=ierr) 2733 | |
jerr=jerr+ierr 2733 | |
17741 continue 2734 | |
if(jerr.ne.0) return 2735 | |
call chkvars(no,ni,x,ju) 2736 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 2737 | |
if(maxval(ju) .gt. 0)goto 17761 2737 | |
jerr=7777 2737 | |
go to 12180 2737 | |
17761 continue 2738 | |
vq=max(0.0,vp) 2738 | |
vq=vq*ni/sum(vq) 2739 | |
ww=max(0.0,w) 2739 | |
sw=sum(ww) 2739 | |
if(sw .gt. 0.0)goto 17781 2739 | |
jerr=9999 2739 | |
go to 12180 2739 | |
17781 continue 2740 | |
ww=ww/sw 2741 | |
call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) 2742 | |
if(isd .le. 0)goto 17801 2742 | |
17810 do 17811 j=1,ni 2742 | |
cl(:,j)=cl(:,j)*xs(j) 2742 | |
17811 continue 2742 | |
17812 continue 2742 | |
17801 continue 2743 | |
call fishnet1(parm,no,ni,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,t 2745 | |
*hr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
if(jerr.gt.0) go to 12180 2745 | |
dev0=2.0*sw*dev0 2746 | |
17820 do 17821 k=1,lmu 2746 | |
nk=nin(k) 2747 | |
if(isd.gt.0) ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) 2748 | |
if(intr .ne. 0)goto 17841 2748 | |
a0(k)=0.0 2748 | |
goto 17851 2749 | |
17841 continue 2749 | |
a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk))) 2749 | |
17851 continue 2750 | |
17831 continue 2750 | |
17821 continue 2751 | |
17822 continue 2751 | |
12180 continue 2751 | |
deallocate(ww,ju,vq,xm) 2751 | |
if(isd.gt.0) deallocate(xs) 2752 | |
return 2753 | |
end 2754 | |
subroutine fishnet1(parm,no,ni,x,y,g,q,ju,vp,cl,ne,nx,nlam,flmin,u 2756 | |
*lam,shri, isd,intr,maxit,lmu,a0,ca,m,kin,dev0,dev,alm,nlp,jerr) | |
real x(no,ni),y(no),g(no),q(no),vp(ni),ulam(nlam) 2757 | |
real ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) 2758 | |
integer ju(ni),m(nx),kin(nlam) 2759 | |
real, dimension (:), allocatable :: t,w,wr,v,a,f,as,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2763 | |
sml=sml*10.0 2764 | |
allocate(a(1:ni),stat=jerr) 2765 | |
allocate(as(1:ni),stat=ierr) 2765 | |
jerr=jerr+ierr 2766 | |
allocate(t(1:no),stat=ierr) 2766 | |
jerr=jerr+ierr 2767 | |
allocate(mm(1:ni),stat=ierr) 2767 | |
jerr=jerr+ierr 2768 | |
allocate(ga(1:ni),stat=ierr) 2768 | |
jerr=jerr+ierr 2769 | |
allocate(ixx(1:ni),stat=ierr) 2769 | |
jerr=jerr+ierr 2770 | |
allocate(wr(1:no),stat=ierr) 2770 | |
jerr=jerr+ierr 2771 | |
allocate(v(1:ni),stat=ierr) 2771 | |
jerr=jerr+ierr 2772 | |
allocate(w(1:no),stat=ierr) 2772 | |
jerr=jerr+ierr 2773 | |
allocate(f(1:no),stat=ierr) 2773 | |
jerr=jerr+ierr 2774 | |
if(jerr.ne.0) return 2775 | |
bta=parm 2775 | |
omb=1.0-bta 2776 | |
t=q*y 2776 | |
yb=sum(t) 2776 | |
fmax=log(huge(bta)*0.1) 2777 | |
if(nonzero(no,g) .ne. 0)goto 17871 2778 | |
if(intr .eq. 0)goto 17891 2778 | |
w=q*yb 2778 | |
az=log(yb) 2778 | |
f=az 2778 | |
dv0=yb*(az-1.0) 2778 | |
goto 17901 2779 | |
17891 continue 2779 | |
w=q 2779 | |
az=0.0 2779 | |
f=az 2779 | |
dv0=-1.0 2779 | |
17901 continue 2780 | |
17881 continue 2780 | |
goto 17911 2781 | |
17871 continue 2781 | |
w=q*exp(sign(min(abs(g),fmax),g)) 2781 | |
v0=sum(w) 2782 | |
if(intr .eq. 0)goto 17931 2782 | |
eaz=yb/v0 2782 | |
w=eaz*w 2782 | |
az=log(eaz) 2782 | |
f=az+g 2783 | |
dv0=dot_product(t,g)-yb*(1.0-az) 2784 | |
goto 17941 2785 | |
17931 continue 2785 | |
az=0.0 2785 | |
f=g 2785 | |
dv0=dot_product(t,g)-v0 2785 | |
17941 continue 2786 | |
17921 continue 2786 | |
17911 continue 2787 | |
17861 continue 2787 | |
a=0.0 2787 | |
as=0.0 2787 | |
wr=t-w 2787 | |
v0=1.0 2787 | |
if(intr.ne.0) v0=yb 2787 | |
dvr=-yb 2788 | |
17950 do 17951 i=1,no 2788 | |
if(t(i).gt.0.0) dvr=dvr+t(i)*log(y(i)) 2788 | |
17951 continue 2788 | |
17952 continue 2788 | |
dvr=dvr-dv0 2788 | |
dev0=dvr 2789 | |
if(flmin .ge. 1.0)goto 17971 2789 | |
eqs=max(eps,flmin) 2789 | |
alf=eqs**(1.0/(nlam-1)) 2789 | |
17971 continue 2790 | |
m=0 2790 | |
mm=0 2790 | |
nlp=0 2790 | |
nin=nlp 2790 | |
mnl=min(mnlam,nlam) 2790 | |
shr=shri*dev0 2790 | |
ixx=0 2790 | |
al=0.0 2791 | |
17980 do 17981 j=1,ni 2791 | |
if(ju(j).eq.0)goto 17981 2791 | |
ga(j)=abs(dot_product(wr,x(:,j))) 2791 | |
17981 continue 2792 | |
17982 continue 2792 | |
17990 do 17991 ilm=1,nlam 2792 | |
al0=al 2793 | |
if(flmin .lt. 1.0)goto 18011 2793 | |
al=ulam(ilm) 2793 | |
goto 18001 2794 | |
18011 if(ilm .le. 2)goto 18021 2794 | |
al=al*alf 2794 | |
goto 18001 2795 | |
18021 if(ilm .ne. 1)goto 18031 2795 | |
al=big 2795 | |
goto 18041 2796 | |
18031 continue 2796 | |
al0=0.0 2797 | |
18050 do 18051 j=1,ni 2797 | |
if(ju(j).eq.0)goto 18051 2797 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2797 | |
18051 continue 2798 | |
18052 continue 2798 | |
al0=al0/max(bta,1.0e-3) 2798 | |
al=alf*al0 2799 | |
18041 continue 2800 | |
18001 continue 2800 | |
al2=al*omb 2800 | |
al1=al*bta 2800 | |
tlam=bta*(2.0*al-al0) 2801 | |
18060 do 18061 k=1,ni 2801 | |
if(ixx(k).eq.1)goto 18061 2801 | |
if(ju(k).eq.0)goto 18061 2802 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 2803 | |
18061 continue 2804 | |
18062 continue 2804 | |
10880 continue 2805 | |
18070 continue 2805 | |
18071 continue 2805 | |
az0=az 2806 | |
if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) 2807 | |
18080 do 18081 j=1,ni 2807 | |
if(ixx(j).ne.0) v(j)=dot_product(w,x(:,j)**2) 2807 | |
18081 continue 2808 | |
18082 continue 2808 | |
18090 continue 2808 | |
18091 continue 2808 | |
nlp=nlp+1 2808 | |
dlx=0.0 2809 | |
18100 do 18101 k=1,ni 2809 | |
if(ixx(k).eq.0)goto 18101 2809 | |
ak=a(k) 2810 | |
u=dot_product(wr,x(:,k))+v(k)*ak 2810 | |
au=abs(u)-vp(k)*al1 2811 | |
if(au .gt. 0.0)goto 18121 2811 | |
a(k)=0.0 2811 | |
goto 18131 2812 | |
18121 continue 2813 | |
a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 2814 | |
18131 continue 2815 | |
18111 continue 2815 | |
if(a(k).eq.ak)goto 18101 2815 | |
d=a(k)-ak 2815 | |
dlx=max(dlx,v(k)*d**2) 2816 | |
wr=wr-d*w*x(:,k) 2816 | |
f=f+d*x(:,k) 2817 | |
if(mm(k) .ne. 0)goto 18151 2817 | |
nin=nin+1 2817 | |
if(nin.gt.nx)goto 18102 2818 | |
mm(k)=nin 2818 | |
m(nin)=k 2819 | |
18151 continue 2820 | |
18101 continue 2821 | |
18102 continue 2821 | |
if(nin.gt.nx)goto 18092 2822 | |
if(intr .eq. 0)goto 18171 2822 | |
d=sum(wr)/v0 2823 | |
az=az+d 2823 | |
dlx=max(dlx,v0*d**2) 2823 | |
wr=wr-d*w 2823 | |
f=f+d 2824 | |
18171 continue 2825 | |
if(dlx.lt.shr)goto 18092 2825 | |
if(nlp .le. maxit)goto 18191 2825 | |
jerr=-ilm 2825 | |
return 2825 | |
18191 continue 2826 | |
18200 continue 2826 | |
18201 continue 2826 | |
nlp=nlp+1 2826 | |
dlx=0.0 2827 | |
18210 do 18211 l=1,nin 2827 | |
k=m(l) 2827 | |
ak=a(k) 2828 | |
u=dot_product(wr,x(:,k))+v(k)*ak 2828 | |
au=abs(u)-vp(k)*al1 2829 | |
if(au .gt. 0.0)goto 18231 2829 | |
a(k)=0.0 2829 | |
goto 18241 2830 | |
18231 continue 2831 | |
a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 2832 | |
18241 continue 2833 | |
18221 continue 2833 | |
if(a(k).eq.ak)goto 18211 2833 | |
d=a(k)-ak 2833 | |
dlx=max(dlx,v(k)*d**2) 2834 | |
wr=wr-d*w*x(:,k) 2834 | |
f=f+d*x(:,k) 2836 | |
18211 continue 2836 | |
18212 continue 2836 | |
if(intr .eq. 0)goto 18261 2836 | |
d=sum(wr)/v0 2836 | |
az=az+d 2837 | |
dlx=max(dlx,v0*d**2) 2837 | |
wr=wr-d*w 2837 | |
f=f+d 2838 | |
18261 continue 2839 | |
if(dlx.lt.shr)goto 18202 2839 | |
if(nlp .le. maxit)goto 18281 2839 | |
jerr=-ilm 2839 | |
return 2839 | |
18281 continue 2840 | |
goto 18201 2841 | |
18202 continue 2841 | |
goto 18091 2842 | |
18092 continue 2842 | |
if(nin.gt.nx)goto 18072 2843 | |
w=q*exp(sign(min(abs(f),fmax),f)) 2843 | |
v0=sum(w) 2843 | |
wr=t-w 2844 | |
if(v0*(az-az0)**2 .ge. shr)goto 18301 2844 | |
ix=0 2845 | |
18310 do 18311 j=1,nin 2845 | |
k=m(j) 2846 | |
if(v(k)*(a(k)-as(k))**2.lt.shr)goto 18311 2846 | |
ix=1 2846 | |
goto 18312 2847 | |
18311 continue 2848 | |
18312 continue 2848 | |
if(ix .ne. 0)goto 18331 2849 | |
18340 do 18341 k=1,ni 2849 | |
if(ixx(k).eq.1)goto 18341 2849 | |
if(ju(k).eq.0)goto 18341 2850 | |
ga(k)=abs(dot_product(wr,x(:,k))) 2851 | |
if(ga(k) .le. al1*vp(k))goto 18361 2851 | |
ixx(k)=1 2851 | |
ix=1 2851 | |
18361 continue 2852 | |
18341 continue 2853 | |
18342 continue 2853 | |
if(ix.eq.1) go to 10880 2854 | |
goto 18072 2855 | |
18331 continue 2856 | |
18301 continue 2857 | |
goto 18071 2858 | |
18072 continue 2858 | |
if(nin .le. nx)goto 18381 2858 | |
jerr=-10000-ilm 2858 | |
goto 17992 2858 | |
18381 continue 2859 | |
if(nin.gt.0) ca(1:nin,ilm)=a(m(1:nin)) 2859 | |
kin(ilm)=nin 2860 | |
a0(ilm)=az 2860 | |
alm(ilm)=al 2860 | |
lmu=ilm 2861 | |
dev(ilm)=(dot_product(t,f)-v0-dv0)/dvr 2862 | |
if(ilm.lt.mnl)goto 17991 2862 | |
if(flmin.ge.1.0)goto 17991 2863 | |
me=0 2863 | |
18390 do 18391 j=1,nin 2863 | |
if(ca(j,ilm).ne.0.0) me=me+1 2863 | |
18391 continue 2863 | |
18392 continue 2863 | |
if(me.gt.ne)goto 17992 2864 | |
if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 17992 2865 | |
if(dev(ilm).gt.devmax)goto 17992 2866 | |
17991 continue 2867 | |
17992 continue 2867 | |
g=f 2868 | |
12180 continue 2868 | |
deallocate(t,w,wr,v,a,f,as,mm,ga,ixx) 2869 | |
return 2870 | |
end 2871 | |
function nonzero(n,v) 2872 | |
real v(n) 2873 | |
nonzero=0 2873 | |
18400 do 18401 i=1,n 2873 | |
if(v(i) .eq. 0.0)goto 18421 2873 | |
nonzero=1 2873 | |
return 2873 | |
18421 continue 2873 | |
18401 continue 2874 | |
18402 continue 2874 | |
return 2875 | |
end 2876 | |
subroutine solns(ni,nx,lmu,a,ia,nin,b) 2877 | |
real a(nx,lmu),b(ni,lmu) 2877 | |
integer ia(nx),nin(lmu) 2878 | |
18430 do 18431 lam=1,lmu 2878 | |
call uncomp(ni,a(:,lam),ia,nin(lam),b(:,lam)) 2878 | |
18431 continue 2879 | |
18432 continue 2879 | |
return 2880 | |
end 2881 | |
subroutine lsolns(ni,nx,nc,lmu,a,ia,nin,b) 2882 | |
real a(nx,nc,lmu),b(ni,nc,lmu) 2882 | |
integer ia(nx),nin(lmu) 2883 | |
18440 do 18441 lam=1,lmu 2883 | |
call luncomp(ni,nx,nc,a(1,1,lam),ia,nin(lam),b(1,1,lam)) 2883 | |
18441 continue 2884 | |
18442 continue 2884 | |
return 2885 | |
end 2886 | |
subroutine deviance(no,ni,x,y,g,q,nlam,a0,a,flog,jerr) 2887 | |
real x(no,ni),y(no),g(no),q(no),a(ni,nlam),a0(nlam),flog(nlam) 2888 | |
real, dimension (:), allocatable :: w | |
if(minval(y) .ge. 0.0)goto 18461 2891 | |
jerr=8888 2891 | |
return 2891 | |
18461 continue 2892 | |
allocate(w(1:no),stat=jerr) 2892 | |
if(jerr.ne.0) return 2893 | |
w=max(0.0,q) 2893 | |
sw=sum(w) 2893 | |
if(sw .gt. 0.0)goto 18481 2893 | |
jerr=9999 2893 | |
go to 12180 2893 | |
18481 continue 2894 | |
yb=dot_product(w,y)/sw 2894 | |
fmax=log(huge(y(1))*0.1) 2895 | |
18490 do 18491 lam=1,nlam 2895 | |
s=0.0 2896 | |
18500 do 18501 i=1,no 2896 | |
if(w(i).le.0.0)goto 18501 2897 | |
f=g(i)+a0(lam)+dot_product(a(:,lam),x(i,:)) 2898 | |
s=s+w(i)*(y(i)*f-exp(sign(min(abs(f),fmax),f))) 2899 | |
18501 continue 2900 | |
18502 continue 2900 | |
flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s) 2901 | |
18491 continue 2902 | |
18492 continue 2902 | |
12180 continue 2902 | |
deallocate(w) 2903 | |
return 2904 | |
end 2905 | |
subroutine spfishnet (parm,no,ni,x,ix,jx,y,g,w,jd,vp,cl,ne,nx,nlam 2907 | |
*,flmin, ulam,thr,isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp | |
*,jerr) | |
real x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 2908 | |
real ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam) 2909 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 2910 | |
real, dimension (:), allocatable :: xm,xs,ww,vq | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 18521 2914 | |
jerr=10000 2914 | |
return 2914 | |
18521 continue 2915 | |
if(minval(y) .ge. 0.0)goto 18541 2915 | |
jerr=8888 2915 | |
return 2915 | |
18541 continue 2916 | |
allocate(ww(1:no),stat=jerr) 2917 | |
allocate(ju(1:ni),stat=ierr) 2917 | |
jerr=jerr+ierr 2918 | |
allocate(vq(1:ni),stat=ierr) 2918 | |
jerr=jerr+ierr 2919 | |
allocate(xm(1:ni),stat=ierr) 2919 | |
jerr=jerr+ierr 2920 | |
allocate(xs(1:ni),stat=ierr) 2920 | |
jerr=jerr+ierr 2921 | |
if(jerr.ne.0) return 2922 | |
call spchkvars(no,ni,x,ix,ju) 2923 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 2924 | |
if(maxval(ju) .gt. 0)goto 18561 2924 | |
jerr=7777 2924 | |
go to 12180 2924 | |
18561 continue 2925 | |
vq=max(0.0,vp) 2925 | |
vq=vq*ni/sum(vq) 2926 | |
ww=max(0.0,w) 2926 | |
sw=sum(ww) 2926 | |
if(sw .gt. 0.0)goto 18581 2926 | |
jerr=9999 2926 | |
go to 12180 2926 | |
18581 continue 2927 | |
ww=ww/sw 2928 | |
call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) 2929 | |
if(isd .le. 0)goto 18601 2929 | |
18610 do 18611 j=1,ni 2929 | |
cl(:,j)=cl(:,j)*xs(j) 2929 | |
18611 continue 2929 | |
18612 continue 2929 | |
18601 continue 2930 | |
call spfishnet1(parm,no,ni,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,flmi 2932 | |
*n,ulam,thr, isd,intr,maxit,xm,xs,lmu,a0,ca,ia,nin,dev0,dev,alm,nl | |
*p,jerr) | |
if(jerr.gt.0) go to 12180 2932 | |
dev0=2.0*sw*dev0 2933 | |
18620 do 18621 k=1,lmu 2933 | |
nk=nin(k) 2934 | |
if(isd.gt.0) ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) 2935 | |
if(intr .ne. 0)goto 18641 2935 | |
a0(k)=0.0 2935 | |
goto 18651 2936 | |
18641 continue 2936 | |
a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk))) 2936 | |
18651 continue 2937 | |
18631 continue 2937 | |
18621 continue 2938 | |
18622 continue 2938 | |
12180 continue 2938 | |
deallocate(ww,ju,vq,xm,xs) 2939 | |
return 2940 | |
end 2941 | |
subroutine spfishnet1(parm,no,ni,x,ix,jx,y,g,q,ju,vp,cl,ne,nx,nlam 2943 | |
*,flmin,ulam, shri,isd,intr,maxit,xb,xs,lmu,a0,ca,m,kin,dev0,dev,a | |
*lm,nlp,jerr) | |
real x(*),y(no),g(no),q(no),vp(ni),ulam(nlam),xb(ni),xs(ni) 2944 | |
real ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) 2945 | |
integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) 2946 | |
real, dimension (:), allocatable :: qy,t,w,wr,v,a,as,xm,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2950 | |
sml=sml*10.0 2951 | |
allocate(a(1:ni),stat=jerr) 2952 | |
allocate(as(1:ni),stat=ierr) 2952 | |
jerr=jerr+ierr 2953 | |
allocate(t(1:no),stat=ierr) 2953 | |
jerr=jerr+ierr 2954 | |
allocate(mm(1:ni),stat=ierr) 2954 | |
jerr=jerr+ierr 2955 | |
allocate(ga(1:ni),stat=ierr) 2955 | |
jerr=jerr+ierr 2956 | |
allocate(ixx(1:ni),stat=ierr) 2956 | |
jerr=jerr+ierr 2957 | |
allocate(wr(1:no),stat=ierr) 2957 | |
jerr=jerr+ierr 2958 | |
allocate(v(1:ni),stat=ierr) 2958 | |
jerr=jerr+ierr 2959 | |
allocate(xm(1:ni),stat=ierr) 2959 | |
jerr=jerr+ierr 2960 | |
allocate(w(1:no),stat=ierr) 2960 | |
jerr=jerr+ierr 2961 | |
allocate(qy(1:no),stat=ierr) 2961 | |
jerr=jerr+ierr 2962 | |
if(jerr.ne.0) return 2963 | |
bta=parm 2963 | |
omb=1.0-bta 2963 | |
fmax=log(huge(bta)*0.1) 2964 | |
qy=q*y 2964 | |
yb=sum(qy) 2965 | |
if(nonzero(no,g) .ne. 0)goto 18671 2965 | |
t=0.0 2966 | |
if(intr .eq. 0)goto 18691 2966 | |
w=q*yb 2966 | |
az=log(yb) 2966 | |
uu=az 2967 | |
xm=yb*xb 2967 | |
dv0=yb*(az-1.0) 2968 | |
goto 18701 2969 | |
18691 continue 2969 | |
w=q 2969 | |
xm=0.0 2969 | |
uu=0.0 2969 | |
az=uu 2969 | |
dv0=-1.0 2969 | |
18701 continue 2970 | |
18681 continue 2970 | |
goto 18711 2971 | |
18671 continue 2971 | |
w=q*exp(sign(min(abs(g),fmax),g)) 2971 | |
ww=sum(w) 2971 | |
t=g 2972 | |
if(intr .eq. 0)goto 18731 2972 | |
eaz=yb/ww 2973 | |
w=eaz*w 2973 | |
az=log(eaz) 2973 | |
uu=az 2973 | |
dv0=dot_product(qy,g)-yb*(1.0-az) 2974 | |
goto 18741 2975 | |
18731 continue 2975 | |
uu=0.0 2975 | |
az=uu 2975 | |
dv0=dot_product(qy,g)-ww 2975 | |
18741 continue 2976 | |
18721 continue 2976 | |
18750 do 18751 j=1,ni 2976 | |
if(ju(j).eq.0)goto 18751 2976 | |
jb=ix(j) 2976 | |
je=ix(j+1)-1 2977 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 2978 | |
18751 continue 2979 | |
18752 continue 2979 | |
18711 continue 2980 | |
18661 continue 2980 | |
tt=yb*uu 2980 | |
ww=1.0 2980 | |
if(intr.ne.0) ww=yb 2980 | |
wr=qy-q*(yb*(1.0-uu)) 2980 | |
a=0.0 2980 | |
as=0.0 2981 | |
dvr=-yb 2982 | |
18760 do 18761 i=1,no 2982 | |
if(qy(i).gt.0.0) dvr=dvr+qy(i)*log(y(i)) 2982 | |
18761 continue 2982 | |
18762 continue 2982 | |
dvr=dvr-dv0 2982 | |
dev0=dvr 2983 | |
if(flmin .ge. 1.0)goto 18781 2983 | |
eqs=max(eps,flmin) 2983 | |
alf=eqs**(1.0/(nlam-1)) 2983 | |
18781 continue 2984 | |
m=0 2984 | |
mm=0 2984 | |
nlp=0 2984 | |
nin=nlp 2984 | |
mnl=min(mnlam,nlam) 2984 | |
shr=shri*dev0 2984 | |
al=0.0 2984 | |
ixx=0 2985 | |
18790 do 18791 j=1,ni 2985 | |
if(ju(j).eq.0)goto 18791 2986 | |
jb=ix(j) 2986 | |
je=ix(j+1)-1 2987 | |
ga(j)=abs(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(j)-ww*xb(j) 2989 | |
*)-xb(j)*tt)/xs(j) | |
18791 continue 2990 | |
18792 continue 2990 | |
18800 do 18801 ilm=1,nlam 2990 | |
al0=al 2991 | |
if(flmin .lt. 1.0)goto 18821 2991 | |
al=ulam(ilm) 2991 | |
goto 18811 2992 | |
18821 if(ilm .le. 2)goto 18831 2992 | |
al=al*alf 2992 | |
goto 18811 2993 | |
18831 if(ilm .ne. 1)goto 18841 2993 | |
al=big 2993 | |
goto 18851 2994 | |
18841 continue 2994 | |
al0=0.0 2995 | |
18860 do 18861 j=1,ni 2995 | |
if(ju(j).eq.0)goto 18861 2995 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2995 | |
18861 continue 2996 | |
18862 continue 2996 | |
al0=al0/max(bta,1.0e-3) 2996 | |
al=alf*al0 2997 | |
18851 continue 2998 | |
18811 continue 2998 | |
al2=al*omb 2998 | |
al1=al*bta 2998 | |
tlam=bta*(2.0*al-al0) 2999 | |
18870 do 18871 k=1,ni 2999 | |
if(ixx(k).eq.1)goto 18871 2999 | |
if(ju(k).eq.0)goto 18871 3000 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 3001 | |
18871 continue 3002 | |
18872 continue 3002 | |
10880 continue 3003 | |
18880 continue 3003 | |
18881 continue 3003 | |
az0=az 3004 | |
if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) 3005 | |
18890 do 18891 j=1,ni 3005 | |
if(ixx(j).eq.0)goto 18891 3005 | |
jb=ix(j) 3005 | |
je=ix(j+1)-1 3006 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 3007 | |
v(j)=(dot_product(w(jx(jb:je)),x(jb:je)**2) -2.0*xb(j)*xm(j)+ww*x 3009 | |
*b(j)**2)/xs(j)**2 | |
18891 continue 3010 | |
18892 continue 3010 | |
18900 continue 3010 | |
18901 continue 3010 | |
nlp=nlp+1 3011 | |
dlx=0.0 3012 | |
18910 do 18911 k=1,ni 3012 | |
if(ixx(k).eq.0)goto 18911 3012 | |
jb=ix(k) 3012 | |
je=ix(k+1)-1 3012 | |
ak=a(k) 3013 | |
u=(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(k)-ww*xb(k))-xb(k) 3015 | |
**tt)/xs(k)+v(k)*ak | |
au=abs(u)-vp(k)*al1 3016 | |
if(au .gt. 0.0)goto 18931 3016 | |
a(k)=0.0 3016 | |
goto 18941 3017 | |
18931 continue 3018 | |
a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 3019 | |
18941 continue 3020 | |
18921 continue 3020 | |
if(a(k).eq.ak)goto 18911 3021 | |
if(mm(k) .ne. 0)goto 18961 3021 | |
nin=nin+1 3021 | |
if(nin.gt.nx)goto 18912 3022 | |
mm(k)=nin 3022 | |
m(nin)=k 3023 | |
18961 continue 3024 | |
d=a(k)-ak 3024 | |
dlx=max(dlx,v(k)*d**2) 3024 | |
dv=d/xs(k) 3025 | |
wr(jx(jb:je))=wr(jx(jb:je))-dv*w(jx(jb:je))*x(jb:je) 3026 | |
t(jx(jb:je))=t(jx(jb:je))+dv*x(jb:je) 3027 | |
uu=uu-dv*xb(k) 3027 | |
tt=tt-dv*xm(k) 3028 | |
18911 continue 3029 | |
18912 continue 3029 | |
if(nin.gt.nx)goto 18902 3030 | |
if(intr .eq. 0)goto 18981 3030 | |
d=tt/ww-uu 3031 | |
az=az+d 3031 | |
dlx=max(dlx,ww*d**2) 3031 | |
uu=uu+d 3032 | |
18981 continue 3033 | |
if(dlx.lt.shr)goto 18902 3033 | |
if(nlp .le. maxit)goto 19001 3033 | |
jerr=-ilm 3033 | |
return 3033 | |
19001 continue 3034 | |
19010 continue 3034 | |
19011 continue 3034 | |
nlp=nlp+1 3034 | |
dlx=0.0 3035 | |
19020 do 19021 l=1,nin 3035 | |
k=m(l) 3036 | |
jb=ix(k) 3036 | |
je=ix(k+1)-1 3036 | |
ak=a(k) 3037 | |
u=(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(k)-ww*xb(k))-xb(k) 3039 | |
**tt)/xs(k)+v(k)*ak | |
au=abs(u)-vp(k)*al1 3040 | |
if(au .gt. 0.0)goto 19041 3040 | |
a(k)=0.0 3040 | |
goto 19051 3041 | |
19041 continue 3042 | |
a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 3043 | |
19051 continue 3044 | |
19031 continue 3044 | |
if(a(k).eq.ak)goto 19021 3044 | |
d=a(k)-ak 3044 | |
dlx=max(dlx,v(k)*d**2) 3045 | |
dv=d/xs(k) 3045 | |
wr(jx(jb:je))=wr(jx(jb:je))-dv*w(jx(jb:je))*x(jb:je) 3046 | |
t(jx(jb:je))=t(jx(jb:je))+dv*x(jb:je) 3047 | |
uu=uu-dv*xb(k) 3047 | |
tt=tt-dv*xm(k) 3048 | |
19021 continue 3049 | |
19022 continue 3049 | |
if(intr .eq. 0)goto 19071 3049 | |
d=tt/ww-uu 3049 | |
az=az+d 3050 | |
dlx=max(dlx,ww*d**2) 3050 | |
uu=uu+d 3051 | |
19071 continue 3052 | |
if(dlx.lt.shr)goto 19012 3052 | |
if(nlp .le. maxit)goto 19091 3052 | |
jerr=-ilm 3052 | |
return 3052 | |
19091 continue 3053 | |
goto 19011 3054 | |
19012 continue 3054 | |
goto 18901 3055 | |
18902 continue 3055 | |
if(nin.gt.nx)goto 18882 3056 | |
euu=exp(sign(min(abs(uu),fmax),uu)) 3057 | |
w=euu*q*exp(sign(min(abs(t),fmax),t)) 3057 | |
ww=sum(w) 3058 | |
wr=qy-w*(1.0-uu) 3058 | |
tt=sum(wr) 3059 | |
if(ww*(az-az0)**2 .ge. shr)goto 19111 3059 | |
kx=0 3060 | |
19120 do 19121 j=1,nin 3060 | |
k=m(j) 3061 | |
if(v(k)*(a(k)-as(k))**2.lt.shr)goto 19121 3061 | |
kx=1 3061 | |
goto 19122 3062 | |
19121 continue 3063 | |
19122 continue 3063 | |
if(kx .ne. 0)goto 19141 3064 | |
19150 do 19151 j=1,ni 3064 | |
if(ixx(j).eq.1)goto 19151 3064 | |
if(ju(j).eq.0)goto 19151 3065 | |
jb=ix(j) 3065 | |
je=ix(j+1)-1 3066 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 3067 | |
ga(j)=abs(dot_product(wr(jx(jb:je)),x(jb:je)) -uu*(xm(j)-ww*xb(j) 3069 | |
*)-xb(j)*tt)/xs(j) | |
if(ga(j) .le. al1*vp(j))goto 19171 3069 | |
ixx(j)=1 3069 | |
kx=1 3069 | |
19171 continue 3070 | |
19151 continue 3071 | |
19152 continue 3071 | |
if(kx.eq.1) go to 10880 3072 | |
goto 18882 3073 | |
19141 continue 3074 | |
19111 continue 3075 | |
goto 18881 3076 | |
18882 continue 3076 | |
if(nin .le. nx)goto 19191 3076 | |
jerr=-10000-ilm 3076 | |
goto 18802 3076 | |
19191 continue 3077 | |
if(nin.gt.0) ca(1:nin,ilm)=a(m(1:nin)) 3077 | |
kin(ilm)=nin 3078 | |
a0(ilm)=az 3078 | |
alm(ilm)=al 3078 | |
lmu=ilm 3079 | |
dev(ilm)=(dot_product(qy,t)+yb*uu-ww-dv0)/dvr 3080 | |
if(ilm.lt.mnl)goto 18801 3080 | |
if(flmin.ge.1.0)goto 18801 3081 | |
me=0 3081 | |
19200 do 19201 j=1,nin 3081 | |
if(ca(j,ilm).ne.0.0) me=me+1 3081 | |
19201 continue 3081 | |
19202 continue 3081 | |
if(me.gt.ne)goto 18802 3082 | |
if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 18802 3083 | |
if(dev(ilm).gt.devmax)goto 18802 3084 | |
18801 continue 3085 | |
18802 continue 3085 | |
g=t+uu 3086 | |
12180 continue 3086 | |
deallocate(t,w,wr,v,a,qy,xm,as,mm,ga,ixx) 3087 | |
return 3088 | |
end 3089 | |
subroutine spdeviance(no,ni,x,ix,jx,y,g,q,nlam,a0,a,flog,jerr) 3090 | |
real x(*),y(no),g(no),q(no),a(ni,nlam),a0(nlam),flog(nlam) 3091 | |
integer ix(*),jx(*) 3092 | |
real, dimension (:), allocatable :: w,f | |
if(minval(y) .ge. 0.0)goto 19221 3095 | |
jerr=8888 3095 | |
return 3095 | |
19221 continue 3096 | |
allocate(w(1:no),stat=jerr) 3097 | |
allocate(f(1:no),stat=ierr) 3097 | |
jerr=jerr+ierr 3098 | |
if(jerr.ne.0) return 3099 | |
w=max(0.0,q) 3099 | |
sw=sum(w) 3099 | |
if(sw .gt. 0.0)goto 19241 3099 | |
jerr=9999 3099 | |
go to 12180 3099 | |
19241 continue 3100 | |
yb=dot_product(w,y)/sw 3100 | |
fmax=log(huge(y(1))*0.1) 3101 | |
19250 do 19251 lam=1,nlam 3101 | |
f=a0(lam) 3102 | |
19260 do 19261 j=1,ni 3102 | |
if(a(j,lam).eq.0.0)goto 19261 3102 | |
jb=ix(j) 3102 | |
je=ix(j+1)-1 3103 | |
f(jx(jb:je))=f(jx(jb:je))+a(j,lam)*x(jb:je) 3104 | |
19261 continue 3105 | |
19262 continue 3105 | |
f=f+g 3106 | |
s=dot_product(w,y*f-exp(sign(min(abs(f),fmax),f))) 3107 | |
flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s) 3108 | |
19251 continue 3109 | |
19252 continue 3109 | |
12180 continue 3109 | |
deallocate(w,f) 3110 | |
return 3111 | |
end 3112 | |
subroutine cspdeviance(no,x,ix,jx,y,g,q,nx,nlam,a0,ca,ia,nin,flog, 3113 | |
*jerr) | |
real x(*),y(no),g(no),q(no),ca(nx,nlam),a0(nlam),flog(nlam) 3114 | |
integer ix(*),jx(*),nin(nlam),ia(nx) 3115 | |
real, dimension (:), allocatable :: w,f | |
if(minval(y) .ge. 0.0)goto 19281 3118 | |
jerr=8888 3118 | |
return 3118 | |
19281 continue 3119 | |
allocate(w(1:no),stat=jerr) 3120 | |
allocate(f(1:no),stat=ierr) 3120 | |
jerr=jerr+ierr 3121 | |
if(jerr.ne.0) return 3122 | |
w=max(0.0,q) 3122 | |
sw=sum(w) 3122 | |
if(sw .gt. 0.0)goto 19301 3122 | |
jerr=9999 3122 | |
go to 12180 3122 | |
19301 continue 3123 | |
yb=dot_product(w,y)/sw 3123 | |
fmax=log(huge(y(1))*0.1) 3124 | |
19310 do 19311 lam=1,nlam 3124 | |
f=a0(lam) 3125 | |
19320 do 19321 k=1,nin(lam) 3125 | |
j=ia(k) 3125 | |
jb=ix(j) 3125 | |
je=ix(j+1)-1 3126 | |
f(jx(jb:je))=f(jx(jb:je))+ca(k,lam)*x(jb:je) 3127 | |
19321 continue 3128 | |
19322 continue 3128 | |
f=f+g 3129 | |
s=dot_product(w,y*f-exp(sign(min(abs(f),fmax),f))) 3130 | |
flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s) 3131 | |
19311 continue 3132 | |
19312 continue 3132 | |
12180 continue 3132 | |
deallocate(w,f) 3133 | |
return 3134 | |
end 3135 | |
subroutine multelnet (parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam,flm 3138 | |
*in,ulam,thr,isd,jsd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr | |
*) | |
real x(no,ni),y(no,nr),w(no),vp(ni),ca(nx,nr,nlam) 3139 | |
real ulam(nlam),a0(nr,nlam),rsq(nlam),alm(nlam),cl(2,ni) 3140 | |
integer jd(*),ia(nx),nin(nlam) 3141 | |
real, dimension (:), allocatable :: vq; | |
if(maxval(vp) .gt. 0.0)goto 19341 3144 | |
jerr=10000 3144 | |
return 3144 | |
19341 continue 3145 | |
allocate(vq(1:ni),stat=jerr) 3145 | |
if(jerr.ne.0) return 3146 | |
vq=max(0.0,vp) 3146 | |
vq=vq*ni/sum(vq) 3147 | |
call multelnetn(parm,no,ni,nr,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam 3149 | |
*,thr,isd, jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
deallocate(vq) 3150 | |
return 3151 | |
end 3152 | |
subroutine multelnetn (parm,no,ni,nr,x,y,w,jd,vp,cl,ne,nx,nlam,flm 3154 | |
*in,ulam,thr, isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr | |
*) | |
real vp(ni),x(no,ni),y(no,nr),w(no),ulam(nlam),cl(2,ni) 3155 | |
real ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam) 3156 | |
integer jd(*),ia(nx),nin(nlam) 3157 | |
real, dimension (:), allocatable :: xm,xs,xv,ym,ys | |
integer, dimension (:), allocatable :: ju | |
real, dimension (:,:,:), allocatable :: clt | |
allocate(clt(1:2,1:nr,1:ni),stat=jerr); | |
allocate(xm(1:ni),stat=ierr) 3163 | |
jerr=jerr+ierr 3164 | |
allocate(xs(1:ni),stat=ierr) 3164 | |
jerr=jerr+ierr 3165 | |
allocate(ym(1:nr),stat=ierr) 3165 | |
jerr=jerr+ierr 3166 | |
allocate(ys(1:nr),stat=ierr) 3166 | |
jerr=jerr+ierr 3167 | |
allocate(ju(1:ni),stat=ierr) 3167 | |
jerr=jerr+ierr 3168 | |
allocate(xv(1:ni),stat=ierr) 3168 | |
jerr=jerr+ierr 3169 | |
if(jerr.ne.0) return 3170 | |
call chkvars(no,ni,x,ju) 3171 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 3172 | |
if(maxval(ju) .gt. 0)goto 19361 3172 | |
jerr=7777 3172 | |
return 3172 | |
19361 continue 3173 | |
call multstandard1(no,ni,nr,x,y,w,isd,jsd,intr,ju,xm,xs,ym,ys,xv,y 3174 | |
*s0,jerr) | |
if(jerr.ne.0) return 3175 | |
19370 do 19371 j=1,ni 3175 | |
19380 do 19381 k=1,nr 3175 | |
19390 do 19391 i=1,2 3175 | |
clt(i,k,j)=cl(i,j) 3175 | |
19391 continue 3175 | |
19392 continue 3175 | |
19381 continue 3175 | |
19382 continue 3175 | |
19371 continue 3176 | |
19372 continue 3176 | |
if(isd .le. 0)goto 19411 3176 | |
19420 do 19421 j=1,ni 3176 | |
19430 do 19431 k=1,nr 3176 | |
19440 do 19441 i=1,2 3176 | |
clt(i,k,j)=clt(i,k,j)*xs(j) 3176 | |
19441 continue 3176 | |
19442 continue 3176 | |
19431 continue 3176 | |
19432 continue 3176 | |
19421 continue 3176 | |
19422 continue 3176 | |
19411 continue 3177 | |
if(jsd .le. 0)goto 19461 3177 | |
19470 do 19471 j=1,ni 3177 | |
19480 do 19481 k=1,nr 3177 | |
19490 do 19491 i=1,2 3177 | |
clt(i,k,j)=clt(i,k,j)/ys(k) 3177 | |
19491 continue 3177 | |
19492 continue 3177 | |
19481 continue 3177 | |
19482 continue 3177 | |
19471 continue 3177 | |
19472 continue 3177 | |
19461 continue 3178 | |
call multelnet2(parm,ni,nr,ju,vp,clt,y,no,ne,nx,x,nlam,flmin,ulam, 3180 | |
*thr,maxit,xv, ys0,lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 3181 | |
19500 do 19501 k=1,lmu 3181 | |
nk=nin(k) 3182 | |
19510 do 19511 j=1,nr 3183 | |
19520 do 19521 l=1,nk 3183 | |
ca(l,j,k)=ys(j)*ca(l,j,k)/xs(ia(l)) 3183 | |
19521 continue 3184 | |
19522 continue 3184 | |
if(intr .ne. 0)goto 19541 3184 | |
a0(j,k)=0.0 3184 | |
goto 19551 3185 | |
19541 continue 3185 | |
a0(j,k)=ym(j)-dot_product(ca(1:nk,j,k),xm(ia(1:nk))) 3185 | |
19551 continue 3186 | |
19531 continue 3186 | |
19511 continue 3187 | |
19512 continue 3187 | |
19501 continue 3188 | |
19502 continue 3188 | |
deallocate(xm,xs,ym,ys,ju,xv,clt) 3189 | |
return 3190 | |
end 3191 | |
subroutine multstandard1 (no,ni,nr,x,y,w,isd,jsd,intr,ju,xm,xs,ym 3193 | |
*,ys,xv,ys0,jerr) | |
real x(no,ni),y(no,nr),w(no),xm(ni),xs(ni),xv(ni),ym(nr),ys(nr) 3194 | |
integer ju(ni) 3195 | |
real, dimension (:), allocatable :: v | |
allocate(v(1:no),stat=jerr) 3198 | |
if(jerr.ne.0) return 3199 | |
w=w/sum(w) 3199 | |
v=sqrt(w) 3200 | |
if(intr .ne. 0)goto 19571 3201 | |
19580 do 19581 j=1,ni 3201 | |
if(ju(j).eq.0)goto 19581 3201 | |
xm(j)=0.0 3201 | |
x(:,j)=v*x(:,j) 3202 | |
z=dot_product(x(:,j),x(:,j)) 3203 | |
if(isd .le. 0)goto 19601 3203 | |
xbq=dot_product(v,x(:,j))**2 3203 | |
vc=z-xbq 3204 | |
xs(j)=sqrt(vc) 3204 | |
x(:,j)=x(:,j)/xs(j) 3204 | |
xv(j)=1.0+xbq/vc 3205 | |
goto 19611 3206 | |
19601 continue 3206 | |
xs(j)=1.0 3206 | |
xv(j)=z 3206 | |
19611 continue 3207 | |
19591 continue 3207 | |
19581 continue 3208 | |
19582 continue 3208 | |
ys0=0.0 3209 | |
19620 do 19621 j=1,nr 3209 | |
ym(j)=0.0 3209 | |
y(:,j)=v*y(:,j) 3210 | |
z=dot_product(y(:,j),y(:,j)) 3211 | |
if(jsd .le. 0)goto 19641 3211 | |
u=z-dot_product(v,y(:,j))**2 3211 | |
ys0=ys0+z/u 3212 | |
ys(j)=sqrt(u) 3212 | |
y(:,j)=y(:,j)/ys(j) 3213 | |
goto 19651 3214 | |
19641 continue 3214 | |
ys(j)=1.0 3214 | |
ys0=ys0+z 3214 | |
19651 continue 3215 | |
19631 continue 3215 | |
19621 continue 3216 | |
19622 continue 3216 | |
go to 10700 3217 | |
19571 continue 3218 | |
19660 do 19661 j=1,ni 3218 | |
if(ju(j).eq.0)goto 19661 3219 | |
xm(j)=dot_product(w,x(:,j)) 3219 | |
x(:,j)=v*(x(:,j)-xm(j)) 3220 | |
xv(j)=dot_product(x(:,j),x(:,j)) 3220 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 3221 | |
19661 continue 3222 | |
19662 continue 3222 | |
if(isd .ne. 0)goto 19681 3222 | |
xs=1.0 3222 | |
goto 19691 3223 | |
19681 continue 3223 | |
19700 do 19701 j=1,ni 3223 | |
if(ju(j).eq.0)goto 19701 3223 | |
x(:,j)=x(:,j)/xs(j) 3223 | |
19701 continue 3224 | |
19702 continue 3224 | |
xv=1.0 3225 | |
19691 continue 3226 | |
19671 continue 3226 | |
ys0=0.0 3227 | |
19710 do 19711 j=1,nr 3228 | |
ym(j)=dot_product(w,y(:,j)) 3228 | |
y(:,j)=v*(y(:,j)-ym(j)) 3229 | |
z=dot_product(y(:,j),y(:,j)) 3230 | |
if(jsd .le. 0)goto 19731 3230 | |
ys(j)=sqrt(z) 3230 | |
y(:,j)=y(:,j)/ys(j) 3230 | |
goto 19741 3231 | |
19731 continue 3231 | |
ys0=ys0+z 3231 | |
19741 continue 3232 | |
19721 continue 3232 | |
19711 continue 3233 | |
19712 continue 3233 | |
if(jsd .ne. 0)goto 19761 3233 | |
ys=1.0 3233 | |
goto 19771 3233 | |
19761 continue 3233 | |
ys0=nr 3233 | |
19771 continue 3234 | |
19751 continue 3234 | |
10700 continue 3234 | |
deallocate(v) 3235 | |
return 3236 | |
end 3237 | |
subroutine multelnet2(beta,ni,nr,ju,vp,cl,y,no,ne,nx,x,nlam,flmin, 3239 | |
*ulam,thri, maxit,xv,ys0,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
real vp(ni),y(no,nr),x(no,ni),ulam(nlam),ao(nx,nr,nlam) 3240 | |
real rsqo(nlam),almo(nlam),xv(ni),cl(2,nr,ni) 3241 | |
integer ju(ni),ia(nx),kin(nlam) 3242 | |
real, dimension (:), allocatable :: g,gk,del,gj | |
integer, dimension (:), allocatable :: mm,ix,isc | |
real, dimension (:,:), allocatable :: a | |
allocate(a(1:nr,1:ni),stat=jerr) | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 3249 | |
allocate(gj(1:nr),stat=ierr) 3249 | |
jerr=jerr+ierr 3250 | |
allocate(gk(1:nr),stat=ierr) 3250 | |
jerr=jerr+ierr 3251 | |
allocate(del(1:nr),stat=ierr) 3251 | |
jerr=jerr+ierr 3252 | |
allocate(mm(1:ni),stat=ierr) 3252 | |
jerr=jerr+ierr 3253 | |
allocate(g(1:ni),stat=ierr) 3253 | |
jerr=jerr+ierr 3254 | |
allocate(ix(1:ni),stat=ierr) 3254 | |
jerr=jerr+ierr 3255 | |
allocate(isc(1:nr),stat=ierr) 3255 | |
jerr=jerr+ierr 3256 | |
if(jerr.ne.0) return 3257 | |
bta=beta 3257 | |
omb=1.0-bta 3257 | |
ix=0 3257 | |
thr=thri*ys0/nr 3258 | |
if(flmin .ge. 1.0)goto 19791 3258 | |
eqs=max(eps,flmin) 3258 | |
alf=eqs**(1.0/(nlam-1)) 3258 | |
19791 continue 3259 | |
rsq=ys0 3259 | |
a=0.0 3259 | |
mm=0 3259 | |
nlp=0 3259 | |
nin=nlp 3259 | |
iz=0 3259 | |
mnl=min(mnlam,nlam) 3259 | |
alm=0.0 3260 | |
19800 do 19801 j=1,ni 3260 | |
if(ju(j).eq.0)goto 19801 3260 | |
g(j)=0.0 3261 | |
19810 do 19811 k=1,nr 3261 | |
g(j)=g(j)+dot_product(y(:,k),x(:,j))**2 3261 | |
19811 continue 3262 | |
19812 continue 3262 | |
g(j)=sqrt(g(j)) 3263 | |
19801 continue 3264 | |
19802 continue 3264 | |
19820 do 19821 m=1,nlam 3264 | |
alm0=alm 3265 | |
if(flmin .lt. 1.0)goto 19841 3265 | |
alm=ulam(m) 3265 | |
goto 19831 3266 | |
19841 if(m .le. 2)goto 19851 3266 | |
alm=alm*alf 3266 | |
goto 19831 3267 | |
19851 if(m .ne. 1)goto 19861 3267 | |
alm=big 3267 | |
goto 19871 3268 | |
19861 continue 3268 | |
alm0=0.0 3269 | |
19880 do 19881 j=1,ni 3269 | |
if(ju(j).eq.0)goto 19881 3270 | |
if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 3271 | |
19881 continue 3272 | |
19882 continue 3272 | |
alm0=alm0/max(bta,1.0e-3) 3272 | |
alm=alf*alm0 3273 | |
19871 continue 3274 | |
19831 continue 3274 | |
dem=alm*omb 3274 | |
ab=alm*bta 3274 | |
rsq0=rsq 3274 | |
jz=1 3275 | |
tlam=bta*(2.0*alm-alm0) 3276 | |
19890 do 19891 k=1,ni 3276 | |
if(ix(k).eq.1)goto 19891 3276 | |
if(ju(k).eq.0)goto 19891 3277 | |
if(g(k).gt.tlam*vp(k)) ix(k)=1 3278 | |
19891 continue 3279 | |
19892 continue 3279 | |
19900 continue 3279 | |
19901 continue 3279 | |
if(iz*jz.ne.0) go to 10360 3280 | |
10880 continue 3280 | |
nlp=nlp+1 3280 | |
dlx=0.0 3281 | |
19910 do 19911 k=1,ni 3281 | |
if(ix(k).eq.0)goto 19911 3281 | |
gkn=0.0 3282 | |
19920 do 19921 j=1,nr 3282 | |
gj(j)=dot_product(y(:,j),x(:,k)) 3283 | |
gk(j)=gj(j)+a(j,k)*xv(k) 3283 | |
gkn=gkn+gk(j)**2 3285 | |
19921 continue 3285 | |
19922 continue 3285 | |
gkn=sqrt(gkn) 3285 | |
u=1.0-ab*vp(k)/gkn 3285 | |
del=a(:,k) 3286 | |
if(u .gt. 0.0)goto 19941 3286 | |
a(:,k)=0.0 3286 | |
goto 19951 3287 | |
19941 continue 3287 | |
a(:,k)=gk*(u/(xv(k)+dem*vp(k))) 3288 | |
call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) 3290 | |
*,isc,jerr) | |
if(jerr.ne.0) return 3291 | |
19951 continue 3292 | |
19931 continue 3292 | |
del=a(:,k)-del 3292 | |
if(maxval(abs(del)).le.0.0)goto 19911 3293 | |
19960 do 19961 j=1,nr 3293 | |
rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) 3294 | |
y(:,j)=y(:,j)-del(j)*x(:,k) 3294 | |
dlx=max(dlx,xv(k)*del(j)**2) 3295 | |
19961 continue 3296 | |
19962 continue 3296 | |
if(mm(k) .ne. 0)goto 19981 3296 | |
nin=nin+1 3296 | |
if(nin.gt.nx)goto 19912 3297 | |
mm(k)=nin 3297 | |
ia(nin)=k 3298 | |
19981 continue 3299 | |
19911 continue 3300 | |
19912 continue 3300 | |
if(nin.gt.nx)goto 19902 3301 | |
if(dlx .ge. thr)goto 20001 3301 | |
ixx=0 3302 | |
20010 do 20011 k=1,ni 3302 | |
if(ix(k).eq.1)goto 20011 3302 | |
if(ju(k).eq.0)goto 20011 3302 | |
g(k)=0.0 3303 | |
20020 do 20021 j=1,nr 3303 | |
g(k)=g(k)+dot_product(y(:,j),x(:,k))**2 3303 | |
20021 continue 3304 | |
20022 continue 3304 | |
g(k)=sqrt(g(k)) 3305 | |
if(g(k) .le. ab*vp(k))goto 20041 3305 | |
ix(k)=1 3305 | |
ixx=1 3305 | |
20041 continue 3306 | |
20011 continue 3307 | |
20012 continue 3307 | |
if(ixx.eq.1) go to 10880 3308 | |
goto 19902 3309 | |
20001 continue 3310 | |
if(nlp .le. maxit)goto 20061 3310 | |
jerr=-m 3310 | |
return 3310 | |
20061 continue 3311 | |
10360 continue 3311 | |
iz=1 3312 | |
20070 continue 3312 | |
20071 continue 3312 | |
nlp=nlp+1 3312 | |
dlx=0.0 3313 | |
20080 do 20081 l=1,nin 3313 | |
k=ia(l) 3313 | |
gkn=0.0 3314 | |
20090 do 20091 j=1,nr 3314 | |
gj(j)=dot_product(y(:,j),x(:,k)) 3315 | |
gk(j)=gj(j)+a(j,k)*xv(k) 3315 | |
gkn=gkn+gk(j)**2 3317 | |
20091 continue 3317 | |
20092 continue 3317 | |
gkn=sqrt(gkn) 3317 | |
u=1.0-ab*vp(k)/gkn 3317 | |
del=a(:,k) 3318 | |
if(u .gt. 0.0)goto 20111 3318 | |
a(:,k)=0.0 3318 | |
goto 20121 3319 | |
20111 continue 3319 | |
a(:,k)=gk*(u/(xv(k)+dem*vp(k))) 3320 | |
call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) 3322 | |
*,isc,jerr) | |
if(jerr.ne.0) return 3323 | |
20121 continue 3324 | |
20101 continue 3324 | |
del=a(:,k)-del 3324 | |
if(maxval(abs(del)).le.0.0)goto 20081 3325 | |
20130 do 20131 j=1,nr 3325 | |
rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) 3326 | |
y(:,j)=y(:,j)-del(j)*x(:,k) 3326 | |
dlx=max(dlx,xv(k)*del(j)**2) 3327 | |
20131 continue 3328 | |
20132 continue 3328 | |
20081 continue 3329 | |
20082 continue 3329 | |
if(dlx.lt.thr)goto 20072 3329 | |
if(nlp .le. maxit)goto 20151 3329 | |
jerr=-m 3329 | |
return 3329 | |
20151 continue 3330 | |
goto 20071 3331 | |
20072 continue 3331 | |
jz=0 3332 | |
goto 19901 3333 | |
19902 continue 3333 | |
if(nin .le. nx)goto 20171 3333 | |
jerr=-10000-m 3333 | |
goto 19822 3333 | |
20171 continue 3334 | |
if(nin .le. 0)goto 20191 3334 | |
20200 do 20201 j=1,nr 3334 | |
ao(1:nin,j,m)=a(j,ia(1:nin)) 3334 | |
20201 continue 3334 | |
20202 continue 3334 | |
20191 continue 3335 | |
kin(m)=nin 3336 | |
rsqo(m)=1.0-rsq/ys0 3336 | |
almo(m)=alm 3336 | |
lmu=m 3337 | |
if(m.lt.mnl)goto 19821 3337 | |
if(flmin.ge.1.0)goto 19821 3338 | |
me=0 3338 | |
20210 do 20211 j=1,nin 3338 | |
if(ao(j,1,m).ne.0.0) me=me+1 3338 | |
20211 continue 3338 | |
20212 continue 3338 | |
if(me.gt.ne)goto 19822 3339 | |
if(rsq0-rsq.lt.sml*rsq)goto 19822 3339 | |
if(rsqo(m).gt.rsqmax)goto 19822 3340 | |
19821 continue 3341 | |
19822 continue 3341 | |
deallocate(a,mm,g,ix,del,gj,gk) 3342 | |
return 3343 | |
end 3344 | |
subroutine chkbnds(nr,gk,gkn,xv,cl,al1,al2,a,isc,jerr) 3345 | |
real gk(nr),cl(2,nr),a(nr) 3345 | |
integer isc(nr) 3346 | |
kerr=0 3346 | |
al1p=1.0+al1/xv 3346 | |
al2p=al2/xv 3346 | |
isc=0 3347 | |
gsq=gkn**2 3347 | |
asq=dot_product(a,a) 3347 | |
usq=0.0 3348 | |
20220 continue 3348 | |
20221 continue 3348 | |
vmx=0.0 3349 | |
20230 do 20231 k=1,nr 3349 | |
v=max(a(k)-cl(2,k),cl(1,k)-a(k)) 3350 | |
if(v .le. vmx)goto 20251 3350 | |
vmx=v 3350 | |
kn=k 3350 | |
20251 continue 3351 | |
20231 continue 3352 | |
20232 continue 3352 | |
if(vmx.le.0.0)goto 20222 3352 | |
if(isc(kn).ne.0)goto 20222 3353 | |
gsq=gsq-gk(kn)**2 3353 | |
g=sqrt(gsq)/xv 3354 | |
if(a(kn).lt.cl(1,kn)) u=cl(1,kn) 3354 | |
if(a(kn).gt.cl(2,kn)) u=cl(2,kn) 3355 | |
usq=usq+u**2 3356 | |
if(usq .ne. 0.0)goto 20271 3356 | |
b=max(0.0,(g-al2p)/al1p) 3356 | |
goto 20281 3357 | |
20271 continue 3357 | |
b0=sqrt(asq-a(kn)**2) 3358 | |
b=bnorm(b0,al1p,al2p,g,usq,kerr) 3358 | |
if(kerr.ne.0)goto 20222 3359 | |
20281 continue 3360 | |
20261 continue 3360 | |
asq=usq+b**2 3360 | |
if(asq .gt. 0.0)goto 20301 3360 | |
a=0.0 3360 | |
goto 20222 3360 | |
20301 continue 3361 | |
a(kn)=u 3361 | |
isc(kn)=1 3361 | |
f=1.0/(xv*(al1p+al2p/sqrt(asq))) 3362 | |
20310 do 20311 j=1,nr 3362 | |
if(isc(j).eq.0) a(j)=f*gk(j) 3362 | |
20311 continue 3363 | |
20312 continue 3363 | |
goto 20221 3364 | |
20222 continue 3364 | |
if(kerr.ne.0) jerr=kerr 3365 | |
return 3366 | |
end 3367 | |
subroutine chkbnds1(nr,gk,gkn,xv,cl1,cl2,al1,al2,a,isc,jerr) 3368 | |
real gk(nr),a(nr) 3368 | |
integer isc(nr) 3369 | |
kerr=0 3369 | |
al1p=1.0+al1/xv 3369 | |
al2p=al2/xv 3369 | |
isc=0 3370 | |
gsq=gkn**2 3370 | |
asq=dot_product(a,a) 3370 | |
usq=0.0 3371 | |
20320 continue 3371 | |
20321 continue 3371 | |
vmx=0.0 3372 | |
20330 do 20331 k=1,nr 3372 | |
v=max(a(k)-cl2,cl1-a(k)) 3373 | |
if(v .le. vmx)goto 20351 3373 | |
vmx=v 3373 | |
kn=k 3373 | |
20351 continue 3374 | |
20331 continue 3375 | |
20332 continue 3375 | |
if(vmx.le.0.0)goto 20322 3375 | |
if(isc(kn).ne.0)goto 20322 3376 | |
gsq=gsq-gk(kn)**2 3376 | |
g=sqrt(gsq)/xv 3377 | |
if(a(kn).lt.cl1) u=cl1 3377 | |
if(a(kn).gt.cl2) u=cl2 3378 | |
usq=usq+u**2 3379 | |
if(usq .ne. 0.0)goto 20371 3379 | |
b=max(0.0,(g-al2p)/al1p) 3379 | |
goto 20381 3380 | |
20371 continue 3380 | |
b0=sqrt(asq-a(kn)**2) 3381 | |
b=bnorm(b0,al1p,al2p,g,usq,kerr) 3381 | |
if(kerr.ne.0)goto 20322 3382 | |
20381 continue 3383 | |
20361 continue 3383 | |
asq=usq+b**2 3383 | |
if(asq .gt. 0.0)goto 20401 3383 | |
a=0.0 3383 | |
goto 20322 3383 | |
20401 continue 3384 | |
a(kn)=u 3384 | |
isc(kn)=1 3384 | |
f=1.0/(xv*(al1p+al2p/sqrt(asq))) 3385 | |
20410 do 20411 j=1,nr 3385 | |
if(isc(j).eq.0) a(j)=f*gk(j) 3385 | |
20411 continue 3386 | |
20412 continue 3386 | |
goto 20321 3387 | |
20322 continue 3387 | |
if(kerr.ne.0) jerr=kerr 3388 | |
return 3389 | |
end 3390 | |
function bnorm(b0,al1p,al2p,g,usq,jerr) 3391 | |
data thr,mxit /1.0e-10,100/ 3392 | |
b=b0 3392 | |
zsq=b**2+usq 3392 | |
if(zsq .gt. 0.0)goto 20431 3392 | |
bnorm=0.0 3392 | |
return 3392 | |
20431 continue 3393 | |
z=sqrt(zsq) 3393 | |
f=b*(al1p+al2p/z)-g 3393 | |
jerr=0 3394 | |
20440 do 20441 it=1,mxit 3394 | |
b=b-f/(al1p+al2p*usq/(z*zsq)) 3395 | |
zsq=b**2+usq 3395 | |
if(zsq .gt. 0.0)goto 20461 3395 | |
bnorm=0.0 3395 | |
return 3395 | |
20461 continue 3396 | |
z=sqrt(zsq) 3396 | |
f=b*(al1p+al2p/z)-g 3397 | |
if(abs(f).le.thr)goto 20442 3397 | |
if(b .gt. 0.0)goto 20481 3397 | |
b=0.0 3397 | |
goto 20442 3397 | |
20481 continue 3398 | |
20441 continue 3399 | |
20442 continue 3399 | |
bnorm=b 3399 | |
if(it.ge.mxit) jerr=90000 3400 | |
return 3401 | |
entry chg_bnorm(arg,irg) 3401 | |
chg_bnorm=0.0 3401 | |
thr=arg 3401 | |
mxit=irg 3401 | |
return 3402 | |
entry get_bnorm(arg,irg) 3402 | |
bnorm=0.0 3401 | |
arg=thr 3402 | |
irg=mxit 3402 | |
return 3403 | |
end 3404 | |
subroutine multsolns(ni,nx,nr,lmu,a,ia,nin,b) 3405 | |
real a(nx,nr,lmu),b(ni,nr,lmu) 3405 | |
integer ia(nx),nin(lmu) 3406 | |
20490 do 20491 lam=1,lmu 3406 | |
call multuncomp(ni,nr,nx,a(1,1,lam),ia,nin(lam),b(1,1,lam)) 3406 | |
20491 continue 3407 | |
20492 continue 3407 | |
return 3408 | |
end 3409 | |
subroutine multuncomp(ni,nr,nx,ca,ia,nin,a) 3410 | |
real ca(nx,nr),a(ni,nr) 3410 | |
integer ia(nx) 3411 | |
a=0.0 3412 | |
if(nin .le. 0)goto 20511 3412 | |
20520 do 20521 j=1,nr 3412 | |
a(ia(1:nin),j)=ca(1:nin,j) 3412 | |
20521 continue 3412 | |
20522 continue 3412 | |
20511 continue 3413 | |
return 3414 | |
end 3415 | |
subroutine multmodval(nx,nr,a0,ca,ia,nin,n,x,f) 3416 | |
real a0(nr),ca(nx,nr),x(n,*),f(nr,n) 3416 | |
integer ia(nx) 3417 | |
20530 do 20531 i=1,n 3417 | |
f(:,i)=a0 3417 | |
20531 continue 3417 | |
20532 continue 3417 | |
if(nin.le.0) return 3418 | |
20540 do 20541 i=1,n 3418 | |
20550 do 20551 j=1,nr 3418 | |
f(j,i)=f(j,i)+dot_product(ca(1:nin,j),x(i,ia(1:nin))) 3418 | |
20551 continue 3418 | |
20552 continue 3418 | |
20541 continue 3419 | |
20542 continue 3419 | |
return 3420 | |
end 3421 | |
subroutine multspelnet (parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx, 3424 | |
*nlam,flmin,ulam,thr,isd, jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm, | |
*nlp,jerr) | |
real x(*),y(no,nr),w(no),vp(ni),ulam(nlam),cl(2,ni) 3425 | |
real ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam) 3426 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 3427 | |
real, dimension (:), allocatable :: vq; | |
if(maxval(vp) .gt. 0.0)goto 20571 3430 | |
jerr=10000 3430 | |
return 3430 | |
20571 continue 3431 | |
allocate(vq(1:ni),stat=jerr) 3431 | |
if(jerr.ne.0) return 3432 | |
vq=max(0.0,vp) 3432 | |
vq=vq*ni/sum(vq) 3433 | |
call multspelnetn(parm,no,ni,nr,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,fl 3435 | |
*min, ulam,thr,isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jer | |
*r) | |
deallocate(vq) 3436 | |
return 3437 | |
end 3438 | |
subroutine multspelnetn(parm,no,ni,nr,x,ix,jx,y,w,jd,vp,cl,ne,nx,n 3440 | |
*lam,flmin, ulam,thr,isd,jsd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,n | |
*lp,jerr) | |
real x(*),vp(ni),y(no,nr),w(no),ulam(nlam),cl(2,ni) 3441 | |
real ca(nx,nr,nlam),a0(nr,nlam),rsq(nlam),alm(nlam) 3442 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 3443 | |
real, dimension (:), allocatable :: xm,xs,xv,ym,ys | |
integer, dimension (:), allocatable :: ju | |
real, dimension (:,:,:), allocatable :: clt | |
allocate(clt(1:2,1:nr,1:ni),stat=jerr) | |
allocate(xm(1:ni),stat=ierr) 3449 | |
jerr=jerr+ierr 3450 | |
allocate(xs(1:ni),stat=ierr) 3450 | |
jerr=jerr+ierr 3451 | |
allocate(ym(1:nr),stat=ierr) 3451 | |
jerr=jerr+ierr 3452 | |
allocate(ys(1:nr),stat=ierr) 3452 | |
jerr=jerr+ierr 3453 | |
allocate(ju(1:ni),stat=ierr) 3453 | |
jerr=jerr+ierr 3454 | |
allocate(xv(1:ni),stat=ierr) 3454 | |
jerr=jerr+ierr 3455 | |
if(jerr.ne.0) return 3456 | |
call spchkvars(no,ni,x,ix,ju) 3457 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 3458 | |
if(maxval(ju) .gt. 0)goto 20591 3458 | |
jerr=7777 3458 | |
return 3458 | |
20591 continue 3459 | |
call multspstandard1(no,ni,nr,x,ix,jx,y,w,ju,isd,jsd,intr, xm,xs, 3461 | |
*ym,ys,xv,ys0,jerr) | |
if(jerr.ne.0) return 3462 | |
20600 do 20601 j=1,ni 3462 | |
20610 do 20611 k=1,nr 3462 | |
20620 do 20621 i=1,2 3462 | |
clt(i,k,j)=cl(i,j) 3462 | |
20621 continue 3462 | |
20622 continue 3462 | |
20611 continue 3462 | |
20612 continue 3462 | |
20601 continue 3463 | |
20602 continue 3463 | |
if(isd .le. 0)goto 20641 3463 | |
20650 do 20651 j=1,ni 3463 | |
20660 do 20661 k=1,nr 3463 | |
20670 do 20671 i=1,2 3463 | |
clt(i,k,j)=clt(i,k,j)*xs(j) 3463 | |
20671 continue 3463 | |
20672 continue 3463 | |
20661 continue 3463 | |
20662 continue 3463 | |
20651 continue 3463 | |
20652 continue 3463 | |
20641 continue 3464 | |
if(jsd .le. 0)goto 20691 3464 | |
20700 do 20701 j=1,ni 3464 | |
20710 do 20711 k=1,nr 3464 | |
20720 do 20721 i=1,2 3464 | |
clt(i,k,j)=clt(i,k,j)/ys(k) 3464 | |
20721 continue 3464 | |
20722 continue 3464 | |
20711 continue 3464 | |
20712 continue 3464 | |
20701 continue 3464 | |
20702 continue 3464 | |
20691 continue 3465 | |
call multspelnet2(parm,ni,nr,y,w,no,ne,nx,x,ix,jx,ju,vp,clt,nlam,f 3467 | |
*lmin, ulam,thr,maxit,xm,xs,xv,ys0,lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 3468 | |
20730 do 20731 k=1,lmu 3468 | |
nk=nin(k) 3469 | |
20740 do 20741 j=1,nr 3470 | |
20750 do 20751 l=1,nk 3470 | |
ca(l,j,k)=ys(j)*ca(l,j,k)/xs(ia(l)) 3470 | |
20751 continue 3471 | |
20752 continue 3471 | |
if(intr .ne. 0)goto 20771 3471 | |
a0(j,k)=0.0 3471 | |
goto 20781 3472 | |
20771 continue 3472 | |
a0(j,k)=ym(j)-dot_product(ca(1:nk,j,k),xm(ia(1:nk))) 3472 | |
20781 continue 3473 | |
20761 continue 3473 | |
20741 continue 3474 | |
20742 continue 3474 | |
20731 continue 3475 | |
20732 continue 3475 | |
deallocate(xm,xs,ym,ys,ju,xv,clt) 3476 | |
return 3477 | |
end 3478 | |
subroutine multspstandard1(no,ni,nr,x,ix,jx,y,w,ju,isd,jsd,intr, 3480 | |
*xm,xs,ym,ys,xv,ys0,jerr) | |
real x(*),y(no,nr),w(no),xm(ni),xs(ni),xv(ni),ym(nr),ys(nr) 3481 | |
integer ix(*),jx(*),ju(ni) 3482 | |
w=w/sum(w) 3483 | |
if(intr .ne. 0)goto 20801 3484 | |
20810 do 20811 j=1,ni 3484 | |
if(ju(j).eq.0)goto 20811 3484 | |
xm(j)=0.0 3484 | |
jb=ix(j) 3484 | |
je=ix(j+1)-1 3485 | |
z=dot_product(w(jx(jb:je)),x(jb:je)**2) 3486 | |
if(isd .le. 0)goto 20831 3486 | |
xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 3486 | |
vc=z-xbq 3487 | |
xs(j)=sqrt(vc) 3487 | |
xv(j)=1.0+xbq/vc 3488 | |
goto 20841 3489 | |
20831 continue 3489 | |
xs(j)=1.0 3489 | |
xv(j)=z 3489 | |
20841 continue 3490 | |
20821 continue 3490 | |
20811 continue 3491 | |
20812 continue 3491 | |
ys0=0.0 3492 | |
20850 do 20851 j=1,nr 3492 | |
ym(j)=0.0 3492 | |
z=dot_product(w,y(:,j)**2) 3493 | |
if(jsd .le. 0)goto 20871 3493 | |
u=z-dot_product(w,y(:,j))**2 3493 | |
ys0=ys0+z/u 3494 | |
ys(j)=sqrt(u) 3494 | |
y(:,j)=y(:,j)/ys(j) 3495 | |
goto 20881 3496 | |
20871 continue 3496 | |
ys(j)=1.0 3496 | |
ys0=ys0+z 3496 | |
20881 continue 3497 | |
20861 continue 3497 | |
20851 continue 3498 | |
20852 continue 3498 | |
return 3499 | |
20801 continue 3500 | |
20890 do 20891 j=1,ni 3500 | |
if(ju(j).eq.0)goto 20891 3501 | |
jb=ix(j) 3501 | |
je=ix(j+1)-1 3501 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 3502 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 3503 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 3504 | |
20891 continue 3505 | |
20892 continue 3505 | |
if(isd .ne. 0)goto 20911 3505 | |
xs=1.0 3505 | |
goto 20921 3505 | |
20911 continue 3505 | |
xv=1.0 3505 | |
20921 continue 3506 | |
20901 continue 3506 | |
ys0=0.0 3507 | |
20930 do 20931 j=1,nr 3508 | |
ym(j)=dot_product(w,y(:,j)) 3508 | |
y(:,j)=y(:,j)-ym(j) 3509 | |
z=dot_product(w,y(:,j)**2) 3510 | |
if(jsd .le. 0)goto 20951 3510 | |
ys(j)=sqrt(z) 3510 | |
y(:,j)=y(:,j)/ys(j) 3510 | |
goto 20961 3511 | |
20951 continue 3511 | |
ys0=ys0+z 3511 | |
20961 continue 3512 | |
20941 continue 3512 | |
20931 continue 3513 | |
20932 continue 3513 | |
if(jsd .ne. 0)goto 20981 3513 | |
ys=1.0 3513 | |
goto 20991 3513 | |
20981 continue 3513 | |
ys0=nr 3513 | |
20991 continue 3514 | |
20971 continue 3514 | |
return 3515 | |
end 3516 | |
subroutine multspelnet2(beta,ni,nr,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,n 3518 | |
*lam,flmin, ulam,thri,maxit,xm,xs,xv,ys0,lmu,ao,ia,kin,rsqo,almo,n | |
*lp,jerr) | |
real y(no,nr),w(no),x(*),vp(ni),ulam(nlam),cl(2,nr,ni) 3519 | |
real ao(nx,nr,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni),xv(ni) 3520 | |
integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) 3521 | |
real, dimension (:), allocatable :: g,gj,gk,del,o | |
integer, dimension (:), allocatable :: mm,iy,isc | |
real, dimension (:,:), allocatable :: a | |
allocate(a(1:nr,1:ni),stat=jerr) | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 3528 | |
allocate(mm(1:ni),stat=ierr) 3528 | |
jerr=jerr+ierr 3529 | |
allocate(g(1:ni),stat=ierr) 3529 | |
jerr=jerr+ierr 3530 | |
allocate(gj(1:nr),stat=ierr) 3530 | |
jerr=jerr+ierr 3531 | |
allocate(gk(1:nr),stat=ierr) 3531 | |
jerr=jerr+ierr 3532 | |
allocate(del(1:nr),stat=ierr) 3532 | |
jerr=jerr+ierr 3533 | |
allocate(o(1:nr),stat=ierr) 3533 | |
jerr=jerr+ierr 3534 | |
allocate(iy(1:ni),stat=ierr) 3534 | |
jerr=jerr+ierr 3535 | |
allocate(isc(1:nr),stat=ierr) 3535 | |
jerr=jerr+ierr 3536 | |
if(jerr.ne.0) return 3537 | |
bta=beta 3537 | |
omb=1.0-bta 3537 | |
alm=0.0 3537 | |
iy=0 3537 | |
thr=thri*ys0/nr 3538 | |
if(flmin .ge. 1.0)goto 21011 3538 | |
eqs=max(eps,flmin) 3538 | |
alf=eqs**(1.0/(nlam-1)) 3538 | |
21011 continue 3539 | |
rsq=ys0 3539 | |
a=0.0 3539 | |
mm=0 3539 | |
o=0.0 3539 | |
nlp=0 3539 | |
nin=nlp 3539 | |
iz=0 3539 | |
mnl=min(mnlam,nlam) 3540 | |
21020 do 21021 j=1,ni 3540 | |
if(ju(j).eq.0)goto 21021 3540 | |
jb=ix(j) 3540 | |
je=ix(j+1)-1 3540 | |
g(j)=0.0 3541 | |
21030 do 21031 k=1,nr 3542 | |
g(j)=g(j)+(dot_product(y(jx(jb:je),k),w(jx(jb:je))*x(jb:je))/xs(j) 3543 | |
*)**2 | |
21031 continue 3544 | |
21032 continue 3544 | |
g(j)=sqrt(g(j)) 3545 | |
21021 continue 3546 | |
21022 continue 3546 | |
21040 do 21041 m=1,nlam 3546 | |
alm0=alm 3547 | |
if(flmin .lt. 1.0)goto 21061 3547 | |
alm=ulam(m) 3547 | |
goto 21051 3548 | |
21061 if(m .le. 2)goto 21071 3548 | |
alm=alm*alf 3548 | |
goto 21051 3549 | |
21071 if(m .ne. 1)goto 21081 3549 | |
alm=big 3549 | |
goto 21091 3550 | |
21081 continue 3550 | |
alm0=0.0 3551 | |
21100 do 21101 j=1,ni 3551 | |
if(ju(j).eq.0)goto 21101 3552 | |
if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 3553 | |
21101 continue 3554 | |
21102 continue 3554 | |
alm0=alm0/max(bta,1.0e-3) 3554 | |
alm=alf*alm0 3555 | |
21091 continue 3556 | |
21051 continue 3556 | |
dem=alm*omb 3556 | |
ab=alm*bta 3556 | |
rsq0=rsq 3556 | |
jz=1 3557 | |
tlam=bta*(2.0*alm-alm0) 3558 | |
21110 do 21111 k=1,ni 3558 | |
if(iy(k).eq.1)goto 21111 3558 | |
if(ju(k).eq.0)goto 21111 3559 | |
if(g(k).gt.tlam*vp(k)) iy(k)=1 3560 | |
21111 continue 3561 | |
21112 continue 3561 | |
21120 continue 3561 | |
21121 continue 3561 | |
if(iz*jz.ne.0) go to 10360 3562 | |
10880 continue 3562 | |
nlp=nlp+1 3562 | |
dlx=0.0 3563 | |
21130 do 21131 k=1,ni 3563 | |
if(iy(k).eq.0)goto 21131 3563 | |
jb=ix(k) 3563 | |
je=ix(k+1)-1 3563 | |
gkn=0.0 3564 | |
21140 do 21141 j=1,nr 3565 | |
gj(j)=dot_product(y(jx(jb:je),j)+o(j),w(jx(jb:je))*x(jb:je))/xs(k) 3566 | |
gk(j)=gj(j)+a(j,k)*xv(k) 3566 | |
gkn=gkn+gk(j)**2 3567 | |
21141 continue 3568 | |
21142 continue 3568 | |
gkn=sqrt(gkn) 3568 | |
u=1.0-ab*vp(k)/gkn 3568 | |
del=a(:,k) 3569 | |
if(u .gt. 0.0)goto 21161 3569 | |
a(:,k)=0.0 3569 | |
goto 21171 3570 | |
21161 continue 3570 | |
a(:,k)=gk*(u/(xv(k)+dem*vp(k))) 3571 | |
call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) 3573 | |
*,isc,jerr) | |
if(jerr.ne.0) return 3574 | |
21171 continue 3575 | |
21151 continue 3575 | |
del=a(:,k)-del 3575 | |
if(maxval(abs(del)).le.0.0)goto 21131 3576 | |
if(mm(k) .ne. 0)goto 21191 3576 | |
nin=nin+1 3576 | |
if(nin.gt.nx)goto 21132 3577 | |
mm(k)=nin 3577 | |
ia(nin)=k 3578 | |
21191 continue 3579 | |
21200 do 21201 j=1,nr 3579 | |
rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) 3580 | |
y(jx(jb:je),j)=y(jx(jb:je),j)-del(j)*x(jb:je)/xs(k) 3581 | |
o(j)=o(j)+del(j)*xm(k)/xs(k) 3581 | |
dlx=max(xv(k)*del(j)**2,dlx) 3582 | |
21201 continue 3583 | |
21202 continue 3583 | |
21131 continue 3584 | |
21132 continue 3584 | |
if(nin.gt.nx)goto 21122 3585 | |
if(dlx .ge. thr)goto 21221 3585 | |
ixx=0 3586 | |
21230 do 21231 j=1,ni 3586 | |
if(iy(j).eq.1)goto 21231 3586 | |
if(ju(j).eq.0)goto 21231 3587 | |
jb=ix(j) 3587 | |
je=ix(j+1)-1 3587 | |
g(j)=0.0 3588 | |
21240 do 21241 k=1,nr 3588 | |
g(j)=g(j)+ (dot_product(y(jx(jb:je),k)+o(k),w(jx(jb:je))*x(jb:je) 3590 | |
*)/xs(j))**2 | |
21241 continue 3591 | |
21242 continue 3591 | |
g(j)=sqrt(g(j)) 3592 | |
if(g(j) .le. ab*vp(j))goto 21261 3592 | |
iy(j)=1 3592 | |
ixx=1 3592 | |
21261 continue 3593 | |
21231 continue 3594 | |
21232 continue 3594 | |
if(ixx.eq.1) go to 10880 3595 | |
goto 21122 3596 | |
21221 continue 3597 | |
if(nlp .le. maxit)goto 21281 3597 | |
jerr=-m 3597 | |
return 3597 | |
21281 continue 3598 | |
10360 continue 3598 | |
iz=1 3599 | |
21290 continue 3599 | |
21291 continue 3599 | |
nlp=nlp+1 3599 | |
dlx=0.0 3600 | |
21300 do 21301 l=1,nin 3600 | |
k=ia(l) 3600 | |
jb=ix(k) 3600 | |
je=ix(k+1)-1 3600 | |
gkn=0.0 3601 | |
21310 do 21311 j=1,nr 3601 | |
gj(j)= dot_product(y(jx(jb:je),j)+o(j),w(jx(jb:je))*x(jb:je))/xs( 3603 | |
*k) | |
gk(j)=gj(j)+a(j,k)*xv(k) 3603 | |
gkn=gkn+gk(j)**2 3604 | |
21311 continue 3605 | |
21312 continue 3605 | |
gkn=sqrt(gkn) 3605 | |
u=1.0-ab*vp(k)/gkn 3605 | |
del=a(:,k) 3606 | |
if(u .gt. 0.0)goto 21331 3606 | |
a(:,k)=0.0 3606 | |
goto 21341 3607 | |
21331 continue 3607 | |
a(:,k)=gk*(u/(xv(k)+dem*vp(k))) 3608 | |
call chkbnds(nr,gk,gkn,xv(k),cl(1,1,k), dem*vp(k),ab*vp(k),a(:,k) 3610 | |
*,isc,jerr) | |
if(jerr.ne.0) return 3611 | |
21341 continue 3612 | |
21321 continue 3612 | |
del=a(:,k)-del 3612 | |
if(maxval(abs(del)).le.0.0)goto 21301 3613 | |
21350 do 21351 j=1,nr 3613 | |
rsq=rsq-del(j)*(2.0*gj(j)-del(j)*xv(k)) 3614 | |
y(jx(jb:je),j)=y(jx(jb:je),j)-del(j)*x(jb:je)/xs(k) 3615 | |
o(j)=o(j)+del(j)*xm(k)/xs(k) 3615 | |
dlx=max(xv(k)*del(j)**2,dlx) 3616 | |
21351 continue 3617 | |
21352 continue 3617 | |
21301 continue 3618 | |
21302 continue 3618 | |
if(dlx.lt.thr)goto 21292 3618 | |
if(nlp .le. maxit)goto 21371 3618 | |
jerr=-m 3618 | |
return 3618 | |
21371 continue 3619 | |
goto 21291 3620 | |
21292 continue 3620 | |
jz=0 3621 | |
goto 21121 3622 | |
21122 continue 3622 | |
if(nin .le. nx)goto 21391 3622 | |
jerr=-10000-m 3622 | |
goto 21042 3622 | |
21391 continue 3623 | |
if(nin .le. 0)goto 21411 3623 | |
21420 do 21421 j=1,nr 3623 | |
ao(1:nin,j,m)=a(j,ia(1:nin)) 3623 | |
21421 continue 3623 | |
21422 continue 3623 | |
21411 continue 3624 | |
kin(m)=nin 3625 | |
rsqo(m)=1.0-rsq/ys0 3625 | |
almo(m)=alm 3625 | |
lmu=m 3626 | |
if(m.lt.mnl)goto 21041 3626 | |
if(flmin.ge.1.0)goto 21041 3627 | |
me=0 3627 | |
21430 do 21431 j=1,nin 3627 | |
if(ao(j,1,m).ne.0.0) me=me+1 3627 | |
21431 continue 3627 | |
21432 continue 3627 | |
if(me.gt.ne)goto 21042 3628 | |
if(rsq0-rsq.lt.sml*rsq)goto 21042 3628 | |
if(rsqo(m).gt.rsqmax)goto 21042 3629 | |
21041 continue 3630 | |
21042 continue 3630 | |
deallocate(a,mm,g,iy,gj,gk,del,o) 3631 | |
return 3632 | |
end 3633 | |
subroutine multlognetn(parm,no,ni,nc,x,y,g,w,ju,vp,cl,ne,nx,nlam,f 3635 | |
*lmin,ulam, shri,intr,maxit,xv,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jer | |
*r) | |
real x(no,ni),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam),cl(2,ni) 3636 | |
real a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),xv(ni) 3637 | |
integer ju(ni),m(nx),kin(nlam) 3638 | |
real, dimension (:,:), allocatable :: q,r,b,bs | |
real, dimension (:), allocatable :: sxp,sxpl,ga,gk,del | |
integer, dimension (:), allocatable :: mm,is,ixx,isc | |
allocate(b(0:ni,1:nc),stat=jerr) | |
allocate(bs(0:ni,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(q(1:no,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(r(1:no,1:nc),stat=ierr); jerr=jerr+ierr; | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 3647 | |
exmn=-exmx 3648 | |
allocate(mm(1:ni),stat=ierr) 3648 | |
jerr=jerr+ierr 3649 | |
allocate(is(1:max(nc,ni)),stat=ierr) 3649 | |
jerr=jerr+ierr 3650 | |
allocate(sxp(1:no),stat=ierr) 3650 | |
jerr=jerr+ierr 3651 | |
allocate(sxpl(1:no),stat=ierr) 3651 | |
jerr=jerr+ierr 3652 | |
allocate(ga(1:ni),stat=ierr) 3652 | |
jerr=jerr+ierr 3653 | |
allocate(ixx(1:ni),stat=ierr) 3653 | |
jerr=jerr+ierr 3654 | |
allocate(gk(1:nc),stat=ierr) 3654 | |
jerr=jerr+ierr 3655 | |
allocate(del(1:nc),stat=ierr) 3655 | |
jerr=jerr+ierr 3656 | |
allocate(isc(1:nc),stat=ierr) 3656 | |
jerr=jerr+ierr 3657 | |
if(jerr.ne.0) return 3658 | |
pmax=1.0-pmin 3658 | |
emin=pmin/pmax 3658 | |
emax=1.0/emin 3659 | |
bta=parm 3659 | |
omb=1.0-bta 3659 | |
dev1=0.0 3659 | |
dev0=0.0 3660 | |
21440 do 21441 ic=1,nc 3660 | |
q0=dot_product(w,y(:,ic)) 3661 | |
if(q0 .gt. pmin)goto 21461 3661 | |
jerr =8000+ic 3661 | |
return 3661 | |
21461 continue 3662 | |
if(q0 .lt. pmax)goto 21481 3662 | |
jerr =9000+ic 3662 | |
return 3662 | |
21481 continue 3663 | |
if(intr .ne. 0)goto 21501 3663 | |
q0=1.0/nc 3663 | |
b(0,ic)=0.0 3663 | |
goto 21511 3664 | |
21501 continue 3664 | |
b(0,ic)=log(q0) 3664 | |
dev1=dev1-q0*b(0,ic) 3664 | |
21511 continue 3665 | |
21491 continue 3665 | |
b(1:ni,ic)=0.0 3666 | |
21441 continue 3667 | |
21442 continue 3667 | |
if(intr.eq.0) dev1=log(float(nc)) 3667 | |
ixx=0 3667 | |
al=0.0 3668 | |
if(nonzero(no*nc,g) .ne. 0)goto 21531 3669 | |
b(0,:)=b(0,:)-sum(b(0,:))/nc 3669 | |
sxp=0.0 3670 | |
21540 do 21541 ic=1,nc 3670 | |
q(:,ic)=exp(b(0,ic)) 3670 | |
sxp=sxp+q(:,ic) 3670 | |
21541 continue 3671 | |
21542 continue 3671 | |
goto 21551 3672 | |
21531 continue 3672 | |
21560 do 21561 i=1,no 3672 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 3672 | |
21561 continue 3672 | |
21562 continue 3672 | |
sxp=0.0 3673 | |
if(intr .ne. 0)goto 21581 3673 | |
b(0,:)=0.0 3673 | |
goto 21591 3674 | |
21581 continue 3674 | |
call kazero(nc,no,y,g,w,b(0,:),jerr) 3674 | |
if(jerr.ne.0) return 3674 | |
21591 continue 3675 | |
21571 continue 3675 | |
dev1=0.0 3676 | |
21600 do 21601 ic=1,nc 3676 | |
q(:,ic)=b(0,ic)+g(:,ic) 3677 | |
dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) 3678 | |
q(:,ic)=exp(q(:,ic)) 3678 | |
sxp=sxp+q(:,ic) 3679 | |
21601 continue 3680 | |
21602 continue 3680 | |
sxpl=w*log(sxp) 3680 | |
21610 do 21611 ic=1,nc 3680 | |
dev1=dev1+dot_product(y(:,ic),sxpl) 3680 | |
21611 continue 3681 | |
21612 continue 3681 | |
21551 continue 3682 | |
21521 continue 3682 | |
21620 do 21621 ic=1,nc 3682 | |
21630 do 21631 i=1,no 3682 | |
if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 3682 | |
21631 continue 3682 | |
21632 continue 3682 | |
21621 continue 3683 | |
21622 continue 3683 | |
dev0=dev0+dev1 3684 | |
if(flmin .ge. 1.0)goto 21651 3684 | |
eqs=max(eps,flmin) 3684 | |
alf=eqs**(1.0/(nlam-1)) 3684 | |
21651 continue 3685 | |
m=0 3685 | |
mm=0 3685 | |
nin=0 3685 | |
nlp=0 3685 | |
mnl=min(mnlam,nlam) 3685 | |
bs=0.0 3685 | |
shr=shri*dev0 3686 | |
ga=0.0 3687 | |
21660 do 21661 ic=1,nc 3687 | |
r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) 3688 | |
21670 do 21671 j=1,ni 3688 | |
if(ju(j).ne.0) ga(j)=ga(j)+dot_product(r(:,ic),x(:,j))**2 3688 | |
21671 continue 3689 | |
21672 continue 3689 | |
21661 continue 3690 | |
21662 continue 3690 | |
ga=sqrt(ga) 3691 | |
21680 do 21681 ilm=1,nlam 3691 | |
al0=al 3692 | |
if(flmin .lt. 1.0)goto 21701 3692 | |
al=ulam(ilm) 3692 | |
goto 21691 3693 | |
21701 if(ilm .le. 2)goto 21711 3693 | |
al=al*alf 3693 | |
goto 21691 3694 | |
21711 if(ilm .ne. 1)goto 21721 3694 | |
al=big 3694 | |
goto 21731 3695 | |
21721 continue 3695 | |
al0=0.0 3696 | |
21740 do 21741 j=1,ni 3696 | |
if(ju(j).eq.0)goto 21741 3696 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 3696 | |
21741 continue 3697 | |
21742 continue 3697 | |
al0=al0/max(bta,1.0e-3) 3697 | |
al=alf*al0 3698 | |
21731 continue 3699 | |
21691 continue 3699 | |
al2=al*omb 3699 | |
al1=al*bta 3699 | |
tlam=bta*(2.0*al-al0) 3700 | |
21750 do 21751 k=1,ni 3700 | |
if(ixx(k).eq.1)goto 21751 3700 | |
if(ju(k).eq.0)goto 21751 3701 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 3702 | |
21751 continue 3703 | |
21752 continue 3703 | |
10880 continue 3704 | |
21760 continue 3704 | |
21761 continue 3704 | |
ix=0 3704 | |
jx=ix 3704 | |
kx=jx 3704 | |
t=0.0 3705 | |
21770 do 21771 ic=1,nc 3705 | |
t=max(t,maxval(q(:,ic)*(1.0-q(:,ic)/sxp)/sxp)) 3705 | |
21771 continue 3706 | |
21772 continue 3706 | |
if(t .ge. eps)goto 21791 3706 | |
kx=1 3706 | |
goto 21762 3706 | |
21791 continue 3706 | |
t=2.0*t 3706 | |
alt=al1/t 3706 | |
al2t=al2/t 3707 | |
21800 do 21801 ic=1,nc 3708 | |
bs(0,ic)=b(0,ic) 3708 | |
if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) 3709 | |
r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp)/t 3710 | |
d=0.0 3710 | |
if(intr.ne.0) d=sum(r(:,ic)) 3711 | |
if(d .eq. 0.0)goto 21821 3712 | |
b(0,ic)=b(0,ic)+d 3712 | |
r(:,ic)=r(:,ic)-d*w 3712 | |
dlx=max(dlx,d**2) 3713 | |
21821 continue 3714 | |
21801 continue 3715 | |
21802 continue 3715 | |
21830 continue 3715 | |
21831 continue 3715 | |
nlp=nlp+nc 3715 | |
dlx=0.0 3716 | |
21840 do 21841 k=1,ni 3716 | |
if(ixx(k).eq.0)goto 21841 3716 | |
gkn=0.0 3717 | |
21850 do 21851 ic=1,nc 3717 | |
gk(ic)=dot_product(r(:,ic),x(:,k))+b(k,ic)*xv(k) 3718 | |
gkn=gkn+gk(ic)**2 3719 | |
21851 continue 3720 | |
21852 continue 3720 | |
gkn=sqrt(gkn) 3720 | |
u=1.0-alt*vp(k)/gkn 3720 | |
del=b(k,:) 3721 | |
if(u .gt. 0.0)goto 21871 3721 | |
b(k,:)=0.0 3721 | |
goto 21881 3722 | |
21871 continue 3722 | |
b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) 3723 | |
call chkbnds1(nc,gk,gkn,xv(k),cl(1,k), cl(2,k),vp(k)*al2t,alt*vp( 3725 | |
*k),b(k,:),isc,jerr) | |
if(jerr.ne.0) return 3726 | |
21881 continue 3727 | |
21861 continue 3727 | |
del=b(k,:)-del 3727 | |
if(maxval(abs(del)).le.0.0)goto 21841 3728 | |
21890 do 21891 ic=1,nc 3728 | |
dlx=max(dlx,xv(k)*del(ic)**2) 3729 | |
r(:,ic)=r(:,ic)-del(ic)*w*x(:,k) 3730 | |
21891 continue 3731 | |
21892 continue 3731 | |
if(mm(k) .ne. 0)goto 21911 3731 | |
nin=nin+1 3732 | |
if(nin .le. nx)goto 21931 3732 | |
jx=1 3732 | |
goto 21842 3732 | |
21931 continue 3733 | |
mm(k)=nin 3733 | |
m(nin)=k 3734 | |
21911 continue 3735 | |
21841 continue 3736 | |
21842 continue 3736 | |
if(jx.gt.0)goto 21832 3736 | |
if(dlx.lt.shr)goto 21832 3737 | |
if(nlp .le. maxit)goto 21951 3737 | |
jerr=-ilm 3737 | |
return 3737 | |
21951 continue 3738 | |
21960 continue 3738 | |
21961 continue 3738 | |
nlp=nlp+nc 3738 | |
dlx=0.0 3739 | |
21970 do 21971 l=1,nin 3739 | |
k=m(l) 3739 | |
gkn=0.0 3740 | |
21980 do 21981 ic=1,nc 3740 | |
gk(ic)=dot_product(r(:,ic),x(:,k))+b(k,ic)*xv(k) 3741 | |
gkn=gkn+gk(ic)**2 3742 | |
21981 continue 3743 | |
21982 continue 3743 | |
gkn=sqrt(gkn) 3743 | |
u=1.0-alt*vp(k)/gkn 3743 | |
del=b(k,:) 3744 | |
if(u .gt. 0.0)goto 22001 3744 | |
b(k,:)=0.0 3744 | |
goto 22011 3745 | |
22001 continue 3745 | |
b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) 3746 | |
call chkbnds1(nc,gk,gkn,xv(k),cl(1,k), cl(2,k),vp(k)*al2t,alt*vp( 3748 | |
*k),b(k,:),isc,jerr) | |
if(jerr.ne.0) return 3749 | |
22011 continue 3750 | |
21991 continue 3750 | |
del=b(k,:)-del 3750 | |
if(maxval(abs(del)).le.0.0)goto 21971 3751 | |
22020 do 22021 ic=1,nc 3751 | |
dlx=max(dlx,xv(k)*del(ic)**2) 3752 | |
r(:,ic)=r(:,ic)-del(ic)*w*x(:,k) 3753 | |
22021 continue 3754 | |
22022 continue 3754 | |
21971 continue 3755 | |
21972 continue 3755 | |
if(dlx.lt.shr)goto 21962 3755 | |
if(nlp .le. maxit)goto 22041 3755 | |
jerr=-ilm 3755 | |
return 3755 | |
22041 continue 3757 | |
goto 21961 3758 | |
21962 continue 3758 | |
goto 21831 3759 | |
21832 continue 3759 | |
if(jx.gt.0)goto 21762 3760 | |
22050 do 22051 ic=1,nc 3761 | |
if((b(0,ic)-bs(0,ic))**2.gt.shr) ix=1 3762 | |
if(ix .ne. 0)goto 22071 3763 | |
22080 do 22081 j=1,nin 3763 | |
k=m(j) 3764 | |
if(xv(k)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 22101 3764 | |
ix=1 3764 | |
goto 22082 3764 | |
22101 continue 3766 | |
22081 continue 3767 | |
22082 continue 3767 | |
22071 continue 3768 | |
22110 do 22111 i=1,no 3768 | |
fi=b(0,ic)+g(i,ic) 3770 | |
if(nin.gt.0) fi=fi+dot_product(b(m(1:nin),ic),x(i,m(1:nin))) 3771 | |
fi=min(max(exmn,fi),exmx) 3771 | |
sxp(i)=sxp(i)-q(i,ic) 3772 | |
q(i,ic)=min(max(emin*sxp(i),exp(fi)),emax*sxp(i)) 3773 | |
sxp(i)=sxp(i)+q(i,ic) 3774 | |
22111 continue 3775 | |
22112 continue 3775 | |
22051 continue 3776 | |
22052 continue 3776 | |
s=-sum(b(0,:))/nc 3776 | |
b(0,:)=b(0,:)+s 3777 | |
if(jx.gt.0)goto 21762 3778 | |
if(ix .ne. 0)goto 22131 3779 | |
22140 do 22141 k=1,ni 3779 | |
if(ixx(k).eq.1)goto 22141 3779 | |
if(ju(k).eq.0)goto 22141 3779 | |
ga(k)=0.0 3779 | |
22141 continue 3780 | |
22142 continue 3780 | |
22150 do 22151 ic=1,nc 3780 | |
r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) 3781 | |
22160 do 22161 k=1,ni 3781 | |
if(ixx(k).eq.1)goto 22161 3781 | |
if(ju(k).eq.0)goto 22161 3782 | |
ga(k)=ga(k)+dot_product(r(:,ic),x(:,k))**2 3783 | |
22161 continue 3784 | |
22162 continue 3784 | |
22151 continue 3785 | |
22152 continue 3785 | |
ga=sqrt(ga) 3786 | |
22170 do 22171 k=1,ni 3786 | |
if(ixx(k).eq.1)goto 22171 3786 | |
if(ju(k).eq.0)goto 22171 3787 | |
if(ga(k) .le. al1*vp(k))goto 22191 3787 | |
ixx(k)=1 3787 | |
ix=1 3787 | |
22191 continue 3788 | |
22171 continue 3789 | |
22172 continue 3789 | |
if(ix.eq.1) go to 10880 3790 | |
goto 21762 3791 | |
22131 continue 3792 | |
goto 21761 3793 | |
21762 continue 3793 | |
if(kx .le. 0)goto 22211 3793 | |
jerr=-20000-ilm 3793 | |
goto 21682 3793 | |
22211 continue 3794 | |
if(jx .le. 0)goto 22231 3794 | |
jerr=-10000-ilm 3794 | |
goto 21682 3794 | |
22231 continue 3794 | |
devi=0.0 3795 | |
22240 do 22241 ic=1,nc 3796 | |
if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) 3796 | |
a0(ic,ilm)=b(0,ic) 3797 | |
22250 do 22251 i=1,no 3797 | |
if(y(i,ic).le.0.0)goto 22251 3798 | |
devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 3799 | |
22251 continue 3800 | |
22252 continue 3800 | |
22241 continue 3801 | |
22242 continue 3801 | |
kin(ilm)=nin 3801 | |
alm(ilm)=al 3801 | |
lmu=ilm 3802 | |
dev(ilm)=(dev1-devi)/dev0 3803 | |
if(ilm.lt.mnl)goto 21681 3803 | |
if(flmin.ge.1.0)goto 21681 3804 | |
me=0 3804 | |
22260 do 22261 j=1,nin 3804 | |
if(a(j,1,ilm).ne.0.0) me=me+1 3804 | |
22261 continue 3804 | |
22262 continue 3804 | |
if(me.gt.ne)goto 21682 3805 | |
if(dev(ilm).gt.devmax)goto 21682 3805 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 21682 3806 | |
21681 continue 3807 | |
21682 continue 3807 | |
g=log(q) 3807 | |
22270 do 22271 i=1,no 3807 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 3807 | |
22271 continue 3808 | |
22272 continue 3808 | |
deallocate(sxp,b,bs,r,q,mm,is,ga,ixx,gk,del,sxpl) 3809 | |
return 3810 | |
end 3811 | |
subroutine multsprlognetn(parm,no,ni,nc,x,ix,jx,y,g,w,ju,vp,cl,ne, 3813 | |
*nx,nlam, flmin,ulam,shri,intr,maxit,xv,xb,xs,lmu,a0,a,m,kin,dev0, | |
*dev,alm,nlp,jerr) | |
real x(*),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam),xb(ni),xs(ni), 3814 | |
*xv(ni) | |
real a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl(2,ni) 3815 | |
integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) 3816 | |
real, dimension (:,:), allocatable :: q,r,b,bs | |
real, dimension (:), allocatable :: sxp,sxpl,ga,gk,del,sc,svr | |
integer, dimension (:), allocatable :: mm,is,iy,isc | |
allocate(b(0:ni,1:nc),stat=jerr) | |
allocate(bs(0:ni,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(q(1:no,1:nc),stat=ierr); jerr=jerr+ierr | |
allocate(r(1:no,1:nc),stat=ierr); jerr=jerr+ierr | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 3825 | |
exmn=-exmx 3826 | |
allocate(mm(1:ni),stat=ierr) 3826 | |
jerr=jerr+ierr 3827 | |
allocate(ga(1:ni),stat=ierr) 3827 | |
jerr=jerr+ierr 3828 | |
allocate(gk(1:nc),stat=ierr) 3828 | |
jerr=jerr+ierr 3829 | |
allocate(del(1:nc),stat=ierr) 3829 | |
jerr=jerr+ierr 3830 | |
allocate(iy(1:ni),stat=ierr) 3830 | |
jerr=jerr+ierr 3831 | |
allocate(is(1:max(nc,ni)),stat=ierr) 3831 | |
jerr=jerr+ierr 3832 | |
allocate(sxp(1:no),stat=ierr) 3832 | |
jerr=jerr+ierr 3833 | |
allocate(sxpl(1:no),stat=ierr) 3833 | |
jerr=jerr+ierr 3834 | |
allocate(svr(1:nc),stat=ierr) 3834 | |
jerr=jerr+ierr 3835 | |
allocate(sc(1:no),stat=ierr) 3835 | |
jerr=jerr+ierr 3836 | |
allocate(isc(1:nc),stat=ierr) 3836 | |
jerr=jerr+ierr 3837 | |
if(jerr.ne.0) return 3838 | |
pmax=1.0-pmin 3838 | |
emin=pmin/pmax 3838 | |
emax=1.0/emin 3839 | |
bta=parm 3839 | |
omb=1.0-bta 3839 | |
dev1=0.0 3839 | |
dev0=0.0 3840 | |
22280 do 22281 ic=1,nc 3840 | |
q0=dot_product(w,y(:,ic)) 3841 | |
if(q0 .gt. pmin)goto 22301 3841 | |
jerr =8000+ic 3841 | |
return 3841 | |
22301 continue 3842 | |
if(q0 .lt. pmax)goto 22321 3842 | |
jerr =9000+ic 3842 | |
return 3842 | |
22321 continue 3843 | |
b(1:ni,ic)=0.0 3844 | |
if(intr .ne. 0)goto 22341 3844 | |
q0=1.0/nc 3844 | |
b(0,ic)=0.0 3844 | |
goto 22351 3845 | |
22341 continue 3845 | |
b(0,ic)=log(q0) 3845 | |
dev1=dev1-q0*b(0,ic) 3845 | |
22351 continue 3846 | |
22331 continue 3846 | |
22281 continue 3847 | |
22282 continue 3847 | |
if(intr.eq.0) dev1=log(float(nc)) 3847 | |
iy=0 3847 | |
al=0.0 3848 | |
if(nonzero(no*nc,g) .ne. 0)goto 22371 3849 | |
b(0,:)=b(0,:)-sum(b(0,:))/nc 3849 | |
sxp=0.0 3850 | |
22380 do 22381 ic=1,nc 3850 | |
q(:,ic)=exp(b(0,ic)) 3850 | |
sxp=sxp+q(:,ic) 3850 | |
22381 continue 3851 | |
22382 continue 3851 | |
goto 22391 3852 | |
22371 continue 3852 | |
22400 do 22401 i=1,no 3852 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 3852 | |
22401 continue 3852 | |
22402 continue 3852 | |
sxp=0.0 3853 | |
if(intr .ne. 0)goto 22421 3853 | |
b(0,:)=0.0 3853 | |
goto 22431 3854 | |
22421 continue 3854 | |
call kazero(nc,no,y,g,w,b(0,:),jerr) 3854 | |
if(jerr.ne.0) return 3854 | |
22431 continue 3855 | |
22411 continue 3855 | |
dev1=0.0 3856 | |
22440 do 22441 ic=1,nc 3856 | |
q(:,ic)=b(0,ic)+g(:,ic) 3857 | |
dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) 3858 | |
q(:,ic)=exp(q(:,ic)) 3858 | |
sxp=sxp+q(:,ic) 3859 | |
22441 continue 3860 | |
22442 continue 3860 | |
sxpl=w*log(sxp) 3860 | |
22450 do 22451 ic=1,nc 3860 | |
dev1=dev1+dot_product(y(:,ic),sxpl) 3860 | |
22451 continue 3861 | |
22452 continue 3861 | |
22391 continue 3862 | |
22361 continue 3862 | |
22460 do 22461 ic=1,nc 3862 | |
22470 do 22471 i=1,no 3862 | |
if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 3862 | |
22471 continue 3862 | |
22472 continue 3862 | |
22461 continue 3863 | |
22462 continue 3863 | |
dev0=dev0+dev1 3864 | |
if(flmin .ge. 1.0)goto 22491 3864 | |
eqs=max(eps,flmin) 3864 | |
alf=eqs**(1.0/(nlam-1)) 3864 | |
22491 continue 3865 | |
m=0 3865 | |
mm=0 3865 | |
nin=0 3865 | |
nlp=0 3865 | |
mnl=min(mnlam,nlam) 3865 | |
bs=0.0 3866 | |
shr=shri*dev0 3866 | |
ga=0.0 3867 | |
22500 do 22501 ic=1,nc 3867 | |
r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) 3867 | |
svr(ic)=sum(r(:,ic)) 3868 | |
22510 do 22511 j=1,ni 3868 | |
if(ju(j).eq.0)goto 22511 3869 | |
jb=ix(j) 3869 | |
je=ix(j+1)-1 3870 | |
gj=dot_product(r(jx(jb:je),ic),x(jb:je)) 3871 | |
ga(j)=ga(j)+((gj-svr(ic)*xb(j))/xs(j))**2 3872 | |
22511 continue 3873 | |
22512 continue 3873 | |
22501 continue 3874 | |
22502 continue 3874 | |
ga=sqrt(ga) 3875 | |
22520 do 22521 ilm=1,nlam 3875 | |
al0=al 3876 | |
if(flmin .lt. 1.0)goto 22541 3876 | |
al=ulam(ilm) 3876 | |
goto 22531 3877 | |
22541 if(ilm .le. 2)goto 22551 3877 | |
al=al*alf 3877 | |
goto 22531 3878 | |
22551 if(ilm .ne. 1)goto 22561 3878 | |
al=big 3878 | |
goto 22571 3879 | |
22561 continue 3879 | |
al0=0.0 3880 | |
22580 do 22581 j=1,ni 3880 | |
if(ju(j).eq.0)goto 22581 3880 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 3880 | |
22581 continue 3881 | |
22582 continue 3881 | |
al0=al0/max(bta,1.0e-3) 3881 | |
al=alf*al0 3882 | |
22571 continue 3883 | |
22531 continue 3883 | |
al2=al*omb 3883 | |
al1=al*bta 3883 | |
tlam=bta*(2.0*al-al0) 3884 | |
22590 do 22591 k=1,ni 3884 | |
if(iy(k).eq.1)goto 22591 3884 | |
if(ju(k).eq.0)goto 22591 3885 | |
if(ga(k).gt.tlam*vp(k)) iy(k)=1 3886 | |
22591 continue 3887 | |
22592 continue 3887 | |
10880 continue 3888 | |
22600 continue 3888 | |
22601 continue 3888 | |
ixx=0 3888 | |
jxx=ixx 3888 | |
kxx=jxx 3888 | |
t=0.0 3889 | |
22610 do 22611 ic=1,nc 3889 | |
t=max(t,maxval(q(:,ic)*(1.0-q(:,ic)/sxp)/sxp)) 3889 | |
22611 continue 3890 | |
22612 continue 3890 | |
if(t .ge. eps)goto 22631 3890 | |
kxx=1 3890 | |
goto 22602 3890 | |
22631 continue 3890 | |
t=2.0*t 3890 | |
alt=al1/t 3890 | |
al2t=al2/t 3891 | |
22640 do 22641 ic=1,nc 3891 | |
bs(0,ic)=b(0,ic) 3891 | |
if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) 3892 | |
r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp)/t 3892 | |
svr(ic)=sum(r(:,ic)) 3893 | |
if(intr .eq. 0)goto 22661 3893 | |
b(0,ic)=b(0,ic)+svr(ic) 3893 | |
r(:,ic)=r(:,ic)-svr(ic)*w 3894 | |
dlx=max(dlx,svr(ic)**2) 3895 | |
22661 continue 3896 | |
22641 continue 3897 | |
22642 continue 3897 | |
22670 continue 3897 | |
22671 continue 3897 | |
nlp=nlp+nc 3897 | |
dlx=0.0 3898 | |
22680 do 22681 k=1,ni 3898 | |
if(iy(k).eq.0)goto 22681 3899 | |
jb=ix(k) 3899 | |
je=ix(k+1)-1 3899 | |
del=b(k,:) 3899 | |
gkn=0.0 3900 | |
22690 do 22691 ic=1,nc 3901 | |
u=(dot_product(r(jx(jb:je),ic),x(jb:je))-svr(ic)*xb(k))/xs(k) 3902 | |
gk(ic)=u+del(ic)*xv(k) 3902 | |
gkn=gkn+gk(ic)**2 3903 | |
22691 continue 3904 | |
22692 continue 3904 | |
gkn=sqrt(gkn) 3904 | |
u=1.0-alt*vp(k)/gkn 3905 | |
if(u .gt. 0.0)goto 22711 3905 | |
b(k,:)=0.0 3905 | |
goto 22721 3906 | |
22711 continue 3907 | |
b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) 3908 | |
call chkbnds1(nc,gk,gkn,xv(k),cl(1,k),cl(2,k), vp(k)*al2t,alt*vp( 3910 | |
*k),b(k,:),isc,jerr) | |
if(jerr.ne.0) return 3911 | |
22721 continue 3912 | |
22701 continue 3912 | |
del=b(k,:)-del 3912 | |
if(maxval(abs(del)).le.0.0)goto 22681 3913 | |
22730 do 22731 ic=1,nc 3913 | |
dlx=max(dlx,xv(k)*del(ic)**2) 3914 | |
r(jx(jb:je),ic)=r(jx(jb:je),ic) -del(ic)*w(jx(jb:je))*(x(jb:je)-x 3916 | |
*b(k))/xs(k) | |
22731 continue 3917 | |
22732 continue 3917 | |
if(mm(k) .ne. 0)goto 22751 3917 | |
nin=nin+1 3918 | |
if(nin .le. nx)goto 22771 3918 | |
jxx=1 3918 | |
goto 22682 3918 | |
22771 continue 3919 | |
mm(k)=nin 3919 | |
m(nin)=k 3920 | |
22751 continue 3921 | |
22681 continue 3922 | |
22682 continue 3922 | |
if(jxx.gt.0)goto 22672 3923 | |
if(dlx.lt.shr)goto 22672 3923 | |
if(nlp .le. maxit)goto 22791 3923 | |
jerr=-ilm 3923 | |
return 3923 | |
22791 continue 3924 | |
22800 continue 3924 | |
22801 continue 3924 | |
nlp=nlp+nc 3924 | |
dlx=0.0 3925 | |
22810 do 22811 l=1,nin 3925 | |
k=m(l) 3925 | |
jb=ix(k) 3925 | |
je=ix(k+1)-1 3925 | |
del=b(k,:) 3925 | |
gkn=0.0 3926 | |
22820 do 22821 ic=1,nc 3927 | |
u=(dot_product(r(jx(jb:je),ic),x(jb:je)) -svr(ic)*xb(k))/xs(k) 3929 | |
gk(ic)=u+del(ic)*xv(k) 3929 | |
gkn=gkn+gk(ic)**2 3930 | |
22821 continue 3931 | |
22822 continue 3931 | |
gkn=sqrt(gkn) 3931 | |
u=1.0-alt*vp(k)/gkn 3932 | |
if(u .gt. 0.0)goto 22841 3932 | |
b(k,:)=0.0 3932 | |
goto 22851 3933 | |
22841 continue 3934 | |
b(k,:)=gk*(u/(xv(k)+vp(k)*al2t)) 3935 | |
call chkbnds1(nc,gk,gkn,xv(k),cl(1,k),cl(2,k), vp(k)*al2t,alt*vp( 3937 | |
*k),b(k,:),isc,jerr) | |
if(jerr.ne.0) return 3938 | |
22851 continue 3939 | |
22831 continue 3939 | |
del=b(k,:)-del 3939 | |
if(maxval(abs(del)).le.0.0)goto 22811 3940 | |
22860 do 22861 ic=1,nc 3940 | |
dlx=max(dlx,xv(k)*del(ic)**2) 3941 | |
r(jx(jb:je),ic)=r(jx(jb:je),ic) -del(ic)*w(jx(jb:je))*(x(jb:je)-x 3943 | |
*b(k))/xs(k) | |
22861 continue 3944 | |
22862 continue 3944 | |
22811 continue 3945 | |
22812 continue 3945 | |
if(dlx.lt.shr)goto 22802 3945 | |
if(nlp .le. maxit)goto 22881 3945 | |
jerr=-ilm 3945 | |
return 3945 | |
22881 continue 3947 | |
goto 22801 3948 | |
22802 continue 3948 | |
goto 22671 3949 | |
22672 continue 3949 | |
if(jxx.gt.0)goto 22602 3950 | |
22890 do 22891 ic=1,nc 3951 | |
if((b(0,ic)-bs(0,ic))**2.gt.shr) ixx=1 3952 | |
if(ixx .ne. 0)goto 22911 3953 | |
22920 do 22921 j=1,nin 3953 | |
k=m(j) 3954 | |
if(xv(k)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 22941 3954 | |
ixx=1 3954 | |
goto 22922 3954 | |
22941 continue 3956 | |
22921 continue 3957 | |
22922 continue 3957 | |
22911 continue 3958 | |
sc=b(0,ic)+g(:,ic) 3958 | |
b0=0.0 3959 | |
22950 do 22951 j=1,nin 3959 | |
l=m(j) 3959 | |
jb=ix(l) 3959 | |
je=ix(l+1)-1 3960 | |
sc(jx(jb:je))=sc(jx(jb:je))+b(l,ic)*x(jb:je)/xs(l) 3961 | |
b0=b0-b(l,ic)*xb(l)/xs(l) 3962 | |
22951 continue 3963 | |
22952 continue 3963 | |
sc=min(max(exmn,sc+b0),exmx) 3964 | |
sxp=sxp-q(:,ic) 3965 | |
q(:,ic)=min(max(emin*sxp,exp(sc)),emax*sxp) 3966 | |
sxp=sxp+q(:,ic) 3967 | |
22891 continue 3968 | |
22892 continue 3968 | |
s=sum(b(0,:))/nc 3968 | |
b(0,:)=b(0,:)-s 3969 | |
if(jxx.gt.0)goto 22602 3970 | |
if(ixx .ne. 0)goto 22971 3971 | |
22980 do 22981 j=1,ni 3971 | |
if(iy(j).eq.1)goto 22981 3971 | |
if(ju(j).eq.0)goto 22981 3971 | |
ga(j)=0.0 3971 | |
22981 continue 3972 | |
22982 continue 3972 | |
22990 do 22991 ic=1,nc 3972 | |
r(:,ic)=w*(y(:,ic)-q(:,ic)/sxp) 3973 | |
23000 do 23001 j=1,ni 3973 | |
if(iy(j).eq.1)goto 23001 3973 | |
if(ju(j).eq.0)goto 23001 3974 | |
jb=ix(j) 3974 | |
je=ix(j+1)-1 3975 | |
gj=dot_product(r(jx(jb:je),ic),x(jb:je)) 3976 | |
ga(j)=ga(j)+((gj-svr(ic)*xb(j))/xs(j))**2 3977 | |
23001 continue 3978 | |
23002 continue 3978 | |
22991 continue 3979 | |
22992 continue 3979 | |
ga=sqrt(ga) 3980 | |
23010 do 23011 k=1,ni 3980 | |
if(iy(k).eq.1)goto 23011 3980 | |
if(ju(k).eq.0)goto 23011 3981 | |
if(ga(k) .le. al1*vp(k))goto 23031 3981 | |
iy(k)=1 3981 | |
ixx=1 3981 | |
23031 continue 3982 | |
23011 continue 3983 | |
23012 continue 3983 | |
if(ixx.eq.1) go to 10880 3984 | |
goto 22602 3985 | |
22971 continue 3986 | |
goto 22601 3987 | |
22602 continue 3987 | |
if(kxx .le. 0)goto 23051 3987 | |
jerr=-20000-ilm 3987 | |
goto 22522 3987 | |
23051 continue 3988 | |
if(jxx .le. 0)goto 23071 3988 | |
jerr=-10000-ilm 3988 | |
goto 22522 3988 | |
23071 continue 3988 | |
devi=0.0 3989 | |
23080 do 23081 ic=1,nc 3990 | |
if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) 3990 | |
a0(ic,ilm)=b(0,ic) 3991 | |
23090 do 23091 i=1,no 3991 | |
if(y(i,ic).le.0.0)goto 23091 3992 | |
devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 3993 | |
23091 continue 3994 | |
23092 continue 3994 | |
23081 continue 3995 | |
23082 continue 3995 | |
kin(ilm)=nin 3995 | |
alm(ilm)=al 3995 | |
lmu=ilm 3996 | |
dev(ilm)=(dev1-devi)/dev0 3997 | |
if(ilm.lt.mnl)goto 22521 3997 | |
if(flmin.ge.1.0)goto 22521 3998 | |
me=0 3998 | |
23100 do 23101 j=1,nin 3998 | |
if(a(j,1,ilm).ne.0.0) me=me+1 3998 | |
23101 continue 3998 | |
23102 continue 3998 | |
if(me.gt.ne)goto 22522 3999 | |
if(dev(ilm).gt.devmax)goto 22522 3999 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 22522 4000 | |
22521 continue 4001 | |
22522 continue 4001 | |
g=log(q) 4001 | |
23110 do 23111 i=1,no 4001 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 4001 | |
23111 continue 4002 | |
23112 continue 4002 | |
deallocate(sxp,b,bs,r,q,mm,is,sc,ga,iy,gk,del,sxpl) 4003 | |
return 4004 | |
end 4005 | |
subroutine psort7 (v,a,ii,jj) | |
c | |
c puts into a the permutation vector which sorts v into | |
c increasing order. the array v is not modified. | |
c only elements from ii to jj are considered. | |
c arrays iu(k) and il(k) permit sorting up to 2**(k+1)-1 elements | |
c | |
c this is a modification of cacm algorithm #347 by r. c. singleton, | |
c which is a modified hoare quicksort. | |
c | |
dimension a(jj),v(jj),iu(20),il(20) | |
integer t,tt | |
integer a | |
real v | |
m=1 | |
i=ii | |
j=jj | |
10 if (i.ge.j) go to 80 | |
20 k=i | |
ij=(j+i)/2 | |
t=a(ij) | |
vt=v(t) | |
if (v(a(i)).le.vt) go to 30 | |
a(ij)=a(i) | |
a(i)=t | |
t=a(ij) | |
vt=v(t) | |
30 l=j | |
if (v(a(j)).ge.vt) go to 50 | |
a(ij)=a(j) | |
a(j)=t | |
t=a(ij) | |
vt=v(t) | |
if (v(a(i)).le.vt) go to 50 | |
a(ij)=a(i) | |
a(i)=t | |
t=a(ij) | |
vt=v(t) | |
go to 50 | |
40 a(l)=a(k) | |
a(k)=tt | |
50 l=l-1 | |
if (v(a(l)).gt.vt) go to 50 | |
tt=a(l) | |
vtt=v(tt) | |
60 k=k+1 | |
if (v(a(k)).lt.vt) go to 60 | |
if (k.le.l) go to 40 | |
if (l-i.le.j-k) go to 70 | |
il(m)=i | |
iu(m)=l | |
i=k | |
m=m+1 | |
go to 90 | |
70 il(m)=k | |
iu(m)=j | |
j=l | |
m=m+1 | |
go to 90 | |
80 m=m-1 | |
if (m.eq.0) return | |
i=il(m) | |
j=iu(m) | |
90 if (j-i.gt.10) go to 20 | |
if (i.eq.ii) go to 10 | |
i=i-1 | |
100 i=i+1 | |
if (i.eq.j) go to 80 | |
t=a(i+1) | |
vt=v(t) | |
if (v(a(i)).le.vt) go to 100 | |
k=i | |
110 a(k+1)=a(k) | |
k=k-1 | |
if (vt.lt.v(a(k))) go to 110 | |
a(k+1)=t | |
go to 100 | |
end |
This file has been truncated, but you can view the full file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
c mortran 2.0 (version of 7/04/75 mod 7/4/87 (ajc)) | |
subroutine get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 772 | |
implicit double precision(a-h,o-z) 773 | |
data sml0,eps0,big0,mnlam0,rsqmax0,pmin0,exmx0 /1.0d-5,1.0d-6,9.9 775 | |
*d35,5,0.999,1.0d-9,250.0/ | |
sml=sml0 775 | |
eps=eps0 775 | |
big=big0 775 | |
mnlam=mnlam0 775 | |
rsqmax=rsqmax0 776 | |
pmin=pmin0 776 | |
exmx=exmx0 777 | |
return 778 | |
entry chg_fract_dev(arg) 778 | |
sml0=arg 778 | |
return 779 | |
entry chg_dev_max(arg) 779 | |
rsqmax0=arg 779 | |
return 780 | |
entry chg_min_flmin(arg) 780 | |
eps0=arg 780 | |
return 781 | |
entry chg_big(arg) 781 | |
big0=arg 781 | |
return 782 | |
entry chg_min_lambdas(irg) 782 | |
mnlam0=irg 782 | |
return 783 | |
entry chg_min_null_prob(arg) 783 | |
pmin0=arg 783 | |
return 784 | |
entry chg_max_exp(arg) 784 | |
exmx0=arg 784 | |
return 785 | |
end 786 | |
subroutine elnet (ka,parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,u 789 | |
*lam,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 790 | |
double precision x(no,ni),y(no),w(no),vp(ni),ca(nx,nlam),cl(2,ni) 791 | |
double precision ulam(nlam),a0(nlam),rsq(nlam),alm(nlam) 792 | |
integer jd(*),ia(nx),nin(nlam) 793 | |
double precision, dimension (:), allocatable :: vq; | |
if(maxval(vp) .gt. 0.0)goto 10021 796 | |
jerr=10000 796 | |
return 796 | |
10021 continue 797 | |
allocate(vq(1:ni),stat=jerr) 797 | |
if(jerr.ne.0) return 798 | |
vq=max(0d0,vp) 798 | |
vq=vq*ni/sum(vq) 799 | |
if(ka .ne. 1)goto 10041 800 | |
call elnetu (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr, 803 | |
*isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
goto 10051 804 | |
10041 continue 805 | |
call elnetn (parm,no,ni,x,y,w,jd,vq,cl,ne,nx,nlam,flmin,ulam,thr,i 808 | |
*sd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
10051 continue 809 | |
10031 continue 809 | |
deallocate(vq) 810 | |
return 811 | |
end 812 | |
subroutine elnetu (parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ula 815 | |
*m,thr,isd,intr,maxit, lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 816 | |
double precision x(no,ni),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 817 | |
double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 818 | |
integer jd(*),ia(nx),nin(nlam) 819 | |
double precision, dimension (:), allocatable :: xm,xs,g,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(g(1:ni),stat=jerr) 824 | |
if(jerr.ne.0) return 825 | |
allocate(xm(1:ni),stat=jerr) 826 | |
if(jerr.ne.0) return 827 | |
allocate(xs(1:ni),stat=jerr) 828 | |
if(jerr.ne.0) return 829 | |
allocate(ju(1:ni),stat=jerr) 830 | |
if(jerr.ne.0) return 831 | |
allocate(xv(1:ni),stat=jerr) 832 | |
if(jerr.ne.0) return 833 | |
allocate(vlam(1:nlam),stat=jerr) 834 | |
if(jerr.ne.0) return 835 | |
call chkvars(no,ni,x,ju) 836 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 837 | |
if(maxval(ju) .gt. 0)goto 10071 837 | |
jerr=7777 837 | |
return 837 | |
10071 continue 838 | |
call standard(no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr) 839 | |
if(jerr.ne.0) return 840 | |
cl=cl/ys 840 | |
if(isd .le. 0)goto 10091 840 | |
10100 do 10101 j=1,ni 840 | |
cl(:,j)=cl(:,j)*xs(j) 840 | |
10101 continue 840 | |
10102 continue 840 | |
10091 continue 841 | |
if(flmin.ge.1.0) vlam=ulam/ys 842 | |
call elnet1(parm,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,vlam,thr,maxi 844 | |
*t,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 845 | |
10110 do 10111 k=1,lmu 845 | |
alm(k)=ys*alm(k) 845 | |
nk=nin(k) 846 | |
10120 do 10121 l=1,nk 846 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 846 | |
10121 continue 846 | |
10122 continue 846 | |
a0(k)=0.0 847 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 848 | |
10111 continue 849 | |
10112 continue 849 | |
deallocate(xm,xs,g,ju,xv,vlam) 850 | |
return 851 | |
end 852 | |
subroutine standard (no,ni,x,y,w,isd,intr,ju,g,xm,xs,ym,ys,xv,jerr 853 | |
*) | |
implicit double precision(a-h,o-z) 854 | |
double precision x(no,ni),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni) 855 | |
integer ju(ni) 856 | |
double precision, dimension (:), allocatable :: v | |
allocate(v(1:no),stat=jerr) 859 | |
if(jerr.ne.0) return 860 | |
w=w/sum(w) 860 | |
v=sqrt(w) 861 | |
if(intr .ne. 0)goto 10141 861 | |
ym=0.0 861 | |
y=v*y 862 | |
ys=sqrt(dot_product(y,y)-dot_product(v,y)**2) 862 | |
y=y/ys 863 | |
10150 do 10151 j=1,ni 863 | |
if(ju(j).eq.0)goto 10151 863 | |
xm(j)=0.0 863 | |
x(:,j)=v*x(:,j) 864 | |
xv(j)=dot_product(x(:,j),x(:,j)) 865 | |
if(isd .eq. 0)goto 10171 865 | |
xbq=dot_product(v,x(:,j))**2 865 | |
vc=xv(j)-xbq 866 | |
xs(j)=sqrt(vc) 866 | |
x(:,j)=x(:,j)/xs(j) 866 | |
xv(j)=1.0+xbq/vc 867 | |
goto 10181 868 | |
10171 continue 868 | |
xs(j)=1.0 868 | |
10181 continue 869 | |
10161 continue 869 | |
10151 continue 870 | |
10152 continue 870 | |
goto 10191 871 | |
10141 continue 872 | |
10200 do 10201 j=1,ni 872 | |
if(ju(j).eq.0)goto 10201 873 | |
xm(j)=dot_product(w,x(:,j)) 873 | |
x(:,j)=v*(x(:,j)-xm(j)) 874 | |
xv(j)=dot_product(x(:,j),x(:,j)) 874 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 875 | |
10201 continue 876 | |
10202 continue 876 | |
if(isd .ne. 0)goto 10221 876 | |
xs=1.0 876 | |
goto 10231 877 | |
10221 continue 878 | |
10240 do 10241 j=1,ni 878 | |
if(ju(j).eq.0)goto 10241 878 | |
x(:,j)=x(:,j)/xs(j) 878 | |
10241 continue 879 | |
10242 continue 879 | |
xv=1.0 880 | |
10231 continue 881 | |
10211 continue 881 | |
ym=dot_product(w,y) 881 | |
y=v*(y-ym) 881 | |
ys=sqrt(dot_product(y,y)) 881 | |
y=y/ys 882 | |
10191 continue 883 | |
10131 continue 883 | |
g=0.0 883 | |
10250 do 10251 j=1,ni 883 | |
if(ju(j).ne.0) g(j)=dot_product(y,x(:,j)) 883 | |
10251 continue 884 | |
10252 continue 884 | |
deallocate(v) 885 | |
return 886 | |
end 887 | |
subroutine elnet1 (beta,ni,ju,vp,cl,g,no,ne,nx,x,nlam,flmin,ulam,t 889 | |
*hr,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
implicit double precision(a-h,o-z) 890 | |
double precision vp(ni),g(ni),x(no,ni),ulam(nlam),ao(nx,nlam) 891 | |
double precision rsqo(nlam),almo(nlam),xv(ni) 892 | |
double precision cl(2,ni) 893 | |
integer ju(ni),ia(nx),kin(nlam) 894 | |
double precision, dimension (:), allocatable :: a,da | |
integer, dimension (:), allocatable :: mm | |
double precision, dimension (:,:), allocatable :: c | |
allocate(c(1:ni,1:nx),stat=jerr) | |
if(jerr.ne.0) return; | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 902 | |
allocate(a(1:ni),stat=jerr) 903 | |
if(jerr.ne.0) return 904 | |
allocate(mm(1:ni),stat=jerr) 905 | |
if(jerr.ne.0) return 906 | |
allocate(da(1:ni),stat=jerr) 907 | |
if(jerr.ne.0) return 908 | |
bta=beta 908 | |
omb=1.0-bta 909 | |
if(flmin .ge. 1.0)goto 10271 909 | |
eqs=max(eps,flmin) 909 | |
alf=eqs**(1.0/(nlam-1)) 909 | |
10271 continue 910 | |
rsq=0.0 910 | |
a=0.0 910 | |
mm=0 910 | |
nlp=0 910 | |
nin=nlp 910 | |
iz=0 910 | |
mnl=min(mnlam,nlam) 912 | |
alm=0.0 914 | |
10280 do 10281 m=1,nlam 915 | |
if(flmin .lt. 1.0)goto 10301 915 | |
alm=ulam(m) 915 | |
goto 10291 916 | |
10301 if(m .le. 2)goto 10311 916 | |
alm=alm*alf 916 | |
goto 10291 917 | |
10311 if(m .ne. 1)goto 10321 917 | |
alm=big 917 | |
goto 10331 918 | |
10321 continue 918 | |
alm=0.0 919 | |
10340 do 10341 j=1,ni 919 | |
if(ju(j).eq.0)goto 10341 919 | |
if(vp(j).le.0.0)goto 10341 920 | |
alm=max(alm,abs(g(j))/vp(j)) 921 | |
10341 continue 922 | |
10342 continue 922 | |
alm=alf*alm/max(bta,1.0d-3) 923 | |
10331 continue 924 | |
10291 continue 924 | |
dem=alm*omb 924 | |
ab=alm*bta 924 | |
rsq0=rsq 924 | |
jz=1 925 | |
10350 continue 925 | |
10351 continue 925 | |
if(iz*jz.ne.0) go to 10360 925 | |
nlp=nlp+1 925 | |
dlx=0.0 926 | |
10370 do 10371 k=1,ni 926 | |
if(ju(k).eq.0)goto 10371 927 | |
ak=a(k) 927 | |
u=g(k)+ak*xv(k) 927 | |
v=abs(u)-vp(k)*ab 927 | |
a(k)=0.0 929 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 930 | |
*em))) | |
if(a(k).eq.ak)goto 10371 931 | |
if(mm(k) .ne. 0)goto 10391 931 | |
nin=nin+1 931 | |
if(nin.gt.nx)goto 10372 932 | |
10400 do 10401 j=1,ni 932 | |
if(ju(j).eq.0)goto 10401 933 | |
if(mm(j) .eq. 0)goto 10421 933 | |
c(j,nin)=c(k,mm(j)) 933 | |
goto 10401 933 | |
10421 continue 934 | |
if(j .ne. k)goto 10441 934 | |
c(j,nin)=xv(j) 934 | |
goto 10401 934 | |
10441 continue 935 | |
c(j,nin)=dot_product(x(:,j),x(:,k)) 936 | |
10401 continue 937 | |
10402 continue 937 | |
mm(k)=nin 937 | |
ia(nin)=k 938 | |
10391 continue 939 | |
del=a(k)-ak 939 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 940 | |
dlx=max(xv(k)*del**2,dlx) 941 | |
10450 do 10451 j=1,ni 941 | |
if(ju(j).ne.0) g(j)=g(j)-c(j,mm(k))*del 941 | |
10451 continue 942 | |
10452 continue 942 | |
10371 continue 943 | |
10372 continue 943 | |
if(dlx.lt.thr)goto 10352 943 | |
if(nin.gt.nx)goto 10352 944 | |
if(nlp .le. maxit)goto 10471 944 | |
jerr=-m 944 | |
return 944 | |
10471 continue 945 | |
10360 continue 945 | |
iz=1 945 | |
da(1:nin)=a(ia(1:nin)) 946 | |
10480 continue 946 | |
10481 continue 946 | |
nlp=nlp+1 946 | |
dlx=0.0 947 | |
10490 do 10491 l=1,nin 947 | |
k=ia(l) 947 | |
ak=a(k) 947 | |
u=g(k)+ak*xv(k) 947 | |
v=abs(u)-vp(k)*ab 948 | |
a(k)=0.0 950 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 951 | |
*em))) | |
if(a(k).eq.ak)goto 10491 952 | |
del=a(k)-ak 952 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 953 | |
dlx=max(xv(k)*del**2,dlx) 954 | |
10500 do 10501 j=1,nin 954 | |
g(ia(j))=g(ia(j))-c(ia(j),mm(k))*del 954 | |
10501 continue 955 | |
10502 continue 955 | |
10491 continue 956 | |
10492 continue 956 | |
if(dlx.lt.thr)goto 10482 956 | |
if(nlp .le. maxit)goto 10521 956 | |
jerr=-m 956 | |
return 956 | |
10521 continue 957 | |
goto 10481 958 | |
10482 continue 958 | |
da(1:nin)=a(ia(1:nin))-da(1:nin) 959 | |
10530 do 10531 j=1,ni 959 | |
if(mm(j).ne.0)goto 10531 960 | |
if(ju(j).ne.0) g(j)=g(j)-dot_product(da(1:nin),c(j,1:nin)) 961 | |
10531 continue 962 | |
10532 continue 962 | |
jz=0 963 | |
goto 10351 964 | |
10352 continue 964 | |
if(nin .le. nx)goto 10551 964 | |
jerr=-10000-m 964 | |
goto 10282 964 | |
10551 continue 965 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 965 | |
kin(m)=nin 966 | |
rsqo(m)=rsq 966 | |
almo(m)=alm 966 | |
lmu=m 967 | |
if(m.lt.mnl)goto 10281 967 | |
if(flmin.ge.1.0)goto 10281 968 | |
me=0 968 | |
10560 do 10561 j=1,nin 968 | |
if(ao(j,m).ne.0.0) me=me+1 968 | |
10561 continue 968 | |
10562 continue 968 | |
if(me.gt.ne)goto 10282 969 | |
if(rsq-rsq0.lt.sml*rsq)goto 10282 969 | |
if(rsq.gt.rsqmax)goto 10282 970 | |
10281 continue 971 | |
10282 continue 971 | |
deallocate(a,mm,c,da) 972 | |
return 973 | |
end 974 | |
subroutine elnetn (parm,no,ni,x,y,w,jd,vp,cl,ne,nx,nlam,flmin,ulam 976 | |
*,thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 977 | |
double precision vp(ni),x(no,ni),y(no),w(no),ulam(nlam),cl(2,ni) 978 | |
double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 979 | |
integer jd(*),ia(nx),nin(nlam) 980 | |
double precision, dimension (:), allocatable :: xm,xs,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(xm(1:ni),stat=jerr) 985 | |
if(jerr.ne.0) return 986 | |
allocate(xs(1:ni),stat=jerr) 987 | |
if(jerr.ne.0) return 988 | |
allocate(ju(1:ni),stat=jerr) 989 | |
if(jerr.ne.0) return 990 | |
allocate(xv(1:ni),stat=jerr) 991 | |
if(jerr.ne.0) return 992 | |
allocate(vlam(1:nlam),stat=jerr) 993 | |
if(jerr.ne.0) return 994 | |
call chkvars(no,ni,x,ju) 995 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 996 | |
if(maxval(ju) .gt. 0)goto 10581 996 | |
jerr=7777 996 | |
return 996 | |
10581 continue 997 | |
call standard1(no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr) 998 | |
if(jerr.ne.0) return 999 | |
cl=cl/ys 999 | |
if(isd .le. 0)goto 10601 999 | |
10610 do 10611 j=1,ni 999 | |
cl(:,j)=cl(:,j)*xs(j) 999 | |
10611 continue 999 | |
10612 continue 999 | |
10601 continue 1000 | |
if(flmin.ge.1.0) vlam=ulam/ys 1001 | |
call elnet2(parm,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,vlam,thr,maxi 1003 | |
*t,xv, lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 1004 | |
10620 do 10621 k=1,lmu 1004 | |
alm(k)=ys*alm(k) 1004 | |
nk=nin(k) 1005 | |
10630 do 10631 l=1,nk 1005 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 1005 | |
10631 continue 1005 | |
10632 continue 1005 | |
a0(k)=0.0 1006 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 1007 | |
10621 continue 1008 | |
10622 continue 1008 | |
deallocate(xm,xs,ju,xv,vlam) 1009 | |
return 1010 | |
end 1011 | |
subroutine standard1 (no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr) 1012 | |
implicit double precision(a-h,o-z) 1013 | |
double precision x(no,ni),y(no),w(no),xm(ni),xs(ni),xv(ni) 1013 | |
integer ju(ni) 1014 | |
double precision, dimension (:), allocatable :: v | |
allocate(v(1:no),stat=jerr) 1017 | |
if(jerr.ne.0) return 1018 | |
w=w/sum(w) 1018 | |
v=sqrt(w) 1019 | |
if(intr .ne. 0)goto 10651 1019 | |
ym=0.0 1019 | |
y=v*y 1020 | |
ys=sqrt(dot_product(y,y)-dot_product(v,y)**2) 1020 | |
y=y/ys 1021 | |
10660 do 10661 j=1,ni 1021 | |
if(ju(j).eq.0)goto 10661 1021 | |
xm(j)=0.0 1021 | |
x(:,j)=v*x(:,j) 1022 | |
xv(j)=dot_product(x(:,j),x(:,j)) 1023 | |
if(isd .eq. 0)goto 10681 1023 | |
xbq=dot_product(v,x(:,j))**2 1023 | |
vc=xv(j)-xbq 1024 | |
xs(j)=sqrt(vc) 1024 | |
x(:,j)=x(:,j)/xs(j) 1024 | |
xv(j)=1.0+xbq/vc 1025 | |
goto 10691 1026 | |
10681 continue 1026 | |
xs(j)=1.0 1026 | |
10691 continue 1027 | |
10671 continue 1027 | |
10661 continue 1028 | |
10662 continue 1028 | |
go to 10700 1029 | |
10651 continue 1030 | |
10710 do 10711 j=1,ni 1030 | |
if(ju(j).eq.0)goto 10711 1031 | |
xm(j)=dot_product(w,x(:,j)) 1031 | |
x(:,j)=v*(x(:,j)-xm(j)) 1032 | |
xv(j)=dot_product(x(:,j),x(:,j)) 1032 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 1033 | |
10711 continue 1034 | |
10712 continue 1034 | |
if(isd .ne. 0)goto 10731 1034 | |
xs=1.0 1034 | |
goto 10741 1035 | |
10731 continue 1035 | |
10750 do 10751 j=1,ni 1035 | |
if(ju(j).eq.0)goto 10751 1035 | |
x(:,j)=x(:,j)/xs(j) 1035 | |
10751 continue 1036 | |
10752 continue 1036 | |
xv=1.0 1037 | |
10741 continue 1038 | |
10721 continue 1038 | |
ym=dot_product(w,y) 1038 | |
y=v*(y-ym) 1038 | |
ys=sqrt(dot_product(y,y)) 1038 | |
y=y/ys 1039 | |
10700 continue 1039 | |
deallocate(v) 1040 | |
return 1041 | |
end 1042 | |
subroutine elnet2(beta,ni,ju,vp,cl,y,no,ne,nx,x,nlam,flmin,ulam,th 1044 | |
*r,maxit,xv, lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
implicit double precision(a-h,o-z) 1045 | |
double precision vp(ni),y(no),x(no,ni),ulam(nlam),ao(nx,nlam) 1046 | |
double precision rsqo(nlam),almo(nlam),xv(ni) 1047 | |
double precision cl(2,ni) 1048 | |
integer ju(ni),ia(nx),kin(nlam) 1049 | |
double precision, dimension (:), allocatable :: a,g | |
integer, dimension (:), allocatable :: mm,ix | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 1054 | |
allocate(a(1:ni),stat=jerr) 1055 | |
if(jerr.ne.0) return 1056 | |
allocate(mm(1:ni),stat=jerr) 1057 | |
if(jerr.ne.0) return 1058 | |
allocate(g(1:ni),stat=jerr) 1059 | |
if(jerr.ne.0) return 1060 | |
allocate(ix(1:ni),stat=jerr) 1061 | |
if(jerr.ne.0) return 1062 | |
bta=beta 1062 | |
omb=1.0-bta 1062 | |
ix=0 1064 | |
alf=1.0 1066 | |
if(flmin .ge. 1.0)goto 10771 1066 | |
eqs=max(eps,flmin) 1066 | |
alf=eqs**(1.0/(nlam-1)) 1066 | |
10771 continue 1067 | |
rsq=0.0 1067 | |
a=0.0 1067 | |
mm=0 1067 | |
nlp=0 1067 | |
nin=nlp 1067 | |
iz=0 1067 | |
mnl=min(mnlam,nlam) 1067 | |
alm=0.0 1068 | |
10780 do 10781 j=1,ni 1068 | |
if(ju(j).eq.0)goto 10781 1068 | |
g(j)=abs(dot_product(y,x(:,j))) 1068 | |
10781 continue 1069 | |
10782 continue 1069 | |
10790 do 10791 m=1,nlam 1069 | |
alm0=alm 1070 | |
if(flmin .lt. 1.0)goto 10811 1070 | |
alm=ulam(m) 1070 | |
goto 10801 1071 | |
10811 if(m .le. 2)goto 10821 1071 | |
alm=alm*alf 1071 | |
goto 10801 1072 | |
10821 if(m .ne. 1)goto 10831 1072 | |
alm=big 1072 | |
goto 10841 1073 | |
10831 continue 1073 | |
alm0=0.0 1074 | |
10850 do 10851 j=1,ni 1074 | |
if(ju(j).eq.0)goto 10851 1074 | |
if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 1074 | |
10851 continue 1075 | |
10852 continue 1075 | |
alm0=alm0/max(bta,1.0d-3) 1075 | |
alm=alf*alm0 1076 | |
10841 continue 1077 | |
10801 continue 1077 | |
dem=alm*omb 1077 | |
ab=alm*bta 1077 | |
rsq0=rsq 1077 | |
jz=1 1078 | |
tlam=bta*(2.0*alm-alm0) 1079 | |
10860 do 10861 k=1,ni 1079 | |
if(ix(k).eq.1)goto 10861 1079 | |
if(ju(k).eq.0)goto 10861 1080 | |
if(g(k).gt.tlam*vp(k)) ix(k)=1 1081 | |
10861 continue 1082 | |
10862 continue 1082 | |
10870 continue 1082 | |
10871 continue 1082 | |
if(iz*jz.ne.0) go to 10360 1083 | |
10880 continue 1083 | |
nlp=nlp+1 1083 | |
dlx=0.0 1084 | |
10890 do 10891 k=1,ni 1084 | |
if(ix(k).eq.0)goto 10891 1084 | |
gk=dot_product(y,x(:,k)) 1085 | |
ak=a(k) 1085 | |
u=gk+ak*xv(k) 1085 | |
v=abs(u)-vp(k)*ab 1085 | |
a(k)=0.0 1087 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1088 | |
*em))) | |
if(a(k).eq.ak)goto 10891 1089 | |
if(mm(k) .ne. 0)goto 10911 1089 | |
nin=nin+1 1089 | |
if(nin.gt.nx)goto 10892 1090 | |
mm(k)=nin 1090 | |
ia(nin)=k 1091 | |
10911 continue 1092 | |
del=a(k)-ak 1092 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1093 | |
y=y-del*x(:,k) 1093 | |
dlx=max(xv(k)*del**2,dlx) 1094 | |
10891 continue 1095 | |
10892 continue 1095 | |
if(nin.gt.nx)goto 10872 1096 | |
if(dlx .ge. thr)goto 10931 1096 | |
ixx=0 1097 | |
10940 do 10941 k=1,ni 1097 | |
if(ix(k).eq.1)goto 10941 1097 | |
if(ju(k).eq.0)goto 10941 1098 | |
g(k)=abs(dot_product(y,x(:,k))) 1099 | |
if(g(k) .le. ab*vp(k))goto 10961 1099 | |
ix(k)=1 1099 | |
ixx=1 1099 | |
10961 continue 1100 | |
10941 continue 1101 | |
10942 continue 1101 | |
if(ixx.eq.1) go to 10880 1102 | |
goto 10872 1103 | |
10931 continue 1104 | |
if(nlp .le. maxit)goto 10981 1104 | |
jerr=-m 1104 | |
return 1104 | |
10981 continue 1105 | |
10360 continue 1105 | |
iz=1 1106 | |
10990 continue 1106 | |
10991 continue 1106 | |
nlp=nlp+1 1106 | |
dlx=0.0 1107 | |
11000 do 11001 l=1,nin 1107 | |
k=ia(l) 1107 | |
gk=dot_product(y,x(:,k)) 1108 | |
ak=a(k) 1108 | |
u=gk+ak*xv(k) 1108 | |
v=abs(u)-vp(k)*ab 1108 | |
a(k)=0.0 1110 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1111 | |
*em))) | |
if(a(k).eq.ak)goto 11001 1112 | |
del=a(k)-ak 1112 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1113 | |
y=y-del*x(:,k) 1113 | |
dlx=max(xv(k)*del**2,dlx) 1114 | |
11001 continue 1115 | |
11002 continue 1115 | |
if(dlx.lt.thr)goto 10992 1115 | |
if(nlp .le. maxit)goto 11021 1115 | |
jerr=-m 1115 | |
return 1115 | |
11021 continue 1116 | |
goto 10991 1117 | |
10992 continue 1117 | |
jz=0 1118 | |
goto 10871 1119 | |
10872 continue 1119 | |
if(nin .le. nx)goto 11041 1119 | |
jerr=-10000-m 1119 | |
goto 10792 1119 | |
11041 continue 1120 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 1120 | |
kin(m)=nin 1121 | |
rsqo(m)=rsq 1121 | |
almo(m)=alm 1121 | |
lmu=m 1122 | |
if(m.lt.mnl)goto 10791 1122 | |
if(flmin.ge.1.0)goto 10791 1123 | |
me=0 1123 | |
11050 do 11051 j=1,nin 1123 | |
if(ao(j,m).ne.0.0) me=me+1 1123 | |
11051 continue 1123 | |
11052 continue 1123 | |
if(me.gt.ne)goto 10792 1124 | |
if(rsq-rsq0.lt.sml*rsq)goto 10792 1124 | |
if(rsq.gt.rsqmax)goto 10792 1125 | |
10791 continue 1126 | |
10792 continue 1126 | |
deallocate(a,mm,g,ix) 1127 | |
return 1128 | |
end 1129 | |
subroutine chkvars(no,ni,x,ju) 1130 | |
implicit double precision(a-h,o-z) 1131 | |
double precision x(no,ni) 1131 | |
integer ju(ni) 1132 | |
11060 do 11061 j=1,ni 1132 | |
ju(j)=0 1132 | |
t=x(1,j) 1133 | |
11070 do 11071 i=2,no 1133 | |
if(x(i,j).eq.t)goto 11071 1133 | |
ju(j)=1 1133 | |
goto 11072 1133 | |
11071 continue 1134 | |
11072 continue 1134 | |
11061 continue 1135 | |
11062 continue 1135 | |
return 1136 | |
end 1137 | |
subroutine uncomp(ni,ca,ia,nin,a) 1138 | |
implicit double precision(a-h,o-z) 1139 | |
double precision ca(*),a(ni) 1139 | |
integer ia(*) 1140 | |
a=0.0 1140 | |
if(nin.gt.0) a(ia(1:nin))=ca(1:nin) 1141 | |
return 1142 | |
end 1143 | |
subroutine modval(a0,ca,ia,nin,n,x,f) 1144 | |
implicit double precision(a-h,o-z) 1145 | |
double precision ca(nin),x(n,*),f(n) 1145 | |
integer ia(nin) 1146 | |
f=a0 1146 | |
if(nin.le.0) return 1147 | |
11080 do 11081 i=1,n 1147 | |
f(i)=f(i)+dot_product(ca(1:nin),x(i,ia(1:nin))) 1147 | |
11081 continue 1148 | |
11082 continue 1148 | |
return 1149 | |
end 1150 | |
subroutine spelnet (ka,parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam 1153 | |
*,flmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr | |
*) | |
implicit double precision(a-h,o-z) 1154 | |
double precision x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 1155 | |
double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 1156 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 1157 | |
double precision, dimension (:), allocatable :: vq; | |
if(maxval(vp) .gt. 0.0)goto 11101 1160 | |
jerr=10000 1160 | |
return 1160 | |
11101 continue 1161 | |
allocate(vq(1:ni),stat=jerr) 1161 | |
if(jerr.ne.0) return 1162 | |
vq=max(0d0,vp) 1162 | |
vq=vq*ni/sum(vq) 1163 | |
if(ka .ne. 1)goto 11121 1164 | |
call spelnetu (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,u 1167 | |
*lam,thr,isd, intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
goto 11131 1168 | |
11121 continue 1169 | |
call spelnetn (parm,no,ni,x,ix,jx,y,w,jd,vq,cl,ne,nx,nlam,flmin,ul 1172 | |
*am,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
11131 continue 1173 | |
11111 continue 1173 | |
deallocate(vq) 1174 | |
return 1175 | |
end 1176 | |
subroutine spelnetu (parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,f 1179 | |
*lmin,ulam,thr,isd,intr, maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 1180 | |
double precision x(*),y(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 1181 | |
double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 1182 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 1183 | |
double precision, dimension (:), allocatable :: xm,xs,g,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(g(1:ni),stat=jerr) 1188 | |
if(jerr.ne.0) return 1189 | |
allocate(xm(1:ni),stat=jerr) 1190 | |
if(jerr.ne.0) return 1191 | |
allocate(xs(1:ni),stat=jerr) 1192 | |
if(jerr.ne.0) return 1193 | |
allocate(ju(1:ni),stat=jerr) 1194 | |
if(jerr.ne.0) return 1195 | |
allocate(xv(1:ni),stat=jerr) 1196 | |
if(jerr.ne.0) return 1197 | |
allocate(vlam(1:nlam),stat=jerr) 1198 | |
if(jerr.ne.0) return 1199 | |
call spchkvars(no,ni,x,ix,ju) 1200 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 1201 | |
if(maxval(ju) .gt. 0)goto 11151 1201 | |
jerr=7777 1201 | |
return 1201 | |
11151 continue 1202 | |
call spstandard(no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys,xv,jer 1203 | |
*r) | |
if(jerr.ne.0) return 1204 | |
cl=cl/ys 1204 | |
if(isd .le. 0)goto 11171 1204 | |
11180 do 11181 j=1,ni 1204 | |
cl(:,j)=cl(:,j)*xs(j) 1204 | |
11181 continue 1204 | |
11182 continue 1204 | |
11171 continue 1205 | |
if(flmin.ge.1.0) vlam=ulam/ys 1206 | |
call spelnet1(parm,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vla 1208 | |
*m,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 1209 | |
11190 do 11191 k=1,lmu 1209 | |
alm(k)=ys*alm(k) 1209 | |
nk=nin(k) 1210 | |
11200 do 11201 l=1,nk 1210 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 1210 | |
11201 continue 1210 | |
11202 continue 1210 | |
a0(k)=0.0 1211 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 1212 | |
11191 continue 1213 | |
11192 continue 1213 | |
deallocate(xm,xs,g,ju,xv,vlam) 1214 | |
return 1215 | |
end 1216 | |
subroutine spstandard (no,ni,x,ix,jx,y,w,ju,isd,intr,g,xm,xs,ym,ys 1217 | |
*,xv,jerr) | |
implicit double precision(a-h,o-z) 1218 | |
double precision x(*),y(no),w(no),g(ni),xm(ni),xs(ni),xv(ni) 1219 | |
integer ix(*),jx(*),ju(ni) 1220 | |
w=w/sum(w) 1221 | |
if(intr .ne. 0)goto 11221 1221 | |
ym=0.0 1222 | |
ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2) 1222 | |
y=y/ys 1223 | |
11230 do 11231 j=1,ni 1223 | |
if(ju(j).eq.0)goto 11231 1223 | |
xm(j)=0.0 1223 | |
jb=ix(j) 1223 | |
je=ix(j+1)-1 1224 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) 1225 | |
if(isd .eq. 0)goto 11251 1225 | |
xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 1225 | |
vc=xv(j)-xbq 1226 | |
xs(j)=sqrt(vc) 1226 | |
xv(j)=1.0+xbq/vc 1227 | |
goto 11261 1228 | |
11251 continue 1228 | |
xs(j)=1.0 1228 | |
11261 continue 1229 | |
11241 continue 1229 | |
11231 continue 1230 | |
11232 continue 1230 | |
goto 11271 1231 | |
11221 continue 1232 | |
11280 do 11281 j=1,ni 1232 | |
if(ju(j).eq.0)goto 11281 1233 | |
jb=ix(j) 1233 | |
je=ix(j+1)-1 1233 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 1234 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 1235 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 1236 | |
11281 continue 1237 | |
11282 continue 1237 | |
if(isd .ne. 0)goto 11301 1237 | |
xs=1.0 1237 | |
goto 11311 1237 | |
11301 continue 1237 | |
xv=1.0 1237 | |
11311 continue 1238 | |
11291 continue 1238 | |
ym=dot_product(w,y) 1238 | |
y=y-ym 1238 | |
ys=sqrt(dot_product(w,y**2)) 1238 | |
y=y/ys 1239 | |
11271 continue 1240 | |
11211 continue 1240 | |
g=0.0 1241 | |
11320 do 11321 j=1,ni 1241 | |
if(ju(j).eq.0)goto 11321 1241 | |
jb=ix(j) 1241 | |
je=ix(j+1)-1 1242 | |
g(j)=dot_product(w(jx(jb:je))*y(jx(jb:je)),x(jb:je))/xs(j) 1243 | |
11321 continue 1244 | |
11322 continue 1244 | |
return 1245 | |
end 1246 | |
subroutine spelnet1(beta,ni,g,no,w,ne,nx,x,ix,jx,ju,vp,cl,nlam,flm 1248 | |
*in,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
implicit double precision(a-h,o-z) 1249 | |
double precision g(ni),vp(ni),x(*),ulam(nlam),w(no) 1250 | |
double precision ao(nx,nlam),rsqo(nlam),almo(nlam) 1251 | |
double precision xm(ni),xs(ni),xv(ni),cl(2,ni) 1252 | |
integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) 1253 | |
double precision, dimension (:), allocatable :: a,da | |
integer, dimension (:), allocatable :: mm | |
double precision, dimension (:,:), allocatable :: c | |
allocate(c(1:ni,1:nx),stat=jerr) | |
if(jerr.ne.0) return; | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 1261 | |
allocate(a(1:ni),stat=jerr) 1262 | |
if(jerr.ne.0) return 1263 | |
allocate(mm(1:ni),stat=jerr) 1264 | |
if(jerr.ne.0) return 1265 | |
allocate(da(1:ni),stat=jerr) 1266 | |
if(jerr.ne.0) return 1267 | |
bta=beta 1267 | |
omb=1.0-bta 1269 | |
alm=0.0 1269 | |
alf=1.0 1271 | |
if(flmin .ge. 1.0)goto 11341 1271 | |
eqs=max(eps,flmin) 1271 | |
alf=eqs**(1.0/(nlam-1)) 1271 | |
11341 continue 1272 | |
rsq=0.0 1272 | |
a=0.0 1272 | |
mm=0 1272 | |
nlp=0 1272 | |
nin=nlp 1272 | |
iz=0 1272 | |
mnl=min(mnlam,nlam) 1273 | |
11350 do 11351 m=1,nlam 1274 | |
if(flmin .lt. 1.0)goto 11371 1274 | |
alm=ulam(m) 1274 | |
goto 11361 1275 | |
11371 if(m .le. 2)goto 11381 1275 | |
alm=alm*alf 1275 | |
goto 11361 1276 | |
11381 if(m .ne. 1)goto 11391 1276 | |
alm=big 1276 | |
goto 11401 1277 | |
11391 continue 1277 | |
alm=0.0 1278 | |
11410 do 11411 j=1,ni 1278 | |
if(ju(j).eq.0)goto 11411 1278 | |
if(vp(j).le.0.0)goto 11411 1279 | |
alm=max(alm,abs(g(j))/vp(j)) 1280 | |
11411 continue 1281 | |
11412 continue 1281 | |
alm=alf*alm/max(bta,1.0d-3) 1282 | |
11401 continue 1283 | |
11361 continue 1283 | |
dem=alm*omb 1283 | |
ab=alm*bta 1283 | |
rsq0=rsq 1283 | |
jz=1 1284 | |
11420 continue 1284 | |
11421 continue 1284 | |
if(iz*jz.ne.0) go to 10360 1284 | |
nlp=nlp+1 1284 | |
dlx=0.0 1285 | |
11430 do 11431 k=1,ni 1285 | |
if(ju(k).eq.0)goto 11431 1286 | |
ak=a(k) 1286 | |
u=g(k)+ak*xv(k) 1286 | |
v=abs(u)-vp(k)*ab 1286 | |
a(k)=0.0 1288 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1289 | |
*em))) | |
if(a(k).eq.ak)goto 11431 1290 | |
if(mm(k) .ne. 0)goto 11451 1290 | |
nin=nin+1 1290 | |
if(nin.gt.nx)goto 11432 1291 | |
11460 do 11461 j=1,ni 1291 | |
if(ju(j).eq.0)goto 11461 1292 | |
if(mm(j) .eq. 0)goto 11481 1292 | |
c(j,nin)=c(k,mm(j)) 1292 | |
goto 11461 1292 | |
11481 continue 1293 | |
if(j .ne. k)goto 11501 1293 | |
c(j,nin)=xv(j) 1293 | |
goto 11461 1293 | |
11501 continue 1294 | |
c(j,nin)= (row_prod(j,k,ix,jx,x,w)-xm(j)*xm(k))/(xs(j)*xs(k)) 1296 | |
11461 continue 1297 | |
11462 continue 1297 | |
mm(k)=nin 1297 | |
ia(nin)=k 1298 | |
11451 continue 1299 | |
del=a(k)-ak 1299 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 1300 | |
dlx=max(xv(k)*del**2,dlx) 1301 | |
11510 do 11511 j=1,ni 1301 | |
if(ju(j).ne.0) g(j)=g(j)-c(j,mm(k))*del 1301 | |
11511 continue 1302 | |
11512 continue 1302 | |
11431 continue 1303 | |
11432 continue 1303 | |
if(dlx.lt.thr)goto 11422 1303 | |
if(nin.gt.nx)goto 11422 1304 | |
if(nlp .le. maxit)goto 11531 1304 | |
jerr=-m 1304 | |
return 1304 | |
11531 continue 1305 | |
10360 continue 1305 | |
iz=1 1305 | |
da(1:nin)=a(ia(1:nin)) 1306 | |
11540 continue 1306 | |
11541 continue 1306 | |
nlp=nlp+1 1306 | |
dlx=0.0 1307 | |
11550 do 11551 l=1,nin 1307 | |
k=ia(l) 1308 | |
ak=a(k) 1308 | |
u=g(k)+ak*xv(k) 1308 | |
v=abs(u)-vp(k)*ab 1308 | |
a(k)=0.0 1310 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1311 | |
*em))) | |
if(a(k).eq.ak)goto 11551 1312 | |
del=a(k)-ak 1312 | |
rsq=rsq+del*(2.0*g(k)-del*xv(k)) 1313 | |
dlx=max(xv(k)*del**2,dlx) 1314 | |
11560 do 11561 j=1,nin 1314 | |
g(ia(j))=g(ia(j))-c(ia(j),mm(k))*del 1314 | |
11561 continue 1315 | |
11562 continue 1315 | |
11551 continue 1316 | |
11552 continue 1316 | |
if(dlx.lt.thr)goto 11542 1316 | |
if(nlp .le. maxit)goto 11581 1316 | |
jerr=-m 1316 | |
return 1316 | |
11581 continue 1317 | |
goto 11541 1318 | |
11542 continue 1318 | |
da(1:nin)=a(ia(1:nin))-da(1:nin) 1319 | |
11590 do 11591 j=1,ni 1319 | |
if(mm(j).ne.0)goto 11591 1320 | |
if(ju(j).ne.0) g(j)=g(j)-dot_product(da(1:nin),c(j,1:nin)) 1321 | |
11591 continue 1322 | |
11592 continue 1322 | |
jz=0 1323 | |
goto 11421 1324 | |
11422 continue 1324 | |
if(nin .le. nx)goto 11611 1324 | |
jerr=-10000-m 1324 | |
goto 11352 1324 | |
11611 continue 1325 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 1325 | |
kin(m)=nin 1326 | |
rsqo(m)=rsq 1326 | |
almo(m)=alm 1326 | |
lmu=m 1327 | |
if(m.lt.mnl)goto 11351 1327 | |
if(flmin.ge.1.0)goto 11351 1328 | |
me=0 1328 | |
11620 do 11621 j=1,nin 1328 | |
if(ao(j,m).ne.0.0) me=me+1 1328 | |
11621 continue 1328 | |
11622 continue 1328 | |
if(me.gt.ne)goto 11352 1329 | |
if(rsq-rsq0.lt.sml*rsq)goto 11352 1329 | |
if(rsq.gt.rsqmax)goto 11352 1330 | |
11351 continue 1331 | |
11352 continue 1331 | |
deallocate(a,mm,c,da) 1332 | |
return 1333 | |
end 1334 | |
subroutine spelnetn(parm,no,ni,x,ix,jx,y,w,jd,vp,cl,ne,nx,nlam,flm 1336 | |
*in,ulam, thr,isd,intr,maxit,lmu,a0,ca,ia,nin,rsq,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 1337 | |
double precision x(*),vp(ni),y(no),w(no),ulam(nlam),cl(2,ni) 1338 | |
double precision ca(nx,nlam),a0(nlam),rsq(nlam),alm(nlam) 1339 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 1340 | |
double precision, dimension (:), allocatable :: xm,xs,xv,vlam | |
integer, dimension (:), allocatable :: ju | |
allocate(xm(1:ni),stat=jerr) 1345 | |
if(jerr.ne.0) return 1346 | |
allocate(xs(1:ni),stat=jerr) 1347 | |
if(jerr.ne.0) return 1348 | |
allocate(ju(1:ni),stat=jerr) 1349 | |
if(jerr.ne.0) return 1350 | |
allocate(xv(1:ni),stat=jerr) 1351 | |
if(jerr.ne.0) return 1352 | |
allocate(vlam(1:nlam),stat=jerr) 1353 | |
if(jerr.ne.0) return 1354 | |
call spchkvars(no,ni,x,ix,ju) 1355 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 1356 | |
if(maxval(ju) .gt. 0)goto 11641 1356 | |
jerr=7777 1356 | |
return 1356 | |
11641 continue 1357 | |
call spstandard1(no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys,xv,jerr 1358 | |
*) | |
if(jerr.ne.0) return 1359 | |
cl=cl/ys 1359 | |
if(isd .le. 0)goto 11661 1359 | |
11670 do 11671 j=1,ni 1359 | |
cl(:,j)=cl(:,j)*xs(j) 1359 | |
11671 continue 1359 | |
11672 continue 1359 | |
11661 continue 1360 | |
if(flmin.ge.1.0) vlam=ulam/ys 1361 | |
call spelnet2(parm,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flmin,vla 1363 | |
*m,thr,maxit, xm,xs,xv,lmu,ca,ia,nin,rsq,alm,nlp,jerr) | |
if(jerr.gt.0) return 1364 | |
11680 do 11681 k=1,lmu 1364 | |
alm(k)=ys*alm(k) 1364 | |
nk=nin(k) 1365 | |
11690 do 11691 l=1,nk 1365 | |
ca(l,k)=ys*ca(l,k)/xs(ia(l)) 1365 | |
11691 continue 1365 | |
11692 continue 1365 | |
a0(k)=0.0 1366 | |
if(intr.ne.0) a0(k)=ym-dot_product(ca(1:nk,k),xm(ia(1:nk))) 1367 | |
11681 continue 1368 | |
11682 continue 1368 | |
deallocate(xm,xs,ju,xv,vlam) 1369 | |
return 1370 | |
end 1371 | |
subroutine spstandard1 (no,ni,x,ix,jx,y,w,ju,isd,intr,xm,xs,ym,ys, 1372 | |
*xv,jerr) | |
implicit double precision(a-h,o-z) 1373 | |
double precision x(*),y(no),w(no),xm(ni),xs(ni),xv(ni) 1374 | |
integer ix(*),jx(*),ju(ni) 1375 | |
w=w/sum(w) 1376 | |
if(intr .ne. 0)goto 11711 1376 | |
ym=0.0 1377 | |
ys=sqrt(dot_product(w,y**2)-dot_product(w,y)**2) 1377 | |
y=y/ys 1378 | |
11720 do 11721 j=1,ni 1378 | |
if(ju(j).eq.0)goto 11721 1378 | |
xm(j)=0.0 1378 | |
jb=ix(j) 1378 | |
je=ix(j+1)-1 1379 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) 1380 | |
if(isd .eq. 0)goto 11741 1380 | |
xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 1380 | |
vc=xv(j)-xbq 1381 | |
xs(j)=sqrt(vc) 1381 | |
xv(j)=1.0+xbq/vc 1382 | |
goto 11751 1383 | |
11741 continue 1383 | |
xs(j)=1.0 1383 | |
11751 continue 1384 | |
11731 continue 1384 | |
11721 continue 1385 | |
11722 continue 1385 | |
return 1386 | |
11711 continue 1387 | |
11760 do 11761 j=1,ni 1387 | |
if(ju(j).eq.0)goto 11761 1388 | |
jb=ix(j) 1388 | |
je=ix(j+1)-1 1388 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 1389 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 1390 | |
if(isd.gt.0) xs(j)=sqrt(xv(j)) 1391 | |
11761 continue 1392 | |
11762 continue 1392 | |
if(isd .ne. 0)goto 11781 1392 | |
xs=1.0 1392 | |
goto 11791 1392 | |
11781 continue 1392 | |
xv=1.0 1392 | |
11791 continue 1393 | |
11771 continue 1393 | |
ym=dot_product(w,y) 1393 | |
y=y-ym 1393 | |
ys=sqrt(dot_product(w,y**2)) 1393 | |
y=y/ys 1394 | |
return 1395 | |
end 1396 | |
subroutine spelnet2(beta,ni,y,w,no,ne,nx,x,ix,jx,ju,vp,cl,nlam,flm 1398 | |
*in,ulam, thr,maxit,xm,xs,xv,lmu,ao,ia,kin,rsqo,almo,nlp,jerr) | |
implicit double precision(a-h,o-z) 1399 | |
double precision y(no),w(no),x(*),vp(ni),ulam(nlam),cl(2,ni) 1400 | |
double precision ao(nx,nlam),rsqo(nlam),almo(nlam),xm(ni),xs(ni),x 1401 | |
*v(ni) | |
integer ix(*),jx(*),ju(ni),ia(nx),kin(nlam) 1402 | |
double precision, dimension (:), allocatable :: a,g | |
integer, dimension (:), allocatable :: mm,iy | |
call get_int_parms(sml,eps,big,mnlam,rsqmax,pmin,exmx) 1407 | |
allocate(a(1:ni),stat=jerr) 1408 | |
if(jerr.ne.0) return 1409 | |
allocate(mm(1:ni),stat=jerr) 1410 | |
if(jerr.ne.0) return 1411 | |
allocate(g(1:ni),stat=jerr) 1412 | |
if(jerr.ne.0) return 1413 | |
allocate(iy(1:ni),stat=jerr) 1414 | |
if(jerr.ne.0) return 1415 | |
bta=beta 1415 | |
omb=1.0-bta 1415 | |
alm=0.0 1415 | |
iy=0 1417 | |
alf=1.0 1419 | |
if(flmin .ge. 1.0)goto 11811 1419 | |
eqs=max(eps,flmin) 1419 | |
alf=eqs**(1.0/(nlam-1)) 1419 | |
11811 continue 1420 | |
rsq=0.0 1420 | |
a=0.0 1420 | |
mm=0 1420 | |
o=0.0 1420 | |
nlp=0 1420 | |
nin=nlp 1420 | |
iz=0 1420 | |
mnl=min(mnlam,nlam) 1421 | |
11820 do 11821 j=1,ni 1421 | |
if(ju(j).eq.0)goto 11821 1422 | |
jb=ix(j) 1422 | |
je=ix(j+1)-1 1423 | |
g(j)=abs(dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(j)) 1424 | |
11821 continue 1425 | |
11822 continue 1425 | |
11830 do 11831 m=1,nlam 1425 | |
alm0=alm 1426 | |
if(flmin .lt. 1.0)goto 11851 1426 | |
alm=ulam(m) 1426 | |
goto 11841 1427 | |
11851 if(m .le. 2)goto 11861 1427 | |
alm=alm*alf 1427 | |
goto 11841 1428 | |
11861 if(m .ne. 1)goto 11871 1428 | |
alm=big 1428 | |
goto 11881 1429 | |
11871 continue 1429 | |
alm0=0.0 1430 | |
11890 do 11891 j=1,ni 1430 | |
if(ju(j).eq.0)goto 11891 1430 | |
if(vp(j).gt.0.0) alm0=max(alm0,g(j)/vp(j)) 1430 | |
11891 continue 1431 | |
11892 continue 1431 | |
alm0=alm0/max(bta,1.0d-3) 1431 | |
alm=alf*alm0 1432 | |
11881 continue 1433 | |
11841 continue 1433 | |
dem=alm*omb 1433 | |
ab=alm*bta 1433 | |
rsq0=rsq 1433 | |
jz=1 1434 | |
tlam=bta*(2.0*alm-alm0) 1435 | |
11900 do 11901 k=1,ni 1435 | |
if(iy(k).eq.1)goto 11901 1435 | |
if(ju(k).eq.0)goto 11901 1436 | |
if(g(k).gt.tlam*vp(k)) iy(k)=1 1437 | |
11901 continue 1438 | |
11902 continue 1438 | |
11910 continue 1438 | |
11911 continue 1438 | |
if(iz*jz.ne.0) go to 10360 1439 | |
10880 continue 1439 | |
nlp=nlp+1 1439 | |
dlx=0.0 1440 | |
11920 do 11921 k=1,ni 1440 | |
if(iy(k).eq.0)goto 11921 1440 | |
jb=ix(k) 1440 | |
je=ix(k+1)-1 1441 | |
gk=dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(k) 1442 | |
ak=a(k) 1442 | |
u=gk+ak*xv(k) 1442 | |
v=abs(u)-vp(k)*ab 1442 | |
a(k)=0.0 1444 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1445 | |
*em))) | |
if(a(k).eq.ak)goto 11921 1446 | |
if(mm(k) .ne. 0)goto 11941 1446 | |
nin=nin+1 1446 | |
if(nin.gt.nx)goto 11922 1447 | |
mm(k)=nin 1447 | |
ia(nin)=k 1448 | |
11941 continue 1449 | |
del=a(k)-ak 1449 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1450 | |
y(jx(jb:je))=y(jx(jb:je))-del*x(jb:je)/xs(k) 1451 | |
o=o+del*xm(k)/xs(k) 1451 | |
dlx=max(xv(k)*del**2,dlx) 1452 | |
11921 continue 1453 | |
11922 continue 1453 | |
if(nin.gt.nx)goto 11912 1454 | |
if(dlx .ge. thr)goto 11961 1454 | |
ixx=0 1455 | |
11970 do 11971 j=1,ni 1455 | |
if(iy(j).eq.1)goto 11971 1455 | |
if(ju(j).eq.0)goto 11971 1456 | |
jb=ix(j) 1456 | |
je=ix(j+1)-1 1457 | |
g(j)=abs(dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(j)) 1458 | |
if(g(j) .le. ab*vp(j))goto 11991 1458 | |
iy(j)=1 1458 | |
ixx=1 1458 | |
11991 continue 1459 | |
11971 continue 1460 | |
11972 continue 1460 | |
if(ixx.eq.1) go to 10880 1461 | |
goto 11912 1462 | |
11961 continue 1463 | |
if(nlp .le. maxit)goto 12011 1463 | |
jerr=-m 1463 | |
return 1463 | |
12011 continue 1464 | |
10360 continue 1464 | |
iz=1 1465 | |
12020 continue 1465 | |
12021 continue 1465 | |
nlp=nlp+1 1465 | |
dlx=0.0 1466 | |
12030 do 12031 l=1,nin 1466 | |
k=ia(l) 1466 | |
jb=ix(k) 1466 | |
je=ix(k+1)-1 1467 | |
gk=dot_product(y(jx(jb:je))+o,w(jx(jb:je))*x(jb:je))/xs(k) 1468 | |
ak=a(k) 1468 | |
u=gk+ak*xv(k) 1468 | |
v=abs(u)-vp(k)*ab 1468 | |
a(k)=0.0 1470 | |
if(v.gt.0.0) a(k)=max(cl(1,k),min(cl(2,k),sign(v,u)/(xv(k)+vp(k)*d 1471 | |
*em))) | |
if(a(k).eq.ak)goto 12031 1472 | |
del=a(k)-ak 1472 | |
rsq=rsq+del*(2.0*gk-del*xv(k)) 1473 | |
y(jx(jb:je))=y(jx(jb:je))-del*x(jb:je)/xs(k) 1474 | |
o=o+del*xm(k)/xs(k) 1474 | |
dlx=max(xv(k)*del**2,dlx) 1475 | |
12031 continue 1476 | |
12032 continue 1476 | |
if(dlx.lt.thr)goto 12022 1476 | |
if(nlp .le. maxit)goto 12051 1476 | |
jerr=-m 1476 | |
return 1476 | |
12051 continue 1477 | |
goto 12021 1478 | |
12022 continue 1478 | |
jz=0 1479 | |
goto 11911 1480 | |
11912 continue 1480 | |
if(nin .le. nx)goto 12071 1480 | |
jerr=-10000-m 1480 | |
goto 11832 1480 | |
12071 continue 1481 | |
if(nin.gt.0) ao(1:nin,m)=a(ia(1:nin)) 1481 | |
kin(m)=nin 1482 | |
rsqo(m)=rsq 1482 | |
almo(m)=alm 1482 | |
lmu=m 1483 | |
if(m.lt.mnl)goto 11831 1483 | |
if(flmin.ge.1.0)goto 11831 1484 | |
me=0 1484 | |
12080 do 12081 j=1,nin 1484 | |
if(ao(j,m).ne.0.0) me=me+1 1484 | |
12081 continue 1484 | |
12082 continue 1484 | |
if(me.gt.ne)goto 11832 1485 | |
if(rsq-rsq0.lt.sml*rsq)goto 11832 1485 | |
if(rsq.gt.rsqmax)goto 11832 1486 | |
11831 continue 1487 | |
11832 continue 1487 | |
deallocate(a,mm,g,iy) 1488 | |
return 1489 | |
end 1490 | |
subroutine spchkvars(no,ni,x,ix,ju) 1491 | |
implicit double precision(a-h,o-z) 1492 | |
double precision x(*) 1492 | |
integer ix(*),ju(ni) 1493 | |
12090 do 12091 j=1,ni 1493 | |
ju(j)=0 1493 | |
jb=ix(j) 1493 | |
nj=ix(j+1)-jb 1493 | |
if(nj.eq.0)goto 12091 1494 | |
je=ix(j+1)-1 1495 | |
if(nj .ge. no)goto 12111 1495 | |
12120 do 12121 i=jb,je 1495 | |
if(x(i).eq.0.0)goto 12121 1495 | |
ju(j)=1 1495 | |
goto 12122 1495 | |
12121 continue 1495 | |
12122 continue 1495 | |
goto 12131 1496 | |
12111 continue 1496 | |
t=x(jb) 1496 | |
12140 do 12141 i=jb+1,je 1496 | |
if(x(i).eq.t)goto 12141 1496 | |
ju(j)=1 1496 | |
goto 12142 1496 | |
12141 continue 1496 | |
12142 continue 1496 | |
12131 continue 1497 | |
12101 continue 1497 | |
12091 continue 1498 | |
12092 continue 1498 | |
return 1499 | |
end 1500 | |
subroutine cmodval(a0,ca,ia,nin,x,ix,jx,n,f) 1501 | |
implicit double precision(a-h,o-z) 1502 | |
double precision ca(*),x(*),f(n) 1502 | |
integer ia(*),ix(*),jx(*) 1503 | |
f=a0 1504 | |
12150 do 12151 j=1,nin 1504 | |
k=ia(j) 1504 | |
kb=ix(k) 1504 | |
ke=ix(k+1)-1 1505 | |
f(jx(kb:ke))=f(jx(kb:ke))+ca(j)*x(kb:ke) 1506 | |
12151 continue 1507 | |
12152 continue 1507 | |
return 1508 | |
end 1509 | |
function row_prod(i,j,ia,ja,ra,w) 1510 | |
implicit double precision(a-h,o-z) 1511 | |
integer ia(*),ja(*) 1511 | |
double precision ra(*),w(*) 1512 | |
row_prod=dot(ra(ia(i)),ra(ia(j)),ja(ia(i)),ja(ia(j)), ia(i+1)-ia( 1514 | |
*i),ia(j+1)-ia(j),w) | |
return 1515 | |
end 1516 | |
function dot(x,y,mx,my,nx,ny,w) 1517 | |
implicit double precision(a-h,o-z) 1518 | |
double precision x(*),y(*),w(*) 1518 | |
integer mx(*),my(*) 1519 | |
i=1 1519 | |
j=i 1519 | |
s=0.0 1520 | |
12160 continue 1520 | |
12161 continue 1520 | |
12170 continue 1521 | |
12171 if(mx(i).ge.my(j))goto 12172 1521 | |
i=i+1 1521 | |
if(i.gt.nx) go to 12180 1521 | |
goto 12171 1522 | |
12172 continue 1522 | |
if(mx(i).eq.my(j)) go to 12190 1523 | |
12200 continue 1523 | |
12201 if(my(j).ge.mx(i))goto 12202 1523 | |
j=j+1 1523 | |
if(j.gt.ny) go to 12180 1523 | |
goto 12201 1524 | |
12202 continue 1524 | |
if(mx(i).eq.my(j)) go to 12190 1524 | |
goto 12161 1525 | |
12190 continue 1525 | |
s=s+w(mx(i))*x(i)*y(j) 1526 | |
i=i+1 1526 | |
if(i.gt.nx)goto 12162 1526 | |
j=j+1 1526 | |
if(j.gt.ny)goto 12162 1527 | |
goto 12161 1528 | |
12162 continue 1528 | |
12180 continue 1528 | |
dot=s 1529 | |
return 1530 | |
end 1531 | |
subroutine lognet (parm,no,ni,nc,x,y,g,jd,vp,cl,ne,nx,nlam,flmin,u 1533 | |
*lam,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,je | |
*rr) | |
implicit double precision(a-h,o-z) 1534 | |
double precision x(no,ni),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nla 1535 | |
*m) | |
double precision ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl 1536 | |
*(2,ni) | |
integer jd(*),ia(nx),nin(nlam) 1537 | |
double precision, dimension (:), allocatable :: xm,xs,ww,vq,xv | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 12221 1541 | |
jerr=10000 1541 | |
return 1541 | |
12221 continue 1542 | |
allocate(ww(1:no),stat=jerr) 1543 | |
if(jerr.ne.0) return 1544 | |
allocate(ju(1:ni),stat=jerr) 1545 | |
if(jerr.ne.0) return 1546 | |
allocate(vq(1:ni),stat=jerr) 1547 | |
if(jerr.ne.0) return 1548 | |
allocate(xm(1:ni),stat=jerr) 1549 | |
if(jerr.ne.0) return 1550 | |
if(kopt .ne. 2)goto 12241 1550 | |
allocate(xv(1:ni),stat=jerr) 1550 | |
if(jerr.ne.0) return 1550 | |
12241 continue 1551 | |
if(isd .le. 0)goto 12261 1551 | |
allocate(xs(1:ni),stat=jerr) 1551 | |
if(jerr.ne.0) return 1551 | |
12261 continue 1553 | |
call chkvars(no,ni,x,ju) 1554 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 1555 | |
if(maxval(ju) .gt. 0)goto 12281 1555 | |
jerr=7777 1555 | |
return 1555 | |
12281 continue 1556 | |
vq=max(0d0,vp) 1556 | |
vq=vq*ni/sum(vq) 1557 | |
12290 do 12291 i=1,no 1557 | |
ww(i)=sum(y(i,:)) 1557 | |
if(ww(i).gt.0.0) y(i,:)=y(i,:)/ww(i) 1557 | |
12291 continue 1558 | |
12292 continue 1558 | |
sw=sum(ww) 1558 | |
ww=ww/sw 1559 | |
if(nc .ne. 1)goto 12311 1559 | |
call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) 1560 | |
if(isd .le. 0)goto 12331 1560 | |
12340 do 12341 j=1,ni 1560 | |
cl(:,j)=cl(:,j)*xs(j) 1560 | |
12341 continue 1560 | |
12342 continue 1560 | |
12331 continue 1561 | |
call lognet2n(parm,no,ni,x,y(:,1),g(:,1),ww,ju,vq,cl,ne,nx,nlam,fl 1563 | |
*min,ulam, thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,n | |
*lp,jerr) | |
goto 12301 1564 | |
12311 if(kopt .ne. 2)goto 12351 1564 | |
call multlstandard1(no,ni,x,ww,ju,isd,intr,xm,xs,xv) 1565 | |
if(isd .le. 0)goto 12371 1565 | |
12380 do 12381 j=1,ni 1565 | |
cl(:,j)=cl(:,j)*xs(j) 1565 | |
12381 continue 1565 | |
12382 continue 1565 | |
12371 continue 1566 | |
call multlognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin, 1568 | |
*ulam,thr, intr,maxit,xv,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
goto 12391 1569 | |
12351 continue 1569 | |
call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) 1570 | |
if(isd .le. 0)goto 12411 1570 | |
12420 do 12421 j=1,ni 1570 | |
cl(:,j)=cl(:,j)*xs(j) 1570 | |
12421 continue 1570 | |
12422 continue 1570 | |
12411 continue 1571 | |
call lognetn(parm,no,ni,nc,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam 1573 | |
*,thr, isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
12391 continue 1574 | |
12301 continue 1574 | |
if(jerr.gt.0) return 1574 | |
dev0=2.0*sw*dev0 1575 | |
12430 do 12431 k=1,lmu 1575 | |
nk=nin(k) 1576 | |
12440 do 12441 ic=1,nc 1576 | |
if(isd .le. 0)goto 12461 1576 | |
12470 do 12471 l=1,nk 1576 | |
ca(l,ic,k)=ca(l,ic,k)/xs(ia(l)) 1576 | |
12471 continue 1576 | |
12472 continue 1576 | |
12461 continue 1577 | |
if(intr .ne. 0)goto 12491 1577 | |
a0(ic,k)=0.0 1577 | |
goto 12501 1578 | |
12491 continue 1578 | |
a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk))) 1578 | |
12501 continue 1579 | |
12481 continue 1579 | |
12441 continue 1580 | |
12442 continue 1580 | |
12431 continue 1581 | |
12432 continue 1581 | |
deallocate(ww,ju,vq,xm) 1581 | |
if(isd.gt.0) deallocate(xs) 1582 | |
if(kopt.eq.2) deallocate(xv) 1583 | |
return 1584 | |
end 1585 | |
subroutine lstandard1 (no,ni,x,w,ju,isd,intr,xm,xs) 1586 | |
implicit double precision(a-h,o-z) 1587 | |
double precision x(no,ni),w(no),xm(ni),xs(ni) 1587 | |
integer ju(ni) 1588 | |
if(intr .ne. 0)goto 12521 1589 | |
12530 do 12531 j=1,ni 1589 | |
if(ju(j).eq.0)goto 12531 1589 | |
xm(j)=0.0 1590 | |
if(isd .eq. 0)goto 12551 1590 | |
vc=dot_product(w,x(:,j)**2)-dot_product(w,x(:,j))**2 1591 | |
xs(j)=sqrt(vc) 1591 | |
x(:,j)=x(:,j)/xs(j) 1592 | |
12551 continue 1593 | |
12531 continue 1594 | |
12532 continue 1594 | |
return 1595 | |
12521 continue 1596 | |
12560 do 12561 j=1,ni 1596 | |
if(ju(j).eq.0)goto 12561 1597 | |
xm(j)=dot_product(w,x(:,j)) 1597 | |
x(:,j)=x(:,j)-xm(j) 1598 | |
if(isd .le. 0)goto 12581 1598 | |
xs(j)=sqrt(dot_product(w,x(:,j)**2)) 1598 | |
x(:,j)=x(:,j)/xs(j) 1598 | |
12581 continue 1599 | |
12561 continue 1600 | |
12562 continue 1600 | |
return 1601 | |
end 1602 | |
subroutine multlstandard1 (no,ni,x,w,ju,isd,intr,xm,xs,xv) 1603 | |
implicit double precision(a-h,o-z) 1604 | |
double precision x(no,ni),w(no),xm(ni),xs(ni),xv(ni) 1604 | |
integer ju(ni) 1605 | |
if(intr .ne. 0)goto 12601 1606 | |
12610 do 12611 j=1,ni 1606 | |
if(ju(j).eq.0)goto 12611 1606 | |
xm(j)=0.0 1607 | |
xv(j)=dot_product(w,x(:,j)**2) 1608 | |
if(isd .eq. 0)goto 12631 1608 | |
xbq=dot_product(w,x(:,j))**2 1608 | |
vc=xv(j)-xbq 1609 | |
xs(j)=sqrt(vc) 1609 | |
x(:,j)=x(:,j)/xs(j) 1609 | |
xv(j)=1.0+xbq/vc 1610 | |
12631 continue 1611 | |
12611 continue 1612 | |
12612 continue 1612 | |
return 1613 | |
12601 continue 1614 | |
12640 do 12641 j=1,ni 1614 | |
if(ju(j).eq.0)goto 12641 1615 | |
xm(j)=dot_product(w,x(:,j)) 1615 | |
x(:,j)=x(:,j)-xm(j) 1616 | |
xv(j)=dot_product(w,x(:,j)**2) 1617 | |
if(isd .le. 0)goto 12661 1617 | |
xs(j)=sqrt(xv(j)) 1617 | |
x(:,j)=x(:,j)/xs(j) 1617 | |
xv(j)=1.0 1617 | |
12661 continue 1618 | |
12641 continue 1619 | |
12642 continue 1619 | |
return 1620 | |
end 1621 | |
subroutine lognet2n(parm,no,ni,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin,u 1623 | |
*lam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,jer | |
*r) | |
implicit double precision(a-h,o-z) 1624 | |
double precision x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2 1625 | |
*,ni) | |
double precision a(nx,nlam),a0(nlam),dev(nlam),alm(nlam) 1626 | |
integer ju(ni),m(nx),kin(nlam) 1627 | |
double precision, dimension (:), allocatable :: b,bs,v,r,xv,q,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 1632 | |
allocate(b(0:ni),stat=jerr) 1633 | |
if(jerr.ne.0) return 1634 | |
allocate(xv(1:ni),stat=jerr) 1635 | |
if(jerr.ne.0) return 1636 | |
allocate(ga(1:ni),stat=jerr) 1637 | |
if(jerr.ne.0) return 1638 | |
allocate(bs(0:ni),stat=jerr) 1639 | |
if(jerr.ne.0) return 1640 | |
allocate(mm(1:ni),stat=jerr) 1641 | |
if(jerr.ne.0) return 1642 | |
allocate(ixx(1:ni),stat=jerr) 1643 | |
if(jerr.ne.0) return 1644 | |
allocate(r(1:no),stat=jerr) 1645 | |
if(jerr.ne.0) return 1646 | |
allocate(v(1:no),stat=jerr) 1647 | |
if(jerr.ne.0) return 1648 | |
allocate(q(1:no),stat=jerr) 1649 | |
if(jerr.ne.0) return 1650 | |
fmax=log(1.0/pmin-1.0) 1650 | |
fmin=-fmax 1650 | |
vmin=(1.0+pmin)*pmin*(1.0-pmin) 1651 | |
bta=parm 1651 | |
omb=1.0-bta 1652 | |
q0=dot_product(w,y) 1652 | |
if(q0 .gt. pmin)goto 12681 1652 | |
jerr=8001 1652 | |
return 1652 | |
12681 continue 1653 | |
if(q0 .lt. 1.0-pmin)goto 12701 1653 | |
jerr=9001 1653 | |
return 1653 | |
12701 continue 1654 | |
if(intr.eq.0.0) q0=0.5 1655 | |
ixx=0 1655 | |
al=0.0 1655 | |
bz=0.0 1655 | |
if(intr.ne.0) bz=log(q0/(1.0-q0)) 1656 | |
if(nonzero(no,g) .ne. 0)goto 12721 1656 | |
vi=q0*(1.0-q0) 1656 | |
b(0)=bz 1656 | |
v=vi*w 1657 | |
r=w*(y-q0) 1657 | |
q=q0 1657 | |
xmz=vi 1657 | |
dev1=-(bz*q0+log(1.0-q0)) 1658 | |
goto 12731 1659 | |
12721 continue 1659 | |
b(0)=0.0 1660 | |
if(intr .eq. 0)goto 12751 1660 | |
b(0)=azero(no,y,g,w,jerr) 1660 | |
if(jerr.ne.0) return 1660 | |
12751 continue 1661 | |
q=1.0/(1.0+exp(-b(0)-g)) 1661 | |
v=w*q*(1.0-q) 1661 | |
r=w*(y-q) 1661 | |
xmz=sum(v) 1662 | |
dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))) 1663 | |
12731 continue 1664 | |
12711 continue 1664 | |
if(kopt .le. 0)goto 12771 1665 | |
if(isd .le. 0 .or. intr .eq. 0)goto 12791 1665 | |
xv=0.25 1665 | |
goto 12801 1666 | |
12791 continue 1666 | |
12810 do 12811 j=1,ni 1666 | |
if(ju(j).ne.0) xv(j)=0.25*dot_product(w,x(:,j)**2) 1666 | |
12811 continue 1666 | |
12812 continue 1666 | |
12801 continue 1667 | |
12781 continue 1667 | |
12771 continue 1668 | |
dev0=dev1 1669 | |
12820 do 12821 i=1,no 1669 | |
if(y(i).gt.0.0) dev0=dev0+w(i)*y(i)*log(y(i)) 1670 | |
if(y(i).lt.1.0) dev0=dev0+w(i)*(1.0-y(i))*log(1.0-y(i)) 1671 | |
12821 continue 1673 | |
12822 continue 1673 | |
alf=1.0 1675 | |
if(flmin .ge. 1.0)goto 12841 1675 | |
eqs=max(eps,flmin) 1675 | |
alf=eqs**(1.0/(nlam-1)) 1675 | |
12841 continue 1676 | |
m=0 1676 | |
mm=0 1676 | |
nlp=0 1676 | |
nin=nlp 1676 | |
mnl=min(mnlam,nlam) 1676 | |
bs=0.0 1676 | |
b(1:ni)=0.0 1677 | |
shr=shri*dev0 1678 | |
12850 do 12851 j=1,ni 1678 | |
if(ju(j).eq.0)goto 12851 1678 | |
ga(j)=abs(dot_product(r,x(:,j))) 1678 | |
12851 continue 1679 | |
12852 continue 1679 | |
12860 do 12861 ilm=1,nlam 1679 | |
al0=al 1680 | |
if(flmin .lt. 1.0)goto 12881 1680 | |
al=ulam(ilm) 1680 | |
goto 12871 1681 | |
12881 if(ilm .le. 2)goto 12891 1681 | |
al=al*alf 1681 | |
goto 12871 1682 | |
12891 if(ilm .ne. 1)goto 12901 1682 | |
al=big 1682 | |
goto 12911 1683 | |
12901 continue 1683 | |
al0=0.0 1684 | |
12920 do 12921 j=1,ni 1684 | |
if(ju(j).eq.0)goto 12921 1684 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 1684 | |
12921 continue 1685 | |
12922 continue 1685 | |
al0=al0/max(bta,1.0d-3) 1685 | |
al=alf*al0 1686 | |
12911 continue 1687 | |
12871 continue 1687 | |
al2=al*omb 1687 | |
al1=al*bta 1687 | |
tlam=bta*(2.0*al-al0) 1688 | |
12930 do 12931 k=1,ni 1688 | |
if(ixx(k).eq.1)goto 12931 1688 | |
if(ju(k).eq.0)goto 12931 1689 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 1690 | |
12931 continue 1691 | |
12932 continue 1691 | |
10880 continue 1692 | |
12940 continue 1692 | |
12941 continue 1692 | |
bs(0)=b(0) 1692 | |
if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)) 1693 | |
if(kopt .ne. 0)goto 12961 1694 | |
12970 do 12971 j=1,ni 1694 | |
if(ixx(j).gt.0) xv(j)=dot_product(v,x(:,j)**2) 1694 | |
12971 continue 1695 | |
12972 continue 1695 | |
12961 continue 1696 | |
12980 continue 1696 | |
12981 continue 1696 | |
nlp=nlp+1 1696 | |
dlx=0.0 1697 | |
12990 do 12991 k=1,ni 1697 | |
if(ixx(k).eq.0)goto 12991 1698 | |
bk=b(k) 1698 | |
gk=dot_product(r,x(:,k)) 1699 | |
u=gk+xv(k)*b(k) 1699 | |
au=abs(u)-vp(k)*al1 1700 | |
if(au .gt. 0.0)goto 13011 1700 | |
b(k)=0.0 1700 | |
goto 13021 1701 | |
13011 continue 1702 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 1703 | |
13021 continue 1704 | |
13001 continue 1704 | |
d=b(k)-bk 1704 | |
if(abs(d).le.0.0)goto 12991 1704 | |
dlx=max(dlx,xv(k)*d**2) 1705 | |
r=r-d*v*x(:,k) 1706 | |
if(mm(k) .ne. 0)goto 13041 1706 | |
nin=nin+1 1706 | |
if(nin.gt.nx)goto 12992 1707 | |
mm(k)=nin 1707 | |
m(nin)=k 1708 | |
13041 continue 1709 | |
12991 continue 1710 | |
12992 continue 1710 | |
if(nin.gt.nx)goto 12982 1711 | |
d=0.0 1711 | |
if(intr.ne.0) d=sum(r)/xmz 1712 | |
if(d .eq. 0.0)goto 13061 1712 | |
b(0)=b(0)+d 1712 | |
dlx=max(dlx,xmz*d**2) 1712 | |
r=r-d*v 1712 | |
13061 continue 1713 | |
if(dlx.lt.shr)goto 12982 1713 | |
if(nlp .le. maxit)goto 13081 1713 | |
jerr=-ilm 1713 | |
return 1713 | |
13081 continue 1714 | |
13090 continue 1714 | |
13091 continue 1714 | |
nlp=nlp+1 1714 | |
dlx=0.0 1715 | |
13100 do 13101 l=1,nin 1715 | |
k=m(l) 1715 | |
bk=b(k) 1716 | |
gk=dot_product(r,x(:,k)) 1717 | |
u=gk+xv(k)*b(k) 1717 | |
au=abs(u)-vp(k)*al1 1718 | |
if(au .gt. 0.0)goto 13121 1718 | |
b(k)=0.0 1718 | |
goto 13131 1719 | |
13121 continue 1720 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 1721 | |
13131 continue 1722 | |
13111 continue 1722 | |
d=b(k)-bk 1722 | |
if(abs(d).le.0.0)goto 13101 1722 | |
dlx=max(dlx,xv(k)*d**2) 1723 | |
r=r-d*v*x(:,k) 1724 | |
13101 continue 1725 | |
13102 continue 1725 | |
d=0.0 1725 | |
if(intr.ne.0) d=sum(r)/xmz 1726 | |
if(d .eq. 0.0)goto 13151 1726 | |
b(0)=b(0)+d 1726 | |
dlx=max(dlx,xmz*d**2) 1726 | |
r=r-d*v 1726 | |
13151 continue 1727 | |
if(dlx.lt.shr)goto 13092 1727 | |
if(nlp .le. maxit)goto 13171 1727 | |
jerr=-ilm 1727 | |
return 1727 | |
13171 continue 1728 | |
goto 13091 1729 | |
13092 continue 1729 | |
goto 12981 1730 | |
12982 continue 1730 | |
if(nin.gt.nx)goto 12942 1731 | |
13180 do 13181 i=1,no 1731 | |
fi=b(0)+g(i) 1732 | |
if(nin.gt.0) fi=fi+dot_product(b(m(1:nin)),x(i,m(1:nin))) 1733 | |
if(fi .ge. fmin)goto 13201 1733 | |
q(i)=0.0 1733 | |
goto 13191 1733 | |
13201 if(fi .le. fmax)goto 13211 1733 | |
q(i)=1.0 1733 | |
goto 13221 1734 | |
13211 continue 1734 | |
q(i)=1.0/(1.0+exp(-fi)) 1734 | |
13221 continue 1735 | |
13191 continue 1735 | |
13181 continue 1736 | |
13182 continue 1736 | |
v=w*q*(1.0-q) 1736 | |
xmz=sum(v) 1736 | |
if(xmz.le.vmin)goto 12942 1736 | |
r=w*(y-q) 1737 | |
if(xmz*(b(0)-bs(0))**2 .ge. shr)goto 13241 1737 | |
ix=0 1738 | |
13250 do 13251 j=1,nin 1738 | |
k=m(j) 1739 | |
if(xv(k)*(b(k)-bs(k))**2.lt.shr)goto 13251 1739 | |
ix=1 1739 | |
goto 13252 1740 | |
13251 continue 1741 | |
13252 continue 1741 | |
if(ix .ne. 0)goto 13271 1742 | |
13280 do 13281 k=1,ni 1742 | |
if(ixx(k).eq.1)goto 13281 1742 | |
if(ju(k).eq.0)goto 13281 1743 | |
ga(k)=abs(dot_product(r,x(:,k))) 1744 | |
if(ga(k) .le. al1*vp(k))goto 13301 1744 | |
ixx(k)=1 1744 | |
ix=1 1744 | |
13301 continue 1745 | |
13281 continue 1746 | |
13282 continue 1746 | |
if(ix.eq.1) go to 10880 1747 | |
goto 12942 1748 | |
13271 continue 1749 | |
13241 continue 1750 | |
goto 12941 1751 | |
12942 continue 1751 | |
if(nin .le. nx)goto 13321 1751 | |
jerr=-10000-ilm 1751 | |
goto 12862 1751 | |
13321 continue 1752 | |
if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)) 1752 | |
kin(ilm)=nin 1753 | |
a0(ilm)=b(0) 1753 | |
alm(ilm)=al 1753 | |
lmu=ilm 1754 | |
devi=dev2(no,w,y,q,pmin) 1755 | |
dev(ilm)=(dev1-devi)/dev0 1755 | |
if(xmz.le.vmin)goto 12862 1756 | |
if(ilm.lt.mnl)goto 12861 1756 | |
if(flmin.ge.1.0)goto 12861 1757 | |
me=0 1757 | |
13330 do 13331 j=1,nin 1757 | |
if(a(j,ilm).ne.0.0) me=me+1 1757 | |
13331 continue 1757 | |
13332 continue 1757 | |
if(me.gt.ne)goto 12862 1758 | |
if(dev(ilm).gt.devmax)goto 12862 1758 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 12862 1759 | |
12861 continue 1760 | |
12862 continue 1760 | |
g=log(q/(1.0-q)) 1761 | |
deallocate(b,bs,v,r,xv,q,mm,ga,ixx) 1762 | |
return 1763 | |
end 1764 | |
function dev2(n,w,y,p,pmin) 1765 | |
implicit double precision(a-h,o-z) 1766 | |
double precision w(n),y(n),p(n) 1767 | |
pmax=1.0-pmin 1767 | |
s=0.0 1768 | |
13340 do 13341 i=1,n 1768 | |
pi=min(max(pmin,p(i)),pmax) 1769 | |
s=s-w(i)*(y(i)*log(pi)+(1.0-y(i))*log(1.0-pi)) 1770 | |
13341 continue 1771 | |
13342 continue 1771 | |
dev2=s 1772 | |
return 1773 | |
end 1774 | |
function azero(n,y,g,q,jerr) 1775 | |
implicit double precision(a-h,o-z) 1776 | |
parameter(eps=1.0d-7) 1777 | |
double precision y(n),g(n),q(n) 1778 | |
double precision, dimension (:), allocatable :: e,p,w | |
azero = 0.0 1782 | |
allocate(e(1:n),stat=jerr) 1783 | |
if(jerr.ne.0) return 1784 | |
allocate(p(1:n),stat=jerr) 1785 | |
if(jerr.ne.0) return 1786 | |
allocate(w(1:n),stat=jerr) 1787 | |
if(jerr.ne.0) return 1788 | |
az=0.0 1788 | |
e=exp(-g) 1788 | |
qy=dot_product(q,y) 1788 | |
p=1.0/(1.0+e) 1789 | |
13350 continue 1789 | |
13351 continue 1789 | |
w=q*p*(1.0-p) 1790 | |
d=(qy-dot_product(q,p))/sum(w) 1790 | |
az=az+d 1790 | |
if(abs(d).lt.eps)goto 13352 1791 | |
ea0=exp(-az) 1791 | |
p=1.0/(1.0+ea0*e) 1792 | |
goto 13351 1793 | |
13352 continue 1793 | |
azero=az 1794 | |
deallocate(e,p,w) 1795 | |
return 1796 | |
end 1797 | |
subroutine lognetn(parm,no,ni,nc,x,y,g,w,ju,vp,cl,ne,nx,nlam,flmin 1799 | |
*,ulam,shri, isd,intr,maxit,kopt,lmu,a0,a,m,kin,dev0,dev,alm,nlp,j | |
*err) | |
implicit double precision(a-h,o-z) 1800 | |
double precision x(no,ni),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam 1801 | |
*) | |
double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl( 1802 | |
*2,ni) | |
integer ju(ni),m(nx),kin(nlam) 1803 | |
double precision, dimension (:,:), allocatable :: q | |
double precision, dimension (:), allocatable :: sxp,sxpl | |
double precision, dimension (:), allocatable :: di,v,r,ga | |
double precision, dimension (:,:), allocatable :: b,bs,xv | |
integer, dimension (:), allocatable :: mm,is,ixx | |
allocate(b(0:ni,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
allocate(xv(1:ni,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
allocate(bs(0:ni,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
allocate(q(1:no,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 1818 | |
exmn=-exmx 1819 | |
allocate(r(1:no),stat=jerr) 1820 | |
if(jerr.ne.0) return 1821 | |
allocate(v(1:no),stat=jerr) 1822 | |
if(jerr.ne.0) return 1823 | |
allocate(mm(1:ni),stat=jerr) 1824 | |
if(jerr.ne.0) return 1825 | |
allocate(is(1:max(nc,ni)),stat=jerr) 1826 | |
if(jerr.ne.0) return 1827 | |
allocate(sxp(1:no),stat=jerr) 1828 | |
if(jerr.ne.0) return 1829 | |
allocate(sxpl(1:no),stat=jerr) 1830 | |
if(jerr.ne.0) return 1831 | |
allocate(di(1:no),stat=jerr) 1832 | |
if(jerr.ne.0) return 1833 | |
allocate(ga(1:ni),stat=jerr) 1834 | |
if(jerr.ne.0) return 1835 | |
allocate(ixx(1:ni),stat=jerr) 1836 | |
if(jerr.ne.0) return 1837 | |
pmax=1.0-pmin 1837 | |
emin=pmin/pmax 1837 | |
emax=1.0/emin 1838 | |
pfm=(1.0+pmin)*pmin 1838 | |
pfx=(1.0-pmin)*pmax 1838 | |
vmin=pfm*pmax 1839 | |
bta=parm 1839 | |
omb=1.0-bta 1839 | |
dev1=0.0 1839 | |
dev0=0.0 1840 | |
13360 do 13361 ic=1,nc 1840 | |
q0=dot_product(w,y(:,ic)) 1841 | |
if(q0 .gt. pmin)goto 13381 1841 | |
jerr =8000+ic 1841 | |
return 1841 | |
13381 continue 1842 | |
if(q0 .lt. 1.0-pmin)goto 13401 1842 | |
jerr =9000+ic 1842 | |
return 1842 | |
13401 continue 1843 | |
if(intr .ne. 0)goto 13421 1843 | |
q0=1.0/nc 1843 | |
b(0,ic)=0.0 1843 | |
goto 13431 1844 | |
13421 continue 1844 | |
b(0,ic)=log(q0) 1844 | |
dev1=dev1-q0*b(0,ic) 1844 | |
13431 continue 1845 | |
13411 continue 1845 | |
b(1:ni,ic)=0.0 1846 | |
13361 continue 1847 | |
13362 continue 1847 | |
if(intr.eq.0) dev1=log(float(nc)) 1847 | |
ixx=0 1847 | |
al=0.0 1848 | |
if(nonzero(no*nc,g) .ne. 0)goto 13451 1849 | |
b(0,:)=b(0,:)-sum(b(0,:))/nc 1849 | |
sxp=0.0 1850 | |
13460 do 13461 ic=1,nc 1850 | |
q(:,ic)=exp(b(0,ic)) 1850 | |
sxp=sxp+q(:,ic) 1850 | |
13461 continue 1851 | |
13462 continue 1851 | |
goto 13471 1852 | |
13451 continue 1852 | |
13480 do 13481 i=1,no 1852 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 1852 | |
13481 continue 1852 | |
13482 continue 1852 | |
sxp=0.0 1853 | |
if(intr .ne. 0)goto 13501 1853 | |
b(0,:)=0.0 1853 | |
goto 13511 1854 | |
13501 continue 1854 | |
call kazero(nc,no,y,g,w,b(0,:),jerr) 1854 | |
if(jerr.ne.0) return 1854 | |
13511 continue 1855 | |
13491 continue 1855 | |
dev1=0.0 1856 | |
13520 do 13521 ic=1,nc 1856 | |
q(:,ic)=b(0,ic)+g(:,ic) 1857 | |
dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) 1858 | |
q(:,ic)=exp(q(:,ic)) 1858 | |
sxp=sxp+q(:,ic) 1859 | |
13521 continue 1860 | |
13522 continue 1860 | |
sxpl=w*log(sxp) 1860 | |
13530 do 13531 ic=1,nc 1860 | |
dev1=dev1+dot_product(y(:,ic),sxpl) 1860 | |
13531 continue 1861 | |
13532 continue 1861 | |
13471 continue 1862 | |
13441 continue 1862 | |
13540 do 13541 ic=1,nc 1862 | |
13550 do 13551 i=1,no 1862 | |
if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 1862 | |
13551 continue 1862 | |
13552 continue 1862 | |
13541 continue 1863 | |
13542 continue 1863 | |
dev0=dev0+dev1 1864 | |
if(kopt .le. 0)goto 13571 1865 | |
if(isd .le. 0 .or. intr .eq. 0)goto 13591 1865 | |
xv=0.25 1865 | |
goto 13601 1866 | |
13591 continue 1866 | |
13610 do 13611 j=1,ni 1866 | |
if(ju(j).ne.0) xv(j,:)=0.25*dot_product(w,x(:,j)**2) 1866 | |
13611 continue 1866 | |
13612 continue 1866 | |
13601 continue 1867 | |
13581 continue 1867 | |
13571 continue 1869 | |
alf=1.0 1871 | |
if(flmin .ge. 1.0)goto 13631 1871 | |
eqs=max(eps,flmin) 1871 | |
alf=eqs**(1.0/(nlam-1)) 1871 | |
13631 continue 1872 | |
m=0 1872 | |
mm=0 1872 | |
nin=0 1872 | |
nlp=0 1872 | |
mnl=min(mnlam,nlam) 1872 | |
bs=0.0 1872 | |
shr=shri*dev0 1873 | |
ga=0.0 1874 | |
13640 do 13641 ic=1,nc 1874 | |
r=w*(y(:,ic)-q(:,ic)/sxp) 1875 | |
13650 do 13651 j=1,ni 1875 | |
if(ju(j).ne.0) ga(j)=max(ga(j),abs(dot_product(r,x(:,j)))) 1875 | |
13651 continue 1876 | |
13652 continue 1876 | |
13641 continue 1877 | |
13642 continue 1877 | |
13660 do 13661 ilm=1,nlam 1877 | |
al0=al 1878 | |
if(flmin .lt. 1.0)goto 13681 1878 | |
al=ulam(ilm) 1878 | |
goto 13671 1879 | |
13681 if(ilm .le. 2)goto 13691 1879 | |
al=al*alf 1879 | |
goto 13671 1880 | |
13691 if(ilm .ne. 1)goto 13701 1880 | |
al=big 1880 | |
goto 13711 1881 | |
13701 continue 1881 | |
al0=0.0 1882 | |
13720 do 13721 j=1,ni 1882 | |
if(ju(j).eq.0)goto 13721 1882 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 1882 | |
13721 continue 1883 | |
13722 continue 1883 | |
al0=al0/max(bta,1.0d-3) 1883 | |
al=alf*al0 1884 | |
13711 continue 1885 | |
13671 continue 1885 | |
al2=al*omb 1885 | |
al1=al*bta 1885 | |
tlam=bta*(2.0*al-al0) 1886 | |
13730 do 13731 k=1,ni 1886 | |
if(ixx(k).eq.1)goto 13731 1886 | |
if(ju(k).eq.0)goto 13731 1887 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 1888 | |
13731 continue 1889 | |
13732 continue 1889 | |
10880 continue 1890 | |
13740 continue 1890 | |
13741 continue 1890 | |
ix=0 1890 | |
jx=ix 1890 | |
ig=0 1891 | |
13750 do 13751 ic=1,nc 1891 | |
bs(0,ic)=b(0,ic) 1892 | |
if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) 1893 | |
xmz=0.0 1894 | |
13760 do 13761 i=1,no 1894 | |
pic=q(i,ic)/sxp(i) 1895 | |
if(pic .ge. pfm)goto 13781 1895 | |
pic=0.0 1895 | |
v(i)=0.0 1895 | |
goto 13771 1896 | |
13781 if(pic .le. pfx)goto 13791 1896 | |
pic=1.0 1896 | |
v(i)=0.0 1896 | |
goto 13801 1897 | |
13791 continue 1897 | |
v(i)=w(i)*pic*(1.0-pic) 1897 | |
xmz=xmz+v(i) 1897 | |
13801 continue 1898 | |
13771 continue 1898 | |
r(i)=w(i)*(y(i,ic)-pic) 1899 | |
13761 continue 1900 | |
13762 continue 1900 | |
if(xmz.le.vmin)goto 13751 1900 | |
ig=1 1901 | |
if(kopt .ne. 0)goto 13821 1902 | |
13830 do 13831 j=1,ni 1902 | |
if(ixx(j).gt.0) xv(j,ic)=dot_product(v,x(:,j)**2) 1902 | |
13831 continue 1903 | |
13832 continue 1903 | |
13821 continue 1904 | |
13840 continue 1904 | |
13841 continue 1904 | |
nlp=nlp+1 1904 | |
dlx=0.0 1905 | |
13850 do 13851 k=1,ni 1905 | |
if(ixx(k).eq.0)goto 13851 1906 | |
bk=b(k,ic) 1906 | |
gk=dot_product(r,x(:,k)) 1907 | |
u=gk+xv(k,ic)*b(k,ic) 1907 | |
au=abs(u)-vp(k)*al1 1908 | |
if(au .gt. 0.0)goto 13871 1908 | |
b(k,ic)=0.0 1908 | |
goto 13881 1909 | |
13871 continue 1910 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 1912 | |
*) | |
13881 continue 1913 | |
13861 continue 1913 | |
d=b(k,ic)-bk 1913 | |
if(abs(d).le.0.0)goto 13851 1914 | |
dlx=max(dlx,xv(k,ic)*d**2) 1914 | |
r=r-d*v*x(:,k) 1915 | |
if(mm(k) .ne. 0)goto 13901 1915 | |
nin=nin+1 1916 | |
if(nin .le. nx)goto 13921 1916 | |
jx=1 1916 | |
goto 13852 1916 | |
13921 continue 1917 | |
mm(k)=nin 1917 | |
m(nin)=k 1918 | |
13901 continue 1919 | |
13851 continue 1920 | |
13852 continue 1920 | |
if(jx.gt.0)goto 13842 1921 | |
d=0.0 1921 | |
if(intr.ne.0) d=sum(r)/xmz 1922 | |
if(d .eq. 0.0)goto 13941 1922 | |
b(0,ic)=b(0,ic)+d 1922 | |
dlx=max(dlx,xmz*d**2) 1922 | |
r=r-d*v 1922 | |
13941 continue 1923 | |
if(dlx.lt.shr)goto 13842 1924 | |
if(nlp .le. maxit)goto 13961 1924 | |
jerr=-ilm 1924 | |
return 1924 | |
13961 continue 1925 | |
13970 continue 1925 | |
13971 continue 1925 | |
nlp=nlp+1 1925 | |
dlx=0.0 1926 | |
13980 do 13981 l=1,nin 1926 | |
k=m(l) 1926 | |
bk=b(k,ic) 1927 | |
gk=dot_product(r,x(:,k)) 1928 | |
u=gk+xv(k,ic)*b(k,ic) 1928 | |
au=abs(u)-vp(k)*al1 1929 | |
if(au .gt. 0.0)goto 14001 1929 | |
b(k,ic)=0.0 1929 | |
goto 14011 1930 | |
14001 continue 1931 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 1933 | |
*) | |
14011 continue 1934 | |
13991 continue 1934 | |
d=b(k,ic)-bk 1934 | |
if(abs(d).le.0.0)goto 13981 1935 | |
dlx=max(dlx,xv(k,ic)*d**2) 1935 | |
r=r-d*v*x(:,k) 1936 | |
13981 continue 1937 | |
13982 continue 1937 | |
d=0.0 1937 | |
if(intr.ne.0) d=sum(r)/xmz 1938 | |
if(d .eq. 0.0)goto 14031 1938 | |
b(0,ic)=b(0,ic)+d 1939 | |
dlx=max(dlx,xmz*d**2) 1939 | |
r=r-d*v 1940 | |
14031 continue 1941 | |
if(dlx.lt.shr)goto 13972 1941 | |
if(nlp .le. maxit)goto 14051 1941 | |
jerr=-ilm 1941 | |
return 1941 | |
14051 continue 1942 | |
goto 13971 1943 | |
13972 continue 1943 | |
goto 13841 1944 | |
13842 continue 1944 | |
if(jx.gt.0)goto 13752 1945 | |
if(xmz*(b(0,ic)-bs(0,ic))**2.gt.shr) ix=1 1946 | |
if(ix .ne. 0)goto 14071 1947 | |
14080 do 14081 j=1,nin 1947 | |
k=m(j) 1948 | |
if(xv(k,ic)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 14101 1948 | |
ix=1 1948 | |
goto 14082 1948 | |
14101 continue 1949 | |
14081 continue 1950 | |
14082 continue 1950 | |
14071 continue 1951 | |
14110 do 14111 i=1,no 1951 | |
fi=b(0,ic)+g(i,ic) 1953 | |
if(nin.gt.0) fi=fi+dot_product(b(m(1:nin),ic),x(i,m(1:nin))) 1954 | |
fi=min(max(exmn,fi),exmx) 1954 | |
sxp(i)=sxp(i)-q(i,ic) 1955 | |
q(i,ic)=min(max(emin*sxp(i),exp(fi)),emax*sxp(i)) 1956 | |
sxp(i)=sxp(i)+q(i,ic) 1957 | |
14111 continue 1958 | |
14112 continue 1958 | |
13751 continue 1959 | |
13752 continue 1959 | |
s=-sum(b(0,:))/nc 1959 | |
b(0,:)=b(0,:)+s 1959 | |
di=s 1960 | |
14120 do 14121 j=1,nin 1960 | |
l=m(j) 1961 | |
if(vp(l) .gt. 0.0)goto 14141 1961 | |
s=sum(b(l,:))/nc 1961 | |
goto 14151 1962 | |
14141 continue 1962 | |
s=elc(parm,nc,cl(:,l),b(l,:),is) 1962 | |
14151 continue 1963 | |
14131 continue 1963 | |
b(l,:)=b(l,:)-s 1963 | |
di=di-s*x(:,l) 1964 | |
14121 continue 1965 | |
14122 continue 1965 | |
di=exp(di) 1965 | |
sxp=sxp*di 1965 | |
14160 do 14161 ic=1,nc 1965 | |
q(:,ic)=q(:,ic)*di 1965 | |
14161 continue 1966 | |
14162 continue 1966 | |
if(jx.gt.0)goto 13742 1966 | |
if(ig.eq.0)goto 13742 1967 | |
if(ix .ne. 0)goto 14181 1968 | |
14190 do 14191 k=1,ni 1968 | |
if(ixx(k).eq.1)goto 14191 1968 | |
if(ju(k).eq.0)goto 14191 1968 | |
ga(k)=0.0 1968 | |
14191 continue 1969 | |
14192 continue 1969 | |
14200 do 14201 ic=1,nc 1969 | |
r=w*(y(:,ic)-q(:,ic)/sxp) 1970 | |
14210 do 14211 k=1,ni 1970 | |
if(ixx(k).eq.1)goto 14211 1970 | |
if(ju(k).eq.0)goto 14211 1971 | |
ga(k)=max(ga(k),abs(dot_product(r,x(:,k)))) 1972 | |
14211 continue 1973 | |
14212 continue 1973 | |
14201 continue 1974 | |
14202 continue 1974 | |
14220 do 14221 k=1,ni 1974 | |
if(ixx(k).eq.1)goto 14221 1974 | |
if(ju(k).eq.0)goto 14221 1975 | |
if(ga(k) .le. al1*vp(k))goto 14241 1975 | |
ixx(k)=1 1975 | |
ix=1 1975 | |
14241 continue 1976 | |
14221 continue 1977 | |
14222 continue 1977 | |
if(ix.eq.1) go to 10880 1978 | |
goto 13742 1979 | |
14181 continue 1980 | |
goto 13741 1981 | |
13742 continue 1981 | |
if(jx .le. 0)goto 14261 1981 | |
jerr=-10000-ilm 1981 | |
goto 13662 1981 | |
14261 continue 1981 | |
devi=0.0 1982 | |
14270 do 14271 ic=1,nc 1983 | |
if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) 1983 | |
a0(ic,ilm)=b(0,ic) 1984 | |
14280 do 14281 i=1,no 1984 | |
if(y(i,ic).le.0.0)goto 14281 1985 | |
devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 1986 | |
14281 continue 1987 | |
14282 continue 1987 | |
14271 continue 1988 | |
14272 continue 1988 | |
kin(ilm)=nin 1988 | |
alm(ilm)=al 1988 | |
lmu=ilm 1989 | |
dev(ilm)=(dev1-devi)/dev0 1989 | |
if(ig.eq.0)goto 13662 1990 | |
if(ilm.lt.mnl)goto 13661 1990 | |
if(flmin.ge.1.0)goto 13661 1991 | |
if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne)goto 13662 1992 | |
if(dev(ilm).gt.devmax)goto 13662 1992 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 13662 1993 | |
13661 continue 1994 | |
13662 continue 1994 | |
g=log(q) 1994 | |
14290 do 14291 i=1,no 1994 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 1994 | |
14291 continue 1995 | |
14292 continue 1995 | |
deallocate(sxp,b,bs,v,r,xv,q,mm,is,ga,ixx) 1996 | |
return 1997 | |
end 1998 | |
subroutine kazero(kk,n,y,g,q,az,jerr) 1999 | |
implicit double precision(a-h,o-z) 2000 | |
parameter(eps=1.0d-7) 2001 | |
double precision y(n,kk),g(n,kk),q(n),az(kk) 2002 | |
double precision, dimension (:), allocatable :: s | |
double precision, dimension (:,:), allocatable :: e | |
allocate(e(1:n,1:kk),stat=jerr) | |
if(jerr.ne.0) return | |
allocate(s(1:n),stat=jerr) 2009 | |
if(jerr.ne.0) return 2010 | |
az=0.0 2010 | |
e=exp(g) 2010 | |
14300 do 14301 i=1,n 2010 | |
s(i)=sum(e(i,:)) 2010 | |
14301 continue 2011 | |
14302 continue 2011 | |
14310 continue 2011 | |
14311 continue 2011 | |
dm=0.0 2012 | |
14320 do 14321 k=1,kk 2012 | |
t=0.0 2012 | |
u=t 2013 | |
14330 do 14331 i=1,n 2013 | |
pik=e(i,k)/s(i) 2014 | |
t=t+q(i)*(y(i,k)-pik) 2014 | |
u=u+q(i)*pik*(1.0-pik) 2015 | |
14331 continue 2016 | |
14332 continue 2016 | |
d=t/u 2016 | |
az(k)=az(k)+d 2016 | |
ed=exp(d) 2016 | |
dm=max(dm,abs(d)) 2017 | |
14340 do 14341 i=1,n 2017 | |
z=e(i,k) 2017 | |
e(i,k)=z*ed 2017 | |
s(i)=s(i)-z+e(i,k) 2017 | |
14341 continue 2018 | |
14342 continue 2018 | |
14321 continue 2019 | |
14322 continue 2019 | |
if(dm.lt.eps)goto 14312 2019 | |
goto 14311 2020 | |
14312 continue 2020 | |
az=az-sum(az)/kk 2021 | |
deallocate(e,s) 2022 | |
return 2023 | |
end 2024 | |
function elc(parm,n,cl,a,m) 2025 | |
implicit double precision(a-h,o-z) 2026 | |
double precision a(n),cl(2) 2026 | |
integer m(n) 2027 | |
fn=n 2027 | |
am=sum(a)/fn 2028 | |
if((parm .ne. 0.0) .and. (n .ne. 2))goto 14361 2028 | |
elc=am 2028 | |
go to 14370 2028 | |
14361 continue 2029 | |
14380 do 14381 i=1,n 2029 | |
m(i)=i 2029 | |
14381 continue 2029 | |
14382 continue 2029 | |
call psort7(a,m,1,n) 2030 | |
if(a(m(1)) .ne. a(m(n)))goto 14401 2030 | |
elc=a(1) 2030 | |
go to 14370 2030 | |
14401 continue 2031 | |
if(mod(n,2) .ne. 1)goto 14421 2031 | |
ad=a(m(n/2+1)) 2031 | |
goto 14431 2032 | |
14421 continue 2032 | |
ad=0.5*(a(m(n/2+1))+a(m(n/2))) 2032 | |
14431 continue 2033 | |
14411 continue 2033 | |
if(parm .ne. 1.0)goto 14451 2033 | |
elc=ad 2033 | |
go to 14370 2033 | |
14451 continue 2034 | |
b1=min(am,ad) 2034 | |
b2=max(am,ad) 2034 | |
k2=1 2035 | |
14460 continue 2035 | |
14461 if(a(m(k2)).gt.b1)goto 14462 2035 | |
k2=k2+1 2035 | |
goto 14461 2035 | |
14462 continue 2035 | |
k1=k2-1 2036 | |
14470 continue 2036 | |
14471 if(a(m(k2)).ge.b2)goto 14472 2036 | |
k2=k2+1 2036 | |
goto 14471 2037 | |
14472 continue 2037 | |
r=parm/((1.0-parm)*fn) 2037 | |
is=0 2037 | |
sm=n-2*(k1-1) 2038 | |
14480 do 14481 k=k1,k2-1 2038 | |
sm=sm-2.0 2038 | |
s=r*sm+am 2039 | |
if(s .le. a(m(k)) .or. s .gt. a(m(k+1)))goto 14501 2039 | |
is=k 2039 | |
goto 14482 2039 | |
14501 continue 2040 | |
14481 continue 2041 | |
14482 continue 2041 | |
if(is .eq. 0)goto 14521 2041 | |
elc=s 2041 | |
go to 14370 2041 | |
14521 continue 2041 | |
r2=2.0*r 2041 | |
s1=a(m(k1)) 2041 | |
am2=2.0*am 2042 | |
cri=r2*sum(abs(a-s1))+s1*(s1-am2) 2042 | |
elc=s1 2043 | |
14530 do 14531 k=k1+1,k2 2043 | |
s=a(m(k)) 2043 | |
if(s.eq.s1)goto 14531 2044 | |
c=r2*sum(abs(a-s))+s*(s-am2) 2045 | |
if(c .ge. cri)goto 14551 2045 | |
cri=c 2045 | |
elc=s 2045 | |
14551 continue 2045 | |
s1=s 2046 | |
14531 continue 2047 | |
14532 continue 2047 | |
14370 continue 2047 | |
elc=max(maxval(a-cl(2)),min(minval(a-cl(1)),elc)) 2048 | |
return 2049 | |
end 2050 | |
function nintot(ni,nx,nc,a,m,nin,is) 2051 | |
implicit double precision(a-h,o-z) 2052 | |
double precision a(nx,nc) 2052 | |
integer m(nx),is(ni) 2053 | |
is=0 2053 | |
nintot=0 2054 | |
14560 do 14561 ic=1,nc 2054 | |
14570 do 14571 j=1,nin 2054 | |
k=m(j) 2054 | |
if(is(k).ne.0)goto 14571 2055 | |
if(a(j,ic).eq.0.0)goto 14571 2055 | |
is(k)=k 2055 | |
nintot=nintot+1 2056 | |
14571 continue 2056 | |
14572 continue 2056 | |
14561 continue 2057 | |
14562 continue 2057 | |
return 2058 | |
end 2059 | |
subroutine luncomp(ni,nx,nc,ca,ia,nin,a) 2060 | |
implicit double precision(a-h,o-z) 2061 | |
double precision ca(nx,nc),a(ni,nc) 2061 | |
integer ia(nx) 2062 | |
a=0.0 2063 | |
14580 do 14581 ic=1,nc 2063 | |
if(nin.gt.0) a(ia(1:nin),ic)=ca(1:nin,ic) 2063 | |
14581 continue 2064 | |
14582 continue 2064 | |
return 2065 | |
end 2066 | |
subroutine lmodval(nt,x,nc,nx,a0,ca,ia,nin,ans) 2067 | |
implicit double precision(a-h,o-z) 2068 | |
double precision a0(nc),ca(nx,nc),x(nt,*),ans(nc,nt) 2068 | |
integer ia(nx) 2069 | |
14590 do 14591 i=1,nt 2069 | |
14600 do 14601 ic=1,nc 2069 | |
ans(ic,i)=a0(ic) 2071 | |
if(nin.gt.0) ans(ic,i)=ans(ic,i)+dot_product(ca(1:nin,ic),x(i,ia(1 2072 | |
*:nin))) | |
14601 continue 2072 | |
14602 continue 2072 | |
14591 continue 2073 | |
14592 continue 2073 | |
return 2074 | |
end 2075 | |
subroutine splognet (parm,no,ni,nc,x,ix,jx,y,g,jd,vp,cl,ne,nx,nlam 2077 | |
*,flmin, ulam,thr,isd,intr,maxit,kopt,lmu,a0,ca,ia,nin,dev0,dev,al | |
*m,nlp,jerr) | |
implicit double precision(a-h,o-z) 2078 | |
double precision x(*),y(no,max(2,nc)),g(no,nc),vp(ni),ulam(nlam) 2079 | |
double precision ca(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl 2080 | |
*(2,ni) | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 2081 | |
double precision, dimension (:), allocatable :: xm,xs,ww,vq,xv | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 14621 2085 | |
jerr=10000 2085 | |
return 2085 | |
14621 continue 2086 | |
allocate(ww(1:no),stat=jerr) 2087 | |
if(jerr.ne.0) return 2088 | |
allocate(ju(1:ni),stat=jerr) 2089 | |
if(jerr.ne.0) return 2090 | |
allocate(vq(1:ni),stat=jerr) 2091 | |
if(jerr.ne.0) return 2092 | |
allocate(xm(1:ni),stat=jerr) 2093 | |
if(jerr.ne.0) return 2094 | |
allocate(xs(1:ni),stat=jerr) 2095 | |
if(jerr.ne.0) return 2096 | |
if(kopt .ne. 2)goto 14641 2096 | |
allocate(xv(1:ni),stat=jerr) 2096 | |
if(jerr.ne.0) return 2096 | |
14641 continue 2098 | |
call spchkvars(no,ni,x,ix,ju) 2099 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 2100 | |
if(maxval(ju) .gt. 0)goto 14661 2100 | |
jerr=7777 2100 | |
return 2100 | |
14661 continue 2101 | |
vq=max(0d0,vp) 2101 | |
vq=vq*ni/sum(vq) 2102 | |
14670 do 14671 i=1,no 2102 | |
ww(i)=sum(y(i,:)) 2102 | |
if(ww(i).gt.0.0) y(i,:)=y(i,:)/ww(i) 2102 | |
14671 continue 2103 | |
14672 continue 2103 | |
sw=sum(ww) 2103 | |
ww=ww/sw 2104 | |
if(nc .ne. 1)goto 14691 2104 | |
call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) 2105 | |
if(isd .le. 0)goto 14711 2105 | |
14720 do 14721 j=1,ni 2105 | |
cl(:,j)=cl(:,j)*xs(j) 2105 | |
14721 continue 2105 | |
14722 continue 2105 | |
14711 continue 2106 | |
call sprlognet2n(parm,no,ni,x,ix,jx,y(:,1),g(:,1),ww,ju,vq,cl,ne,n 2109 | |
*x,nlam, flmin,ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca,ia,nin | |
*,dev0,dev, alm,nlp,jerr) | |
goto 14681 2110 | |
14691 if(kopt .ne. 2)goto 14731 2111 | |
call multsplstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs,xv) 2112 | |
if(isd .le. 0)goto 14751 2112 | |
14760 do 14761 j=1,ni 2112 | |
cl(:,j)=cl(:,j)*xs(j) 2112 | |
14761 continue 2112 | |
14762 continue 2112 | |
14751 continue 2113 | |
call multsprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nl 2115 | |
*am,flmin, ulam,thr,intr,maxit,xv,xm,xs,lmu,a0,ca,ia,nin,dev0,dev, | |
*alm,nlp,jerr) | |
goto 14771 2116 | |
14731 continue 2116 | |
call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) 2117 | |
if(isd .le. 0)goto 14791 2117 | |
14800 do 14801 j=1,ni 2117 | |
cl(:,j)=cl(:,j)*xs(j) 2117 | |
14801 continue 2117 | |
14802 continue 2117 | |
14791 continue 2118 | |
call sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,f 2121 | |
*lmin, ulam,thr,isd,intr,maxit,kopt,xm,xs,lmu,a0,ca, ia,nin,dev0, | |
*dev,alm,nlp,jerr) | |
14771 continue 2122 | |
14681 continue 2122 | |
if(jerr.gt.0) return 2122 | |
dev0=2.0*sw*dev0 2123 | |
14810 do 14811 k=1,lmu 2123 | |
nk=nin(k) 2124 | |
14820 do 14821 ic=1,nc 2124 | |
if(isd .le. 0)goto 14841 2124 | |
14850 do 14851 l=1,nk 2124 | |
ca(l,ic,k)=ca(l,ic,k)/xs(ia(l)) 2124 | |
14851 continue 2124 | |
14852 continue 2124 | |
14841 continue 2125 | |
if(intr .ne. 0)goto 14871 2125 | |
a0(ic,k)=0.0 2125 | |
goto 14881 2126 | |
14871 continue 2126 | |
a0(ic,k)=a0(ic,k)-dot_product(ca(1:nk,ic,k),xm(ia(1:nk))) 2126 | |
14881 continue 2127 | |
14861 continue 2127 | |
14821 continue 2128 | |
14822 continue 2128 | |
14811 continue 2129 | |
14812 continue 2129 | |
deallocate(ww,ju,vq,xm,xs) 2129 | |
if(kopt.eq.2) deallocate(xv) 2130 | |
return 2131 | |
end 2132 | |
subroutine multsplstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs,xv) 2133 | |
implicit double precision(a-h,o-z) 2134 | |
double precision x(*),w(no),xm(ni),xs(ni),xv(ni) 2134 | |
integer ix(*),jx(*),ju(ni) 2135 | |
if(intr .ne. 0)goto 14901 2136 | |
14910 do 14911 j=1,ni 2136 | |
if(ju(j).eq.0)goto 14911 2136 | |
xm(j)=0.0 2136 | |
jb=ix(j) 2136 | |
je=ix(j+1)-1 2137 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2) 2138 | |
if(isd .eq. 0)goto 14931 2138 | |
xbq=dot_product(w(jx(jb:je)),x(jb:je))**2 2138 | |
vc=xv(j)-xbq 2139 | |
xs(j)=sqrt(vc) 2139 | |
xv(j)=1.0+xbq/vc 2140 | |
goto 14941 2141 | |
14931 continue 2141 | |
xs(j)=1.0 2141 | |
14941 continue 2142 | |
14921 continue 2142 | |
14911 continue 2143 | |
14912 continue 2143 | |
return 2144 | |
14901 continue 2145 | |
14950 do 14951 j=1,ni 2145 | |
if(ju(j).eq.0)goto 14951 2145 | |
jb=ix(j) 2145 | |
je=ix(j+1)-1 2146 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 2147 | |
xv(j)=dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j)**2 2148 | |
if(isd .le. 0)goto 14971 2148 | |
xs(j)=sqrt(xv(j)) 2148 | |
xv(j)=1.0 2148 | |
14971 continue 2149 | |
14951 continue 2150 | |
14952 continue 2150 | |
if(isd.eq.0) xs=1.0 2151 | |
return 2152 | |
end 2153 | |
subroutine splstandard2(no,ni,x,ix,jx,w,ju,isd,intr,xm,xs) 2154 | |
implicit double precision(a-h,o-z) 2155 | |
double precision x(*),w(no),xm(ni),xs(ni) 2155 | |
integer ix(*),jx(*),ju(ni) 2156 | |
if(intr .ne. 0)goto 14991 2157 | |
15000 do 15001 j=1,ni 2157 | |
if(ju(j).eq.0)goto 15001 2157 | |
xm(j)=0.0 2157 | |
jb=ix(j) 2157 | |
je=ix(j+1)-1 2158 | |
if(isd .eq. 0)goto 15021 2159 | |
vc=dot_product(w(jx(jb:je)),x(jb:je)**2) -dot_product(w(jx(jb:je) 2161 | |
*),x(jb:je))**2 | |
xs(j)=sqrt(vc) 2162 | |
goto 15031 2163 | |
15021 continue 2163 | |
xs(j)=1.0 2163 | |
15031 continue 2164 | |
15011 continue 2164 | |
15001 continue 2165 | |
15002 continue 2165 | |
return 2166 | |
14991 continue 2167 | |
15040 do 15041 j=1,ni 2167 | |
if(ju(j).eq.0)goto 15041 2167 | |
jb=ix(j) 2167 | |
je=ix(j+1)-1 2168 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 2169 | |
if(isd.ne.0) xs(j)=sqrt(dot_product(w(jx(jb:je)),x(jb:je)**2)-xm(j 2170 | |
*)**2) | |
15041 continue 2171 | |
15042 continue 2171 | |
if(isd.eq.0) xs=1.0 2172 | |
return 2173 | |
end 2174 | |
subroutine sprlognet2n (parm,no,ni,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,nl 2177 | |
*am, flmin,ulam,shri,isd,intr,maxit,kopt,xb,xs, lmu,a0,a,m,kin,de | |
*v0,dev,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 2178 | |
double precision x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 2179 | |
double precision a(nx,nlam),a0(nlam),dev(nlam),alm(nlam) 2180 | |
double precision xb(ni),xs(ni) 2180 | |
integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) 2181 | |
double precision, dimension (:), allocatable :: xm,b,bs,v,r | |
double precision, dimension (:), allocatable :: sc,xv,q,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2187 | |
allocate(b(0:ni),stat=jerr) 2188 | |
if(jerr.ne.0) return 2189 | |
allocate(xm(0:ni),stat=jerr) 2190 | |
if(jerr.ne.0) return 2191 | |
allocate(xv(1:ni),stat=jerr) 2192 | |
if(jerr.ne.0) return 2193 | |
allocate(bs(0:ni),stat=jerr) 2194 | |
if(jerr.ne.0) return 2195 | |
allocate(ga(1:ni),stat=jerr) 2196 | |
if(jerr.ne.0) return 2197 | |
allocate(mm(1:ni),stat=jerr) 2198 | |
if(jerr.ne.0) return 2199 | |
allocate(ixx(1:ni),stat=jerr) 2200 | |
if(jerr.ne.0) return 2201 | |
allocate(q(1:no),stat=jerr) 2202 | |
if(jerr.ne.0) return 2203 | |
allocate(r(1:no),stat=jerr) 2204 | |
if(jerr.ne.0) return 2205 | |
allocate(v(1:no),stat=jerr) 2206 | |
if(jerr.ne.0) return 2207 | |
allocate(sc(1:no),stat=jerr) 2208 | |
if(jerr.ne.0) return 2209 | |
fmax=log(1.0/pmin-1.0) 2209 | |
fmin=-fmax 2209 | |
vmin=(1.0+pmin)*pmin*(1.0-pmin) 2210 | |
bta=parm 2210 | |
omb=1.0-bta 2211 | |
q0=dot_product(w,y) 2211 | |
if(q0 .gt. pmin)goto 15061 2211 | |
jerr=8001 2211 | |
return 2211 | |
15061 continue 2212 | |
if(q0 .lt. 1.0-pmin)goto 15081 2212 | |
jerr=9001 2212 | |
return 2212 | |
15081 continue 2213 | |
if(intr.eq.0) q0=0.5 2213 | |
bz=0.0 2213 | |
if(intr.ne.0) bz=log(q0/(1.0-q0)) 2214 | |
if(nonzero(no,g) .ne. 0)goto 15101 2214 | |
vi=q0*(1.0-q0) 2214 | |
b(0)=bz 2214 | |
v=vi*w 2215 | |
r=w*(y-q0) 2215 | |
q=q0 2215 | |
xm(0)=vi 2215 | |
dev1=-(bz*q0+log(1.0-q0)) 2216 | |
goto 15111 2217 | |
15101 continue 2217 | |
b(0)=0.0 2218 | |
if(intr .eq. 0)goto 15131 2218 | |
b(0)=azero(no,y,g,w,jerr) 2218 | |
if(jerr.ne.0) return 2218 | |
15131 continue 2219 | |
q=1.0/(1.0+exp(-b(0)-g)) 2219 | |
v=w*q*(1.0-q) 2219 | |
r=w*(y-q) 2219 | |
xm(0)=sum(v) 2220 | |
dev1=-(b(0)*q0+dot_product(w,y*g+log(1.0-q))) 2221 | |
15111 continue 2222 | |
15091 continue 2222 | |
if(kopt .le. 0)goto 15151 2223 | |
if(isd .le. 0 .or. intr .eq. 0)goto 15171 2223 | |
xv=0.25 2223 | |
goto 15181 2224 | |
15171 continue 2225 | |
15190 do 15191 j=1,ni 2225 | |
if(ju(j).eq.0)goto 15191 2225 | |
jb=ix(j) 2225 | |
je=ix(j+1)-1 2226 | |
xv(j)=0.25*(dot_product(w(jx(jb:je)),x(jb:je)**2)-xb(j)**2) 2227 | |
15191 continue 2228 | |
15192 continue 2228 | |
15181 continue 2229 | |
15161 continue 2229 | |
15151 continue 2230 | |
b(1:ni)=0.0 2230 | |
dev0=dev1 2231 | |
15200 do 15201 i=1,no 2231 | |
if(y(i).gt.0.0) dev0=dev0+w(i)*y(i)*log(y(i)) 2232 | |
if(y(i).lt.1.0) dev0=dev0+w(i)*(1.0-y(i))*log(1.0-y(i)) 2233 | |
15201 continue 2235 | |
15202 continue 2235 | |
alf=1.0 2237 | |
if(flmin .ge. 1.0)goto 15221 2237 | |
eqs=max(eps,flmin) 2237 | |
alf=eqs**(1.0/(nlam-1)) 2237 | |
15221 continue 2238 | |
m=0 2238 | |
mm=0 2238 | |
nin=0 2238 | |
o=0.0 2238 | |
svr=o 2238 | |
mnl=min(mnlam,nlam) 2238 | |
bs=0.0 2238 | |
nlp=0 2238 | |
nin=nlp 2239 | |
shr=shri*dev0 2239 | |
al=0.0 2239 | |
ixx=0 2240 | |
15230 do 15231 j=1,ni 2240 | |
if(ju(j).eq.0)goto 15231 2241 | |
jb=ix(j) 2241 | |
je=ix(j+1)-1 2241 | |
jn=ix(j+1)-ix(j) 2242 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2243 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2244 | |
ga(j)=abs((gj-svr*xb(j))/xs(j)) 2245 | |
15231 continue 2246 | |
15232 continue 2246 | |
15240 do 15241 ilm=1,nlam 2246 | |
al0=al 2247 | |
if(flmin .lt. 1.0)goto 15261 2247 | |
al=ulam(ilm) 2247 | |
goto 15251 2248 | |
15261 if(ilm .le. 2)goto 15271 2248 | |
al=al*alf 2248 | |
goto 15251 2249 | |
15271 if(ilm .ne. 1)goto 15281 2249 | |
al=big 2249 | |
goto 15291 2250 | |
15281 continue 2250 | |
al0=0.0 2251 | |
15300 do 15301 j=1,ni 2251 | |
if(ju(j).eq.0)goto 15301 2251 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2251 | |
15301 continue 2252 | |
15302 continue 2252 | |
al0=al0/max(bta,1.0d-3) 2252 | |
al=alf*al0 2253 | |
15291 continue 2254 | |
15251 continue 2254 | |
al2=al*omb 2254 | |
al1=al*bta 2254 | |
tlam=bta*(2.0*al-al0) 2255 | |
15310 do 15311 k=1,ni 2255 | |
if(ixx(k).eq.1)goto 15311 2255 | |
if(ju(k).eq.0)goto 15311 2256 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 2257 | |
15311 continue 2258 | |
15312 continue 2258 | |
10880 continue 2259 | |
15320 continue 2259 | |
15321 continue 2259 | |
bs(0)=b(0) 2259 | |
if(nin.gt.0) bs(m(1:nin))=b(m(1:nin)) 2260 | |
15330 do 15331 j=1,ni 2260 | |
if(ixx(j).eq.0)goto 15331 2261 | |
jb=ix(j) 2261 | |
je=ix(j+1)-1 2261 | |
jn=ix(j+1)-ix(j) 2262 | |
sc(1:jn)=v(jx(jb:je)) 2263 | |
xm(j)=dot_product(sc(1:jn),x(jb:je)) 2264 | |
if(kopt .ne. 0)goto 15351 2265 | |
xv(j)=dot_product(sc(1:jn),x(jb:je)**2) 2266 | |
xv(j)=(xv(j)-2.0*xb(j)*xm(j)+xm(0)*xb(j)**2)/xs(j)**2 2267 | |
15351 continue 2268 | |
15331 continue 2269 | |
15332 continue 2269 | |
15360 continue 2269 | |
15361 continue 2269 | |
nlp=nlp+1 2269 | |
dlx=0.0 2270 | |
15370 do 15371 k=1,ni 2270 | |
if(ixx(k).eq.0)goto 15371 2271 | |
jb=ix(k) 2271 | |
je=ix(k+1)-1 2271 | |
jn=ix(k+1)-ix(k) 2271 | |
bk=b(k) 2272 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2273 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2274 | |
gk=(gk-svr*xb(k))/xs(k) 2275 | |
u=gk+xv(k)*b(k) 2275 | |
au=abs(u)-vp(k)*al1 2276 | |
if(au .gt. 0.0)goto 15391 2276 | |
b(k)=0.0 2276 | |
goto 15401 2277 | |
15391 continue 2278 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 2279 | |
15401 continue 2280 | |
15381 continue 2280 | |
d=b(k)-bk 2280 | |
if(abs(d).le.0.0)goto 15371 2280 | |
dlx=max(dlx,xv(k)*d**2) 2281 | |
if(mm(k) .ne. 0)goto 15421 2281 | |
nin=nin+1 2281 | |
if(nin.gt.nx)goto 15372 2282 | |
mm(k)=nin 2282 | |
m(nin)=k 2282 | |
sc(1:jn)=v(jx(jb:je)) 2283 | |
xm(k)=dot_product(sc(1:jn),x(jb:je)) 2284 | |
15421 continue 2285 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2286 | |
o=o+d*(xb(k)/xs(k)) 2287 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2288 | |
15371 continue 2289 | |
15372 continue 2289 | |
if(nin.gt.nx)goto 15362 2290 | |
d=0.0 2290 | |
if(intr.ne.0) d=svr/xm(0) 2291 | |
if(d .eq. 0.0)goto 15441 2291 | |
b(0)=b(0)+d 2291 | |
dlx=max(dlx,xm(0)*d**2) 2291 | |
r=r-d*v 2292 | |
svr=svr-d*xm(0) 2293 | |
15441 continue 2294 | |
if(dlx.lt.shr)goto 15362 2295 | |
if(nlp .le. maxit)goto 15461 2295 | |
jerr=-ilm 2295 | |
return 2295 | |
15461 continue 2296 | |
15470 continue 2296 | |
15471 continue 2296 | |
nlp=nlp+1 2296 | |
dlx=0.0 2297 | |
15480 do 15481 l=1,nin 2297 | |
k=m(l) 2297 | |
jb=ix(k) 2297 | |
je=ix(k+1)-1 2298 | |
jn=ix(k+1)-ix(k) 2298 | |
bk=b(k) 2299 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2300 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2301 | |
gk=(gk-svr*xb(k))/xs(k) 2302 | |
u=gk+xv(k)*b(k) 2302 | |
au=abs(u)-vp(k)*al1 2303 | |
if(au .gt. 0.0)goto 15501 2303 | |
b(k)=0.0 2303 | |
goto 15511 2304 | |
15501 continue 2305 | |
b(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(xv(k)+vp(k)*al2))) 2306 | |
15511 continue 2307 | |
15491 continue 2307 | |
d=b(k)-bk 2307 | |
if(abs(d).le.0.0)goto 15481 2307 | |
dlx=max(dlx,xv(k)*d**2) 2308 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2309 | |
o=o+d*(xb(k)/xs(k)) 2310 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2311 | |
15481 continue 2312 | |
15482 continue 2312 | |
d=0.0 2312 | |
if(intr.ne.0) d=svr/xm(0) 2313 | |
if(d .eq. 0.0)goto 15531 2313 | |
b(0)=b(0)+d 2313 | |
dlx=max(dlx,xm(0)*d**2) 2313 | |
r=r-d*v 2314 | |
svr=svr-d*xm(0) 2315 | |
15531 continue 2316 | |
if(dlx.lt.shr)goto 15472 2317 | |
if(nlp .le. maxit)goto 15551 2317 | |
jerr=-ilm 2317 | |
return 2317 | |
15551 continue 2318 | |
goto 15471 2319 | |
15472 continue 2319 | |
goto 15361 2320 | |
15362 continue 2320 | |
if(nin.gt.nx)goto 15322 2321 | |
sc=b(0) 2321 | |
b0=0.0 2322 | |
15560 do 15561 j=1,nin 2322 | |
l=m(j) 2322 | |
jb=ix(l) 2322 | |
je=ix(l+1)-1 2323 | |
sc(jx(jb:je))=sc(jx(jb:je))+b(l)*x(jb:je)/xs(l) 2324 | |
b0=b0-b(l)*xb(l)/xs(l) 2325 | |
15561 continue 2326 | |
15562 continue 2326 | |
sc=sc+b0 2327 | |
15570 do 15571 i=1,no 2327 | |
fi=sc(i)+g(i) 2328 | |
if(fi .ge. fmin)goto 15591 2328 | |
q(i)=0.0 2328 | |
goto 15581 2328 | |
15591 if(fi .le. fmax)goto 15601 2328 | |
q(i)=1.0 2328 | |
goto 15611 2329 | |
15601 continue 2329 | |
q(i)=1.0/(1.0+exp(-fi)) 2329 | |
15611 continue 2330 | |
15581 continue 2330 | |
15571 continue 2331 | |
15572 continue 2331 | |
v=w*q*(1.0-q) 2331 | |
xm(0)=sum(v) 2331 | |
if(xm(0).lt.vmin)goto 15322 2332 | |
r=w*(y-q) 2332 | |
svr=sum(r) 2332 | |
o=0.0 2333 | |
if(xm(0)*(b(0)-bs(0))**2 .ge. shr)goto 15631 2333 | |
kx=0 2334 | |
15640 do 15641 j=1,nin 2334 | |
k=m(j) 2335 | |
if(xv(k)*(b(k)-bs(k))**2.lt.shr)goto 15641 2335 | |
kx=1 2335 | |
goto 15642 2336 | |
15641 continue 2337 | |
15642 continue 2337 | |
if(kx .ne. 0)goto 15661 2338 | |
15670 do 15671 j=1,ni 2338 | |
if(ixx(j).eq.1)goto 15671 2338 | |
if(ju(j).eq.0)goto 15671 2339 | |
jb=ix(j) 2339 | |
je=ix(j+1)-1 2339 | |
jn=ix(j+1)-ix(j) 2340 | |
sc(1:jn)=r(jx(jb:je))+v(jx(jb:je))*o 2341 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2342 | |
ga(j)=abs((gj-svr*xb(j))/xs(j)) 2343 | |
if(ga(j) .le. al1*vp(j))goto 15691 2343 | |
ixx(j)=1 2343 | |
kx=1 2343 | |
15691 continue 2344 | |
15671 continue 2345 | |
15672 continue 2345 | |
if(kx.eq.1) go to 10880 2346 | |
goto 15322 2347 | |
15661 continue 2348 | |
15631 continue 2349 | |
goto 15321 2350 | |
15322 continue 2350 | |
if(nin .le. nx)goto 15711 2350 | |
jerr=-10000-ilm 2350 | |
goto 15242 2350 | |
15711 continue 2351 | |
if(nin.gt.0) a(1:nin,ilm)=b(m(1:nin)) 2351 | |
kin(ilm)=nin 2352 | |
a0(ilm)=b(0) 2352 | |
alm(ilm)=al 2352 | |
lmu=ilm 2353 | |
devi=dev2(no,w,y,q,pmin) 2354 | |
dev(ilm)=(dev1-devi)/dev0 2355 | |
if(ilm.lt.mnl)goto 15241 2355 | |
if(flmin.ge.1.0)goto 15241 2356 | |
me=0 2356 | |
15720 do 15721 j=1,nin 2356 | |
if(a(j,ilm).ne.0.0) me=me+1 2356 | |
15721 continue 2356 | |
15722 continue 2356 | |
if(me.gt.ne)goto 15242 2357 | |
if(dev(ilm).gt.devmax)goto 15242 2357 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 15242 2358 | |
if(xm(0).lt.vmin)goto 15242 2359 | |
15241 continue 2360 | |
15242 continue 2360 | |
g=log(q/(1.0-q)) 2361 | |
deallocate(xm,b,bs,v,r,sc,xv,q,mm,ga,ixx) 2362 | |
return 2363 | |
end 2364 | |
subroutine sprlognetn(parm,no,ni,nc,x,ix,jx,y,g,w,ju,vp,cl,ne,nx,n 2366 | |
*lam,flmin, ulam,shri,isd,intr,maxit,kopt,xb,xs,lmu,a0,a,m,kin,dev | |
*0,dev,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 2367 | |
double precision x(*),y(no,nc),g(no,nc),w(no),vp(ni),ulam(nlam),xb 2368 | |
*(ni),xs(ni) | |
double precision a(nx,nc,nlam),a0(nc,nlam),dev(nlam),alm(nlam),cl( 2369 | |
*2,ni) | |
integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) 2370 | |
double precision, dimension (:,:), allocatable :: q | |
double precision, dimension (:), allocatable :: sxp,sxpl | |
double precision, dimension (:), allocatable :: sc,xm,v,r,ga | |
double precision, dimension (:,:), allocatable :: b,bs,xv | |
integer, dimension (:), allocatable :: mm,is,iy | |
allocate(b(0:ni,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
allocate(xv(1:ni,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
allocate(bs(0:ni,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
allocate(q(1:no,1:nc),stat=jerr) | |
if(jerr.ne.0) return | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2385 | |
exmn=-exmx 2386 | |
allocate(xm(0:ni),stat=jerr) 2387 | |
if(jerr.ne.0) return 2388 | |
allocate(r(1:no),stat=jerr) 2389 | |
if(jerr.ne.0) return 2390 | |
allocate(v(1:no),stat=jerr) 2391 | |
if(jerr.ne.0) return 2392 | |
allocate(mm(1:ni),stat=jerr) 2393 | |
if(jerr.ne.0) return 2394 | |
allocate(ga(1:ni),stat=jerr) 2395 | |
if(jerr.ne.0) return 2396 | |
allocate(iy(1:ni),stat=jerr) 2397 | |
if(jerr.ne.0) return 2398 | |
allocate(is(1:max(nc,ni)),stat=jerr) 2399 | |
if(jerr.ne.0) return 2400 | |
allocate(sxp(1:no),stat=jerr) 2401 | |
if(jerr.ne.0) return 2402 | |
allocate(sxpl(1:no),stat=jerr) 2403 | |
if(jerr.ne.0) return 2404 | |
allocate(sc(1:no),stat=jerr) 2405 | |
if(jerr.ne.0) return 2406 | |
pmax=1.0-pmin 2406 | |
emin=pmin/pmax 2406 | |
emax=1.0/emin 2407 | |
pfm=(1.0+pmin)*pmin 2407 | |
pfx=(1.0-pmin)*pmax 2407 | |
vmin=pfm*pmax 2408 | |
bta=parm 2408 | |
omb=1.0-bta 2408 | |
dev1=0.0 2408 | |
dev0=0.0 2409 | |
15730 do 15731 ic=1,nc 2409 | |
q0=dot_product(w,y(:,ic)) 2410 | |
if(q0 .gt. pmin)goto 15751 2410 | |
jerr =8000+ic 2410 | |
return 2410 | |
15751 continue 2411 | |
if(q0 .lt. 1.0-pmin)goto 15771 2411 | |
jerr =9000+ic 2411 | |
return 2411 | |
15771 continue 2412 | |
if(intr.eq.0) q0=1.0/nc 2413 | |
b(1:ni,ic)=0.0 2413 | |
b(0,ic)=0.0 2414 | |
if(intr .eq. 0)goto 15791 2414 | |
b(0,ic)=log(q0) 2414 | |
dev1=dev1-q0*b(0,ic) 2414 | |
15791 continue 2415 | |
15731 continue 2416 | |
15732 continue 2416 | |
if(intr.eq.0) dev1=log(float(nc)) 2416 | |
iy=0 2416 | |
al=0.0 2417 | |
if(nonzero(no*nc,g) .ne. 0)goto 15811 2418 | |
b(0,:)=b(0,:)-sum(b(0,:))/nc 2418 | |
sxp=0.0 2419 | |
15820 do 15821 ic=1,nc 2419 | |
q(:,ic)=exp(b(0,ic)) 2419 | |
sxp=sxp+q(:,ic) 2419 | |
15821 continue 2420 | |
15822 continue 2420 | |
goto 15831 2421 | |
15811 continue 2421 | |
15840 do 15841 i=1,no 2421 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 2421 | |
15841 continue 2421 | |
15842 continue 2421 | |
sxp=0.0 2422 | |
if(intr .ne. 0)goto 15861 2422 | |
b(0,:)=0.0 2422 | |
goto 15871 2423 | |
15861 continue 2423 | |
call kazero(nc,no,y,g,w,b(0,:),jerr) 2423 | |
if(jerr.ne.0) return 2423 | |
15871 continue 2424 | |
15851 continue 2424 | |
dev1=0.0 2425 | |
15880 do 15881 ic=1,nc 2425 | |
q(:,ic)=b(0,ic)+g(:,ic) 2426 | |
dev1=dev1-dot_product(w,y(:,ic)*q(:,ic)) 2427 | |
q(:,ic)=exp(q(:,ic)) 2427 | |
sxp=sxp+q(:,ic) 2428 | |
15881 continue 2429 | |
15882 continue 2429 | |
sxpl=w*log(sxp) 2429 | |
15890 do 15891 ic=1,nc 2429 | |
dev1=dev1+dot_product(y(:,ic),sxpl) 2429 | |
15891 continue 2430 | |
15892 continue 2430 | |
15831 continue 2431 | |
15801 continue 2431 | |
15900 do 15901 ic=1,nc 2431 | |
15910 do 15911 i=1,no 2431 | |
if(y(i,ic).gt.0.0) dev0=dev0+w(i)*y(i,ic)*log(y(i,ic)) 2431 | |
15911 continue 2431 | |
15912 continue 2431 | |
15901 continue 2432 | |
15902 continue 2432 | |
dev0=dev0+dev1 2433 | |
if(kopt .le. 0)goto 15931 2434 | |
if(isd .le. 0 .or. intr .eq. 0)goto 15951 2434 | |
xv=0.25 2434 | |
goto 15961 2435 | |
15951 continue 2436 | |
15970 do 15971 j=1,ni 2436 | |
if(ju(j).eq.0)goto 15971 2436 | |
jb=ix(j) 2436 | |
je=ix(j+1)-1 2437 | |
xv(j,:)=0.25*(dot_product(w(jx(jb:je)),x(jb:je)**2)-xb(j)**2) 2438 | |
15971 continue 2439 | |
15972 continue 2439 | |
15961 continue 2440 | |
15941 continue 2440 | |
15931 continue 2442 | |
alf=1.0 2444 | |
if(flmin .ge. 1.0)goto 15991 2444 | |
eqs=max(eps,flmin) 2444 | |
alf=eqs**(1.0/(nlam-1)) 2444 | |
15991 continue 2445 | |
m=0 2445 | |
mm=0 2445 | |
nin=0 2445 | |
nlp=0 2445 | |
mnl=min(mnlam,nlam) 2445 | |
bs=0.0 2445 | |
svr=0.0 2445 | |
o=0.0 2446 | |
shr=shri*dev0 2446 | |
ga=0.0 2447 | |
16000 do 16001 ic=1,nc 2447 | |
v=q(:,ic)/sxp 2447 | |
r=w*(y(:,ic)-v) 2447 | |
v=w*v*(1.0-v) 2448 | |
16010 do 16011 j=1,ni 2448 | |
if(ju(j).eq.0)goto 16011 2449 | |
jb=ix(j) 2449 | |
je=ix(j+1)-1 2449 | |
jn=ix(j+1)-ix(j) 2450 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2451 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2452 | |
ga(j)=max(ga(j),abs(gj-svr*xb(j))/xs(j)) 2453 | |
16011 continue 2454 | |
16012 continue 2454 | |
16001 continue 2455 | |
16002 continue 2455 | |
16020 do 16021 ilm=1,nlam 2455 | |
al0=al 2456 | |
if(flmin .lt. 1.0)goto 16041 2456 | |
al=ulam(ilm) 2456 | |
goto 16031 2457 | |
16041 if(ilm .le. 2)goto 16051 2457 | |
al=al*alf 2457 | |
goto 16031 2458 | |
16051 if(ilm .ne. 1)goto 16061 2458 | |
al=big 2458 | |
goto 16071 2459 | |
16061 continue 2459 | |
al0=0.0 2460 | |
16080 do 16081 j=1,ni 2460 | |
if(ju(j).eq.0)goto 16081 2460 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2460 | |
16081 continue 2461 | |
16082 continue 2461 | |
al0=al0/max(bta,1.0d-3) 2461 | |
al=alf*al0 2462 | |
16071 continue 2463 | |
16031 continue 2463 | |
al2=al*omb 2463 | |
al1=al*bta 2463 | |
tlam=bta*(2.0*al-al0) 2464 | |
16090 do 16091 k=1,ni 2464 | |
if(iy(k).eq.1)goto 16091 2464 | |
if(ju(k).eq.0)goto 16091 2465 | |
if(ga(k).gt.tlam*vp(k)) iy(k)=1 2466 | |
16091 continue 2467 | |
16092 continue 2467 | |
10880 continue 2468 | |
16100 continue 2468 | |
16101 continue 2468 | |
ixx=0 2468 | |
jxx=ixx 2468 | |
ig=0 2469 | |
16110 do 16111 ic=1,nc 2469 | |
bs(0,ic)=b(0,ic) 2470 | |
if(nin.gt.0) bs(m(1:nin),ic)=b(m(1:nin),ic) 2471 | |
xm(0)=0.0 2471 | |
svr=0.0 2471 | |
o=0.0 2472 | |
16120 do 16121 i=1,no 2472 | |
pic=q(i,ic)/sxp(i) 2473 | |
if(pic .ge. pfm)goto 16141 2473 | |
pic=0.0 2473 | |
v(i)=0.0 2473 | |
goto 16131 2474 | |
16141 if(pic .le. pfx)goto 16151 2474 | |
pic=1.0 2474 | |
v(i)=0.0 2474 | |
goto 16161 2475 | |
16151 continue 2475 | |
v(i)=w(i)*pic*(1.0-pic) 2475 | |
xm(0)=xm(0)+v(i) 2475 | |
16161 continue 2476 | |
16131 continue 2476 | |
r(i)=w(i)*(y(i,ic)-pic) 2476 | |
svr=svr+r(i) 2477 | |
16121 continue 2478 | |
16122 continue 2478 | |
if(xm(0).le.vmin)goto 16111 2478 | |
ig=1 2479 | |
16170 do 16171 j=1,ni 2479 | |
if(iy(j).eq.0)goto 16171 2480 | |
jb=ix(j) 2480 | |
je=ix(j+1)-1 2481 | |
xm(j)=dot_product(v(jx(jb:je)),x(jb:je)) 2482 | |
if(kopt .ne. 0)goto 16191 2483 | |
xv(j,ic)=dot_product(v(jx(jb:je)),x(jb:je)**2) 2484 | |
xv(j,ic)=(xv(j,ic)-2.0*xb(j)*xm(j)+xm(0)*xb(j)**2)/xs(j)**2 2485 | |
16191 continue 2486 | |
16171 continue 2487 | |
16172 continue 2487 | |
16200 continue 2487 | |
16201 continue 2487 | |
nlp=nlp+1 2487 | |
dlx=0.0 2488 | |
16210 do 16211 k=1,ni 2488 | |
if(iy(k).eq.0)goto 16211 2489 | |
jb=ix(k) 2489 | |
je=ix(k+1)-1 2489 | |
jn=ix(k+1)-ix(k) 2489 | |
bk=b(k,ic) 2490 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2491 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2492 | |
gk=(gk-svr*xb(k))/xs(k) 2493 | |
u=gk+xv(k,ic)*b(k,ic) 2493 | |
au=abs(u)-vp(k)*al1 2494 | |
if(au .gt. 0.0)goto 16231 2494 | |
b(k,ic)=0.0 2494 | |
goto 16241 2495 | |
16231 continue 2496 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 2498 | |
*) | |
16241 continue 2499 | |
16221 continue 2499 | |
d=b(k,ic)-bk 2499 | |
if(abs(d).le.0.0)goto 16211 2500 | |
dlx=max(dlx,xv(k,ic)*d**2) 2501 | |
if(mm(k) .ne. 0)goto 16261 2501 | |
nin=nin+1 2502 | |
if(nin .le. nx)goto 16281 2502 | |
jxx=1 2502 | |
goto 16212 2502 | |
16281 continue 2503 | |
mm(k)=nin 2503 | |
m(nin)=k 2504 | |
xm(k)=dot_product(v(jx(jb:je)),x(jb:je)) 2505 | |
16261 continue 2506 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2507 | |
o=o+d*(xb(k)/xs(k)) 2508 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2509 | |
16211 continue 2510 | |
16212 continue 2510 | |
if(jxx.gt.0)goto 16202 2511 | |
d=0.0 2511 | |
if(intr.ne.0) d=svr/xm(0) 2512 | |
if(d .eq. 0.0)goto 16301 2512 | |
b(0,ic)=b(0,ic)+d 2512 | |
dlx=max(dlx,xm(0)*d**2) 2513 | |
r=r-d*v 2513 | |
svr=svr-d*xm(0) 2514 | |
16301 continue 2515 | |
if(dlx.lt.shr)goto 16202 2515 | |
if(nlp .le. maxit)goto 16321 2515 | |
jerr=-ilm 2515 | |
return 2515 | |
16321 continue 2516 | |
16330 continue 2516 | |
16331 continue 2516 | |
nlp=nlp+1 2516 | |
dlx=0.0 2517 | |
16340 do 16341 l=1,nin 2517 | |
k=m(l) 2517 | |
jb=ix(k) 2517 | |
je=ix(k+1)-1 2518 | |
jn=ix(k+1)-ix(k) 2518 | |
bk=b(k,ic) 2519 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2520 | |
gk=dot_product(sc(1:jn),x(jb:je)) 2521 | |
gk=(gk-svr*xb(k))/xs(k) 2522 | |
u=gk+xv(k,ic)*b(k,ic) 2522 | |
au=abs(u)-vp(k)*al1 2523 | |
if(au .gt. 0.0)goto 16361 2523 | |
b(k,ic)=0.0 2523 | |
goto 16371 2524 | |
16361 continue 2525 | |
b(k,ic)=max(cl(1,k),min(cl(2,k),sign(au,u)/ (xv(k,ic)+vp(k)*al2)) 2527 | |
*) | |
16371 continue 2528 | |
16351 continue 2528 | |
d=b(k,ic)-bk 2528 | |
if(abs(d).le.0.0)goto 16341 2529 | |
dlx=max(dlx,xv(k,ic)*d**2) 2530 | |
r(jx(jb:je))=r(jx(jb:je))-d*v(jx(jb:je))*x(jb:je)/xs(k) 2531 | |
o=o+d*(xb(k)/xs(k)) 2532 | |
svr=svr-d*(xm(k)-xb(k)*xm(0))/xs(k) 2533 | |
16341 continue 2534 | |
16342 continue 2534 | |
d=0.0 2534 | |
if(intr.ne.0) d=svr/xm(0) 2535 | |
if(d .eq. 0.0)goto 16391 2535 | |
b(0,ic)=b(0,ic)+d 2535 | |
dlx=max(dlx,xm(0)*d**2) 2536 | |
r=r-d*v 2536 | |
svr=svr-d*xm(0) 2537 | |
16391 continue 2538 | |
if(dlx.lt.shr)goto 16332 2538 | |
if(nlp .le. maxit)goto 16411 2538 | |
jerr=-ilm 2538 | |
return 2538 | |
16411 continue 2539 | |
goto 16331 2540 | |
16332 continue 2540 | |
goto 16201 2541 | |
16202 continue 2541 | |
if(jxx.gt.0)goto 16112 2542 | |
if(xm(0)*(b(0,ic)-bs(0,ic))**2.gt.shr) ixx=1 2543 | |
if(ixx .ne. 0)goto 16431 2544 | |
16440 do 16441 j=1,nin 2544 | |
k=m(j) 2545 | |
if(xv(k,ic)*(b(k,ic)-bs(k,ic))**2 .le. shr)goto 16461 2545 | |
ixx=1 2545 | |
goto 16442 2545 | |
16461 continue 2546 | |
16441 continue 2547 | |
16442 continue 2547 | |
16431 continue 2548 | |
sc=b(0,ic)+g(:,ic) 2548 | |
b0=0.0 2549 | |
16470 do 16471 j=1,nin 2549 | |
l=m(j) 2549 | |
jb=ix(l) 2549 | |
je=ix(l+1)-1 2550 | |
sc(jx(jb:je))=sc(jx(jb:je))+b(l,ic)*x(jb:je)/xs(l) 2551 | |
b0=b0-b(l,ic)*xb(l)/xs(l) 2552 | |
16471 continue 2553 | |
16472 continue 2553 | |
sc=min(max(exmn,sc+b0),exmx) 2554 | |
sxp=sxp-q(:,ic) 2555 | |
q(:,ic)=min(max(emin*sxp,exp(sc)),emax*sxp) 2556 | |
sxp=sxp+q(:,ic) 2557 | |
16111 continue 2558 | |
16112 continue 2558 | |
s=-sum(b(0,:))/nc 2558 | |
b(0,:)=b(0,:)+s 2558 | |
sc=s 2558 | |
b0=0.0 2559 | |
16480 do 16481 j=1,nin 2559 | |
l=m(j) 2560 | |
if(vp(l) .gt. 0.0)goto 16501 2560 | |
s=sum(b(l,:))/nc 2560 | |
goto 16511 2561 | |
16501 continue 2561 | |
s=elc(parm,nc,cl(:,l),b(l,:),is) 2561 | |
16511 continue 2562 | |
16491 continue 2562 | |
b(l,:)=b(l,:)-s 2563 | |
jb=ix(l) 2563 | |
je=ix(l+1)-1 2564 | |
sc(jx(jb:je))=sc(jx(jb:je))-s*x(jb:je)/xs(l) 2565 | |
b0=b0+s*xb(l)/xs(l) 2566 | |
16481 continue 2567 | |
16482 continue 2567 | |
sc=sc+b0 2567 | |
sc=exp(sc) 2567 | |
sxp=sxp*sc 2567 | |
16520 do 16521 ic=1,nc 2567 | |
q(:,ic)=q(:,ic)*sc 2567 | |
16521 continue 2568 | |
16522 continue 2568 | |
if(jxx.gt.0)goto 16102 2568 | |
if(ig.eq.0)goto 16102 2569 | |
if(ixx .ne. 0)goto 16541 2570 | |
16550 do 16551 j=1,ni 2570 | |
if(iy(j).eq.1)goto 16551 2570 | |
if(ju(j).eq.0)goto 16551 2570 | |
ga(j)=0.0 2570 | |
16551 continue 2571 | |
16552 continue 2571 | |
16560 do 16561 ic=1,nc 2571 | |
v=q(:,ic)/sxp 2571 | |
r=w*(y(:,ic)-v) 2571 | |
v=w*v*(1.0-v) 2572 | |
16570 do 16571 j=1,ni 2572 | |
if(iy(j).eq.1)goto 16571 2572 | |
if(ju(j).eq.0)goto 16571 2573 | |
jb=ix(j) 2573 | |
je=ix(j+1)-1 2573 | |
jn=ix(j+1)-ix(j) 2574 | |
sc(1:jn)=r(jx(jb:je))+o*v(jx(jb:je)) 2575 | |
gj=dot_product(sc(1:jn),x(jb:je)) 2576 | |
ga(j)=max(ga(j),abs(gj-svr*xb(j))/xs(j)) 2577 | |
16571 continue 2578 | |
16572 continue 2578 | |
16561 continue 2579 | |
16562 continue 2579 | |
16580 do 16581 k=1,ni 2579 | |
if(iy(k).eq.1)goto 16581 2579 | |
if(ju(k).eq.0)goto 16581 2580 | |
if(ga(k) .le. al1*vp(k))goto 16601 2580 | |
iy(k)=1 2580 | |
ixx=1 2580 | |
16601 continue 2581 | |
16581 continue 2582 | |
16582 continue 2582 | |
if(ixx.eq.1) go to 10880 2583 | |
goto 16102 2584 | |
16541 continue 2585 | |
goto 16101 2586 | |
16102 continue 2586 | |
if(jxx .le. 0)goto 16621 2586 | |
jerr=-10000-ilm 2586 | |
goto 16022 2586 | |
16621 continue 2586 | |
devi=0.0 2587 | |
16630 do 16631 ic=1,nc 2588 | |
if(nin.gt.0) a(1:nin,ic,ilm)=b(m(1:nin),ic) 2588 | |
a0(ic,ilm)=b(0,ic) 2589 | |
16640 do 16641 i=1,no 2589 | |
if(y(i,ic).le.0.0)goto 16641 2590 | |
devi=devi-w(i)*y(i,ic)*log(q(i,ic)/sxp(i)) 2591 | |
16641 continue 2592 | |
16642 continue 2592 | |
16631 continue 2593 | |
16632 continue 2593 | |
kin(ilm)=nin 2593 | |
alm(ilm)=al 2593 | |
lmu=ilm 2594 | |
dev(ilm)=(dev1-devi)/dev0 2594 | |
if(ig.eq.0)goto 16022 2595 | |
if(ilm.lt.mnl)goto 16021 2595 | |
if(flmin.ge.1.0)goto 16021 2596 | |
if(nintot(ni,nx,nc,a(1,1,ilm),m,nin,is).gt.ne)goto 16022 2597 | |
if(dev(ilm).gt.devmax)goto 16022 2597 | |
if(dev(ilm)-dev(ilm-1).lt.sml)goto 16022 2598 | |
16021 continue 2599 | |
16022 continue 2599 | |
g=log(q) 2599 | |
16650 do 16651 i=1,no 2599 | |
g(i,:)=g(i,:)-sum(g(i,:))/nc 2599 | |
16651 continue 2600 | |
16652 continue 2600 | |
deallocate(sxp,b,bs,v,r,xv,q,mm,is,xm,sc,ga,iy) 2601 | |
return 2602 | |
end 2603 | |
subroutine lcmodval(nc,nx,a0,ca,ia,nin,x,ix,jx,n,f) 2604 | |
implicit double precision(a-h,o-z) 2605 | |
double precision a0(nc),ca(nx,nc),x(*),f(nc,n) 2605 | |
integer ia(*),ix(*),jx(*) 2606 | |
16660 do 16661 ic=1,nc 2606 | |
f(ic,:)=a0(ic) 2606 | |
16661 continue 2607 | |
16662 continue 2607 | |
16670 do 16671 j=1,nin 2607 | |
k=ia(j) 2607 | |
kb=ix(k) 2607 | |
ke=ix(k+1)-1 2608 | |
16680 do 16681 ic=1,nc 2608 | |
f(ic,jx(kb:ke))=f(ic,jx(kb:ke))+ca(j,ic)*x(kb:ke) 2608 | |
16681 continue 2609 | |
16682 continue 2609 | |
16671 continue 2610 | |
16672 continue 2610 | |
return 2611 | |
end 2612 | |
subroutine coxnet (parm,no,ni,x,y,d,g,w,jd,vp,cl,ne,nx,nlam,flmin, 2614 | |
*ulam,thr, maxit,isd,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 2615 | |
double precision x(no,ni),y(no),d(no),g(no),w(no),vp(ni),ulam(nlam 2616 | |
*) | |
double precision ca(nx,nlam),dev(nlam),alm(nlam),cl(2,ni) 2617 | |
integer jd(*),ia(nx),nin(nlam) 2618 | |
double precision, dimension (:), allocatable :: xs,ww,vq | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 16701 2622 | |
jerr=10000 2622 | |
return 2622 | |
16701 continue 2623 | |
allocate(ww(1:no),stat=jerr) 2624 | |
if(jerr.ne.0) return 2625 | |
allocate(ju(1:ni),stat=jerr) 2626 | |
if(jerr.ne.0) return 2627 | |
allocate(vq(1:ni),stat=jerr) 2628 | |
if(jerr.ne.0) return 2629 | |
if(isd .le. 0)goto 16721 2629 | |
allocate(xs(1:ni),stat=jerr) 2629 | |
if(jerr.ne.0) return 2629 | |
16721 continue 2631 | |
call chkvars(no,ni,x,ju) 2632 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 2633 | |
if(maxval(ju) .gt. 0)goto 16741 2633 | |
jerr=7777 2633 | |
return 2633 | |
16741 continue 2634 | |
vq=max(0d0,vp) 2634 | |
vq=vq*ni/sum(vq) 2635 | |
ww=max(0d0,w) 2635 | |
sw=sum(ww) 2636 | |
if(sw .gt. 0.0)goto 16761 2636 | |
jerr=9999 2636 | |
return 2636 | |
16761 continue 2636 | |
ww=ww/sw 2637 | |
call cstandard(no,ni,x,ww,ju,isd,xs) 2638 | |
if(isd .le. 0)goto 16781 2638 | |
16790 do 16791 j=1,ni 2638 | |
cl(:,j)=cl(:,j)*xs(j) 2638 | |
16791 continue 2638 | |
16792 continue 2638 | |
16781 continue 2639 | |
call coxnet1(parm,no,ni,x,y,d,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam, 2641 | |
*thr, isd,maxit,lmu,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
if(jerr.gt.0) return 2641 | |
dev0=2.0*sw*dev0 2642 | |
if(isd .le. 0)goto 16811 2642 | |
16820 do 16821 k=1,lmu 2642 | |
nk=nin(k) 2642 | |
ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) 2642 | |
16821 continue 2642 | |
16822 continue 2642 | |
16811 continue 2643 | |
deallocate(ww,ju,vq) 2643 | |
if(isd.gt.0) deallocate(xs) 2644 | |
return 2645 | |
end 2646 | |
subroutine cstandard (no,ni,x,w,ju,isd,xs) 2647 | |
implicit double precision(a-h,o-z) 2648 | |
double precision x(no,ni),w(no),xs(ni) 2648 | |
integer ju(ni) 2649 | |
16830 do 16831 j=1,ni 2649 | |
if(ju(j).eq.0)goto 16831 2650 | |
xm=dot_product(w,x(:,j)) 2650 | |
x(:,j)=x(:,j)-xm 2651 | |
if(isd .le. 0)goto 16851 2651 | |
xs(j)=sqrt(dot_product(w,x(:,j)**2)) 2651 | |
x(:,j)=x(:,j)/xs(j) 2651 | |
16851 continue 2652 | |
16831 continue 2653 | |
16832 continue 2653 | |
return 2654 | |
end 2655 | |
subroutine coxnet1(parm,no,ni,x,y,d,g,q,ju,vp,cl,ne,nx,nlam,flmin, 2657 | |
*ulam,cthri, isd,maxit,lmu,ao,m,kin,dev0,dev,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 2658 | |
double precision x(no,ni),y(no),q(no),d(no),g(no),vp(ni),ulam(nlam 2659 | |
*) | |
double precision ao(nx,nlam),dev(nlam),alm(nlam),cl(2,ni) 2660 | |
integer ju(ni),m(nx),kin(nlam) 2661 | |
double precision, dimension (:), allocatable :: w,dk,v,xs,wr | |
double precision, dimension (:), allocatable :: a,as,f,dq | |
double precision, dimension (:), allocatable :: e,uu,ga | |
integer, dimension (:), allocatable :: jp,kp,mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2668 | |
sml=sml*100.0 2668 | |
devmax=devmax*0.99/0.999 2669 | |
allocate(e(1:no),stat=jerr) 2670 | |
if(jerr.ne.0)go to 12180 2671 | |
allocate(uu(1:no),stat=jerr) 2672 | |
if(jerr.ne.0)go to 12180 2673 | |
allocate(f(1:no),stat=jerr) 2674 | |
if(jerr.ne.0)go to 12180 2675 | |
allocate(w(1:no),stat=jerr) 2676 | |
if(jerr.ne.0)go to 12180 2677 | |
allocate(v(1:ni),stat=jerr) 2678 | |
if(jerr.ne.0)go to 12180 2679 | |
allocate(a(1:ni),stat=jerr) 2680 | |
if(jerr.ne.0)go to 12180 2681 | |
allocate(as(1:ni),stat=jerr) 2682 | |
if(jerr.ne.0)go to 12180 2683 | |
allocate(xs(1:ni),stat=jerr) 2684 | |
if(jerr.ne.0)go to 12180 2685 | |
allocate(ga(1:ni),stat=jerr) 2686 | |
if(jerr.ne.0)go to 12180 2687 | |
allocate(ixx(1:ni),stat=jerr) 2688 | |
if(jerr.ne.0)go to 12180 2689 | |
allocate(jp(1:no),stat=jerr) 2690 | |
if(jerr.ne.0)go to 12180 2691 | |
allocate(kp(1:no),stat=jerr) 2692 | |
if(jerr.ne.0)go to 12180 2693 | |
allocate(dk(1:no),stat=jerr) 2694 | |
if(jerr.ne.0)go to 12180 2695 | |
allocate(wr(1:no),stat=jerr) 2696 | |
if(jerr.ne.0)go to 12180 2697 | |
allocate(dq(1:no),stat=jerr) 2698 | |
if(jerr.ne.0)go to 12180 2699 | |
allocate(mm(1:ni),stat=jerr) 2700 | |
if(jerr.ne.0)go to 12180 2701 | |
call groups(no,y,d,q,nk,kp,jp,t0,jerr) 2702 | |
if(jerr.ne.0) go to 12180 2702 | |
alpha=parm 2703 | |
oma=1.0-alpha 2703 | |
nlm=0 2703 | |
ixx=0 2703 | |
al=0.0 2704 | |
dq=d*q 2704 | |
call died(no,nk,dq,kp,jp,dk) 2705 | |
a=0.0 2705 | |
f(1)=0.0 2705 | |
fmax=log(huge(f(1))*0.1) 2706 | |
if(nonzero(no,g) .eq. 0)goto 16871 2706 | |
f=g-dot_product(q,g) 2707 | |
e=q*exp(sign(min(abs(f),fmax),f)) 2708 | |
goto 16881 2709 | |
16871 continue 2709 | |
f=0.0 2709 | |
e=q 2709 | |
16881 continue 2710 | |
16861 continue 2710 | |
r0=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu) 2711 | |
rr=-(dot_product(dk(1:nk),log(dk(1:nk)))+r0) 2711 | |
dev0=rr 2712 | |
16890 do 16891 i=1,no 2712 | |
if((y(i) .ge. t0) .and. (q(i) .gt. 0.0))goto 16911 2712 | |
w(i)=0.0 2712 | |
wr(i)=w(i) 2712 | |
16911 continue 2712 | |
16891 continue 2713 | |
16892 continue 2713 | |
call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu) 2714 | |
if(jerr.ne.0) go to 12180 2716 | |
alf=1.0 2718 | |
if(flmin .ge. 1.0)goto 16931 2718 | |
eqs=max(eps,flmin) 2718 | |
alf=eqs**(1.0/(nlam-1)) 2718 | |
16931 continue 2719 | |
m=0 2719 | |
mm=0 2719 | |
nlp=0 2719 | |
nin=nlp 2719 | |
mnl=min(mnlam,nlam) 2719 | |
as=0.0 2719 | |
cthr=cthri*dev0 2720 | |
16940 do 16941 j=1,ni 2720 | |
if(ju(j).eq.0)goto 16941 2720 | |
ga(j)=abs(dot_product(wr,x(:,j))) 2720 | |
16941 continue 2721 | |
16942 continue 2721 | |
16950 do 16951 ilm=1,nlam 2721 | |
al0=al 2722 | |
if(flmin .lt. 1.0)goto 16971 2722 | |
al=ulam(ilm) 2722 | |
goto 16961 2723 | |
16971 if(ilm .le. 2)goto 16981 2723 | |
al=al*alf 2723 | |
goto 16961 2724 | |
16981 if(ilm .ne. 1)goto 16991 2724 | |
al=big 2724 | |
goto 17001 2725 | |
16991 continue 2725 | |
al0=0.0 2726 | |
17010 do 17011 j=1,ni 2726 | |
if(ju(j).eq.0)goto 17011 2726 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 2726 | |
17011 continue 2727 | |
17012 continue 2727 | |
al0=al0/max(parm,1.0d-3) 2727 | |
al=alf*al0 2728 | |
17001 continue 2729 | |
16961 continue 2729 | |
sa=alpha*al 2729 | |
omal=oma*al 2729 | |
tlam=alpha*(2.0*al-al0) 2730 | |
17020 do 17021 k=1,ni 2730 | |
if(ixx(k).eq.1)goto 17021 2730 | |
if(ju(k).eq.0)goto 17021 2731 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 2732 | |
17021 continue 2733 | |
17022 continue 2733 | |
10880 continue 2734 | |
17030 continue 2734 | |
17031 continue 2734 | |
if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) 2735 | |
call vars(no,ni,x,w,ixx,v) 2736 | |
17040 continue 2736 | |
17041 continue 2736 | |
nlp=nlp+1 2736 | |
dli=0.0 2737 | |
17050 do 17051 j=1,ni 2737 | |
if(ixx(j).eq.0)goto 17051 2738 | |
u=a(j)*v(j)+dot_product(wr,x(:,j)) 2739 | |
if(abs(u) .gt. vp(j)*sa)goto 17071 2739 | |
at=0.0 2739 | |
goto 17081 2740 | |
17071 continue 2740 | |
at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*o 2742 | |
*mal))) | |
17081 continue 2743 | |
17061 continue 2743 | |
if(at .eq. a(j))goto 17101 2743 | |
del=at-a(j) 2743 | |
a(j)=at 2743 | |
dli=max(dli,v(j)*del**2) 2744 | |
wr=wr-del*w*x(:,j) 2744 | |
f=f+del*x(:,j) 2745 | |
if(mm(j) .ne. 0)goto 17121 2745 | |
nin=nin+1 2745 | |
if(nin.gt.nx)goto 17052 2746 | |
mm(j)=nin 2746 | |
m(nin)=j 2747 | |
17121 continue 2748 | |
17101 continue 2749 | |
17051 continue 2750 | |
17052 continue 2750 | |
if(nin.gt.nx)goto 17042 2750 | |
if(dli.lt.cthr)goto 17042 2751 | |
if(nlp .le. maxit)goto 17141 2751 | |
jerr=-ilm 2751 | |
return 2751 | |
17141 continue 2752 | |
17150 continue 2752 | |
17151 continue 2752 | |
nlp=nlp+1 2752 | |
dli=0.0 2753 | |
17160 do 17161 l=1,nin 2753 | |
j=m(l) 2754 | |
u=a(j)*v(j)+dot_product(wr,x(:,j)) 2755 | |
if(abs(u) .gt. vp(j)*sa)goto 17181 2755 | |
at=0.0 2755 | |
goto 17191 2756 | |
17181 continue 2756 | |
at=max(cl(1,j),min(cl(2,j),sign(abs(u)-vp(j)*sa,u)/ (v(j)+vp(j)*o 2758 | |
*mal))) | |
17191 continue 2759 | |
17171 continue 2759 | |
if(at .eq. a(j))goto 17211 2759 | |
del=at-a(j) 2759 | |
a(j)=at 2759 | |
dli=max(dli,v(j)*del**2) 2760 | |
wr=wr-del*w*x(:,j) 2760 | |
f=f+del*x(:,j) 2761 | |
17211 continue 2762 | |
17161 continue 2763 | |
17162 continue 2763 | |
if(dli.lt.cthr)goto 17152 2763 | |
if(nlp .le. maxit)goto 17231 2763 | |
jerr=-ilm 2763 | |
return 2763 | |
17231 continue 2764 | |
goto 17151 2765 | |
17152 continue 2765 | |
goto 17041 2766 | |
17042 continue 2766 | |
if(nin.gt.nx)goto 17032 2767 | |
e=q*exp(sign(min(abs(f),fmax),f)) 2768 | |
call outer(no,nk,dq,dk,kp,jp,e,wr,w,jerr,uu) 2769 | |
if(jerr .eq. 0)goto 17251 2769 | |
jerr=jerr-ilm 2769 | |
go to 12180 2769 | |
17251 continue 2770 | |
ix=0 2771 | |
17260 do 17261 j=1,nin 2771 | |
k=m(j) 2772 | |
if(v(k)*(a(k)-as(k))**2.lt.cthr)goto 17261 2772 | |
ix=1 2772 | |
goto 17262 2772 | |
17261 continue 2773 | |
17262 continue 2773 | |
if(ix .ne. 0)goto 17281 2774 | |
17290 do 17291 k=1,ni 2774 | |
if(ixx(k).eq.1)goto 17291 2774 | |
if(ju(k).eq.0)goto 17291 2775 | |
ga(k)=abs(dot_product(wr,x(:,k))) 2776 | |
if(ga(k) .le. sa*vp(k))goto 17311 2776 | |
ixx(k)=1 2776 | |
ix=1 2776 | |
17311 continue 2777 | |
17291 continue 2778 | |
17292 continue 2778 | |
if(ix.eq.1) go to 10880 2779 | |
goto 17032 2780 | |
17281 continue 2781 | |
goto 17031 2782 | |
17032 continue 2782 | |
if(nin .le. nx)goto 17331 2782 | |
jerr=-10000-ilm 2782 | |
goto 16952 2782 | |
17331 continue 2783 | |
if(nin.gt.0) ao(1:nin,ilm)=a(m(1:nin)) 2783 | |
kin(ilm)=nin 2784 | |
alm(ilm)=al 2784 | |
lmu=ilm 2785 | |
dev(ilm)=(risk(no,ni,nk,dq,dk,f,e,kp,jp,uu)-r0)/rr 2786 | |
if(ilm.lt.mnl)goto 16951 2786 | |
if(flmin.ge.1.0)goto 16951 2787 | |
me=0 2787 | |
17340 do 17341 j=1,nin 2787 | |
if(ao(j,ilm).ne.0.0) me=me+1 2787 | |
17341 continue 2787 | |
17342 continue 2787 | |
if(me.gt.ne)goto 16952 2788 | |
if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 16952 2789 | |
if(dev(ilm).gt.devmax)goto 16952 2790 | |
16951 continue 2791 | |
16952 continue 2791 | |
g=f 2792 | |
12180 continue 2792 | |
deallocate(e,uu,w,dk,v,xs,f,wr,a,as,jp,kp,dq,mm,ga,ixx) 2793 | |
return 2794 | |
end 2795 | |
subroutine cxmodval(ca,ia,nin,n,x,f) 2796 | |
implicit double precision(a-h,o-z) 2797 | |
double precision ca(nin),x(n,*),f(n) 2797 | |
integer ia(nin) 2798 | |
f=0.0 2798 | |
if(nin.le.0) return 2799 | |
17350 do 17351 i=1,n 2799 | |
f(i)=f(i)+dot_product(ca(1:nin),x(i,ia(1:nin))) 2799 | |
17351 continue 2800 | |
17352 continue 2800 | |
return 2801 | |
end 2802 | |
subroutine groups(no,y,d,q,nk,kp,jp,t0,jerr) 2803 | |
implicit double precision(a-h,o-z) 2804 | |
double precision y(no),d(no),q(no) 2804 | |
integer jp(no),kp(*) 2805 | |
17360 do 17361 j=1,no 2805 | |
jp(j)=j 2805 | |
17361 continue 2805 | |
17362 continue 2805 | |
call psort7(y,jp,1,no) 2806 | |
nj=0 2806 | |
17370 do 17371 j=1,no 2806 | |
if(q(jp(j)).le.0.0)goto 17371 2806 | |
nj=nj+1 2806 | |
jp(nj)=jp(j) 2806 | |
17371 continue 2807 | |
17372 continue 2807 | |
if(nj .ne. 0)goto 17391 2807 | |
jerr=20000 2807 | |
return 2807 | |
17391 continue 2808 | |
j=1 2808 | |
17400 continue 2808 | |
17401 if(d(jp(j)).gt.0.0)goto 17402 2808 | |
j=j+1 2808 | |
if(j.gt.nj)goto 17402 2808 | |
goto 17401 2809 | |
17402 continue 2809 | |
if(j .lt. nj-1)goto 17421 2809 | |
jerr=30000 2809 | |
return 2809 | |
17421 continue 2810 | |
t0=y(jp(j)) 2810 | |
j0=j-1 2811 | |
if(j0 .le. 0)goto 17441 2812 | |
17450 continue 2812 | |
17451 if(y(jp(j0)).lt.t0)goto 17452 2812 | |
j0=j0-1 2812 | |
if(j0.eq.0)goto 17452 2812 | |
goto 17451 2813 | |
17452 continue 2813 | |
if(j0 .le. 0)goto 17471 2813 | |
nj=nj-j0 2813 | |
17480 do 17481 j=1,nj 2813 | |
jp(j)=jp(j+j0) 2813 | |
17481 continue 2813 | |
17482 continue 2813 | |
17471 continue 2814 | |
17441 continue 2815 | |
jerr=0 2815 | |
nk=0 2815 | |
yk=t0 2815 | |
j=2 2816 | |
17490 continue 2816 | |
17491 continue 2816 | |
17500 continue 2817 | |
17501 if(d(jp(j)).gt.0.0.and.y(jp(j)).gt.yk)goto 17502 2817 | |
j=j+1 2817 | |
if(j.gt.nj)goto 17502 2817 | |
goto 17501 2818 | |
17502 continue 2818 | |
nk=nk+1 2818 | |
kp(nk)=j-1 2818 | |
if(j.gt.nj)goto 17492 2819 | |
if(j .ne. nj)goto 17521 2819 | |
nk=nk+1 2819 | |
kp(nk)=nj 2819 | |
goto 17492 2819 | |
17521 continue 2820 | |
yk=y(jp(j)) 2820 | |
j=j+1 2821 | |
goto 17491 2822 | |
17492 continue 2822 | |
return 2823 | |
end 2824 | |
subroutine outer(no,nk,d,dk,kp,jp,e,wr,w,jerr,u) 2825 | |
implicit double precision(a-h,o-z) 2826 | |
double precision d(no),dk(nk),wr(no),w(no) 2827 | |
double precision e(no),u(no),b,c 2827 | |
integer kp(nk),jp(no) 2828 | |
call usk(no,nk,kp,jp,e,u) 2829 | |
b=dk(1)/u(1) 2829 | |
c=dk(1)/u(1)**2 2829 | |
jerr=0 2830 | |
17530 do 17531 j=1,kp(1) 2830 | |
i=jp(j) 2831 | |
w(i)=e(i)*(b-e(i)*c) 2831 | |
if(w(i) .gt. 0.0)goto 17551 2831 | |
jerr=-30000 2831 | |
return 2831 | |
17551 continue 2832 | |
wr(i)=d(i)-e(i)*b 2833 | |
17531 continue 2834 | |
17532 continue 2834 | |
17560 do 17561 k=2,nk 2834 | |
j1=kp(k-1)+1 2834 | |
j2=kp(k) 2835 | |
b=b+dk(k)/u(k) 2835 | |
c=c+dk(k)/u(k)**2 2836 | |
17570 do 17571 j=j1,j2 2836 | |
i=jp(j) 2837 | |
w(i)=e(i)*(b-e(i)*c) 2837 | |
if(w(i) .gt. 0.0)goto 17591 2837 | |
jerr=-30000 2837 | |
return 2837 | |
17591 continue 2838 | |
wr(i)=d(i)-e(i)*b 2839 | |
17571 continue 2840 | |
17572 continue 2840 | |
17561 continue 2841 | |
17562 continue 2841 | |
return 2842 | |
end 2843 | |
subroutine vars(no,ni,x,w,ixx,v) 2844 | |
implicit double precision(a-h,o-z) 2845 | |
double precision x(no,ni),w(no),v(ni) 2845 | |
integer ixx(ni) 2846 | |
17600 do 17601 j=1,ni 2846 | |
if(ixx(j).gt.0) v(j)=dot_product(w,x(:,j)**2) 2846 | |
17601 continue 2847 | |
17602 continue 2847 | |
return 2848 | |
end 2849 | |
subroutine died(no,nk,d,kp,jp,dk) 2850 | |
implicit double precision(a-h,o-z) 2851 | |
double precision d(no),dk(nk) 2851 | |
integer kp(nk),jp(no) 2852 | |
dk(1)=sum(d(jp(1:kp(1)))) 2853 | |
17610 do 17611 k=2,nk 2853 | |
dk(k)=sum(d(jp((kp(k-1)+1):kp(k)))) 2853 | |
17611 continue 2854 | |
17612 continue 2854 | |
return 2855 | |
end 2856 | |
subroutine usk(no,nk,kp,jp,e,u) 2857 | |
implicit double precision(a-h,o-z) 2858 | |
double precision e(no),u(nk),h 2858 | |
integer kp(nk),jp(no) 2859 | |
h=0.0 2860 | |
17620 do 17621 k=nk,1,-1 2860 | |
j2=kp(k) 2861 | |
j1=1 2861 | |
if(k.gt.1) j1=kp(k-1)+1 2862 | |
17630 do 17631 j=j2,j1,-1 2862 | |
h=h+e(jp(j)) 2862 | |
17631 continue 2863 | |
17632 continue 2863 | |
u(k)=h 2864 | |
17621 continue 2865 | |
17622 continue 2865 | |
return 2866 | |
end 2867 | |
function risk(no,ni,nk,d,dk,f,e,kp,jp,u) 2868 | |
implicit double precision(a-h,o-z) 2869 | |
double precision d(no),dk(nk),f(no) 2870 | |
integer kp(nk),jp(no) 2870 | |
double precision e(no),u(nk),s 2871 | |
call usk(no,nk,kp,jp,e,u) 2871 | |
u=log(u) 2872 | |
risk=dot_product(d,f)-dot_product(dk,u) 2873 | |
return 2874 | |
end 2875 | |
subroutine loglike(no,ni,x,y,d,g,w,nlam,a,flog,jerr) 2876 | |
implicit double precision(a-h,o-z) 2877 | |
double precision x(no,ni),y(no),d(no),g(no),w(no),a(ni,nlam),flog( 2878 | |
*nlam) | |
double precision, dimension (:), allocatable :: dk,f,xm,dq,q | |
double precision, dimension (:), allocatable :: e,uu | |
integer, dimension (:), allocatable :: jp,kp | |
allocate(e(1:no),stat=jerr) 2884 | |
if(jerr.ne.0) go to 12180 2885 | |
allocate(q(1:no),stat=jerr) 2886 | |
if(jerr.ne.0) go to 12180 2887 | |
allocate(uu(1:no),stat=jerr) 2888 | |
if(jerr.ne.0) go to 12180 2889 | |
allocate(f(1:no),stat=jerr) 2890 | |
if(jerr.ne.0) go to 12180 2891 | |
allocate(dk(1:no),stat=jerr) 2892 | |
if(jerr.ne.0) go to 12180 2893 | |
allocate(jp(1:no),stat=jerr) 2894 | |
if(jerr.ne.0) go to 12180 2895 | |
allocate(kp(1:no),stat=jerr) 2896 | |
if(jerr.ne.0) go to 12180 2897 | |
allocate(dq(1:no),stat=jerr) 2898 | |
if(jerr.ne.0) go to 12180 2899 | |
allocate(xm(1:ni),stat=jerr) 2900 | |
if(jerr.ne.0) go to 12180 2901 | |
q=max(0d0,w) 2901 | |
sw=sum(q) 2902 | |
if(sw .gt. 0.0)goto 17651 2902 | |
jerr=9999 2902 | |
go to 12180 2902 | |
17651 continue 2903 | |
call groups(no,y,d,q,nk,kp,jp,t0,jerr) 2904 | |
if(jerr.ne.0) go to 12180 2904 | |
fmax=log(huge(e(1))*0.1) 2905 | |
dq=d*q 2905 | |
call died(no,nk,dq,kp,jp,dk) 2905 | |
gm=dot_product(q,g)/sw 2906 | |
17660 do 17661 j=1,ni 2906 | |
xm(j)=dot_product(q,x(:,j))/sw 2906 | |
17661 continue 2907 | |
17662 continue 2907 | |
17670 do 17671 lam=1,nlam 2908 | |
17680 do 17681 i=1,no 2908 | |
f(i)=g(i)-gm+dot_product(a(:,lam),(x(i,:)-xm)) 2909 | |
e(i)=q(i)*exp(sign(min(abs(f(i)),fmax),f(i))) 2910 | |
17681 continue 2911 | |
17682 continue 2911 | |
flog(lam)=risk(no,ni,nk,dq,dk,f,e,kp,jp,uu) 2912 | |
17671 continue 2913 | |
17672 continue 2913 | |
12180 continue 2913 | |
deallocate(e,uu,dk,f,jp,kp,dq) 2914 | |
return 2915 | |
end 2916 | |
subroutine fishnet (parm,no,ni,x,y,g,w,jd,vp,cl,ne,nx,nlam,flmin,u 2918 | |
*lam,thr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 2919 | |
double precision x(no,ni),y(no),g(no),w(no),vp(ni),ulam(nlam) 2920 | |
double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) 2921 | |
integer jd(*),ia(nx),nin(nlam) 2922 | |
double precision, dimension (:), allocatable :: xm,xs,ww,vq | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 17701 2926 | |
jerr=10000 2926 | |
return 2926 | |
17701 continue 2927 | |
if(minval(y) .ge. 0.0)goto 17721 2927 | |
jerr=8888 2927 | |
return 2927 | |
17721 continue 2928 | |
allocate(ww(1:no),stat=jerr) 2929 | |
if(jerr.ne.0) return 2930 | |
allocate(ju(1:ni),stat=jerr) 2931 | |
if(jerr.ne.0) return 2932 | |
allocate(vq(1:ni),stat=jerr) 2933 | |
if(jerr.ne.0) return 2934 | |
allocate(xm(1:ni),stat=jerr) 2935 | |
if(jerr.ne.0) return 2936 | |
if(isd .le. 0)goto 17741 2936 | |
allocate(xs(1:ni),stat=jerr) 2936 | |
if(jerr.ne.0) return 2936 | |
17741 continue 2937 | |
call chkvars(no,ni,x,ju) 2938 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 2939 | |
if(maxval(ju) .gt. 0)goto 17761 2939 | |
jerr=7777 2939 | |
go to 12180 2939 | |
17761 continue 2940 | |
vq=max(0d0,vp) 2940 | |
vq=vq*ni/sum(vq) 2941 | |
ww=max(0d0,w) 2941 | |
sw=sum(ww) 2941 | |
if(sw .gt. 0.0)goto 17781 2941 | |
jerr=9999 2941 | |
go to 12180 2941 | |
17781 continue 2942 | |
ww=ww/sw 2943 | |
call lstandard1(no,ni,x,ww,ju,isd,intr,xm,xs) 2944 | |
if(isd .le. 0)goto 17801 2944 | |
17810 do 17811 j=1,ni 2944 | |
cl(:,j)=cl(:,j)*xs(j) 2944 | |
17811 continue 2944 | |
17812 continue 2944 | |
17801 continue 2945 | |
call fishnet1(parm,no,ni,x,y,g,ww,ju,vq,cl,ne,nx,nlam,flmin,ulam,t 2947 | |
*hr, isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp,jerr) | |
if(jerr.gt.0) go to 12180 2947 | |
dev0=2.0*sw*dev0 2948 | |
17820 do 17821 k=1,lmu 2948 | |
nk=nin(k) 2949 | |
if(isd.gt.0) ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) 2950 | |
if(intr .ne. 0)goto 17841 2950 | |
a0(k)=0.0 2950 | |
goto 17851 2951 | |
17841 continue 2951 | |
a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk))) 2951 | |
17851 continue 2952 | |
17831 continue 2952 | |
17821 continue 2953 | |
17822 continue 2953 | |
12180 continue 2953 | |
deallocate(ww,ju,vq,xm) 2953 | |
if(isd.gt.0) deallocate(xs) 2954 | |
return 2955 | |
end 2956 | |
subroutine fishnet1(parm,no,ni,x,y,g,q,ju,vp,cl,ne,nx,nlam,flmin,u 2958 | |
*lam,shri, isd,intr,maxit,lmu,a0,ca,m,kin,dev0,dev,alm,nlp,jerr) | |
implicit double precision(a-h,o-z) 2959 | |
double precision x(no,ni),y(no),g(no),q(no),vp(ni),ulam(nlam) 2960 | |
double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) 2961 | |
integer ju(ni),m(nx),kin(nlam) 2962 | |
double precision, dimension (:), allocatable :: t,w,wr,v,a,f,as,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 2966 | |
sml=sml*10.0 2967 | |
allocate(a(1:ni),stat=jerr) 2968 | |
if(jerr.ne.0) return 2969 | |
allocate(as(1:ni),stat=jerr) 2970 | |
if(jerr.ne.0) return 2971 | |
allocate(t(1:no),stat=jerr) 2972 | |
if(jerr.ne.0) return 2973 | |
allocate(mm(1:ni),stat=jerr) 2974 | |
if(jerr.ne.0) return 2975 | |
allocate(ga(1:ni),stat=jerr) 2976 | |
if(jerr.ne.0) return 2977 | |
allocate(ixx(1:ni),stat=jerr) 2978 | |
if(jerr.ne.0) return 2979 | |
allocate(wr(1:no),stat=jerr) 2980 | |
if(jerr.ne.0) return 2981 | |
allocate(v(1:ni),stat=jerr) 2982 | |
if(jerr.ne.0) return 2983 | |
allocate(w(1:no),stat=jerr) 2984 | |
if(jerr.ne.0) return 2985 | |
allocate(f(1:no),stat=jerr) 2986 | |
if(jerr.ne.0) return 2987 | |
bta=parm 2987 | |
omb=1.0-bta 2988 | |
t=q*y 2988 | |
yb=sum(t) 2988 | |
fmax=log(huge(bta)*0.1) 2989 | |
if(nonzero(no,g) .ne. 0)goto 17871 2990 | |
if(intr .eq. 0)goto 17891 2990 | |
w=q*yb 2990 | |
az=log(yb) 2990 | |
f=az 2990 | |
dv0=yb*(az-1.0) 2990 | |
goto 17901 2991 | |
17891 continue 2991 | |
w=q 2991 | |
az=0.0 2991 | |
f=az 2991 | |
dv0=-1.0 2991 | |
17901 continue 2992 | |
17881 continue 2992 | |
goto 17911 2993 | |
17871 continue 2993 | |
w=q*exp(sign(min(abs(g),fmax),g)) 2993 | |
v0=sum(w) 2994 | |
if(intr .eq. 0)goto 17931 2994 | |
eaz=yb/v0 2994 | |
w=eaz*w 2994 | |
az=log(eaz) 2994 | |
f=az+g 2995 | |
dv0=dot_product(t,g)-yb*(1.0-az) 2996 | |
goto 17941 2997 | |
17931 continue 2997 | |
az=0.0 2997 | |
f=g 2997 | |
dv0=dot_product(t,g)-v0 2997 | |
17941 continue 2998 | |
17921 continue 2998 | |
17911 continue 2999 | |
17861 continue 2999 | |
a=0.0 2999 | |
as=0.0 2999 | |
wr=t-w 2999 | |
v0=1.0 2999 | |
if(intr.ne.0) v0=yb 2999 | |
dvr=-yb 3000 | |
17950 do 17951 i=1,no 3000 | |
if(t(i).gt.0.0) dvr=dvr+t(i)*log(y(i)) 3000 | |
17951 continue 3000 | |
17952 continue 3000 | |
dvr=dvr-dv0 3000 | |
dev0=dvr 3002 | |
alf=1.0 3004 | |
if(flmin .ge. 1.0)goto 17971 3004 | |
eqs=max(eps,flmin) 3004 | |
alf=eqs**(1.0/(nlam-1)) 3004 | |
17971 continue 3005 | |
m=0 3005 | |
mm=0 3005 | |
nlp=0 3005 | |
nin=nlp 3005 | |
mnl=min(mnlam,nlam) 3005 | |
shr=shri*dev0 3005 | |
ixx=0 3005 | |
al=0.0 3006 | |
17980 do 17981 j=1,ni 3006 | |
if(ju(j).eq.0)goto 17981 3006 | |
ga(j)=abs(dot_product(wr,x(:,j))) 3006 | |
17981 continue 3007 | |
17982 continue 3007 | |
17990 do 17991 ilm=1,nlam 3007 | |
al0=al 3008 | |
if(flmin .lt. 1.0)goto 18011 3008 | |
al=ulam(ilm) 3008 | |
goto 18001 3009 | |
18011 if(ilm .le. 2)goto 18021 3009 | |
al=al*alf 3009 | |
goto 18001 3010 | |
18021 if(ilm .ne. 1)goto 18031 3010 | |
al=big 3010 | |
goto 18041 3011 | |
18031 continue 3011 | |
al0=0.0 3012 | |
18050 do 18051 j=1,ni 3012 | |
if(ju(j).eq.0)goto 18051 3012 | |
if(vp(j).gt.0.0) al0=max(al0,ga(j)/vp(j)) 3012 | |
18051 continue 3013 | |
18052 continue 3013 | |
al0=al0/max(bta,1.0d-3) 3013 | |
al=alf*al0 3014 | |
18041 continue 3015 | |
18001 continue 3015 | |
al2=al*omb 3015 | |
al1=al*bta 3015 | |
tlam=bta*(2.0*al-al0) 3016 | |
18060 do 18061 k=1,ni 3016 | |
if(ixx(k).eq.1)goto 18061 3016 | |
if(ju(k).eq.0)goto 18061 3017 | |
if(ga(k).gt.tlam*vp(k)) ixx(k)=1 3018 | |
18061 continue 3019 | |
18062 continue 3019 | |
10880 continue 3020 | |
18070 continue 3020 | |
18071 continue 3020 | |
az0=az 3021 | |
if(nin.gt.0) as(m(1:nin))=a(m(1:nin)) 3022 | |
18080 do 18081 j=1,ni 3022 | |
if(ixx(j).ne.0) v(j)=dot_product(w,x(:,j)**2) 3022 | |
18081 continue 3023 | |
18082 continue 3023 | |
18090 continue 3023 | |
18091 continue 3023 | |
nlp=nlp+1 3023 | |
dlx=0.0 3024 | |
18100 do 18101 k=1,ni 3024 | |
if(ixx(k).eq.0)goto 18101 3024 | |
ak=a(k) 3025 | |
u=dot_product(wr,x(:,k))+v(k)*ak 3025 | |
au=abs(u)-vp(k)*al1 3026 | |
if(au .gt. 0.0)goto 18121 3026 | |
a(k)=0.0 3026 | |
goto 18131 3027 | |
18121 continue 3028 | |
a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 3029 | |
18131 continue 3030 | |
18111 continue 3030 | |
if(a(k).eq.ak)goto 18101 3030 | |
d=a(k)-ak 3030 | |
dlx=max(dlx,v(k)*d**2) 3031 | |
wr=wr-d*w*x(:,k) 3031 | |
f=f+d*x(:,k) 3032 | |
if(mm(k) .ne. 0)goto 18151 3032 | |
nin=nin+1 3032 | |
if(nin.gt.nx)goto 18102 3033 | |
mm(k)=nin 3033 | |
m(nin)=k 3034 | |
18151 continue 3035 | |
18101 continue 3036 | |
18102 continue 3036 | |
if(nin.gt.nx)goto 18092 3037 | |
if(intr .eq. 0)goto 18171 3037 | |
d=sum(wr)/v0 3038 | |
az=az+d 3038 | |
dlx=max(dlx,v0*d**2) 3038 | |
wr=wr-d*w 3038 | |
f=f+d 3039 | |
18171 continue 3040 | |
if(dlx.lt.shr)goto 18092 3040 | |
if(nlp .le. maxit)goto 18191 3040 | |
jerr=-ilm 3040 | |
return 3040 | |
18191 continue 3041 | |
18200 continue 3041 | |
18201 continue 3041 | |
nlp=nlp+1 3041 | |
dlx=0.0 3042 | |
18210 do 18211 l=1,nin 3042 | |
k=m(l) 3042 | |
ak=a(k) 3043 | |
u=dot_product(wr,x(:,k))+v(k)*ak 3043 | |
au=abs(u)-vp(k)*al1 3044 | |
if(au .gt. 0.0)goto 18231 3044 | |
a(k)=0.0 3044 | |
goto 18241 3045 | |
18231 continue 3046 | |
a(k)=max(cl(1,k),min(cl(2,k),sign(au,u)/(v(k)+vp(k)*al2))) 3047 | |
18241 continue 3048 | |
18221 continue 3048 | |
if(a(k).eq.ak)goto 18211 3048 | |
d=a(k)-ak 3048 | |
dlx=max(dlx,v(k)*d**2) 3049 | |
wr=wr-d*w*x(:,k) 3049 | |
f=f+d*x(:,k) 3051 | |
18211 continue 3051 | |
18212 continue 3051 | |
if(intr .eq. 0)goto 18261 3051 | |
d=sum(wr)/v0 3051 | |
az=az+d 3052 | |
dlx=max(dlx,v0*d**2) 3052 | |
wr=wr-d*w 3052 | |
f=f+d 3053 | |
18261 continue 3054 | |
if(dlx.lt.shr)goto 18202 3054 | |
if(nlp .le. maxit)goto 18281 3054 | |
jerr=-ilm 3054 | |
return 3054 | |
18281 continue 3055 | |
goto 18201 3056 | |
18202 continue 3056 | |
goto 18091 3057 | |
18092 continue 3057 | |
if(nin.gt.nx)goto 18072 3058 | |
w=q*exp(sign(min(abs(f),fmax),f)) 3058 | |
v0=sum(w) 3058 | |
wr=t-w 3059 | |
if(v0*(az-az0)**2 .ge. shr)goto 18301 3059 | |
ix=0 3060 | |
18310 do 18311 j=1,nin 3060 | |
k=m(j) 3061 | |
if(v(k)*(a(k)-as(k))**2.lt.shr)goto 18311 3061 | |
ix=1 3061 | |
goto 18312 3062 | |
18311 continue 3063 | |
18312 continue 3063 | |
if(ix .ne. 0)goto 18331 3064 | |
18340 do 18341 k=1,ni 3064 | |
if(ixx(k).eq.1)goto 18341 3064 | |
if(ju(k).eq.0)goto 18341 3065 | |
ga(k)=abs(dot_product(wr,x(:,k))) 3066 | |
if(ga(k) .le. al1*vp(k))goto 18361 3066 | |
ixx(k)=1 3066 | |
ix=1 3066 | |
18361 continue 3067 | |
18341 continue 3068 | |
18342 continue 3068 | |
if(ix.eq.1) go to 10880 3069 | |
goto 18072 3070 | |
18331 continue 3071 | |
18301 continue 3072 | |
goto 18071 3073 | |
18072 continue 3073 | |
if(nin .le. nx)goto 18381 3073 | |
jerr=-10000-ilm 3073 | |
goto 17992 3073 | |
18381 continue 3074 | |
if(nin.gt.0) ca(1:nin,ilm)=a(m(1:nin)) 3074 | |
kin(ilm)=nin 3075 | |
a0(ilm)=az 3075 | |
alm(ilm)=al 3075 | |
lmu=ilm 3076 | |
dev(ilm)=(dot_product(t,f)-v0-dv0)/dvr 3077 | |
if(ilm.lt.mnl)goto 17991 3077 | |
if(flmin.ge.1.0)goto 17991 3078 | |
me=0 3078 | |
18390 do 18391 j=1,nin 3078 | |
if(ca(j,ilm).ne.0.0) me=me+1 3078 | |
18391 continue 3078 | |
18392 continue 3078 | |
if(me.gt.ne)goto 17992 3079 | |
if((dev(ilm)-dev(ilm-mnl+1))/dev(ilm).lt.sml)goto 17992 3080 | |
if(dev(ilm).gt.devmax)goto 17992 3081 | |
17991 continue 3082 | |
17992 continue 3082 | |
g=f 3083 | |
12180 continue 3083 | |
deallocate(t,w,wr,v,a,f,as,mm,ga,ixx) 3084 | |
return 3085 | |
end 3086 | |
function nonzero(n,v) 3087 | |
implicit double precision(a-h,o-z) 3088 | |
double precision v(n) 3089 | |
nonzero=0 3089 | |
18400 do 18401 i=1,n 3089 | |
if(v(i) .eq. 0.0)goto 18421 3089 | |
nonzero=1 3089 | |
return 3089 | |
18421 continue 3089 | |
18401 continue 3090 | |
18402 continue 3090 | |
return 3091 | |
end 3092 | |
subroutine solns(ni,nx,lmu,a,ia,nin,b) 3093 | |
implicit double precision(a-h,o-z) 3094 | |
double precision a(nx,lmu),b(ni,lmu) 3094 | |
integer ia(nx),nin(lmu) 3095 | |
18430 do 18431 lam=1,lmu 3095 | |
call uncomp(ni,a(:,lam),ia,nin(lam),b(:,lam)) 3095 | |
18431 continue 3096 | |
18432 continue 3096 | |
return 3097 | |
end 3098 | |
subroutine lsolns(ni,nx,nc,lmu,a,ia,nin,b) 3099 | |
implicit double precision(a-h,o-z) 3100 | |
double precision a(nx,nc,lmu),b(ni,nc,lmu) 3100 | |
integer ia(nx),nin(lmu) 3101 | |
18440 do 18441 lam=1,lmu 3101 | |
call luncomp(ni,nx,nc,a(1,1,lam),ia,nin(lam),b(1,1,lam)) 3101 | |
18441 continue 3102 | |
18442 continue 3102 | |
return 3103 | |
end 3104 | |
subroutine deviance(no,ni,x,y,g,q,nlam,a0,a,flog,jerr) 3105 | |
implicit double precision(a-h,o-z) 3106 | |
double precision x(no,ni),y(no),g(no),q(no),a(ni,nlam),a0(nlam),fl 3107 | |
*og(nlam) | |
double precision, dimension (:), allocatable :: w | |
if(minval(y) .ge. 0.0)goto 18461 3110 | |
jerr=8888 3110 | |
return 3110 | |
18461 continue 3111 | |
allocate(w(1:no),stat=jerr) 3111 | |
if(jerr.ne.0) return 3112 | |
w=max(0d0,q) 3112 | |
sw=sum(w) 3112 | |
if(sw .gt. 0.0)goto 18481 3112 | |
jerr=9999 3112 | |
go to 12180 3112 | |
18481 continue 3113 | |
yb=dot_product(w,y)/sw 3113 | |
fmax=log(huge(y(1))*0.1) 3114 | |
18490 do 18491 lam=1,nlam 3114 | |
s=0.0 3115 | |
18500 do 18501 i=1,no 3115 | |
if(w(i).le.0.0)goto 18501 3116 | |
f=g(i)+a0(lam)+dot_product(a(:,lam),x(i,:)) 3117 | |
s=s+w(i)*(y(i)*f-exp(sign(min(abs(f),fmax),f))) 3118 | |
18501 continue 3119 | |
18502 continue 3119 | |
flog(lam)=2.0*(sw*yb*(log(yb)-1.0)-s) 3120 | |
18491 continue 3121 | |
18492 continue 3121 | |
12180 continue 3121 | |
deallocate(w) 3122 | |
return 3123 | |
end 3124 | |
subroutine spfishnet (parm,no,ni,x,ix,jx,y,g,w,jd,vp,cl,ne,nx,nlam 3126 | |
*,flmin, ulam,thr,isd,intr,maxit,lmu,a0,ca,ia,nin,dev0,dev,alm,nlp | |
*,jerr) | |
implicit double precision(a-h,o-z) 3127 | |
double precision x(*),y(no),g(no),w(no),vp(ni),ulam(nlam),cl(2,ni) 3128 | |
double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam) 3129 | |
integer ix(*),jx(*),jd(*),ia(nx),nin(nlam) 3130 | |
double precision, dimension (:), allocatable :: xm,xs,ww,vq | |
integer, dimension (:), allocatable :: ju | |
if(maxval(vp) .gt. 0.0)goto 18521 3134 | |
jerr=10000 3134 | |
return 3134 | |
18521 continue 3135 | |
if(minval(y) .ge. 0.0)goto 18541 3135 | |
jerr=8888 3135 | |
return 3135 | |
18541 continue 3136 | |
allocate(ww(1:no),stat=jerr) 3137 | |
if(jerr.ne.0) return 3138 | |
allocate(ju(1:ni),stat=jerr) 3139 | |
if(jerr.ne.0) return 3140 | |
allocate(vq(1:ni),stat=jerr) 3141 | |
if(jerr.ne.0) return 3142 | |
allocate(xm(1:ni),stat=jerr) 3143 | |
if(jerr.ne.0) return 3144 | |
allocate(xs(1:ni),stat=jerr) 3145 | |
if(jerr.ne.0) return 3146 | |
call spchkvars(no,ni,x,ix,ju) 3147 | |
if(jd(1).gt.0) ju(jd(2:(jd(1)+1)))=0 3148 | |
if(maxval(ju) .gt. 0)goto 18561 3148 | |
jerr=7777 3148 | |
go to 12180 3148 | |
18561 continue 3149 | |
vq=max(0d0,vp) 3149 | |
vq=vq*ni/sum(vq) 3150 | |
ww=max(0d0,w) 3150 | |
sw=sum(ww) 3150 | |
if(sw .gt. 0.0)goto 18581 3150 | |
jerr=9999 3150 | |
go to 12180 3150 | |
18581 continue 3151 | |
ww=ww/sw 3152 | |
call splstandard2(no,ni,x,ix,jx,ww,ju,isd,intr,xm,xs) 3153 | |
if(isd .le. 0)goto 18601 3153 | |
18610 do 18611 j=1,ni 3153 | |
cl(:,j)=cl(:,j)*xs(j) 3153 | |
18611 continue 3153 | |
18612 continue 3153 | |
18601 continue 3154 | |
call spfishnet1(parm,no,ni,x,ix,jx,y,g,ww,ju,vq,cl,ne,nx,nlam,flmi 3156 | |
*n,ulam,thr, isd,intr,maxit,xm,xs,lmu,a0,ca,ia,nin,dev0,dev,alm,nl | |
*p,jerr) | |
if(jerr.gt.0) go to 12180 3156 | |
dev0=2.0*sw*dev0 3157 | |
18620 do 18621 k=1,lmu 3157 | |
nk=nin(k) 3158 | |
if(isd.gt.0) ca(1:nk,k)=ca(1:nk,k)/xs(ia(1:nk)) 3159 | |
if(intr .ne. 0)goto 18641 3159 | |
a0(k)=0.0 3159 | |
goto 18651 3160 | |
18641 continue 3160 | |
a0(k)=a0(k)-dot_product(ca(1:nk,k),xm(ia(1:nk))) 3160 | |
18651 continue 3161 | |
18631 continue 3161 | |
18621 continue 3162 | |
18622 continue 3162 | |
12180 continue 3162 | |
deallocate(ww,ju,vq,xm,xs) 3163 | |
return 3164 | |
end 3165 | |
subroutine spfishnet1(parm,no,ni,x,ix,jx,y,g,q,ju,vp,cl,ne,nx,nlam 3167 | |
*,flmin,ulam, shri,isd,intr,maxit,xb,xs,lmu,a0,ca,m,kin,dev0,dev,a | |
*lm,nlp,jerr) | |
implicit double precision(a-h,o-z) 3168 | |
double precision x(*),y(no),g(no),q(no),vp(ni),ulam(nlam),xb(ni),x 3169 | |
*s(ni) | |
double precision ca(nx,nlam),a0(nlam),dev(nlam),alm(nlam),cl(2,ni) 3170 | |
integer ix(*),jx(*),ju(ni),m(nx),kin(nlam) 3171 | |
double precision, dimension (:), allocatable :: qy,t,w,wr,v | |
double precision, dimension (:), allocatable :: a,as,xm,ga | |
integer, dimension (:), allocatable :: mm,ixx | |
call get_int_parms(sml,eps,big,mnlam,devmax,pmin,exmx) 3176 | |
sml=sml*10.0 3177 | |
allocate(a(1:ni),stat=jerr) 3178 | |
if(jerr.ne.0) return 3179 | |
allocate(as(1:ni),stat=jerr) 3180 | |
if(jerr.ne.0) return 3181 | |
allocate(t(1:no),stat=jerr) 3182 | |
if(jerr.ne.0) return 3183 | |
allocate(mm(1:ni),stat=jerr) 3184 | |
if(jerr.ne.0) return 3185 | |
allocate(ga(1:ni),stat=jerr) 3186 | |
if(jerr.ne.0) return 3187 | |
allocate(ixx(1:ni),stat=jerr) 3188 | |
if(jerr.ne.0) return 3189 | |
allocate(wr(1:no),stat=jerr) 3190 | |
if(jerr.ne.0) return 3191 | |
allocate(v(1:ni),stat=jerr) 3192 | |
if(jerr.ne.0) return 3193 | |
allocate(xm(1:ni),stat=jerr) 3194 | |
if(jerr.ne.0) return 3195 | |
allocate(w(1:no),stat=jerr) 3196 | |
if(jerr.ne.0) return 3197 | |
allocate(qy(1:no),stat=jerr) 3198 | |
if(jerr.ne.0) return 3199 | |
bta=parm 3199 | |
omb=1.0-bta 3199 | |
fmax=log(huge(bta)*0.1) 3200 | |
qy=q*y 3200 | |
yb=sum(qy) 3201 | |
if(nonzero(no,g) .ne. 0)goto 18671 3201 | |
t=0.0 3202 | |
if(intr .eq. 0)goto 18691 3202 | |
w=q*yb 3202 | |
az=log(yb) 3202 | |
uu=az 3203 | |
xm=yb*xb 3203 | |
dv0=yb*(az-1.0) 3204 | |
goto 18701 3205 | |
18691 continue 3205 | |
w=q 3205 | |
xm=0.0 3205 | |
uu=0.0 3205 | |
az=uu 3205 | |
dv0=-1.0 3205 | |
18701 continue 3206 | |
18681 continue 3206 | |
goto 18711 3207 | |
18671 continue 3207 | |
w=q*exp(sign(min(abs(g),fmax),g)) 3207 | |
ww=sum(w) 3207 | |
t=g 3208 | |
if(intr .eq. 0)goto 18731 3208 | |
eaz=yb/ww 3209 | |
w=eaz*w 3209 | |
az=log(eaz) 3209 | |
uu=az 3209 | |
dv0=dot_product(qy,g)-yb*(1.0-az) 3210 | |
goto 18741 3211 | |
18731 continue 3211 | |
uu=0.0 3211 | |
az=uu 3211 | |
dv0=dot_product(qy,g)-ww 3211 | |
18741 continue 3212 | |
18721 continue 3212 | |
18750 do 18751 j=1,ni 3212 | |
if(ju(j).eq.0)goto 18751 3212 | |
jb=ix(j) 3212 | |
je=ix(j+1)-1 3213 | |
xm(j)=dot_product(w(jx(jb:je)),x(jb:je)) 3214 | |
18751 continue 3215 | |
18752 continue 3215 | |
18711 continue 3216 | |
18661 continue 3216 | |
tt=yb*uu 3216 | |
ww=1.0 3216 | |
if(intr.ne.0) ww=yb 3216 | |
wr=qy-q*(yb*(1.0-uu)) 3216 | |
a=0.0 3216 | |
as=0.0 3217 | |
dvr=-yb 3218 | |
18760 do 18761 i=1,no 3218 | |
if(qy(i).gt.0.0) dvr=dvr+qy(i)*log(y(i)) 3218 | |
18761 continue 3218 | |
18762 continue 3218 | |
dvr=dvr-dv0 3218 | |
dev0=dvr 3220 | |
alf=1.0 3222 | |
if(flmin .ge. 1.0)goto 18781 3222 | |
eqs=max(eps,flmin) 3222 | |
alf=eqs**(1.0/(nlam-1)) 3222 | |
18781 continue 3223 | |
m=0 3223 | |
mm=0 3223 | |
nlp=0 3223 | |
nin=nlp 3223 | |
mnl=min(mnlam,nlam) 3223 | |
shr=shri*dev0 3223 | |
al=0.0 3223 | |
ixx=0 3224 | |
18790 do 18791 j=1,ni 3224 | |
if(ju(j).eq.0)goto 18791 3225 | |
jb=ix(j) 3225 | |
je=ix(j+1)-1 3226 | |
ga(j)=abs(dot_pr |
View raw
(Sorry about that, but we can’t show files that are this big right now.)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment