Проект переехал на code.google.com
Из основных изменений — оторвал проект от наших внутренних библиотек и перевёл целиком на буст.
Сервак с деревом решений стартовал здесь
Прорыва в алгоритме пока нет, и в ближайшее время не предвидется.
Поэтому целиком дерево считать пока не буду. Может быть отдельными состояниями и то больше для отладки.
ШЕ>У меня есть около 300 WMZ. Чтобы как-то стимулировать процесс, готов их планомерно на это дело потратить.
Все участники от денег отказались — предложили потратить на проект.
Как их с пользой на него потратить я не знаю
Я высказывал идею потратить деньги на Donation открытых проектов.
Собственно туда и потратил.
PostgreSQL
Software In The Public Interest
Secure Payment Form
Payment Approved
Thank you, your payment has been accepted. Please retain this receipt for your records.
Евгений, your donation is now completePayment by PayPal
Confirmation number: 4TH442028J465272H.
FreeBSD
Paid to
The FreeBSD Foundation
donations@freebsdfoundation.org
720-207-5142
Евгений, you just completed your payment.
Your transaction ID for this payment is: 1E030660NA3686030.
We'll send a confirmation email to shebeko@mail.ru. This transaction will appear on your statement as PayPal *FREEBSDFOUN.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>В общем человек не только нашёл совершенно замечательный способ решения, но ещё и доказал, что крестики (те кто начинают) всегда выигрывают. ШЕ>Доказал он это для поля 15X15. Сделал он это в 92 году.
Вообще-то, для простого гомоку это очень просто доказывается, что крестики выигрывают. Потому что у них преимущество в один ход
Чтобы скомпенсировать это, для крестиков вводятся ограничения, и такая игра уже называется рэндзю. Весьма заковыристая, в отличие от гомоку. http://www.gambler.ru/%D0%A0%D1%8D%D0%BD%D0%B4%D0%B7%D1%8E
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>>В общем человек не только нашёл совершенно замечательный способ решения, но ещё и доказал, что крестики (те кто начинают) всегда выигрывают. ШЕ>>Доказал он это для поля 15X15. Сделал он это в 92 году.
К>Вообще-то, для простого гомоку это очень просто доказывается, что крестики выигрывают. Потому что у них преимущество в один ход
Очевидно, что не могут выиграть нолики. А так может быть еще ничья...
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>У меня есть около 300 WMZ
Вы не думали их потратить на покупку чего-нить вроде Sapphire Radeon HD 7870, и посчитать всё на своём компе?
Или там алгоритм не параллелится на 1280 ядер по гигагерцу?
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>Пожалуйста внимательно прочтите это сообщение
Есть два соображения.
1. Портируй на Linux. Бесхозными Linux ресурсами поделятся гораздо охотнее, чем бесхозными Win ресурсами. По двум причинам. Во-первых, в opensource культуре принято делиться; а во-вторых, и это главное, ресурсы эти в основном казенные. Вон, к примеру, Шеридан на казенных серверах IRC сервер для RSDN замутил. У каждого пятого тут, я уверен, найдется простаивающая VPS-ка. (У меня например найдется). Тот же Амазон дает микро-инстанс (с Linux) на год бесплатно (для новых пользователей).
2. Есть пара русских клонов Кикстартера, сейчас названия не вспомню, но если надо, найду.
К>Вообще-то, для простого гомоку это очень просто доказывается, что крестики выигрывают. Потому что у них преимущество в один ход
Напомнило нашего лектора по матану.
Написал он как-то формулу на доске.
— Очевидно, что то-то и то-то — говорит.
(смотрит на доску минут сорок)
— Да, действительно очевидно. Теперь рассмотрим ...
Есть игра — пять в ряд. Смысл у неё такой же как у крестиков ноликов, только нужно собрать линию не из 3, а 5 крестиков или ноликов.
А вообще это не пять в ряд, а японское Гомоку. В нашем варианте играется на неограниченном листе. В гомоку ограничена полем 15X15
Без особого успеха занимаюсь этой игрой уже несколько лет.
Век живи, век учись — дураком помрёшь! Пару лет назад наконец наткнулся на совершенно замечательный труд
"Go-Moku and Threat-Space Search" некого Louis Victor Allis
И ещё более фундаментальный труд "Searching for Solutions in Games and Articial Intelligence"
В общем человек не только нашёл совершенно замечательный способ решения, но ещё и доказал, что крестики (те кто начинают) всегда выигрывают.
Доказал он это для поля 15X15. Сделал он это в 92 году.
Тоже самое пытаюсь сейчас сделать я, только для неограниченного поля.
По идее это должно быть легче, потому как:
In the early days the game was played on a
19×19 board, since Go boards have that size.
This variant is still occasionally played. However,
the larger board size increases Black’s
advantage (Sakata and Ikawa, 1981).
Но, видимо я не такой умный, как мистер Алис. И даже с современными ресурсами у меня это не выходит.
The calculations were performed in parallel, on 10
SUN SPARCstations 2 of the Vrije Universiteit in
Amsterdam. Each of the machines was equipped
with 64 or 128 Mbytes of internal memory and a
swap space of over 200 Mbytes. Our processes
could only run overnight. As a result, some
processes not finished at 8 a.m. were killed, and had
to be restarted at 6 p.m. Still, over 1000 CPU-hours
a week were available for solving Go-Moku.
First, the non-restricted variant of Go-Moku was
examined, in which an overline is a winning pattern
Доу!
Сейчас у меня считается позиция с 7 хода. Состояние дел можно посмотреть здесь
Даже с ограниченными вариантами ответа для победителя это уже 1600000 вариантов.
Только с этого хода решения стали сворачиваться. След. уровень увеличется всего в 2.5 раза.
На Амазоне 16 процессов обошлись мне в 12$ (2 сервака по 8 ядер)
Учитывая, что просто для перехода на след. уровень потребуется мощность на 2 порядка больше, то для хобби это очень круто.
Нужно найти более дешёвый источник вычислительных ресурсов.
Поэтому вопрос. Может ли кто предоставить бесхозные вычислительные ресурсы на своих рабочих компах? Ночью к примеру?
Прежде чем сказать нет, и разразится язвенным постом, посмотрите снова в эти выразительные глаза.
У меня есть около 300 WMZ. Чтобы как-то стимулировать процесс, готов их планомерно на это дело потратить.
Это виндовая прога, которая получает задание, решает его (около минуты) и отсылает обратно.
Количество процессов можно задавать.
Сейчас, пока 7 уровень решается, пройдёт дней 10-20. Есть время подумать и определится.
Так что если вы готовы принять участие из любви к искусству — пишите. Мне нужно набрать хотя бы 60 процессов дней на 10.
Предупреждение. Есть большая вероятность вообще не получить никакого результата из-за таких причин:
— у меня может быть банальная ошибка
— у меня может быть логическая ошибка
— может быть логическая ошибка в оценке того, что противник не может повлиять на победу. Поэтому можно получить результат, который на самом
деле ничего не доказывает
— из-за ограничения "победителя" в ходах, можно вообще получить недостоверный результат.
— задача не свернётся при имеющихся ресурсах
ЗЫ. Пожалуйста, если вы только сами не угробили пару лет на похожую задачу, не надо давать советы.
Причины для этого такие:
— Вы не в теме. И потребуется много времени, чтобы вам это объяснить.
— Я вас просто не пойму. Даже имея две великолепные работы, я могу понять только 40% идей, которые изложены там.
Думаете у вас получится лучше?
— Идея может оказаться неэффективной. Ни в одном проекте по работе я не применял столько идей и не испытывал столько разочарования,
когда они оказывались абсолютно неэффективными.
— Для проверки идеи требуется время. А мне бы уже хотелось получить результат.
ЗЗЫ. Почему на этом форуме.
Кроме желания найти вычислительные ресурсы, есть ещё опасение, что результаты будут неадекватными.
Не сложно вмешаться в процесс получения задания и вернуть какую-то фигню. В результате всё дерево решений пойдёт лесом.
На тематическом форуме меньше шанс, что люди будут страдать такой фигнёй.
Кроме того как-то минимально надо процесс координировать и лучше держать связь с ограниченным количеством людей.
ЗЗЗЫ. Я думаю что "всем пофиг" что я там делаю. Но если вдруг интересно,
при положительном результате, обещаю написать статью в RSDN.
On 08/12/2012 01:33 AM, Шебеко Евгений wrote: > У меня есть около 300 WMZ. Чтобы как-то стимулировать процесс, готов их > планомерно на это дело потратить. > Это виндовая прога, которая получает задание, решает его (около минуты) и > отсылает обратно. > Количество процессов можно задавать.
Я бы мог предоставить ресурсы, ночью и не жалко, но вот проблема со
словом "виндовая". Ну можно конечно wine поставить. Но влом на сервере.
MZ>Я бы мог предоставить ресурсы, ночью и не жалко, но вот проблема со MZ>словом "виндовая". Ну можно конечно wine поставить. Но влом на сервере.
Не надо ничего ставить.
Я собирал под FreeBSD. Надо будет — соберу под линукс.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>ЗЫ. Пожалуйста, если вы только сами не угробили пару лет на похожую задачу, не надо давать советы. ШЕ>Причины для этого такие: ШЕ>- Вы не в теме. И потребуется много времени, чтобы вам это объяснить. ШЕ>- Я вас просто не пойму. Даже имея две великолепные работы, я могу понять только 40% идей, которые изложены там. ШЕ> Думаете у вас получится лучше? ШЕ>- Идея может оказаться неэффективной. Ни в одном проекте по работе я не применял столько идей и не испытывал столько разочарования, ШЕ> когда они оказывались абсолютно неэффективными. ШЕ>- Для проверки идеи требуется время. А мне бы уже хотелось получить результат.
Ну я немного копал в сторону шахматного программирования... А так, просто интересно, какие эвристики используются? Ну типа ходов-киллеров, ...
M>Ну я немного копал в сторону шахматного программирования... А так, просто интересно, какие эвристики используются? Ну типа ходов-киллеров, ...
Treat-space search
В отличии от шахмат, здесь есть позиции, на которые надо обязательно реагировать.
Собственно этот Allis заметил, что люди ищут сначала последовательность вилок, которые приводят к победе,
практически не обращая внимания на ходы противника. Если такая последовательность найдена, то начинают её уже проверять.
Ключевая особенность в том, что для построения последовательности на угрозу отвечают сразу всеми защитными ходами одновременно. Если последовательность всё ещё можно построить, то уже потом угроза анализируется на контратаки.
У него ещё есть эвристика нулевого хода. Она у него даётся как: если игрок пропускает свой ход, то противник может построить выигрышную
последовательность вилок. Сказано, что типа эта позволяет видеть скрытые угрозы. Если честно, я не допёр как этим пользоваться, поэтому не использую.
Как бы непонятно, ну увидим мы угрозу на ход раньше. Совсем неочевидно, какими ходами её предотвратить. Это может быть ход на то место, откуда угроза разивается или к примеру боковые ходы, которые могут способствовать развитию контратаки.
Блин. Всё равно ничего не понятно получается. В общем сложно объяснить. Для того чтобы было понятно, нужно писать статью и подбирать картинки с примерами.
Здравствуйте, Шебеко Евгений, Вы писали:
M>>Ну я немного копал в сторону шахматного программирования... А так, просто интересно, какие эвристики используются? Ну типа ходов-киллеров, ... ШЕ>Treat-space search
ШЕ>В отличии от шахмат, здесь есть позиции, на которые надо обязательно реагировать.
В шахматах это техница ФВ (форсированного варианта). Начиная с некоторой глубины дальше считаются только шахи и взятия.
ШЕ>Собственно этот Allis заметил, что люди ищут сначала последовательность вилок, которые приводят к победе, ШЕ>практически не обращая внимания на ходы противника. Если такая последовательность найдена, то начинают её уже проверять. ШЕ>Ключевая особенность в том, что для построения последовательности на угрозу отвечают сразу всеми защитными ходами одновременно. Если последовательность всё ещё можно построить, то уже потом угроза анализируется на контратаки.
По сути это и есть NULL-move
ШЕ>У него ещё есть эвристика нулевого хода. Она у него даётся как: если игрок пропускает свой ход, то противник может построить выигрышную ШЕ>последовательность вилок. Сказано, что типа эта позволяет видеть скрытые угрозы. Если честно, я не допёр как этим пользоваться, поэтому не использую. ШЕ>Как бы непонятно, ну увидим мы угрозу на ход раньше. Совсем неочевидно, какими ходами её предотвратить. Это может быть ход на то место, откуда угроза разивается или к примеру боковые ходы, которые могут способствовать развитию контратаки.
Наверное пользоваться так: (1) поскольку мы ищем победу крестиков, то эвристику NULL-move имеет смысл выполнять для ноликов; (2) Нолики пропускают ход, и мы ищем атаку со стороны крестиков; (3) В случае, когда есть форсированный вариант, приводящий крестиков к победе, то можно эту последовательность рассматривать как киллер (т. е. при переборе всех возможных ходов ноликов, опровержение начинать с этого варианта). Вообще, alpha-beta очень чувствительна к порядку перебора вариантов.
ШЕ>Блин. Всё равно ничего не понятно получается. В общем сложно объяснить. Для того чтобы было понятно, нужно писать статью и подбирать картинки с примерами.
Все понятно, не переживай
Еще (A) идея Z-orbice. Многие позиции будут повторятся (+симметрии). Хотелось бы построить по позициям какой-нить хэш, чтобы это можно было быстро детектировать. Самая простая идея, построить таблицу, где каждой клетке поля соответствует некоторое число для крестиков (для ноликов соответсвенно). Потом мы делаем две суммы и mod на некоторое простое число. Что позволит быстро находить одинаковые позиции. Конечно, это не покрывает симметрии, но... Еще (B) имеет смысл расспросить данов по поводу теории дебютов, и взять ее за основу. Фактически, в свое время я читал, что в рендзю (запрещены вилки 3x3 и 4x4 черным) с выбором дебюта белыми (после третьего хода белые выбирают, хотят ли они играть черными) результативность составляла 55% в пользу белых. Соотвественно, уже сейчас теории этой игры очень сильно развита. (C) Еще для позиций, для которых не установлен результат, можно прикрутить ОФ для того, чтобы управлять alpha-beta.
Далее, очень сомнительно выглядит цифра 1 600 000 позиций. На моем компе шахматный движок без ОФ легко дает 3 000 000 позиций в секунду на одном ядре. Возможно, можно оптимизировать генерацию ходов.
H>Блин, упал до 4-го места. Ладно возобновляю работу
Ну для поддержания спортивного духа, статистика с сортировкой по количеству.
С количеством терминальных решений и последним терминальным решением.
Хотя с 50 спотами амазона, конечно, сложно соревноваться.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ> Так что если вы готовы принять участие из любви к искусству — пишите. Мне нужно набрать хотя бы 60 процессов дней на 10.
Готов поделиться ядрами под FreeBSD. Ограничение — программа должна поставляться в исходниках, собираться простыми configure/make, запускаться под непривелигрованным пользователем и как-то сигнализировать о том, что она вообще делает (считает, качает, спит).
AB>Готов поделиться ядрами под FreeBSD. Ограничение — программа должна поставляться в исходниках, собираться простыми configure/make, запускаться под непривелигрованным пользователем и как-то сигнализировать о том, что она вообще делает (считает, качает, спит).
1. Исходники не проблема.
2. Сборка я бы не сказал что простой make. Для начала надо буст ставить:
cd /usr/ports/devel/boost-libs
make install
Для чего естественно нужны рутовые привелегии.
3. Да. Запускается под обычным пользователем.
4. Сигнализировать не знаю. Основное время прога считает, т.е. нагрузка падает на CPU. Передаёт\получает .sh скрипт, который использует для этого wget.
Сама прога ничего не передаёт и не получает по сети.
Если всё ещё будете готовы, напишите мне на shebeko на mail точка ru
Я вышлю исходники и инструкцию.
Посчиталось 602763. Осталось меньше 1000000
Уже можно сделать кое-какие выводы.
На данный момент свернулось 19218 варианта
Это означает, что 19218/602763*100%=3.19% путей сворачиваются.
Однако более половины, из решённых путей вообще пока не имеют ни победных ни проигрышных вариантов.
Следующий уровень( в 8 ходов) уже содержит 10984675
Что означает, что он в 10984675/602763=18.22 раза больше, чем предыдущий уровень (в 7 ходов).
Это не так и плохо, учитывая что в худшем случае каждое состояние генерирует 80 новых позиций.
Но, увы означает, что в таком варианте вряд ли удастся задачу решить, из-за нехватки ресурсов.
Всё же хотелось бы досчитать до след. уровня, чтобы понять какой процент решений будет сворачиваться на след. уровне.
Спасибо за поддержку!
Амазоновские потоки я видимо, сверну так как уже потратил на них 60$. А считают они как-то так себе.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ> До след. уровня осталось <300000 из 1600000 вариантов
ШЕ>
ШЕ> 46.4.38.21 351608
ШЕ>
Получается я вышел на первое? Надо как-то придумать, как объединять несколько IP под один условный логин (это и секурнее, т.к. не светит IP-шники и понятнее).
Ура! Ура! Ура!
Уровень в семь ходов решили.
Полная статистика выглядит так.
Мне ещё нужно пройти следующий уровень в семь ходов хотя бы на 50000 вариантов, чтобы сделать выводы для себя.
Но в принципе потихоньку процессы можно останавливать.
Решение, к сожалению, мы не получили.
Но сейчас для меня было важно "заглянуть" на следующий 8 уровень и посмотреть как он будет себя вести.
На выходных постараюсь написать отчёт по полученным результатам и что же они значат.
А так же решить организационные моменты с участниками.
On 08/31/2012 12:47 AM, Шебеко Евгений wrote:
> На выходных постараюсь написать отчёт по полученным результатам и что же они значат. > А так же решить организационные моменты с участниками. > > Ещё раз спасибо, всем кто участвовал!
Евгений, я не участвовал, сорри, всвязи с тяжёлым производственным запоем.
На сдедующем шаге буду обязательно.
ШЕ>>У меня есть около 300 WMZ К>Вы не думали их потратить на покупку чего-нить вроде Sapphire Radeon HD 7870, и посчитать всё на своём компе? К>Или там алгоритм не параллелится на 1280 ядер по гигагерцу?
А разве можно такое распарралелить на график карте? Прокомментируйте кто в теме плиз.
Здравствуйте, _SZ_, Вы писали:
Q>>Ты читал книжку «Дядя Петрос и проблема Гольдбаха»?
_SZ>В 2013 году тернарная гипотеза Гольдбаха была окончательно доказана Харальдом Гельфготтом... ах, дядя Петрос...
Бинарная проблема Гольдбаха всё ещё далека от решения. (c) оттуда же
Дядя Петрос емнип, пытался решить именно бинарную.
Я немного допилил алгоритм, и хотя он мне всё ещё не нравится, но результаты довольно обнадёживающие.
Всего 2 машины, 5 потоков, работающих время от времени добились довольно неплохих результатов.
Так что можно немного поборзеть, и попробовать решить дерево целиком.
Я планировал добавить автоматическую статистику на сайт, но врядли у меня в ближайшее время получится.
Обещать что-то пока пожалуй тоже не буду.
И так, если вы хотите принять участие, заходите сюда, качайте windows или ubuntu версию.
Запускаете f5_spawn. По умолчанию он стартует с количеством проццессов, равных к-ву ядер в системе.
Можно предварительно отредактировать f5_spawn и вписать явно к-во процессов.
Также можно вписать src_name, чтобы идентифицировать себя вместо "somebody".
Я смогу потом в ручном режиме обработать логи, и выдать статистику по юзерам.
Для запуска на ubuntu возможно понадобиться доставить пакеты.
AB>На FreeBSD по прежнему собирается и запускается (увы, других серверов 24х7 нет)?
Не факт. Я переехал на отдельный сервер на облачном хостинге, а они как на зло все линуксовые.
Я проверю.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>Я немного допилил алгоритм, и хотя он мне всё ещё не нравится, но результаты довольно обнадёживающие. ШЕ>Всего 2 машины, 5 потоков, работающих время от времени добились довольно неплохих результатов. ШЕ>Так что можно немного поборзеть, и попробовать решить дерево целиком. ШЕ>Я планировал добавить автоматическую статистику на сайт, но врядли у меня в ближайшее время получится. ШЕ>Обещать что-то пока пожалуй тоже не буду.
ШЕ>И так, если вы хотите принять участие, заходите сюда, качайте windows или ubuntu версию. ШЕ>Запускаете f5_spawn. По умолчанию он стартует с количеством проццессов, равных к-ву ядер в системе. ШЕ>Можно предварительно отредактировать f5_spawn и вписать явно к-во процессов. ШЕ>Также можно вписать src_name, чтобы идентифицировать себя вместо "somebody". ШЕ>Я смогу потом в ручном режиме обработать логи, и выдать статистику по юзерам.
в можно сделать таски более продолжительные? а то много времени на скачку уходит.
или сервак какой свой написать, чтобы вгет каждый раз не запускать.
NB>в можно сделать таски более продолжительные? а то много времени на скачку уходит. NB>или сервак какой свой написать, чтобы вгет каждый раз не запускать.
Если очень уж быстро, возможно он ничего не считает?
Хотя я вас в статистике за сегодня вижу:
Некоторые решения решаются быстро, т.к. может быть ограниченое число вариантов из конкретной позиции.
Но вы можете увеличить глубину — будет медленнее. Но тогда и рейтинг в статистике у вас упадёт.
В f5_spawn.bat
set lookup_deep=3 можете увеличить до 4 или 5.
Главное не уменьшайте, а то это на качество решения влияет.
Ещё может быть вариант, что дерево переодически сплитится на сервере, в этот момент сервис оказывается недоступен.
Или просто сервак не доступен в какие-то моменты, из вашей точки по сетевым причинам.
Выглядит это так, как будто постоянно запросы идут.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ>Статистика здесь
там до конца далеко?
у тебя данные о решении как сохраняются? я запускаю с глубиной 5, в дальнейшем все плохие варианты полученные при обходе будут повторно проверяться, или нет?
NB>там до конца далеко?
Прогресс есть, но ещё далеко.
Прогресс видно по новыми решениям, которые появляются, например, здесь
NB>у тебя данные о решении как сохраняются? я запускаю с глубиной 5, в дальнейшем все плохие варианты полученные при обходе будут повторно проверяться, или нет?
К сожалению, будут. 5 может очень круто.
Но <3 тоже ставить нельзя, дерево на диске очень сильно растёт за счёт тупиковых веток.
Для меня лучше, низкопроизводительный, но долгосрочны расчёт.
Лучше пустить один процесс, и даже понизить ему приоритет, но чтобы он молотил месяц.
Здравствуйте, Шебеко Евгений, Вы писали:
NB>>у тебя данные о решении как сохраняются? я запускаю с глубиной 5, в дальнейшем все плохие варианты полученные при обходе будут повторно проверяться, или нет? ШЕ>К сожалению, будут.
ШЕ>5 может очень круто.
на трех проц мало нагружается
ШЕ>Но <3 тоже ставить нельзя, дерево на диске очень сильно растёт за счёт тупиковых веток.
ШЕ>Для меня лучше, низкопроизводительный, но долгосрочны расчёт. ШЕ>Лучше пустить один процесс, и даже понизить ему приоритет, но чтобы он молотил месяц.
я на домашнем запускаю. на ночь/рабочий день, естественно вырубаю.
Здравствуйте, Шебеко Евгений, Вы писали:
ШЕ> Не факт. Я переехал на отдельный сервер на облачном хостинге, а они как на зло все линуксовые. ШЕ> Я проверю.
К сожалению, под FreeBSD как-то не очень. Внес следующие изменения в CMakeLists.txt (протестировал на FreeBSD и Linux):
Со скриптами сходу не разобрался, по этому попытался написать с нуля, которые бы работали под FreeBSD и Linux (см. ниже), однако немного смущает то, что уж очень часто дергается wget для получения и отправки данных (буквально каждую секунду по запросу — в итоге большее количество времени тратится только на него, а не обсчет). По этому, дабы ничего не испортить, пока у себя все процессы остановил, прошу проверить скрипты запуска и, если все правильно, то дать добро (или наоборот, написать где неправильно).
f5_spawn.sh:
#!/bin/sh
# contributor name
SRC_NAME="somebody"
# max process count (leave empty to use all processors)
PROCESS_COUNT=""
# depth
LOOKUP_DEEP=2
# web service
URL="http://fiveinline.info/solutions/root/solve.php"
# check depency
OS=$(uname)
if [ "${OS}" = "Linux" ]; then
DAEMON=$(which daemon)
if [ -z "${DAEMON}" ]; then
echo "daemon not found, please install it and try again"
exit 1
fi
fi
FETCH=""
if [ -n "$(which wget)" ]; then
FETCH="wget -q -O"
elif [ -n "$(wich fetch)" ]; then
FETCH="fetch -q -o"
elif [ -n "$(which curl)" ]; then
FETCH="curl -s -o"
else
echo "Fetch command not found"
exit 1
fi
# get processors count
if [ -z "${PROCESS_COUNT}" ]; then
if [ "${OS}" = "Linux" ]; then
CPU_COUNT=$(cat /proc/cpuinfo | grep processor | wc -l)
elif [ "${OS}" = "FreeBSD" ]; then
CPU_COUNT=$(sysctl hw.ncpu | cut -d ' ' -f 2)
else
echo "Unsupported OS: ${OS}"
exit 1
fi
PROCESS_COUNT="${CPU_COUNT}"
fi
export URL="${URL}"
export SRC_NAME="${SRC_NAME}"
export LOOKUP_DEEP="${LOOKUP_DEEP}"
export PROCESS_COUNT="${PROCESS_COUNT}"
export FETCH="${FETCH}"
# spawn processes
cd `dirname $0`
BASE_DIR=$(pwd)
PROCNO=0
while [ "${PROCNO}" -lt "${PROCESS_COUNT}" ]
do
WORK_DIR="${BASE_DIR}/spawn/${PROCNO}"
if [ ! -d "${WORK_DIR}" ]; then
mkdir -p "${WORK_DIR}"
if [ $? -ne 0 ]; then
exit $?
fi
fi
cd "${WORK_DIR}"
if [ "${OS}" = "Linux" ]; then
daemon --chdir="${WORK_DIR}" --pidfile="${WORK_DIR}/pid" "${BASE_DIR}/f5_solve.sh"
elif [ "${OS}" = "FreeBSD" ]; then
daemon -p "${WORK_DIR}/pid" "${BASE_DIR}/f5_solve.sh"
else
echo "Unsupported OS: ${OS}"
exit 1
fi
PROCNO=$(expr "${PROCNO}" + 1)
done
f5_solve.sh:
#!/bin/sh
KEY_FILE="key_file"
while true
do
${FETCH} "${KEY_FILE}" "${URL}?src_name=${SRC_NAME}&cmd=get_job"
if [ $? -ne 0 ]; then
exit $?
fi
KEY=$(cat "${KEY_FILE}")
if [ -z "${KEY}" ]; then
exit 1
fi
echo "Current key is: ${KEY}"
RESULT=$(../../solver "${KEY}")
if [ $? -ne 0 ]; then
exit $?
fi
echo "Result is: ${RESULT}"
N=$(echo "${RESULT}" | awk '{print $2}')
W=$(echo "${RESULT}" | awk '{print $3}')
F=$(echo "${RESULT}" | awk '{print $4}')
${FETCH} result_file "${URL}?src_name=${SRC_NAME}&cmd=save_job&key=${KEY}&n=${N}&w=${W}&f=${F}"
if [ $? -ne 0 ]; then
exit $?
fi
done