Implement undo command
authorH.G. Muller <h.g.muller@hccnet.nl>
Fri, 13 Sep 2013 13:42:27 +0000 (15:42 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 15 Sep 2013 08:54:36 +0000 (10:54 +0200)
This is decoded with the native bonanza commands, and should thus work
both in xboard and native mode. It resets the game by faking a 'new' command,
and then loads all moves except the last. For this the move list and startup
string needed to be remembered.

makemove.c
proce.c
readme.txt
shogi.h

index 17713d3..210dfae 100644 (file)
@@ -420,6 +420,7 @@ make_move_root( tree_t * restrict ptree, unsigned int move, int flag )
     }
 
   root_turn = Flip( root_turn );
+  move_list[move_ptr++] = move; // [HGM] undo: remember all moves played in root
 
   /* detect checkmate */
   if ( check && is_mate( ptree, 1 ) ) { game_status |= flag_mated; }
@@ -515,6 +516,7 @@ int CONV unmake_move_root( tree_t * restrict ptree )
   ptree->nrep -= 1;
   game_status &= ~( flag_drawn | flag_mated );
   root_turn    = Flip(root_turn);
+  move_ptr--; // [HGM] undo: clip last move off game history
 
   for ( i = NUM_UNMAKE-1; i > 0; i -= 1 )
     {
diff --git a/proce.c b/proce.c
index 6538fb9..3de4d5e 100644 (file)
--- a/proce.c
+++ b/proce.c
@@ -90,6 +90,7 @@ static int CONV cmd_move( tree_t * restrict ptree, char **lasts );
 static int CONV cmd_new( tree_t * restrict ptree, char **lasts );
 static int CONV cmd_read( tree_t * restrict ptree, char **lasts );
 static int CONV cmd_resign( tree_t * restrict ptree, char **lasts );
+static int CONV cmd_undo( tree_t * restrict ptree );    // [HGM] undo
 static int CONV cmd_time( char **lasts );
 
 
@@ -122,6 +123,9 @@ procedure( tree_t * restrict ptree )
   return proce_cui( ptree );
 }
 
+char *start_pos, start_data[512]; // [HGM] undo: for remembering start position
+int move_list[1024], move_ptr;
+
 #ifdef XBOARD
 #define IF(X) else if(!strcmp(command, X))
 
@@ -200,7 +204,8 @@ Out("# from=%d\n",from);
                        sprintf(line, "%c%c%c%c%s", 'a'+'9'-fromX, '1'+'9'-fromY, 'a'+'9'-toX, '1'+'9'-toY,
                                  astr_table_piece[abs(BOARD[from]) + (promo == '+' ? promote : 0)]);
                    }
-                   plyNr++; return 0;
+                   plyNr++;
+                   return 0;
                  }
   IF("undo")     { ; }
   IF("remove")   { ; }
@@ -227,6 +232,7 @@ static int CONV proce_cui( tree_t * restrict ptree )
     if ( ! strcmp( token, "xboard" ) )  { xboard_mode = 1; game_status |= flag_noprompt; return 1; }
   }
 #endif
+  if ( ! strcmp( token, "undo" ) )      { return cmd_undo( ptree ); }    // [HGM] undo
   if ( is_move( token ) ) { return cmd_usrmove( ptree, token, &last ); }
   if ( ! strcmp( token, "s" ) )         { return cmd_move_now(); }
   if ( ! strcmp( token, "beep" ) )      { return cmd_beep( &last); }
@@ -496,6 +502,27 @@ cmd_mnjmove( tree_t * restrict ptree, char **lasts, int num_alter )
 #endif
 
 
+static int CONV
+cmd_undo( tree_t * restrict ptree )
+{ // [HGM] undo: restart the game, and feed all moves except the last
+  int i, last = move_ptr;
+  char *p = start_data;
+  if( move_ptr <= 0 ) {
+    str_error = "undo past start of game ignored";
+    return -2;
+  }
+
+  AbortDifficultCommand;
+
+  last--;
+  cmd_new( ptree, &p );
+  for(i=0; i<last; i++) {
+    make_move_root( ptree, move_list[i], 0);
+  }
+  return 1;
+}
+
+
 #if defined(USI)
 static int CONV proce_usi( tree_t * restrict ptree )
 {
@@ -1435,8 +1462,11 @@ static int CONV cmd_new( tree_t * restrict ptree, char **lasts )
 
   AbortDifficultCommand;
 
+  start_pos = *lasts; move_ptr = 0; // [HGM] undo: remember start position
+
   if ( str1 != NULL )
     {
+      strncpy(start_data, str1, 511); // [HGM] undo: remember start position
       memset( &min_posi.asquare, empty, nsquare );
       min_posi.hand_black = min_posi.hand_white = 0;
       iret = read_board_rep1( str1, &min_posi );
index b90acd3..4754a5a 100644 (file)
-----------------------------------------------------------------------\r
-                        Bonanza 6.0 - Client Source Code\r
-                                            Kunihito Hoki, May 2011\r
-----------------------------------------------------------------------\r
-\r
-\r
-1. Introduction\r
-----------------\r
-\r
-Bonanza is a state-of-the art computer shogi engine which runs on\r
-Windows and Linux machines, and this directory contains a\r
-platform-independent source code.\r
-\r
-This source code is distributed with a hope that it will be useful in\r
-addition to the main part of the shogi engine. This program includes\r
-many useful functions such as manipulating a shogi board, reading and\r
-writing a CSA record file, speaking of a CSA protocol with a socket\r
-communication, and controlling time, and etc.. I believe this program\r
-can be a good starting point if you are interested in making shogi\r
-programs.\r
-\r
-One main feature of this program is that it employs a brute-force\r
-search method together with bitboard techniques as many chess programs\r
-do. Another notable feature is a machine learning of shogi evaluation\r
-functions. The details of the learning algorithm (aka Bonanza method)\r
-were already presented [1], and this source code provides an example\r
-of implementation of the learning method.\r
-\r
-I admit that some parts of the source code are cryptic, e.g. codes in\r
-"mate1ply.c". I hope that I will have some time to make a quality\r
-documentation and comments on the program code, or someone else could\r
-decrypt my program and provide a documentation.\r
-\r
-Any comments or suggestions are welcome [2].\r
-\r
-[1] K. Hoki, "Optimal control of minimax search results to learn\r
-    positional evaluation", Game Programming Workshop, Hakone, Japan\r
-    2008.\r
-\r
-[2] Contact to "bonanza_query [at] hotmail.com".\r
-\r
-\r
-2. Legal Notices\r
------------------\r
-\r
-This program is protected by copyright. Without a specific \r
-permission, any means of commercial applications are prohibited.\r
-Furthermore, this program is distributed without any warranty.\r
-Within these limits, you can use, redistribute, and/or modify it.\r
-\r
-\r
-3. Change Logs\r
----------------\r
-\r
-Version 6.0\r
-\r
-Search() function is modified to ignore moves which receive negative\r
-values from Static Exchange Evaluation (SEE) at frontier and\r
-pre-frontier nodes. Self-play experiments showed that this modification\r
-makes Bonanza slightly stronger. Similar results were also observed in\r
-experiments using a shogi program YSS,\r
-http://www32.ocn.ne.jp/~yss/horizon.txt. Moreover, the branch cut by\r
-means of SEE at frontier nodes can also be found in a chess program,\r
-Stockfish.\r
-\r
-Now Bonanza does Late Move Reduction (LMR) at root nodes, and recursive\r
-iterative deepening more often. Self-play experiments showed that these\r
-modifications make Bonanza slightly stronger.\r
-\r
-DFPN searcher is added to the set of Bonanza source codes (dfpn.c,\r
-dfpn.h, and dfpnhash.c). You can use the searcher by using 'dfpn'\r
-command with a compile option -DDFPN turned on. To make use of the DFPN\r
-searcher in ordinary search, use 'dfpn_client' command with a compile\r
-option -DDFPN_CLIENT turned on. To provide a proper service to the DFPN\r
-client, you also need to use a server script 'src/server/dfpn_server.pl'\r
-with one or more DFPN worker(s) connected with 'dfpn connect' command.\r
-I am thankful to Dr. A. Nagai for his kind and fruitful advice.\r
-\r
-Now Bonanza can be a client of parallel searches using cluster computing\r
-environment with mnj command. 'src/server/parallel_server.pl' is a\r
-server script of root-node parallelizations, and the server can be a\r
-client of majority voting cluster computation.\r
-\r
-Some techniques which increase computational efficiency of Bonanza are\r
-reported by E. Ito, http://aleag.cocolog-nifty.com/. In his website,\r
-two ideas are shown, i.e., (i) speed up of the computation of the static\r
-evaluation function, and (2) use of SSE instructions of Intel processors\r
-for bitboard operations. By adopting his ideas to Bonanza, NPS value\r
-nearly doubled. This is amazing. To use SSE instructions, specify -DSSE2\r
-or -DSSE4 compiler option. I am thankful to Mr. E. Ito for his kind and\r
-fruitful advice.\r
-\r
--DINANIWA_SHIFT compilation flag is supplied to enable an Inaniwa-strategy detection\r
-\r
-There are many other modifications and bug fixes.\r
-\r
-\r
-Feliz 0.0\r
-\r
-- Some results from Y. Sato's experiments with Bonanza inspired me\r
-  to use the history table in LMR in Shogi, as Fruit did in chess. By\r
-  doing so, some improvement in performance of the tree search is\r
-  made.\r
-\r
-- From private communications with Yaneurao, it turned out that the\r
-  3-ply-mate detections in 'mate3.c' can search game trees more\r
-  efficiently by using several heuristic pruning techniques. Now\r
-  'mate3.c' adopts some of these techniques.\r
-\r
-- E. Ito kindly reported two bugs in the source codes. One is in\r
-  hash_store(), and the other is in ehash_probe() and\r
-  ehash_store(). Now these are fixed.\r
-\r
-- The structure of history table is modified from 'square-to' and\r
-  'square-from' method to an exact match method by using the perfect\r
-  hash technique. The hash function of moves in 'phash.c' is generated\r
-  by codes at http://burtleburtle.net/bob/hash/perfect.html.\r
-\r
-- A command 'mnj' is added to connect to the cluster-computing server\r
-  in src/cluster/.\r
-\r
-- In client_next_game(), the way of dealing with REJECT message from a\r
-  CSA Shogi server is revised. Now Bonanza connects to the server again\r
-  when the game is rejected by an opponent.\r
-\r
-\r
-Version 4.1.3\r
-- The owner of 'LS3600 Blog Webpage' pointed out that there were two\r
-  serious bugs. Thank you very much! According to his indication,\r
-  is_hand_eq_supe() in 'utility.c' and read_CSA_line() in 'csa.c' are\r
-  revised.\r
-- In MPV code in 'searchr.c', a test of 'root_abort' flag had been\r
-  forgotten. Now the flag is tested after every call of search().\r
-- 'lan.txt' is added to 'src/executable/' directory. This is an\r
-  example of an input sequence to connect to CSA Shogi server.\r
-- 'book.bin' now has smaller moves and positions than previous one does.\r
-  Also, 'book_anti.csa' is added to 'src/executable/' directory. This\r
-  is an example of bad moves which apear in records of human experts.\r
-- 'Legal Notices' in this document is corrected.\r
-\r
-Version 4.1.2\r
-- In 'Makefile' and 'Makefile.vs', targets which require profile-guided\r
-  optimization are removed. Furthermore, an option, which controls\r
-  optimization, has been reverted from the aggressive flag, -O3, to a\r
-  moderate one, '-O2'. These modifications were necessary for avoiding\r
-  abnormal terminations of the program.\r
-- In 'ini.c', the attribute of POSIX thread in a global-variable\r
-  'pthread_attr' is set to 'detach-state'. Because threads will never\r
-  join with any other threads in this program, the thread should be\r
-  created in the detached state to free system resources.\r
-- In 'ini.c', the default size of the transposition table is lifted\r
-  from 12MByte to 48MByte.\r
-- In 'iterate.c", probing the opening book is avoided when the move\r
-  history of a current game has repetitions.\r
-- In 'shogi.h', the margins of futility pruning are increased in\r
-  accord with new positional evaluation of the feature vector in\r
-  'fv.bin'.\r
-- The quality of an opening book, 'winbin/book.bin', has been improved\r
-  at the expense of quantity.\r
-\r
-Version 4.1.0 and 4.1.1 (26 Apr 2009)\r
-- In 'Makefile' and 'Makefile.vs', some options of Intel C compiler\r
-  are modified. Here, agressive optimization '-O3' is substituted for\r
-  the default '-O2', pthreads support '-pthread' is substituted for\r
-  '-lpthread', and an obsolete '-static-libcxx' is removed.\r
-- In 'Makefile', the conformance of GNU C and Intel C compilers are\r
-  set to GNU extensions of ISO C99 by setting '-std=gnu99' because a\r
-  POSIX function 'strtok_r()' is not in the C99 standard library.\r
-- In 'Makefile', targets for GNU C with gprof and profile-guided\r
-  optimization of GNU C are removed.\r
-- In 'shogi.h', inline assemblies and intrinsics are used on x86-64 as\r
-  well as x86. To detect the targets, pre-defined macros '__i386__'\r
-  and '__x86_64__' are examined.\r
-- In 'evaluate.c', the evaluation function looks up the table\r
-  'stand_pat[ply]' to see if the position have been evaluated since\r
-  the previous move is made by 'make_move_[bw]()' functions. Also, the\r
-  evaluation function probes the hash table 'ehash_tbl[]' to avoid\r
-  re-evaluation of the same position.\r
-- In 'io.c', an immediate value 0 is substituted for 'fileno(stdin)'\r
-  because the POSIX function 'fileno()' is not part of ANSI C. POSIX\r
-  requires that the file descriptor associated with 'stdin' be 0.\r
-- In 'iterate.c', a criterion for aging of transposition-table, i.e.,\r
-  increment of a global variable 'trans_table_age', is lifted from 7%\r
-  to 9% of saturation ratio of the table.\r
-- In 'learn1.c', the macro 'SEARCH_DEPTH' is set to 2. The macro\r
-  specifies the depth threashold of searches for finding all of\r
-  principle variations of positions in a set of games.\r
-- In 'learn1.c', a step size of increment/decrement of feature vectors\r
-  is fixed to 1 in 'learn_parse2()' function.\r
-- In 'hash.c', when a node can be pruned by using a hash value based on\r
-  futility pruning, a return value of the node is set to beta.\r
-- In 'rand.c', some codes of initialization of PRNG variables are\r
-  moved to 'ini_genrand()' from 'ini()' function.\r
-- In 'sckt.c', a function 'send_crlf()' is removed.\r
-- In 'search.c', now 'search()' calls 'search_quies()' and returns if\r
-  a search depth reaches a threashold. So that we can call 'search()'\r
-  function anytime, and this makes source codes simple.\r
-- In 'search.c', the static evaluation value is evaluated and used to\r
-  see if the late-move reduction is applicable or not. The evaluation\r
-  value is also used by the futility pruning.\r
-- In 'search.c', the futility pruning is not applied if the node is in\r
-  check or the move is a check.\r
-- In 'search.c', now Bonanza sends the keep-alive command '0x0a' to\r
-  the server in 'detect_signals()'.\r
-- In 'time.c', 'set_seach_limit_time()' is simplified.\r
-- In 'time.c', the second argument of 'gettimeofday()' is set to 'NULL'.\r
-\r
-Version 4.0.4 (2 Feb 2009)\r
-- An error of GCC inline assembly for spinlock in "thread.c" is fixed.\r
-- In Windows OS, Bonanza now opens all streams with file sharing by\r
-  using "_SH_DENYNO" constant in "io.c".\r
-- GCC built-in functions are substituted for GCC inline assemblies for\r
-  bit-scan operations in "bitop.h". Furthermore, "bitop.h" is removed,\r
-  and some of macros in the header are integrated into "shogi.h".\r
-\r
-Version 4.0.3 (Jan 2008)\r
-\r
-\r
-4. Files\r
----------\r
-\r
-Here is a list of files you can find in this directory.\r
-\r
-C headers\r
-- param.h     piece values\r
-- shogi.h     main header\r
-- bitop.h     bit operations\r
-- dfpn.h      header of DFPN codes\r
-\r
-basic C functions\r
-- main.c      main function of C program\r
-- data.c      definition of global variables\r
-- ini.c       initializations\r
-- rand.c      pseudo random number generator\r
-- time.c      time functions\r
-- bitop.c     bit operations\r
-- utility.c   misc. functions\r
-\r
-I/O\r
-- proce.c     input procedures\r
-- csa.c       csa file format I/O\r
-- io.c        basic I/O\r
-- sckt.c      Socket communications\r
-\r
-bitboard manipulations\r
-- attack.c    piece attacks\r
-- genchk.c    move generation (checks)\r
-- genevasn.c  move generation (evasions)\r
-- gendrop.c   move generation (drops)\r
-- gennocap.c  move generation (non-captures)\r
-- gencap.c    move generation (captures)\r
-- movgenex.c  move generation (inferior moves)\r
-- makemove.c  make moves\r
-- unmake.c    unmake move\r
-- mate1ply.c  1-ply mate detection\r
-- debug.c     examine bitboard validity\r
-\r
-brute-force search\r
-- iterate.c   iterative deepning search at root node\r
-- searchr.c   alpha-beta search at root node\r
-- search.c    alpha-beta search\r
-- next.c      obtains next move\r
-- quiesrch.c  quiescence search\r
-- evaluate.c  static eveluation function\r
-- evaldiff.c  easy and fast evaluation function\r
-- swap.c      static exchange evaluation\r
-- hash.c      transposition table\r
-- phash.c     perfect hash function of moves\r
-- thread.c    thread-level parallelization\r
-- root.c      root move genelation and shallow min-max search\r
-- mate3.c     3-ply mate detection\r
-- ponder.c    pondering\r
-- book.c      creates and probes opening book\r
-- problem.c   auto problem solver\r
-- valid.c     examine move validity\r
-\r
-DFPN search\r
-- dfpn.c      DFPN search\r
-- dfpnhash.c  Hashing for DFPN search\r
-\r
-optimal control of min-max search\r
-- learn1.c    main functions\r
-- learn2.c    feture vector manipuration\r
-\r
-misc.\r
-- bonanza.txt which now you are looking at\r
-- Makefile    makefile for gnu make.exe\r
-- Makefile.vs makefile for Microsoft nmake.exe\r
-- bonanza.ico icon file for windows\r
-- bonanza.rc  resource-definition file for windows\r
-- lan.txt     example of input sequence to connect CSA Shogi server\r
-- book_anti.csa example of a set of bad moves which apear in records\r
-              of human exparts. This is used by 'book create' command.\r
-\r
-4. How to build Bonanza\r
------------------------\r
-\r
-You can build Bonanza by means of GNU Make on Linux or Microsoft NMAKE\r
-on Windows. Here is some examples:\r
-\r
-- GCC on Linux\r
-> make -f Makefile gcc\r
-\r
-- Intel C++ Compiler on Linux\r
-> make -f Makefile icc\r
-\r
-- Microsoft C/C++ Compiler on Windows\r
-> nmake -f Makefile.vs cl\r
-\r
-- Intel C++ Compiler on Windows\r
-> nmake -f Makefile.vs icl\r
-\r
-The C source codes are written by using ANSI C plus a small number of\r
-new features in ISO C99. Therefore, I think this can be easily built\r
-in many platforms without much effort.\r
-\r
-It may be necessary to define some macros in Makefile or\r
-Makefile.vs. The macros are:\r
-\r
-- NDEBUG (DEBUG)    builds release (debug) version of Bonanza\r
-\r
-- MINIMUM           disables some auxiliary functions that are not\r
-                    necessary to play a game, e.g., book composition\r
-                    and optimization of evaluation functions\r
-\r
-- TLP               enables thread-level parallel search\r
-\r
-- MPV               enables multi-PV search\r
-\r
-- CSA_LAN           enables Bonanza to communicate by CSA Shogi TCP/IP\r
-                    protcol\r
-\r
-- DEKUNOBOU         enables dekunobou interface (available only for\r
-                    Windows)\r
-\r
-- CSASHOGI          builds an engine for CSA Shogi (available only for\r
-                    Windows)\r
-\r
-- NO_LOGGING        suppresses dumping log files\r
-\r
-- HAVE_SSE2         use SSE2 instructions for speed\r
-\r
-- HAVE_SSE4         use SSE2 and SSE4.1 instructions for speed\r
-\r
-- MNJ_LAN           enables a client-mode of cluster searches\r
-\r
-- INANIWA_SHIFT     enables an Inaniwa strategy detection\r
-\r
-- DFPN              build the DFPN worker of mate-problems server\r
-\r
-- DFPN_CLIENT       enables the client-mode of mate-problem server\r
-\r
-\r
-Bonanza is an application that does not provide graphical user\r
-interface. If you could build "bonanza.exe" properly without CSASHOGI\r
-macro, it shows a prompt "Black 1>" when you execute it at a computer\r
-console.\r
-\r
-Bonanza uses three binary files: a feature vector of static evaluation\r
-function "fv.bin",  an opening book "book.bin", and a\r
-position-learning database "hash.bin". You can find these in "winbin/"\r
-directory. Without the NO_LOGGING option, Bonanza must find "log/"\r
-directory to dump log files.\r
-\r
-\r
-5. Command List\r
----------------\r
-\r
-- beep on\r
-- beep off\r
-    These commands enable (on) or disable (off) a beep when Bonanza\r
-    makes a move.  The default is on.\r
-\r
-- book on\r
-- book off\r
-    These commands enable (on) or disable (off) to probe the opening\r
-    book, "./book.bin".  The default is on.\r
-\r
-- book narrow\r
-- book wide\r
-    When the command with "narrow" is used, Bonanza selects a book\r
-    move from a small set of opening moves. The default is "wide". The\r
-    narrowing of the opening moves is useful if you want Bonanza\r
-    choose a common opening line.\r
-\r
-- book create\r
-    This command creates the opening book file, "./book.bin", by using\r
-    numerous experts' games in a single CSA record file, "./book.csa".\r
-    It also uses another CSA record file, "book_anti.csa", where you\r
-    can register bad moves that may appear in the experts' games at\r
-    the last moves in the record file. Here is the example:\r
-\r
-    ----------------------------------------\r
-    PI, +, +6978KI, %TORYO\r
-    /\r
-    PI, +, +6978KI, -8384FU, %TORYO\r
-    /\r
-    PI, +, +7776FU, -4132KI, %TORYO\r
-    /\r
-    PI, +, +7776FU, -4132KI, +2726FU, %TORYO\r
-    ----------------------------------------\r
-\r
-    This command becomes effective when MINIMUM macro is not defined\r
-    in the Makefile.\r
-\r
-- connect 'addr' 'port' 'id' 'passwd' ['ngame']\r
-    This command connects Bonanza to a shogi server by using the CSA\r
-    protocol. The first four arguments specify the network address,\r
-    port number, user ID, and password, respectively. The last\r
-    argument limits a number of games that will be played by Bonanza.\r
-    This command becomes effective when CSA_LAN macro is defined in\r
-    the Makefile.\r
-\r
-- dfpn go\r
-    Bonanza does DFPN search at a current position.\r
-\r
-- dfpn hash 'num'\r
-    This command is used to initialize the transposition table of\r
-    DFPN search and set the size of the table to 2^'num'. This\r
-    command becomes effective when DFPN macro is defined in the\r
-    Makefile.\r
-\r
-- dfpn connect 'hostname' 'port#' 'ID'\r
-    This command is used to connect to the server script\r
-    dfpn_server.pl as a worker. This command becomes effective when\r
-    DFPN macro is defined in the Makefile.\r
-\r
-- dfpn_client 'hostname' 'port#'\r
-    This command is used to connect to the server script\r
-    dfpn_server.pl as a client. With this, a root and its child\r
-    posittions are examined by the DFPN worker(s). This command\r
-    becomes effective when DFPN_CLIENT macro is defined in the\r
-    Makefile.\r
-\r
-- display ['num']\r
-    This command prints the shogi board. If you want to flip the\r
-    board, set 'num' to 2. If not, set it to 1.\r
-\r
-- s\r
-    Bonanza makes a prompt reply while thinking as soon as this\r
-    command is used.\r
-\r
-- hash 'num'\r
-    This command is used to initialize the transposition table and\r
-    set the size of the table to 2^'num'.\r
-\r
-- hash learn create\r
-    This command is used to make a zero-filled position-lerning\r
-    database, "hash.bin". This command becomes effective when MINIMUM\r
-    macro is not defined in the Makefile.\r
-\r
-- hash learn on\r
-- hash learn off\r
-    These commands enable (on) or disable (off) the position learning.\r
-    The default is on.\r
-\r
-- learn 'str' 'steps' ['games' ['iterations' ['num1' ['num2']]]]\r
-    This command optimizes a feature vector of the static evaluation\r
-    function by using numorous experts' games in a single CSA record\r
-    file, "./records.csa". If you want to use a zero-filled vector as\r
-    an initial guess of the optimization procedure, set 'str' to\r
-    "ini". If not, set it to "no-ini". The third argument 'games' is a\r
-    number of games to be read from the record file. If the third\r
-    argument is negative or omitted, all games are read from the file.\r
-\r
-    The learning method iterates a set of procedures, and the number\r
-    of iteration can be limited by the fourth argument. It continues\r
-    as long as the argument is negative. The procedures consist of two\r
-    parts. The first part reads the record file and creates principal\r
-    variations by using 'num1' threads. The default value of 'num1' is\r
-    1. The second part renews the feature vector 'steps' times by using\r
-    'num2' threads in accord with the principal variations. The default\r
-    value of 'steps' and 'num2' is 1. Note that each thread in the\r
-    second procedure uses about 500MByte of the main memory. The two\r
-    arguments 'num1' and 'num2' become effective when TLP macro is\r
-    defined in the Makefile. After the procedures, the optimized\r
-    vector is saved in "./fv.bin". This command become effective when\r
-    MINIMUM macro is not defined in the Makefile.\r
-\r
-- limit depth 'num'\r
-    This command is used to specify a depth, 'num', at which Bonanza\r
-    ends the iterative deepening search.\r
-\r
-- limit nodes 'num'\r
-    When this command is used, Bonanza stops thinking after searched\r
-    nodes reach to 'num'.\r
-\r
-- limit time 'minute' 'second' ['depth']\r
-    This command limits thinking time of Bonanza. It tries to make\r
-    each move by consuming the time 'minute'. When the time is spent\r
-    all, it makes each move in 'second'. The last argument 'depth' can\r
-    be used if you want Bonanza to stop thinking after the iterative\r
-    deepening searches reach sufficient depth.\r
-\r
-- limit time extendable\r
-- limit time strict\r
-    The command, "limit time extendable", allows Bonanza to think\r
-    longer than the time limited by the previous command if it wishes\r
-    to. The default is "strict".\r
-\r
-- mnj 'sd' 'seed' 'addr' 'port' 'id' 'factor' 'stable_depth'\r
-    This command connects Bonanza to the majority or parallel server in\r
-    src/server/. The first two integers specify the standard\r
-    deviation and initial seed of pseudo-random numbers which are\r
-    added to the static evaluation function. Experiments suggested\r
-    that an appropriate value for the standard deviation is 15. Note\r
-    that all clients should use different seeds. The following three\r
-    arguments are network address, port number, user ID,\r
-    respectively. You can specify factor as a voting weight. Also\r
-    stable_depth is useful to detect opening positions. Here, when\r
-    Bonanza reaches the specified depth, then this is reported to the\r
-    server to reduce thinking time. This command becomes effective\r
-    when MNJ_LAN macro is defined in the Makefile.\r
-\r
-- move ['str']\r
-    Bonanza makes a move of 'str'. If the argument is omitted, Bonanza\r
-    thinks of its next move by itself.\r
-\r
-- mpv num 'nroot'\r
-- mpv width 'threshold'\r
-    These commands control the number of root moves, 'nroot', to\r
-    constitute principal variations. The default number is 1. A root\r
-    move that yields a smaller value than the best value by 'threshold'\r
-    is neglected. The default threshold is about 200. These commands\r
-    become effective when MPV macro is defined in the Makefile.\r
-\r
-- new ['str']\r
-    This command initializes the shogi board. The argument 'str'\r
-    controls an initial configuration of the board.  If you want to\r
-    play a no-handicapped game, set 'str' to "PI" and this is the\r
-    default value. In a handicapped game, specify squares and pieces\r
-    to drop, e.g. "new PI82HI22KA" or "new PI19KY".\r
-\r
-- peek on\r
-- peek off\r
-    The command "peek on (off)" enables (disables) peeks at a buffer\r
-    of the standard input file while Bonanza is thinking. The default\r
-    is on. This command is useful when you want to process a set of\r
-    commands as "> ./bonanza.exe < infile".\r
-\r
-- ping\r
-    Prompt Bonanza to print "pong".\r
-\r
-- ponder on\r
-- ponder off\r
-    The command "ponder on (off)" enables (disables) thinks on the\r
-    opponent's time. The default is on.\r
-\r
-- problem ['num']\r
-    This command is used to solve problems in "./problem.csa". Here\r
-    is an example of the problem file.\r
-\r
-    -----------------------------\r
-    $ANSWER:+0024FU\r
-    P1-KY-KE-OU-KI *  *  *  * -KY\r
-    P2 *  *  *  *  * -KI *  *  * \r
-    P3 *  * -FU-GI-FU * -KE * -KA\r
-    P4-FU *  * -FU-GI-FU-HI * -FU\r
-    P5 *  *  *  *  *  *  * -FU+KY\r
-    P6+FU+KA+FU+FU+GI+FU+KI *  * \r
-    P7 * +FU *  * +FU *  *  *  * \r
-    P8 * +OU+KI+GI *  * +HI *  * \r
-    P9+KY+KE *  *  *  *  * +KE * \r
-    P+00FU00FU\r
-    P-00FU00FU00FU\r
-    +\r
-    /\r
-    $ANSWER:+0087KY:+0088KY\r
-    P1-OU-KE *  *  *  *  * +GI * \r
-    P2-KY-KI *  *  *  *  *  *  * \r
-    P3-FU-HI * -KI *  * -GI *  * \r
-    P4 *  * -KE *  *  *  *  * -FU\r
-    P5 * +GI * -FU-FU-FU-FU-FU * \r
-    P6+FU+HI-FU *  *  *  *  *  * \r
-    P7 *  *  * +FU *  *  *  * +FU\r
-    P8 *  * +OU+KI+KI *  *  *  * \r
-    P9+KY+KE *  *  *  *  * +KE+KY\r
-    P+00KA00GI00KY00FU00FU\r
-    P-00KA00FU00FU00FU00FU00FU\r
-    +\r
-    -----------------------------\r
-\r
-    The argument 'num' specifies the number of problems to solve.\r
-\r
-- quit\r
-    The quit command and EOF character will exit Bonanza.\r
-\r
-- read 'filename' [(t|nil) ['num']]\r
-    This command is used to read a CSA record 'filename' up to 'num'\r
-    moves. Set the second argument to "nil" when you want to ignore\r
-    time information in the record. The default value is "t". Bonanza\r
-    reads all move sequence if the last argument is neglected. If\r
-    'filename' is ".", the command reads an ongoing game from the\r
-    initial position.\r
-\r
-- resign\r
-    Use this command when you resign a game.\r
-\r
-- resign 'num'\r
-    This command specifies the threshold to resign. 'num' is a value\r
-    of the threshold. The default is around 1000.\r
-\r
-- stress on\r
-- stress off\r
-    When the command "stress on" is used, last-move shown in shogi\r
-    board is stressed. The default is on.\r
-\r
-- time remain 'num1' 'num2'\r
-    This command tells Bonanza the remaining time. 'num1' ('num2') is\r
-    the remaining time of black (white) in seconds.\r
-\r
-- time response 'num'\r
-    This command specifies a margin to control time. The time margin\r
-    saves Bonanza from time up due to TCP/IP communication to a server\r
-    program, sudden disc access, or imperfection of time control of\r
-    Bonanza. 'num' is the time margin in milli-second. The default\r
-    value is 200.\r
-\r
-- tlp 'num'\r
-    This command controls the number of threads to be created when\r
-    Bonana considers a move to make. The command becomes effective\r
-    when TLP macro is defined in the Makefile. 'num' is the number of\r
-    threads. The default value is 1.\r
-\r
-- #\r
-    A line beginning with # causes all characters on that line\r
-    to be ignored.\r
-\r
-- [move command]\r
-    A move command consists of four digits followed by two\r
-    capital alphabets, e.g. 7776FU. The first two digits\r
-    are a starting square and the last two are a target square. The\r
-    starting square is "OO" if the  move is a dorp, e.g. 0087FU. The\r
-    following two alphabets specify a piece type as the following,\r
-\r
-      FU - pawn             (Fuhyo)       TO - promoted pawn    (Tokin)\r
-      KY - lance            (Kyousha)     NY - promoted lance   (Narikyo)\r
-      KE - knight           (Keima)       NK - promoted knight  (Narikei)\r
-      GI - silver general   (Ginsho)      NG - promoted silver  (Narigin)\r
-      KI - gold general     (Kinsyo)\r
-      KA - Bishop           (Kakugyo)     UM - Dragon horse     (Ryuma)\r
-      HI - Rook             (Hisha)       RY - Dragon king      (Ryuo)\r
-      OU - King             (Osho)\r
-\r
-    Here, words in parentheses are romanization of Japanese words.\r
+----------------------------------------------------------------------
+                        Bonanza 6.0 - Client Source Code
+                                            Kunihito Hoki, May 2011
+----------------------------------------------------------------------
+
+
+1. Introduction
+----------------
+
+Bonanza is a state-of-the art computer shogi engine which runs on
+Windows and Linux machines, and this directory contains a
+platform-independent source code.
+
+This source code is distributed with a hope that it will be useful in
+addition to the main part of the shogi engine. This program includes
+many useful functions such as manipulating a shogi board, reading and
+writing a CSA record file, speaking of a CSA protocol with a socket
+communication, and controlling time, and etc.. I believe this program
+can be a good starting point if you are interested in making shogi
+programs.
+
+One main feature of this program is that it employs a brute-force
+search method together with bitboard techniques as many chess programs
+do. Another notable feature is a machine learning of shogi evaluation
+functions. The details of the learning algorithm (aka Bonanza method)
+were already presented [1], and this source code provides an example
+of implementation of the learning method.
+
+I admit that some parts of the source code are cryptic, e.g. codes in
+"mate1ply.c". I hope that I will have some time to make a quality
+documentation and comments on the program code, or someone else could
+decrypt my program and provide a documentation.
+
+Any comments or suggestions are welcome [2].
+
+[1] K. Hoki, "Optimal control of minimax search results to learn
+    positional evaluation", Game Programming Workshop, Hakone, Japan
+    2008.
+
+[2] Contact to "bonanza_query [at] hotmail.com".
+
+
+2. Legal Notices
+-----------------
+
+This program is protected by copyright. Without a specific 
+permission, any means of commercial applications are prohibited.
+Furthermore, this program is distributed without any warranty.
+Within these limits, you can use, redistribute, and/or modify it.
+
+
+3. Change Logs
+---------------
+
+Version 6.0
+
+Search() function is modified to ignore moves which receive negative
+values from Static Exchange Evaluation (SEE) at frontier and
+pre-frontier nodes. Self-play experiments showed that this modification
+makes Bonanza slightly stronger. Similar results were also observed in
+experiments using a shogi program YSS,
+http://www32.ocn.ne.jp/~yss/horizon.txt. Moreover, the branch cut by
+means of SEE at frontier nodes can also be found in a chess program,
+Stockfish.
+
+Now Bonanza does Late Move Reduction (LMR) at root nodes, and recursive
+iterative deepening more often. Self-play experiments showed that these
+modifications make Bonanza slightly stronger.
+
+DFPN searcher is added to the set of Bonanza source codes (dfpn.c,
+dfpn.h, and dfpnhash.c). You can use the searcher by using 'dfpn'
+command with a compile option -DDFPN turned on. To make use of the DFPN
+searcher in ordinary search, use 'dfpn_client' command with a compile
+option -DDFPN_CLIENT turned on. To provide a proper service to the DFPN
+client, you also need to use a server script 'src/server/dfpn_server.pl'
+with one or more DFPN worker(s) connected with 'dfpn connect' command.
+I am thankful to Dr. A. Nagai for his kind and fruitful advice.
+
+Now Bonanza can be a client of parallel searches using cluster computing
+environment with mnj command. 'src/server/parallel_server.pl' is a
+server script of root-node parallelizations, and the server can be a
+client of majority voting cluster computation.
+
+Some techniques which increase computational efficiency of Bonanza are
+reported by E. Ito, http://aleag.cocolog-nifty.com/. In his website,
+two ideas are shown, i.e., (i) speed up of the computation of the static
+evaluation function, and (2) use of SSE instructions of Intel processors
+for bitboard operations. By adopting his ideas to Bonanza, NPS value
+nearly doubled. This is amazing. To use SSE instructions, specify -DSSE2
+or -DSSE4 compiler option. I am thankful to Mr. E. Ito for his kind and
+fruitful advice.
+
+-DINANIWA_SHIFT compilation flag is supplied to enable an Inaniwa-strategy detection
+
+There are many other modifications and bug fixes.
+
+
+Feliz 0.0
+
+- Some results from Y. Sato's experiments with Bonanza inspired me
+  to use the history table in LMR in Shogi, as Fruit did in chess. By
+  doing so, some improvement in performance of the tree search is
+  made.
+
+- From private communications with Yaneurao, it turned out that the
+  3-ply-mate detections in 'mate3.c' can search game trees more
+  efficiently by using several heuristic pruning techniques. Now
+  'mate3.c' adopts some of these techniques.
+
+- E. Ito kindly reported two bugs in the source codes. One is in
+  hash_store(), and the other is in ehash_probe() and
+  ehash_store(). Now these are fixed.
+
+- The structure of history table is modified from 'square-to' and
+  'square-from' method to an exact match method by using the perfect
+  hash technique. The hash function of moves in 'phash.c' is generated
+  by codes at http://burtleburtle.net/bob/hash/perfect.html.
+
+- A command 'mnj' is added to connect to the cluster-computing server
+  in src/cluster/.
+
+- In client_next_game(), the way of dealing with REJECT message from a
+  CSA Shogi server is revised. Now Bonanza connects to the server again
+  when the game is rejected by an opponent.
+
+
+Version 4.1.3
+- The owner of 'LS3600 Blog Webpage' pointed out that there were two
+  serious bugs. Thank you very much! According to his indication,
+  is_hand_eq_supe() in 'utility.c' and read_CSA_line() in 'csa.c' are
+  revised.
+- In MPV code in 'searchr.c', a test of 'root_abort' flag had been
+  forgotten. Now the flag is tested after every call of search().
+- 'lan.txt' is added to 'src/executable/' directory. This is an
+  example of an input sequence to connect to CSA Shogi server.
+- 'book.bin' now has smaller moves and positions than previous one does.
+  Also, 'book_anti.csa' is added to 'src/executable/' directory. This
+  is an example of bad moves which apear in records of human experts.
+- 'Legal Notices' in this document is corrected.
+
+Version 4.1.2
+- In 'Makefile' and 'Makefile.vs', targets which require profile-guided
+  optimization are removed. Furthermore, an option, which controls
+  optimization, has been reverted from the aggressive flag, -O3, to a
+  moderate one, '-O2'. These modifications were necessary for avoiding
+  abnormal terminations of the program.
+- In 'ini.c', the attribute of POSIX thread in a global-variable
+  'pthread_attr' is set to 'detach-state'. Because threads will never
+  join with any other threads in this program, the thread should be
+  created in the detached state to free system resources.
+- In 'ini.c', the default size of the transposition table is lifted
+  from 12MByte to 48MByte.
+- In 'iterate.c", probing the opening book is avoided when the move
+  history of a current game has repetitions.
+- In 'shogi.h', the margins of futility pruning are increased in
+  accord with new positional evaluation of the feature vector in
+  'fv.bin'.
+- The quality of an opening book, 'winbin/book.bin', has been improved
+  at the expense of quantity.
+
+Version 4.1.0 and 4.1.1 (26 Apr 2009)
+- In 'Makefile' and 'Makefile.vs', some options of Intel C compiler
+  are modified. Here, agressive optimization '-O3' is substituted for
+  the default '-O2', pthreads support '-pthread' is substituted for
+  '-lpthread', and an obsolete '-static-libcxx' is removed.
+- In 'Makefile', the conformance of GNU C and Intel C compilers are
+  set to GNU extensions of ISO C99 by setting '-std=gnu99' because a
+  POSIX function 'strtok_r()' is not in the C99 standard library.
+- In 'Makefile', targets for GNU C with gprof and profile-guided
+  optimization of GNU C are removed.
+- In 'shogi.h', inline assemblies and intrinsics are used on x86-64 as
+  well as x86. To detect the targets, pre-defined macros '__i386__'
+  and '__x86_64__' are examined.
+- In 'evaluate.c', the evaluation function looks up the table
+  'stand_pat[ply]' to see if the position have been evaluated since
+  the previous move is made by 'make_move_[bw]()' functions. Also, the
+  evaluation function probes the hash table 'ehash_tbl[]' to avoid
+  re-evaluation of the same position.
+- In 'io.c', an immediate value 0 is substituted for 'fileno(stdin)'
+  because the POSIX function 'fileno()' is not part of ANSI C. POSIX
+  requires that the file descriptor associated with 'stdin' be 0.
+- In 'iterate.c', a criterion for aging of transposition-table, i.e.,
+  increment of a global variable 'trans_table_age', is lifted from 7%
+  to 9% of saturation ratio of the table.
+- In 'learn1.c', the macro 'SEARCH_DEPTH' is set to 2. The macro
+  specifies the depth threashold of searches for finding all of
+  principle variations of positions in a set of games.
+- In 'learn1.c', a step size of increment/decrement of feature vectors
+  is fixed to 1 in 'learn_parse2()' function.
+- In 'hash.c', when a node can be pruned by using a hash value based on
+  futility pruning, a return value of the node is set to beta.
+- In 'rand.c', some codes of initialization of PRNG variables are
+  moved to 'ini_genrand()' from 'ini()' function.
+- In 'sckt.c', a function 'send_crlf()' is removed.
+- In 'search.c', now 'search()' calls 'search_quies()' and returns if
+  a search depth reaches a threashold. So that we can call 'search()'
+  function anytime, and this makes source codes simple.
+- In 'search.c', the static evaluation value is evaluated and used to
+  see if the late-move reduction is applicable or not. The evaluation
+  value is also used by the futility pruning.
+- In 'search.c', the futility pruning is not applied if the node is in
+  check or the move is a check.
+- In 'search.c', now Bonanza sends the keep-alive command '0x0a' to
+  the server in 'detect_signals()'.
+- In 'time.c', 'set_seach_limit_time()' is simplified.
+- In 'time.c', the second argument of 'gettimeofday()' is set to 'NULL'.
+
+Version 4.0.4 (2 Feb 2009)
+- An error of GCC inline assembly for spinlock in "thread.c" is fixed.
+- In Windows OS, Bonanza now opens all streams with file sharing by
+  using "_SH_DENYNO" constant in "io.c".
+- GCC built-in functions are substituted for GCC inline assemblies for
+  bit-scan operations in "bitop.h". Furthermore, "bitop.h" is removed,
+  and some of macros in the header are integrated into "shogi.h".
+
+Version 4.0.3 (Jan 2008)
+
+
+4. Files
+---------
+
+Here is a list of files you can find in this directory.
+
+C headers
+- param.h     piece values
+- shogi.h     main header
+- bitop.h     bit operations
+- dfpn.h      header of DFPN codes
+
+basic C functions
+- main.c      main function of C program
+- data.c      definition of global variables
+- ini.c       initializations
+- rand.c      pseudo random number generator
+- time.c      time functions
+- bitop.c     bit operations
+- utility.c   misc. functions
+
+I/O
+- proce.c     input procedures
+- csa.c       csa file format I/O
+- io.c        basic I/O
+- sckt.c      Socket communications
+
+bitboard manipulations
+- attack.c    piece attacks
+- genchk.c    move generation (checks)
+- genevasn.c  move generation (evasions)
+- gendrop.c   move generation (drops)
+- gennocap.c  move generation (non-captures)
+- gencap.c    move generation (captures)
+- movgenex.c  move generation (inferior moves)
+- makemove.c  make moves
+- unmake.c    unmake move
+- mate1ply.c  1-ply mate detection
+- debug.c     examine bitboard validity
+
+brute-force search
+- iterate.c   iterative deepning search at root node
+- searchr.c   alpha-beta search at root node
+- search.c    alpha-beta search
+- next.c      obtains next move
+- quiesrch.c  quiescence search
+- evaluate.c  static eveluation function
+- evaldiff.c  easy and fast evaluation function
+- swap.c      static exchange evaluation
+- hash.c      transposition table
+- phash.c     perfect hash function of moves
+- thread.c    thread-level parallelization
+- root.c      root move genelation and shallow min-max search
+- mate3.c     3-ply mate detection
+- ponder.c    pondering
+- book.c      creates and probes opening book
+- problem.c   auto problem solver
+- valid.c     examine move validity
+
+DFPN search
+- dfpn.c      DFPN search
+- dfpnhash.c  Hashing for DFPN search
+
+optimal control of min-max search
+- learn1.c    main functions
+- learn2.c    feture vector manipuration
+
+misc.
+- bonanza.txt which now you are looking at
+- Makefile    makefile for gnu make.exe
+- Makefile.vs makefile for Microsoft nmake.exe
+- bonanza.ico icon file for windows
+- bonanza.rc  resource-definition file for windows
+- lan.txt     example of input sequence to connect CSA Shogi server
+- book_anti.csa example of a set of bad moves which apear in records
+              of human exparts. This is used by 'book create' command.
+
+4. How to build Bonanza
+-----------------------
+
+You can build Bonanza by means of GNU Make on Linux or Microsoft NMAKE
+on Windows. Here is some examples:
+
+- GCC on Linux
+> make -f Makefile gcc
+
+- Intel C++ Compiler on Linux
+> make -f Makefile icc
+
+- Microsoft C/C++ Compiler on Windows
+> nmake -f Makefile.vs cl
+
+- Intel C++ Compiler on Windows
+> nmake -f Makefile.vs icl
+
+The C source codes are written by using ANSI C plus a small number of
+new features in ISO C99. Therefore, I think this can be easily built
+in many platforms without much effort.
+
+It may be necessary to define some macros in Makefile or
+Makefile.vs. The macros are:
+
+- NDEBUG (DEBUG)    builds release (debug) version of Bonanza
+
+- MINIMUM           disables some auxiliary functions that are not
+                    necessary to play a game, e.g., book composition
+                    and optimization of evaluation functions
+
+- TLP               enables thread-level parallel search
+
+- MPV               enables multi-PV search
+
+- CSA_LAN           enables Bonanza to communicate by CSA Shogi TCP/IP
+                    protcol
+
+- DEKUNOBOU         enables dekunobou interface (available only for
+                    Windows)
+
+- CSASHOGI          builds an engine for CSA Shogi (available only for
+                    Windows)
+
+- NO_LOGGING        suppresses dumping log files
+
+- HAVE_SSE2         use SSE2 instructions for speed
+
+- HAVE_SSE4         use SSE2 and SSE4.1 instructions for speed
+
+- MNJ_LAN           enables a client-mode of cluster searches
+
+- INANIWA_SHIFT     enables an Inaniwa strategy detection
+
+- DFPN              build the DFPN worker of mate-problems server
+
+- DFPN_CLIENT       enables the client-mode of mate-problem server
+
+
+Bonanza is an application that does not provide graphical user
+interface. If you could build "bonanza.exe" properly without CSASHOGI
+macro, it shows a prompt "Black 1>" when you execute it at a computer
+console.
+
+Bonanza uses three binary files: a feature vector of static evaluation
+function "fv.bin",  an opening book "book.bin", and a
+position-learning database "hash.bin". You can find these in "winbin/"
+directory. Without the NO_LOGGING option, Bonanza must find "log/"
+directory to dump log files.
+
+
+5. Command List
+---------------
+
+- beep on
+- beep off
+    These commands enable (on) or disable (off) a beep when Bonanza
+    makes a move.  The default is on.
+
+- book on
+- book off
+    These commands enable (on) or disable (off) to probe the opening
+    book, "./book.bin".  The default is on.
+
+- book narrow
+- book wide
+    When the command with "narrow" is used, Bonanza selects a book
+    move from a small set of opening moves. The default is "wide". The
+    narrowing of the opening moves is useful if you want Bonanza
+    choose a common opening line.
+
+- book create
+    This command creates the opening book file, "./book.bin", by using
+    numerous experts' games in a single CSA record file, "./book.csa".
+    It also uses another CSA record file, "book_anti.csa", where you
+    can register bad moves that may appear in the experts' games at
+    the last moves in the record file. Here is the example:
+
+    ----------------------------------------
+    PI, +, +6978KI, %TORYO
+    /
+    PI, +, +6978KI, -8384FU, %TORYO
+    /
+    PI, +, +7776FU, -4132KI, %TORYO
+    /
+    PI, +, +7776FU, -4132KI, +2726FU, %TORYO
+    ----------------------------------------
+
+    This command becomes effective when MINIMUM macro is not defined
+    in the Makefile.
+
+- connect 'addr' 'port' 'id' 'passwd' ['ngame']
+    This command connects Bonanza to a shogi server by using the CSA
+    protocol. The first four arguments specify the network address,
+    port number, user ID, and password, respectively. The last
+    argument limits a number of games that will be played by Bonanza.
+    This command becomes effective when CSA_LAN macro is defined in
+    the Makefile.
+
+- dfpn go
+    Bonanza does DFPN search at a current position.
+
+- dfpn hash 'num'
+    This command is used to initialize the transposition table of
+    DFPN search and set the size of the table to 2^'num'. This
+    command becomes effective when DFPN macro is defined in the
+    Makefile.
+
+- dfpn connect 'hostname' 'port#' 'ID'
+    This command is used to connect to the server script
+    dfpn_server.pl as a worker. This command becomes effective when
+    DFPN macro is defined in the Makefile.
+
+- dfpn_client 'hostname' 'port#'
+    This command is used to connect to the server script
+    dfpn_server.pl as a client. With this, a root and its child
+    posittions are examined by the DFPN worker(s). This command
+    becomes effective when DFPN_CLIENT macro is defined in the
+    Makefile.
+
+- display ['num']
+    This command prints the shogi board. If you want to flip the
+    board, set 'num' to 2. If not, set it to 1.
+
+- s
+    Bonanza makes a prompt reply while thinking as soon as this
+    command is used.
+
+- hash 'num'
+    This command is used to initialize the transposition table and
+    set the size of the table to 2^'num'.
+
+- hash learn create
+    This command is used to make a zero-filled position-lerning
+    database, "hash.bin". This command becomes effective when MINIMUM
+    macro is not defined in the Makefile.
+
+- hash learn on
+- hash learn off
+    These commands enable (on) or disable (off) the position learning.
+    The default is on.
+
+- learn 'str' 'steps' ['games' ['iterations' ['num1' ['num2']]]]
+    This command optimizes a feature vector of the static evaluation
+    function by using numorous experts' games in a single CSA record
+    file, "./records.csa". If you want to use a zero-filled vector as
+    an initial guess of the optimization procedure, set 'str' to
+    "ini". If not, set it to "no-ini". The third argument 'games' is a
+    number of games to be read from the record file. If the third
+    argument is negative or omitted, all games are read from the file.
+
+    The learning method iterates a set of procedures, and the number
+    of iteration can be limited by the fourth argument. It continues
+    as long as the argument is negative. The procedures consist of two
+    parts. The first part reads the record file and creates principal
+    variations by using 'num1' threads. The default value of 'num1' is
+    1. The second part renews the feature vector 'steps' times by using
+    'num2' threads in accord with the principal variations. The default
+    value of 'steps' and 'num2' is 1. Note that each thread in the
+    second procedure uses about 500MByte of the main memory. The two
+    arguments 'num1' and 'num2' become effective when TLP macro is
+    defined in the Makefile. After the procedures, the optimized
+    vector is saved in "./fv.bin". This command become effective when
+    MINIMUM macro is not defined in the Makefile.
+
+- limit depth 'num'
+    This command is used to specify a depth, 'num', at which Bonanza
+    ends the iterative deepening search.
+
+- limit nodes 'num'
+    When this command is used, Bonanza stops thinking after searched
+    nodes reach to 'num'.
+
+- limit time 'minute' 'second' ['depth']
+    This command limits thinking time of Bonanza. It tries to make
+    each move by consuming the time 'minute'. When the time is spent
+    all, it makes each move in 'second'. The last argument 'depth' can
+    be used if you want Bonanza to stop thinking after the iterative
+    deepening searches reach sufficient depth.
+
+- limit time extendable
+- limit time strict
+    The command, "limit time extendable", allows Bonanza to think
+    longer than the time limited by the previous command if it wishes
+    to. The default is "strict".
+
+- mnj 'sd' 'seed' 'addr' 'port' 'id' 'factor' 'stable_depth'
+    This command connects Bonanza to the majority or parallel server in
+    src/server/. The first two integers specify the standard
+    deviation and initial seed of pseudo-random numbers which are
+    added to the static evaluation function. Experiments suggested
+    that an appropriate value for the standard deviation is 15. Note
+    that all clients should use different seeds. The following three
+    arguments are network address, port number, user ID,
+    respectively. You can specify factor as a voting weight. Also
+    stable_depth is useful to detect opening positions. Here, when
+    Bonanza reaches the specified depth, then this is reported to the
+    server to reduce thinking time. This command becomes effective
+    when MNJ_LAN macro is defined in the Makefile.
+
+- move ['str']
+    Bonanza makes a move of 'str'. If the argument is omitted, Bonanza
+    thinks of its next move by itself.
+
+- mpv num 'nroot'
+- mpv width 'threshold'
+    These commands control the number of root moves, 'nroot', to
+    constitute principal variations. The default number is 1. A root
+    move that yields a smaller value than the best value by 'threshold'
+    is neglected. The default threshold is about 200. These commands
+    become effective when MPV macro is defined in the Makefile.
+
+- new ['str']
+    This command initializes the shogi board. The argument 'str'
+    controls an initial configuration of the board.  If you want to
+    play a no-handicapped game, set 'str' to "PI" and this is the
+    default value. In a handicapped game, specify squares and pieces
+    to drop, e.g. "new PI82HI22KA" or "new PI19KY".
+
+- peek on
+- peek off
+    The command "peek on (off)" enables (disables) peeks at a buffer
+    of the standard input file while Bonanza is thinking. The default
+    is on. This command is useful when you want to process a set of
+    commands as "> ./bonanza.exe < infile".
+
+- ping
+    Prompt Bonanza to print "pong".
+
+- ponder on
+- ponder off
+    The command "ponder on (off)" enables (disables) thinks on the
+    opponent's time. The default is on.
+
+- problem ['num']
+    This command is used to solve problems in "./problem.csa". Here
+    is an example of the problem file.
+
+    -----------------------------
+    $ANSWER:+0024FU
+    P1-KY-KE-OU-KI *  *  *  * -KY
+    P2 *  *  *  *  * -KI *  *  * 
+    P3 *  * -FU-GI-FU * -KE * -KA
+    P4-FU *  * -FU-GI-FU-HI * -FU
+    P5 *  *  *  *  *  *  * -FU+KY
+    P6+FU+KA+FU+FU+GI+FU+KI *  * 
+    P7 * +FU *  * +FU *  *  *  * 
+    P8 * +OU+KI+GI *  * +HI *  * 
+    P9+KY+KE *  *  *  *  * +KE * 
+    P+00FU00FU
+    P-00FU00FU00FU
+    +
+    /
+    $ANSWER:+0087KY:+0088KY
+    P1-OU-KE *  *  *  *  * +GI * 
+    P2-KY-KI *  *  *  *  *  *  * 
+    P3-FU-HI * -KI *  * -GI *  * 
+    P4 *  * -KE *  *  *  *  * -FU
+    P5 * +GI * -FU-FU-FU-FU-FU * 
+    P6+FU+HI-FU *  *  *  *  *  * 
+    P7 *  *  * +FU *  *  *  * +FU
+    P8 *  * +OU+KI+KI *  *  *  * 
+    P9+KY+KE *  *  *  *  * +KE+KY
+    P+00KA00GI00KY00FU00FU
+    P-00KA00FU00FU00FU00FU00FU
+    +
+    -----------------------------
+
+    The argument 'num' specifies the number of problems to solve.
+
+- quit
+    The quit command and EOF character will exit Bonanza.
+
+- read 'filename' [(t|nil) ['num']]
+    This command is used to read a CSA record 'filename' up to 'num'
+    moves. Set the second argument to "nil" when you want to ignore
+    time information in the record. The default value is "t". Bonanza
+    reads all move sequence if the last argument is neglected. If
+    'filename' is ".", the command reads an ongoing game from the
+    initial position.
+
+- resign
+    Use this command when you resign a game.
+
+- resign 'num'
+    This command specifies the threshold to resign. 'num' is a value
+    of the threshold. The default is around 1000.
+
+- stress on
+- stress off
+    When the command "stress on" is used, last-move shown in shogi
+    board is stressed. The default is on.
+
+- time remain 'num1' 'num2'
+    This command tells Bonanza the remaining time. 'num1' ('num2') is
+    the remaining time of black (white) in seconds.
+
+- time response 'num'
+    This command specifies a margin to control time. The time margin
+    saves Bonanza from time up due to TCP/IP communication to a server
+    program, sudden disc access, or imperfection of time control of
+    Bonanza. 'num' is the time margin in milli-second. The default
+    value is 200.
+
+- tlp 'num'
+    This command controls the number of threads to be created when
+    Bonana considers a move to make. The command becomes effective
+    when TLP macro is defined in the Makefile. 'num' is the number of
+    threads. The default value is 1.
+
+- undo
+    This command causes the latest move to be taken back.
+
+- #
+    A line beginning with # causes all characters on that line
+    to be ignored.
+
+- [move command]
+    A move command consists of four digits followed by two
+    capital alphabets, e.g. 7776FU. The first two digits
+    are a starting square and the last two are a target square. The
+    starting square is "OO" if the  move is a dorp, e.g. 0087FU. The
+    following two alphabets specify a piece type as the following,
+
+      FU - pawn             (Fuhyo)       TO - promoted pawn    (Tokin)
+      KY - lance            (Kyousha)     NY - promoted lance   (Narikyo)
+      KE - knight           (Keima)       NK - promoted knight  (Narikei)
+      GI - silver general   (Ginsho)      NG - promoted silver  (Narigin)
+      KI - gold general     (Kinsyo)
+      KA - Bishop           (Kakugyo)     UM - Dragon horse     (Ryuma)
+      HI - Rook             (Hisha)       RY - Dragon king      (Ryuo)
+      OU - King             (Osho)
+
+    Here, words in parentheses are romanization of Japanese words.
+
diff --git a/shogi.h b/shogi.h
index 23a7329..62800dd 100644 (file)
--- a/shogi.h
+++ b/shogi.h
@@ -956,6 +956,7 @@ extern const int aikkp_hand[8];
 extern const char ach_turn[2];
 extern const unsigned char aifile[ nsquare ];
 extern const unsigned char airank[ nsquare ];
+extern int move_list[], move_ptr; // [HGM] undo: game history (used in proce.c and makemove.c)
 
 #if defined(DFPN_CLIENT)
 #  define DFPN_CLIENT_SIZE_SIGNATURE 64