(* Last edited on 1999-08-05 19:03:39 by hcgl *) PROCEDURE TrimAndPackCandidate( READONLY cand: PZCandidate.T; READONLY match: PZMatch.T; mismatch: LONGREAL; length: LONGREAL; nMatched: CARDINAL; step: LONGREAL; ): PZCandidate.T = VAR t: ARRAY [0..1] OF PZSegment.T; (* Matched segments *) BEGIN WITH nm = NUMBER(match), rpm = PZMatch.Pack(match) DO (* Trim the candidate "cand" to the matched part: *) FOR j := 0 TO 1 DO WITH sj = cand.seg[j], tj = t[j] DO tj := sj; IF sj.rev THEN tj.ini := (sj.ini + sj.len - 1 - match[nm-1][j]) MOD sj.tot ELSE tj.ini := (sj.ini + match[0][j]) MOD sj.tot; END; tj.len := match[nm-1][j] - match[0][j] + 1; END; END; (* Output the trimmed candidate with the encoded matching: *) RETURN PZCandidate.T{ seg := t, mismatch := mismatch, length := length, matched := FLOAT(nMatched, LONGREAL) * step, pm := PZMatch.AdjustPacked(rpm, cand.seg, t) } END END TrimAndPackCandidate; PROCEDURE FmtMatchedRange( READONLY seg: PZSegment.T; m: CARDINAL; iniMatch, finMatch: CARDINAL; reversed: BOOLEAN; ): TEXT = VAR mIni, mFin: CARDINAL; BEGIN WITH wr = NEW(TextWr.T).init() DO IF reversed THEN mIni := m - 1 - finMatch + seg.ini; mFin := m - 1 - iniMatch + seg.ini; ELSE mIni := iniMatch + seg.ini; mFin := finMatch + seg.ini END; Wr.PutText(wr, " [" & Fmt.Int(mIni)); Wr.PutText(wr, ".." & Fmt.Int(mFin) & "]"); RETURN TextWr.ToText(wr) END END FmtMatchedRange; , ma = NUMBER(cha.c^), mb = NUMBER(chb.c^), na = (cNew.seg[0].fin - cNew.seg[0].ini) MOD ma, nb = (cNew.seg[1].fin - cNew.seg[1].ini) MOD mb <* ASSERT NUMBER(ca)>0 *> <* ASSERT NUMBER(cb)>0 *> IF reverse THEN PZLR3Chain.Reverse(cb) END; aOldSeg = cOld.seg[0], cha = ch[aOldSeg.cvx], ma = NUMBER(cha.c^), aStep = chLength[aOldSeg.cvx] / FLOAT(nSamples, LONGREAL), aNewSeg := ExpandSegment(aOldSeg, ma, aStep, o.extraLength), bOldSeg = cOld.seg[1], chb = ch[bOldSeg.cvx], mb = NUMBER(chb.c^), bStep = chLength[bOldSeg.cvx] / FLOAT(mb, LONGREAL), bExtra = CEILING(o.extraLength / bStep), rnb = (bOldSeg.fin - bOldSeg.ini) MOD mb + 1, nb = MIN(rnb + 2*bExtra, mb), bStretch = (nb - rnb) DIV 2, ib = (bOldSeg.ini - bStretch) MOD mb, fb = (ib + nb) MOD mb, PROCEDURE ReadAllFLCFiles( chainPrefix : TEXT; nChains, band: CARDINAL; ): REF ARRAY OF ChainData = BEGIN WITH ch = NEW(REF ARRAY OF ChainData, 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.flc", rd = FileRd.Open(fileName) DO Wr.PutText(stderr, fileName & "\n"); WITH d = PZLR3Chain.Read(rd) DO ch[i] := ChainData{ cmt := d.cmt, length := PZLR3Chain.Length(d.c^, 0, LAST(d.c^)), c := d.c } END; Rd.Close(rd); END; END; RETURN ch; END; END ReadAllFLCFiles; PROCEDURE DisplaceChain( READONLY c: PZLR3Chain.T; displace: LONGREAL ): REF PZLR3Chain.T = BEGIN IF displace > 0.0d0 THEN WITH u = PZGeo.CalculateDir(c[0], c[LAST(c)]), mt = PZGeo.BuildMatrixT(-u[1]*displace, u[0]*displace) DO RETURN PZLR3Chain.Map(c, mt); END; ELSE RETURN PZLR3Chain.Map(c, Identity()); END; END DisplaceChain; d := 0.0d0; i:= 0; REPEAT INC(i); d := Dist(q[(i+s) MOD n] , q[(i+s-1) MOD n]) + d; UNTIL d > length OR i = n; PROCEDURE ComputeRandomSubFloatChain ( READONLY c: FloatChain; length: LONGREAL; VAR reg : Reg): REF FloatChain = VAR sc : REF FloatChain; BEGIN WITH n = NUMBER(c), r = NEW(Random.Default).init(), i = r.integer(0,n-1) DO sc := GetSubChain(c,length,i,reg); RETURN sc; END; END ComputeRandomSubFloatChain;