Написать код для 2dArray

Issue #450 resolved
Former user created an issue

Анализатор получает логическое выражение от переменных i и j Запускает его на массивах четного и нечетного размера и проверяет совпадение. Может делать подсказки, рисуя заполненный массив.

Comments (52)

  1. Prokudin Artem

    Я не совсем понимаю суть задания. Насколько я помню, мне нужно изменить модуль нормализации выражений вот отсюда. Но что означает "логическое выражение от переменных i и j". В описании класса написано : "Analyzing logical expression that work with 2d array "arr" and two indexes "i" and "j". The grade determine on how much cells in this array expressions yield equal result." Можно, если возможно, на примерах показать, что должно быть сделано?

  2. Oleg Sychev repo owner

    Вам не нужна нормализация. Вам нужно тупо вычислить его для каждого элемента двумерного массива (отдельно рассмотреть случаи четного и нечетного размера) и определить, одинаковые ли элементы закрашивают (возвращают истину) оба выражения. Логическое выражение очевидно означает выражение, дающее истину или ложь. В нем могут использоваться индексы строки и столбца i и j - собственно в комменте все сказано. Если непонятно - спрашивайте при встрече.

  3. Prokudin Artem

    Мне нужно работать с версией форка NormaliseExpr или же CppExpression?

  4. Prokudin Artem

    И еще, чем должна отличаться реализация этих классов? В обоих просто переопределить метод accept_expression?

  5. Oleg Sychev repo owner

    Насчет версии форка - гляньте Diff - если в NormaliseExpr затрагивалась основная архитектура вопрос - файлы типа questiontype.php, question.php, edit_cppexpression_form и т.д. - тогда лучше работать с ним, если нет - тогда не важно.

    Насчет классов оценивания и подсказки - вы базовые их классы смотрели? Чем отличается grading_analyzer от hint_analyzer? Там все описано вроде.

  6. Prokudin Artem

    Что должен делать класс array2d_hint ? Я так понимаю, он должен вернуть строку, в которой говорится в чем ошибка с помощью метода render_hint?

  7. Prokudin Artem

    C array2d_grader я вроде разобрался, там нужно переопределить реализацию fitness - функции, не так ли?

  8. Oleg Sychev repo owner

    У подсказки есть три режима, почитайте. В зависимости от режима возвращается подсказка. "Строка" это html - в вашем случае это будут, очевидно, таблицы с цветовым выделением ячеек.

    В грейдере да, там отпределяется степень соответствия от 0 до 1 между двумя ответами, в вашем случае наверное процент совпадающих ячеек.

  9. Prokudin Artem

    Нужно ли рассматривать вариант неквадратных матриц(четная ширина и нечетная высота и т.п.)?

  10. Prokudin Artem

    я так понимаю, что в моем случае подсказка будет SINGLE_INSTANCE_HINT и response_based. И по сути она будет возвращать таблицу с закрашенными ячейками у учителя и студента?

  11. Prokudin Artem

    хотя наверное лучше возвращать только раскрашенные таблицы для студента с разными размерами матриц

  12. Oleg Sychev repo owner

    Там если заметили есть 3 режима подсказки в cppexpression уже: только ответ студента, только ответ преподавателя и совмещенные ответ студента и преподавателя. response_based будут первый и третий режимы, второй нет. SINGLE_INSTANCE_HINT да, только если ошибки не на всех вариантах матриц то показывать надо вариант матрицы с ошибкой. В совмещенном варианте предусмотреть особую раскраску для различий.

  13. Oleg Sychev repo owner

    Я бы советовал сначала сделать скриншоты подсказок и запостить сюда

  14. Prokudin Artem

    я нашел эти режимы в классе hint_from_analyzer. Но я не нашел примеров использования. Безымянный.png Один из этих классов - мой, на другом стоят заглушки. Чем отличаются вообще режимы, в каких случаях какая используется? Для студента и преподавателя используется, как я понял, после окончания теста и должно отображать различия между ответами. Но что делают тогда подсказки отдельно студента и отдельно преподавателя?

  15. Oleg Sychev repo owner

    Нет примеров - никто еще не написал. Но комментарии вроде достаточно подробные. Отображается все после любого ответа - как настроено. Отдельно для студента или преподавателя очевидно рисуют таблицу как она будет выглядеть для выражения студента или преподавателя. Ну, честно говоря режим преподавателя можно не поддерживать в данном случае, потому что в условии рисунок скорее всего и так будет. А вот режим чисто студента надо, как и совмещенный.

  16. Prokudin Artem

    в грэдере есть метод is_need_declaration. Я так понимаю, в моем случае, объявление не нужно?

  17. Prokudin Artem

    И еще, как запустить само по себе вычисление выражения после замены переменных на числа. Я пробовал метод normalize из tree_converter, но он не упрощает их до требуемого уровня. Вычисление что, придется самому писать?

  18. Oleg Sychev repo owner

    Объявление у вас не нужно, т.к. все используемые переменные стандартны для каждого вопроса.

    Вычислять самому, без нормализатора. Это не так уж сложно.

  19. Prokudin Artem

    В где выполнять эти вычисления? В самом 2darray или изменить класс узлов?

  20. Prokudin Artem

    Я решил делать их внутри array2d. Также я думаю, что кроме i и j, следует добавить переменные width и height, чтобы была возможность закрашивать правые и нижние границы массива(ну и взаимодействовать с ними). Потому что без них вообще бессмысленно запускать выражения на разных вариантах массивов, достаточно будет одного.

  21. Oleg Sychev repo owner

    Там есть архитектура, каждый обработчик дерева может задать свои классы узлов для конкретного синтаксического дерева. Ее стоит использовать. С width и height согласен, это лучше чем N и M - сложнее перепутать.

  22. Prokudin Artem

    Ну я нашел в tree_converter массив конвертации из ast в текущее дерево.

    Безымянный.png

    И что, мне тогда нужно создать классы вычислимых узлов и изменить этот массив для работы с этими узлами?

  23. Oleg Sychev repo owner

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

  24. Prokudin Artem

    Ну все, что я нашел - это как раз класс tree_converter, который создает синтаксическое дерево по ast(по вышеуказанной таблице). Это единственная фабрика, что я нашел .

    Вот собственно метод, создающий новые узлы:

    Безымянный.png

    Мб мне его тогда сделать protected и переопределить в потомке? Чтоб работать уже с своей конвертационной матрицей, не затрагивая существующую в tree_converter

  25. Prokudin Artem

    Я тут наткнулся на странное поведение при коммите. Почему-то все изменения слились в одну строку. С чем это может быть связано?

    2018-03-04_13-08-18.png

  26. Oleg Sychev repo owner

    Проверьте настройки переводов строк на компьютере и в системе контроля версий.

  27. Prokudin Artem

    Ну я наверное тогда сделаю 2 типа подсказок : для ответа студента(просто заполненные таблицы разных размеров), для совмещенного ответа студента и преподавателя(будут значения студента, если ячейка совпадает с ответом учителя, то выделяется зеленым, иначе - красным)

    2018-03-09_22-53-28.png

    Еще вопрос, где искать ответ студента и ответ учителя? В случае студента я так понял, что это параметр response

    2018-03-09_22-55-29.png

    А где искать ответ преподавателя? Я так понял, он хранится в поле question этого класса. Но где найти сам класс question, на который поле ссылается?

    2018-03-09_23-01-47.png

  28. Oleg Sychev repo owner

    Студента правильно поняли. Чтобы найти ответ учителя, наиболее соответствующий ответу студента если их несколько, надо запросить объект вопроса - там обычно функция типа best_fit_answer или типа того. В поле question будет объект класса типа qtype_cppexpression_question или типа того.

  29. Prokudin Artem

    Ну я попробовал добавить анализатор к вопросу. Я так понял что я тут первопроходец, ибо в классе qtype_cppexpression обнаружились совсем уж глупые ошибки и заглушки при работе с grader'ами и hint'ами

    Безымянный.png

    Ну я раскомментировал. При добавлении записи все вроде как нормально сохраняется, но при попытке открыть вопрос вылетает ошибка

    2018-03-17_21-42-29.png

    Причина оказалась в следующем : вся дополнительная информация о вопросе хранится в таблице

    2018-03-17_21-47-17.png

    однако при добавлении hint_analyzer'ов он пытается вытянуть из нее поля с mod'ами и penalty

    Безымянный.png

    Так вот. Мне просто добавить эти поля в бд?(я вроде нашел update.php файл, который обновляет базу, но не совсем понял, как его использовать). И будет ли надбавка за это или это по идее и так входит в мою работу?

  30. Prokudin Artem

    Хотя стоп, в этом update файле вроде как даже фигурируют эти поля. Как мне тогда обновить базу?

    2018-03-17_22-14-11.png

  31. Prokudin Artem

    Ну я разобрался вроде как это делается, вылетать перестало. Настроил корректную работу grader'a. Однако с подсказками проблема : я нашел метод, который их отрисовывает, однако $behaviour создается не того типа и подсказка не выводится (стр 159.).

    2018-03-18_01-04-31.png

    Нашел метод генерации behaviour'a, что там нужно поменять? Или эти изменения должны быть не в коде?

    2018-03-18_01-15-19.png

  32. Oleg Sychev repo owner

    Если у вас в базе полей нет, надо смотреть какая версия у вас установилась и сличить с той, что есть в апдейте. Апдейт запускается когда версия в version.php больше той, что в базе - и сам update.php содержит развилки по номеру версии. Сможете понять что случилось и при необходимости запустить апдейт, временно отредактировав себе версию в БД на необходимую чтобы все отработало?

  33. Prokudin Artem

    Ну у меня не получается вывести подсказку. Я настроил $behaviour как adaptivehintsnopenalties, в методе он идет в блок else на стр.168, однако не идет по циклу генерации подсказки из-за отсутствия какого-то параметра в question_attempt. Где он вообще задается, где его искать?

    2018-03-18_01-04-31.png

  34. Prokudin Artem

    ну крч я закомментил ту проверку в цикле и подсказки заработали(пусть пока так). Еще вопрос, куда подключить css-файл. Его интеграция должна происходить в html-коде подсказки или же есть какой-то один большой style-файл?

  35. Oleg Sychev repo owner

    Какую проверку в каком цикле? Если на render_hint то это не совсем в тему, потому что у вас переменная не устаналивается.

    По подсказке у вас должна сначала появиться кнопка подсказки (если подсказка reponse-based - то только после попытки ответа студента), дальше после нажатия кнопки должна появляться сама подсказка - там выставляется нужная переменная. (лучше используйте просто adaptivehints). Если что-то не так - вероятно у вас проблемы с $hintkey, например $question->available_specific_hints не возвращает нужный хинткей потому что вы не дописали туда, см. строку 169 где она вызывается.

  36. Prokudin Artem

    не, проблема в том, что не срабатывает условие на стр 173 и я не знаю, как на это повлиять

  37. Oleg Sychev repo owner

    Так я ж вам про него и пишу. Распечатайте все behaviour_var с последнего шага и сравните с результатом available_specific_hints . В одном из двух мест нет нужного хинткея - ну или в обоих.

    available_specific_hints должна дать список всех возможных хинткеев для данного ответа; has_behaviour_var проверяет, была ли нажата кнопка соответствующей подсказки в behaviour. Проверьте, чтобы вопрос не выдавал поведению, что он сам будет рисовать кнопки, если кнопок не видите. Вы вообще кнопки запроса подсказки видели, нажимали?

  38. Oleg Sychev repo owner

    Ну так вы вообще с available_specific_hints разберитесь, чтобы она хинткеи для ваших хинтов выводила если анализатор включен.

  39. Prokudin Artem

    я не совсем понял, а где добавить кнопку для соответствующей подсказки? А то у меня только "Check" выводится

  40. Oleg Sychev repo owner

    В adaptive-поведениях кнопки добавляет само поведение, по результатам available_specific_hints - если только вопрос не запросил их отрисовку себе. Полюбуйтесь на рендерер поведения, он их рендерит вроде.

    Только ваши подсказки основаны на ответе студента, так что прежде чем увидеть кнопку вам надо ввести какой-нибудь неправильный ответ и нажать Check, а то чего рисовать то на подсказке? Ну и в настройках вопроса подсказки должны быть разрешены. Если все в порядке - смотрите, дает ли available_specific_hints хинткеи бехайвору.

  41. Prokudin Artem

    Вот что я нашел. Необходимые для отрисовки поля(_render_hint) добавляются если установлена "$hint".btn . Только вот где она задается?

    Безымяннdый.png

    Безымяннdыjй.png

  42. Prokudin Artem

    Нашел еще вот тут метод какой-то, в котором как раз фигурирует "$hint".btn, однако он не вызывается и непонятно откуда вообще может. Имеет ли он отношение к этой проблеме?

    Безымянный.png

  43. Oleg Sychev repo owner

    В поведении они задаются. Давайте на консультации...

  44. Log in to comment