Permalink
Browse files

compiles and starts but crashes

  • Loading branch information...
1 parent ce5a80f commit 7645fea33e47b55c82fb5ec25238d24b652b565a Alexey Vyskubov committed Apr 27, 2012
Showing with 86 additions and 109 deletions.
  1. +3 −1 Makefile
  2. +35 −26 apply_move.ml
  3. +0 −32 crc.ml
  4. +0 −3 crc.mli
  5. +0 −34 crc_table.ml
  6. +0 −1 crc_table.mli
  7. +2 −1 gametree.ml
  8. +1 −1 position.ml
  9. +4 −1 tools/poseator.ml
  10. +38 −7 zobrist.ml
  11. +3 −2 zobrist.mli
View
@@ -1,5 +1,7 @@
main:
- ocamlbuild whitecamel.native
+ ocamlbuild ${FLAGS} whitecamel.native
+debug:
+ ocamlbuild ${FLAGS} whitecamel.d.byte
profile:
ocamlbuild ${FLAGS} whitecamel.p.native
View
@@ -2,37 +2,42 @@ open Utils
open Types
let apply_move position move =
+ let revert_side = function
+ | Sente -> Gote
+ | Gote -> Sente in
let brd' = copy_board position.board in
let shand = position.sente_hand in
let ghand = position.gote_hand in
let sking = position.sente_king in
let gking = position.gote_king in
let old_hash = position.hash in
let zh = Zobrist.update_hand in
- let zb = Zobirst.update_board in
+ let zb = Zobrist.update_board in
let { what = (mv, pc) ; start = start; finish = (fx, fy) } = move in
match start with
(* drop move *)
| None ->
begin
+ let new_hash_hand = zh old_hash (mv, pc) in
+ let new_hash = zb new_hash_hand (mv, pc) fx fy in
+ let () = brd'.(fx).(fy) <- Some (mv, pc) in
match mv with
- | Sente ->
- let shand' = remove_one pc shand in
- let _ = brd'.(fx).(fy) <- Some (Sente, pc) in
- let new_hash = (zb (Sente, pc) fx fy $ zh (Sente, pc)) old_hash in
- {position with board = brd';
- to_move = Gote; sente_hand = shand';
- evaluation = not_evaluated; prev_move = move;
- hash = new_hash}
- | Gote ->
- let ghand' = remove_one pc ghand in
- let _ = brd'.(fx).(fy) <- Some (Gote, pc) in
- let hash_tmp = Zobrist.update_hand old_hash (Gote, pc) in
- let new_hash = Zobrist.update_board hash_tmp (Gote, pc) fx fy in
- {position with board = brd';
- to_move = Sente; gote_hand = ghand';
- evaluation = not_evaluated; prev_move = move;
- hash = new_hash}
+ | Sente ->
+ {position with
+ board = brd';
+ to_move = revert_side mv;
+ sente_hand = remove_one pc shand;
+ evaluation = not_evaluated;
+ prev_move = move;
+ hash = new_hash}
+ | Gote ->
+ {position with
+ board = brd';
+ to_move = revert_side mv;
+ gote_hand = remove_one pc ghand;
+ evaluation = not_evaluated;
+ prev_move = move;
+ hash = new_hash}
end
(* normal move *)
| Some (sx, sy) ->
@@ -46,17 +51,21 @@ let apply_move position move =
end in
let _ = brd'.(sx).(sy) <- None in
let _ = brd'.(fx).(fy) <- Some (mv, pc) in
- let hash_tmp = Zobrist.update_hanh (Zobrist.update_hand
- old_hash
-
+ let new_hash_board_from = zb old_hash (mv, pc) sx sy in
+ let new_hash_board_to = zb new_hash_board_from (mv, pc) fx fy in
let shand', ghand', new_hash =
begin
match position.board.(fx).(fy) with
- | None -> shand, ghand, hash_tmp
- | Some (Sente, tpc) ->
- shand, tpc :: ghand, Zobrist.update_hand hash_tmp (Gote, tpc)
- | Some (Gote, tpc) ->
- tpc :: shand, ghand, Zobrist.update_hand hash_tmp (Sente, tpc)
+ | None -> shand, ghand, new_hash_board_to
+ | Some (side, tpc) ->
+ let tpc' = Rules.basic_state tpc in
+ (* Remove piece from board *)
+ let new_hash_removed = zb new_hash_board_to (side, tpc) fx fy in
+ (* Add it to hand *)
+ let new_hash_hand = zh new_hash_removed (mv, tpc') in
+ match side with
+ | Sente -> shand, tpc' :: ghand, new_hash_hand
+ | Gote -> tpc' :: shand, ghand, new_hash_hand
end in
{ board = brd' ;
to_move = other mv ;
View
32 crc.ml
@@ -1,32 +0,0 @@
-open Utils
-open Types
-
-let pc_to_num = function
- | Pawn -> 1
- | King -> 2
- | Gold -> 3
- | Silver -> 4
- | Bishop -> 5
- | Rook -> 6
- | Tokin -> 7
- | GoldS -> 8
- | DragonKing -> 9
- | DragonHorse -> 10
-
-let cell_to_num = function
- | None -> 0
- | Some (Sente, p) -> pc_to_num p
- | Some (Gote, p) -> (pc_to_num p) lsl 4
-
-let crc16 =
- let crc_step crc chr =
- let index = (lxor) (crc lsr 8) in
- (crc lsl 8 land 0xFFFF) lxor Crc_table.table.(index chr) in
- (List.fold_left crc_step 0xFFFF)
-
-let pos_crc pos =
- let brd = pos.board in
- (crc16 $ (List.map cell_to_num) $ board_to_list) brd
-(*
- * vim:sw=2
- *)
View
@@ -1,3 +0,0 @@
-open Types
-
-val pos_crc : position -> int
View
@@ -1,34 +0,0 @@
-let table = [|
-0x0000; 0x1021; 0x2042; 0x3063; 0x4084; 0x50A5; 0x60C6; 0x70E7;
-0x8108; 0x9129; 0xA14A; 0xB16B; 0xC18C; 0xD1AD; 0xE1CE; 0xF1EF;
-0x1231; 0x0210; 0x3273; 0x2252; 0x52B5; 0x4294; 0x72F7; 0x62D6;
-0x9339; 0x8318; 0xB37B; 0xA35A; 0xD3BD; 0xC39C; 0xF3FF; 0xE3DE;
-0x2462; 0x3443; 0x0420; 0x1401; 0x64E6; 0x74C7; 0x44A4; 0x5485;
-0xA56A; 0xB54B; 0x8528; 0x9509; 0xE5EE; 0xF5CF; 0xC5AC; 0xD58D;
-0x3653; 0x2672; 0x1611; 0x0630; 0x76D7; 0x66F6; 0x5695; 0x46B4;
-0xB75B; 0xA77A; 0x9719; 0x8738; 0xF7DF; 0xE7FE; 0xD79D; 0xC7BC;
-0x48C4; 0x58E5; 0x6886; 0x78A7; 0x0840; 0x1861; 0x2802; 0x3823;
-0xC9CC; 0xD9ED; 0xE98E; 0xF9AF; 0x8948; 0x9969; 0xA90A; 0xB92B;
-0x5AF5; 0x4AD4; 0x7AB7; 0x6A96; 0x1A71; 0x0A50; 0x3A33; 0x2A12;
-0xDBFD; 0xCBDC; 0xFBBF; 0xEB9E; 0x9B79; 0x8B58; 0xBB3B; 0xAB1A;
-0x6CA6; 0x7C87; 0x4CE4; 0x5CC5; 0x2C22; 0x3C03; 0x0C60; 0x1C41;
-0xEDAE; 0xFD8F; 0xCDEC; 0xDDCD; 0xAD2A; 0xBD0B; 0x8D68; 0x9D49;
-0x7E97; 0x6EB6; 0x5ED5; 0x4EF4; 0x3E13; 0x2E32; 0x1E51; 0x0E70;
-0xFF9F; 0xEFBE; 0xDFDD; 0xCFFC; 0xBF1B; 0xAF3A; 0x9F59; 0x8F78;
-0x9188; 0x81A9; 0xB1CA; 0xA1EB; 0xD10C; 0xC12D; 0xF14E; 0xE16F;
-0x1080; 0x00A1; 0x30C2; 0x20E3; 0x5004; 0x4025; 0x7046; 0x6067;
-0x83B9; 0x9398; 0xA3FB; 0xB3DA; 0xC33D; 0xD31C; 0xE37F; 0xF35E;
-0x02B1; 0x1290; 0x22F3; 0x32D2; 0x4235; 0x5214; 0x6277; 0x7256;
-0xB5EA; 0xA5CB; 0x95A8; 0x8589; 0xF56E; 0xE54F; 0xD52C; 0xC50D;
-0x34E2; 0x24C3; 0x14A0; 0x0481; 0x7466; 0x6447; 0x5424; 0x4405;
-0xA7DB; 0xB7FA; 0x8799; 0x97B8; 0xE75F; 0xF77E; 0xC71D; 0xD73C;
-0x26D3; 0x36F2; 0x0691; 0x16B0; 0x6657; 0x7676; 0x4615; 0x5634;
-0xD94C; 0xC96D; 0xF90E; 0xE92F; 0x99C8; 0x89E9; 0xB98A; 0xA9AB;
-0x5844; 0x4865; 0x7806; 0x6827; 0x18C0; 0x08E1; 0x3882; 0x28A3;
-0xCB7D; 0xDB5C; 0xEB3F; 0xFB1E; 0x8BF9; 0x9BD8; 0xABBB; 0xBB9A;
-0x4A75; 0x5A54; 0x6A37; 0x7A16; 0x0AF1; 0x1AD0; 0x2AB3; 0x3A92;
-0xFD2E; 0xED0F; 0xDD6C; 0xCD4D; 0xBDAA; 0xAD8B; 0x9DE8; 0x8DC9;
-0x7C26; 0x6C07; 0x5C64; 0x4C45; 0x3CA2; 0x2C83; 0x1CE0; 0x0CC1;
-0xEF1F; 0xFF3E; 0xCF5D; 0xDF7C; 0xAF9B; 0xBFBA; 0x8FD9; 0x9FF8;
-0x6E17; 0x7E36; 0x4E55; 0x5E74; 0x2E93; 0x3EB2; 0x0ED1; 0x1EF0
-|]
View
@@ -1 +0,0 @@
-val table : int array
View
@@ -20,7 +20,8 @@ module PosHash =
struct
type t = gametree
let hash = function
- | Gametree (pos, _) -> Crc.pos_crc pos
+ | Gametree (pos, _) ->
+ Zobrist.zobrist_hash pos.board pos.sente_hand pos.gote_hand
let equal gt1 gt2 =
let Gametree (pos1, _) = gt1 in
let Gametree (pos2, _) = gt2 in
View
@@ -13,7 +13,7 @@ let init_position plist stm shd ghd =
sente_king = (0, 0) ;
gote_king = (4, 4) ;
prev_move = no_move ;
- hash = Zobrist.zhash ar shd ghd ;
+ hash = Zobrist.zobrist_hash ar shd ghd ;
evaluation = not_evaluated ;
}
View
@@ -210,7 +210,10 @@ let evaluate () =
failwith res
let checksum () =
- failwith (Printf.sprintf "%x" (Crc.pos_crc !cur_pos))
+ let brd = !cur_pos.Types.board in
+ let shand = !cur_pos.Types.sente_hand in
+ let ghand = !cur_pos.Types.gote_hand in
+ failwith (Printf.sprintf "%x" (Zobrist.zobrist_hash brd shand ghand))
let rec mainloop () =
try
View
@@ -43,23 +43,54 @@ let pieces_in_hand =
((Gote, Bishop), Random.bits ()) ;
((Gote, Rook), Random.bits ()) ]
-let zhash brd shand ghand =
+(*
+ * The main constructor of Zobrist hash.
+ *
+ * The hash for the given state (board, sente hand and gote hand) is constructed
+ * by XORing the values corresponding to the pieces at the given spots and all
+ * the value for pieces in hand.
+ *)
+let zobrist_hash brd shand ghand =
let hash = ref 0 in
for i = 0 to 4 do
for j = 0 to 4 do
match brd.(i).(j) with
| Some piece ->
let arr = List.assoc piece pieces_on_board in
- let rndval = arr.(i).(j) in
- hash := !hash lxor rndval
+ let board_val = arr.(i).(j) in
+ hash := !hash lxor board_val
| None -> ()
done
done ;
List.iter (fun pc ->
- let rndval = List.assoc (Sente, pc) pieces_in_hand in
- hash := !hash lxor rndval) shand ;
+ let hand_val = List.assoc (Sente, pc) pieces_in_hand in
+ hash := !hash lxor hand_val) shand ;
List.iter (fun pc ->
- let rndval = List.assoc (Gote, pc) pieces_in_hand in
- hash := !hash lxor rndval) ghand ;
+ let hand_val = List.assoc (Gote, pc) pieces_in_hand in
+ hash := !hash lxor hand_val) ghand ;
!hash
+(*
+ * The following two functions update Zobrist hash value.
+ *)
+
+(*
+ * Adds or removes piece at the given point.
+ *
+ * Because Zobrist hash is using XOR, it does not matter if the piece is added
+ * or removed.
+ *)
+let update_board old_hash piece x y =
+ let arr = List.assoc piece pieces_on_board in
+ let board_val = arr.(x).(y) in
+ old_hash lxor board_val
+
+(*
+ * Adds or remove piece in hand.
+ *
+ * Because Zobrist hash is using XOR, it does not matter if the piece is added
+ * or removed.
+ *)
+let update_hand old_hash piece =
+ let hand_val = List.assoc piece pieces_in_hand in
+ old_hash lxor hand_val
View
@@ -1,4 +1,5 @@
open Types
-val zhash : board_t -> hand -> hand -> int
-val update : int -> int
+val zobrist_hash : board_t -> hand -> hand -> int
+val update_board : int -> piece -> int -> int -> int
+val update_hand : int -> piece -> int

0 comments on commit 7645fea

Please sign in to comment.