Доказать, что если между двумя строками несколько lcs, то ошибки будут одинаковыми.

Issue #74 resolved
Oleg Sychev repo owner created an issue

Originally reported on Google Code with ID 74

В первую очередь вам необходимо подготовить юнит-тесты анализатора последовательности.
Там функций немного, главным образом вычисление lcs и ее подфункции (они должны быть
уже protected, чтобы не зависеть от способа вычисления LCS).

Жду примера в течении двух недель.

Reported by oasychev on 2011-12-07 23:17:32

Comments (21)

  1. Oleg Sychev reporter

    ``` Также за вами - срочно - version.php и прочие файлы, необходимые чтобы Мудл не ругался на новый тип вопроса и можно было спокойно запускать юнит-тесты... ```

    Reported by `oasychev` on 2011-12-07 23:23:10

  2. Former user Account Deleted

    ``` Текущие юнит-тесты готовы и работают. Прочие файлы - надо обсудить, в принципе вопрос устанавливается, но backup/restore пока не работает. ```

    Reported by `mamontov.dp` on 2012-02-04 16:23:44

  3. Oleg Sychev reporter

    ``` Посмотрю как смогу, ближайшие 4-8 дней ОЧЕНЬ занят в связи с началом семестра... ```

    Reported by `oasychev` on 2012-02-04 19:44:33

  4. Oleg Sychev reporter

    ``` Дмитрий, давайте договоримся с самого начала - если вам кажется, что вы можете что-то улучшить в общем дизайне, который сделан централизовано, вы сначала советуетесь со мной (и другими участниками) на трекере, а потом уже вносите изменения в код. Я о c32110f63ba4 ...

    И меня удивляет введение свойства класса для хранения временных данных (не только это). Временные данные обычно хранятся в локальных переменных, а не в свойствах. ```

    Reported by `oasychev` on 2012-02-12 18:54:25

  5. Oleg Sychev reporter

    ``` И еще такое впечатление что вы а) не читали внимательно стиль кодирования Moodle - очевидные нарушения б) не соблюдаете терминологию (error и mistake у нас разные вещи и я вам это объяснял) ```

    Reported by `oasychev` on 2012-02-12 18:56:30

  6. Oleg Sychev reporter

    ``` Я бы не злоупотреблял свойствами классов-анализаторов. Свойства вводятся для того, чтобы сохранить исходную информацию и результат работы конструктора. Внутри конструктора уместнее использовать локальные переменные и передавать их параметрами в функции общего назначения (например lcs). Это упрощает их тестирование и дает возможность повторного использования (если понадобится).

    Функция генерации ошибок в этом смысле может получить как параметр LCS (в конце концов их несколько генерируется), а данные о правильном и проверяемом ответах смотреть в свойствах.

    fitness зависит только от кол-во ошибок, можно подсчитать пользуясь только количеством лексем в LCS и двух ответах, поэтому она нужна отдельно (вызывается для каждой LCS, а ошибки генерируются уже для выбранной).

    Относительно фабрики ошибок - есть предложение сделать abstract_analyzer в котором разместить код подобной функции (стандартизировав имена необходимых свойств классов-анализаторов), при необходимости анализаторы могут ее перегрузить с вызовом родительской функции. Мне кажется это гораздо лучше отдельного класса для этой фабрики...

    ```

    Reported by `oasychev` on 2012-02-18 22:45:35

  7. Former user Account Deleted

    ``` Хорошо, я уберу некоторые свойства (question и веса). Однако, чтобы убрать веса, потребуется изменить интерфейс matches_to_mistakes (добавить туда веса как параметр).

    Исходя просто из количества лексем в правильном и проверяемом ответах и количества лексем в LCS, мы не можем сразу рассчитать fitness, так как у нас есть ещё и перемещённые лексемы, не вошедшие в LCS. Насколько я помню, стандартная формула вводит для них коэффициент 2, что нам невыгодно. Поэтому добавлять параметр надо именно туда.

    Фабрика ошибок - по-моему скромному мнению, она действительно была не нужна. Я внёс эти функции внутрь анализатора и большого смысла обобщать все анализаторы в один не вижу. ```

    Reported by `mamontov.dp` on 2012-02-19 06:42:29

  8. Oleg Sychev reporter

    ``` 1) речь идет не об уменьшении состава свойств (хотя веса по идее должны быть внутри question - добавляйте их туда...) - а о корректности их использования. Чтобы, например, lcs работала по параметрам, а не свойствам и т.д. Я же там вроде ясно написал.

    2) Коэффицента 2 полностью избежать не получится т.к. на это завязан сам алгоритм LCS. Так что не знаю, есть ли смысл. Можно пока сохранить подсчет, но fitness иметь отдельно.

    3) В объекте ошибок много полей (чтобы ошибка была самодостаточной, могла быть использована для отображения подсказки без дополнительных данных). По идее фабрика могла бы автоматизировать заполнение стандартных полей, и этот код как раз будет общим для всех анализаторов.

    ```

    Reported by `oasychev` on 2012-02-19 18:03:27

  9. Former user Account Deleted

    ``` 1) Так я могу менять matches_to_mistakes в сторону увеличения числа параметров, или нет? Вот конкретный вопрос.

    2) Что значит "иметь отдельно"? Использовать отдельную функцию, которая рассчитывает fitness для конкретной LCS?

    3) Не знаю, заполнение полей то можно автоматизировать, но вот заполнение полей от конструирования, по-моему придётся тогда отделив, изменив сигнатуру конструктора. У меня такое возможно, а как у Пашаева? ```

    Reported by `mamontov.dp` on 2012-02-19 18:12:59

  10. Oleg Sychev reporter

    ``` Так, по пункту 1 - устройство анализатора - давайте конкретные замечания тогда обсуждать.

    1.1) Я не вижу особого смысла в lcs_to_mistakes, это условие может с тем же успехом быть и внутри scan_reponse_mistakes (см. ниже).

    1.2) Сама функция расчета lcs не должна быть привязана к полям класса (вдруг понадобится еще для других полей?) и должна получать два массива лексем параметрами. Возможно имеет смысл сделать ее статической - так и тестировать удобнее, не нужно создавать объекты... Наследовать/перегружать ее вроде бы не нужно, так что вреда от статики не предвидится.

    1.3) scan_response_errors должна быть scan_response_mistakes - и то же во всех комментариях, у вас errors вообще нет и быть не может! (вот у синтаксического анализатора могут быть). Четко разделите работу по поиску ошибок преподавателя (перепоручаете синтаксическому анализатору если он может), и ошибок студента (вот тут вы сами можете если синтаксиса нет). Пропущенную лексему лучше называть не skipped а absent

    1.4) lcs отсутствует - когда ни одного элемента общего? В любом случае пустой массив это array() а не null

    1.5) в конструкторе ошибка имени переменной $corrected_response == null - подчеркивание забыли убрать

    1.6) вы пытались найти пример, в котором разные lcs дадут разную fitness в итоге у вашего анализатора (без синтаксического разбора)? Это вообще возможно? В большинстве случае lcs дадут одинаковые ошибки...

    1.7) заметку про прерывание работы при ошибках вы не реализовали (где done?). Представьте что каким-то образом ответ с ошибками дошел до оценивания. $response не пустое. Вы не проверяете, есть ли ошибки у синтаксического анализатора или нет в этом случае.

    1.8) is_errors грамотнее переименовать в are_errors. Или is_error ... ```

    Reported by `oasychev` on 2012-02-19 19:13:33

  11. Former user Account Deleted

    ``` 1.1) В принципе можно внести. 1.2) Так lcs выглядела в изначальном устройстве (не принимала никаких параметров), вы даёте своё согласие на такое изменение? 1.3-1.5) Поправил, пропущенную лексему переименую позднее. 1.6) В ближайшее время поищу, пока мне кажется, что это возможно. 1.7) В ближайшее время исправлю, я так понимаю, мне надо создать дополнительный анализатор (если возможно) и спросить его об ошибках в ответе учителя? 1.8) Это было в изначальном интерфейсе, который вы выложили. Вообще, мне кажется, логичнее будет has_errors() ```

    Reported by `mamontov.dp` on 2012-02-19 19:32:29

  12. Oleg Sychev reporter

    ``` 1.2) конечно 1.7) вы в любом случае создаете синтаксический анализатор при оценивании, но прежде чем брать из него mistakes надо бы проверить наличие errors, при этом наличие последних должно приводить к прерыванию цикла перебора lcs - если answer кривой то он при любой lcs кривой... 1.8) можно has - только переименуйте функцию во всех трех анализаторах сразу, я потом вытолкну в базовый код... ```

    Reported by `oasychev` on 2012-02-19 20:02:21

  13. Former user Account Deleted

    ``` А у нас не будут какие-то "особые" синтаксические ошибки, которые будут иметь особый вес? Потому что, я всё же не нашел случаев, когда fitness будет отличаться, да и математический подход никаких результатов не дал. ```

    Reported by `mamontov.dp` on 2012-02-20 17:27:44

  14. Oleg Sychev reporter

    ``` Особых ошибок вроде не предвидится. Доказать сможете что ошибки выйдут одинаковыми при нескольких lcs? Это доказательство составило бы неплохой раздел диплома... ```

    Reported by `oasychev` on 2012-02-26 20:43:59

  15. Oleg Sychev reporter

    ``` Вопрос про доказательство остается... ```

    Reported by `oasychev` on 2012-08-03 14:58:14

  16. Oleg Sychev reporter

    ``` Здесь же можно обсудить текущее состояния анализатора отдельных лексем. Там какой-то большой комментарий появился - у вас есть вопросы?

    Если какие-то пункты из моего TODO реализованы или частично, то комментарий с пунктом должен быть перед началом соответствующего кода... ```

    Reported by `oasychev` on 2012-08-09 15:39:46 - Status changed: `InProgress`

  17. Former user Account Deleted

    ``` Мне кажется, но все правки на текущий момент реализованы полностью. Если ошибаюсь - поправьте, исправлю. ```

    Reported by `mamontov.dp` on 2012-09-25 17:17:02

  18. Oleg Sychev reporter

    ``` Интереснее всего из оставшегося вопрос про доказательство из комментария 15. Можно создать отдельное issue а это закрыть или обсуждать здесь. ```

    Reported by `oasychev` on 2012-09-30 19:24:56

  19. Log in to comment