Skip to content

Commit

Permalink
Refactor: make scorer part of evaluator as helper
Browse files Browse the repository at this point in the history
  • Loading branch information
fushar committed May 1, 2017
1 parent 416ea0f commit 7be5a0e
Show file tree
Hide file tree
Showing 67 changed files with 854 additions and 1,147 deletions.
36 changes: 17 additions & 19 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,26 +45,26 @@ set(INCLUDE
include/tcframe/evaluator.hpp
include/tcframe/evaluator/BatchEvaluator.hpp
include/tcframe/evaluator/Evaluator.hpp
include/tcframe/evaluator/EvaluationResult.hpp
include/tcframe/evaluator/EvaluatorConfig.hpp
include/tcframe/evaluator/EvaluatorFactory.hpp
include/tcframe/evaluator/GenerationResult.hpp
include/tcframe/evaluator/scorer.hpp
include/tcframe/evaluator/scorer/CustomScorer.hpp
include/tcframe/evaluator/scorer/DiffScorer.hpp
include/tcframe/evaluator/scorer/Scorer.hpp
include/tcframe/evaluator/scorer/ScoringResult.hpp
include/tcframe/generator.hpp
include/tcframe/generator/GenerationException.hpp
include/tcframe/generator/Generator.hpp
include/tcframe/generator/GeneratorConfig.hpp
include/tcframe/generator/GeneratorLogger.hpp
include/tcframe/generator/TestCaseGenerator.hpp
include/tcframe/grade.hpp
include/tcframe/grade/EvaluationResult.hpp
include/tcframe/grade/ScoringResult.hpp
include/tcframe/grade/TestCaseGrade.hpp
include/tcframe/grade/TestCaseGradeCreator.hpp
include/tcframe/grade/Verdict.hpp
include/tcframe/grader.hpp
include/tcframe/grader/Grader.hpp
include/tcframe/grader/GraderConfig.hpp
include/tcframe/grader/GraderLogger.hpp
include/tcframe/grader/TestCaseGrader.hpp
include/tcframe/grading_style.hpp
include/tcframe/grading_style/GradingStyle.hpp
include/tcframe/io_manipulator.hpp
include/tcframe/io_manipulator/GridIOSegmentManipulator.hpp
include/tcframe/io_manipulator/IOManipulator.hpp
Expand All @@ -88,11 +88,6 @@ set(INCLUDE
include/tcframe/runner/RunnerLogger.hpp
include/tcframe/runner/RunnerLoggerFactory.hpp
include/tcframe/runner/SlugParser.hpp
include/tcframe/scorer.hpp
include/tcframe/scorer/CustomScorer.hpp
include/tcframe/scorer/DiffScorer.hpp
include/tcframe/scorer/Scorer.hpp
include/tcframe/scorer/ScoringResultParser.hpp
include/tcframe/spec.hpp
include/tcframe/spec/constraint.hpp
include/tcframe/spec/constraint/Constraint.hpp
Expand Down Expand Up @@ -136,6 +131,10 @@ set(INCLUDE
include/tcframe/util/NotImplementedException.hpp
include/tcframe/util/StringUtils.hpp
include/tcframe/util/optional.hpp
include/tcframe/verdict.hpp
include/tcframe/verdict/Verdict.hpp
include/tcframe/verdict/VerdictCreator.hpp
include/tcframe/verdict/VerdictStatus.hpp
include/tcframe/verifier.hpp
include/tcframe/verifier/ConstraintsVerificationResult.hpp
include/tcframe/verifier/MultipleTestCasesConstraintsVerificationResult.hpp
Expand All @@ -147,13 +146,13 @@ set(TEST_UNIT
test/unit/tcframe/mock.hpp
test/unit/tcframe/evaluator/BatchEvaluatorTests.cpp
test/unit/tcframe/evaluator/MockEvaluator.hpp
test/unit/tcframe/evaluator/scorer/MockScorer.hpp
test/unit/tcframe/generator/GeneratorLoggerTests.cpp
test/unit/tcframe/generator/GeneratorTests.cpp
test/unit/tcframe/generator/MockGenerator.hpp
test/unit/tcframe/generator/MockGeneratorLogger.hpp
test/unit/tcframe/generator/MockTestCaseGenerator.hpp
test/unit/tcframe/generator/TestCaseGeneratorTests.cpp
test/unit/tcframe/grading_style/MockGradingStyleFactory.hpp
test/unit/tcframe/io_manipulator/GridIOSegmentManipulatorTests.cpp
test/unit/tcframe/io_manipulator/IOManipulatorTests.cpp
test/unit/tcframe/io_manipulator/LineIOSegmentManipulatorTests.cpp
Expand All @@ -171,8 +170,6 @@ set(TEST_UNIT
test/unit/tcframe/runner/RunnerTests.cpp
test/unit/tcframe/runner/RunnerLoggerTests.cpp
test/unit/tcframe/runner/SlugParserTests.cpp
test/unit/tcframe/scorer/MockScorer.hpp
test/unit/tcframe/scorer/ScoringResultParserTests.cpp
test/unit/tcframe/spec/constraint/ConstraintSuiteBuilderTests.cpp
test/unit/tcframe/spec/core/BaseTestSpecTests.cpp
test/unit/tcframe/spec/core/BaseProblemSpecTests.cpp
Expand All @@ -194,7 +191,6 @@ set(TEST_UNIT
test/unit/tcframe/spec/variable/VariableTests.cpp
test/unit/tcframe/spec/variable/VectorTests.cpp
test/unit/tcframe/spec/variable/WhitespaceManipulatorTests.cpp
test/unit/tcframe/grade/TestCaseGradeCreatorTests.cpp
test/unit/tcframe/grader/GraderTests.cpp
test/unit/tcframe/grader/GraderLoggerTests.cpp
test/unit/tcframe/grader/MockGrader.hpp
Expand All @@ -204,6 +200,8 @@ set(TEST_UNIT
test/unit/tcframe/util/OptionalTests.cpp
test/unit/tcframe/util/StringUtilsTests.cpp
test/unit/tcframe/util/TestUtils.hpp
test/unit/tcframe/verdict/MockVerdictCreator.hpp
test/unit/tcframe/verdict/VerdictCreatorTests.cpp
test/unit/tcframe/verifier/MockVerifier.hpp
test/unit/tcframe/verifier/VerifierTests.cpp
)
Expand All @@ -218,8 +216,8 @@ target_link_libraries(test_unit
)

set(TEST_INTEGRATION
test/integration/tcframe/scorer/CustomScorerIntegrationTests.cpp
test/integration/tcframe/scorer/DiffScorerIntegrationTests.cpp
test/integration/tcframe/evaluator/scorer/CustomScorerIntegrationTests.cpp
test/integration/tcframe/evaluator/scorer/DiffScorerIntegrationTests.cpp
)

add_executable(test_integration ${INCLUDE} ${TEST_INTEGRATION})
Expand Down
8 changes: 4 additions & 4 deletions docs/topic-guides/grading.rst
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Here is a sample output of a local grading for problems with subtasks.

.. sourcecode:: bash

Grading...
Local grading with solution command: './alt_solution'...

[ SAMPLE TEST CASES ]
k-product_sample_1: Accepted
Expand All @@ -64,7 +64,7 @@ Here is a sample output of a local grading for problems with subtasks.
[ TEST GROUP 3 ]
k-product_3_1: Accepted
k-product_3_2: Wrong Answer
* Diff:
* scorer: Diff:
(expected) [line 01] 11
(received) [line 01] 12

Expand All @@ -90,7 +90,7 @@ and here is for problems without subtasks

.. sourcecode:: bash

Grading...
Local grading with solution command: './alt_solution'...

[ SAMPLE TEST CASES ]
k-product_sample_1: Accepted
Expand All @@ -100,7 +100,7 @@ and here is for problems without subtasks
k-product_2: Accepted
k-product_3: Accepted
k-product_4: Wrong Answer
* Diff:
* scorer Diff:
(expected) [line 01] 11
(received) [line 01] 12

Expand Down
5 changes: 5 additions & 0 deletions include/tcframe/evaluator.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#pragma once

#include "tcframe/evaluator/BatchEvaluator.hpp"
#include "tcframe/evaluator/EvaluationResult.hpp"
#include "tcframe/evaluator/Evaluator.hpp"
#include "tcframe/evaluator/EvaluatorConfig.hpp"
#include "tcframe/evaluator/EvaluatorFactory.hpp"
#include "tcframe/evaluator/GenerationResult.hpp"
#include "tcframe/evaluator/scorer.hpp"
58 changes: 42 additions & 16 deletions include/tcframe/evaluator/BatchEvaluator.hpp
Original file line number Diff line number Diff line change
@@ -1,28 +1,63 @@
#pragma once

#include <map>
#include <string>

#include "EvaluationResult.hpp"
#include "Evaluator.hpp"
#include "EvaluatorConfig.hpp"
#include "tcframe/grade.hpp"
#include "GenerationResult.hpp"
#include "scorer.hpp"
#include "tcframe/os.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verdict.hpp"

using std::map;
using std::string;

namespace tcframe {

class BatchEvaluator : public Evaluator {
private:
OperatingSystem* os_;
VerdictCreator* verdictCreator_;
Scorer* scorer_;

public:
virtual ~BatchEvaluator() {}

BatchEvaluator(OperatingSystem* os)
: os_(os) {}
BatchEvaluator(OperatingSystem* os, VerdictCreator* verdictCreator, Scorer* scorer)
: os_(os)
, verdictCreator_(verdictCreator)
, scorer_(scorer) {}

EvaluationResult evaluate(
const string& inputFilename,
const string& outputFilename,
const EvaluatorConfig& config) {

map<string, ExecutionResult> executionResults;
Verdict verdict;

GenerationResult generationResult = generate(inputFilename, EVALUATION_OUT_FILENAME, config);
executionResults["solution"] = generationResult.executionResult();

if (generationResult.verdict()) {
verdict = generationResult.verdict().value();
} else {
ScoringResult scoringResult = score(inputFilename, outputFilename);
executionResults["scorer"] = scoringResult.executionResult();
verdict = scoringResult.verdict();
}

return EvaluationResult(verdict, executionResults);
}

GenerationResult generate(
const string& inputFilename,
const string& outputFilename,
const EvaluatorConfig& config) {

ExecutionRequestBuilder request = ExecutionRequestBuilder()
.setCommand(config.solutionCommand())
.setInputFilename(inputFilename)
Expand All @@ -36,21 +71,12 @@ class BatchEvaluator : public Evaluator {
}

ExecutionResult executionResult = os_->execute(request.build());
return createResult(executionResult);
optional<Verdict> verdict = verdictCreator_->fromExecutionResult(executionResult);
return GenerationResult(verdict, executionResult);
}

private:
static EvaluationResult createResult(const ExecutionResult& executionResult) {
EvaluationResultBuilder result;
result.setExecutionResult(executionResult);

if (executionResult.exceededCpuLimits()) {
result.setVerdict(Verdict::tle());
} else if (!executionResult.isSuccessful()) {
result.setVerdict(Verdict::rte());
}

return result.build();
ScoringResult score(const string& inputFilename, const string& outputFilename) {
return scorer_->score(inputFilename, outputFilename, EVALUATION_OUT_FILENAME);
}
};

Expand Down
40 changes: 40 additions & 0 deletions include/tcframe/evaluator/EvaluationResult.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once

#include <map>
#include <string>
#include <tuple>

#include "tcframe/os.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verdict.hpp"

using std::map;
using std::string;
using std::tie;

namespace tcframe {

struct EvaluationResult {
private:
Verdict verdict_;
map<string, ExecutionResult> executionResults_;

public:
EvaluationResult(const Verdict& verdict, const map<string, ExecutionResult>& executionResults)
: verdict_(verdict)
, executionResults_(executionResults) {}

const Verdict& verdict() const {
return verdict_;
}

const map<string, ExecutionResult>& executionResults() const {
return executionResults_;
}

bool operator==(const EvaluationResult& o) const {
return tie(verdict_, executionResults_) == tie(o.verdict_, o.executionResults_);
}
};

}
13 changes: 11 additions & 2 deletions include/tcframe/evaluator/Evaluator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,32 @@

#include <string>

#include "EvaluationResult.hpp"
#include "EvaluatorConfig.hpp"
#include "tcframe/grade.hpp"
#include "GenerationResult.hpp"
#include "scorer.hpp"

using std::string;

namespace tcframe {

class Evaluator {
public:
static constexpr const char* EVALUATION_FILENAME = "_evaluation.out";
static constexpr const char* EVALUATION_OUT_FILENAME = "_evaluation.out";

virtual ~Evaluator() {}

virtual EvaluationResult evaluate(
const string& inputFilename,
const string& outputFilename,
const EvaluatorConfig& config) = 0;

virtual GenerationResult generate(
const string& inputFilename,
const string& outputFilename,
const EvaluatorConfig& config) = 0;

virtual ScoringResult score(const string& inputFilename, const string& outputFilename) = 0;
};

}
33 changes: 33 additions & 0 deletions include/tcframe/evaluator/EvaluatorFactory.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#pragma once

#include <string>

#include "BatchEvaluator.hpp"
#include "Evaluator.hpp"
#include "scorer.hpp"
#include "tcframe/os.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verdict.hpp"

using std::string;

namespace tcframe {

class EvaluatorFactory {
public:
virtual ~EvaluatorFactory() {}

virtual Evaluator* createBatch(OperatingSystem* os, const optional<string>& scorerCommand) {
VerdictCreator* verdictCreator = new VerdictCreator();
Scorer* scorer;
if (scorerCommand) {
scorer = new CustomScorer(os, verdictCreator, scorerCommand.value());
} else {
scorer = new DiffScorer(os);
}

return new BatchEvaluator(os, verdictCreator, scorer);
}
};

}
36 changes: 36 additions & 0 deletions include/tcframe/evaluator/GenerationResult.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#pragma once

#include <tuple>

#include "tcframe/os.hpp"
#include "tcframe/util.hpp"
#include "tcframe/verdict.hpp"

using std::tie;

namespace tcframe {

struct GenerationResult {
private:
optional<Verdict> verdict_;
ExecutionResult executionResult_;

public:
GenerationResult(const optional<Verdict>& verdict, const ExecutionResult& executionResult)
: verdict_(verdict)
, executionResult_(executionResult) {}

const optional<Verdict>& verdict() const {
return verdict_;
}

const ExecutionResult& executionResult() const {
return executionResult_;
}

bool operator==(const GenerationResult& o) const {
return tie(verdict_, executionResult_) == tie(o.verdict_, o.executionResult_);
}
};

}

0 comments on commit 7be5a0e

Please sign in to comment.