/
mvndst.f
1126 lines (1120 loc) · 42.9 KB
/
mvndst.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
* Note: The test program has been removed and a utlity routine mvnun has been
* added. RTK 2004-08-10
*
* Copyright 2000 by Alan Genz.
* Copyright 2004-2005 by Enthought, Inc.
*
* The subroutine MVNUN is copyrighted by Enthought, Inc.
* The rest of the file is copyrighted by Alan Genz and has kindly been offered
* to the Scipy project under it's BSD-style license.
*
* This file contains a short test program and MVNDST, a subroutine
* for computing multivariate normal distribution function values.
* The file is self contained and should compile without errors on (77)
* standard Fortran compilers. The test program demonstrates the use of
* MVNDST for computing MVN distribution values for a five dimensional
* example problem, with three different integration limit combinations.
*
* Alan Genz
* Department of Mathematics
* Washington State University
* Pullman, WA 99164-3113
* Email : alangenz@wsu.edu
*
SUBROUTINE mvnun(d, n, lower, upper, means, covar, maxpts,
& abseps, releps, value, inform)
* Parameters
*
* d integer, dimensionality of the data
* n integer, the number of data points
* lower double(2), the lower integration limits
* upper double(2), the upper integration limits
* means double(n), the mean of each kernel
* covar double(2,2), the covariance matrix
* maxpts integer, the maximum number of points to evaluate at
* abseps double, absolute error tolerance
* releps double, relative error tolerance
* value double intent(out), integral value
* inform integer intent(out),
* if inform == 0: error < eps
* elif inform == 1: error > eps, all maxpts used
integer n, d, infin(d), maxpts, inform, tmpinf
double precision lower(d), upper(d), releps, abseps,
& error, value, stdev(d), rho(d*(d-1)/2),
& covar(d,d),
& nlower(d), nupper(d), means(d,n), tmpval
integer i, j
do i=1,d
stdev(i) = dsqrt(covar(i,i))
infin(i) = 2
end do
do i=1,d
do j=1,i-1
rho(j+(i-2)*(i-1)/2) = covar(i,j)/stdev(i)/stdev(j)
end do
end do
value = 0d0
inform = 0
do i=1,n
do j=1,d
nlower(j) = (lower(j) - means(j,i))/stdev(j)
nupper(j) = (upper(j) - means(j,i))/stdev(j)
end do
call mvndst(d,nlower,nupper,infin,rho,maxpts,abseps,releps,
& error,tmpval,tmpinf)
value = value + tmpval
if (tmpinf .eq. 1) then
inform = 1
end if
end do
value = value / n
END
SUBROUTINE MVNDST( N, LOWER, UPPER, INFIN, CORREL, MAXPTS,
& ABSEPS, RELEPS, ERROR, VALUE, INFORM )
*
* A subroutine for computing multivariate normal probabilities.
* This subroutine uses an algorithm given in the paper
* "Numerical Computation of Multivariate Normal Probabilities", in
* J. of Computational and Graphical Stat., 1(1992), pp. 141-149, by
* Alan Genz
* Department of Mathematics
* Washington State University
* Pullman, WA 99164-3113
* Email : AlanGenz@wsu.edu
*
* Parameters
*
* N INTEGER, the number of variables.
* LOWER REAL, array of lower integration limits.
* UPPER REAL, array of upper integration limits.
* INFIN INTEGER, array of integration limits flags:
* if INFIN(I) < 0, Ith limits are (-infinity, infinity);
* if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
* if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
* if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
* CORREL REAL, array of correlation coefficients; the correlation
* coefficient in row I column J of the correlation matrix
* should be stored in CORREL( J + ((I-2)*(I-1))/2 ), for J < I.
* THe correlation matrix must be positive semidefinite.
* MAXPTS INTEGER, maximum number of function values allowed. This
* parameter can be used to limit the time. A sensible
* strategy is to start with MAXPTS = 1000*N, and then
* increase MAXPTS if ERROR is too large.
* ABSEPS REAL absolute error tolerance.
* RELEPS REAL relative error tolerance.
* ERROR REAL estimated absolute error, with 99% confidence level.
* VALUE REAL estimated value for the integral
* INFORM INTEGER, termination status parameter:
* if INFORM = 0, normal completion with ERROR < EPS;
* if INFORM = 1, completion with ERROR > EPS and MAXPTS
* function vaules used; increase MAXPTS to
* decrease ERROR;
* if INFORM = 2, N > 500 or N < 1.
*
EXTERNAL MVNDFN
INTEGER N, INFIN(*), MAXPTS, INFORM, INFIS, IVLS
DOUBLE PRECISION CORREL(*), LOWER(*), UPPER(*), RELEPS, ABSEPS,
& ERROR, VALUE, E, D, MVNDNT, MVNDFN
COMMON /DKBLCK/IVLS
IF ( N .GT. 500 .OR. N .LT. 1 ) THEN
INFORM = 2
VALUE = 0
ERROR = 1
ELSE
INFORM = MVNDNT(N, CORREL, LOWER, UPPER, INFIN, INFIS, D, E)
IF ( N-INFIS .EQ. 0 ) THEN
VALUE = 1
ERROR = 0
ELSE IF ( N-INFIS .EQ. 1 ) THEN
VALUE = E - D
ERROR = 2D-16
ELSE
*
* Call the lattice rule integration subroutine
*
IVLS = 0
CALL DKBVRC( N-INFIS-1, IVLS, MAXPTS, MVNDFN,
& ABSEPS, RELEPS, ERROR, VALUE, INFORM )
ENDIF
ENDIF
END
DOUBLE PRECISION FUNCTION MVNDFN( N, W )
*
* Integrand subroutine
*
INTEGER N, INFIN(*), INFIS, NL
DOUBLE PRECISION W(*), LOWER(*), UPPER(*), CORREL(*), D, E
PARAMETER ( NL = 500 )
DOUBLE PRECISION COV(NL*(NL+1)/2), A(NL), B(NL), Y(NL)
INTEGER INFI(NL), I, J, IJ, IK, INFA, INFB
DOUBLE PRECISION SUM, AI, BI, DI, EI, PHINVS, BVNMVN, MVNDNT
SAVE A, B, INFI, COV
MVNDFN = 1
INFA = 0
INFB = 0
IK = 1
IJ = 0
DO I = 1, N+1
SUM = 0
DO J = 1, I-1
IJ = IJ + 1
IF ( J .LT. IK ) SUM = SUM + COV(IJ)*Y(J)
END DO
IF ( INFI(I) .NE. 0 ) THEN
IF ( INFA .EQ. 1 ) THEN
AI = MAX( AI, A(I) - SUM )
ELSE
AI = A(I) - SUM
INFA = 1
END IF
END IF
IF ( INFI(I) .NE. 1 ) THEN
IF ( INFB .EQ. 1 ) THEN
BI = MIN( BI, B(I) - SUM )
ELSE
BI = B(I) - SUM
INFB = 1
END IF
END IF
IJ = IJ + 1
IF ( I .EQ. N+1 .OR. COV(IJ+IK+1) .GT. 0 ) THEN
CALL MVNLMS( AI, BI, 2*INFA+INFB-1, DI, EI )
IF ( DI .GE. EI ) THEN
MVNDFN = 0
RETURN
ELSE
MVNDFN = MVNDFN*( EI - DI )
IF ( I .LE. N ) Y(IK) = PHINVS( DI + W(IK)*( EI - DI ) )
IK = IK + 1
INFA = 0
INFB = 0
END IF
END IF
END DO
RETURN
*
* Entry point for intialization.
*
ENTRY MVNDNT( N, CORREL, LOWER, UPPER, INFIN, INFIS, D, E )
MVNDNT = 0
*
* Initialization and computation of covariance Cholesky factor.
*
CALL COVSRT( N, LOWER,UPPER,CORREL,INFIN,Y, INFIS,A,B,COV,INFI )
IF ( N - INFIS .EQ. 1 ) THEN
CALL MVNLMS( A(1), B(1), INFI(1), D, E )
ELSE IF ( N - INFIS .EQ. 2 ) THEN
IF ( ABS( COV(3) ) .GT. 0 ) THEN
D = SQRT( 1 + COV(2)**2 )
IF ( INFI(2) .NE. 0 ) A(2) = A(2)/D
IF ( INFI(2) .NE. 1 ) B(2) = B(2)/D
E = BVNMVN( A, B, INFI, COV(2)/D )
D = 0
ELSE
IF ( INFI(1) .NE. 0 ) THEN
IF ( INFI(2) .NE. 0 ) A(1) = MAX( A(1), A(2) )
ELSE
IF ( INFI(2) .NE. 0 ) A(1) = A(2)
END IF
IF ( INFI(1) .NE. 1 ) THEN
IF ( INFI(2) .NE. 1 ) B(1) = MIN( B(1), B(2) )
ELSE
IF ( INFI(2) .NE. 1 ) B(1) = B(2)
END IF
IF ( INFI(1) .NE. INFI(2) ) INFI(1) = 2
CALL MVNLMS( A(1), B(1), INFI(1), D, E )
END IF
INFIS = INFIS + 1
END IF
END
SUBROUTINE MVNLMS( A, B, INFIN, LOWER, UPPER )
DOUBLE PRECISION A, B, LOWER, UPPER, MVNPHI
INTEGER INFIN
LOWER = 0
UPPER = 1
IF ( INFIN .GE. 0 ) THEN
IF ( INFIN .NE. 0 ) LOWER = MVNPHI(A)
IF ( INFIN .NE. 1 ) UPPER = MVNPHI(B)
ENDIF
UPPER = MAX( UPPER, LOWER )
END
SUBROUTINE COVSRT( N, LOWER, UPPER, CORREL, INFIN, Y,
& INFIS, A, B, COV, INFI )
*
* Subroutine to sort integration limits and determine Cholesky factor.
*
INTEGER N, INFI(*), INFIN(*), INFIS
DOUBLE PRECISION
& A(*), B(*), COV(*), LOWER(*), UPPER(*), CORREL(*), Y(*)
INTEGER I, J, K, L, M, II, IJ, IL, JMIN
DOUBLE PRECISION SUMSQ, AJ, BJ, SUM, SQTWPI, EPS, D, E
DOUBLE PRECISION CVDIAG, AMIN, BMIN, DMIN, EMIN, YL, YU
PARAMETER ( SQTWPI = 2.506628274631001D0, EPS = 1D-10 )
IJ = 0
II = 0
INFIS = 0
DO I = 1, N
A(I) = 0
B(I) = 0
INFI(I) = INFIN(I)
IF ( INFI(I) .LT. 0 ) THEN
INFIS = INFIS + 1
ELSE
IF ( INFI(I) .NE. 0 ) A(I) = LOWER(I)
IF ( INFI(I) .NE. 1 ) B(I) = UPPER(I)
ENDIF
DO J = 1, I-1
IJ = IJ + 1
II = II + 1
COV(IJ) = CORREL(II)
END DO
IJ = IJ + 1
COV(IJ) = 1
END DO
*
* First move any doubly infinite limits to innermost positions.
*
IF ( INFIS .LT. N ) THEN
DO I = N, N-INFIS+1, -1
IF ( INFI(I) .GE. 0 ) THEN
DO J = 1,I-1
IF ( INFI(J) .LT. 0 ) THEN
CALL RCSWP( J, I, A, B, INFI, N, COV )
GO TO 10
ENDIF
END DO
ENDIF
10 END DO
*
* Sort remaining limits and determine Cholesky factor.
*
II = 0
DO I = 1, N-INFIS
*
* Determine the integration limits for variable with minimum
* expected probability and interchange that variable with Ith.
*
DMIN = 0
EMIN = 1
JMIN = I
CVDIAG = 0
IJ = II
DO J = I, N-INFIS
IF ( COV(IJ+J) .GT. EPS ) THEN
SUMSQ = SQRT( COV(IJ+J) )
SUM = 0
DO K = 1, I-1
SUM = SUM + COV(IJ+K)*Y(K)
END DO
AJ = ( A(J) - SUM )/SUMSQ
BJ = ( B(J) - SUM )/SUMSQ
CALL MVNLMS( AJ, BJ, INFI(J), D, E )
IF ( EMIN + D .GE. E + DMIN ) THEN
JMIN = J
AMIN = AJ
BMIN = BJ
DMIN = D
EMIN = E
CVDIAG = SUMSQ
ENDIF
ENDIF
IJ = IJ + J
END DO
IF ( JMIN .GT. I ) CALL RCSWP( I, JMIN, A,B, INFI, N, COV )
COV(II+I) = CVDIAG
*
* Compute Ith column of Cholesky factor.
* Compute expected value for Ith integration variable and
* scale Ith covariance matrix row and limits.
*
IF ( CVDIAG .GT. 0 ) THEN
IL = II + I
DO L = I+1, N-INFIS
COV(IL+I) = COV(IL+I)/CVDIAG
IJ = II + I
DO J = I+1, L
COV(IL+J) = COV(IL+J) - COV(IL+I)*COV(IJ+I)
IJ = IJ + J
END DO
IL = IL + L
END DO
IF ( EMIN .GT. DMIN + EPS ) THEN
YL = 0
YU = 0
IF ( INFI(I) .NE. 0 ) YL = -EXP( -AMIN**2/2 )/SQTWPI
IF ( INFI(I) .NE. 1 ) YU = -EXP( -BMIN**2/2 )/SQTWPI
Y(I) = ( YU - YL )/( EMIN - DMIN )
ELSE
IF ( INFI(I) .EQ. 0 ) Y(I) = BMIN
IF ( INFI(I) .EQ. 1 ) Y(I) = AMIN
IF ( INFI(I) .EQ. 2 ) Y(I) = ( AMIN + BMIN )/2
END IF
DO J = 1, I
II = II + 1
COV(II) = COV(II)/CVDIAG
END DO
A(I) = A(I)/CVDIAG
B(I) = B(I)/CVDIAG
ELSE
IL = II + I
DO L = I+1, N-INFIS
COV(IL+I) = 0
IL = IL + L
END DO
*
* If the covariance matrix diagonal entry is zero,
* permute limits and/or rows, if necessary.
*
*
DO J = I-1, 1, -1
IF ( ABS( COV(II+J) ) .GT. EPS ) THEN
A(I) = A(I)/COV(II+J)
B(I) = B(I)/COV(II+J)
IF ( COV(II+J) .LT. 0 ) THEN
CALL DKSWAP( A(I), B(I) )
IF ( INFI(I) .NE. 2 ) INFI(I) = 1 - INFI(I)
END IF
DO L = 1, J
COV(II+L) = COV(II+L)/COV(II+J)
END DO
DO L = J+1, I-1
IF( COV((L-1)*L/2+J+1) .GT. 0 ) THEN
IJ = II
DO K = I-1, L, -1
DO M = 1, K
CALL DKSWAP( COV(IJ-K+M), COV(IJ+M) )
END DO
CALL DKSWAP( A(K), A(K+1) )
CALL DKSWAP( B(K), B(K+1) )
M = INFI(K)
INFI(K) = INFI(K+1)
INFI(K+1) = M
IJ = IJ - K
END DO
GO TO 20
END IF
END DO
GO TO 20
END IF
COV(II+J) = 0
END DO
20 II = II + I
Y(I) = 0
END IF
END DO
ENDIF
END
*
SUBROUTINE DKSWAP( X, Y )
DOUBLE PRECISION X, Y, T
T = X
X = Y
Y = T
END
*
SUBROUTINE RCSWP( P, Q, A, B, INFIN, N, C )
*
* Swaps rows and columns P and Q in situ, with P <= Q.
*
DOUBLE PRECISION A(*), B(*), C(*)
INTEGER INFIN(*), P, Q, N, I, J, II, JJ
CALL DKSWAP( A(P), A(Q) )
CALL DKSWAP( B(P), B(Q) )
J = INFIN(P)
INFIN(P) = INFIN(Q)
INFIN(Q) = J
JJ = ( P*( P - 1 ) )/2
II = ( Q*( Q - 1 ) )/2
CALL DKSWAP( C(JJ+P), C(II+Q) )
DO J = 1, P-1
CALL DKSWAP( C(JJ+J), C(II+J) )
END DO
JJ = JJ + P
DO I = P+1, Q-1
CALL DKSWAP( C(JJ+P), C(II+I) )
JJ = JJ + I
END DO
II = II + Q
DO I = Q+1, N
CALL DKSWAP( C(II+P), C(II+Q) )
II = II + I
END DO
END
*
SUBROUTINE DKBVRC( NDIM, MINVLS, MAXVLS, FUNCTN, ABSEPS, RELEPS,
& ABSERR, FINEST, INFORM )
*
* Automatic Multidimensional Integration Subroutine
*
* AUTHOR: Alan Genz
* Department of Mathematics
* Washington State University
* Pulman, WA 99164-3113
* Email: AlanGenz@wsu.edu
*
* Last Change: 1/15/03
*
* KRBVRC computes an approximation to the integral
*
* 1 1 1
* I I ... I F(X) dx(NDIM)...dx(2)dx(1)
* 0 0 0
*
*
* DKBVRC uses randomized Korobov rules for the first 100 variables.
* The primary references are
* "Randomization of Number Theoretic Methods for Multiple Integration"
* R. Cranley and T.N.L. Patterson, SIAM J Numer Anal, 13, pp. 904-14,
* and
* "Optimal Parameters for Multidimensional Integration",
* P. Keast, SIAM J Numer Anal, 10, pp.831-838.
* If there are more than 100 variables, the remaining variables are
* integrated using the rules described in the reference
* "On a Number-Theoretical Integration Method"
* H. Niederreiter, Aequationes Mathematicae, 8(1972), pp. 304-11.
*
*************** Parameters ********************************************
****** Input parameters
* NDIM Number of variables, must exceed 1, but not exceed 40
* MINVLS Integer minimum number of function evaluations allowed.
* MINVLS must not exceed MAXVLS. If MINVLS < 0 then the
* routine assumes a previous call has been made with
* the same integrand and continues that calculation.
* MAXVLS Integer maximum number of function evaluations allowed.
* FUNCTN EXTERNALly declared user defined function to be integrated.
* It must have parameters (NDIM,Z), where Z is a real array
* of dimension NDIM.
*
* ABSEPS Required absolute accuracy.
* RELEPS Required relative accuracy.
****** Output parameters
* MINVLS Actual number of function evaluations used.
* ABSERR Estimated absolute accuracy of FINEST.
* FINEST Estimated value of integral.
* INFORM INFORM = 0 for normal exit, when
* ABSERR <= MAX(ABSEPS, RELEPS*ABS(FINEST))
* and
* INTVLS <= MAXCLS.
* INFORM = 1 If MAXVLS was too small to obtain the required
* accuracy. In this case a value FINEST is returned with
* estimated absolute accuracy ABSERR.
************************************************************************
EXTERNAL FUNCTN
INTEGER NDIM, MINVLS, MAXVLS, INFORM, NP, PLIM, NLIM, KLIM, KLIMI,
& SAMPLS, I, INTVLS, MINSMP
PARAMETER ( PLIM = 28, NLIM = 1000, KLIM = 100, MINSMP = 8 )
INTEGER P(PLIM), C(PLIM,KLIM-1)
DOUBLE PRECISION FUNCTN, ABSEPS, RELEPS, FINEST, ABSERR, DIFINT,
& FINVAL, VARSQR, VAREST, VARPRD, VALUE
DOUBLE PRECISION X(2*NLIM), VK(NLIM), ONE
PARAMETER ( ONE = 1 )
SAVE P, C, SAMPLS, NP, VAREST
INFORM = 1
INTVLS = 0
KLIMI = KLIM
IF ( MINVLS .GE. 0 ) THEN
FINEST = 0
VAREST = 0
SAMPLS = MINSMP
DO I = MIN( NDIM, 10), PLIM
NP = I
IF ( MINVLS .LT. 2*SAMPLS*P(I) ) GO TO 10
END DO
SAMPLS = MAX( MINSMP, MINVLS/( 2*P(NP) ) )
ENDIF
10 VK(1) = ONE/P(NP)
DO I = 2, NDIM
IF ( I .LE. KLIM ) THEN
VK(I) = MOD( C(NP, MIN(NDIM-1,KLIM-1))*VK(I-1), ONE )
ELSE
VK(I) = INT( P(NP)*2**(DBLE(I-KLIM)/(NDIM-KLIM+1)) )
VK(I) = MOD( VK(I)/P(NP), ONE )
END IF
END DO
FINVAL = 0
VARSQR = 0
DO I = 1, SAMPLS
CALL DKSMRC( NDIM, KLIMI, VALUE, P(NP), VK, FUNCTN, X )
DIFINT = ( VALUE - FINVAL )/I
FINVAL = FINVAL + DIFINT
VARSQR = ( I - 2 )*VARSQR/I + DIFINT**2
END DO
INTVLS = INTVLS + 2*SAMPLS*P(NP)
VARPRD = VAREST*VARSQR
FINEST = FINEST + ( FINVAL - FINEST )/( 1 + VARPRD )
IF ( VARSQR .GT. 0 ) VAREST = ( 1 + VARPRD )/VARSQR
ABSERR = 7*SQRT( VARSQR/( 1 + VARPRD ) )/2
IF ( ABSERR .GT. MAX( ABSEPS, ABS(FINEST)*RELEPS ) ) THEN
IF ( NP .LT. PLIM ) THEN
NP = NP + 1
ELSE
SAMPLS = MIN( 3*SAMPLS/2, ( MAXVLS - INTVLS )/( 2*P(NP) ) )
SAMPLS = MAX( MINSMP, SAMPLS )
ENDIF
IF ( INTVLS + 2*SAMPLS*P(NP) .LE. MAXVLS ) GO TO 10
ELSE
INFORM = 0
ENDIF
MINVLS = INTVLS
*
* Optimal Parameters for Lattice Rules
*
DATA P( 1),(C( 1,I),I = 1,99)/ 31, 12, 2*9, 13, 8*12, 3*3, 12,
& 2*7, 9*12, 3*3, 12, 2*7, 9*12, 3*3, 12, 2*7, 9*12, 3*3, 12, 2*7,
& 8*12, 7, 3*3, 3*7, 21*3/
DATA P( 2),(C( 2,I),I = 1,99)/ 47, 13, 11, 17, 10, 6*15,
& 22, 2*15, 3*6, 2*15, 9, 13, 3*2, 13, 2*11, 10, 9*15, 3*6, 2*15,
& 9, 13, 3*2, 13, 2*11, 10, 9*15, 3*6, 2*15, 9, 13, 3*2, 13, 2*11,
& 2*10, 8*15, 6, 2, 3, 2, 3, 12*2/
DATA P( 3),(C( 3,I),I = 1,99)/ 73, 27, 28, 10, 2*11, 20,
& 2*11, 28, 2*13, 28, 3*13, 16*14, 2*31, 3*5, 31, 13, 6*11, 7*13,
& 16*14, 2*31, 3*5, 11, 13, 7*11, 2*13, 11, 13, 4*5, 14, 13, 8*5/
DATA P( 4),(C( 4,I),I = 1,99)/ 113, 35, 2*27, 36, 22, 2*29,
& 20, 45, 3*5, 16*21, 29, 10*17, 12*23, 21, 27, 3*3, 24, 2*27,
& 17, 3*29, 17, 4*5, 16*21, 3*17, 6, 2*17, 6, 3, 2*6, 5*3/
DATA P( 5),(C( 5,I),I = 1,99)/ 173, 64, 66, 2*28, 2*44, 55,
& 67, 6*10, 2*38, 5*10, 12*49, 2*38, 31, 2*4, 31, 64, 3*4, 64,
& 6*45, 19*66, 11, 9*66, 45, 11, 7, 3, 3*2, 27, 5, 2*3, 2*5, 7*2/
DATA P( 6),(C( 6,I),I = 1,99)/ 263, 111, 42, 54, 118, 20,
& 2*31, 72, 17, 94, 2*14, 11, 3*14, 94, 4*10, 7*14, 3*11, 7*8,
& 5*18, 113, 2*62, 2*45, 17*113, 2*63, 53, 63, 15*67, 5*51, 12,
& 51, 12, 51, 5, 2*3, 2*2, 5/
DATA P( 7),(C( 7,I),I = 1,99)/ 397, 163, 154, 83, 43, 82,
& 92, 150, 59, 2*76, 47, 2*11, 100, 131, 6*116, 9*138, 21*101,
& 6*116, 5*100, 5*138, 19*101, 8*38, 5*3/
DATA P( 8),(C( 8,I),I = 1,99)/ 593, 246, 189, 242, 102,
& 2*250, 102, 250, 280, 118, 196, 118, 191, 215, 2*121,
& 12*49, 34*171, 8*161, 17*14, 6*10, 103, 4*10, 5/
DATA P( 9),(C( 9,I),I = 1,99)/ 907, 347, 402, 322, 418,
& 215, 220, 3*339, 337, 218, 4*315, 4*167, 361, 201, 11*124,
& 2*231, 14*90, 4*48, 23*90, 10*243, 9*283, 16, 283, 16, 2*283/
DATA P(10),(C(10,I),I = 1,99)/ 1361, 505, 220, 601, 644,
& 612, 160, 3*206, 422, 134, 518, 2*134, 518, 652, 382,
& 206, 158, 441, 179, 441, 56, 2*559, 14*56, 2*101, 56,
& 8*101, 7*193, 21*101, 17*122, 4*101/
DATA P(11),(C(11,I),I = 1,99)/ 2053, 794, 325, 960, 528,
& 2*247, 338, 366, 847, 2*753, 236, 2*334, 461, 711, 652,
& 3*381, 652, 7*381, 226, 7*326, 126, 10*326, 2*195, 19*55,
& 7*195, 11*132, 13*387/
DATA P(12),(C(12,I),I = 1,99)/ 3079, 1189, 888, 259, 1082, 725,
& 811, 636, 965, 2*497, 2*1490, 392, 1291, 2*508, 2*1291, 508,
& 1291, 2*508, 4*867, 934, 7*867, 9*1284, 4*563, 3*1010, 208,
& 838, 3*563, 2*759, 564, 2*759, 4*801, 5*759, 8*563, 22*226/
DATA P(13),(C(13,I),I = 1,99)/ 4621, 1763, 1018, 1500, 432,
& 1332, 2203, 126, 2240, 1719, 1284, 878, 1983, 4*266,
& 2*747, 2*127, 2074, 127, 2074, 1400, 10*1383, 1400, 7*1383,
& 507, 4*1073, 5*1990, 9*507, 17*1073, 6*22, 1073, 6*452, 318,
& 4*301, 2*86, 15/
DATA P(14),(C(14,I),I = 1,99)/ 6947, 2872, 3233, 1534, 2941,
& 2910, 393, 1796, 919, 446, 2*919, 1117, 7*103, 2311, 3117, 1101,
& 2*3117, 5*1101, 8*2503, 7*429, 3*1702, 5*184, 34*105, 13*784/
DATA P(15),(C(15,I),I = 1,99)/ 10427, 4309, 3758, 4034, 1963,
& 730, 642, 1502, 2246, 3834, 1511, 2*1102, 2*1522, 2*3427,
& 3928, 2*915, 4*3818, 3*4782, 3818, 4782, 2*3818, 7*1327, 9*1387,
& 13*2339, 18*3148, 3*1776, 3*3354, 925, 2*3354, 5*925, 8*2133/
DATA P(16),(C(16,I),I = 1,99)/ 15641, 6610, 6977, 1686, 3819,
& 2314, 5647, 3953, 3614, 5115, 2*423, 5408, 7426, 2*423,
& 487, 6227, 2660, 6227, 1221, 3811, 197, 4367, 351,
& 1281, 1221, 3*351, 7245, 1984, 6*2999, 3995, 4*2063, 1644,
& 2063, 2077, 3*2512, 4*2077, 19*754, 2*1097, 4*754, 248, 754,
& 4*1097, 4*222, 754,11*1982/
DATA P(17),(C(17,I),I = 1,99)/ 23473, 9861, 3647, 4073, 2535,
& 3430, 9865, 2830, 9328, 4320, 5913, 10365, 8272, 3706, 6186,
& 3*7806, 8610, 2563, 2*11558, 9421, 1181, 9421, 3*1181, 9421,
& 2*1181, 2*10574, 5*3534, 3*2898, 3450, 7*2141, 15*7055, 2831,
& 24*8204, 3*4688, 8*2831/
DATA P(18),(C(18,I),I = 1,99)/ 35221, 10327, 7582, 7124, 8214,
& 9600, 10271, 10193, 10800, 9086, 2365, 4409, 13812,
& 5661, 2*9344, 10362, 2*9344, 8585, 11114, 3*13080, 6949,
& 3*3436, 13213, 2*6130, 2*8159, 11595, 8159, 3436, 18*7096,
& 4377, 7096, 5*4377, 2*5410, 32*4377, 2*440, 3*1199/
DATA P(19),(C(19,I),I = 1,99)/ 52837, 19540, 19926, 11582,
& 11113, 24585, 8726, 17218, 419, 3*4918, 15701, 17710,
& 2*4037, 15808, 11401, 19398, 2*25950, 4454, 24987, 11719,
& 8697, 5*1452, 2*8697, 6436, 21475, 6436, 22913, 6434, 18497,
& 4*11089, 2*3036, 4*14208, 8*12906, 4*7614, 6*5021, 24*10145,
& 6*4544, 4*8394/
DATA P(20),(C(20,I),I = 1,99)/ 79259, 34566, 9579, 12654,
& 26856, 37873, 38806, 29501, 17271, 3663, 10763, 18955,
& 1298, 26560, 2*17132, 2*4753, 8713, 18624, 13082, 6791,
& 1122, 19363, 34695, 4*18770, 15628, 4*18770, 33766, 6*20837,
& 5*6545, 14*12138, 5*30483, 19*12138, 9305, 13*11107, 2*9305/
DATA P(21),(C(21,I),I = 1,99)/118891, 31929, 49367, 10982, 3527,
& 27066, 13226, 56010, 18911, 40574, 2*20767, 9686, 2*47603,
& 2*11736, 41601, 12888, 32948, 30801, 44243, 2*53351, 16016,
& 2*35086, 32581, 2*2464, 49554, 2*2464, 2*49554, 2464, 81, 27260,
& 10681, 7*2185, 5*18086, 2*17631, 3*18086, 37335, 3*37774,
& 13*26401, 12982, 6*40398, 3*3518, 9*37799, 4*4721, 4*7067/
DATA P(22),(C(22,I),I = 1,99)/178349, 40701, 69087, 77576, 64590,
& 39397, 33179, 10858, 38935, 43129, 2*35468, 5279, 2*61518, 27945,
& 2*70975, 2*86478, 2*20514, 2*73178, 2*43098, 4701,
& 2*59979, 58556, 69916, 2*15170, 2*4832, 43064, 71685, 4832,
& 3*15170, 3*27679, 2*60826, 2*6187, 5*4264, 45567, 4*32269,
& 9*62060, 13*1803, 12*51108, 2*55315, 5*54140, 13134/
DATA P(23),(C(23,I),I = 1,99)/267523, 103650, 125480, 59978,
& 46875, 77172, 83021, 126904, 14541, 56299, 43636, 11655,
& 52680, 88549, 29804, 101894, 113675, 48040, 113675,
& 34987, 48308, 97926, 5475, 49449, 6850, 2*62545, 9440,
& 33242, 9440, 33242, 9440, 33242, 9440, 62850, 3*9440,
& 3*90308, 9*47904, 7*41143, 5*36114, 24997, 14*65162, 7*47650,
& 7*40586, 4*38725, 5*88329/
DATA P(24),(C(24,I),I = 1,99)/401287, 165843, 90647, 59925,
& 189541, 67647, 74795, 68365, 167485, 143918, 74912,
& 167289, 75517, 8148, 172106, 126159,3*35867, 121694,
& 52171, 95354, 2*113969, 76304, 2*123709, 144615, 123709,
& 2*64958, 32377, 2*193002, 25023, 40017, 141605, 2*189165,
& 141605, 2*189165, 3*141605, 189165, 20*127047, 10*127785,
& 6*80822, 16*131661, 7114, 131661/
DATA P(25),(C(25,I),I = 1,99)/601942, 130365, 236711, 110235,
& 125699, 56483, 93735, 234469, 60549, 1291, 93937,
& 245291, 196061, 258647, 162489, 176631, 204895, 73353,
& 172319, 28881, 136787,2*122081, 275993, 64673, 3*211587,
& 2*282859, 211587, 242821, 3*256865, 122203, 291915, 122203,
& 2*291915, 122203, 2*25639, 291803, 245397, 284047,
& 7*245397, 94241, 2*66575, 19*217673, 10*210249, 15*94453/
DATA P(26),(C(26,I),I = 1,99)/902933, 333459, 375354, 102417,
& 383544, 292630, 41147, 374614, 48032, 435453, 281493, 358168,
& 114121, 346892, 238990, 317313, 164158, 35497, 2*70530, 434839,
& 3*24754, 393656, 2*118711, 148227, 271087, 355831, 91034,
& 2*417029, 2*91034, 417029, 91034, 2*299843, 2*413548, 308300,
& 3*413548, 3*308300, 413548, 5*308300, 4*15311, 2*176255, 6*23613,
& 172210, 4* 204328, 5*121626, 5*200187, 2*121551, 12*248492,
& 5*13942/
DATA P(27), (C(27,I), I = 1,99)/ 1354471, 500884, 566009, 399251,
& 652979, 355008, 430235, 328722, 670680, 2*405585, 424646,
& 2*670180, 641587, 215580, 59048, 633320, 81010, 20789, 2*389250,
& 2*638764, 2*389250, 398094, 80846, 2*147776, 296177, 2*398094,
& 2*147776, 396313, 3*578233, 19482, 620706, 187095, 620706,
& 187095, 126467, 12*241663, 321632, 2*23210, 3*394484, 3*78101,
& 19*542095, 3*277743, 12*457259/
DATA P(28), (C(28,I), I = 1, 99)/ 2031713, 858339, 918142, 501970,
& 234813, 460565, 31996, 753018, 256150, 199809, 993599, 245149,
& 794183, 121349, 150619, 376952, 2*809123, 804319, 67352, 969594,
& 434796, 969594, 804319, 391368, 761041, 754049, 466264, 2*754049,
& 466264, 2*754049, 282852, 429907, 390017, 276645, 994856, 250142,
& 144595, 907454, 689648, 4*687580, 978368, 687580, 552742, 105195,
& 942843, 768249, 4*307142, 7*880619, 11*117185, 11*60731,
& 4*178309, 8*74373, 3*214965/
*
END
*
SUBROUTINE DKSMRC( NDIM, KLIM, SUMKRO, PRIME, VK, FUNCTN, X )
EXTERNAL FUNCTN
INTEGER NDIM, NK, KLIM, PRIME, K, J, JP
DOUBLE PRECISION SUMKRO, VK(*), FUNCTN, X(*), ONE, XT, MVNUNI
PARAMETER ( ONE = 1 )
SUMKRO = 0
NK = MIN( NDIM, KLIM )
DO J = 1, NK - 1
JP = J + MVNUNI()*( NK + 1 - J )
XT = VK(J)
VK(J) = VK(JP)
VK(JP) = XT
END DO
DO J = 1, NDIM
X(NDIM+J) = MVNUNI()
END DO
DO K = 1, PRIME
DO J = 1, NDIM
X(J) = ABS( 2*MOD( K*VK(J) + X(NDIM+J), ONE ) - 1 )
END DO
SUMKRO = SUMKRO + ( FUNCTN(NDIM,X) - SUMKRO )/( 2*K - 1 )
DO J = 1, NDIM
X(J) = 1 - X(J)
END DO
SUMKRO = SUMKRO + ( FUNCTN(NDIM,X) - SUMKRO )/( 2*K )
END DO
END
*
DOUBLE PRECISION FUNCTION MVNPHI( Z )
*
* Normal distribution probabilities accurate to 1.e-15.
* Z = no. of standard deviations from the mean.
*
* Based upon algorithm 5666 for the error function, from:
* Hart, J.F. et al, 'Computer Approximations', Wiley 1968
*
* Programmer: Alan Miller
*
* Latest revision - 30 March 1986
*
DOUBLE PRECISION P0, P1, P2, P3, P4, P5, P6,
* Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7,
* Z, P, EXPNTL, CUTOFF, ROOTPI, ZABS
PARAMETER(
* P0 = 220.20 68679 12376 1D0,
* P1 = 221.21 35961 69931 1D0,
* P2 = 112.07 92914 97870 9D0,
* P3 = 33.912 86607 83830 0D0,
* P4 = 6.3739 62203 53165 0D0,
* P5 = .70038 30644 43688 1D0,
* P6 = .035262 49659 98910 9D0 )
PARAMETER(
* Q0 = 440.41 37358 24752 2D0,
* Q1 = 793.82 65125 19948 4D0,
* Q2 = 637.33 36333 78831 1D0,
* Q3 = 296.56 42487 79673 7D0,
* Q4 = 86.780 73220 29460 8D0,
* Q5 = 16.064 17757 92069 5D0,
* Q6 = 1.7556 67163 18264 2D0,
* Q7 = .088388 34764 83184 4D0 )
PARAMETER( ROOTPI = 2.5066 28274 63100 1D0 )
PARAMETER( CUTOFF = 7.0710 67811 86547 5D0 )
*
ZABS = ABS(Z)
*
* |Z| > 37
*
IF ( ZABS .GT. 37 ) THEN
P = 0
ELSE
*
* |Z| <= 37
*
EXPNTL = EXP( -ZABS**2/2 )
*
* |Z| < CUTOFF = 10/SQRT(2)
*
IF ( ZABS .LT. CUTOFF ) THEN
P = EXPNTL*( (((((P6*ZABS + P5)*ZABS + P4)*ZABS + P3)*ZABS
* + P2)*ZABS + P1)*ZABS + P0)/(((((((Q7*ZABS + Q6)*ZABS
* + Q5)*ZABS + Q4)*ZABS + Q3)*ZABS + Q2)*ZABS + Q1)*ZABS
* + Q0 )
*
* |Z| >= CUTOFF.
*
ELSE
P = EXPNTL/( ZABS + 1/( ZABS + 2/( ZABS + 3/( ZABS
* + 4/( ZABS + 0.65D0 ) ) ) ) )/ROOTPI
END IF
END IF
IF ( Z .GT. 0 ) P = 1 - P
MVNPHI = P
END
DOUBLE PRECISION FUNCTION PHINVS(P)
*
* ALGORITHM AS241 APPL. STATIST. (1988) VOL. 37, NO. 3
*
* Produces the normal deviate Z corresponding to a given lower
* tail area of P.
*
* The hash sums below are the sums of the mantissas of the
* coefficients. They are included for use in checking
* transcription.
*
DOUBLE PRECISION SPLIT1, SPLIT2, CONST1, CONST2,
* A0, A1, A2, A3, A4, A5, A6, A7, B1, B2, B3, B4, B5, B6, B7,
* C0, C1, C2, C3, C4, C5, C6, C7, D1, D2, D3, D4, D5, D6, D7,
* E0, E1, E2, E3, E4, E5, E6, E7, F1, F2, F3, F4, F5, F6, F7,
* P, Q, R
PARAMETER ( SPLIT1 = 0.425, SPLIT2 = 5,
* CONST1 = 0.180625D0, CONST2 = 1.6D0 )
*
* Coefficients for P close to 0.5
*
PARAMETER (
* A0 = 3.38713 28727 96366 6080D0,
* A1 = 1.33141 66789 17843 7745D+2,
* A2 = 1.97159 09503 06551 4427D+3,
* A3 = 1.37316 93765 50946 1125D+4,
* A4 = 4.59219 53931 54987 1457D+4,
* A5 = 6.72657 70927 00870 0853D+4,
* A6 = 3.34305 75583 58812 8105D+4,
* A7 = 2.50908 09287 30122 6727D+3,
* B1 = 4.23133 30701 60091 1252D+1,
* B2 = 6.87187 00749 20579 0830D+2,
* B3 = 5.39419 60214 24751 1077D+3,
* B4 = 2.12137 94301 58659 5867D+4,
* B5 = 3.93078 95800 09271 0610D+4,
* B6 = 2.87290 85735 72194 2674D+4,
* B7 = 5.22649 52788 52854 5610D+3 )
* HASH SUM AB 55.88319 28806 14901 4439
*
* Coefficients for P not close to 0, 0.5 or 1.
*
PARAMETER (
* C0 = 1.42343 71107 49683 57734D0,
* C1 = 4.63033 78461 56545 29590D0,
* C2 = 5.76949 72214 60691 40550D0,
* C3 = 3.64784 83247 63204 60504D0,
* C4 = 1.27045 82524 52368 38258D0,
* C5 = 2.41780 72517 74506 11770D-1,
* C6 = 2.27238 44989 26918 45833D-2,
* C7 = 7.74545 01427 83414 07640D-4,
* D1 = 2.05319 16266 37758 82187D0,
* D2 = 1.67638 48301 83803 84940D0,
* D3 = 6.89767 33498 51000 04550D-1,
* D4 = 1.48103 97642 74800 74590D-1,
* D5 = 1.51986 66563 61645 71966D-2,
* D6 = 5.47593 80849 95344 94600D-4,
* D7 = 1.05075 00716 44416 84324D-9 )
* HASH SUM CD 49.33206 50330 16102 89036
*
* Coefficients for P near 0 or 1.
*
PARAMETER (
* E0 = 6.65790 46435 01103 77720D0,
* E1 = 5.46378 49111 64114 36990D0,
* E2 = 1.78482 65399 17291 33580D0,
* E3 = 2.96560 57182 85048 91230D-1,
* E4 = 2.65321 89526 57612 30930D-2,
* E5 = 1.24266 09473 88078 43860D-3,
* E6 = 2.71155 55687 43487 57815D-5,
* E7 = 2.01033 43992 92288 13265D-7,
* F1 = 5.99832 20655 58879 37690D-1,
* F2 = 1.36929 88092 27358 05310D-1,
* F3 = 1.48753 61290 85061 48525D-2,
* F4 = 7.86869 13114 56132 59100D-4,
* F5 = 1.84631 83175 10054 68180D-5,
* F6 = 1.42151 17583 16445 88870D-7,
* F7 = 2.04426 31033 89939 78564D-15 )
* HASH SUM EF 47.52583 31754 92896 71629
*
Q = ( 2*P - 1 )/2
IF ( ABS(Q) .LE. SPLIT1 ) THEN
R = CONST1 - Q*Q
PHINVS = Q*( ( ( ((((A7*R + A6)*R + A5)*R + A4)*R + A3)
* *R + A2 )*R + A1 )*R + A0 )
* /( ( ( ((((B7*R + B6)*R + B5)*R + B4)*R + B3)
* *R + B2 )*R + B1 )*R + 1 )
ELSE
R = MIN( P, 1 - P )
IF ( R .GT. 0 ) THEN
R = SQRT( -LOG(R) )
IF ( R .LE. SPLIT2 ) THEN
R = R - CONST2
PHINVS = ( ( ( ((((C7*R + C6)*R + C5)*R + C4)*R + C3)
* *R + C2 )*R + C1 )*R + C0 )
* /( ( ( ((((D7*R + D6)*R + D5)*R + D4)*R + D3)
* *R + D2 )*R + D1 )*R + 1 )
ELSE
R = R - SPLIT2
PHINVS = ( ( ( ((((E7*R + E6)*R + E5)*R + E4)*R + E3)
* *R + E2 )*R + E1 )*R + E0 )
* /( ( ( ((((F7*R + F6)*R + F5)*R + F4)*R + F3)
* *R + F2 )*R + F1 )*R + 1 )
END IF
ELSE
PHINVS = 9
END IF
IF ( Q .LT. 0 ) PHINVS = - PHINVS
END IF
END
DOUBLE PRECISION FUNCTION BVNMVN( LOWER, UPPER, INFIN, CORREL )
*
* A function for computing bivariate normal probabilities.
*
* Parameters
*
* LOWER REAL, array of lower integration limits.
* UPPER REAL, array of upper integration limits.
* INFIN INTEGER, array of integration limits flags:
* if INFIN(I) = 0, Ith limits are (-infinity, UPPER(I)];
* if INFIN(I) = 1, Ith limits are [LOWER(I), infinity);
* if INFIN(I) = 2, Ith limits are [LOWER(I), UPPER(I)].
* CORREL REAL, correlation coefficient.
*
DOUBLE PRECISION LOWER(*), UPPER(*), CORREL, BVU
INTEGER INFIN(*)
IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 2 ) THEN
BVNMVN = BVU ( LOWER(1), LOWER(2), CORREL )
+ - BVU ( UPPER(1), LOWER(2), CORREL )
+ - BVU ( LOWER(1), UPPER(2), CORREL )
+ + BVU ( UPPER(1), UPPER(2), CORREL )
ELSE IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 1 ) THEN
BVNMVN = BVU ( LOWER(1), LOWER(2), CORREL )
+ - BVU ( UPPER(1), LOWER(2), CORREL )
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 2 ) THEN
BVNMVN = BVU ( LOWER(1), LOWER(2), CORREL )
+ - BVU ( LOWER(1), UPPER(2), CORREL )
ELSE IF ( INFIN(1) .EQ. 2 .AND. INFIN(2) .EQ. 0 ) THEN
BVNMVN = BVU ( -UPPER(1), -UPPER(2), CORREL )
+ - BVU ( -LOWER(1), -UPPER(2), CORREL )
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 2 ) THEN
BVNMVN = BVU ( -UPPER(1), -UPPER(2), CORREL )
+ - BVU ( -UPPER(1), -LOWER(2), CORREL )
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 0 ) THEN
BVNMVN = BVU ( LOWER(1), -UPPER(2), -CORREL )
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 1 ) THEN
BVNMVN = BVU ( -UPPER(1), LOWER(2), -CORREL )
ELSE IF ( INFIN(1) .EQ. 1 .AND. INFIN(2) .EQ. 1 ) THEN
BVNMVN = BVU ( LOWER(1), LOWER(2), CORREL )
ELSE IF ( INFIN(1) .EQ. 0 .AND. INFIN(2) .EQ. 0 ) THEN
BVNMVN = BVU ( -UPPER(1), -UPPER(2), CORREL )
END IF
END
DOUBLE PRECISION FUNCTION BVU( SH, SK, R )
*
* A function for computing bivariate normal probabilities.
*
* Yihong Ge
* Department of Computer Science and Electrical Engineering
* Washington State University
* Pullman, WA 99164-2752
* and
* Alan Genz
* Department of Mathematics
* Washington State University
* Pullman, WA 99164-3113
* Email : alangenz@wsu.edu
*
* BVN - calculate the probability that X is larger than SH and Y is
* larger than SK.
*
* Parameters
*
* SH REAL, integration limit
* SK REAL, integration limit
* R REAL, correlation coefficient
* LG INTEGER, number of Gauss Rule Points and Weights
*
DOUBLE PRECISION BVN, SH, SK, R, ZERO, TWOPI
INTEGER I, LG, NG
PARAMETER ( ZERO = 0, TWOPI = 6.283185307179586D0 )
DOUBLE PRECISION X(10,3), W(10,3), AS, A, B, C, D, RS, XS
DOUBLE PRECISION MVNPHI, SN, ASR, H, K, BS, HS, HK
SAVE X, W
* Gauss Legendre Points and Weights, N = 6
DATA ( W(I,1), X(I,1), I = 1,3) /
* 0.1713244923791705D+00,-0.9324695142031522D+00,
* 0.3607615730481384D+00,-0.6612093864662647D+00,
* 0.4679139345726904D+00,-0.2386191860831970D+00/
* Gauss Legendre Points and Weights, N = 12
DATA ( W(I,2), X(I,2), I = 1,6) /
* 0.4717533638651177D-01,-0.9815606342467191D+00,
* 0.1069393259953183D+00,-0.9041172563704750D+00,
* 0.1600783285433464D+00,-0.7699026741943050D+00,
* 0.2031674267230659D+00,-0.5873179542866171D+00,
* 0.2334925365383547D+00,-0.3678314989981802D+00,
* 0.2491470458134029D+00,-0.1252334085114692D+00/
* Gauss Legendre Points and Weights, N = 20
DATA ( W(I,3), X(I,3), I = 1,10) /
* 0.1761400713915212D-01,-0.9931285991850949D+00,
* 0.4060142980038694D-01,-0.9639719272779138D+00,
* 0.6267204833410906D-01,-0.9122344282513259D+00,