protected function add_unit_processing(ImsQtiWriter $response_processing, $question)
 {
     $show_units = $question->options->showunits;
     if ($show_units == self::UNIT_HIDE || $show_units == self::UNIT_READONLY) {
         return null;
     }
     $response = self::UNIT;
     $outcome = self::UNIT_MULTIPLIER;
     $result = $response_processing->add_responseCondition();
     $if = $result->add_responseIf();
     $if->add_isNull()->add_variable($response);
     $if->add_setOutcomeValue($outcome)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 1);
     $result->add_responseElse()->add_setOutcomeValue($outcome)->add_mapResponse($response);
     return $result;
 }
 protected function add_overall_feedback_processing(ImsQtiWriter $processing, $question)
 {
     $processing->add_standard_response_map_response(ImsQtiWriter::RESPONSE, self::PARTIAL_SCORE);
     $result = $processing->add_responseCondition();
     $if = $result->add_responseIf();
     $lte = $if->add_lte();
     $lte->add_variable(self::PARTIAL_SCORE);
     $lte->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 0);
     $if->add_setOutcomeValue(self::OVERALL_FEEDBACK)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, self::FEEDBACK_INCORRECT);
     $elseif = $result->add_responseElseIf();
     $gte = $elseif->add_gte();
     $gte->add_variable(self::PARTIAL_SCORE);
     $gte->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, $question->defaultgrade);
     $elseif->add_setOutcomeValue(self::OVERALL_FEEDBACK)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, self::FEEDBACK_CORRECT);
     $else = $result->add_responseElse();
     $else->add_setOutcomeValue(self::OVERALL_FEEDBACK)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, self::FEEDBACK_PARTIALY_CORRECT);
     return $result;
 }
 protected function add_add_penalty(ImsQtiWriter $processing, $question, $input_id = ImsQtiWriter::SCORE, $score_id = ImsQtiWriter::SCORE, $penalty_id = self::PENALTY)
 {
     if (!$this->has_penalty($question)) {
         return null;
     }
     $result = $processing->add_setOutcomeValue($score_id);
     $sum = $result->add_subtract();
     $sum->add_variable($input_id);
     $sum->add_variable($penalty_id);
     $result = $processing->add_responseCondition();
     $if = $result->add_responseIf();
     $lt = $if->add_lt();
     $lt->add_variable($input_id);
     $lt->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 0);
     $if->add_setOutcomeValue($input_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 0);
     return $result;
 }
 public function add_score_processing(ImsQtiWriter $response_processing, $question)
 {
     $result = $response_processing->add_responseCondition();
     $response_id = $this->response_id($question);
     $score_id = $this->score_id($question);
     $if = $result->add_responseIf();
     $if->add_isNull()->add_variable($response_id);
     $if->add_setOutcomeValue($score_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 0);
     foreach ($question->options->answers as $answer) {
         $score = $answer->fraction * $question->defaultgrade;
         $elseif = $result->add_responseElseIf();
         if (ShortanswerUtil::is_regex($answer->answer)) {
             $pattern = ShortanswerUtil::translate_regex($answer->answer, $question->options->usecase);
             $elseif->add_patternMatch($pattern)->add_variable($response_id);
         } else {
             $match = $elseif->add_stringMatch($question->options->usecase);
             $match->add_variable($response_id);
             $match->add_baseValue(Qti::BASETYPE_STRING, $answer->answer);
         }
         $elseif->add_setOutcomeValue($score_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, $score);
         /*
         $score = $answer->fraction * $question->defaultgrade;
         $pattern = ShortanswerUtil::translate_regex($answer->answer, $question->options->usecase);
         $elseif = $result->add_responseElseIf();
         $elseif->add_patternMatch($pattern)->add_variable($response_id);
         $elseif->add_setOutcomeValue($score_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, $score);
         */
     }
     $else = $result->add_responseElse();
     $else->add_setOutcomeValue($score_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 0);
     return $result;
 }
 public function add_score_processing(ImsQtiWriter $response_processing, $question)
 {
     $result = $response_processing->add_responseCondition();
     $response_id = $this->response_id($question);
     $outcome_id = $this->score_id($question);
     $if = $result->add_responseIf();
     $if->add_isNull()->add_variable($response_id);
     $if->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 0);
     foreach ($question->options->answers as $answer) {
         if (is_numeric($answer->answer)) {
             //could be set to *
             $score = $answer->fraction * $question->defaultgrade;
             $tolerance_mode = ImsQtiWriter::TOLERANCE_MODE_ABSOLUTE;
             $elseif = $result->add_responseElseIf();
             $equal = $elseif->add_equal($tolerance_mode, $answer->tolerance, $answer->tolerance);
             $equal->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, $answer->answer);
             $equal->add_variable($response_id);
             $elseif->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, $score);
         }
     }
     $else = $result->add_responseElse();
     $else->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_FLOAT, 0);
     return $result;
 }
 protected function add_answer_feedback_processing(ImsQtiWriter $response_processing, $question)
 {
     $result = $response_processing->add_responseCondition();
     $response_id = ImsQtiWriter::RESPONSE;
     $outcome_id = ImsQtiWriter::FEEDBACK;
     $if = $result->add_responseIf();
     $if->add_isNull()->add_variable($response_id);
     $if->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, 'FEEDBACK_ID_ELSE');
     $count = 0;
     foreach ($question->options->answers as $answer) {
         $id = 'FEEDBACK_ID_' . ++$count;
         $formula_serializer = new CalculatedFormulaSerializer();
         if ($formula = $formula_serializer->parse($answer->answer)) {
             //tolerance mode geometric not supported by QTI
             $tolerance_mode = $answer->tolerancetype == 1 ? ImsQtiWriter::TOLERANCE_MODE_RELATIVE : ImsQtiWriter::TOLERANCE_MODE_ABSOLUTE;
             $elseif = $result->add_responseElseIf();
             $equal = $elseif->add_equal($tolerance_mode, $answer->tolerance, $answer->tolerance);
             $equal->add_flow($formula);
             $product = $equal->add_product();
             $product->add_variable($response_id);
             $product->add_variable(self::UNIT_MULTIPLIER);
             $elseif->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, $id);
         }
     }
     $else = $result->add_responseElse();
     $else->add_setOutcomeValue($outcome_id)->add_baseValue(ImsQtiWriter::BASETYPE_IDENTIFIER, 'FEEDBACK_ID_ELSE');
     return $result;
 }