PROCEDURE ComputeCurvChainAvgDist(
    READONLY a, b: PZSymbolChain.T;
    trimEnds : BOOLEAN;
    cutDist: LONGREAL;
    VAR (*OUT*) avgDist : LONGREAL;
    VAR (*OUT*) nMatched: CARDINAL;
    VAR (*OUT*) match: REF PZMatch.T;
  ) =
  BEGIN
    PZSymbolChain.Match(
      a, b, 
      skipCost := 2.0d0 * cutDist, (* !!! Deveria ser outra formula... *)
      removeUnmatchedEnds := trimEnds,
      avgCost := avgDist, nMatched := nMatched, match := match
    );
    WITH 
      nm = NUMBER(match^),
      La = FLOAT(match[nm-1][0] - match[0][0] + 1, LONGREAL),
      Lb = FLOAT(match[nm-1][1] - match[0][1] + 1, LONGREAL)
    DO 
      avgDist := 0.5d0 * (totDist + 0.1d-8) / (La + Lb + 1.0d-10);
    END;
  END ComputeCurvChainAvgDist;




 
<* UNUSED *> 
PROCEDURE ComputeOldInitialCandidates(
     READONLY chain : ARRAY OF REF PZSymbolChain.T; 
     cutDist : LONGREAL;
     <* UNUSED *> minSize: CARDINAL;
    ): REF CandidateList =
  VAR 
    c : REF CandidateList;  
    n : CARDINAL := 0; 
    matched: BOOLEAN;
 BEGIN 
    WITH
      nr = NUMBER(chain) 
    DO 
      c := NEW(REF CandidateList, nr * ExpectedMatchesPerCurve);
      FOR ka := 0 TO nr-1 DO 
        WITH a = chain[ka]^, ma = NUMBER(a) DO
          FOR kb := ka+1 TO nr-1 DO 
            WITH b = chain[kb]^, mb = NUMBER(b) DO
              FOR ia := 0 TO ma-1 DO 
                FOR ib := 0 TO mb-1 DO 
                  WITH
                    abm = PZSymbol.Dist(a[(ia-1) MOD ma], b[(ib+1) MOD mb], TRUE),
                    abo = PZSymbol.Dist(a[ia], b[ib], TRUE),
                    abp = PZSymbol.Dist(a[(ia+1) MOD ma], b[(ib-1) MOD mb], TRUE)
                  DO
                    matched := 
                      FLOAT(abm, LONGREAL) <= Alpha*cutDist AND 
                      FLOAT(abo, LONGREAL) <= cutDist  AND 
                      FLOAT(abp, LONGREAL) <= Alpha*cutDist
                  END;
                  IF  matched THEN  
                    IF n >= NUMBER(c^) THEN 
                      WITH ct  = NEW(REF CandidateList, n * 2) DO 
                        SUBARRAY(ct^, 0, n) := SUBARRAY(c^, 0, n);
                        c := ct; 
                      END;
                    END;  
                    WITH 
                      s = c[n],
                      sa = s.int[0],
                      sb = s.int[1]
                    DO 
                      sa.k := ka; sb.k := kb;
                      (* !!! Deveria juntar segmentos vizinhos *)
                      sa.i := ReduceSampleIndex(FLOAT(ia,LONGREAL) - Delta, ma); 
                      sa.j := ReduceSampleIndex(FLOAT(ia,LONGREAL) + Delta, ma);
                      sb.i := ReduceSampleIndex(FLOAT(ib,LONGREAL) - Delta, mb); 
                      sb.j := ReduceSampleIndex(FLOAT(ib,LONGREAL) + Delta, mb);
                    END;
                    INC(n);
                  END;
                END; 
              END;   
            END;
          END; 
        END;   
      END;
      WITH ct = NEW(REF CandidateList,n) DO
        ct^ :=  SUBARRAY(c^, 0, n);
        RETURN ct
      END;
    END;
  END ComputeOldInitialCandidates;
 

