Когда возникает зацикливание формулы вычисления оценок ?

Когда возникает зацикливание формулы вычисления оценок ?

от Виталий Лавров -
Количество ответов: 8
Изображение пользователя Эксперт по Moodle

moodle 3.5.4

Столкнулись со странным эффектом - при попытке оценить задание в одном из курсов  система задумывается на 3 минуты (max_execution_time = 180) и выдает окошко "undefined". Оценка при этом записывается.

Выяснилось, что оно зацикливается в lib/gradelib.php:grade_regrade_final_grades()

Я сделал просто - ограничил число циклов в grade_regrade_final_grades() (1000 циклов должно хватать IMHO).

После этого я зашел в раздел "Оценки", где moodle мне радостно заявила "Ошибка! Вероятна циклическая ссылка или неверная формула расчета", после чего проблема с оценкой задания исчезла!

Вопрос - как правильно пофикисить эту проблему? Нет ли возможности сначала проверить корректность формул расчета оценок, а потом уже оценивать? 

Я пока не совсем понимаю, как удалось создать эту ситуацию.

Сейчас заплатка выглядит так:

diff --git a/lib/gradelib.php b/lib/gradelib.php
index e87b15b..5acf55e 100644
--- a/lib/gradelib.php
+++ b/lib/gradelib.php
@@ -1189,6 +1189,7 @@ function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null,
     $updatedids = array();
     $gids     = array_keys($grade_items);
     $failed = 0;
+    $ccount = 1000; # count($gids)*2 + 1;
 
     while (count($finalids) < count($gids)) { // work until all grades are final or error found
         foreach ($gids as $gid) {
@@ -1273,7 +1274,8 @@ function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null,
             }
         }
 
-        if (count($finalids) == 0) {
+        $ccount--;
+        if (count($finalids) == 0 || $ccount < 0) {
            $failed++;
         } else {
             $failed = 0;


В ответ на Виталий Лавров

Re: Когда возникает зацикливание формулы вычисления оценок ?

от Alexandre Scherbyna -

Тут РНР ни при чем. Допустим, у вас в журнале есть две оценки А и В. Вы можете их вычислять как угодно, например, А=В+1. Но если вы напишете, предположим, В=А/2, то для вычисления А и В придется решать систему двух уравнений с двумя неизвестными. Moodle решать уравнения не умеет. Отсюда и ошибка - циклическая ссылка: А вычисляется через В, а В вычисляется через А.

Когда пишите формулы, то справа от знака равенства должны стоять только ИЗВЕСТНЫЕ переменные. 

В ответ на Alexandre Scherbyna

Re: Когда возникает зацикливание формулы вычисления оценок ?

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle

php тут не при чем. Меня не обрадовала реакция moodle в данной ситуации.

Неужели на эти грабли до сих пор никто не наступал ?

Когда пишите формулы, то справа от знака равенства должны стоять только ИЗВЕСТНЫЕ переменные. 

Т.е. сценарий может быть такой: пишем формулу с оценками нескольких заданий, потом одно из заданий удаляем и получаем проблему при оценивании ?

Если этот баг легко воспроизводится, то его можно будет оформить на багтрекере.



В ответ на Виталий Лавров

Re: Когда возникает зацикливание формулы вычисления оценок ?

от Alexandre Scherbyna -

Проблемы бывают разные. При удалении заданий зацикливания точно не будет. Не удивлюсь даже если и ошибки не будет, а оценку за отсутствующее задание сисема примет за ноль. А вот формулу с зацикливанием надо еще ухитриться написать.

Представьте себе связь между переменными в виде направленного графа. На основании переменных, расположенных левее, вычисляются пременные, рассположенные правее. Так вот граф может быть какой угодно длинны, но если стрелки в нем идут только слева - направо, то никакого зацикливания нет. Зацикливание - это стрелка справа - налево. Они запрещены!

В ответ на Alexandre Scherbyna

Re: Когда возникает зацикливание формулы вычисления оценок ?

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle

У меня есть полный бекап этого moodle, который был сделан перед обновлением с 3.5.2 на 3.5.4. Как только появится время попробую восстановить его и посмотреть формулы оценок.


В ответ на Виталий Лавров

Re: Когда возникает зацикливание формулы вычисления оценок ?

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

Поищите, возможно он уже есть на багтрекере ))

В ответ на Виталий Лавров

Re: Когда возникает зацикливание формулы вычисления оценок ?

от Vadim Tabunshchik -
Изображение пользователя Developers