ClippEU passes tests

This commit is contained in:
Filip Gralinski 2016-08-02 09:48:58 +02:00 committed by Filip Gralinski
parent fcc52d6c3a
commit 67f73f420e
5 changed files with 35 additions and 6 deletions

View File

@ -54,7 +54,7 @@ clippingSpecParser = do
rectangle <- rectangleParser
char '/'
margin <- decimal
return $ ClippingSpec pageNo rectangle (extendedRectangle margin rectangle)
return $ ClippingSpec pageNo (smallerRectangle margin rectangle) (extendedRectangle margin rectangle)
possibleWhitespace = many' (satisfy isHorizontalSpace)
@ -65,6 +65,13 @@ extendedRectangle margin (Rectangle (Point x0 y0) (Point x1 y1)) =
Rectangle (Point (x0 `nonNegativeDiff` margin) (y0 `nonNegativeDiff` margin))
(Point (x1 + margin) (y1 + margin))
smallerRectangle :: Int -> Rectangle -> Rectangle
smallerRectangle margin (Rectangle (Point x0 y0) (Point x1 y1)) =
Rectangle (Point (x0 + margin) (y0 + margin))
(Point (x1 `nonNegativeDiff` margin) (y1 `nonNegativeDiff` margin))
nonNegativeDiff x y
| x < y = 0
| otherwise = x - y

View File

@ -35,12 +35,16 @@ import System.FilePath
import Data.Maybe
import qualified Data.List.Split as DLS
import Data.Attoparsec.Text (parseOnly)
import GEval.BLEU
import GEval.Common
import GEval.ClippEU
import GEval.PrecisionRecall
type MetricValue = Double
data Metric = RMSE | MSE | BLEU | Accuracy
data Metric = RMSE | MSE | BLEU | Accuracy | ClippEU
deriving (Show, Read, Eq)
data MetricOrdering = TheLowerTheBetter | TheHigherTheBetter
@ -50,6 +54,7 @@ getMetricOrdering RMSE = TheLowerTheBetter
getMetricOrdering MSE = TheLowerTheBetter
getMetricOrdering BLEU = TheHigherTheBetter
getMetricOrdering Accuracy = TheHigherTheBetter
getMetricOrdering ClippEU = TheHigherTheBetter
defaultOutDirectory = "."
defaultTestName = "test-A"
@ -168,6 +173,17 @@ gevalCore' BLEU = gevalCore'' (Prelude.map Prelude.words . DLS.splitOn "\t" . un
gevalCore' Accuracy = gevalCore'' strip strip hitOrMiss averageC id
where hitOrMiss (x,y) = if x == y then 1.0 else 0.0
gevalCore' ClippEU = gevalCore'' parseClippingSpecs parseClippings matchStep clippeuAgg finalStep
where
parseClippings = controlledParse lineClippingsParser
parseClippingSpecs = controlledParse lineClippingSpecsParser
matchStep (clippingSpecs, clippings) = (maxMatch matchClippingToSpec clippingSpecs clippings,
Prelude.length clippingSpecs,
Prelude.length clippings)
clippeuAgg = CC.foldl clippeuFuse (0, 0, 0)
clippeuFuse (a1, a2, a3) (b1, b2, b3) = (a1+b1, a2+b2, a3+b3)
finalStep counts = f2MeasureOnCounts counts
data SourceItem a = Got a | Done
gevalCore'' :: (Text -> a) -> (Text -> b) -> ((a, b) -> c) -> (Sink c (ResourceT IO) d) -> (d -> Double) -> String -> String -> IO (MetricValue)
@ -210,3 +226,8 @@ getValue (Right (x, reminder)) =
then x
else throw $ UnexpectedData "number expected"
getValue (Left s) = throw $ UnexpectedData s
controlledParse parser t =
case parseOnly parser t of
(Right v) -> v
(Left _) -> throw $ UnexpectedData "cannot parse line"

View File

@ -2,7 +2,7 @@
module GEval.PrecisionRecall(fMeasure, f1Measure, f2Measure, precision, recall,
fMeasureOnCounts, f1MeasureOnCounts, f2MeasureOnCounts,
precisionAndRecall, precisionAndRecallFromCounts)
precisionAndRecall, precisionAndRecallFromCounts, maxMatch)
where
import GEval.Common

View File

@ -84,11 +84,12 @@ main = hspec $ do
r `shouldBe` []
it "parsing specs" $ do
let (Right r) = parseOnly lineClippingSpecsParser " 2/0,0,2,3/5 10/20,30,40,50/10"
r `shouldBe` [ClippingSpec (PageNumber 2) (Rectangle (Point 0 0) (Point 2 3))
r `shouldBe` [ClippingSpec (PageNumber 2) (Rectangle (Point 5 5) (Point 0 0))
(Rectangle (Point 0 0) (Point 7 8)),
ClippingSpec (PageNumber 10) (Rectangle (Point 20 30) (Point 40 50))
ClippingSpec (PageNumber 10) (Rectangle (Point 30 40) (Point 30 40))
(Rectangle (Point 10 20) (Point 50 60))]
it "full test" $ do
runGEvalTest "clippeu-simple" `shouldReturnAlmost` 0.399999999999
neverMatch :: Char -> Int -> Bool
neverMatch _ _ = False