MODULE TestOpt EXPORTS Main; IMPORT Energy, MixedEnergy, ElectEnergy, ExcenEnergy, PotenEnergy, Triang; IMPORT Wr, Scan, ParseParams, ParseEnergyParams, RTMisc, Thread; FROM OptShape IMPORT PraxOpt, SimplexOpt; FROM Stdio IMPORT stderr; TYPE Options = RECORD inFile: TEXT; (* Input file name (minus ".top" extension) *) outFile: TEXT; (* Output file name prefix *) praxis: BOOLEAN; (* To active Praxis otimization *) simplex: BOOLEAN; (* To active Simplex otimization *) NRows: CARDINAL; (* Number of line in initial Simplex *) flatten: BOOLEAN; (* TRUE to apply "flatten" smoothing heuristic on Simplex*) spread: BOOLEAN; (* TRUE to apply the "spread" smoothing heuristic on Simp.*) NumSmth: CARDINAL := 0; (* Number of smoothing iterations to the Praxis *) MaxCalls: CARDINAL; (* Maximum number of calls to "f" in the Praxis *) me: MixedEnergy.T; (* Energy to minimize *) END; PROCEDURE DefaultEnergy(): MixedEnergy.T = CONST MaxTerms = 3; VAR e: ARRAY [0..MaxTerms-1] OF Energy.T; w: ARRAY [0..MaxTerms-1] OF REAL; BEGIN e[0] := ElectEnergy.New(0.5); w[0] := 0.001; e[1] := ExcenEnergy.New(); w[1] := 1.0; e[2] := PotenEnergy.New(); w[2] := 1.0; RETURN MixedEnergy.New(e, w) END DefaultEnergy; PROCEDURE Main() = VAR NRows: CARDINAL := 0; BEGIN WITH o = GetOptions(), t = Triang.ReadTopTri(o.inFile) DO IF o.praxis THEN PraxOpt(t, o.me, o.outFile, o.NumSmth, o.MaxCalls) END; IF o.simplex THEN IF o.NRows = 0 THEN NRows := 3*t.NV + 1 ELSE NRows := o.NRows END; SimplexOpt(t, o.me, o.flatten, o.spread, o.outFile, o.NumSmth, NRows, o.MaxCalls) END; Triang.PrintTopTri(t, o.outFile) END END Main; PROCEDURE GetOptions (): Options = <* FATAL Thread.Alerted, Wr.Failure *> VAR o: Options; BEGIN TRY ParseParams.BeginParsing(stderr); ParseParams.GetKeyword("-inFile"); o.inFile := ParseParams.GetNext(); ParseParams.GetKeyword("-outFile"); o.outFile := ParseParams.GetNext(); o.praxis := ParseParams.KeywordPresent("-praxis"); o.simplex := ParseParams.KeywordPresent("-simplex"); IF (o.praxis = o.simplex) THEN Wr.PutText(stderr, "Minimization type is wrong\n"); RAISE Scan.BadFormat END; IF ParseParams.KeywordPresent("-NRows") THEN o.NRows := ParseParams.GetNextInt(0, 10000); ELSE o.NRows := 0 END; IF ParseParams.KeywordPresent("-NumSmth") THEN o.NumSmth := ParseParams.GetNextInt(0, 10000); ELSE o.NumSmth := 0 END; IF o.NumSmth # 0 THEN o.flatten := ParseParams.KeywordPresent("-flatten"); o.spread := ParseParams.KeywordPresent("-spread"); IF NOT (o.flatten OR o.spread) THEN Wr.PutText(stderr, "Smoothing mode not specified\n"); RAISE Scan.BadFormat END; END; IF ParseParams.KeywordPresent("-MaxCalls") THEN o.MaxCalls := ParseParams.GetNextInt(0, 10000); ELSE o.MaxCalls := 1000 END; o.me := ParseEnergyParams.Mixed(); IF o.me = NIL THEN o.me := DefaultEnergy(); END; ParseParams.EndParsing(); EXCEPT | Scan.BadFormat => Wr.PutText(stderr, "Usage: TestOpt\\\n"); Wr.PutText(stderr, " -inFile -outFile \\\n"); Wr.PutText(stderr, " { -praxis ! -simplex [ -NRows ] }\\\n"); Wr.PutText(stderr, " [ -NumSmth { -flatten | -spread }]\\\n"); Wr.PutText(stderr, " [ -MaxCalls ]\\\n"); ParseEnergyParams.PrintHelp(stderr); RTMisc.Exit (1); END; RETURN o END GetOptions; BEGIN Main() END TestOpt.