Форум » » IPPOLIT & ROBBOLITO » Ответить

IPPOLIT & ROBBOLITO

Bison: Предлагаю обсудить особенности устройства Ипполита. Все-таки некаждый день появляются сильнейшие opensource программы.

Ответов - 251, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 All

VP: Bison мы давно тебя ждем здесь http://immortal223.borda.ru/?1-2-0-00000151-000-260-1

Bison: Первое впечатление от кода - очень трудно его разобрать. Не совсем корректные названия типичных переменных только усиливают это впечатление: below вместо alpha, above вместо beta - мелочи по-сравнению с murderer вместо killer. Штук 10 поисковых функций тоже никак не помогают читабельности. Первое новшество, что я заметил - это IID [pre2] // IID if (!transpositional_movement && deepness >= 6) { itog = below; if (deepness >= 10) { itog = white_pv (below - deepness, above + deepness, deepness - 8, shah); if (itog > below - deepness) transpositional_movement = (tower_structure + 1)->move; } if (itog > below - deepness) itog = white_pv (below - deepness, above + deepness, deepness - 4, shah); if (itog > below - deepness) transpositional_movement = (tower_structure + 1)->move; } else if (deepness >= 10 && deepness > hash_deepness + 8) { itog = white_pv (below - deepness, above + deepness, deepness - 8, shah); if (itog > below - deepness) transpositional_movement = (tower_structure + 1)->move; if (itog > below - deepness) { itog = white_pv (below - deepness, above + deepness, deepness - 4, shah); if (itog > below - deepness) transpositional_movement = (tower_structure + 1)->move; } } [/pre2] из функции white_pv(). Окно зависит от глубины + функция охватывает очень большие глубины (deepness >= 10). Все это, очевидно, весьма кстати при нахождении тактики.

Bison: VP Я думаю, лучше там особо не флудить, больно уж тема объемная.


VP: Bison согласен

Bison: Немного погонял третью рыбу против Ипполита, пондерхит получается пока очень высокий (особенно если сравнивать со Stockfish. [pre2] Rybka 3 32-bit - IPPOLIT 0.080a 20.5 - 24.5 45.56% Rybka 3 32-bit - Stockfish 1.5 JA 32.5 - 12.5 72.22% 53.0 - 37.0 58.89% [/pre2] Пондерхит Rybka 3 32-bit - IPPOLIT 0.080a 74.57% (827/1109) Для сравнения со Stockfish 1.5 Rybka 3 32-bit - Stockfish 1.5 JA 52.56% (626/1191)

Bison: Программа для расчета пондерхита. Партии

Bison: Для глубокого поиска Ипполит имеет на мой (весьма беглый) взгляд самый лучший из opensource движков Futility Pruning. Реализуется он, как я понял, через таблицу increment_maximal[16][4095], своим устройством напоминающую History. Стоит все это дело поизучать поподробнее.

Renegat23: WildCat пишет: Для разбора исходников Ипполита лучше создать отдельную ветку. Так она уже создана :) В это ветке их уже разбирают.

Bison: Ponder-а в Ипполите точно нет, иначе была бы команда "ponderhit", без нее никуда.

Osipov: Некоторые сходства с Рыбкой 3: 1. Большинство основных функций – парные: для позиций с ходом белых и – зеркальные – для позиций с ходом черных. Как и в Рыбке. 2. Очень похож расчет таблицы материального дисбаланса. Правда, в Рыбке это одна функция, но это не принципиально. 3. Белопольный и чернопольный слоны имеют разный индекс в таблице материала – тоже Рыбка. 4. В оценочной функции за одну операцию складываются два числа opening и endgame, типа так: za -= (((3) << 16) + (10)). Это Рыбка. 5. Отдельный расчет оценки для пешечника. 6. Похожий принцип пересчета истории. Ипполит: int ist = ISTOR[POZ.pl[(((dv) >> 6) & 077)]][((dv) & 077)]; ISTOR[POZ.pl[(((dv) >> 6) & 077)]][((dv) & 077)] = ist + (((0xff00 - ist) * gl) >> 8); Рыбка 3: history = History[quiet_flag][piece][to]; History[quiet_flag][piece][to] = history - ((history * depth) >> 9); В целом, можно считать Ипполит производным от Рыбки 3. Но отличий очень много, и они настолько существенны, что сделать это мог только тот, кто хорошо разбирается в алгоритмах Рыбки. Я уже год изучаю исходники Рыбки, но так радикально поменять её не смог. Скорее всего, это что-то близкое к Рыбке 4 от автора, но потом кто-то поиздевался над кодом. И ещё кое-что интересное. В конце ОФ есть что-то жуткое: if ((ookDIN->FLAG & 128)) { if (za > 0) { if (POZ.dd[enBELsvet]) za -= .. а дальше – длинное многоэтажное матерное выражение из 4000 символов. Не похоже, чтобы это писала человеческая рука. Рука была явно механическая. Похоже, здесь прошёлся какой-то мощный декомпилятор. Кстати, в Рыбке 3 этой ерунды нет.

immortal223: Osipov Юрий большая просьба - отладьте движок, а! только Вы можете это сделать Я от него в полнейшем восторге. Он ненормально силён! Особенно в эндшпиле. Мульти-ПВ привязать бы к нему для анализа это очень надо!!

Bison: Osipov Юрий, поиск сильно похож на тот, что в Рыбе? Там тоже гора переборных функций? Я, например, до сих пор не докопался, что такого особенного делают функции white_all (), white_exclustion() и white_slide(), что их понадобилось выносить из общего поиска.

Osipov: Immortal223. Отладка Ипполита и прикручивание Multi PV не заставят себя ждать. Есть много хороших программистов. Ещё интересное наблюдение про Ипполита. Сравнил его скорость с оригинальной Рыбкой и "своей". Мне удалось выжать только 40% прироста скорости по сравнению с оригинальной Рыбкой. Но Ипполит на 100% быстрее Рыбки 3, т.е. вдвое.

Osipov: Юрий, поиск сильно похож на тот, что в Рыбе? Там тоже гора переборных функций? Я, например, до сих пор не докопался, что такого особенного делают функции white_all (), white_exclustion() и white_slide(), что их понадобилось выносить из общего поиска. Я пока ещё не копался в поиске Ипполита. Только посмотрел PV-поиск. Тоже сложное впечатление, как и от всего остального - много похожего на Рыбку 3, но много и отличий. Кстати, сколько функций поиска в Ипполите всего? В Рыбке их 20 - по 10 на white и black. Это не считая корня.

Bison: Я насчитал 30 (суммарно за оба цвета), это если считать с black_top () и дальше вниз. Как раз на месяц разбора, если в день по функции

Bison: Но Ипполит на 100% быстрее Рыбки 3, т.е. вдвое. Удвоение скорости, насколько я помню, дает ~70 пунктов Эло, так что в знаниях он не особо прибавил, правильно?

immortal223: Osipov пишет: Отладка Ипполита и прикручивание Multi PV не заставят себя ждать. Есть много хороших программистов. Я просто в нереальном экстазе от этого движка. Это просто сказка какая-то! не поверил бы что такое возможно. Такое потрясение испытывал только в декабре 2005 когда рыбка 1.0 Бета появилась. И немного похожее - когда Рыбка 3 вышла!

Знатный Читер: Юрий Осипов, скажите, пожалуйста, а что вы заканчивали? Очень хочется чувствовать себя так же свободно в программировании. В 2010 собираюсь поступить на заочку в Санкт-Петербургский Политехнический на информационные системы и технологии. На очку уже нет времени.

Bison: Как я и думал, Ипполит уже все изучают (кому надо). mcostalba wrote: Today, in the main forum, there has been a marathon thread about an (almost sure) Rybka's reverse engineered engine called Ippolit. Out of curiosity I looked at the sources, well the source, it is a single, horrid to read, file. I found an idea I never saw before. When null search fails high we simply return beta, eventually after zugzwang verification search. In this case, before to return, the null value (the result of the null search) is saved in the TT table as a LOWER BOUND type node (as it should be) but with NO associated move (as normally happens only for upper bound nodes). I think the logic makes sense: null search is just a normal search but on an undefined move, on an absolutly dumb move, if we anyhow fail high it makes sense to store we are in a cut-off type node and because we don't have searched any specific move we store MOVE_NONE in the hash table. Does anyone have ever heard of such idea before ? For me it is new, but I am not in this field from a long ago Марко Костальба - это тот, кто сделел Stockfish из Glaurunga

immortal223: Bison пишет: Марко Костальба - это тот, кто сделел Stockfish из Glaurunga ждём добавления +100 от стокфиша 2

Bison: Все это с толкчесс Вообще для знающих английский веселая там темка. Одни говорят, что автора Ипполита звали Ида Про, а другие спорят о том, хорошо ли быть капиталистами. Капиталисты - такой мнительный народ, Везде им мерещатся заговоры и перевороты. (с)

Osipov: Удвоение скорости, насколько я помню, дает ~70 пунктов Эло, так что в знаниях он не особо прибавил, правильно? Если бы знать, что такое знания. Если говорить об ОФ, то в Рыбке 3 она посложнее будет. Но и медленнее. Насчет удвоения скорости. В среднем - да, около 70 пунктов. Но это при игре непохожих движков. Если же наш новый движок вдвое быстрее предыдущей версии, и считает соответственно на полуход дальше, но играет по тому же алгоритму, то разница в ЭЛО получится намного больше. Просто такой новый движок всегда будет знать ответный ход соперника и будет редко ошибаться против него. А старый будет ошибаться часто.

Renegat23: Заметил, что Рыбка в отличие от Ипполита значительно чаще и охотнее жертвует качество за проходную пешку и легкую фигуру, получая значительный перевес. Ипполит эту жертву обычно не смотрит.

Renegat23: Еще заметил, что оценка материального дисбаланса у Ипполита с Рыбкой абсолютно разная - иногда вообще прямо противоположная. Это касается как компенсации за ферзя, так и борьбы легких фигур с пешками против тяжелых. Причем непонятно, чья оценка лучше - оба бывало ошибались. Но статистически, Ипполит ошибается реже. Так что если это и клон, то точно не Рыбки 3.

Кевин: IPP_ENG*.c - достаточно ли одного этого файла для компиляции? Скачал Code Blocks 8.02, попробовал скомпилировать - кучу ошибок выдала прога: то ей то не нравится, то это, файлы отсутствуют с расширением *.h и так далее. Исходник bankuss-а такие ошибки не выдаёт, но всё равно не хочет компилироваться и требует какой-то файл. Может, компилятор нужен помощнее? В программировании я не силён.

bankuss: Кевин нужны 2 файла - основной .с и заголовочный .h

bankuss: Исходник bankuss-а я кстати правленные исходники не выкладывал

WildCat: Osipov Не похоже, чтобы это писала человеческая рука. Рука была явно механическая. Похоже, здесь прошёлся какой-то мощный декомпилятор. Нужно смотреть английскую версию Ипполита, т.к. она ближе к оригиналу. Русская получена путем каких-то извращений над кодом.

Renegat23: Кстати. В Рыбке 4 автор вряд ли стал бы настолько координально изменять оценку дисбаланса, ибо она была и без того хороша. Скорее мелкие доработки и усовершенствования по сравнению с Рыбкой 3. Но никак не противоположные оценки! Поэтому, следуя этой логике надо признать, что Ипполит не может быть клоном и Рыбки 4!

WildCat: Renegat23 следуя этой логике Сомнительная логика. Может нужно признать что и Рыбка 3 не является клоном Рыбки 2?

Кевин: bankuss пишет: я кстати правленные исходники не выкладывал А, ну не помню кто, но выкладывали файл IPPOLIT 64 1Gb SOURCE, ThinkingAlot2, может, так там есть h-файл. На сайте автора Ипполита можно скачать только IPP_ENG.c и IPPOLIT.c Где же взять h-файл? Очень надо. Из IPPOLIT 64 1Gb SOURCE не подойдёт? Или самому нужно его делать?

bankuss: Кевин пишет: На сайте автора Ипполита был, я скачивал. только его переименовать надо. он как раз под 32-б заточен. сам не сделаешь, там код проги.

Bison: Вот исходники все

Кевин: bankuss пишет: был, я скачивал. только его переименовать надо. он как раз под 32-б заточен. сам не сделаешь, там код проги. Точно, это windows32.h, я его тоже скачал, но не подумал переименовать. Но Bison , всё равно спасибо.

md: Ктож первым прикрутит ипполиту многоядерность и поддержку tbs?

Кевин: md пишет: Ктож первым прикрутит ипполиту многоядерность и поддержку tbs? Тому плюсы в репутацию и награду за труды Не так это просто сделать, как видимо.

Lancelot: md пишет: Ктож первым прикрутит ипполиту многоядерность и поддержку tbs? Васик Райлих. И появится Рыбка 4.

WinPooh: Ну что, господа присяжные заседатели, кто-нибудь уже понял, в чём у него фишка и где у него кнопка?

Bison: WinPooh Я думаю, фишка в поиске, а в чем именно надо смотреть.

ThinkingALot: Osipov пишет: Ипполит на 100% быстрее Рыбки 3 Может это следствие разных алгоритмов поиска? Для такой сложной оценки Ипполит показывает нереальную скорость в килонодах.

Bison: Если Ипполит имеет какое-то отношение к Рыбке, то надо признать, что Васик очень трудолюбивый человек, потому как многие идеи Ипполита лежат вроде как на поверхности, только вот испробовать их у многих руки не доходят. Вот, например, такое продление поиска (extension) white_pv () [pre2] if (deepness >= 16 && S->transpositional_movement && singular < 2 && white_ok (S->transpositional_movement)) { // реальная глубина в 2 раза меньше // white_exclustion () - функция ищет все ходы, кроме trans move move = S->transpositional_movement; kk = ((move) & 077); ot = (((move) >> 6) & 077); white_spell (move); // делаем ход evaluation_scoring (-0x7fff0000, 0x7fff0000, move); if (((tower_structure + 1)->white_king_check)) { white_unspell (move); goto zab; } score = -black_pv (-above, -below, deepness - 10, (((tower_structure + 1)->black_king_check)) != 0); white_unspell (move); // отмена хода назад if (shah) // нам шах itog = white_exclustion_check (score - deepness / 2, deepness - (((12) <= (deepness / 2)) ? (12) : (deepness / 2)), move & 0x7fff); else itog = white_exclustion (score - deepness / 2, deepness - (((12) <= (deepness / 2)) ? (12) : (deepness / 2)), move & 0x7fff); if (itog < score - deepness / 2) // все остальные ходы проигрывают нашему ходу из trans { singular = 1; // т.н. "единственность" (чем больше, тем хуже остальные ходы, как-то так) if (shah) itog = white_exclustion_check (score - deepness, deepness - (((12) <= (deepness / 2)) ? (12) : (deepness / 2)), move & 0x7fff); else itog = white_exclustion (score - deepness, deepness - (((12) <= (deepness / 2)) ? (12) : (deepness / 2)), move & 0x7fff); if (itog < score - deepness) singular = 2; } } [/pre2] там же ниже [pre2] while ((move = white_next (S))) { ... novel_deepness = deepness - 2 + (((stretches) >= (singular)) ? (stretches) : (singular)); // новая глубина // stretches - обычные extensions ... } [/pre2] Простая идея - если остальные ходы кажутся значительно более плохими, то единственный "хороший" ход посчитаем поглубже. Другое дело, что прибавка от extensions редко бывает значительной.

immortal223: Bison нам простым юзерам хочется что-нить попроще... Например для началу мультик прикрутить, для более удобного анализа это реально вообще?

Bison: immortal223 Все уже прикручено другими. В Shredder Classic жмешь F11 во время анализа и смотришь мультик

immortal223: Bison Это не мультик - это доска анализа текущего варианта Мультик - это F6

Bison: immortal223 Блин, а я думаю, что за мультик А это оказывается МультиПВ. Сделать реально, скоро кто-нибудь точно присобачит, я уверен.

Osipov: Ещё раз про скорость Ипполита. Оказалось, что я неправильно сравнивал с Рыбкой. Рыбка считает узлы только в make_move, а Ипполит ещё и в нулевом ходе: nodals_nobody. Поэтому и показывает более высокую скорость. Надо будет проверить, на сколько это отличается.

grifsergei: Есть ли у рыбки (Ипполита) кардинальное отличие от других движков? если да , то в чем оно?

bankuss: в версии hashPV добавлено: #define hash_variated_size (0x100000) #define hash_variated_mask ((hash_variated_size - 1) & 0xfffffffffffffffc) type_hash_variated table_hash_variated[hash_variated_size]; в процедуре wipe_hash изменено: memset (table_hash_variated, 0, hash_variated_size * sizeof (type_hash_variated)); в процедурах: white_pv;black_pv;white_cut_check;black_cut_check;white_cut;black_cut;white_all;black_all;white_all_check;black_all_check добавлено: type_hash_variated *hash_variated; + код: if (deepness >= 6) { k = apropos_hash & hash_variated_mask; for (i = 0; i < 4; i++) { hash_variated = table_hash_variated + (k + i); if (hash_variated->hash_64bit == apropos_hash) { if (hash_variated->deepness >= deepness) return hash_variated->score; } } } но я заметил, что в white_pv этот код вставлен не так, как в других. у себя поправил.

ThinkingALot: Во всех функциях кроме white_pv() и black_pv() условие deepness >= 6 нужно для того, чтобы гарантированно не было тормозов. Можно его убрать везде, скорей всего скорость не изменится, но для эффективности поиска это ничего не даст. А вот добавлять (deepness >= 6) в white_pv() и black_pv() бессмысленно - на них приходится меньше 1% времени выполнения программы.

bankuss: ThinkingALot а ну да, в этих функциях условия на глубину нет.

bankuss: ThinkingALot вот, проверь все ли так :) http://ifolder.ru/14601817 я там кое-какие переменные переименовал

ThinkingALot: Залил в основную ветку версию 0080d hpv. Это исходники из поста выше+ 1) & hash_variated_mask в pv_hashize(). 2) Вызов pv_hashize из hash_exactly только если depth >= 2. 3) В cut/all функциях поиска hash_variated смотрится после основного хэша. 4) Хэширование результата перебора в корне. 5) Все настройки вынесены в .h файл в виде $define XXX. Соответсвенно комментируем/не комментируем строчки с #undef XXX. 6) Дальнейшая замена deepness, below, above на привычные аналоги. 7) Оболочке отсылается название программы, записанное в файле Ippolit.txt. P.S. Моя компиляция скорее всего будет вылетать.

bankuss: ThinkingALot спасибо! сейчас 32-шку проверил, все нормально. это я где то не так вставил твой код видимо: смотрел прогой-сверялкой 2-х txt файлов и там смотрел разницу. а под мультик, я так понимаю, нужен массив структур (ходы, оценка, узлы) и в корне перебора все это в нужные места рассовывать?

Osipov: Проверил ещё раз скорость Ипполита - убрал подсчет узлов в нулевом ходе. Число узлов уменьшилось примерно на 15%. Итого, получается, что Ипполит примерно на 85% быстрее Рыбки 3. Еще просьба - для устранения багов. Может кто-нибудь дать позиции, в которых Ипполит падает или жертвует ферзя, или показывает мат в 500 ходов? А то я прогнал на своём стандартном EPD-тесте из 800 позиций и вроде бы нормально прошло.

ThinkingALot: Жертва ферзя - это баг русской версии. Падают только мои компиляции (сейчас собрал с Multi-threaded DLL вместо Multi-threaded, вроде пока без проблем). Причем только когда ставлю играть матч - бесконечный анализ работает на ура. Поэтому воспроизвести баг не получается.

Otodranik: Баги, мною замеченные: Время беспардонно просрочил Вообще на загрузился

Behovodec: У меня есть вопросы к анализу в Арене. В данном случае анализ стартовой позиции Ипполитом 0.080a w32.

immortal223: Behovodec У тебя старая версия очевидно.

Osipov: Otodranik, из картинок не понятно, что там происходило и в какой момент. Если это происходило в партии, то лучше дать PGN. Но лучше - просто позиция (fen-строка), в которой происходит глюк, причём очень желательно - воспроизводимый.

ms 13: Вот например [Event "1"] [Site "."] [Date "2009.10.18"] [Round "18.1"] [White "Rybka 3"] [Black "IPPOLIT 0.080a"] [Result "1-0"] [ECO "D43"] [Annotator "0.00;-0.08"] [PlyCount "197"] [EventDate "2009.10.18"] [EventType "tourn"] [TimeControl "60+1"] {AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ 2612 MHz W=13.1 plies; 82kN/s; 2 398 TBAs; My book 17.ctg B=16.3 plies; 1 047kN/s; pferdchen3.ctg} 1. d4 { B/0 0} Nf6 {B/0 0} 2. c4 {B/0 0} e6 {B/0 0} 3. Nc3 {B/0 0} d5 {B/0 0} 4. Nf3 { B/0 0} c6 {B/0 0} 5. Bg5 {B/0 0} h6 {B/0 0} 6. Bxf6 {B/0 0} Qxf6 {B/0 0} 7. e3 {B/0 0} Nd7 {B/0 0} 8. Bd3 {B/0 0} dxc4 {B/0 0} 9. Bxc4 {B/0 0} g6 {B/0 0} 10. O-O {B/0 0} Bg7 {B/0 0} 11. Rc1 {B/0 0} O-O {B/0 0} 12. b4 {B/0 0} Qe7 {B/0 0} 13. Qb3 {B/0 0} b6 {B/0 0} 14. e4 {B/0 0} Bb7 {B/0 0} 15. Rfe1 {B/0 0} Rac8 { B/0 0} 16. a4 {B/0 0} Rfd8 {-0.08/12 2} 17. h3 {0.00/11 4} a6 {(Сf8) -0.14/13 5 } 18. Rcd1 {(g3) 0.01/10 2} b5 {-0.32/14 2} 19. Bf1 {-0.19/11 2} Bf8 { -0.27/16 3} 20. Rb1 {-0.20/12 3} e5 {-0.27/16 4} 21. axb5 {-0.23/12 3} cxb5 { -0.27/16 3} 22. Nd5 {-0.21/13 3} Qd6 {-0.30/15 1} 23. dxe5 {-0.22/12 4} Nxe5 { -0.30/13 0} 24. Nxe5 {(Лed1) -0.22/13 2} Qxe5 {-0.42/15 2} 25. Qa2 {-0.20/13 3} h5 {(Лd6) -0.77/15 13} 26. Rbd1 {-0.23/10 2} h4 {-0.56/14 2} 27. Nb6 { -0.28/11 4} Bd6 {-0.56/14 1} 28. Rxd6 {-0.28/12 2} Qxd6 {-0.56/17 3} 29. Nxc8 { -0.28/11 0} Qxb4 {-0.56/17 2} 30. Rb1 {-0.31/13 4} Qxe4 {-0.56/17 1} 31. Na7 { -0.31/11 0} Ra8 {-0.54/17 1} 32. Rd1 {-0.31/13 2} Qe7 {-0.54/15 0} 33. Nxb5 { -0.27/13 4} axb5 {-0.46/17 3} 34. Qd2 {(Фb3) -0.19/13 3} Bc6 {-0.44/16 2} 35. Rc1 {(Фc3) -0.19/13 3} Ra6 {(Сe8) -0.45/15 3} 36. Qd4 {-0.17/12 1} Kh7 { -0.35/15 2} 37. Rc2 {-0.18/13 3} Bd7 {(Лa4) -0.32/16 2} 38. Rd2 {0.00/14 3} Be8 {(Сc6) -0.32/16 1} 39. Re2 {-0.06/13 2} Re6 {-0.32/14 0} 40. Rxe6 {-0.05/15 2} fxe6 {-0.32/19 1} 41. Qe5 {-0.06/15 1} b4 {-0.32/19 1} 42. Bc4 {-0.06/15 1} Bf7 {-0.25/19 3} 43. Ba2 {-0.07/15 3} Kg8 {-0.25/19 2} 44. Bb3 {-0.09/14 1} Qd8 { -0.26/18 4} 45. Bc4 {(Фf4) -0.09/14 2} Kh7 {(Фd2) -0.44/16 1} 46. Bf1 { -0.13/13 1} Qd7 {-0.58/17 3} 47. Qf6 {(Сc4) -0.41/12 2} Kg8 {-0.71/17 1} 48. Qxh4 {-0.48/12 1} Qd2 {(b3) -0.70/18 3} 49. Bc4 {(Фg3) -0.64/11 2} Qc1+ { -0.80/18 2} 50. Bf1 {-0.62/14 1} Qe1 {(Фc3) -1.11/18 7} 51. Qd8+ {-0.68/12 2} Kg7 {-1.11/16 0} 52. h4 {-0.81/13 2} Qe5 {-1.11/17 1} 53. Qd3 {-0.81/12 2} Qc3 {-1.13/17 1} 54. Qe4 {(Фe3) -0.78/13 2} e5 {(b3) -1.35/16 2} 55. h5 { (g4) -1.12/12 3} Qd4 {-1.86/16 2} 56. Qb7 {(Фf3) -1.11/13 4} gxh5 {-1.88/14 0} 57. Qe7 {(Сe2) -1.11/13 6} b3 {-1.75/18 5} 58. Qg5+ {-1.11/12 5} Kf8 { -1.89/18 3} 59. Qh6+ {-1.14/12 2} Ke8 {(Крg8) -1.89/18 1} 60. Bb5+ {-0.91/11 1} Ke7 {-1.89/16 0} 61. Qg5+ {-0.95/13 2} Kd6 {-1.85/18 5} 62. Qf6+ {-0.92/13 3} Be6 {-1.85/16 0} 63. Qf8+ {-0.92/13 1} Kd5 {-1.85/17 9} 64. Qe8 {-0.92/13 1} Qb6 {-1.89/18 3} 65. Bd3 {-0.92/13 3} b2 {-1.89/17 1} 66. Bb1 { (Ф:h5) -0.92/13 2} Kc4 {-1.81/16 2} 67. Qxh5 {(g3) -1.03/12 2} Qd4 {-1.91/16 0} 68. Qe2+ {(Фe8) -1.03/12 1} Kb4 {-1.93/15 0} 69. Qf3 {(Фe1+) -1.03/13 1} Bc4 { (Сd5) -1.99/15 1} 70. Qf8+ {(Фf5) -1.03/13 2} Kc3 {(Фc5) -2.76/13 0} 71. Qf5 { -2.14/11 2} Bd3 {(Крb4) -2.76/11 0} 72. Bxd3 {-2.07/12 1} Qxd3 {-3.06/15 0} 73. Qxe5+ {-2.07/11 0} Kb3 {-3.06/14 0} 74. Qe6+ {-2.07/13 1} Kc2 {-2.89/18 1} 75. Qc6+ {-2.07/14 1} Kd2 {-2.89/17 0} 76. Qh6+ {-2.07/14 2} Ke1 {-2.89/19 1} 77. Qe6+ {-2.07/15 1} Qe2 {-2.89/18 0} 78. Qb6 {-2.07/16 1} Qf1+ {-2.89/18 7} 79. Kh2 {-2.07/17 0} Qxf2 {-2.89/19 4} 80. Qb4+ {-2.07/17 1} Kd1 {-2.85/19 1} 81. Qa4+ {(Фg4+) -2.07/17 1} Qc2 {-2.87/17 2} 82. Qd4+ {-2.07/17 0} Ke2 { (Фd2) -2.86/18 0} 83. Qe5+ {(Фg4+) -2.07/16 1} Kd2 {(Крd3) -2.86/18 2} 84. Qd4+ {-2.07/16 1} Kc1 {(Крe1) -2.86/17 2} 85. Qg1+ {(Фf4+) -2.06/15 2} Qd1 { -2.89/15 0} 86. Qc5+ {-2.07/16 1} Kb1 {-2.86/18 1} 87. Qc4 {(Фf5+) -2.07/16 1} Qg1+ {(Фc2) -71.72/14 2} 88. Kxg1 {#11/3 0} Ka1 {#11/0 0} 89. Qa6+ {#11/0 0} Kb1 {#10/0 0} 90. Kf2 {#10/0 0} Kc1 {#9/0 0} 91. Qc4+ {#9/0 0} Kd2 {#8/0 0} 92. Qb3 {#8/0 0} b1=Q {#7/0 0} 93. Qxb1 {#7/0 0} Kc3 {#6/0 0} 94. Qe4 {#6/0 0} Kb2 {#5/0 0} 95. Ke3 {#5/0 0} Kc3 {#4/0 0} 96. Qa4 {#4/0 0} Kb2 {#3/0 0} 97. Kd2 { #3/0 0} Kb1 {#2/0 0} 98. Kc3 {#2/0 0} Kc1 {#1/0 0} 99. Qc2# {#1/0 0} 1-0

Osipov: Извиняюсь, PGN партий пожалуй не подойдёт. Там играли на время, а это почти нереально воспроизвести. Ладно, придётся самому искать глюки. Сегодня провёл турнир под своей оболочкой между Ипполитом и "своей" версией Рыбки 3. Играли 412 партий из 206 начальных позиций, оба считали на фиксированную глубину depth=6. Начиная с 12-й партии на Ипполита напала порча - начал сливать всё подряд. Где-то между 220-й и 280-й партиями почему-то восстановился и начал выигрывать. Потом опять провалился и слил. Итог: +60 -268 =84 в пользу Рыбки. Было несколько партий, где Ипполит надолго задумывался - тратил времени раз в 10 больше, чем Рыбка. И узлов в итоге насчитал почти в 3 раза больше. Есть над чем подумать.

Кевин: Osipov , bankuss и другие программисты: какой компилятор посоветуете? Как для компиляции Ипполита, так и вообще. Хочу немного поизучать языки программирования, раз уж тут такая интересная тема - на руках есть исходникик Ипполита.

bankuss: Кевин просто для изучения достаточно бесплатной версии VS express (2005 или 2008). качается с мелкософта. а так, самый быстрый код выдает компилятор от intel, но он в версии для windows стоит немалых денег.

NS: http://software.intel.com/en-us/articles/intel-c-compiler-professional-edition-for-windows-evaluation/ Вот тут можно скачать месячный триал.

kpripper: Прикрутите кто-нибудь поддержку нескольких линий в анализе или это сложно ?

bankuss: kpripper было бы просто, давно бы сделали.

unknow: Кевин пишет: какой компилятор посоветуете? Я пользую CodeLite (это IDE - редактор и отладчик) + компиляторы MinGW. Это всё бессрочно бесплатно. Для компиляции Ипполита с помощью MinGW надо в localdefs.h заменить ассемблерный инлайн BSF/BSR на: [pre2] extern int asm_rbit_pos(UINT64 val) __attribute__ ((regparm(2))); #define BSF asm_rbit_pos extern int asm_lbit_pos(UINT64 val) __attribute__ ((regparm(2))); #define BSR asm_lbit_pos [/pre2]и добавить в проект CodeLite исходник asm.s с текстом: [pre] ############################################################ # int asm_rbit_pos(u64 val) __attribute__ ((regparm(2))) # lo32 -> %eax # hi32 -> %edx .globl _asm_rbit_pos _asm_rbit_pos: testl %eax, %eax jz r_hi bsfl %eax, %eax jmp r_ret r_hi: bsfl %edx, %eax addl $32, %eax r_ret: ret ############################################################ # int asm_lbit_pos(u64 val) __attribute__ ((regparm(2))) # lo32 -> %eax # hi32 -> %edx .globl _asm_lbit_pos _asm_lbit_pos: testl %edx, %edx jz l_lo bsrl %edx, %eax addl $32, %eax jmp l_ret l_lo: bsrl %eax, %eax l_ret: ret [/pre] Ну и еще добавлять в конец длинных 16-ричных констант суффикс ULL, чтобы warning'и не сыпались при компиляции.

Renegat23: Господа программисты (ThinkingALot, Bison, Osipov, NS, WildCat, WinPooh, ChessTerminator75, bankuss). Два вопроса. 1) Почему ослабела версия d по сравнению с b ? 2) Возьметься все-таки кто-нибудь приделывать движку многопоточность или так друг на друга и будем кивать?

immortal223: Renegat23 пишет: 2) Возьметься все-таки кто-нибудь приделывать движку многопоточность или так друг на друга и будем кивать? Ака ты махнул с многопоточностью! Я бы просто хотел multiPV увидеить для начала, а то для анализа он очень неудобен пока что, кроме того в ИДЕЕ аквариумской он тоже не работает :( так как команду searchmoves тоже не поддерживает.. А там глядишь уже и рыбка 4 поспеет и как верно замечено было - все постепенно забудут про Ипполит, пока не выйдет Ипполит 2 основанный на коде Рыбки 5

Renegat23: immortal223 пишет: Я бы просто хотел multiPV увидеить для начала ИМХО, многопоточность гораздо более актуальна, чем mPV. Анализировать вполне можно и по одной линии. А вот скорость...

ThinkingALot: Renegat23 пишет: 1) Почему ослабела версия d по сравнению с b ? 2) Возьметься все-таки кто-нибудь приделывать движку многопоточность или так друг на друга и будем кивать? 1) Смысл версии d исключительно в длительном хранении результатов анализа. Почему играет слабее - без понятия. Может статистическая погрешность. Разница скорее всего в пределах 20-30 пунктов. 2) Это очень долго и скучно. К примеру, просто переопределение всех структур под мультипоточность для движка по сложности сопоставимого со Стрелкой заняло у меня пол дня. Код Ипполита многократно сложнее. При этом распараллеливание a-la Фрукт может запросто вообще не сработать, а нормальный алгоритм, как в Stockfish, - это возня с каждой из множества функций поиска.

immortal223: Renegat23 Зато приделать её в 100 раз труднее

bankuss: кстати, если компилять интеловским компилятором в дебаг режиме, то он при запуске ехе начинает ругаться на static __inline int BSF (UINT64 x) { int y; _BitScanForward64(&y,x); return y; } что эта функция портит стэк

ThinkingALot: Есть какое-нибудь ускорение от ICC?

bankuss: ThinkingALot не известно. если release версию сделать то к 12 полуходу она вызывает ошибку и вылет в ос

ThinkingALot: Возмодно поможет одно из 3x: 1) Переписать BSF/BSR на ассемблере: bsf/bsr rax, x 2) Убрать опции /Qipo, /ipo - в общем отключить interprocedural optimization. 3) Попробовать Profile Guided Optimization.

ThinkingALot: Погонял infinite analysis по несколько минут версии d в сравнении с b. Создалось впечатление, что у d больше branching factor. То есть глубины 16 достигают примерно одновременно, а до 20 версия d считает в несколько раз дольше. Хотя возможно это всего лишь статистическая погрешность.

дуп: Может быть немного не в тему, извиняйте. Надоело глядеть на эти дебильные имена, вручную переименовывать влом, все-таки 14,5 тысяч строк. Решил механизировать процесс. Начал писать программульку, завтра будет готова. Только писать тоже влом, может быть у кого готовое чего есть, чтобы не изобретать велосипед. Задумка такая: Создаешь папку, туда эту самую прогу и любой текстовый файл, например "IPP_ENG.c". Вводишь старое слово и новое. И все. Прога создает тут же новый файл, точно такой же и с таким же расширением. Все различия - все заданные имена поменяны на новые. Так есть у кого чего-нибудь наподобе?

Ramzes II: А зачем изобретать велосипед? Тот же Notepad++ способен заменять имена.

Gata: Обычный блокнот тоже справится

дуп: Во, а я и не знал про Блокнот Спасибо.

Steven Edwards: Is it possible to make MP version of Ippolite ?

никел: Yes, it will be called Igorrit

Кевин: bankuss пишет: но он в версии для windows стоит немалых денег. Так можно же с лекарством скачать Intel(R) C++ Compiler Professional Edition for Windows* Version 11.1.035 Год выпуска: 2009 Версия: 11.1.035 Разработчик: Intel Corporation Платформа: Windows NT 4.0/XP/Server 2003 32-bit Editon Совместимость с Vista: неизвестно Системные требования: Intel C++ Compiler Professional Edition for Windows can be used on, and develop code for, Intel processors since the Intel® Pentium® 4 processor. Язык интерфейса: только английский Таблэтка: Присутствует Описание: Intel C++ Compiler Professional Editions лучшее средство для создания многопоточных приложений под Windows. В профессиональной версии реализована расширеная оптимизация, поддержка процессоров, векторизация, авто-параллелизм, OpenMP, развертка циклов вместе с высоко оптимизированными библиотеками. Содержание пакета: Intel(R) C++ Compiler Professional Edition for Windows* Version 11.1.035 Intel(R) Math Kernel Library 10.2 for Windows* Intel(R) Integrated Performance Primitives 6.1 Intel(R) Threading Building Blocks 2.1 for Windows, Update 4 [hideguest]http://torrents.ru/forum/viewtopic.php?t=2303268[/hideguest] Вот теперь и поработаю, когда будет время.

atri: Перечитал ветку на крестбуке по поводу появления Стрелки+появление Рыбкина. Нашел там интересную фразу Юрия Осипова Версия 2.4 по алгоритму совершенно одинакова с 1.8. Изменен только расчет времени на обдумывание хода. Это попытка нащупать путь к более оптимальному распределению времени по партии. В идеале хотелось бы найти критерии для выполнения "instant move", а« также критерии для глубокого размышления в критических позициях.» Оригинальный текст Вся соль в том, что наблюдая за тестами Иполита я заметил, что он часто расходует время больше обычного в критических ситуациях, и часто этим переигрывает Рыбку. ИМХО конечно, но автор похоже реально мастер

ThinkingALot: дуп пишет: Может быть немного не в тему, извиняйте. Надоело глядеть на эти дебильные имена, вручную переименовывать влом, все-таки 14,5 тысяч строк. Решил механизировать процесс. Начал писать программульку, завтра будет готова. Только писать тоже влом, может быть у кого готовое чего есть, чтобы не изобретать велосипед. Задумка такая: Создаешь папку, туда эту самую прогу и любой текстовый файл, например "IPP_ENG.c". Вводишь старое слово и новое. И все. Прога создает тут же новый файл, точно такой же и с таким же расширением. Все различия - все заданные имена поменяны на новые. Так есть у кого чего-нибудь наподобе? Visual Studio: Ctrl+F->Quick Replace->Replace All Есть еще полезная функция (Клик правой кнопкой мыши)->Collapse all definitions. Гораздо проще ориентироваться в коде, особенно неструктурированном, как у Ипполита.

immortal223: ThinkingALot bankuss А ну-ка, ребята, признавайтесь, что вы там наделали с ИППОЛИТом?? Сравним: [chess]8/5k1p/8/6b1/2P1K3/8/8/8 b - -[/chess] Engine: IPPOLIT 0.080b x64 (512 MB) Yakov Petrovich Golyadkin ... 32/47 0:13 -0.05 1...Be7 2.Kf3 h5 3.Kg2 Ke8 4.Kh1 Bc5 5.Kg2 Kf7 6.Kh1 Kg8 7.Kg2 Bd4 8.Kh1 Kf7 9.Kg2 Ke8 10.Kh1 Kd7 11.Kh2 Bc5 12.Kg2 Ke8 13.Kh1 Kf7 14.Kg2 Bd6 (41.827.137) 3018 Engine: IPPOLIT 0.080d x64 hpv (512 MB) Yakov Petrovich Golyadkin ... 28/57 0:14 -4.46 1...Kg6 2.Kf3 Kh5 3.Kg3 Bd8 4.Kg2 Kh4 5.Kh1 Kh3 6.Kg1 Kg3 7.Kh1 Bc7 8.c5 Kh3 9.Kg1 Kg3 10.Kh1 (41.725.316) 2896 Требую объяснений!!!

никел: Does this proves that something went wrong?

Osipov: Господа! Мы как-то зациклились на Ипполите. А ведь есть его более продвинутый аналог - Robbolito. Ипполиту уже полгода, а Robbolito более свежий. Буржуи говорят, что он более стабилен и содержит меньше ошибок. Поддерживает изменение размера хэша и выводит currmove. Я почитал его тексты - там хоть и по итальянски, но текст в целом лучше структурирован. Одна беда - он не заточен под компиляцию в Студии. Мне пришлось пару часов скрежетать напильником, чтобы откомпилировать его в VC 2008 express. Заработал, гад, сейчас запустил тестирование. После 5 партий против Рыбки 3 ведёт: +3 -0 =2. Однако, хотелось бы сделать более грамотную компиляцию. Судя по всему, этому Robbolito нужен GCC. И тут хотелось бы выяснить два вопроса: 1. Где взять этот GCC, да так чтобы скомпилировать под Windows, а не под Linux. 2. Как компилировать, имея makefile. Желательно, поподробнее. Последний вопрос, конечно, для чайников. Но я и есть чайник. P.S. Пока писал, Robbolito выиграл ещё одну партию у Рыбки. Стало +4 -0 =2.

никел: Is this what is needed to compile in windows? http://www.mingw.org/

Iork: Osipov пишет: Мы как-то зациклились на Ипполите. А ведь есть его более продвинутый аналог - Robbolito. Где же его качнуть то можно ? Может потом выложите скомпилированный ?

дуп: Osipov пишет: 2. Как компилировать, имея makefile. Желательно, поподробнее. Если без осложнений, то стандартный способ такой. Сначала посмотрите, сколько там мейкфайлов под Винду. В Крафти, например, их бывает несколько, под каждую Студию. Если он там один, то он должен называться "Makefile", без расширения. Если несколько, то выбрать нужный и запомнить название. В Студии есть спецуттилитка, называется nmake. Вот она все и делает. Из Студии, в меню найти командную строку, набрать полный путь к папке с сорсами и вызвать эту уттилиту. Я сейчас напечатаю, как это делаю я, а вы подправите по месту. Итак: cd C:\Documents and Settings\MyName\Мои документы\folder_source_name\ (здесь лучше нажать enter) nmake -f Makefile.расш. Это если несколько мейкфайлов. Если один, то команда выгляит просто nmake. // У меня этого Робболито пока нет, конкретно его я не пробовал.

Кевин: Osipov пишет: 2. Как компилировать, имея makefile. Желательно, поподробнее. Последний вопрос, конечно, для чайников. Но я и есть чайник. Если Вы чайник, то кто же тогда программист?

mmx: 2 Osipov Лучше взять Codeblocks - в нем похожая на студию оболочка и компилятор мингв.

дуп: Думаю, если получится сделать в VS, то лучше ничего и не надо. Компилятор там отличный, в мингв будет хуже. Главное, чтобы с Мэйкфайлом было все в порядке. "Два часа напильником" - это он наверное парился с поддержкой кроссплатформенности. Намного удобнее было, если бы авторы выкладывали два отдельных комплекта с исходниками. Тогда таких проблем бы не возникало. кто же тогда программист? Дядя Вася. Великий и безгрешный.

ThinkingALot: Osipov пишет: Одна беда - он не заточен под компиляцию в Студии. Мне пришлось пару часов скрежетать напильником, чтобы откомпилировать его в VC 2008 express. Заработал, гад, сейчас запустил тестирование. После 5 партий против Рыбки 3 ведёт: +3 -0 =2. Можешь выложить исходники? immortal223 пишет: А ну-ка, ребята, признавайтесь, что вы там наделали с ИППОЛИТом?? Мда... без понятия почему так происходит...

bankuss: я тоже пробовал точить напильником но 20 ошибок так и не убрал, и не совсем понятно, что не нравится студии. так как робболито под линукс, то компилятор там GCC конечно, я на работе 084 версию компильнул с 1 раза, без ошибок и проблем. проверял в консоли - все работало. scid у меня не был установлен, поэтому на позициях проверить не смог. ну а раз Юрий уже что-то сдлелал - то можно общими усилиями доделать.

дуп: Да, через makefile не получится. Тот, который там - не для VS.

Osipov: С makefile чего-то не выходит, nmake ругается. Когда делал в Студии через создание проекта, то проблемы были такие: 1. Не понимала asm-вставок, пришлось брать из Стрелки. 2. Не находила стандартных h-файлов, и связанных с ними функций получения времени и stdin/stdout. Заменил время на GetTickCount, а отслеживание ввода вообще вырубил. 3. Не нашла функцию posix_memalign - заменил на malloc. Судя по названию последней функции, это заточено под Linux.

bankuss: типы данных тоже заменить на: #define uint8 unsigned __int8 #define sint8 signed __int8 #define sint16 unsigned __int16 #define uint16 signed __int16 #define uint64 unsigned __int64 #define sint64 signed __int64 #define sint32 unsigned __int32 #define uint32 signed __int32

Osipov: Вот залил весь проект для VC 2008 Express, заодно и exe: http://rapidshare.com/files/297180818/Robbolito.rar http://ifolder.ru/14650414 Конечно, криво пока, но для начала сойдет.

bankuss: не хочет... Ошибка 78 error C2371: tipo_prossimo: переопределение; различные базовые типы funzione.h

ThinkingALot: Robbolito 0084 x64 Изменение размера хэша сделано оригинально - надо открыть опции UCI и проставить там нужное значение вручную... Попробовал сначала обычным способом - Робболито завис. P.S. У меня вылетает каждый раз при попытке послать лучший ход. Матч играть невозможно.

pan5: Даже версия 0084 от Osipov выглядит посильнее Ипполита +2=2-0 (даже работает турнирный контроль) Вся надежда на доблестных программистов форума и они доведут 0085 (а может и последующие версии) до exe под win. Если не хотите менять имя движка, то добавляйте пожалуйста к номеру версии постфикс, указывающий на то, чья версия скомпилированного exe выложена.

Renegat23: Робболито x86 уже сильнее Ипполита x64!

pan5: Радует, что работа авторов над движком вроде бы продолжается и пока нет предпосылок, что новые версии исходников не будут выкладываться на сайт. Возможно, авторы предполагали обвинения в клонировании, поэтому изначально не нацеливались на коммерческую версию. Счет уже +3=5-1 в пользу RobboLito 0084 против Ippolit 0.080b

Renegat23: Robbolito слил 4 партии подряд по времени зависая при выходе из книги. Остановил матч.

ThinkingALot: w32 версия вроде нормально работает.

Renegat23: ThinkingALot пишет: w32 версия вроде нормально работает. Я ей матч и проводил. После 15 партий начала сливать по времени, не отсылая ход оболочке.

bankuss: ага, зависает. когда на анализ запускаешь начинает думать, делаешь ход на доске - тишина....

pan5: WinXP Frit12 книга HS-7moves, 1 мин на 40 ходов IPPOLIT 0.0080b w32 - RobboLito version 0084 +2=5-6

Osipov: Там я убил приём команд от оболочки во время думания. От того и виснет. Надо будет прикрутить стандартный input-available. К тому же Robbolito тоже не совсем свободен от багов Ипполита, на него тоже нападает порча после нескольких партий. Поэтому, при тестировании под Ареной я поставил птичку: перегружать движки после каждой партии.

onedrey: Robbolito 0084 x64 Изменение размера хэша сделано оригинально - надо открыть опции UCI и проставить там нужное значение вручную... Попробовал сначала обычным способом - Робболито завис. P.S. У меня вылетает каждый раз при попытке послать лучший ход. Матч играть невозможно. Большая просьба выложить откомпилированную 64-битную версию, если она годится хотя бы для анализа

bankuss: onedrey пишет: Большая просьба выложить откомпилированную 64-битную версию, если она годится хотя бы для анализа под линукс х64 без проблем

никел: Bankuss, is it possible with this package? http://www.drangon.org/mingw/

bankuss: никел in monday do

WildCat: Osipov Вот залил весь проект для VC 2008 Express, заодно и exe: Вкладывать в архив RobboLito.ncb (7.7 Мб) было совершенно излишне.

никел: OK, thanks Bankuss

onedrey: под линукс х64 без проблем Ясно. Я думал, что если там файл .vcproj, то это - проект VS, а если VS, то для виндовз Тогда еще вопрос(ы). :) Чем, по-вашему, вызвано, что версии выкладываются только под Линукс? И как вообще его запускать в линуксе, под какой оболочкой? Я думал, что только под вайн запускаются виндовзкие облочки, а в них движки... По крайней мере, с рыбкой я не видел других вариантов

bankuss: onedrey то что выложил Юрий - да под виндовс, но у меня его проект не компилируется. а то что под линукс - компилишь, получаешь запускаемый файл, и запускаешь его в оболочке линукса, например scid (других незнаю).

bankuss: onedrey пишет: Чем, по-вашему, вызвано, что версии выкладываются только под Линукс? бесплатность во всем! так как и сам линукс и его проги бесплатны (ну и двиг тоже) или просто авторы работают на линуксе

bankuss: компиляция asm команд в режиме х64 VS2008(2005) не разрешается! все через masm64 (ml64) но как его использовать неясно...

onedrey: или просто авторы работают на линуксеЭто понятно. Не ясно, как он его могут тестировать, если не в партиях с рыбой? Потому что под wine будет неадекватное сравнение.. Со старыми версиями стравливают? Можно, конечно, на разных машинах запустить рыбу и ипполита...

bankuss: Генерацию таблиц Робболито сможем переделать? ТБ как бы не помешают. В линуксе он у меня все чинно сгенерил, по папкам разложил, при запуске видит.

IvenGO: Извиняюсь за неграмотный вопрос: вот тут все про алгоритмы да про алгоритмы, а что по оценочной функции сказать можно? Она революционно нова?

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

unknow: Други! Как же легко стало после Ипполита читать исходники Стрелки :) Просто образец ясного и прозрачного кода. Только сейчас оценил.

WinPooh: Это вы ещё не читали исходники шахматной программы ИТЭФ для машины М-20, в виде рукописных бланков с автокодом

NS: В робболите зачем-то время в миллисекундах умножается на 1000?! А вот такой код вызывает ошибки, и очень тяжело понять его поведение: void risolvere_termine (int d) { sint64 x; if (!salto_ok) return; x = orologio () - OROLOGIO; nodo_conteggio = nodo_frequenza; if (d == ABISSO) // предельная глубина cerca_alt (1); if (x - INVIO > 1000000) notizia (x); if (d >= 1 && d < 8) goto FINALE; if (x > ORA_ASSOLUTA) cerca_alt (1); if (d == 0) goto FINALE; if (!MOSSA_BRUTTA && x >= ORA_BATTAGLIA) cerca_alt (2); if (FACILE && x >= ORA_FACILE) cerca_alt (3); if (!MOSSA_BATTAGLIA && x >= ORA_ORDINARIA && !MOSSA_BRUTTA) cerca_alt (4); FINALE: while (interrogativo_ingresso ()) input_console (); } Аварийки срабатывают криво. Процедура эта запускается раз в неколько тысяч генераций ходов, а ней и аварийка по времени (при этом она не срабатывает при Depth от одного до восьми), и аварийка при достижении предельной глубины (255)

NS: Чтение консоли написано с ошибкой. (interrogativo_ingresso ())

bankuss: В версии D всего 1 изменение: файле valu.c #define bianco_minore_pietra (8<<2) #define nero_minore_pietra (16<<2) а было: #define bianco_minore_pietra 8 #define nero_minore_pietra 16

NS: просрочки убрал, расход времени сделал более агрессивным - сила увеличилась.

bankuss: NS кидай изменения, внесем в исходники

NS: :) Потом. Ты силушку сначала проверь :) Если NPS просадил - вечером откомпилирую по человечески, и забыл пондермув добавить - но это уже вечером.

NS: Кроче - посмотрел на свежую голову, ничего особо править не надо. Достаточно поставить запас времени. То есть перед расчетом времени написать [pre2] if (movestogo) ORA = (ORA - 1000000 - movestogo * 200000); else ORA = (ORA - 1000000 - 40 * 200000); // в безлимитке запасаемся на 40 ходов. //Ну и в случае израсходования времени, чтоб совсем не блицевала - if (ORA < 100000) ORA = 100000;[/pre2] И в аварийках убрать условие на глубину [pre2] // if (d >= 1 && d < 8) // goto FINALE;[/pre2] Либо переместить его сразу за основную аварийку [pre2] if (x > ORA_ASSOLUTA) cerca_alt (1); if (d >= 0 && d < 8) // при d==0 не надо использовать методы сокращения времени, это не вызов из корня goto FINALE;[/pre2] А вторая причина зависаний - это останавливаются часы. Надо смотреть где с разрядностью переменных накосячено. uint64 x; x = GetTickCount() * 1000; В этом коде переполнение наверно действительно получается.

дуп: x = GetTickCount() * 1000; Не должно переполнить. Эта функция возвращает число мс с момента старта ОС. Т.е. спустя сутки после включения компа это число всего 86 400 000. Это если я не нагнал в подсчетах

NS: Результат умножения имеет какой тип? Результат умножения это не число мс. А 1000*Число мс.

WildCat: Т.е. спустя сутки после включения компа это число всего 86 400 000 Т.е. если это чилсо умножить на 1000 то unsigned __int64 будет переполнятся где-то 20 раз в сутки.

ThinkingALot: WildCat пишет:  цитата: Т.е. спустя сутки после включения компа это число всего 86 400 000 Т.е. если это чилсо умножить на 1000 то unsigned __int64 будет переполнятся где-то 20 раз в сутки. . int32 будет, int64 - нет.

NS: результат умножения будет иметь какой тип? int32 или uint64?

дуп: NS пишет: результат умножения будет иметь какой тип? int32 или uint64? uint64 В это x эти сутки влезут более 6 миллиардов раз

bankuss: во фрукте сделано деление /1000 и числа типа double можно попробовать так же

NS: А может всё-таки результат умножения будет int32? Не знаю соглашений в этом языке, а в делфи резльтат будет 100% int32, а потом уже будет преобразовываться в int64.

NS: А не проще ли умножить просто на константу типа uint64 равную 1000? Вместо умножения на 1000.

bankuss: double now_real() { return double(GetTickCount()) / 1000.0; }

NS: Банкусс, ты о чем? uint64 tt = 1000; x = GetTickCount() * tt; исправляет эту ошибку. больше ничего переписывать не надо.

дуп: Видел в файле cerca.c подозрительное место: TRASMISSIONE ("info time %lld nodes %lld nps %lld %s %s depth %d seldepth %d pv %s\n", t, NODOS, nps * 1000, modificatore (BASSO, valu, ALTO, STRING3), cp_mate (valu, STRING2), radice_abisso / 2, sd, pv); } В коде считаются беззнаковые типы uint64, а здесь спецификаторы формата для nodes и nps для знаковых. Маловероятно, конечно, но лучше, думаю переправить так: ("info time %I64d nodes %I64d nps %I64d %s %s depth %d seldepth %d pv %s\n",

WildCat: NS А может всё-таки результат умножения будет int32? Не знаю соглашений в этом языке, а в делфи резльтат будет 100% int32, а потом уже будет преобразовываться в int64. Результат умножения будет 32-битный, и будет переполнятся 20 раз в сутки. Достаточно один из операндов преобразовать в 64 бита. GetTickCount() * uint64(1000)

NS: А вообще еще бы хорошо заменить GetTickCount на timeGetTime.

NS: WildCat пишет: Результат умножения будет 32-битный, и будет переполнятся 20 раз в сутки. Да знаю я. :)

bankuss: NS я про то, что написал WildCat WildCat пишет: GetTickCount() * uint64(1000) 1000 компилятор возьмет как 32-битную константу. NS пишет: uint64 tt = 1000; а так уже возьмет правильно :)

bankuss: дуп да, надо поправить. хотя у меня и с lld вроде без ошибок выводит

WildCat: bankuss, uint64(1000) - это 64-битная константа. NS Да знаю я. :) Не знаю соглашений в этом языке Так знаешь или нет?

NS: Знаю. Это я издеваюсь так. Я же выше написал что глюк в этом месте. Точнее - не проверял, но был практически уверен что приведение типов работает также как в делфи. bankuss пишет: дуп да, надо поправить. хотя у меня и с lld вроде без ошибок выводит Нет смысла править - в этом месте всё ОК.

дуп: Я не знаю, чего там у вас с WildCat- ом за левые компиляторы: //////////////////////////////////////// #define uint64 unsigned __int64 int main() { uint64 number = 86400000; uint64 big_number = number * 600; printf("res = %I64d\n", big_number); return 0; } //////////////////////////////////////////// На экране : res = 51840000000

WildCat: дуп, попробуй так: #define uint64 unsigned __int64 #define uint32 unsigned __int32 int main() { uint32 number = 86400000; uint64 big_number = number * 600; printf("res = %I64d\n", big_number); return 0; } Именно так в Ипполите.

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

NS: Результат перемножения четырехбайтных - четырехбайтное число. потеряли точность уже в процессе умножения. Понять вроде очень просто. Чтоб в результате умножения получить 64битное - нужно один из множителей привести к 64битному виду. Ты в своем примере умножаешь 64битное, поэтому у тебя всё ОК. А GetTickCount -32 битное.

WildCat: Результат умножения двух 32-битных чисел сперва записывается в 32-битный регистр, а уж затем значение из этого регистра записывается в 64-битную переменную. Естественно старшие разряды теряются.

дуп: NS пишет: А вторая причина зависаний - это останавливаются часы. Надо смотреть где с разрядностью переменных накосячено. uint64 x; x = GetTickCount() * 1000; В этом коде переполнение наверно действительно получается. Вот где недоразумение. Вы то говорите глядя как в коде, а я только на пост NS. А у него здесть x uint64

NS: А при чем тут х? в коде вся информация есть. х Действительно uint64. И будет переполнение.

hardcore: Мда... Непросто все с компилятором. Подскажите пожалуйста к чему в Иппо структура type_dynamics? Ведь для хеширования есть type_hash_variated. И что за 32хбитные _7, _9, _0...? Причем первой структуры наинициализировано 16384 экземпляра, а второй, сложной, 1024.

bankuss: UINT8 golo () { static int init = 0, is_pipe; static HANDLE stdin_h; DWORD val; if (stdin->_cnt > 0) return 1; if (!init) { init = 1; stdin_h = GetStdHandle (STD_INPUT_HANDLE); is_pipe = !GetConsoleMode (stdin_h, &val); if (!is_pipe) { SetConsoleMode (stdin_h, val & ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT)); FlushConsoleInputBuffer (stdin_h); } } if (is_pipe) { if (!PeekNamedPipe (stdin_h, NULL, 0, NULL, &val, NULL)) return 1; return val > 0; } else { GetNumberOfConsoleInputEvents (stdin_h, &val); return val > 1; } return 0; } это ипполитовский ввод

bankuss: bool input_available() { static bool init = false, is_pipe; static HANDLE stdin_h; DWORD val, error; // val = 0; // needed to make the compiler happy? // have a look at the "local" buffer first, *this time before init (no idea if it helps)* if (UseDebug && !init) printf("info string init=%d stdin->_cnt=%d\n",int(init),stdin->_cnt); if (stdin->_cnt > 0) return true; // HACK: assumes FILE internals // input init (only done once) if (!init) { init = true; stdin_h = GetStdHandle(STD_INPUT_HANDLE); if (UseDebug && (stdin_h == NULL || stdin_h == INVALID_HANDLE_VALUE)) { error = GetLastError(); printf("info string GetStdHandle() failed, error=%d\n",error); } is_pipe = !GetConsoleMode(stdin_h,&val); // HACK: assumes pipe on failure if (UseDebug) printf("info string init=%d is_pipe=%d\n",int(init),int(is_pipe)); if (UseDebug && is_pipe) { // GetConsoleMode() failed, everybody assumes pipe then error = GetLastError(); printf("info string GetConsoleMode() failed, error=%d\n",error); } if (!is_pipe) { SetConsoleMode(stdin_h,val&~(ENABLE_MOUSE_INPUT|ENABLE_WINDOW_INPUT)); FlushConsoleInputBuffer(stdin_h); // no idea if we can lose data doing this } } это фруктовый

kranium: hi bankuss, and everyone- i have completed translation of the 0.085c3 source code from Italian to common English programming terms... i'd be happy to share it with you if you are interested...(much easier to follow if one doesn't speak Italian well) i will begin soon to concentrate on SMP... perhaps we can begin to work together for further development... are you interested? best regards- kranium

Einstein UCI: Hi Kranium ! They are any way to fix the time management in IPPOLIT & RobboLito ? Would be nice ! All the best,

bankuss: kranium excellent! I also began to English translate, but made little

Azaad: Einstein UCI writes: They are any way to fix the time management in IPPOLIT & RobboLito ? Would be nice ! Einstein UCI Try version 0.085d1

17: Вот еще одно мнение! Denis P. Mendoza http://www.computerchess.info/tdbb/phpBB3/viewtopic.php?f=9&t=427 Re: What's this engine ? by Denis P. Mendoza on Thu Oct 29, 2009 12:22 pm Like you, I'm only good in another filed, so I let them gossip among themselves in third person mode . I still have no work at the moment (waiting for another mission), so i just scan the net on what interests me - like the links you mentioned. My opinions are too trivial for the experts in those forums. I'm a practical guy and I only involve myself to the level my brains can handle . In the first place, I like IPPOLIT and ROBBOLITO same as Protector - open source stuffs...period! Whether we like it or not (good or bad), these works of Yakov, Igor, Vladimir, Roberto, Yusuf, and the rest of the other supporters will revolutionize the next set of engines in the future. Crafty, Fruit, Glaurung and Strelka had started it before. Nice job comrades!....as they say in Red Alert (game)....For the UNION! I think Vas will just shrug this "clone" talks aside and just move on in his Rybka cluster experiments. That is more important, as still some chronic chess activists are using this issue to rekindle the case about Rybka being a Fruit clone, hiding true nps, etc. It's sounds like a broken record. Let's move on and enjoy the fruits of computerchess.

kranium: hi bankuss- http://www.chesslogik.com/ complete english translation seems to be working well....needs much more testing Engine Score 1: RobboLite_0085c4_0050 10.0/15 2: Rybka 3 w32 5.0/15 0=0==000==01=== no time losses in many games...not sure if my time fix is 100% though, must be tested further... please make the source code for 0.085d1 available... perhaps in future, all source can be available in one location http://rapidshare.com/files/299614816/RobboLite_0085c5.rar.html thanks to all, bankuss, NS, Wildcat, дуп, Einstein UCI, ThinkingAlot, Osipov, and anyone else contributing...

bankuss: kranium пишет: please make the source code for 0.085d1 available... perhaps in future, all source can be available in one location vers C --> vers D: changes in value.c #define white_minor_stone (8<<2) #define black_minor_stone (16<<2)

kranium: bankuss пишет: #define white_minor_stone (8<<2) #define black_minor_stone (16<<2) but- this is a time loss fix? it has nothing to do with time management...or am i mising something?

никел: This is extracted from the bugs topic on Ippolit site Bugs Location for workers to deposit bugs. Current The current version 0.085d has had no reported bugs. Update: nodes appear negative beyond 2^31..... info time 1075380 nodes -2145685551 nps 1998000 cpuload 999 Looks like sorvegliare.c has a TRASMISSIONE with %d rather than %lld in notizia Fixed RobboLito 0.085: Failings with captures (cattura) for Robbo_glue.c: fixed (Igor). RobboLito 0.085b: Igor's "fix" was unfunctional. Fixes correctly, I hope (RP). RobboLito 0.085c: Changed recurse in RobboBuild (failed with BPb). RobboLito 0.085c2: Previous fix (Igor) for lazy failed. New with valu.c: #define bianco_minore_pietra (8<<2) #define nero_minore_pietra (16<<2) Previous: decimating the double sinister shuffle.

NS: Банкусс, нафига бало городить весь этот огород, если достаточно было закомментить // if (stdin->_cnt > 0) // return 1; За ненадобностью, и добавить в случае консольного ввода условие на GetNumberOfConsoleInputEvents(stdin_h, &count); if (count && PeekConsoleInputA(stdin_h...

bankuss: NS это фабьен городил, а не я. просто для примера привел код фрукта.

NS: Я к тому что нет никакого смысла вставлять фруктовый код в Робболита.

дуп: char * mossa_notazione (uint32 mossa, char *M) { int di, ai, pr; char c[8] = "0123nbrq"; В массиве "с" не маловато ли будет 8 элементов?

bankuss: дуп пишет: ar c[8] = "0123nbrq"; В массиве "с" не маловато ли будет 8 элементов? присваивается именно 8, а что не так?

дуп: В строке "0123nbrq" девять символов. Девятый tipo по умолчанию '\0'. Если поменять расширение на "cpp" не скомпилируется. Компилятор выдаст ошибку "overflow" в этом месте. Хотя может тут это и не важно.

Osipov: В этой функции символ конца строки не используется, так что можно на обращать внимания. Между прочим, я смотрю большие проблемы вызвало распределение времени в этом странном движке. Если кому интересно, попробуйте это дело от Рыбки 3: void time_manager(int time, int inc, char flag_togo, int movestogo) { int alloc; TimeMax = (time - 2500) * 9 / 10; if (TimeMax < 150) TimeMax = 150; if (flag_togo) { TimeLimit2 = ((movestogo + 2) * TimeMax) / (movestogo * 3); alloc = ((TimeMax / movestogo) * (movestogo + 150) * 2) / 300; if (inc > 0) alloc += inc; } else { if (inc == 0) { TimeLimit2 = TimeMax / 6; alloc = TimeMax / 48; } else { TimeLimit2 = TimeMax / 3; if ((inc * 60) >= time) alloc = TimeMax / 30; else alloc = TimeMax / (((time / 60) * 48 - inc * 18) / (time / 60)); if (inc > 0) alloc += inc; } } TimeLimit1 = alloc; if (TimeLimit1 > TimeMax) TimeLimit1 = TimeMax; if (TimeLimit1 > TimeLimit2) TimeLimit1 = TimeLimit2; }

Sentinel: Yuri, you are absolutely right. Rybka is using this nice nonlinear aggressive function, while in Robbo it is limited to TimeMax/movestogo in the most aggressive setting. That is why Robbo is taking time linearly, and always taking less. Also the absolute longest time Rybka can take is TimeMax*9/15, and for Robbo is TimeMax/2. Direct example in 40 moves time control, around 15th move, Rybka allocates 0.047*TimeMax, while Robbo allocates only 0.04*TimeMax and that only in the most aggressive setting (otherwise is half of it). This is definitively something that must be changed.

Bison: В этом интервью автор Рыбки рассказывал о WinFinder-е Я потратил много времени, работая над поиском в Рыбке 2.2, а WinFinder был небольшим экспериментом для некоторых моих идей. Я разрабатывал WinFinder всего пару дней, так что эта версия совершенно недоработана. Тем не менее, концепция создания WinFinder достаточно интересна, и в третьей версии вы увидите подобную модификацию Рыбки. Если я смогу выделить хотя бы две недели на разработку Rybka 3 WinFinder, то все будет сделано как следует. Если предположить, что корни Ипоолита (Робболита) растут из Рыбки (я в этом уверен на 99%), то возникает вопрос: В чем именно состоит «концепция создания WinFinder»? Либо это IID, чуть более продвинутая, чем у остальных, либо использование тактической составляющей ОФ при отсечениях (см. tower_dynamics->white_encoded_xray), либо что-то еще. Интересно узнать мнение поизучавших исходники.

italy_numero1: Quote: #define white_minor_stone (8<<2) #define black_minor_stone (16<<2) another better translation for pietras is flags rather than stone

kranium: great- thanks, i'll make the change

Carotino: Hello World! I am a lover of chess and Linux, where can I download RobboLito 0.085d3 for my Linux-box? There is a make-file for it?

bankuss: Carotino d3 no for linux

NS: Банкусс, а ты в D3 получение времени на timeGetTime заменил?

bankuss: NS нет uint64 clock_() { uint64 x; uint64 tt = 1000; x = GetTickCount() * tt; return x; }

NS: Лучше поменять, GetTickCount() считает не время, и какие только глюки с ним не бывают... У него одно преимущество - он быстрее, и если замена на timeGetTime не просадит NPS, то лучше заменить.

bankuss: NS почитал описание - функции похожие, только timeGetTime более точная. при простой вставке компиляция сразу выдает ошибку Ошибка 1 error LNK2001: неразрешенный внешний символ "__imp_timeGetTime" utils.obj

NS: winmm.lib

NS: http://www.gamedev.net/community/forums/topic.asp?topic_id=437577 timeGetTime "немного точнее" - MS имеет ввиду что на некоторых системах, в некоторых условиях GetTickCount может выдавать нечто даже отдаленно не похожее на время.

bankuss: сделал, скорость такая же. просадок не замечено.

NS: Сглючило меня. Совсем не время выдает PerformanceCounter, GetTickCount выдает время, но с большой погрешностью. timeGetTime обращается к таймеру напрямую, читая из него текущее значение внутреннего счетчика. Функция GetTickCount обращается к переменной в памяти, которая обновляется приблизительно раз в 16 мс. Приблизительно потому, что точно невозможно: в системе могут идти какие-то высокоприоритетные процессы, которые прерывать нельзя. Но в момент обновления в счетчик добавляется не 16, а столько, сколько реально набежало.

NS: http://www.gamedev.ru/code/forum/?id=121011&page=3 Тут человек проводил тесты функций получения времени на разных системах.

NS: Bison пишет: В чем именно состоит «концепция создания WinFinder»? Либо это IID, чуть более продвинутая, чем у остальных, либо использование тактической составляющей ОФ при отсечениях (см. tower_dynamics->white_encoded_xray), либо что-то еще. Интересно узнать мнение поизучавших исходники. Думаю что в WF просто убраны отсечения уменьшающие тактическую силу, и добавлены продления увеличивающие. И упрощена ОФ.

Sentinel: Time forfeits have nothing to do with GetTickCount(). Still 16ms is not precise enough, so in the next version there will be changes, I'm currently testing the code with QueryPerformanceCounter, and it seams to be working fine. Of course, the code compatibility is gone, but something must be scarified.

NS: http://support.microsoft.com/kb/895980 http://www.virtualdub.org/blog/pivot/entry.php?id=106

bankuss: сделал версию с родной поддержкой RB (robbobases) и даже генератор этих таблиц скомпилялся (пришлось многопоточность вырубать) но создание файлов таблиц надо коренным образом переписывать. ибо файловые системы линукса и винды отличаются, что линуксу хорошо, то винде смерть хотя он создает несколько файлов, но на генерации коня вылетает с ошибкой. (на 3-х фигурке пробую)

Кевин: bankuss пишет: сделал версию с родной поддержкой RB (robbobases) и даже генератор этих таблиц скомпилялся А ссылки будут?

bankuss: Кевин смысла пока нет, файлов таблиц то нет. да и сами таблицы еще нужно сгенерить.

Robborriffic: chesser at the ippolit wiki indicated it is a problem with Windows file names and uppercase and lowercase.

bankuss: Robborriffic Yes, it is true

NS: Эндшпильную оценку подправить надо - Два слона у ладьи (и ладьи с пешкой) не выигрывают...

ThinkingALot: Оказывается у Robbolito поиск в Cut узлах продлевается больше, чем в PV. Причем это даже не продления, а увеличение глубины перебора при определненных условиях ! if (altezza * 4 <= DEPTH) SINGULAR++; В общем что-то немыслимое.

WildCat: Единственные ходы вроде надо продлевать во всем дереве. Тут важнее как определять единственность хода.

Bison: Угу, а еще в Ипполите просто космический LMR в Cut узлах novel_deepness = deepness - 2 + stretches - (4 + BSR (4 + sch)); Так, 20-й ход будет резаться на 4 полухода. Попробовал такую смелость в Бизоне - fail.

ThinkingALot: Я так понимаю сила Robbo как раз и состоит в хитром сочетании продлений и сокращений. WildCat пишет: Единственные ходы вроде надо продлевать во всем дереве. Полностью согласен. Или во всем, или нигде, но чтобы в Cut было, а в PV - нет, - это что-то странное! WildCat пишет: Тут важнее как определять единственность хода. Она, кстати, тоже как-то подозрительно определяется. Чем меньше глубина - тем менее строгие условия на единственность. Как мне кажется должно быть или наоборот, или везде одинаково.

WildCat: ThinkingALot но чтобы в Cut было, а в PV - нет, - это что-то странное! А точно в PV нет?

ThinkingALot: Я попробавал написать то же самое в PV, и time management предсказуемо перестал нормально работать - второй (от корня) узел principal variation часто просчитывался на большую глубину чем первый , соответственно прога долго думала над очевидными ходами. Думаю имеет смысл протестировать 4 версии: 1) Убрать продления связанные с altezza/heigth везде. 2) Добавить их в PV, но при этом ограничить значение SINGULAR двойкой (и в PV, и в Cut): SINGULAR = MINIMUM(SINGULAR,2); 3),4) - То же, только запускать exclusion search не с параметром beta = value - DEPTH/2 (value - DEPTH, value - 2 * DEPTH), a, например, с value - 8 (value - 16, value - 32 соответственно). Может быть именно в этом причина падения рейтинга Рыбы при увеличении контроля времени. Вообще фишка с продлениями по altezza/height усиливает тактическую зоркость, но не факт, что положительно сказывается на силе игры. Пока после 92 партий версия 3) набирает против исходной +4 Elo: +17-16=59.

Renegat23: ThinkingALot пишет: Пока после 92 партий версия 3) набирает против исходной +4 Elo: +17-16=59. Смахивает на погрешность :)

ThinkingALot: Renegat23 пишет: ThinkingALot пишет:  цитата: Пока после 92 партий версия 3) набирает против исходной +4 Elo: +17-16=59. Смахивает на погрешность :) Не -200 пунктов - уже хорошо!

Bison: Пожалуй, самым любопытным и загадочным для меня в Ипполите является чередование функций WhiteCut() (или BlackCut) и WhiteAll(). Выглядит это как-то так: PV->Cut->All->Cut->...->Slide (при depth <= 3.5 ply). Причем All() на первый взгляд кажется более строгой в плане прунинга и сокращения глубины. Зачем нужно было городить такой огород - непонятно. Версия у меня пока только такая - при итеративном углублении в корне поиска таким образом происходит чередование сторон, за одну ищутся угрозы сопернику, а другая как бы защищается. Любая найденная угроза все равно запишется в trans. Звучит, конечно, довольно бредово, примерно как совет давать программе считать на четную глубину , но другого объяснения не вижу.

ThinkingALot: Это ведь стандартная фишка еще со времен Фрукта. Cut узлы лучше сильно не резать, так как это может превести к дополнительному перебору соотвествующей ветки поиска уже в PV режиме. Кстати можно попробовать схему Cut/All узлов не как во Фрукте, а как в Стрелке.

NS: Это стандартная фишка не со времен фрукта, а намного раньше...

bankuss: ребята обещали переделать генератор таблиц, для совместимости в виндой, посмотрим...

ms 13: Отлично работает версия Robbolito0.084Linux правда Kn/s выводит заоблачный,причем чем больше анализирует тем больше Kn/s Интересно это ошибочно или реально?

Chessved: ms 13, можно поинтересоваться, как запустили движок под линуксом? Это какой GUI на скрине показан?

bankuss: ms 13 в 084 есть ошибка в выводе, так что это глюк ))) у меня в SCID linux роболито так и не запустился.

ms 13: Chessved пишет: ms 13, можно поинтересоваться, как запустили движок под линуксом? Это какой GUI на скрине показан? bankuss пишет: ms 13 в 084 есть ошибка в выводе, так что это глюк ))) у меня в SCID linux роболито так и не запустился. В SCID linux у меня тоже не запустился,вернее запустился в диспечере но анализировать не хочет.Зато отлично работаетв Shredder Classic 4 Linux впрочем как и Spike,ZappaMexico2,Fruit...но не тот gui. Было бы неплохо прикрутить все это к Xboard через Polyglot там потестировать можно, если ктото в курсе обьясните плис.Поскольку я не программист если можно скомпилируйте RobboLito0.085d.Linux

bankuss: ms 13 пишет: можно скомпилируйте RobboLito0.085d.Linux сам можешь сделать, в папке с исходниками набери make и жди. скомпилятся 2 проги - сам роб и генератор таблиц. все, юзай. в системе должен стоять GCC, если нет, качни с репов.

ms 13: Пробовал уже...но ничиго не получилось Главным образом последние строчки bits.h: Assembler messages: bits.h:15: Error: suffix or operands invalid for `bsf' bits.h:15: Error: suffix or operands invalid for `bsf' bits.h:15: Error: suffix or operands invalid for `bsf' make: *** [pila.o] Ошибка 1 ms13@ms13:~/RobboLito-0.085d$

Robborriffic: 32-bit: nyet -Dx86_64 (DEFINITIONS in Makefile, bits.h)

bankuss: ms 13 убери из makefile строку -Dx86_64 в DEFINITIONS = -Dx86_64 $(HAS) -DVERSION=\"$(VERSION)\" -DCON_ROBBO_BUILD у тебя 64 хочет собраться )))

ms 13: bankuss огромное спасибо Теперь получилось оценку правда выводит аналогично прежней версии

bankuss: ms 13 ты какую версию брал? RB-1 ? в ней вывод исправлен. иначе открой редактором файл sorvegliare.c найди в нем: TRASMISSIONE ("info time %d nodes %d nps %d cpuload %d\n",t, NODOS, nps * 1000,(int) ((double) u / (double) x * 1000.0)); и поставь вместо %d - %lld где time nodes и nps: info time %lld nodes %lld nps %lld сохрани изменения и снова make или скачай версию RB-1, в ней исправленный генератор таблиц, как генерить в файлике описано. 3-4 фигурка сделалась шустро, 5ку не пробовал.

ms 13: Да ошибка исправлена Разобрался также с READ_THIS сгенирировал 4 фигурки,запустил генерацию 5 фигурок Эти базы вроде можно в Окнах запускать?

bankuss: ms 13 если у тебя расширение не с 1-й буквой у таблиц , то это переделка под винду. я вечером проверю, как оно будет работать. там можно и по старому генерить и по новому. (если ты скачал RB1b)

ms 13: Расширение с одной буквой.Собрал TotalBase 5 фигурки, и TripleBase 4 фигурки Правда как их прикрутить к Roobbolito так и не понял,прописал директорию в оболочке но движок с ними не работает http://s59.radikal.ru/i165/0911/0b/d10b69caaeb5.jpgОболочку использовал DeepShredder11Linux .Пусть простят админы за офтоп прекрасно в ней работает Rybka3Linux и ненужно заморачиватся с engineServer и с engineClient.[hideguest]Оболочка есть на форуме,но установить ее не такто просто пред установкой нужно отредактировать исполняемый файл InstallJava заменив JREARCHIVE=jre-6u3-linux-i586.bin на JREARCHIVE=jre-6u16-linux-i586.bin.После установки Java нужно отредактировать исполняемый файл DeepShredder11 заменив JREDIR=jre1.6.0_03 на JREDIR=jre1.6.0_16.После чего запустить keygen в директории.Если нет желания заморачиватся можете скачать оболочку с установленой Java DeepShredder11Linux[/hideguest]

bankuss: ms 13 пишет: Правда как их прикрутить к Roobbolito так и не понял они должны быть в папке движка и все. он их автоматом видит. можно ручками стартануть движок в консоли - там видно как он сканирует каталоги.

ms 13: bankuss спасибо! сканирует и в консоли и в оболочке http://s59.radikal.ru/i166/0911/4e/f6971ab65614.jpg я просто их в отдельную директорию скидывал Доделаю чуть позже 5 фигурки+6 фигурки пока через VirtualBox это не реально.Можно сделать так чтобы эти базы работали в окнах?

bankuss: ms 13 у меня есть виндовая версия с таблицами, но при достижении таблиц движок вылетает с ошибкой. видимо линуксовый код не так корректно в винде работает. где подкручивать пока не ясно...

ms 13: Будемс ждать насчет оболочки DeepShredderLinix11 совсем забыл нужно установить еще два пакета sun-java6-bin ia32-sun-java6-bin

дуп: Вроде как хеш в Робболите не очень. Из любопытства захотел посмотреть на числа-идентификаторы в хеш таблице(хеш-ключи). Имеется в ввиду во время игры. Для сравнения сделал то же самое со Стрелкой. Со Стрелкой удобно, потому что и там и там хеш "фруктового" типа и число это 32-битное. В Робе называется type_zobrist.zobrist , в Стрелке entry_t.lock. Хеш 128 мб, контроль 5 мин. После 15 хода картина такая (в скобках те же показатели у Стрелки): Всего ячеек в таблице - 8388608 (8388611). К 15 ходу равны нулю (не востребованы) - 113728 (3627). Еще проверил первую тысячу этих чисел на уникальность. Из тысячи 47 имеют повторы. Нули, конечно, не рассматривались. В Стрелке на 1000 нашлось только одно такое число. Только вот не знаю, этот последний показатель говорит о коллизиях, или нет? Но в любом случае, чем их меньше тем лучше. Партию один хрен Робболит выиграл

ThinkingALot: дуп пишет: Еще проверил первую тысячу этих чисел на уникальность. Из тысячи 47 имеют повторы. Нули, конечно, не рассматривались. В Стрелке на 1000 нашлось только одно такое число. О какой уникальности идет речь? Коллизии, когда идет запись позиции, уже находящейся в хэше?

дуп: ThinkingALot пишет: Коллизии, когда идет запись позиции, уже находящейся в хэше? Не знаю. Что конкретно записано по тому или иному адресу я не проверял. Может быть это и не коллизии. Просто по разным адресам записан один и тот же хеш-ключ. Позиции могут быть и разными. Скорее всего так и есть. В идеале должно быть для каждой записи - свой id. Может быть то, что в Роббо это сильно не так ни о чем и не говорит. Просто мне захотелось проверить - я и проверил. Возможно это значит, что для зобриста плохо подобраны числа.

ThinkingALot: дуп пишет: Просто по разным адресам записан один и тот же хеш-ключ. Логично. Для вычесления адреса используются младшие 32 бита DYNAMIC->zobrist, а для ключа - старшие. Но то, что случаев совпадения 47 на 1000, - это нечто невероятное! По идее должно быть 1 на 10^9.

дуп: ThinkingALot пишет: Но то, что случаев совпадения 47 на 1000, - это нечто невероятное! Ну а я о чем? По одним адресам часто перезаписывается, а другие лежат без дела. Очень неравномерное распределение индексов(имхо). Может попробовать взять "случайные" числа из Стрелки?

Carotino: Bankus Здравствуйте, простите за мой плохой русский (я итальянская) Я хотел спросить, как активировать "размышлял" по версии Linux от Robbo. E 'возможно? Спасибо.

ThinkingALot: Оказывается Robbolito не чистит историю при каждом вызове функции поиска. Фактически это означает, что ходы сортируются произвольным образом.

Bison: ThinkingALot В Ипполите это не критично. Там весьма интересная функция накручивания счетчика, которой требуется меньше ходов на обрабоку новой позиции, да и ходы остаются примерно те же, всего-то 2 хода сделано с прошлой позиции.

ThinkingALot: Еще две странности: 1) В корне, если произошла отсечка, перебор еще раз запускается с нулевым окном, но уже в PV режиме. Во всех остальных PV узлах такого нет. 2) В PV узлах значения из хэша могут возвращаться только в игровом режиме, когда ограниченно время на ход.

ThinkingALot: Продления в Robbo определяются с помощью вызова exclusion search. При этом оценка всех ходов, кроме хода из хэша, должна быть не выше (beta - margin). В PV узлах этот margin в два раза меньше чем в Cut узлах. Я попробовал в Cut тот же margin, что и в PV (только в обычном поиске - если шах, то оставил двойной margin). По логике вещей скорость набора глубины должна была бы существенно упасть. Но она НЕ упала ! Кто-нибудь понимает, почему?

Bison: Возможно потому, что таких позиций, в которых срабатывает singular продление, не так уж и много, плюс все это дело запускается на довольно больших глубинах, поэтому и разница почти не чувствуется.

ThinkingALot: Нашел БАГ. Если добавить в структуру type_dynamic переменную типа uint8, которая потом нигде не используется, то есть, по идее, не должна ни на что влиять, происходит следующее. 1) Изменяется поиск: для перебора на ту же глубину требуется другое количество узлов. 2) В определенный момент Роббо вылетает с ошибкой. Если переменная типа uint16, то все ОК. Получается, что зачем-то необходимо двухбайтовое выравнивание. А... понял в чем дело. Размер type_dynamic используется в move_make.c - там он предполагается равным 32-м байтам.

Sentinel: ThinkingALot writes: Нашел БАГ. Если добавить в структуру type_dynamic переменную типа uint8, которая потом нигде не используется, то есть, по идее, не должна ни на что влиять, происходит следующее. These dummy bytes (words) are used in hash structures for memory alignment to 64bits. It's very important thing (more then 5% in speed). I double checked it, and it's all correct.

bankuss: посмотрел что засылает аквариум движку: setoption name UCI_AnalyseMode value true position startposgo infinite stop setoption name UCI_AnalyseMode value false position fen ................... go infinite stop setoption name UCI_AnalyseMode value false setoption name UCI_AnalyseMode value true и т.д. что интересно постоянно шлет команду UCI_AnalyseMode, для перевода движка в режим анализа. Из опенсорсных ее только вяленый и глаурунг видят. рыбка-3 такой команды не знает. но это не суть. движок тупо запускается в бесконечный режим (режим анализа) и потом прерывается командой стоп, после этого смотрит что выдал движок и пишет в дерево. вот в этом месте у айвенго где-то что-то не то. работает явно не так, как надо.

immortal223: А можно ли Роббобазы пришить другой программе с открытыми исходниками? Например Вяленому?

bankuss: prefetch опция на компиляторах MS VC просто напросто отсутствует, она имеется только в GСС: "Чтобы минимизировать задержки доступа к данным и таким образом улучшить производительность, лучше всего держать данные в ближайшей к процессору памяти. Выполнение этой задачи вручную называется предварительной выборкой. GCC поддерживает предварительную выборку данных вручную с помощью встроенной функции, называемой __builtin_prefetch. Эта функция используется для помещения данных в кэш незадолго до того как они понадобятся." так что данный ключ ничего не делает в виндозных компиляциях от MS (Visual studio). А жаль... PS нашел аналог _m_prefetch, надо проверить...

chesstango: or is there an available place in this forun for whom we only speak and read in English??? Thx in advance.

onedrey: chesstango http://immortal223.borda.ru/?0-17



полная версия страницы