(* Create a trivial matching for the center pair: *) oldMatch := NEW(REF PZMatch.T, 1); oldMatch[0] := ctr; maxAdjust := MAX((NA+1) DIV 2, (NB+1) DIV 2) PROCEDURE RefineCandidateMatching( READONLY a, b: PZSymbolChain.T; maxShift: LONG; mp: MismatchOptions; (* Mismatch formula parameters. *) step: LONG; minSteps: NAT; VAR (*OUT*) mismatch : LONG; VAR (*OUT*) length: LONG; VAR (*OUT*) nMatched: NAT; VAR (*OUT*) match: REF PZMatch.T; VAR (*WORK*) XYCost: REF PZMatch.CostMatrix; ) = VAR xCenter, yCenter: NAT; minAvgDist: REF LONGS; BEGIN WITH NA = NUMBER(a), NB = NUMBER(b), ac = (NA-1) DIV 2, bc = (NB-1) DIV 2 DO IF minSteps <= (NA-1)+(NB-1) THEN PZSymbolChain.RefineMatch( a, b, loc := FLOAT(ac + bc, LONG), align := FLOAT(ac - bc, LONG), maxShift := maxShift, mp := mp, step := step, minChainSteps := minSteps, (*OUT*) mismatch := mismatch, (*OUT*) nMatched := nMatched, (*OUT*) match := match, (*OUT*) xCenter := xCenter, (*OUT*) yCenter := yCenter, (*OUT*) minAvgDist := minAvgDist, (*WORK*) XYCost := XYCost ); WITH nm = NUMBER(match^), La = match[nm-1,0] - match[0,0], Lb = match[nm-1,1] - match[0,1] DO length := step * FLOAT(La + Lb, LONG)/2.0d0 END; ELSE mismatch := LAST(LONG); length := 0.0d0; nMatched := 0; match := NEW(REF PZMatch.T, 1); match[0] := PZMatch.Pair{ac,bc} END END END RefineCandidateMatching; (* Expand the input candidate *) FOR j := 0 TO 1 DO WITH sOld = cOld.seg[j], chd = ch[sOld.cvx], step = chd.length / FLOAT(sOld.tot, LONGREAL), extra = CEILING(extraLength / step) DO <* ASSERT NUMBER(chd.c^) = sOld.tot *> sExp[j] := PZSegment.Expand(sOld, extra, extra); chainStep[j] := step <* ASSERT sExp[j].tot = sOld[j].tot *> <* ASSERT sExp[j].cvx = sOld[j].cvx *> <* ASSERT sExp[j].rev = sOld[j].rev *> END END; PROCEDURE ReadAllCVCFiles( chainPrefix : TEXT; nChains, band: CARDINAL; ): REF ARRAY OF PZSymbolChain.ReadData = <* FATAL Rd.Failure *> BEGIN WITH ch = NEW(REF ARRAY OF PZSymbolChain.ReadData, nChains ) DO FOR i := 0 TO nChains-1 DO WITH chainTag = Fmt.Pad(Fmt.Int(i), 4, '0'), bandTag = Fmt.Pad(Fmt.Int(band), 3, '0'), fileName = chainTag & "/" & chainPrefix & "-" & chainTag & "-f" & bandTag & "-c-u.cvc", rd = FileRd.Open(fileName), data = PZSymbolChain.Read(rd) DO ch[i] := data; Rd.Close(rd); END; END; RETURN ch; END; END ReadAllCVCFiles; 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;