Шашки в России

Программа Каллисто - Обсуждение интерфейса для доступа к ЭБ

Kallisto - Май 03, 2007 - 04:21 AM
Тема сообщения: Обсуждение интерфейса для доступа к ЭБ
В этой ветке предлагаю программистам обсуждать интерфейс для доступа к ЭБ. Так чтобы после согласования любой движок мог без всяких проблем использовать общую ЭБ, предоставляемую оболочкой.

Вот первый вариант интерфейса.

Код:

#define DB_DRAW      10000
#define DB_WIN       10001
#define DB_LOSE      10002
#define DB_UNKNOWN   10003
#define DB_NOT_FOUND 555555


// флаги для доступа к базе

#define DB_IN_MEMORY 1


// коды для обозначений шашек

#define EMPTY   1
#define WHITE   2
#define BLACK   4
#define KING   8

// т.е. код белой дамки - 10

struct EdBoard1
{
   // все поля идут по порядку a8, c8, и т.д. до g1
   unsigned char board[32];
};

struct EdBoard2
{
   unsigned char *wman;
   unsigned wman_cnt;

   unsigned char *wkings;
   unsigned wkings_cnt;

   unsigned char *bman;
   unsigned bman_cnt;

   unsigned char *bkings;
   unsigned bkings_cnt;
};

// интерфейсный класс для доступа к базам
struct EdAccess
{
   // загрузить базы
   unsigned Load() = 0;

   // получить тип базы
   char *GetBaseType() = 0;

   // оценка позиции (всегда ход белых)
   int GetResult(EdBoard1 *board, unsigned flags) = 0;
   int GetResult(EdBoard2 *board, unsigned flags) = 0;

   // получить указатель на таблицу по материалу
   unsigned GetTable(unsigned wm, unsigned wk, unsigned bm, unsigned bk) = 0;

   // получить указатель на таблицу по материалу и по наиболее продвинутой шашке
   unsigned GetTable(unsigned wm, unsigned wk, unsigned bm, unsigned bk, unsigned rank) = 0;

   // проверка загруженности таблицы целиком в память
   unsigned IsTableInMemory(unsigned table);

   // получить индекс в таблице
   unsigned __int32 GetIndex(EdBoard1 *board) = 0;
   unsigned __int32 GetIndex(EdBoard2 *board) = 0;

   // получить оценку по указателю на таблицу и индексу
   int GetResult(unsigned table, unsigned __int32 index, unsigned flags) = 0;
};


// функция интерфейса экспортируемая из dll
__declspec(dllexport) void __stdcall EI_EGDB(EdAccess *eda)
{
   // здесь должен быть код
   // сохраняющий указатель на интерфейс во внутренние переменные движка
   // вызывающий загрузку базу?
}


Здесь я сомневаюсь по одному моменту. Хватит ли 32-х бит для индексирования больших таблиц?
Если нет, то стоит ли все базы индексировать 64-мя битами или для младших баз все-таки оставить 32 бита?
NS - Май 03, 2007 - 05:09 AM
Тема сообщения:
А зачем такие сложности?
Не проще ли дать просто ссылку на Таблицу "board"?
У меня, на делфях миллион копирований в другой формат представления доски занимает 50 мс.
20 миллионов копирований в секунду.

А авторам движков намного проще - просто скопировал доску в нужный формат, вызвал функцию с сылкой на таблицу в этом формате, и получил значение.

И дополнительно нужна вторая функция возвращающая размерность ЭБ.

То есть прямого доступа к ЭБ нет, есть только две функция - первая возвращает оценку, вторая размерность ЭБ.
Kallisto - Май 03, 2007 - 05:58 AM
Тема сообщения:
Ничего не понял. Позицию нужно просто скопировать в нужный формат. Причем предоставляются два формата на выбор.

Размерность базы возвращает Load(). Или ты о чем-то другом?
NS - Май 03, 2007 - 06:01 AM
Тема сообщения:
Я о том, что зачем преобразовывать позицию в 32-битное либо 64-битное число. Её можно просто скопировать в 32-байтный массив, а преобразование в индекс уже делать в оболочке.
Kallisto - Май 03, 2007 - 06:02 AM
Тема сообщения:
NS писал(а):
То есть прямого доступа к ЭБ нет, есть только две функция - первая возвращает оценку, вторая размерность ЭБ.

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

Функция вычисления индекса просто для полноты картины. Возможно есть еще какие-то микрооптимизации.
Kallisto - Май 03, 2007 - 06:04 AM
Тема сообщения:
NS писал(а):
Я о том, что зачем преобразовывать позицию в 32-битное либо 64-битное число. Её можно просто скопировать в 32-байтный массив, а преобразование в индекс уже делать в оболочке.

Так и есть. Вызывай вот эти функции:
int GetResult(EdBoard1 *board, unsigned flags) = 0;
int GetResult(EdBoard2 *board, unsigned flags) = 0;
NS - Май 03, 2007 - 06:09 AM
Тема сообщения:
Цитата:
Функция вычисления индекса просто для полноты картины. Возможно есть еще какие-то микрооптимизации.


Эта функция будет меняться от изменения формата ЭБ, поэтому проще её делать под текущий формат (всё-равно потом придется менять)
И если сейчас на индекс достаточно 32 бит, то зачем использовать 64?
Kallisto - Май 03, 2007 - 06:14 AM
Тема сообщения:
Перед использованием движок спрашивает формат базы. И если вдруг он знает, то может взять вычисление индекса на себя, а может передоверить оболочке. Зачем его лишать такой возможности?

Нужно сейчас придумать такой интерфейс, чтобы потом его уже менять не нужно было. Просто потом будут другие реализации ЭБ. И чтобы старые движки смогли легко их использовать без каких-либо модификаций кода.
NS - Май 03, 2007 - 06:23 AM
Тема сообщения:
Ну, я уже высказался. Раз для текущего формата и текущей размерности хватает 32 бит, то наверно нужно столько и сделать.
Kallisto - Май 03, 2007 - 07:05 AM
Тема сообщения:
А что делать когда их станет не хватать?
NS - Май 03, 2007 - 07:09 AM
Тема сообщения:
Цитата:
А что делать когда их станет не хватать?

Поменять формат базы (который движок может получить), и в этом случае движок должен использовать более медленный, но абсолютно универсальный формат 32-байтного массива.
Kallisto - Май 03, 2007 - 08:31 AM
Тема сообщения:
Мне больше нравится сразу перейти на 64 бита.
NS - Май 03, 2007 - 08:38 AM
Тема сообщения:
Да, только если потом будут использоваться сжатые (неполные) ЭБ, то скорей всего расчет индекса будет иной.
Kallisto - Май 03, 2007 - 09:27 AM
Тема сообщения:
Нет, индекс не имеет никакого отношения к сжатию.
NS - Май 03, 2007 - 09:34 AM
Тема сообщения:
Почему это не имеет? Для лучшего сжатия близкие (похожие) позиции размещаются рядом, и должны иметь близкий индекс. Плюс, при неполных базах, например в базах с одинаковым числом шашек у обеих сторон, если храним позиции только с очередью хода стороны с наиболее продвинутой шашкой - вычисление индекса так-же меняется.

И вместо выигрыша в скорости от обращения по индексу получаем падение скорости на пересчет индекса в оболочке.

Или другой пример - в Чинуке таблицы разбивались по степени продвинутости наиболее продвинутой простой - так-же другой расчет индекса.
Kallisto - Май 03, 2007 - 09:42 AM
Тема сообщения:
Какое это имеет значение? Все равно индекс тем или иным способом надо расчитывать. Единственно, что движок должен будет учесть, что скорость доступа к сжатой базе меньше. А узнать о сжатости базы он сможет из формата базы.
booot - Май 04, 2007 - 03:14 PM
Тема сообщения:
32-битного индекса хватит на все 7-ми фигурные таблицы (и меньше). Начиная с 8-ми фигур количество позиций в классе переваливает за возможности 32-битного числа. Но проблему вижу не в этом. Сгенерить 8-ку, а так же вероятно 9-ку - дело не очень сложной техники, подкрепленной солидной вычислительной мощью современных компьютеров. А вот как ее потом использовать максимально эффективно? Грузить всю таблицу в память можно себе позволить для 6-фигурки. С определенными ограничениями - часть 7-ми фигурки. Но начиная с 8-ми нужно придумывать нечто иное. Какой-то менеджер памяти, который будет по ходу перебора оперативно подгружать в память различные куски различных таблиц, следить за частотой их использования и по каким-то правилам замещать ранее подгруженные куски таблиц новыми. Предлагаю обсуждение общего формата ЭБ начать именно с этого вопроса: предположим, что мы уже сгенрили 8-ку и 9-ку Smile
NS - Май 04, 2007 - 03:23 PM
Тема сообщения:
Цитата:
предположим, что мы уже сгенрили 8-ку и 9-ку

Сгенерили безранговую восьмерку и сжали. После этого считаем влезает ли сжатая восьмерка в память, и получаем что да, влезает Smile
Kallisto - Май 04, 2007 - 03:41 PM
Тема сообщения:
booot, так ты займешься генерацией больших баз?

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

Можно поинтересоваться, как с этим справляются чекерсные программисты.

А по интерфейсу замечания есть?
NS - Май 04, 2007 - 03:47 PM
Тема сообщения:
У Чинука полная 8-ка несколько Гигов, но не факт что они хорошо сжали, и можно использовать неполные ЭБ.
Kallisto - Май 04, 2007 - 03:51 PM
Тема сообщения:
NS писал(а):
У Чинука полная 8-ка несколько Гигов, но не факт что они хорошо сжали, и можно использовать неполные ЭБ.

Вот именно, что целиком они не влезут. Вряд ли можно будет существенно улучшить их сжатие. Они сжимали с потерей инфы по половине позиций. И занимались этим не только программисты Чинука. Так что не нужно излишних иллюзий Smile
NS - Май 04, 2007 - 03:54 PM
Тема сообщения:
С потерей инфы по половине позиций, а если сжать с потерей инфы по 90% позиций? Что лучше - потерять в скорости доступа в 1000 раз, или сделать неполные ЭБ с десятипроцентным наполнением?
Это не утверждение, это вопрос Smile
Kvadrat - Май 04, 2007 - 03:59 PM
Тема сообщения:
У Plus600 безранговая 8-ка = 3.77 Gb
А почему вы не хотите рассмотреть такой класс как 4 на 4 простые? Большинство партий проходит через такое окончание. И в память, вероятно, оно влезет.
Kallisto - Май 04, 2007 - 04:09 PM
Тема сообщения:
NS писал(а):
Что лучше - потерять в скорости доступа в 1000 раз, или сделать неполные ЭБ с десятипроцентным наполнением?

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

Kvadrat, я не думаю, что 4х4 намного полезней, чем другие 8-фигурные.
Важно не количество партий проходящих через какую-то конкретную таблицу, а способность этой таблицы настолько отличаться от ОФ, что это будет сказываться на результате партий.
Kallisto - Май 04, 2007 - 04:15 PM
Тема сообщения:
На всякий случай приведу слова Мартина Фиерца, когда он генерил 7vs1 базу для поддавков (для крепков он посчитал такие базы излишними):
Цитата:
and my code to compute the binomial coefficient of n and k (I hope that's what it's called in English; it's = n!/(k!*(n-k)!) ) promptly overflowed past the size that a 32-bit integer can hold, and my database builder crashed when computing the 7-1-piece database

Kallisto - Май 08, 2007 - 10:39 AM
Тема сообщения:
Все, буду делать реализацию вот этого интерфейса:
Код:

struct EdBoard1
{
   // все поля идут по порядку a8, c8, и т.д. до g1
   unsigned char board[32];
};

struct EdBoard2
{
   unsigned char *wman;
   unsigned wman_cnt;

   unsigned char *wkings;
   unsigned wkings_cnt;

   unsigned char *bman;
   unsigned bman_cnt;

   unsigned char *bkings;
   unsigned bkings_cnt;
};

// интерфейсный класс для доступа к эндшпильным базам
struct EdAccess
{
   // возвращаемые значения

   const draw         =      0;
   const win          =  10000;
   const lose         = -10000;
   const db_not_found =  32000;

   // коды для обозначений шашек

   const white = 1;
   const black = 2;
   const empty = 4;
   const king  = 8;

   // флаги для доступа к базе

   const in_mem = 1;


   // загрузить базы
   // пока такие типы игр:
   //       russian
   //       russianlosers
   //       brazil
   //       brazillosers
   //       pool
   //       poollosers
   //       checkers
   //       checkerslosers

   unsigned Load(char *game_type) = 0;


   // получить тип базы

   char *GetBaseType() = 0;


   // оценка позиции (всегда ход белых)

   int GetResult(EdBoard1 *board, unsigned flags) = 0;
   int GetResult(EdBoard2 *board, unsigned flags) = 0;


   // получить указатель на таблицу по материалу

   unsigned GetTable(unsigned wm, unsigned wk, unsigned bm, unsigned bk) = 0;


   // получить указатель на таблицу по материалу и по наиболее продвинутой шашке

   unsigned GetTable(unsigned wm, unsigned wk, unsigned bm, unsigned bk, unsigned rank) = 0;


   // проверка загруженности таблицы целиком в память

   unsigned IsTableInMemory(unsigned table);

   
   // получить индекс в таблице

   unsigned __int64 GetIndex(EdBoard1 *board) = 0;
   unsigned __int64 GetIndex(EdBoard2 *board) = 0;

   
   // получить оценку по указателю на таблицу и индексу

   int GetResult(unsigned table, unsigned __int64 index, unsigned flags) = 0;


};

Если бы вы знали, сколько мне пришлось протратить усилий из-за того, что часто интерфейсы конфликтуют между собой, то не отнеслись бы к обсуждению столь индифферентно Smile
NS - Май 08, 2007 - 10:43 AM
Тема сообщения:
Игорь, если бы ты сразу сделал поддержку доступа только через массив - то никакого обсуждения бы и не потребовалось Smile

Можно было обойтись только одной функцией.

Медленно, зато очень просто.
Kallisto - Май 08, 2007 - 10:52 AM
Тема сообщения:
NS писал(а):
Медленно, зато очень просто.

Вот это самая большая проблема интерфейсов - неуниверсальность.
Кто-то обязательно был бы недоволен потерей скорости на ровном месте, хоть и копеечным. А так, я надеюсь, что любой будет удовлетворен.
Kallisto - Май 09, 2007 - 04:12 AM
Тема сообщения:
Сделал библиотеку для доступа к базам Каллисто. Теперь осталось "самое простое" - встроить ее в оболочку и отладить.

В качестве демонстрации работы с базами напишу код для SiDra.
Kallisto - Май 09, 2007 - 07:09 AM
Тема сообщения:
Вот сделал доступ к базам:

www.igorkorshunov.narod.ru/kallisto_ed.rar (примерно 226 килобайт).


Интерфейс в фале EdAccess.h

Примеры доступа в исходниках SiDra (ED.cpp). Правда сделал пока неэффективно. Она обращается к базе в каждом узле дерева.
Скорость упала более чем в два раза Smile
Но не это пока главное.

Для получения результата пока можно пользоваться только одной функцией:
virtual int GetResult(EdBoard1 *board, unsigned flags) = 0;

Для получения интерфейса к протоколу добавлена еще одна функция. В исходниках SiDra она самая нижняя.

Попытайтесь подключиться!
NS - Май 09, 2007 - 07:11 AM
Тема сообщения:
Скачал, пытаюсь...
NS - Май 10, 2007 - 08:26 AM
Тема сообщения:
Если бы ты сделал без Структуры, аналог
PF_SearchInfo, то было бы намного удобней...
(удобней стучаться из Делфи)
Kallisto - Май 10, 2007 - 08:39 AM
Тема сообщения:
На Дельфи сделать это не должно быть проблемой. Там есть поддержка интерфейсных классов.
NS - Май 10, 2007 - 07:01 PM
Тема сообщения:
Я говолову сломаю пока сделаю идентичный класс на делфи :(
А нет возможности всё-таки получить прямые ссылки на методы?
Kallisto - Май 10, 2007 - 07:39 PM
Тема сообщения:
Я тебе письмо написал.
NS - Май 11, 2007 - 07:22 PM
Тема сообщения:
Если кто еще будет пытаться сделать доступ к ЭБ Каллисто из Делфи вот работающий код:

Код:
Type f1=function(game_type:pchar):integer;stdcall;
Type f2=function():pchar;stdcall;
var Load:f1;
var GetBaseType:f2;

procedure EI_EGDB(My:Pointer); stdcall;
var vmt:Pointer;
Begin
 vmt:= pointer(pointer(Cardinal(My))^);
 Load:= pointer(pointer(Cardinal(vmt)+0)^);
 Load('russian');
 GetBaseType:= pointer(pointer(Cardinal(vmt)+4)^);
 GetBaseType;

Kallisto - Май 13, 2007 - 09:54 AM
Тема сообщения:
Новые исходники SiDra www.igorkorshunov.narod.ru/sidra_src.rar :

- эффективная поддержка ЭБ;
- исправлена идиотская ошибка, из-за которой, иногда, ходы (в корне дерева!) просто выбрасывались из рассмотрения;
- добавил комментариев на русском - начинающим теперь можно изучать все основные алгоритмы по исходникам (постарался все сделать максимально понятно).
Kallisto - Май 13, 2007 - 10:33 AM
Тема сообщения:
Исправил ошибку в библиотеке доступа к ЭБ: www.igorkorshunov.narod.ru/EdAccess.rar
Повторный вызов Load обнулял рамерность уже загруженных баз.
NS - Май 13, 2007 - 10:48 AM
Тема сообщения:
А можешь заодно выложить оболочки для Бразильских и Пула?
Kallisto - Май 13, 2007 - 10:50 AM
Тема сообщения:
Пусть сперва все сделают для русских. А потом уже будем думать про варианты.
nikvo - Май 13, 2007 - 11:07 AM
Тема сообщения:
Kallisto писал(а):
Новые исходники SiDra www.igorkorshunov.narod.ru/sidra_src.rar :

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


Надо заново переписать?И бразильские тоже?
Kallisto - Май 13, 2007 - 12:51 PM
Тема сообщения:
nikvo писал(а):
Надо заново переписать?И бразильские тоже?

О чем идет речь?
nikvo - Май 13, 2007 - 04:17 PM
Тема сообщения:
ЭБ напр.
Kallisto - Май 13, 2007 - 05:49 PM
Тема сообщения:
Трудно понять.
Но никакой необходимости что-то переписывать нет.
nikvo - Май 13, 2007 - 10:13 PM
Тема сообщения:
base not found

Выскакивает табличка такая.Хотя я сгенерировал ЭБ(в бразил)

Вы писали - исправлена идиотская ошибка, из-за которой, иногда, ходы (в корне дерева!) просто выбрасывались из рассмотрения;

В русской или бразильской версии?И как исправить?Вытереть и заново записать?
letas - Май 14, 2007 - 01:52 AM
Тема сообщения:
nikvo писал(а):
base not found

Выскакивает табличка такая.Хотя я сгенерировал ЭБ(в бразил)

Вы писали - исправлена идиотская ошибка, из-за которой, иногда, ходы (в корне дерева!) просто выбрасывались из рассмотрения;

В русской или бразильской версии?И как исправить?Вытереть и заново записать?

Такая табличка выскакивает,когда база сгенерирована не до конца.
Проверьте это.
Kallisto - Май 14, 2007 - 03:55 AM
Тема сообщения:
nikvo писал(а):
В русской или бразильской версии?И как исправить?Вытереть и заново записать?

Вы прочитайте еще раз. Это ни к русской ни к бразильской никакого отношения не имеет.
Табличка "base not found" означает, что не хватает каких-то кусков базы.
Kallisto - Май 18, 2007 - 04:00 AM
Тема сообщения:
Вспомнил еще одну важную вещь. Бывают базы, сжатые с потерей информации о позициях, в которых возможны взятия.

Пусть для таких баз функция virtual char *GetBaseType(); возвращает строку в которой будет слово "nocaptures".

Например, для сжатых с потерей информации баз Каллисто эта строка будет:
"Kallisto nocaptures".

Если движок увидел слово "nocaptures" в типе базы он не должен обращаться к базе в позициях, где есть взятия, т.к. получит неправильный ответ.

Завтра добавлю корректную работу со сжатыми базами к SiDra.
NS - Май 18, 2007 - 04:41 AM
Тема сообщения:
Но если обратиться то ответит что такой позиции нет? Или даст неверный ответ?
Kallisto - Май 18, 2007 - 06:11 AM
Тема сообщения:
NS писал(а):
Но если обратиться то ответит что такой позиции нет? Или даст неверный ответ?

Можно считать, что ответом будет случайное число.
Kallisto - Май 19, 2007 - 04:36 AM
Тема сообщения:
Новые исходники SiDra: www.igorkorshunov.narod.ru/sidra_src.rar

- поддержка ЭБ, сжатых с потерей информации
- константы из интерфейсного класса переделаны в перечисления (enum), т.к. не все компиляторы поддерживают константы внутри класса
- добавлен проект для VC++ 6.0
- немного подправлена консольная версия
NS - Май 19, 2007 - 02:35 PM
Тема сообщения:
Для русских ключевое слово "russian", а какие будут ключевые слова для бразильских и пула?
letas - Май 19, 2007 - 03:20 PM
Тема сообщения:
Kallisto писал(а):
Новые исходники SiDra: www.igorkorshunov.narod.ru/sidra_src.rar

- поддержка ЭБ, сжатых с потерей информации
- константы из интерфейсного класса переделаны в перечисления (enum), т.к. не все компиляторы поддерживают константы внутри класса
- добавлен проект для VC++ 6.0
- немного подправлена консольная версия

В какую директорию все это нужно распаковать?
Kallisto - Май 19, 2007 - 03:38 PM
Тема сообщения:
Letas, ничего распаковывать не надо. Эта ветка предназначена исключительно для обсуждения технических деталей между программистами. Я об этом говорил в первом посте.

NS, в загаловочном файле есть такие комментарии:

// загрузить базы
// пока такие типы игр:
// russian
// russianlosers
// brazil
// brazillosers
// pool
// poollosers
// checkers
// checkerslosers

Я думал, что будет понятно Smile[/b]
Kallisto - Июнь 06, 2007 - 06:10 AM
Тема сообщения:
Нашел одну неточность в SiDra при использовании баз с потерей взятий.
В RootSearch() после генерации ходов должен быть такой код:
Код:

   if (!EdNocaptures || MoveBuffer[0].cap_sq[0]) EdRoot[stm] = EdProbe();
   else EdRoot[stm] = EdAccess::not_found;
   if (EdRoot[stm] == EdAccess::win) EdRoot[stm ^ CHANGE_COLOR] = EdAccess::lose;
   else if (EdRoot[stm] == EdAccess::lose) EdRoot[stm ^ CHANGE_COLOR] = EdAccess::win;
   else EdRoot[stm ^ CHANGE_COLOR] = EdRoot[stm];


Кстати, стоит ли делать поддержку ранговых баз? Или безранговых будет вполне достаточно? Между прочим, для движка, поддержку сделать достаточно просто.
NS - Июнь 07, 2007 - 08:12 AM
Тема сообщения:
Цитата:
Кстати, стоит ли делать поддержку ранговых баз? Или безранговых будет вполне достаточно? Между прочим, для движка, поддержку сделать достаточно просто.

Мне ранговые не нужны.
Kvadrat - Фев 03, 2008 - 05:44 AM
Тема сообщения:
Игорь, если это Вас не затруднит, объясните мне, чайнику, Sad как получить доступ в ЭБ.
Если я правильно понимаю, каждая позиция уникальная и имеет свой индекс/ключ. Для позиции вычисляется индекс и по этому индексу она ищется в соответствующем файле и возвращается оценка позиции. (Я говорю про файл, поскольку мне сейчас не надо грузить базы в память).
Объясните, пожалуйста, на примере этой позиции приведенной в соседней ветке

(ход черных, но полагаю в базе все описано относительно одного цвета)
как вычислить эту позицию и из какого файла по какому смещению вытащить оценку?
Или мне уже ничего не поможет? Cry Cry Cry
MiG - Фев 03, 2008 - 10:17 AM
Тема сообщения:
Kvadrat писал(а):
Если я правильно понимаю, каждая позиция уникальная и имеет свой индекс/ключ. Для позиции вычисляется индекс и по этому индексу она ищется в соответствующем файле и возвращается оценка позиции.

Отвечу вкратце вместо Игоря Smile

Да, Вы всё правильно поняли. Сейчас Вы должны разобраться в исходниках, в которых реализован доступ к ЭБ, и сделать то же самое для своего движка.

Еще один (более простой) вариант — подключить ЭБ через уже имеющийся интерфейс.
Kallisto - Фев 03, 2008 - 02:46 PM
Тема сообщения:
Исходники библиотеки для доступа к ЭБ - www.igorkorshunov.narod.ru/EdAccess.rar

Пример использования - www.igorkorshunov.narod.ru/sidra_src.rar
Время в формате GMT + 3
PNphpBB2 © 2003-2007