1 ! ******************* WESS0 ************************ ! ** WRIST VERSION OF LESS0, 31-JAN-1975 ** 5 ! ** FROM LOUISVILLE EXP SIMULATION SYSTEM ** 6 ! ** TRANSLATED BY JAMES A. WARDEN ** ! ** WABASH COLLEGE ** 7 ! ************************************************** 20 O$=SYS(CHR$(7%)) 30 OPEN O$ FOR INPUT AS FILE 1% 40 DIM #1%,X%(48),A9(1),A1$(5)=128,A2$(24,4)=128,D2(24,12),X2(24,384) 50 ! \-----ID RECORD ------/ \-----24 MODEL RECORDS-----------/ 60 CHANGE SYS(CHR$(6%)+CHR$(9%)) TO M% : O2$="WESS"+CHR$(65%+M%(2%)/2%)+".TMP" : OPEN O2$ AS FILE 2% 70 DIM #2%,A3$(4)=128,Q(3,128),I(27),S(27),X(48),O(27),D(12),N(10), P(10),K(20),V(20),T$(500)=64 75 X9=V(1) : Q0=V(2) : P5=V(3) : P6=V(4) : D2=V(5) : Q2=V(6) : M2=V(7) : N=V(8) : A8=V(9) : A9=V(10) : J=V(11) 80 DIM A(10),B(24,2),M%(30) 82 U=Q(D(9),D(10)) : IF U<0 OR U>6 THEN U=0 84 U$=MID("##########.######",U+1,11) 86 IF T$(0%)="BACKUP" THEN O3%=-1% 90 RANDOMIZE : GO TO 2000 500 !SUBROUTINE TO HANDLE CONTINUOUS VARIABLES 510 IF N(3)=0 THEN 870 ELSE R5=0 520 FOR P1=N(1)+N(2)+1 TO N(1)+N(2)+N(3) 530 L3=D(1) : L4=D(2)+P1-N(1)-N(2)-1 : GOSUB 1200 : R4=Q(L3,L4) 570 IF S(P1)<>0THEN640 580 P3=RND(1) 590 IF R4>1THEN760 600 L1=1 : L2=7+N(8)*2*P1 : GOSUB 1100 630 B(P1,1)=Q(L1,L2-1)+P3*(Q(L1,L2)-Q(L1,L2-1)) 640 IF R4<=1THEN860 650 L3=D(1) : L4=D(2)+N(3)+R5 : R5=R5+R4 670 FOR P4=1 TO R4 680 GOSUB 1200 : IF Q(L3,L4)";P1 : X(4)=1 : GO TO 870 760 L3=D(5) : L4=D(6)+R5 : R5=R5+R4 780 FOR P4=1 TO R4 790 GOSUB 1200 : IF Q(L3,L4)";P1 : X(4)=1 860 NEXT P1 870 RETURN 1000 ! GAUSS: MEAN=P9 STD.DEV.=P4 VALUE=P3 1010 P3=P4*SQR(-2.*LOG(RND))*COS(6.28318*RND) + P9 1060 RETURN 1100 ! SUBROUTINE TO CORRECT L1&L2 (ROW & COLUMN INDICES) 1110 IF L2<=Q0 THEN RETURN 1120 L2=L2-Q0 : L1=L1+1 : GO TO 1110 1200 L4=L4+1 1210 IF L4<=Q0 THEN RETURN 1220 L4=L4-Q0 : L3=L3+1 : GO TO 1210 1500 ! SUBROUTINE TO CALCULATE "X" EFFECT 1530 DEF FNB(K0)=2.39365*EXP(-18*(K0-.5)^2) 1540 IF S(J2)>0 THEN 1570 1550 B(J2,1)=RND*V7 : GO TO 1930 1570 B(J2,1)=0. : H3=1 1590 IF K(K5)=0 THEN 1900 ELSE IF K(K5)>4 THEN 1740 ELSE IF K(K5)<>1 THEN 1650 1620 IF K(K5+10)<.5 THEN 1930 1630 B(J2,1)=K(K5+10)*V7*H3 : GO TO 1930 1650 IF K(K5)=2 THEN B(J2,1)=V8-V7+K(10+K5)*2*V7 : GO TO 1930 1680 IF K(K5)=3 THEN H3=-1 : GO TO 1620 1710 IF K(K5)=4 THEN B(J2,1)=V8+V7-K(10+K5)*2*V7 : GO TO 1930 1740 IF K(K5)>6 THEN 1810 ELSE IF K(K5)<>5 THEN 1780 1760 B(J2,1)=FNB(K(K5+10))*.45*V7*H3 : GO TO 1930 1780 H3=-1 : GO TO 1760 1810 IF K(K5)<>7 THEN 1840 1820 B(J2,1)=K(K5+10)^4*V7*2*H3 : RETURN 1840 IF K(K5)<>8 THEN 1870 1850 B(J2,1)=2*H3*(V7-(1-K(K5+10))^4*V7) : RETURN 1870 IF K(K5)<>9 THEN PRINT"ERROR IN X ROUTINE" : RETURN 1880 H3=-1 : GO TO 1820 1900 H3=-1 : GO TO 1850 1930 RETURN ! --------------------------------------------------------- 2000 ! GENERAL MODEL PROGRAM--CONCEIVED AND PROGRAMMED BY A. CROMER 2030 DEF FNC(V1)=INT(V1/Q9) 2040 DEF FND(V2)=V2-FNC(V2)*Q9 2050 MAT T=ZER : MAT A=ZER : MAT B=ZER 2080 A9,H5,K6=0. : V7,V8=1. 2090 L3=D(1) : L4=D(2) : V9=N(8) 2150 Y9=X9+1 : Z9=X9+N(6) : MAT B=ZER 2180 FOR L=1 TO V9 2190 K3=8+V9+2*L : B(L,1)=S(L) : B(L,2)=Q(1,K3)-Q(1,K3-1)+1 2220 IF LX9 THEN 2260 2240 B(L,2)=2 : B(L,1)=0 2260 NEXT L ! ------------ MAIN LOOP: ONCE FOR EACH DEP VARIABLE ----------- 2270 FOR L=1 TO N(7) 2280 R1=(V9-N(7)+L-1)*8+1 2290 R2=INT(R1/72)+1 : IF R2<1 OR R2>3 THEN R2=1 2300 R3=R1-72*(R2-1) 2310 IF L3<>0 THEN 2340 2320 L3=1 2330 L4=8+V9*3+1 2340 PRINT MID(A3$(R2),R3,6);" ="; 2350 IF O3% THEN V(0)=V(0)+1 : T$(V(0))=";"+MID(A3$(R2),R3,6)+" =" 2430 ! SET INDICES DURING EFFECTS COMPUTATION 2440 P3=1 : P4=N(6) 2460 ! COUNT # OF ACTIVE VARIABLES 2470 M3=0 : IF P3=1 THEN L4=D(8) 2480 FOR J2=1 TO X9+P4 2490 GOSUB 1200 : IF Q(L3,L4)=0 THEN 2540 2510 M3=M3+1 : A(M3)=J2 ! A = VAR ## OF M3TH ACTIVE VARIABLE 2540 NEXT J2 2550 W1=2^M3-1 2560 K3=L3 : K4=L4 ! --------------------------------------- 2580 FOR J6= 1 TO N(1) ! ONE LOOP FOR EACH PARAMETER 2590 FOR J7= 1 TO S(J6) ! ONE LOOP FOR EACH SUBJ 2600 O1=0 2630 GOSUB 500 ! CONT VARIABLES: RANDOMIZE IF NECESSARY 2640 ! UNKNOWN VARIABLES 2650 IF N(5)=0 THEN 2760 2660 K5=0 2670 ! IF K6=0 USE X, NOT SECONDARY; K6=1 REVERSE 2680 K6=1 2690 FOR J2=N(9) TO X9 : IF S(J2)=99 THEN 2750 2710 K6=0 : K5=K5+1 : B(J2,1)=K(K5) : GOSUB 1500 2750 NEXT J2 2760 L3=K3 : L4=K4 2780 IF X(4)=1 THEN 4250 2790 R3=N(1)+1 2800 R4=R3-1+N(2) 2810 R5=0 2820 ! NOW DO THE DISCRETE VARIABLES 2830 FOR J2=R3 TO R4 2840 IF P3=1 THEN 2870 2850 B(J2,1)=I(J2) : GO TO 2890 2870 IF S(J2)<>0 THEN 2890 2880 B(J2,1)=INT(RND(1)*(B(J2,2)-1)+1.5) 2890 NEXT J2 2900 R5=R5+1 : ON R5 GO TO 2940,3000,3040 2940 IF N(5)=0 THEN 2900 2950 R3=N(9) : R4=X9 : GO TO 2830 2980 ! GO BACK FOR SECONDARY VARIABLES; ! N(9)=FIRST SEC VAR, X9=LAST SEC VAR. 3000 IF N(6)=0 THEN 2900 3010 R3=N(9) : R4=X9+N(6) : GO TO 2830 3040 M4=M3+1 ! M3 = # ACTIVE VARIABLES 3060 MAT U=ZER : MAT Z=ZER ! ----------- "J" LOOP - COVERS ALL ACTIVE VARIABLES ---------- 3080 FOR J=1 TO M3 ! SET UP SIMULATED LOOPS; U = INDEX OF LOOPS 3110 M5=J+1 3120 U(J1)=J1 FOR J1=1 TO J 3150 ! ACTIVE PART OF OUTER SIMULATED LOOPS ! WEIGHT FOR TERM 3170 GOSUB 1200 :Q1=Q(L3,L4) : IF Q1=0 THEN 3770 ! IF NO MORE NON-ZERO WEIGHTS, QUIT. 3210 IF Q1=9999 THEN 3930 3220 X1=1 3230 ! CHECK IF USE SELECTED VALUE DIRECTLY 3240 IF Q1<>-9999 THEN 3310 3250 GOSUB 1200 : Q1=Q(L3,L4) 3270 X1=X1*S(A(U(J2))) FOR J2=1 TO J 3300 GOTO 3550 3310 ! NOW GET EFFECTS 3320 H4=1 : K5=0 : IF P3<>1 THEN H4=0 : H5=1 3370 A7=A(U(1)) 3380 M5=B(A7,1)+H5 3390 M7=B(A7,2)-H4 3400 FOR J1=J TO 2 STEP -1 3410 A1=A(U(J1)) : M6=1 3430 FOR J2=1 TO J1-1 3440 A7=A(U(J2)) : M6=M6*(B(A7,2)-H4) 3460 NEXT J2 3470 M5=M5+(B(A1,1)+H5-1)*M6 3480 M7=M7*(B(A1,2)-H4) 3490 NEXT J1 3500 FOR J1=1 TO M7 : GOSUB 1200 3520 IF J1=M5 THEN X1=Q(L3,L4) 3540 NEXT J1 3550 ! ACCUMULATE WEIGHT (Q1) TIMES EFFECT (X1) 3560 IF P3=2 THEN 3760 3570 ! SKIP EITHER X OR SECONDARY VARIABLES 3580 IF K6=0 THEN 3680 3590 ! SKIP X VARIABLES 3600IF N(5)=0 THEN 3760 3610 FOR J1=1 TO J 3620 A1=A(U(J1)) : IF A1X9 THEN 3760 3650 GO TO 3770 3660 NEXT J1 3670 GOTO 3760 3680 IF N(5)=0 THEN 3760 3690 FOR J1=1 TO J : A1=A(U(J1)) 3710 IF A1X9 THEN 3760 3730 X1=B(A1,1)*Q(L3,L4) : GO TO 3760 3750 NEXT J1 3760 O1=O1+Q1*X1 3770 ! THIS IS THE WORKING PART OF THE SIMULATED LOOPS 3780 Q2=J 3790 U(Q2)=U(Q2)+1 3800 IF U(Q2)>M3 THEN 3820 3810 GOTO 3150 3820 Q2=Q2-1 3830 IF Q2=0 THEN 3910 3840 U(Q2)=U(Q2)+1 3850 IF U(Q2)>M3 THEN 3820 3860 FOR J1=Q2+1 TO J 3870 U(J1)=U(J1-1)+1 3880 IF U(J1)>M3 THEN 3820 3890 NEXT J1 3900 GOTO 3150 3910 NEXT J 3920 ! END OF OUTER SIMULATED LOOPS 3930 GOSUB 1200 : O1=O1+Q(L3,L4) : IF P3=2 THEN 4050 3960 GOSUB 1200 : O1=O1+Q(L3,L4)*RND*O1/100 3980 ! NOW CHECK VALUE FOR BOUNDS 3990 GOSUB 1200 : IF O1<=Q(L3,L4) THEN O1=Q(L3,L4)+RND 4020 GOSUB 1200 : IF O1>Q(L3,L4) THEN O1=Q(L3,L4)-RND 4050 PRINT USING U$,O1; : IF O3% THEN V(0)=V(0)+1 : T$(V(0))=";!"+U$+"!"+CVTF$(O1) 4060 IF P3=2 THEN 4250 4080 IF N(7)=1 THEN P5=P5+O1 : P6=P6+O1^2 4110 NEXT J7 4120 NEXT J6 4130 PRINT : IF O3% THEN V(0)=V(0)+1 : T$(V(0))=" " 4140 NEXT L 4150 ! NOW HANDLE COSTS 4160 L3=D(9) : L4=D(10) 4180 GOSUB 1200 : P1=Q(L3,L4) : P4=N(6)+N(7) : P3=2 4220 IF P1<=0 THEN 4250 4230 PRINT"COSTS FOR THIS RUN ="; : IF O3% THEN V(0)=V(0)+1 : T$(V(0))=";COSTS FOR THIS RUN =" 4240 GOTO 2460 4250 X(4)=Q(D(11),D(12)) : PRINT : PRINT"." 4267 V(1)=X9 : V(2)=Q0 : V(3)=P5 : V(4)=P6 : V(5)=D2 : V(6)=Q2 : V(7)=M2 : V(8)=N : V(9)=A8 : V(10)=A9 : V(11)=J 4270 O2$=SYS(CHR$(7%)) : O2$=SYS(CHR$(8%)+O2$+"!2000") : O2$=A1$(0%) : CLOSE 1%,2% : CHAIN O2$+"WESS" 14 4280 END