Разработать метод разбиения интервалов на непересекающиеся

Issue #324 new
Former user created an issue

Originally reported on Google Code with ID 324

What steps will reproduce the problem?
1.
2.
3.

What is the expected output? What do you see instead?


Please use labels and text to provide additional information.

Reported by SpertsianKamo on 2015-01-15 12:30:52

Comments (114)

  1. Former user Account Deleted
    Начинаю работу над модулем разбиения интервалов перехода на непересекающиеся.
    

    Reported by SpertsianKamo on 2015-01-15 12:33:15

  2. Former user Account Deleted
    Не очень корректный issue я сделал..
    

    Reported by SpertsianKamo on 2015-01-15 12:35:02

  3. Oleg Sychev repo owner
    Для начала юнит-тесты по тому, что фотографировали, вытолкните и отпишитесь тут.
    

    Reported by oasychev on 2015-01-18 14:09:47

  4. Former user Account Deleted
    Да, я сейчас их и пишу. Единственное - у меня вопрос по одному тесту - 4.
    
    Там интервалы 4-5 и 4-6 разбиваются на 4-5 и 5-6, я так понимаю, это опечатка?
    Должно же быть 4-5 и 6-6.
    

    Reported by SpertsianKamo on 2015-01-19 09:35:32

  5. Former user Account Deleted
    Странно, не могу вытолкнуть изменения. Пишет, что требуется создание новой ветки, я
    жму "Да, создать", после чего он обрывает выталкивание..
    
    One or more of the changesets that you are attempting to push involve the creation
    of a new branch. Do you want to create a new branch in the remote repository?
    --Yes.
    
    abort: push creates new remote head 4f4b038dd509!
    hint: merge or see "hg help push" for details about pushing new heads/
    
    Что я делаю не так? Перед выталкиванием я вытянул все изменения.
    

    Reported by SpertsianKamo on 2015-01-19 10:27:43

  6. Former user Account Deleted
    Я так понимаю, ошибка в том, что он выталкивает изменения в мой клон для проверки эквивалентности
    конечных автоматов, в котором не было изменений с 29 августа прошедшего года, поэтому
    возникает конфликт между текущей версией репозитория (он у меня склонирован от последней
    версии preg-а, если не ошибаюсь) и версией клона на code.google. Как мне правильно
    это исправить? 
    

    Reported by SpertsianKamo on 2015-01-19 10:37:10

  7. Oleg Sychev repo owner
     #4 - да
     #6 - у вас произошло разветвление между вашими изменениями и взятыми от кого-то еще.
    Поищите на графике слева - вы должны найти два "окончания". Вам нужно слить (merge)
    их между собой перед выталкиванием. А лучше делать pull --rebase при последующем затягивании
    изменений. Затягивать изменения из моего клона лучше регулярно.
    
    Вообще, перечитайте лекцию по распределенным системам с НКПО - поймете, что у вас произошло...
    

    Reported by oasychev on 2015-01-19 14:30:42

  8. Former user Account Deleted
    Нашлась ветка - это моя работа с эквивалентностью, она немёржена. Я клонировал свой
    репозиторий от своего клона на code.google с эквивалентностью конечных автоматов, затем
    затянул изменения от Валеры, в итоге моя исходная ветка оказалась немёрженной, нужно
    ли мне её мержить вообще или просто создать новый клон от Валеры? 
    
    P.S. При мёржинге 3 конфликта возникает.. 
    

    Reported by SpertsianKamo on 2015-01-20 09:53:13

  9. Oleg Sychev repo owner
    Приходите ка вы в пятницу ко мне на экзамен (только не сразу к 8) - будет свободное
    время, разберемся...
    

    Reported by oasychev on 2015-01-20 14:21:04

  10. Former user Account Deleted
    Олег Александрович, если я к часу подойду - это сильно поздно будет?
    

    Reported by SpertsianKamo on 2015-01-22 19:20:01

  11. Oleg Sychev repo owner
    Поздновато. Тут уже гарантировать ничего не могу, работая с 8 часов.
    

    Reported by oasychev on 2015-01-22 19:25:29

  12. Former user Account Deleted
    Хорошо, тогда пораньше приеду.
    

    Reported by SpertsianKamo on 2015-01-22 19:49:49

  13. Former user Account Deleted
    Это какой-то ужас.
    Захотел запустить тесты на мёрженном preg-e - не заработали - phpunit попросил ввести
    команду
    php admin/tool/phpunit/cli/init.php
    
    Ввёл, он поругался на пару ошибок в известном мне коде, я их исправил. А теперь такая
    ошибка: 
    PHP Fatal error:  Class 'qtype_poasquestion\hint' not found in /srv/http/moodle/question/type/preg/preg_hints.php
    on line 36
    
    Сравнил этот файл с таким же у Валеры (https://code.google.com/r/vostreltsov-preg-28/source/browse/question/type/preg/preg_hints.php)
    - они одинаковы, в обоих такого класса нет.
    
    Я уже не знаю, что мне делать.
    

    Reported by SpertsianKamo on 2015-01-24 08:43:34

  14. Former user Account Deleted
    А теперь вообще всё перестало работать... Что запуск тестов, что команда php admin/tool/phpunit/cli/init.php.
    
    На всё выдаёт 
    Initialising Moodle PHPUnit test environment...
    Moodle PHPUnit environment configuration error:
    Can not use database for testing, try different prefix
    

    Reported by SpertsianKamo on 2015-01-24 09:00:03

  15. Former user Account Deleted
    Аллилуйя! Мы сделали это. Большое спасибо Валере и Лене за огромную помощь.
    
    Я смёржил и вытолкнул изменения. Вы удалили классы Никитского, которые мне нужны, я
    их в своём коммите оставил. Все тесты старая программа проходит.
    
    Из нового:
    - отдельным коммитом добавлен заголовок разрабатываемой функции;
    - отдельным коммитом добавлены тесты к этой функции.
    
    Я предположил, что функция разбиения будет применяться к одному чарсету, а в аргументы
    получать массив остальных чарсетов. Поэтому в тестах только часть из того, что было
    на Ваших листах, ибо у меня нет разницы 2х2 интервала разбиваются или 1х3.
    
    Жду Ваших комментариев и замечаний, чтобы продолжать работу.
    
    ----- Мой клон, на всякий случай -----
    https://code.google.com/r/spertsiankamo-preg-equivalence/source/list
    

    Reported by SpertsianKamo on 2015-01-27 10:38:53

  16. Former user Account Deleted
    Олег Александрович, поясните мне, пожалуйста, ещё разок, зачем я переписываю свои функции?
    Я понимаю, что мне нужно подстроиться под preg_fa_transition, но я и так с ним и работал
    в своей функции divide_crossed_intervals. Она принимала на вход пару групп (qtype_preg_fa_pair_of_groups),
    возвращала массив пар групп. 
    Теперь же я должен написать функцию, принимающую массивы переходов и возвращающую массив
    пар групп. Это нелогично. 
    
    В общем я не понял, что от меня нужно.
    

    Reported by SpertsianKamo on 2015-03-23 08:05:40

  17. Oleg Sychev repo owner
    Вам нужно приспособить свою функцию к имеющимся классам автомата
    а) к классу перехода
    б) к классу чарсета с интервалами, лежащему в его основе
    
    Посмотрите, скорее всего поскольку сейчас в переход записываются и теги, и сам переход
    (символы, ассерты) - то скорее всего вместо класса группы будет достаточно массива
    переходов (или двух массивов - из каждого автомата) - т.к. теги отдельно хранить не
    надо. Но если нужен (для хранения цепочки символов и т.д.) - создавайте его уже на
    основе классов переходов автомата.
    
    Ну и юнит-тесты проверить/переписать на последнюю версию read_fa от Лепилкиной.
    

    Reported by oasychev on 2015-03-24 16:30:09

  18. Former user Account Deleted
    Тесты я уже переписал и вроде вытолкнул. А мне в этой функции не нужно состояния по
    переходам раскидывать? То есть только переходы разбить и все? 
    

    Reported by SpertsianKamo on 2015-03-24 17:29:55

  19. Oleg Sychev repo owner
    Что конкретно значит "состояния по переходам раскидывать"?
    
    Объекты переходов хранят в полях $from и $to состояния откуда и куда они ведут по идее,
    эта информация содержится в классе перехода.
    

    Reported by oasychev on 2015-03-24 20:08:18

  20. Former user Account Deleted
    У меня же работа идет не с одним переходом, а с группой - я разбиваю переходы на непересекающиеся,
    затем по каждому получившемуся переходу набираю массив состояний, достижимых из каждой
    группы. 
    

    Reported by SpertsianKamo on 2015-03-24 23:06:33

  21. Oleg Sychev repo owner
    Перечислите состав информации в "группе".
    
    Вообще проще подойти в пятницу после занятий и все это обсудить, лучше имея возможность
    открыть код.
    

    Reported by oasychev on 2015-03-26 14:59:02

  22. Former user Account Deleted
    Прошу прощения, я только сейчас заметил Ваше сообщение..
    
    В группе хранится:
    - автомат, к которому принадлежит группа
    - состояния группы
    - один символ, по которому возможен переход в эту группу состояний
    - прошлые группы, через которые мы попадаем в текущую
    
    В паре групп:
    - группа первого автомата
    - группа второго автомата
    - один символ, по которому возможен переход в эту группу состояний
    - набор тегов, по которым возможен переход в эту группу состояний
    

    Reported by SpertsianKamo on 2015-03-28 10:21:21

  23. Former user Account Deleted
    Олег Александрович, как мне лучше выдавать результаты функции в charset-е?
    Она у меня возвращает набор чарсетов и к каждому чарсету ещё массивы индексов переданных
    на вход чарсетов. Я буду возвращать массив чарсетов, а индексы через обновляемый параметр
    сделаю. Если я не прав - исправьте меня..
    

    Reported by SpertsianKamo on 2015-04-04 15:51:12

  24. Former user Account Deleted
    И ещё - я обнаружил, что свойство ranges в классе чарсета не используется, вместо него
    используется cachedranges. Но самое интересное, что есть ПУБЛИЧНЫЙ метод ranges(),
    который возвращает интервалы из чарсета.
    

    Reported by SpertsianKamo on 2015-04-04 16:09:00

  25. Oleg Sychev repo owner
    Вы что такое "кэш" знаете в программировании? Тогда cachedranges вас не должно удивлять...
    

    Reported by oasychev on 2015-04-04 17:35:27

  26. Oleg Sychev repo owner
    Добавляю остальных для обсуждения текущего состояния чарсета...
    

    Reported by oasychev on 2015-04-04 17:36:03

  27. Former user Account Deleted
    Написал, закоммитил и вытолкнул функцию с тестами.
    

    Reported by SpertsianKamo on 2015-04-07 09:14:03

  28. Oleg Sychev repo owner
    Это хорошо - но будьте добры следить за содержимым коммитов - не надо коммитить var_dump!
    
    Теперь мы должны продвигаться влево по диаграмме sequence.
    

    Reported by oasychev on 2015-04-20 23:38:50

  29. Former user Account Deleted
    Олег Александрович, я прошу прощения - я не смогу появиться в понедельник, будет Студенческий
    Лидер, на котором необходимо моё присутствие, и ещё я сдал на ремонт ноутбук, пока
    что лишён возможности работать над дипломом..
    

    Reported by SpertsianKamo on 2015-04-25 11:41:02

  30. Oleg Sychev repo owner
    Нам необходимо чтобы работа не стояла.
    Поэтому в таких случаях лучшее "извините" - это усиленные достижения по части адаптации
    своей программы к общей части; или - если не получается - искать возможность встретится
    со мной и необходимыми участниками в другое время...
    
    Нам таки нужно выйти на работающий на preg_fa вариант...
    

    Reported by oasychev on 2015-04-26 22:02:04

  31. Former user Account Deleted
    Я надеюсь, мне скоро вернут ноутбук, завтра буду уточнять сроки. Просто виртуальная
    машина с образом диска на нём.
    

    Reported by SpertsianKamo on 2015-04-27 21:18:32

  32. Oleg Sychev repo owner
    А резервное копирование отменили?
    

    Reported by oasychev on 2015-04-28 12:21:26

  33. Former user Account Deleted
    Продолжаю работу над проектом. Нужно ли вытянуть и смержить какие-то изменения? И что
    делать с репозиторием, если этот будет доступен только для чтения с 25 августа?
    

    Reported by SpertsianKamo on 2015-08-12 11:35:22

  34. Камо Сперцян

    Олег Александрович, подскажите, пожалуйста, как можно создать qtype_preg_leaf_charset, зная границы интервалов? В тестах я это делаю через свою функцию leaf_by_regex, которая по регулярному выражению через qtype_preg_lexer создает чарсет, однако считаю это не лучшим способом для кода функции. Как сделать правильно?

  35. Камо Сперцян

    И ещё один вопрос: В тестах для разделения чарсетов, которые Вы мне давали, интервалы разделяются последовательно, например: a-c, d-e, g-h. Даже если, например, интервалам a-c и g-h удовлетворяют одни и те же исходные чарсеты, в результате остаются все 3 интервала. Сейчас функция работает именно так. Не будет ли лучше объединять интервалы с одинаковым набором исходных чарсетов, удовлетворяющих им? В таком случае результат будет a-cg-h, d-e. Это сократит количество результирующих чарсетов, как следствие - transition-ов, и как результат - уменьшатся временные затраты.

  36. Oleg Sychev repo owner

    Камо, начнем с того что я как и вы не знаю заранее ответа на этот вопрос - эту часть кода писал Стрельцов. Но я программист, а не только способен задавать вопросы. Поэтому с чего бы я начал - я бы поискал код, который эти чарсеты таки реально создает. Вы уже и сами понимаете что такой код должен быть в лексере (устройство входного файла которого после Теории автоматов вам должно быть знакомо) и кроме того можно греп-нуть код по строке типа "new qtype_preg_leaf_charset" чтобы посмотреть участки кода где он реально создается и как там заполняется - через конструктор или потом после создания. Сможете по этой подсказке разобраться или мне надо самому это делать и вам объяснять? Тесты используют лексер потому что это делает тесты намного понятнее.

    По второму вопросу надо говорить при встрече, т.к. я не до конца понимаю что именно вы называете "интервалом" - математически это может быть и элементарный интервал, и их объединение.

    P.S. Вам задание - если у класса qtype_preg_leaf_charset не окажется удобного конструктора по интервалам - написать его.

  37. Камо Сперцян

    Конструктор у чарсетов примитивный, всего лишь устанавливает какой-то флаг в false. От последнего посещения лексера у меня остались плохие впечатления, но в последнее время туда не заходил, так что зайду и поищу ответ на свой вопрос там.

  38. Oleg Sychev repo owner

    Я надеюсь вы смотрели исходник - src/preg_lexer.lex - а не php файл? Вас очевидно прежде всего интересует функция лексера form_charset (а также какие данные в нее передаются в параметры при вызове, что можно распечатать из юнит-теста с leaf_by_regex и чарсетом с нужными интервалами). Советую когда разберетесь тщательно закомментировать ее текст (на английском) чтобы у других проблем было меньше...

  39. Камо Сперцян

    Хорошо, если разберусь - добавлю комментариев.

  40. Камо Сперцян

    Ничего лучше, чем посредством функции leaf_by_regex для тестов придумать не смог. Функция form_charset генерирует чарсет по строке, рассматривая её просто как набор символов. То есть строка а-с для этой функции это просто три символа, а не регэкс. Создам у чарсетов конструктор, который будет создавать чарсет по аналогии с методом leaf_by_regex, с единственным параметром - регэксом.

  41. Камо Сперцян

    Вернее сделал статический метод by_regex у чарсета.

  42. Oleg Sychev repo owner

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

  43. Камо Сперцян

    Олег Александрович, а допускаем ли мы возможность наличия при одном переходе как открывающих, так и закрывающих тегов? Что-то мне подсказывает, что это нелогично с точки зрения автомата.

    И ещё один вопрос. Что-то не могу никак сообразить один момент. Если у меня есть один переход в первой группе и два во второй следующего вида:

    а(1, 3)

    а(1) а(3)

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

  44. Oleg Sychev repo owner

    Посмотрите на автоматы из кросс-тестов. Конечно допускаем. Пользователь может написать в регексе a(b)c а может и написать a()b и тогда оба тега будут у эпсилон-перехода... Там же отдельные массивы для открывающих и закрывающих...

  45. Камо Сперцян

    Я не нашел в тестах подобной ситуации и поэтому немного в растерянности, каких образом её необходимо решать.

  46. Oleg Sychev repo owner

    Подобной это какой? И в чем проблема добавить в переход и открывающие и закрывающие теги? Там все поля предусмотрены были вроде... Если вы хотите всерьез найти в тестах аналогичные ситуации посмотрите на файлы cross_tests - там тесты на общий матчинг регексов, их ОЧЕНЬ много. Прикиньте при каком варианте регекса она возникнет и поищите соответствующий. Или допишите тест, закомментируйте временно остальные и распечатайте автомат...

    Что касается ситуаций типа а(1, 3) а(1) а(3) то это несовпадение по тегам, т.к. в первом автомате откроются оба, а во втором - один. Второй же автомат не сможет пройти до конца в итоге по двум расходящимся переходам сразу. НО - это верно для буквы "а", вот если там будет переход типа эпса или ассерта, несъедающий - тогда там может быть второй переход сразу за ним, открывающий нужны тег. Поэтому вам скорее всего будет удобнее работать на автоматах со смерженными переходами алгоритмом Лепилкиной...

  47. Камо Сперцян

    То есть если говорить о разбиении на интервалы, то их будет 3: а(1, 3), а(1), а(3), верно я понял?

  48. Oleg Sychev repo owner

    Я чувствую это уже надо вживую обсуждать. Там же интервалы должны содержать пару из одного и второго автомата? Тут пар не будет и если нет других переходов, то вся ситуация уйдет в несовпадение автоматов. Подробнее при встрече видимо...

  49. Камо Сперцян

    Просто в это у меня упирается на данный момент разбиение как переходов, так и тагсетов. Функция для тагсетов, которую я написал и вытолкнул, успешно работала на простых примерах, а такой мне в голову не пришел. И когда я на него наткнулся в переходах, понял, что сама идея реализации разбиения тагсетов, какая она есть сейчас, неправильна. Придется переделывать.

  50. Oleg Sychev repo owner

    Если грубо говорить, принципиальная разница между чарсетами и тегсетами в том, что при выполнении перехода чарсеты работают по ИЛИ (любой подходящий символ устраивает), а тегсеты - по И (все теги должны совпасть, иначе совпадение не полное по тегам). Сможете из этого вывести как это должно работать? Просто иначе мы уже плохо друг друга понимаем и без подробного общения голосом не поймем...

    И еще один момент по тегам. Вас интересуют не все теги, а только некоторые. Конкретно - те, которые в автомате связаны с подвыражениями - там есть subexprmap или subexpressionmap или что-то в этом роде у регекса точно есть, у автомата не знаю, он устанавливает связь между номерами подвыражений и тегов - попробуйте для начала найти это поле (подсказка - автомат надо строить из регекса стандартными методами с несколькими подвыражениями; те номера которые идут по порядку 0,1,2,3 - это подвыражения в них скачков быть не могут; соответствующие номера тегов же могут скакать через произвольные интервалы). Там при конструировании автомата доставляется еще куча тегов, которые могут различаться и это не страшно. Пока попробуйте найти поле и в нем разобраться, видимо надо либо параметр добавлять в функцию (какие теги интересуют), либо она должна иметь доступ к этому полю.

  51. Камо Сперцян

    Я пока не хотел усложнять себя возможностью разными тегами одинаковые подвыражения обозначать. Хотел переписать пока имеющееся на классы preg-а, а уже потом модифицировать на случай различных тегов. А насчет И и ИЛИ я ещё подумаю, возможно, это внесет мне ясности.

  52. Oleg Sychev repo owner

    Дело не в разных тегах на одинаковые подвыражения - это редкость. Дело в том что большинство тегов вообще не касаются подвыражений. Вам надо из всех тегов выбрать только подвыраженческие, а остальные игнорировать...

  53. Камо Сперцян

    Вот как.. Хорошо, давайте обсудим это в среду. Вопросов много на этот счет.

  54. Камо Сперцян

    Очередной раз ломаю голову над разбиением тегов. Надеюсь. мое последнее умозаключение окажется верным. Вот к чему я пришел:

    сравнивать тагсеты нужно исключительно по полному набору для одного перехода, т.е. нельзя разбить набор тагсетов на такой тагсет, который не будет совпадать с ЦЕЛЫМ тагсетом какого-либо из переданных переходов;

    при отсутствии такого тагсета, который присутствовал бы в КАДЖДОМ из переданных тагсетов, должен рассматриваться переход без тегов, которому удовлетворяли все переданные тагсеты (т.к. тагсеты передаются в функцию уже после отбора по конкретному символу, а значит каждый переход удовлетворяет переходу по данному символу без тегов).

    Привожу несколько тестов, чтобы продемонстрировать своё понимание проблемы и её решенияСнимок.PNG.

  55. Камо Сперцян

    Один спорный момент: возможно, стоит выделять тагсет, который не будет совпадать ни с одним ЦЕЛЫМ переданным тагсетом, но будет включен в КАЖДЫЙ переданный тагсет, и указывать его вместо пустого тагсета. Например, в тесте 5 вмсето пустого тагсета подставить тагсет 1 - ему удовлетворяет КАЖДЫЙ переданный тагсет.

  56. Камо Сперцян

    Переписал старые и добавил новые тесты к функции разделения тагсетов и переписал саму функцию. Изменения вытолкнул.

  57. Oleg Sychev repo owner

    Короче - тег сейчас это ссылка на узел дерева, а если нужен номер тега - то надо вызывать на нем ->subpattern() - она вернет (допишите в ее комментарий если нет, что это номер и тега тоже). Также по этой ссылке вы легко вычисляете теги связанные с подвыражениями - они указывают на узел типа subexpression

  58. Oleg Sychev repo owner

    Переносить классы из preg_fa.php в classes/fa/ можно таким способом (копирование в hg плюс удаление ненужного кода), но надо чтобы я вам показал это один раз - операция больно аккуратная. Только имейте на компьютере TortoiseHg поставленную на Windows пожалуйста при этом... Можно в четверг подойти - или в пятницу на перемене после лекции...

  59. Камо Сперцян

    Поэкспериментировал под Windows с копированием файлов - действительно, при ручном копировании файла вся его история коммитов теряется. При копировании с помощью hg история появляется после того, как скопированный файл добавляется под контроль версий. Правда я не смог найти в GUI опции копирования файла, воспользовался консолью.

  60. Камо Сперцян

    Олег Александрович, столкнулся с проблемой после разделения файла preg_fa.php на 2 автокомпилируемых файла с классами fa и transition, нужна Ваша помощь.

    Fatal error: Class 'qtype_preg\StringStreamController' not found in /srv/http/moodle/question/type/preg/classes/fa.php on line 867

    Вот 867 строка:

    StringStreamController::createRef('dot', $dotstring);

    Сам класс подключается тут:

    require_once($CFG->dirroot . '/question/type/poasquestion/stringstream/stringstream.php');

    Я так понимаю, что проблема с namespace qtype_preg, но не знаю, как правильно разрешить эту ситуацию.

  61. Oleg Sychev repo owner

    Надо видеть код чтобы что-то сказать. Возможно require должен быть перед namespace.

  62. Камо Сперцян

    Увы, но объявление пространства имен должно быть первой строкой файла..

  63. Oleg Sychev repo owner

    Так почитайте доки как в PHP пишется имя класса не находящегося в пространстве имен если сам код в пространстве имен. Если память не изменяет - бекслеш перед ним надо поставить. В любом случае вам достаточно отредактировать new и все...

  64. Камо Сперцян

    Хорошо, я почитаю. Единственное, я не очень понял Ваше последнее предложение.

  65. Oleg Sychev repo owner

    Ваша проблема в том, что имя класса при создании объекта (операции new) в старом написании трактуется как принадлежащее пространству имен. Вам надо изменить это имя в операции new и всего делов... Можете даже в poasquestion найти мои коммиты, делающие подобное...

  66. Камо Сперцян

    Но в моей ошибке же не создаются никакие экземпляры класса. Это вызов статического метода.

  67. Oleg Sychev repo owner

    Ну значит в вызове статического метода. Чаще всего такое в new бывает. Может быть и с другими классами тоже...

  68. Камо Сперцян

    Действительно, решением оказалось добавление \ перед именем каждого класса, не состоящего в пространстве имен qtype_preg, но используемых внутри него. Наверное, я закончил с разделением. Надеюсь, я сделал все правильно:

    • разбил файл preg_fa.php на 2 файла classes\fa.php и classes\transition.php с соответствующими классами

    • в новых файлах объявил пространство имен qtype_preg

    • все использования qtype_preg_fa и qtype_preg_fa_transition в модуле preg заменил на \qtype_preg\fa и \qtypre_preg\transition вне пространства имен и fa и transition внутри пространства имен

    • все использования классов вне пространства имен в классах fa и transition предварил символом \

  69. Oleg Sychev repo owner

    Если класс называется fa_transition то и файл должен быть fa_transition.php скорее всего - почитайте внимательно. Я за fa_transition в качестве имени класса/файла (только переименование делаем средствами hg как и копирование)

    Проверить можно сбросив кеш на своей инсталляции Moodle (если через веб) и попробовав preg (и ваш код), предварительно удалив require_once которые запрашивали preg_fa.php

  70. Камо Сперцян

    Я назвал просто transition.. Переименую. А вот файлы я просто переименовал, надо переделать.

  71. Камо Сперцян

    А нет, вру. Я указал требуемое имя при копировании. В общем, нужно теперь только transition переименовать.

  72. Oleg Sychev repo owner

    Файлы надо проверять на annotate. Она должна показывать всю историю развития кода классов до перемещения их в другие файлы. Если этого не было, надо удалять коммиты и переделывать....

  73. Камо Сперцян

    Это я проверил - все коммиты сохранились, и при попытке закоммитить файл учитываются изменения относительно старого файла.

  74. Камо Сперцян

    У меня проблема. Я с preg работаю на виртуальной машине, на arch-e. Логин и пароль админа от мудла там я не знаю. Скопировал модуль на Windows и встроил вместо существующего preg - при входе на moodle пишет, что установлена более новая версия preg, откатить назад не получается. Как мне быть?

  75. Oleg Sychev repo owner

    Откуда ж у вас взялся Moodle на который вы не знаете пароль админа?

    Если пишет что более новая версия - возьмите version.php и поправьте версию до требуемой, только не комиттить. (Но вообще это странновато если вы клонировали с битбакета, там последний номер версии. Вы свои изменения точно не в устаревшем коде Preg'а проводите?)

  76. Камо Сперцян

    Мудл, от которого я не знаю пароль, мне ставил ещё Валера Стрельцов, файлик со всеми логинами/паролями я благополучно потерял, не понимая важности имевшейся в нем информации.

    Насчет версий: установленная - 2015071000, с моими изменениями - 2015070200. Я тоже думал, что версия preg у меня последняя, ибо я клонировал из репозитория с последней версией и заменил ими имевшийся ранее вопрос на вирт.машине.

  77. Камо Сперцян

    Хорошо.. А пока - я создал вопрос preg на движке конечных автоматов, глянул проверку ответов и работу подсказок, пару ошибок вылезло - исправил. Также прогнал на phpunit свои тесты на переходы - работают.

  78. Камо Сперцян

    Вы имеете ввиду require_once, которые были в самом preg_fa.php или у файлов, которые использовали preg_fa.php? Если второе, то да, все подключения проверил грепом и удалил.

  79. Камо Сперцян

    Олег Александрович, а какую информацию хранить в случае расхождения по тегам?

    Скажем, при расхождении автоматов мы храним символ расхождения. При расхождении тегов что хранить? Например, когда в первой группе переход а(3), а во второй два перехода: а(1) и а(5).

  80. Oleg Sychev repo owner

    Сядьте и напишите сюда сообщения пользователю о различиях в тегах (открывающих и закрывающих). Естественно они должны учитывать именно терминологию пользователя - какие символы попадают в подмаски, какие нет - а не терминологию автомата с тегами. При необходимости прочитайте еще раз что такое capturing subpatterns и для чего они нужны.

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

  81. Камо Сперцян

    Полагаю, что пользователю следует показать сроки до места расхождения скобок у него и у корректного ответа.

    Примеры в виде "правильный ответ", "ответ студента", "расхождение":

    • "аа(сс)ее", "аассее", "аас... -> аа(с...".
    • "((аа)сс)ее", "(аа)ссее" "(а... -> ((а..."

    Я понял, что очень смутно представляю себе многие ситуации с подмасками.. Например, какой регэкс соответствует ситуации, где при одном переходе есть и открывающие и закрывающие теги подмаски? "(а)"? Только такие случаи?

  82. Oleg Sychev repo owner

    Строки со скобками могут быть полезны, но тут есть два момента. Во-первых, вам надо написать вразумительное сообщение на языке чтобы студент, изучающий регексы, мог понять, о чем идет речь - строки со скобками будут его иллюстрировать. Во-вторых, ваши строки со скобками не очень наглядно показывают проблему нумерации подвыражений/подмасок, а она существенна - в плане того, по какому именно подвыражению расхождение. Вы вообще собираетесь скобками показать все подмаски или только ту, в которой ошибка? Тут надо думать и рассуждать.

    Но уже даже из строки со скобками должно быть понятно какую информацию надо сохранять. И дополнительно сообщения. Длительные разъяснения - при личной встрече, у вас я думаю есть что программировать другого...

  83. Камо Сперцян

    По диплому у меня все упирается в это.. От того. что нужно хранить в расхождении по тегам, зависит, что должна возвращаться функция divide_intervals у transition, а исходя из нее должны писаться уже все остальные классы, которые мы выделили на диаграмме.. Скорее всегда я подойду к Вам в понедельник вместе с Димой Матюшечкиным, если у Вас будет время, можно обсудить этот вопрос.

  84. Oleg Sychev repo owner

    А если она пока будет возвращать ссылку на объект transition из которого можно извлечь всю необходимую информацию?

  85. Камо Сперцян

    Тут одним transition не обойтись. Нужно же сравнение..

  86. Oleg Sychev repo owner

    Ну ясное дело, что должны участвовать все transition из участвующих в сравнении переходов. Это тоже надо через интернет писать? Вообще, без учета тегов все уже сравнивается и работает?

    P.s. В этот раз в понедельник досдача после консультации, со временем будет не очень...

  87. Камо Сперцян

    Нет, без учета тегов пока реализовано ровно столько же, сколько и с тегами. В принципе, я могу заняться реализацией алгоритма без тегов, пока мы не обсудим особенности, с ними связанные.

  88. Oleg Sychev repo owner

    Я вообще не понимаю что мешает разместить минимально необходимую информацию про теги сейчас, отладить сам алгоритм, а потом добавить недостающую инфу. Она особо не влияет на остальные алгоритмы...

  89. Камо Сперцян

    Олег Александрович, а мне новые классы в Preg оформлять как автокомпилируемые в classes или по-старому?

  90. Oleg Sychev repo owner

    Думаю в classes, причем склоняюсь к подкаталогу fa_equality (и подпространству имен соответственно), дабы не путать потом в голове что за "группа" и т.д.

  91. Камо Сперцян

    У меня возник тупик.. В последний раз мы с Вами решили, что нет смысла разбивать теги, достаточно проверить, совпадают они или нет. Проблему я опишу на следующем примере. Допустим, в одной группе есть переходы а() и а(1), а во второй а(1). Такую ситуацию мы прозвали CHARACTER_BUT_NOT_SUBPATTERN MISMATCH. Никак не могу придумать, как её правильно обнаружить без разбиения тегов. И как поступить с результирующими группами, если такая ошибка обнаружена? Оставить группу, в которой все переходы удовлетворяют символу перехода и отбросить теги, как в случае расхождения по тегам, или как-то иначе?

  92. Oleg Sychev repo owner

    Давайте такие тупики при встрече, а то придется кучу наводящих вопросов задавать чтобы войти в курс дела...

  93. Камо Сперцян

    Олег Александрович, я в растерянности.

    Функции transition::divide_intervals мы приписали на последней встрече много ответственности. Закончили на том, что она должна сама проверять эквивалентность получаемых групп. При этом получает она всего два массива переходов. По-моему, всё-таки стоит разграничить разбиение интервалов и проверку групп на эквивалентность, потому как возникает множество проблемных моментов при объединении этих действий в одну функцию в классе перехода.

    Вот некоторые мои мысли на этот счет:

    1) В классе pairs_group можно добавить метод разбиения, который будет внутри себя собирать массив переходов из имеющихся состояний, вызывать transition::divide_intervals, после чего компоновать результаты функции в новые пары. Так мы получим более понятное делегирование обязанностей.

    2) При делении переходов иногда достаточно разбить их только по charset-ам, но без тегов. Это необходимо в том случае, когда исходя уже из чарсетов выявляется расхождение по символу. Для реализации такой возможности у нас уже есть (вернее добавляется) флаг для функции transition::divide_intervals, который будет указывать, делить переходы с учетом тегов или нет. Но здесь возникает небольшая проблемка оптимальности: при разделении пары мы всегда будем сначала делить только чарсеты без тегов и, если не найдем расхождений по символу, делить уже с учетом тегов. Для того, чтобы при втором вызове функция transition::divide_intervals не разбивала чарсеты повторно, можно добавить последними необязательным аргументом массивы чарсетов и соответствующих им индексов, полученные при первом вызове.

    3) Мы обделили отдельным вниманием расхождения по конечным состояниям. Они ведь могут возникать, например, только при переходах с конкретным тегсетом. Как вести себя с подобными расхождениями?

    Наверное, было бы неплохо это всё опять же обсудить вживую, но Вам виднее.

  94. Oleg Sychev repo owner

    Я не вижу причин именно для растерянности. Разбить имеющуюся функцию на две очень легко. И гораздо легче как раз это сделать с имеющейся и работающей функцией чем обсуждать теоретически.

    Давайте чтобы к следующей встрече это все хорошо работало как единая функция, там на нее посмотрим и все решим...

  95. Камо Сперцян

    Просто получается, что мне необходимо передавать в функцию transition::divide_intervals не два массива переходов, а пару групп, которые надо разбить. И возвращать функция будет уже массив новых эквивалентных пар и массив расходящихся пар. С другой стороны, в любом случае это придется декомпозировать, а сейчас можно реализовать и так. Но вопрос про расхождения по конечным состояниям меня ещё волнует.

    Что делать, если возникает расхождение по конечным состояниям при каком-то наборе тегов? Отбрасывать полностью пару групп и не искать далее расхождений, или поступать как с расхождениями по подмаскам?

  96. Камо Сперцян

    Во втором абзаце я оговорился - Что делать, если возникает расхождение по конечным состояниям при каком-то наборе тегов?

  97. Oleg Sychev repo owner

    Рассуждайте с точки зрения логики эквивалентности автоматов. Если такое расхождение возникает, значит на какой-то строке один автомат даст совпадение, а другой - нет (если только эта строка не может другим путем совпасть, вот тут надо кстати думать - как это отследить...). Такая ситуация - однозначная неэквивалентность. И куда там далее искать то можно, если в одном из автоматов мы закончили?

  98. Камо Сперцян

    Олег Александрович, что я делаю не так?

    Из qtype_preg\fa\fa вызываю статический метод класса qtype_preg\fa\equivalence\states_group, а phpunit ругается на отсутствие namespace-а в файле fa.php.

    Я пробовал вот так:

    • equivalence\groups_pair::f();

    • \equivalence\groups_pair::f();

    • \qtype_preg\fa\equivalence\groups_pair::f();

    Ни один из способов не работает.

    Класс groups_pair лежит в classes/fa/equivalence/groups_pair.php, класс fa - classes/fa/fa.

  99. Oleg Sychev repo owner

    Мне сложно сказать что-либо не видя код, а вы же его не выталкиваете в свои клоны для обзора...

  100. Камо Сперцян

    Но код не проверен и не доработан, все равно выталкивать?

  101. Oleg Sychev repo owner

    Выталкивать для обзора. Потом можно даже доработать коммиты, Усов вон расскажет. Я же не собираюсь его вытягивать к себе и мержить. Я просто посмотреть хочу...

  102. Камо Сперцян

    Я разобрался, я дурак. Не в том файле код писал и потер все сейчас.. Буду исправлять.

    Я в репозиторие своём изменил fa.php, а там ещё нет всех классов эквивалентности.

  103. Камо Сперцян

    Олег Александрович, проверка эквивалентности без тегов реализована, код я вытолкнул. Но я тут обнаружил, что куда-то подевал листочки с нашего последнего обсуждения, теперь пытаюсь вспомнить, для чего мы собирались в расходящуюся пару добавить дополнительный флажок для расхождения по тегам. Верно ли я помню, что он нужен, чтобы указать, что расходящийся набор тегов является подмассивом второго, для случая, когда расхождение возникает в переходах, где у одного набор тегов, например, (1, 3), а у другого - (1, 3, 5)?

    Тут возникает ещё один момент: какое расхождение по тегам должно быть в следующем случае: (первая группа) а(1, 3), а(5) и (вторая группа) а(1, 3, 5)? Обыкновенное расхождение по тегам, где флажок. описанный выше, установлен в "ложь"?

    И ещё один вопрос хочу уточнить - расхождение "по символу, но не по подмаске" в случае, когда в одной группе есть переходы (а) и (а/1, 3), а в другой - (а/1,3), мы решили называть тоже расхождением по подмаске, где набор тегов будет пустой, верно?

  104. Oleg Sychev repo owner

    Вы серьезно думаете что я помню в деталях, о чем мы говорили почти месяц назад? Есть только один способ это восстановить - снова сесть вместе, снова вырисовать все случаи и снова решить задачу.

    Вы бы записывали потщательнее эти вещи, на память тут полагаться очень плохая идея.

  105. Log in to comment