RAMSES | Systems Ecology | |
Examples (Random)
Documentation
Reference
Downloads
Contact
MacMETH DM AuxLib SciLib EasyMW MW ISIS RMS Shell RMS Extras RASS |
||
Example: Random Screen DumpSource CodeMODULE Random; (* A.Fischlin 30/6/86, 8/4/99 *) FROM DMLanguage IMPORT SetLanguage, Language; FROM DMMenus IMPORT Menu, Command, AccessStatus, Marking, InstallAbout, InstallMenu, InstallCommand, InstallAliasChar, Separator, InstallSeparator, InstallQuitCommand, DisableCommand, EnableCommand, ChangeCommandText; FROM DMWindows IMPORT Window, notExistingWindow, WindowKind, ScrollBars, CloseAttr, ZoomAttr, WFFixPoint, WindowFrame, CreateWindow, AutoRestoreProc, DummyRestoreProc, GetWindowFrame, WindowExists, RemoveWindow; FROM DMWindIO IMPORT SelectForOutput, ScaleUC, UCDot, UCFrame, SetPen, CellHeight, CellWidth, EraseUCFrameContent, BackgroundWidth, BackgroundHeight, SetPos, WriteReal, Write, WriteString, WriteLn, EraseContent; FROM DMMaster IMPORT MouseHandlers, AddMouseHandler, AddSetupProc, RunDialogMachine, DialogMachineTask; FROM DMEntryForms IMPORT FormFrame, WriteLabel, DefltUse, CardField, RadioButtonID, DefineRadioButtonSet, RadioButton, UseEntryForm; FROM DMAlerts IMPORT WriteMessage, ShowAlert; FROM Randoms IMPORT Seed, GetZ, U, SetMultiplier; (************************************) (*##### About this program #####*) (************************************) PROCEDURE AboutProc; BEGIN SetPos(2,1); WriteString(" RANDOM"); WriteLn; WriteString(" Die Erzeugung von Pseudozufallszahlen"); WriteLn; WriteString(" (c) Andreas Fischlin, ETHZ"); WriteLn; WriteString(" 08/April/1999"); WriteLn; WriteLn; WriteString(" This program may be freely copied as long"); WriteLn; WriteString(" as it is not used for commercial purposes"); WriteLn; END AboutProc; (******************************************) (*##### DM referencing variables #####*) (******************************************) VAR myMenu: Menu; makeWindows, randGens, oneDot, setPars, seed, clear, quit: Command; graphW: Window; wf: WindowFrame; dataW: Window; (***************************************************************) (*##### program states and state transition procedure #####*) (***************************************************************) TYPE MachineStates = (noWind, withWindsNoRandGen, withWindsAndRandGen); VAR curDMState: MachineStates; PROCEDURE SetDMState(s: MachineStates); BEGIN CASE s OF noWind: IF WindowExists(graphW) THEN RemoveWindow(graphW) END; IF WindowExists(dataW) THEN RemoveWindow(dataW) END; EnableCommand(myMenu, makeWindows); DisableCommand(myMenu, randGens); DisableCommand(myMenu, oneDot); EnableCommand(myMenu, setPars); EnableCommand(myMenu, seed); DisableCommand(myMenu, clear); | withWindsNoRandGen: DisableCommand(myMenu, makeWindows); EnableCommand(myMenu, randGens); EnableCommand(myMenu, oneDot); ChangeCommandText(myMenu,randGens, "Starte kont. Zufallszahlengeneration"); EnableCommand(myMenu, setPars); EnableCommand(myMenu, seed); EnableCommand(myMenu, clear); | withWindsAndRandGen: DisableCommand(myMenu, makeWindows); EnableCommand(myMenu, randGens); ChangeCommandText(myMenu,randGens, "Stoppe kont. Zufallszahlengeneration"); DisableCommand(myMenu, oneDot); DisableCommand(myMenu, setPars); DisableCommand(myMenu, seed); EnableCommand(myMenu, clear); (* SelectForOutput(graphW); EraseUCFrameContent; *) END(*CASE*); curDMState:= s; END SetDMState; (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *) MODULE AdHocGenerator; (**************************************************) EXPORT AdHocU, SetParams, GetParams, AdHocSeed, adHocSeed0, AdHocGetZ; CONST adHocSeed0 = 30000; VAR z: CARDINAL; A,M: CARDINAL; PROCEDURE SetParams(multiplier,modulus: CARDINAL); BEGIN A:= multiplier; M:= modulus; END SetParams; PROCEDURE GetParams(VAR multiplier,modulus: CARDINAL); BEGIN multiplier:= A; modulus:= M; END GetParams; PROCEDURE AdHocU(): REAL; BEGIN z:= A*z MOD M; RETURN FLOAT(z)/FLOAT(M) END AdHocU; PROCEDURE AdHocSeed(z0: CARDINAL); BEGIN z:= z0; END AdHocSeed; PROCEDURE AdHocGetZ(VAR zz: LONGINT); BEGIN zz:= z; END AdHocGetZ; BEGIN AdHocSeed(adHocSeed0); SetParams(7,31); END AdHocGenerator; (*****************************************************) (**********************************************************) (*##### Global objects and some ouput procedures #####*) (**********************************************************) CONST seed0 = 1D; VAR x,y: REAL; z1,z2: LONGINT; curU: PROCEDURE (): REAL; curGetZ: PROCEDURE (VAR LONGINT); PROCEDURE ResetGlobVars; BEGIN x:= 0.0; y:= 0.0; curGetZ(z1); z2:= 0D; END ResetGlobVars; PROCEDURE ResetRandGen; BEGIN Seed(seed0); AdHocSeed(adHocSeed0); ResetGlobVars; END ResetRandGen; PROCEDURE Clear(u: Window); BEGIN SelectForOutput(u); EraseContent; END Clear; PROCEDURE ScaleGraph; CONST m = 35; VAR wf: WindowFrame; lm,bm: CARDINAL; lmlab,bmlab: INTEGER; BEGIN GetWindowFrame(graphW,wf); wf.x:= m; wf.y:= m; wf.w:= wf.w - 7*m DIV 4; wf.h:= wf.h - 7*m DIV 4; SelectForOutput(graphW); ScaleUC(wf,0.0,1.0,0.0,1.0); UCFrame; GetWindowFrame(graphW,wf); bm:= m - CellHeight(); bmlab:= bm; bmlab:= bmlab-CellHeight() DIV 3; SetPen(m,bm); Write("0"); SetPen(wf.w-3*m DIV 4-CellWidth()*2 DIV 3,bm); Write("1"); SetPen((wf.w) DIV 2,bmlab); Write("X"); lm:= m-(3*CellWidth() DIV 2); lmlab:= lm; lmlab:= lmlab-CellWidth() DIV 2; SetPen(lm,m); Write("0"); SetPen(lm,wf.h-3*m DIV 4-CellHeight()*2 DIV 3); Write("1"); SetPen(lmlab,(wf.h) DIV 2); Write("Y"); END ScaleGraph; PROCEDURE DocDotData(u: Window); CONST le = 8; dig = 5; PROCEDURE WriteLongInt(x: LONGINT; n: CARDINAL); VAR i,c: CARDINAL; x0: LONGCARD; a: ARRAY [0..11] OF CHAR; BEGIN (*WriteLongInt*) i := 0; x0 := ABS(x); REPEAT c := x0 MOD 10D; a[i] := CHAR(ORD("0") + c); x0 := x0 DIV 10D; INC(i) UNTIL x0 = 0D; IF x < 0D THEN a[i] := "-"; INC(i) END ; WHILE n > i DO DEC(n); Write(" ") END ; REPEAT DEC(i); Write(a[i]) UNTIL i = 0 END WriteLongInt; BEGIN (*DocDotData*) SelectForOutput(u); EraseContent; SetPos(1,6); WriteString("Z(k)"); SetPos(2,1); WriteLongInt(z1,14); SetPos(3,1); WriteLongInt(z2,14); SetPos(1,19); WriteString("U(k)"); SetPos(2,15); WriteString("X: "); WriteReal(x,le,dig); SetPos(3,15); WriteString("Y: "); WriteReal(y,le,dig); END DocDotData; (*******************************) (*##### Menu commands #####*) (*******************************) (*--------------------------------*) (*===== "Oeffne Fenster" =====*) (*--------------------------------*) PROCEDURE MakeWindows; BEGIN ResetGlobVars; wf.x:= 25; wf.y:= 25; wf.w:= 250; wf.h:= 250; CreateWindow(graphW, GrowOrShrinkOrDrag,WithoutScrollBars, WithCloseBox,WithoutZoomBox,bottomLeft,wf, 'Pseudozufallszahlen', AutoRestoreProc); ScaleGraph; wf.x:= wf.x + wf.w + 25; wf.y:= wf.y + wf.h DIV 2; wf.w:= 190; wf.h:= 3*CellHeight(); CreateWindow(dataW, FixedSize,WithoutScrollBars, WithCloseBox,WithoutZoomBox,bottomLeft,wf, 'Letzter Punkt', DocDotData); SetDMState(withWindsNoRandGen); END MakeWindows; (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *) (*------------------------------------------------------*) (*===== "Starte kont. Zufallszahlengeneration" =====*) (*------------------------------------------------------*) PROCEDURE GenADot; FORWARD; PROCEDURE ToggleRandGen; PROCEDURE ProdRandGens; BEGIN (*ProdRandGens*) REPEAT GenADot; DialogMachineTask; UNTIL curDMState <> withWindsAndRandGen END ProdRandGens; BEGIN (*ToggleRandGen*) IF curDMState = withWindsNoRandGen THEN SetDMState(withWindsAndRandGen); ProdRandGens; ELSIF curDMState = withWindsAndRandGen THEN SetDMState(withWindsNoRandGen); END(*IF*); END ToggleRandGen; (*--------------------------------------------*) (*===== "Erzeuge zwei Zufallszahlen" =====*) (*--------------------------------------------*) PROCEDURE GenADot; BEGIN x:= curU(); curGetZ(z1); y:= curU(); curGetZ(z2); SelectForOutput(graphW); UCDot(x,y); DocDotData(dataW); END GenADot; (*-------------------------------------------*) (*===== "Loesche und setze zurueck" =====*) (*-------------------------------------------*) PROCEDURE ClearResetAndScale; VAR wf: WindowFrame; BEGIN IF curDMState = withWindsAndRandGen THEN SetDMState(withWindsNoRandGen); END(*IF*); Clear(graphW); ScaleGraph; Clear(dataW); ResetRandGen; DocDotData(dataW); END ClearResetAndScale; (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *) (*-----------------------------------------------*) (*===== "Waehle Zufallszahlengenerator" =====*) (*-----------------------------------------------*) VAR usePreDefGen: BOOLEAN; PROCEDURE SetGenerator; VAR bf: FormFrame; ok: BOOLEAN; A,M: CARDINAL; genSet,adHocGen,preDefGen: RadioButtonID; BEGIN WriteLabel(2,5,"Linearer Kongruenter Zufallszahlengenerator:"); WriteLabel(3,5," z(k+1) = A * z(k) MOD M"); DefineRadioButtonSet(genSet); WriteLabel(5,6,"Vordefinierter multiplikativer Generator der Form"); RadioButton(preDefGen,6,6,"z(k+1) = 950706376 * z(k) MOD (2**31 - 1)"); WriteLabel(8,6,"Definierbarer Generator:"); RadioButton(adHocGen,9,6,"z(k+1) = A * z(k) MOD M"); IF usePreDefGen THEN genSet:= preDefGen ELSE genSet:= adHocGen END; GetParams(A,M); WriteLabel(10,9,"A = "); CardField(10,13,7,A,useAsDeflt,0,MAX(CARDINAL)); WriteLabel(10,25,"M = "); CardField(10,29,7,M,useAsDeflt,0,MAX(CARDINAL)); bf.x:= 0; bf.y:= -1 (*display dialog window in middle of screen*); bf.lines:= 13; bf.columns:= 50; UseEntryForm(bf,ok); IF ok THEN IF genSet = preDefGen THEN usePreDefGen:= TRUE; curU:= U; curGetZ:= GetZ ELSE usePreDefGen:= FALSE; curU:= AdHocU; curGetZ:= AdHocGetZ; SetParams(A,M); END; IF curDMState <> noWind THEN ClearResetAndScale ELSE ResetRandGen; END(*IF*); END(*IF*); END SetGenerator; (*------------------------------*) (*===== "Setze 'Seed'" =====*) (*------------------------------*) PROCEDURE SetSeed; VAR bf: FormFrame; ok: BOOLEAN; seed: CARDINAL; BEGIN WriteLabel(2,10,"seed = "); IF usePreDefGen THEN seed:= seed0 ELSE seed:= adHocSeed0 END; CardField(2,18,7,seed,useAsDeflt,1,MAX(CARDINAL)); bf.x:= 0; bf.y:= -1 (*display dialog window in middle of screen*); bf.lines:= 6; bf.columns:= 40; UseEntryForm(bf,ok); IF ok THEN IF usePreDefGen THEN Seed(seed) ELSE AdHocSeed(seed) END; ResetGlobVars; IF curDMState <> noWind THEN Clear(dataW); DocDotData(dataW); END(*IF*); END(*IF*); END SetSeed; (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *) (*----------------------------------*) (*===== "Programm beenden" =====*) (*----------------------------------*) PROCEDURE Quitting(VAR reallyQuit: BOOLEAN); BEGIN reallyQuit:= TRUE; SetDMState(noWind) END Quitting; (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *) (*******************************) (*##### MouseHandlers #####*) (*******************************) PROCEDURE EnableMenuIfWindowCloses(u: Window); BEGIN SetDMState(noWind); END EnableMenuIfWindowCloses; PROCEDURE RescaleIfWindowIsRedefined(u: Window); BEGIN ClearResetAndScale; END RescaleIfWindowIsRedefined; (******************************************************) (*##### Initialization when DM starts to run #####*) (******************************************************) PROCEDURE SettingUp; BEGIN curU:= U; curGetZ:= GetZ; usePreDefGen:= TRUE; ResetRandGen; SetMultiplier(397204094D); (* the 5 best in reverse order *) SetMultiplier(1343714438D); SetMultiplier(62089911D); SetMultiplier(1226874159D); SetMultiplier(742938285D); (* the best *) SetMultiplier(950706376D); (* one to test/use *) SetMultiplier(950706376D); graphW:= notExistingWindow; dataW:= notExistingWindow; SetDMState(noWind); END SettingUp; (***********************************************************) (*##### Initialization of DM before it is running #####*) (***********************************************************) PROCEDURE DMInitialization; CONST highPrio = 0; BEGIN SetLanguage(German); InstallAbout("Ueber | RANDOM ...",300,140,AboutProc); InstallMenu(myMenu,'Kontrolle',enabled); InstallCommand(myMenu, makeWindows,"Oeffne Fenster", MakeWindows, enabled, unchecked); InstallSeparator(myMenu,line); InstallCommand(myMenu,randGens,"Starte kont. Zufallszahlengeneration", ToggleRandGen,disabled,unchecked); InstallAliasChar(myMenu,randGens,"S"); InstallCommand(myMenu,oneDot,"Erzeuge zwei Zufallszahlen", GenADot,disabled,unchecked); InstallAliasChar(myMenu,oneDot,"p"); InstallCommand(myMenu,clear,"Loesche und setze zurueck", ClearResetAndScale,disabled,unchecked); InstallSeparator(myMenu,line); InstallCommand(myMenu,setPars,"Waehle Zufallszahlengenerator", SetGenerator,disabled,unchecked); InstallCommand(myMenu,seed,"Setze 'Seed'", SetSeed,disabled,unchecked); InstallQuitCommand("Programm beenden",Quitting,0C); AddSetupProc(SettingUp,highPrio); AddMouseHandler(CloseWindow,EnableMenuIfWindowCloses,highPrio); AddMouseHandler(RedefWindow,RescaleIfWindowIsRedefined,highPrio); END DMInitialization; BEGIN DMInitialization; RunDialogMachine END Random. |
||
|
||
RAMSES@env.ethz.ch | Last modified 1/12/22 | [Top of page] |