PROCEDURE ReadAllChains( chainDir: TEXT; chainPrefix : TEXT; nCurves, band: NAT; ): ChainSetData = VAR sigma: LONG := -1.0d0; BEGIN WITH chainR = NEW(REF Chains, nCurves), chain = chainR^, sel = PZProc.SelectAll(nCurves)^, data = PZSymbolChain.ReadAll( prefix := chainPrefix, band := band, extension := ".cvc", sel := sel, dir := chainDir ) DO FOR i := 0 TO LAST(sel) DO IF sel[i] THEN WITH di = data[i] DO chain[i] := di.c; <* ASSERT di.sigma > 0.0d0 *> IF sigma < 0.0d0 THEN sigma := di.sigma ELSE <* ASSERT sigma = di.sigma *> END END END END; RETURN ChainSetData{ chain := chainR, sigma := sigma } END; END ReadAllChains; PROCEDURE RangesOverlap(i1, f1, i2, f2: CARDINAL; <*UNUSED*> m: CARDINAL): BOOLEAN = (* TRUE iff the intervals "[i1..f1]" and "[i2..f2]" overlap. Takes into account the fact that both intervals have been reduced modulo "m". *) VAR ir, fr: CARDINAL; BEGIN RETURN PZProc.IntersectIntervals(i1, f1, i2, f2, (*OUT*) ir, fr) END RangesOverlap; IF pp.keywordPresent("-fractality") THEN o.fractality := pp.getNextLongReal(0.5d0, 2.0d0) ELSE o.fractality := 1.0d0 END; PROCEDURE ReduceSampleIndex(x: LONGREAL; m: CARDINAL): LONGREAL = (* Reduces the sample index "x" modulo the sample count "m". *) BEGIN WITH fm = FLOAT(m, LONGREAL) DO WHILE x < 0.0d0 DO x := x + fm END; WHILE x >= fm DO x := x - fm END; RETURN x END END ReduceSampleIndex; PROCEDURE SymbolDist(a, b: PZSymbol.T; minCurvature: LONGREAL): LONGREAL = BEGIN WITH va = FLOAT(+PZSymbol.ToInt(a), LONGREAL), vb = FLOAT(-PZSymbol.ToInt(b), LONGREAL), pa = MAX(0.0d0, minCurvature - ABS(va)), pb = MAX(0.0d0, minCurvature - ABS(vb)) DO RETURN ABS(va - vb) + pa + pb END; END SymbolDist; PROCEDURE ComputeMeanStepLength( READONLY chain: ARRAY OF PZSymbolChain.ReadData; ): LONGREAL = BEGIN RETURN chain[0].length / FLOAT(chain[0].samples, LONGREAl) END ComputeMeanStepLength; PROCEDURE GetNumSamples(READONLY chain: ARRAY OF REF PZSymbolChain.T): REF ARRAY OF CARDINAL = BEGIN WITH nCurves = NUMBER(chain), m = NEW(REF ARRAY OF CARDINAL, nCurves) DO FOR i := 0 TO nCurves-1 DO m[i] := NUMBER(chain[i]^) END; RETURN m END END GetNumSamples; Wr.PutText(stderr, "\n" & Fmt.Int(ia) & ".." & Fmt.Int(k MOD ma)); Wr.PutText(stderr, " count = " & Fmt.Int(count));