def evaluateWindowsByRadius(probabilityPath, geoRadius):
    # Initialize
    print 'Evaluating windows with %s meter radius...' % geoRadius
    scanInformation = probability_store.Information(probabilityPath)
    multispectralImage, panchromaticImage, actualGeoCenters, windowPixelDimensions = scanInformation.getPackage()
    geoDiameter = float(geoRadius) * 2
    # Get predictedGeoCenters
    predictedPixelCenters = probability_store.loadPredictedPixelCenters(probabilityPath, windowPixelDimensions)
    predictedGeoCenters = multispectralImage.convertPixelLocationsToGeoLocations(predictedPixelCenters)
    # Get
    actualNotPredictedCenters = point_process.extractBadLocations(geoDiameter, actualGeoCenters, predictedGeoCenters)
    predictedNotActualCenters = point_process.extractBadLocations(geoDiameter, predictedGeoCenters, actualGeoCenters)
    # Count
    actual = len(actualGeoCenters)
    predicted = len(predictedGeoCenters)
    actualNotPredicted = len(actualNotPredictedCenters)
    predictedNotActual = len(predictedNotActualCenters)
    actualAndPredicted = len(actualGeoCenters) - actualNotPredicted
    predictedAndActual = len(predictedGeoCenters) - predictedNotActual
    return {
        'evaluation radius in meters': geoRadius,
        'actual count': actual,
        'predicted count': predicted,
        'actual not predicted count': actualNotPredicted,
        'predicted not actual count': predictedNotActual,
        'predicted and actual count': predictedAndActual,
        'actual and predicted count': actualAndPredicted,
        'pNa/p': predictedNotActual / float(predicted) if predicted else None,
        'aNp/a': actualNotPredicted / float(actual) if actual else None,
        'precision': predictedAndActual / float(predicted) if predicted else None,
        'recall': actualAndPredicted / float(actual) if actual else None,
    }
def evaluateWindowsByRegions(probabilityPath, regionPixelFrames):
    # Load
    scanInformation = probability_store.Information(probabilityPath)
    # Initialize
    multispectralImage, panchromaticImage, actualGeoCenters, windowPixelDimensions = scanInformation.getPackage()
    regionCount = len(regionPixelFrames)
    regionLabels_actual = numpy.zeros(regionCount)
    pixelCenters_actual = multispectralImage.convertGeoLocationsToPixelLocations(actualGeoCenters)
    regionLabels_predicted = numpy.zeros(len(regionPixelFrames))
    pixelCenters_predicted = probability_store.loadPredictedPixelCenters(probabilityPath, windowPixelDimensions)
    # Build machines
    pointMachine_actual = point_process.PointMachine(pixelCenters_actual, 'INTEGER')
    pointMachine_predicted = point_process.PointMachine(pixelCenters_predicted, 'INTEGER')
    # For each region,
    print 'Evaluating windows by region...'
    for regionIndex, regionPixelFrame in enumerate(regionPixelFrames):
        # Determine actual label
        regionLabels_actual[regionIndex] = 1 if pointMachine_actual.getPointsInsideFrame(regionPixelFrame) else 0
        # Determine predicted label
        regionLabels_predicted[regionIndex] = 1 if pointMachine_predicted.getPointsInsideFrame(regionPixelFrame) else 0
        # Show feedback
        if regionIndex % 100 == 0:
            view.printPercentUpdate(regionIndex, len(regionPixelFrames))
    # Show feedback
    view.printPercentFinal(len(regionPixelFrames))
    # Compute
    truePositive = sum((regionLabels_actual == 1) * (regionLabels_predicted == 1))
    trueNegative = sum((regionLabels_actual == 0) * (regionLabels_predicted == 0))
    falsePositive = sum((regionLabels_actual == 0) * (regionLabels_predicted == 1))
    falseNegative = sum((regionLabels_actual == 1) * (regionLabels_predicted == 0))
    actualPositive = sum(regionLabels_actual == 1)
    actualNegative = sum(regionLabels_actual == 0)
    # Count
    actualCount = sum(regionLabels_actual)
    predictedCount = sum(regionLabels_predicted)
    # Return
    return {
        'region count': regionCount,
        'true positive count': truePositive,
        'true positive rate': truePositive / float(actualPositive) if actualPositive else None,
        'true negative count': trueNegative,
        'false positive count': falsePositive,
        'false positive rate': falsePositive / float(actualNegative) if actualNegative else None,
        'false negative count': falseNegative,
        'actual positive count': actualCount,
        'predicted positive count': predictedCount,
        'precision': truePositive / float(predictedCount) if predictedCount else None,
        'recall': truePositive / float(actualCount) if actualCount else None,
    }