Методы отладки

Тема в разделе "Машинное отделение", создана пользователем WildCat, 22 дек 2006.

  1. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Думаю будет интересно узнать, что говорил Торд Ромстад о методах отладки:

    # Extend the UCI/XBoard command set with a few commands of your own for use in debugging. In particular, it is useful to have a command for looking up the current position in the hash table and printing the information (score, score type, best move, etc). to the standard output. You can use this to browse the search tree after a search is finished. When you want to know why the program discarded some move, you can make the move and inspect the hash table entry for the corresponding position to find the score and refutation. I've found this to be a very valuable debugging technique, and even have a simple GUI app for browsing the tree (the GUI app communicates with the engine through pipes connected to the standard input and output).

    # The technique above can be further enhanced by including lots of additional information in the hash table when debugging the program. I sometimes store complete move lists with information about extension, reduction and pruning decisions for each move in every transposition table entry. Of course this makes each entry huge and greatly slows down the search, but it can be useful when chasing bugs or looking for ways to make the search more efficient.

    # Implement an MTD(f) search, even if you intend to use PVS. MTD(f) is great for debugging the hash table; all sorts of obscure bugs which are very tricky to find in PVS or other conventional searches suddenly become easy to spot.

    # Whenever you add some non-trivial new function to your program, try to write two versions: One which is very slow and stupid, but almost certainly correct, and one which is highly optimised. Verify on a huge number of positions that they give the same results. Remove the slow version only when you feel 100% sure that the fast version is correct.

    # Always make symmetry tests when you add a new term to your evaluation function.

    # Run through a simple tactical test like WAC at 5 seconds/move every time you change something important in your search. Don't try to optimize the results, but just make sure that the score doesn't suddenly drop dramatically.

    # Check the quality of your move ordering by measuring how often a beta cutoff occurs on the first move, and the frequencies with which the 1st, 2nd, 3rd, ... move turns out to be best at PV nodes.

    Надеюсь все понимают по-нерусски.

    Мне особенно понравился 4-ый совет.
  2. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    За пол-года до этого наверно доходит каждый самостоятельно...
    У меня нет только теста на симметричность (обязательно сделаю), всё остальное я использую.
  3. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Совет про MTDF мне не совсем понятен.
  4. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    смысл в том, что MTD(f) очень нестабильный метод, и на нем очень сказывается нестабильность перебора, неправильная оценка (взятая с предыдущей итерации) и т.д.
    Но насчет Хеша - я тоже не понял. Самый чувствительный к качеству сортировок метод - Это чистая Альфа-Бета. А mtd(f)-у нужен только качественный EMT - Хеш перекрестных позиций.
  5. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    У тебя каждая функция (или хотя бы только не очень элементарные) имеет по две реализации? Чтобы так делать нужно признать, что пишешь глючные программы. До такого я самостоятельно бы не додумался.
  6. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    У меня перебор на Aspiration Search колбасит.
    На PVS колбасит непадецки.
    О MTD(f) даже страшно и подумать :/
  7. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Нет, у меня не бывает двух версий одной функции, у меня бывают две версии программы с разной реализацией этой функции (например так я отлаживал LMR - пробовал несколько абсолютно разных схем)
  8. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Кстати, а если выносить использование определенного вида LMR в настройку - тогда будет две версии функции :)
  9. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    В 4-ом совете имелось в виду, если есть желание сделать и потом использовать какую-то особо хитрую функцию, то нужно сделать две ее версии.
    Одну хитрую и навороченную, как и задумывали ;)
    Вторую очень просто и понятно - даже пусть она очень и очень тормозит. Главное вероятность ошибки в ней близка к нулю. Но даже если, будет ошибка, то вероятность, что в двух функциях одинаковые ошибка вообще ничтожна.

    Далее программ с обоими этими функциями должна вести себя одинаковым образом (отличия будут только в скорости).

    Таким образом можно быть уверенным, что не вносишь багов в программу.
  10. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Имелось в виду две версии, но дающие абсолютно эквивалентный результат (кроме скорости выполнения).
  11. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Это видимо для тех кто еще не очень уверен в своих силах. У меня обычно очень мало ошибок в программах, поэтому я сразу пишу метод как задумывал, не пытаюсь сделать медленных но безошибочных версий :)

    А расширяемой окно - более гибкий метод, чем Negascout, и должен давать лучшие результаты - только его настраивать замучаешься :) (Negascout -это частный случай, с двумя размерами окна - нулевым и полным)
  12. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Так обычно думают начинающие. Раньше я тоже так думал. Теперь думаю по другому, но все равно лень лишние функции делать :)

    Вряд ли Торда можно считать не уверенным в своих силах. Он явно один из лучших.
  13. atoku Модератор

    • Команда форума
    Рег.:
    05.02.2006
    Сообщения:
    2.949
    Симпатии:
    9
    Репутация:
    0
    Адрес:
    USA
    Оффлайн
    NS, жжош! :D
  14. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Эт почему? Я всё-таки 20 лет пишу, и сделал кучу коммерческих проектов.
    Никто на ошибки не жалуется. :)
  15. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Ну что это за программер у которого даже нет ошибок в программах? :rolleyes:
  16. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    А вот так-вот :)
    У меня бывают Фичи, а вот Багов у меня нет :)
    Ошибки может и есть - но никто не жалуется :)
    Значит их очень мало.
  17. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Или боятся... :cool:
  18. Kirr Администратор

    • Команда форума
    Рег.:
    11.02.2006
    Сообщения:
    1.208
    Симпатии:
    22
    Репутация:
    8
    Оффлайн
    NS, ты ведь пишешь финансовый софт. Ошибки просто используют. :cool:
  19. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    продам задешево 4 бага...
  20. atoku Модератор

    • Команда форума
    Рег.:
    05.02.2006
    Сообщения:
    2.949
    Симпатии:
    9
    Репутация:
    0
    Адрес:
    USA
    Оффлайн
    Методы отладки просто ушли в анекдот :) А ведь в глубине NS прав: надо писать просто так, чтобы отладка была не нужна. Только ни на C ни на навороченном Паскале это просто невозможно.

    В общем, бросаем весь этот мусор и переходим на Lisp :)
  21. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Это как? У меня есть только две версии или речь о элементарной программе или о никому не нужной.
  22. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Отладка и тестирование нужны всегда!
    И всегда они присутствуют.
    А вот ошибки нужны далеко не всегда. :)
    И писать не то что нужно, и не так как нужно, причем в двух версиях - это хитро :)

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

    Есть программа, есть тестеры - они ищут ошибки - но это же не дублирование одного и того-же метода :)

    Возможно включение большого числа отладочной информации в метод - но это не две версии одного метода.

    Вот если бы кто-нибудь привел простой пример того что имеется в виду :)

    Я изначально понял что Тод пишет о сравнении двух разных методов.
  23. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Например, для отладки инкрементального вычисления Зобрист-хэша полезно написать функцию, считающую хэш в каждой позиции "с нуля", и время от времени сравнивать значения. Эта техника мне в своё время реально помогла отловить пару ошибок в своей реализации. И не только мне, насколько я знаю.
  24. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Второй пример - вычисление perft двумя способами, "в лоб" и с использованием хэша для хранения уже вычисленных значений. Помогает отлавливать ошибки как в схеме хэширования, так и в генераторе/исполнителе ходов.
  25. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Но в ветке говорится не о двух разных методах вычисления perft :)
    А об одном. Один безопасный (прибавляем по одной позиции), а второй раскованный, прибавляем в каждой позиции число легальных ходов :) Причем сразу две процедуры в одной программе :)
  26. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Всё-таки надо определиться, о чем идет речь.
    О дублировании разных алгоритмов для одного метода, или дублировании одного и того-же алгоритма, только один вариант медленный и безопасный, а второй быстрый, но возможно с ошибками...


    Первое - я понять могу, а вот второе ну никак не понимаю. :)
  27. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Например, у меня есть функция генерации шахов, но она немного хитрая и я не уверен, что она работает правильно в 100% случаев.
    Можно порпробовать написать функцию генерации шахов очень простым и ясным, но медленным способом. И чтобы шахи генерились в той же последовательности.
    Тогда можно будет сравнить на наборе позиций насколько программа ведет себя одинаковым образом с двумя этими функциями.
    Т.о. можно убедится, что шахи всегда генерятся правильно.

Поделиться этой страницей