use of uk.ac.ed.ph.jqtiplus.value.Value in project openolat by klemens.
the class CorrectResponsesUtil method getCorrectOrderedIdentifierResponses.
public static final List<Identifier> getCorrectOrderedIdentifierResponses(AssessmentItem assessmentItem, Interaction interaction) {
List<Identifier> correctAnswers = new ArrayList<>(5);
ResponseDeclaration responseDeclaration = assessmentItem.getResponseDeclaration(interaction.getResponseIdentifier());
if (responseDeclaration != null && responseDeclaration.getCorrectResponse() != null) {
CorrectResponse correctResponse = responseDeclaration.getCorrectResponse();
if (correctResponse.getCardinality().isOneOf(Cardinality.ORDERED)) {
List<FieldValue> values = correctResponse.getFieldValues();
Value value = FieldValue.computeValue(Cardinality.ORDERED, values);
if (value instanceof OrderedValue) {
OrderedValue multiValue = (OrderedValue) value;
multiValue.forEach(oValue -> {
if (oValue instanceof IdentifierValue) {
IdentifierValue identifierValue = (IdentifierValue) oValue;
Identifier correctAnswer = identifierValue.identifierValue();
correctAnswers.add(correctAnswer);
}
});
}
}
}
return correctAnswers;
}
use of uk.ac.ed.ph.jqtiplus.value.Value in project openolat by klemens.
the class CorrectResponsesUtil method getCorrectIdentifierResponses.
public static final List<Identifier> getCorrectIdentifierResponses(AssessmentItem assessmentItem, Identifier responseIdentifier) {
List<Identifier> correctAnswers = new ArrayList<>(5);
ResponseDeclaration responseDeclaration = assessmentItem.getResponseDeclaration(responseIdentifier);
if (responseDeclaration != null && responseDeclaration.getCorrectResponse() != null) {
CorrectResponse correctResponse = responseDeclaration.getCorrectResponse();
if (correctResponse.getCardinality().isOneOf(Cardinality.SINGLE)) {
List<FieldValue> values = correctResponse.getFieldValues();
Value value = FieldValue.computeValue(Cardinality.SINGLE, values);
if (value instanceof IdentifierValue) {
IdentifierValue identifierValue = (IdentifierValue) value;
Identifier correctAnswer = identifierValue.identifierValue();
correctAnswers.add(correctAnswer);
}
} else if (correctResponse.getCardinality().isOneOf(Cardinality.MULTIPLE)) {
Value value = FieldValue.computeValue(Cardinality.MULTIPLE, correctResponse.getFieldValues());
if (value instanceof MultipleValue) {
MultipleValue multiValue = (MultipleValue) value;
for (SingleValue sValue : multiValue.getAll()) {
if (sValue instanceof IdentifierValue) {
IdentifierValue identifierValue = (IdentifierValue) sValue;
Identifier correctAnswer = identifierValue.identifierValue();
correctAnswers.add(correctAnswer);
}
}
}
}
}
return correctAnswers;
}
use of uk.ac.ed.ph.jqtiplus.value.Value in project openolat by klemens.
the class AssessmentItemBuilder method extractMinScore.
private void extractMinScore() {
OutcomeDeclaration outcomeDeclaration = assessmentItem.getOutcomeDeclaration(MINSCORE_IDENTIFIER);
if (outcomeDeclaration != null) {
DefaultValue defaultValue = outcomeDeclaration.getDefaultValue();
if (defaultValue != null) {
Value minScoreValue = defaultValue.evaluate();
if (minScoreValue instanceof FloatValue) {
Double minScore = new Double(((FloatValue) minScoreValue).doubleValue());
minScoreBuilder = new ScoreBuilder(minScore, outcomeDeclaration);
}
}
}
}
use of uk.ac.ed.ph.jqtiplus.value.Value in project openolat by klemens.
the class MaximaOperator method evaluateSelf.
@Override
protected Value evaluateSelf(OpenOLATExtensionPackage jqtiExtensionPackage, ProcessingContext context, Value[] childValues, int depth) {
AttributeList attributes = getAttributes();
Attribute<?> attrValue = attributes.get("value");
String code = (String) attrValue.getValue();
log.debug("Performing scriptRule: code={}, simplify={}" + code);
/* Pass variables to Maxima */
final QtiMaximaProcess qtiMaximaProcess = jqtiExtensionPackage.obtainMaximaSessionForThread();
for (int i = 0; i < childValues.length; i++) {
Value childValue = childValues[i];
String val = getValue(childValue);
code = code.replace("$(" + (i + 1) + ")", val);
}
/* Run code */
log.debug("Executing scriptRule code");
try {
qtiMaximaProcess.executeScriptRule(code, true);
} catch (final MaximaTimeoutException e) {
context.fireRuntimeError(this, "A timeout occurred executing the ScriptRule logic. Not setting QTI variables and returing FALSE");
return BooleanValue.FALSE;
} catch (final RuntimeException e) {
context.fireRuntimeError(this, "An unexpected problem occurred while trying to run the scriptRule logic. Not setting QTI variables and returing FALSE");
return BooleanValue.FALSE;
}
/* Read variables back */
log.debug("Reading variables back from Maxima");
/* Run Maxima code and extract result */
log.info("Running code to determine result of MAXIMA operator");
final Class<? extends ValueWrapper> resultClass = GlueValueBinder.getCasReturnClass(ReturnTypeType.FLOAT);
ValueWrapper maximaResult;
try {
maximaResult = qtiMaximaProcess.executeCasProcess(code, true, resultClass);
} catch (final MaximaTimeoutException e) {
context.fireRuntimeError(this, "A timeout occurred executing the CasCondition logic. Returning NULL");
return NullValue.INSTANCE;
} catch (final MathsContentTooComplexException e) {
context.fireRuntimeError(this, "An unexpected problem occurred querying the result of CasProcess, so returning NULL");
return NullValue.INSTANCE;
} catch (final MathAssessBadCasCodeException e) {
context.fireRuntimeError(this, "Your CasProcess code did not work as expected. The CAS input was '" + e.getMaximaInput() + "' and the CAS output was '" + e.getMaximaOutput() + "'. The failure reason was: " + e.getReason());
return NullValue.INSTANCE;
} catch (final QtiMaximaTypeConversionException e) {
context.fireRuntimeError(this, "Your CasProcess code did not produce a result that could be converted into the required QTI type. The CAS input was '" + e.getMaximaInput() + "' and the CAS output was '" + e.getMaximaOutput() + "'");
return NullValue.INSTANCE;
} catch (final RuntimeException e) {
log.warn("Unexpected Maxima failure", e);
context.fireRuntimeError(this, "An unexpected problem occurred while executing this CasProcess");
return BooleanValue.FALSE;
}
/* Bind result */
Value result = GlueValueBinder.casToJqti(maximaResult);
if (result == null) {
context.fireRuntimeError(this, "Failed to convert result from Maxima back to a QTI variable - returning NULL");
return NullValue.INSTANCE;
}
return result;
}
use of uk.ac.ed.ph.jqtiplus.value.Value in project openolat by klemens.
the class QtiNodesExtractor method extractIdentifiersFromCorrectResponse.
public static void extractIdentifiersFromCorrectResponse(CorrectResponse correctResponse, List<Identifier> correctAnswers) {
BaseTypeAndCardinality responseDeclaration = correctResponse.getParent();
if (responseDeclaration.hasCardinality(Cardinality.MULTIPLE)) {
Value value = FieldValue.computeValue(Cardinality.MULTIPLE, correctResponse.getFieldValues());
if (value instanceof MultipleValue) {
MultipleValue multiValue = (MultipleValue) value;
for (SingleValue sValue : multiValue.getAll()) {
if (sValue instanceof IdentifierValue) {
IdentifierValue identifierValue = (IdentifierValue) sValue;
Identifier correctAnswer = identifierValue.identifierValue();
correctAnswers.add(correctAnswer);
}
}
}
} else if (responseDeclaration.hasCardinality(Cardinality.SINGLE)) {
Value value = FieldValue.computeValue(Cardinality.SINGLE, correctResponse.getFieldValues());
if (value instanceof IdentifierValue) {
IdentifierValue identifierValue = (IdentifierValue) value;
correctAnswers.add(identifierValue.identifierValue());
}
}
}
Aggregations