anchor.diff:    return result;
   }
   
  -/// Compute and print the app-device coverage.
  -void computeAndReportCoverage(CoverageMatrix coverageMatrix) {
  +/// Compute the percentage of reachable app-device paths and app-device
  +/// coverage score.  Return null if coverage matrix is null.
  +CoverageScore computeCoverageScore(CoverageMatrix coverageMatrix) {
     if (coverageMatrix == null) {
       printError('Coverage matrix is null');
  -    return;
  -  }
  -
  +    return null;
  +  }
     List<List<int>> matrix = coverageMatrix.matrix;
     int rowNum = matrix.length;
     int colNum = matrix[0].length;
  
positive.code:     = _countNumberInCoverageMatrix(matrix, (int e) => e != cannotBeCovered);
    int coveredCombinationNum
      = _countNumberInCoverageMatrix(matrix, (int e) => e > isNotCovered);
    StringBuffer scoreReport = new StringBuffer();
    NumberFormat percentFormat = new NumberFormat('%##.0#', 'en_US');
    scoreReport.writeln('App-Device Path Coverage (ADPC) score:');
    double reachableCoverageScore = reachableCombinationNum / totalPathNum;
    scoreReport.writeln(
      'Reachable ADPC score: ${percentFormat.format(reachableCoverageScore)}, '
      'defined by #reachable / #total.'
    );
    double coveredCoverageScore
      = coveredCombinationNum / reachableCombinationNum;
    scoreReport.writeln(
      'Covered ADPC score: ${percentFormat.format(coveredCoverageScore)}, '
      'defined by #covered / #reachable.'
    );
    print(scoreReport.toString());
  }
  
  const String legend =
  
negative.code:     }
    );
    printLegend();
    printCoverageScore(
      computeCoverageScore(coverageMatrix)
    );
  }
  
  void printMatrix(String title, CoverageMatrix coverageMatrix, f(int e)) {
  