Add --oracle-item-based option
This commit is contained in:
parent
1e74174c0b
commit
9a3a28a813
@ -160,6 +160,7 @@ data GEvalSpecification = GEvalSpecification
|
|||||||
gesTestName :: String,
|
gesTestName :: String,
|
||||||
gesSelector :: Maybe Selector,
|
gesSelector :: Maybe Selector,
|
||||||
gesOutFile :: String,
|
gesOutFile :: String,
|
||||||
|
gesAltOutFiles :: Maybe [String],
|
||||||
gesExpectedFile :: String,
|
gesExpectedFile :: String,
|
||||||
gesInputFile :: String,
|
gesInputFile :: String,
|
||||||
gesMetrics :: [EvaluationScheme],
|
gesMetrics :: [EvaluationScheme],
|
||||||
@ -190,6 +191,7 @@ data GEvalSpecialCommand = Init
|
|||||||
| Diff FilePath | MostWorseningFeatures FilePath
|
| Diff FilePath | MostWorseningFeatures FilePath
|
||||||
| PrintVersion | JustTokenize | Submit
|
| PrintVersion | JustTokenize | Submit
|
||||||
| Validate | ListMetrics
|
| Validate | ListMetrics
|
||||||
|
| OracleItemBased
|
||||||
|
|
||||||
data ResultOrdering = KeepTheOriginalOrder | FirstTheWorst | FirstTheBest
|
data ResultOrdering = KeepTheOriginalOrder | FirstTheWorst | FirstTheBest
|
||||||
|
|
||||||
@ -249,6 +251,7 @@ defaultGEvalSpecification = GEvalSpecification {
|
|||||||
gesTestName = defaultTestName,
|
gesTestName = defaultTestName,
|
||||||
gesSelector = Nothing,
|
gesSelector = Nothing,
|
||||||
gesOutFile = defaultOutFile,
|
gesOutFile = defaultOutFile,
|
||||||
|
gesAltOutFiles = Nothing,
|
||||||
gesExpectedFile = defaultExpectedFile,
|
gesExpectedFile = defaultExpectedFile,
|
||||||
gesInputFile = defaultInputFile,
|
gesInputFile = defaultInputFile,
|
||||||
gesMetrics = [EvaluationScheme defaultMetric []],
|
gesMetrics = [EvaluationScheme defaultMetric []],
|
||||||
|
@ -17,7 +17,8 @@ module GEval.LineByLine
|
|||||||
LineRecord(..),
|
LineRecord(..),
|
||||||
ResultOrdering(..),
|
ResultOrdering(..),
|
||||||
justTokenize,
|
justTokenize,
|
||||||
worstFeaturesPipeline
|
worstFeaturesPipeline,
|
||||||
|
runOracleItemBased
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import GEval.Core
|
import GEval.Core
|
||||||
@ -34,10 +35,11 @@ import Data.Text
|
|||||||
import Data.Text.Encoding
|
import Data.Text.Encoding
|
||||||
import Data.Conduit.Rank
|
import Data.Conduit.Rank
|
||||||
import Data.Maybe (fromMaybe)
|
import Data.Maybe (fromMaybe)
|
||||||
|
import Data.Either (rights)
|
||||||
|
|
||||||
import qualified Data.Vector as V
|
import qualified Data.Vector as V
|
||||||
|
|
||||||
import Data.List (sortBy, sortOn, sort, concat)
|
import Data.List (sortBy, sortOn, sort, concat, maximumBy)
|
||||||
|
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
import Control.Monad.Trans.Resource
|
import Control.Monad.Trans.Resource
|
||||||
@ -84,7 +86,6 @@ parseReferenceEntry :: Text -> (Integer, Text)
|
|||||||
parseReferenceEntry line = (read $ unpack refId, t)
|
parseReferenceEntry line = (read $ unpack refId, t)
|
||||||
where [refId, t] = splitOn "\t" line
|
where [refId, t] = splitOn "\t" line
|
||||||
|
|
||||||
|
|
||||||
runLineByLine :: ResultOrdering -> Maybe String -> GEvalSpecification -> BlackBoxDebuggingOptions -> IO ()
|
runLineByLine :: ResultOrdering -> Maybe String -> GEvalSpecification -> BlackBoxDebuggingOptions -> IO ()
|
||||||
runLineByLine ordering featureFilter spec bbdo = runLineByLineGeneralized ordering spec consum
|
runLineByLine ordering featureFilter spec bbdo = runLineByLineGeneralized ordering spec consum
|
||||||
where consum :: Maybe References -> ConduitT LineRecord Void (ResourceT IO) ()
|
where consum :: Maybe References -> ConduitT LineRecord Void (ResourceT IO) ()
|
||||||
@ -392,6 +393,30 @@ runDiff ordering featureFilter otherOut spec bbdo = runDiffGeneralized ordering
|
|||||||
formatScoreDiff :: Double -> Text
|
formatScoreDiff :: Double -> Text
|
||||||
formatScoreDiff = Data.Text.pack . printf "%f"
|
formatScoreDiff = Data.Text.pack . printf "%f"
|
||||||
|
|
||||||
|
runOracleItemBased :: GEvalSpecification -> IO ()
|
||||||
|
runOracleItemBased spec = runMultiOutputGeneralized spec consum
|
||||||
|
where consum = CL.map picker .| format
|
||||||
|
picker = maximumBy (\(LineRecord _ _ _ _ scoreA) (LineRecord _ _ _ _ scoreB) -> metricCompare metric scoreA scoreB)
|
||||||
|
format = CL.map (encodeUtf8 . formatOutput)
|
||||||
|
.| CC.unlinesAscii
|
||||||
|
.| CC.stdout
|
||||||
|
formatOutput (LineRecord _ _ out _ _) = out
|
||||||
|
metric = gesMainMetric spec
|
||||||
|
|
||||||
|
runMultiOutputGeneralized :: GEvalSpecification -> ConduitT [LineRecord] Void (ResourceT IO) () -> IO ()
|
||||||
|
runMultiOutputGeneralized spec consum = do
|
||||||
|
(inputSource, expectedSource, outSource) <- checkAndGetFilesSingleOut True spec
|
||||||
|
let (Just altOuts) = gesAltOutFiles spec
|
||||||
|
altSourceSpecs' <- mapM (getSmartSourceSpec ((gesOutDirectory spec) </> (gesTestName spec)) "out.tsv") altOuts
|
||||||
|
let altSourceSpecs = rights altSourceSpecs'
|
||||||
|
let sourceSpecs = (outSource:altSourceSpecs)
|
||||||
|
let sources = Prelude.map (gevalLineByLineSource metric mSelector preprocess inputSource expectedSource) sourceSpecs
|
||||||
|
runResourceT $ runConduit $
|
||||||
|
(sequenceSources sources .| consum)
|
||||||
|
where metric = gesMainMetric spec
|
||||||
|
preprocess = gesPreprocess spec
|
||||||
|
mSelector = gesSelector spec
|
||||||
|
|
||||||
runMostWorseningFeatures :: ResultOrdering -> FilePath -> GEvalSpecification -> BlackBoxDebuggingOptions -> IO ()
|
runMostWorseningFeatures :: ResultOrdering -> FilePath -> GEvalSpecification -> BlackBoxDebuggingOptions -> IO ()
|
||||||
runMostWorseningFeatures ordering otherOut spec bbdo = runDiffGeneralized ordering' otherOut spec consum
|
runMostWorseningFeatures ordering otherOut spec bbdo = runDiffGeneralized ordering' otherOut spec consum
|
||||||
where ordering' = forceSomeOrdering ordering
|
where ordering' = forceSomeOrdering ordering
|
||||||
|
@ -8,7 +8,8 @@ module GEval.Metric
|
|||||||
bestPossibleValue,
|
bestPossibleValue,
|
||||||
perfectOutLineFromExpectedLine,
|
perfectOutLineFromExpectedLine,
|
||||||
fixedNumberOfColumnsInExpected,
|
fixedNumberOfColumnsInExpected,
|
||||||
fixedNumberOfColumnsInInput)
|
fixedNumberOfColumnsInInput,
|
||||||
|
metricCompare)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Data.Word
|
import Data.Word
|
||||||
@ -173,6 +174,11 @@ getMetricOrdering MultiLabelLogLoss = TheLowerTheBetter
|
|||||||
getMetricOrdering MultiLabelLikelihood = TheHigherTheBetter
|
getMetricOrdering MultiLabelLikelihood = TheHigherTheBetter
|
||||||
getMetricOrdering (Mean metric) = getMetricOrdering metric
|
getMetricOrdering (Mean metric) = getMetricOrdering metric
|
||||||
|
|
||||||
|
metricCompare :: Metric -> MetricValue -> MetricValue -> Ordering
|
||||||
|
metricCompare metric a b = metricCompare' (getMetricOrdering metric) a b
|
||||||
|
where metricCompare' TheHigherTheBetter a b = a `compare` b
|
||||||
|
metricCompare' TheLowerTheBetter a b = b `compare` a
|
||||||
|
|
||||||
bestPossibleValue :: Metric -> MetricValue
|
bestPossibleValue :: Metric -> MetricValue
|
||||||
bestPossibleValue metric = case getMetricOrdering metric of
|
bestPossibleValue metric = case getMetricOrdering metric of
|
||||||
TheLowerTheBetter -> 0.0
|
TheLowerTheBetter -> 0.0
|
||||||
|
@ -95,6 +95,10 @@ optionsParser = GEvalOptions
|
|||||||
(flag' ListMetrics
|
(flag' ListMetrics
|
||||||
( long "list-metrics"
|
( long "list-metrics"
|
||||||
<> help "List all metrics with their descriptions"))
|
<> help "List all metrics with their descriptions"))
|
||||||
|
<|>
|
||||||
|
(flag' OracleItemBased
|
||||||
|
( long "oracle-item-based"
|
||||||
|
<> help "Generate the best possible output considering outputs given by --out-file and --alt-out-file options (and peeking into the expected file)."))
|
||||||
)
|
)
|
||||||
|
|
||||||
<*> ((flag' FirstTheWorst
|
<*> ((flag' FirstTheWorst
|
||||||
@ -152,6 +156,10 @@ specParser = GEvalSpecification
|
|||||||
<> showDefault
|
<> showDefault
|
||||||
<> metavar "OUT"
|
<> metavar "OUT"
|
||||||
<> help "The name of the file to be evaluated" )
|
<> help "The name of the file to be evaluated" )
|
||||||
|
<*> (optional $ some $ strOption
|
||||||
|
( long "alt-out-file"
|
||||||
|
<> metavar "OUT"
|
||||||
|
<> help "Alternative output file, makes sense only for some options, e.g. --oracle-item-based"))
|
||||||
<*> strOption
|
<*> strOption
|
||||||
( long "expected-file"
|
( long "expected-file"
|
||||||
<> short 'e'
|
<> short 'e'
|
||||||
@ -355,6 +363,9 @@ runGEval''' (Just Validate) _ _ spec _ _ = do
|
|||||||
runGEval''' (Just ListMetrics) _ _ _ _ _ = do
|
runGEval''' (Just ListMetrics) _ _ _ _ _ = do
|
||||||
listMetrics
|
listMetrics
|
||||||
return Nothing
|
return Nothing
|
||||||
|
runGEval''' (Just OracleItemBased) _ _ spec _ _ = do
|
||||||
|
runOracleItemBased spec
|
||||||
|
return Nothing
|
||||||
|
|
||||||
getGraphFilename :: Int -> FilePath -> FilePath
|
getGraphFilename :: Int -> FilePath -> FilePath
|
||||||
getGraphFilename 0 fp = fp
|
getGraphFilename 0 fp = fp
|
||||||
|
@ -445,6 +445,7 @@ main = hspec $ do
|
|||||||
gesTestName = "test-A",
|
gesTestName = "test-A",
|
||||||
gesSelector = Nothing,
|
gesSelector = Nothing,
|
||||||
gesOutFile = "out.tsv",
|
gesOutFile = "out.tsv",
|
||||||
|
gesAltOutFiles = Nothing,
|
||||||
gesExpectedFile = "expected.tsv",
|
gesExpectedFile = "expected.tsv",
|
||||||
gesInputFile = "in.tsv",
|
gesInputFile = "in.tsv",
|
||||||
gesMetrics = [EvaluationScheme Likelihood []],
|
gesMetrics = [EvaluationScheme Likelihood []],
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
A
|
||||||
|
C
|
||||||
|
D
|
||||||
|
D
|
|
@ -0,0 +1,4 @@
|
|||||||
|
D
|
||||||
|
C
|
||||||
|
B
|
||||||
|
A
|
|
@ -0,0 +1,4 @@
|
|||||||
|
B
|
||||||
|
A
|
||||||
|
C
|
||||||
|
A
|
|
1
test/oracle-item-based/oracle-item-based/config.txt
Normal file
1
test/oracle-item-based/oracle-item-based/config.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--metric Accuracy
|
@ -0,0 +1,4 @@
|
|||||||
|
A
|
||||||
|
B
|
||||||
|
C
|
||||||
|
D
|
|
4
test/oracle-item-based/oracle-item-based/test-A/in.tsv
Normal file
4
test/oracle-item-based/oracle-item-based/test-A/in.tsv
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
|
@ -0,0 +1,4 @@
|
|||||||
|
A
|
||||||
|
C
|
||||||
|
C
|
||||||
|
D
|
|
Loading…
Reference in New Issue
Block a user