[Toss-devel-svn] SF.net SVN: toss:[1673] trunk/Toss
Status: Beta
Brought to you by:
lukaszkaiser
From: <luk...@us...> - 2012-02-11 22:16:44
|
Revision: 1673 http://toss.svn.sourceforge.net/toss/?rev=1673&view=rev Author: lukaszkaiser Date: 2012-02-11 22:16:36 +0000 (Sat, 11 Feb 2012) Log Message: ----------- Moving WebClient to Client, first JS unit test with phantomjs, correcting Client bug for WebKit, describing compilation on OSX. Modified Paths: -------------- trunk/Toss/.cvsignore trunk/Toss/Client/JsHandler.js trunk/Toss/Client/Local.js trunk/Toss/Client/State.js trunk/Toss/Client/index.html trunk/Toss/Makefile trunk/Toss/README trunk/Toss/www/develop.xml Added Paths: ----------- trunk/Toss/Client/ trunk/Toss/Client/GameSelection.ml trunk/Toss/Client/JsHandler.ml trunk/Toss/Client/Makefile trunk/Toss/Client/clientTest.js Removed Paths: ------------- trunk/Toss/Server/GameSelection.ml trunk/Toss/Server/JsHandler.ml trunk/Toss/WebClient/ Property Changed: ---------------- trunk/Toss/ Property changes on: trunk/Toss ___________________________________________________________________ Modified: svn:ignore - # We are still using .cvsignore files as we find them easier to manage # than svn properties. Therefore if you change .cvsignore do the following. # svn propset svn:ignore -F .cvsignore . Toss.docdir _build TossServer *.native *Profile.log gmon.out *~ *.annot *.cmx *.cmi *.o *.cmo *.a *.cmxa log.* + # We are still using .cvsignore files as we find them easier to manage # than svn properties. Therefore if you change .cvsignore do the following. # svn propset svn:ignore -F .cvsignore . Toss.docdir _build TossServer *.native *.byte *Profile.log gmon.out *~ *.annot *.cmx *.cmi *.o *.cmo *.a *.cmxa log.* Modified: trunk/Toss/.cvsignore =================================================================== --- trunk/Toss/.cvsignore 2012-02-10 02:21:07 UTC (rev 1672) +++ trunk/Toss/.cvsignore 2012-02-11 22:16:36 UTC (rev 1673) @@ -6,6 +6,7 @@ _build TossServer *.native +*.byte *Profile.log gmon.out *~ Copied: trunk/Toss/Client/GameSelection.ml (from rev 1672, trunk/Toss/Server/GameSelection.ml) =================================================================== --- trunk/Toss/Client/GameSelection.ml (rev 0) +++ trunk/Toss/Client/GameSelection.ml 2012-02-11 22:16:36 UTC (rev 1673) @@ -0,0 +1,1065 @@ +(* In-source definitions of several games, loading games from strings. *) + +type game_state_data = { + heuristic : Formula.real_expr array array; (** heuristic *) + game_state : (Arena.game * Arena.game_state); (** game and state *) + playclock : int; (** playclock *) + game_str : string; (** game representation *) +} + +let compute_heuristic advr (game, state) = + let pat_arr = Array.of_list game.Arena.patterns in + let pl_heur l = + let len = List.length l.Arena.heur in + if len = 0 || len > Array.length pat_arr then raise Not_found else + let add_pat (i, h) pw = + let pat = Formula.Times (Formula.Const pw, pat_arr.(i)) in + (i+1, Formula.Plus (pat, h)) in + snd (List.fold_left add_pat (0, Formula.Const 0.) l.Arena.heur) in + try + let res = Array.map (fun a-> Array.map pl_heur a) game.Arena.graph in + res + with Not_found -> + Heuristic.default_heuristic ~struc:state.Arena.struc ?advr game + +let compile_game_data game_name game_str = + let (game, game_state as game_with_state) = + ArenaParser.parse_game_state Lexer.lex (Lexing.from_string game_str) in + let adv_ratio = + try Some (float_of_string (List.assoc "adv_ratio" game.Arena.data)) + with Not_found -> None in + let heuristic = compute_heuristic adv_ratio game_with_state in + game_name, + {heuristic = heuristic; + game_state = game_with_state; + playclock = 30; (* game clock from where? *) + game_str = game_str; + } + + +let chess_str = (" +PLAYERS 1, 2 +DATA depth: 0, adv_ratio: 1 +SET Sum (x | wP(x) : 1) +SET Sum (x | wR(x) : 1) +SET Sum (x | wN(x) : 1) +SET Sum (x | wB(x) : 1) +SET Sum (x | wQ(x) : 1) +SET Sum (x | bP(x) : 1) +SET Sum (x | bR(x) : 1) +SET Sum (x | bN(x) : 1) +SET Sum (x | bB(x) : 1) +SET Sum (x | bQ(x) : 1) +SET Sum (x | wBeats(x) : 1 + :(b(x)) + 3 * :(bK(x))) +SET Sum (x | bBeats(x) : 1 + :(w(x)) + 3 * :(wK(x))) +REL w(x) = wP(x) or wR(x) or wN(x) or wB(x) or wQ(x) or wK(x) +REL b(x) = bP(x) or bR(x) or bN(x) or bB(x) or bQ(x) or bK(x) +REL DoubleC(x, y) = ex z ((C(x, z) and C(z, y)) or (C(y, z) and C(z, x))) +REL DoubleR(x, y) = ex z ((R(x, z) and R(z, y)) or (R(y, z) and R(z, x))) +REL KnightRCC(x, y) = ex z ((R(x, z) or R(z, x)) and DoubleC(z, y)) +REL KnightCRR(x, y) = ex z ((C(x, z) or C(z, x)) and DoubleR(z, y)) +REL Knight(x, y) = KnightRCC(x, y) or KnightCRR(x, y) +REL FreeD1 (x, y) = tc x, y (D1 (x, y) and not w(y) and not b(y)) +REL FreeD2 (x, y) = tc x, y (D2 (x, y) and not w(y) and not b(y)) +REL Diag1 (x, y) = ex z (FreeD1 (x, z) and (z = y or D1 (z, y))) +REL Diag2 (x, y) = ex z (FreeD2 (x, z) and (z = y or D2 (z, y))) +REL Diag (x, y) = Diag1 (x, y) or Diag2 (x, y) +REL FreeC (x, y) = tc x, y ((C(x, y) or C(y, x)) and not w(y) and not b(y)) +REL FreeR (x, y) = tc x, y ((R(x, y) or R(y, x)) and not w(y) and not b(y)) +REL Col (x, y) = ex z (FreeC (x, z) and (z = y or (C(z, y) or C(y, z)))) +REL Row (x, y) = ex z (FreeR (x, z) and (z = y or (R(z, y) or R(y, z)))) +REL Line (x, y) = Col (x, y) or Row (x, y) +REL Near (x, y) = C(x,y) or C(y,x) or R(x,y) or R(y,x) or D1(x, y) or D2(x, y) +REL wPBeats (x) = ex y (wP(y) and ex z ((R(y, z) or R(z, y)) and C(z, x))) +REL bPBeats (x) = ex y (bP(y) and ex z ((R(y, z) or R(z, y)) and C(x, z))) +REL wDiagBeats (x) = ex y ((wQ(y) or wB(y)) and Diag(y, x)) +REL bDiagBeats (x) = ex y ((bQ(y) or bB(y)) and Diag(y, x)) +REL wLineBeats (x) = ex y ((wQ(y) or wR(y)) and Line(y, x)) +REL bLineBeats (x) = ex y ((bQ(y) or bR(y)) and Line(y, x)) +REL wFigBeats(x) = wDiagBeats(x) or wLineBeats(x) or ex y(wN(y) and Knight(y,x)) +REL bFigBeats(x) = bDiagBeats(x) or bLineBeats(x) or ex y(bN(y) and Knight(y,x)) +REL wBeats(x) = wFigBeats(x) or wPBeats(x) or ex y (wK(y) and Near(y, x)) +REL bBeats(x) = bFigBeats(x) or bPBeats(x) or ex y (bK(y) and Near(y, x)) +REL CheckW() = ex x (wK(x) and bBeats(x)) +REL CheckB() = ex x (bK(x) and wBeats(x)) +RULE WhitePawnMove: + [ | | ] \" + ... + ... + + wP +\" -> [ | | ] \" + ... + wP + + . +\" emb w, b pre not IsEight(a2) post not CheckW() +RULE BlackPawnMove: + [ | | ] \" + ... + bP. + + . +\" -> [ | | ] \" + ... + ... + + bP +\" emb w, b pre not IsFirst(a1) post not CheckB() +RULE WhitePawnMoveDbl: + [ | | ] \" + + . + ... + ... + + wP +\" -> [ | | ] \" + ... + wP + + . + ... + ... +\" emb w, b pre IsSecond(a1) post not CheckW() +RULE BlackPawnMoveDbl: + [ | | ] \" + ... + bP. + + . + ... + ... +\" -> [ | | ] \" + + + ... + ... + + bP +\" emb w, b pre IsSeventh(a3) post not CheckB() +RULE WhitePawnBeat: + [ a, b | wP { a }; b { b } | - ] + -> + [ a, b | wP { b } | - ] + emb w, b + pre not IsEight(b) and ex z (C(a, z) and (R(z, b) or R(b, z))) + post not CheckW() +RULE WhitePawnBeatPromote: + [ a, b | wP { a }; b { b } | - ] + -> + [ a, b | wQ { b } | - ] + emb w, b + pre IsEight(b) and ex z (C(a, z) and (R(z, b) or R(b, z))) + post not CheckW() +RULE WhitePawnBeatRDbl: + [ | | ] \" + ... + ?..-bP + ... + ? ... + ... + wP.bP +\" -> [ | | ] \" + ... + ?... + ... + ? wP. + ... + .... +\" emb w, b post not CheckW() +RULE WhitePawnBeatLDbl: + [ | | ] \" + ... + -bP? + ... + . ?.. + ... + bP.wP +\" -> [ | | ] \" + ... + ...? + ... + wP ?.. + ... + .... +\" emb w, b post not CheckW() +RULE BlackPawnBeat: + [ a, b | bP { a }; w { b } | - ] + -> + [ a, b | bP { b } | - ] + emb w, b + pre not IsFirst(b) and ex z (C(z, a) and (R(z, b) or R(b, z))) + post not CheckB() +RULE BlackPawnBeatPromote: + [ a, b | bP { a }; w { b } | - ] + -> + [ a, b | bQ { b } | - ] + emb w, b + pre IsFirst(b) and ex z (C(z, a) and (R(z, b) or R(b, z))) + post not CheckB() +RULE BlackPawnBeatRDbl: + [ | | ] \" + ... + bP.wP + ... + ? ... + ... + ?..-wP +\" -> [ | | ] \" + ... + .... + ... + ? bP. + ... + ?... +\" emb w, b post not CheckB() +RULE BlackPawnBeatLDbl: + [ | | ] \" + ... + wP.bP + ... + . ?.. + ... + -wP? +\" -> [ | | ] \" + ... + .... + ... + bP ?.. + ... + ...? +\" emb w, b post not CheckB() +RULE WhitePawnPromote: + [ | | ] \" + ... + ... + + wP +\" -> [ | | ] \" + ... + wQ. + + . +\" emb w, b pre IsEight(a2) post not CheckW() +RULE BlackPawnPromote: + [ | | ] \" + ... + bP. + + . +\" -> [ | | ] \" + ... + ... + + bQ +\" emb w, b pre IsFirst(a1) post not CheckB() +RULE WhiteKnight: + [ a, b | wN { a }; _opt_b { b } | - ] + -> + [ a, b | wN { b } | - ] + emb w, b pre Knight(a, b) post not CheckW() +RULE BlackKnight: + [ a, b | bN { a }; _opt_w { b } | - ] + -> + [ a, b | bN { b } | - ] + emb w, b pre Knight(a, b) post not CheckB() +RULE WhiteBishop: + [ a, b | wB { a }; _opt_b { b } | - ] + -> + [ a, b | wB { b } | - ] + emb w, b pre Diag(a, b) post not CheckW() +RULE BlackBishop: + [ a, b | bB { a }; _opt_w { b } | - ] + -> + [ a, b | bB { b } | - ] + emb w, b pre Diag(a, b) post not CheckB() +RULE WhiteRook: + [ a, b | wR { a }; _opt_b { b } | - ] + -> + [ a, b | wR { b } | - ] + emb w, b pre not IsA1(a) and not IsH1(a) and Line(a, b) post not CheckW() +RULE WhiteRookA1: + [ a, b | wR { a }; _opt_b { b } | - ] + -> + [ a, b | wR { b } | - ] + emb w, b pre IsA1(a) and Line(a, b) post not CheckW() +RULE WhiteRookH1: + [ a, b | wR { a }; _opt_b { b } | - ] + -> + [ a, b | wR { b } | - ] + emb w, b pre IsH1(a) and Line(a, b) post not CheckW() +RULE BlackRook: + [ a, b | bR { a }; _opt_w { b } | - ] + -> + [ a, b | bR { b } | - ] + emb w, b pre not IsA8(a) and not IsH8(a) and Line(a, b) post not CheckB() +RULE BlackRookA8: + [ a, b | bR { a }; _opt_w { b } | - ] + -> + [ a, b | bR { b } | - ] + emb w, b pre IsA8(a) and Line(a, b) post not CheckB() +RULE BlackRookH8: + [ a, b | bR { a }; _opt_w { b } | - ] + -> + [ a, b | bR { b } | - ] + emb w, b pre IsH8(a) and Line(a, b) post not CheckB() +RULE WhiteQueen: + [ a, b | wQ { a }; _opt_b { b } | - ] + -> + [ a, b | wQ { b } | - ] + emb w, b pre (Line(a, b) or Diag(a, b)) post not CheckW() +RULE BlackQueen: + [ a, b | bQ { a }; _opt_w { b } | - ] + -> + [ a, b | bQ { b } | - ] + emb w, b pre (Line(a, b) or Diag(a, b)) post not CheckB() +RULE WhiteKing: + [ a, b | wK { a }; _opt_b { b } | - ] + -> + [ a, b | wK { b } | - ] + emb w, b pre Near(a, b) post not CheckW() +RULE BlackKing: + [ a, b | bK { a }; _opt_w { b } | - ] + -> + [ a, b | bK { b } | - ] + emb w, b pre Near(a, b) post not CheckB() +RULE WhiteLeftCastle: + [ | | ] \" + ... ... ... + wR. ... wK. +\" -> [ | | ] \" + ... ... ... + ... wK.wR ... +\" emb w,b pre not(bBeats(c1) or bBeats(d1) or bBeats(e1)) and before + not WhiteRookA1, not WhiteKing, not WhiteLeftCastle, not WhiteRightCastle +RULE WhiteRightCastle: + [ | | ] \" + ... ... + wK. ...wR +\" -> [ | | ] \" + ... ... + ...wR wK. +\" emb w,b pre not (bBeats(a1) or bBeats(b1) or bBeats(c1)) and before + not WhiteRookH1, not WhiteKing, not WhiteLeftCastle, not WhiteRightCastle +RULE BlackLeftCastle: + [ | | ] \" + ... ... ... + bR. ... bK. +\" -> [ | | ] \" + ... ... ... + ... bK.bR ... +\" emb w,b pre not(wBeats(c1) or wBeats(d1) or wBeats(e1)) and before + not BlackRookA8, not BlackKing, not BlackLeftCastle, not BlackRightCastle +RULE BlackRightCastle: + [ | | ] \" + ... ... + bK. ...bR +\" -> [ | | ] \" + ... ... + ...bR bK. +\" emb w,b pre not (wBeats(a1) or wBeats(b1) or wBeats(c1)) and before + not BlackRookH8, not BlackKing, not BlackLeftCastle, not BlackRightCastle +LOC 0 { + PLAYER 1 { + COND 1; 5; 3; 3; 9; -1; -5; -3; -3; -9; 0.05; -0.05 + PAYOFF :(CheckB()) - :(CheckW()) + MOVES + [WhitePawnMove -> 1]; + [WhitePawnMoveDbl -> 1]; + [WhitePawnBeat -> 1]; + [WhitePawnBeatPromote -> 1]; + [WhitePawnBeatLDbl -> 1]; + [WhitePawnBeatRDbl -> 1]; + [WhitePawnPromote -> 1]; + [WhiteKnight -> 1]; + [WhiteBishop -> 1]; + [WhiteRook -> 1]; + [WhiteRookA1 -> 1]; + [WhiteRookH1 -> 1]; + [WhiteQueen -> 1]; + [WhiteLeftCastle -> 1]; + [WhiteRightCastle -> 1]; + [WhiteKing -> 1] + } + PLAYER 2 { + COND -1; -5; -3; -3; -9; 1; 5; 3; 3; 9; -0.05; 0.05 + PAYOFF :(CheckW()) - :(CheckB()) + } +} +LOC 1 { + PLAYER 2 { + COND -1; -5; -3; -3; -9; 1; 5; 3; 3; 9; -0.05; 0.05 + PAYOFF :(CheckW()) - :(CheckB()) + MOVES + [BlackPawnMove -> 0]; + [BlackPawnMoveDbl -> 0]; + [BlackPawnBeat -> 0]; + [BlackPawnBeatPromote -> 0]; + [BlackPawnBeatLDbl -> 0]; + [BlackPawnBeatRDbl -> 0]; + [BlackPawnPromote -> 0]; + [BlackKnight -> 0]; + [BlackBishop -> 0]; + [BlackRook -> 0]; + [BlackRookA8 -> 0]; + [BlackRookH8 -> 0]; + [BlackQueen -> 0]; + [BlackLeftCastle -> 0]; + [BlackRightCastle -> 0]; + [BlackKing -> 0] + } + PLAYER 1 { + COND 1; 5; 3; 3; 9; -1; -5; -3; -3; -9; 0.05; -0.05 + PAYOFF :(CheckB()) - :(CheckW()) + } +} +MODEL [ | | ] \" + ... ... ... ... + bR bN.bB bQ.bK bB.bN bR. + ... ... ... ... + bP.bP bP.bP bP.bP bP.bP + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + wP wP.wP wP.wP wP.wP wP. + ... ... ... ... + wR.wN wB.wQ wK.wB wN.wR +\" with +D1(x, y) = ex z ( (R(x, z) and C(z, y)) or (R(y, z) and C(z, x)) ) ; +D2(x, y) = ex z ( (R(x, z) and C(y, z)) or (R(y, z) and C(x, z)) ) ; +IsFirst(x) = not ex z C(z, x) ; +IsSecond(x) = ex y (C(y, x) and IsFirst(y)) ; +IsEight(x) = not ex z C(x, z) ; +IsSeventh(x) = ex y (C(x, y) and IsEight(y)) ; +IsA1(x) = not ex z R(z, x) and IsFirst(x) ; +IsH1(x) = not ex z R(x, z) and IsFirst(x) ; +IsA8(x) = not ex z R(z, x) and IsEight(x) ; +IsH8(x) = not ex z R(x, z) and IsEight(x) +") + +let connect4_str = ("PLAYERS 1, 2 +DATA r1: circle, r2: line, adv_ratio: 4, depth: 6 +REL Row4 (x, y, z, v) = R(x, y) and R(y, z) and R(z, v) +REL Col4 (x, y, z, v) = C(x, y) and C(y, z) and C(z, v) +REL DiagA4 (x, y, z, v) = DiagA(x, y) and DiagA(y, z) and DiagA(z, v) +REL DiagB4 (x, y, z, v) = DiagB(x, y) and DiagB(y, z) and DiagB(z, v) +REL Conn4 (x, y, z, v) = + Row4(x,y,z,v) or Col4(x,y,z,v) or DiagA4(x,y,z,v) or DiagB4(x,y,z,v) +REL WinQ() = + ex x,y,z,v (Q(x) and Q(y) and Q(z) and Q(v) and Conn4(x, y, z, v)) +REL WinP() = + ex x,y,z,v (P(x) and P(y) and P(z) and P(v) and Conn4(x, y, z, v)) +REL EmptyUnder (x) = ex y (C(y, x) and not P(y) and not Q(y)) +RULE Cross: + [a | P:1 {} | - ] -> [a | P (a) | - ] emb Q, P + pre not EmptyUnder (a) and not WinQ() +RULE Circle: + [a | Q:1 {} | - ] -> [a | Q (a) | - ] emb Q, P + pre not EmptyUnder (a) and not WinP() +LOC 0 { + PLAYER 1 { + PAYOFF :(WinP()) - :(WinQ()) + MOVES [Cross -> 1] + } + PLAYER 2 { + PAYOFF :(WinQ()) - :(WinP()) + } +} +LOC 1 { + PLAYER 1 { + PAYOFF :(WinP()) - :(WinQ()) + } + PLAYER 2 { + PAYOFF :(WinQ()) - :(WinP()) + MOVES [Circle -> 0] + } +} +MODEL [ | P:1 {}; Q:1 {} | ] \" + ... ... ... + ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... + ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... + ... ... ... + ... ... ... ... + ... ... ... ... +\" with DiagA (x, y) = ex u (R(x, u) and C(u, y)) ; + DiagB (x, y) = ex u (R(x, u) and C(y, u)) +") + +let pawn_whopping_str = (" +PLAYERS 1, 2 +DATA depth: 4, adv_ratio: 2 +REL DiagW (x, y) = ex z (C(x, z) and (R(y, z) or R(z, y))) +REL DiagB (x, y) = ex z (C(z, x) and (R(y, z) or R(z, y))) +REL IsFirst(x) = not ex z C(z, x) +REL IsSecond(x) = ex y (C(y, x) and IsFirst(y)) +REL IsEight(x) = not ex z C(x, z) +REL IsSeventh(x) = ex y (C(x, y) and IsEight(y)) +REL WhiteEnds() = (ex x (wP(x) and not ex y C(x, y))) or (not ex z bP(z)) +REL BlackEnds() = (ex x (bP(x) and not ex y C(y, x))) or (not ex z wP(z)) +RULE WhiteBeat: + [ a, b | wP { a }; bP { b } | - ] -> [ a, b | wP { b } | - ] emb wP, bP + pre DiagW(a, b) and not BlackEnds() +RULE WhiteMove: + [ | bP:1 {}; R:2 {} | ] \" + + . + + wP +\" -> [ | bP:1 {}; R:2 {} | ] \" + + wP + + . +\" emb wP, bP pre not BlackEnds() +RULE WhiteMoveTwo: + [ | bP:1 {}; R:2 {} | ] \" + + . + + . + + wP +\" -> [ | bP:1 {}; R:2 {} | ] \" + + wP + + . + + . +\" emb wP, bP pre IsSecond(a1) and not BlackEnds() +RULE WhiteRightPassant: + [ | | ] \" + ... + ?..-bP + ... + ? ... + ... + wP.bP +\" -> [ | | ] \" + ... + ?... + ... + ? wP. + ... + .... +\" emb wP, bP pre not BlackEnds() +RULE WhiteLeftPassant: + [ | | ] \" + ... + -bP? + ... + . ?.. + ... + bP.wP +\" -> [ | | ] \" + ... + ...? + ... + wP ?.. + ... + .... +\" emb wP, bP pre not BlackEnds() +RULE BlackBeat: + [ a, b | bP { a }; wP { b } | - ] -> [ a, b | bP { b } | - ] emb wP, bP + pre DiagB(a, b) and not WhiteEnds() +RULE BlackMove: + [ | R:2 {}; wP:1 {} | ] \" + + bP + + . +\" -> [ | R:2 {}; wP:1 {} | ] \" + + . + + bP +\" emb wP, bP pre not WhiteEnds() +RULE BlackMoveTwo: + [ | R:2 {}; wP:1 {} | ] \" + + bP + + . + + . +\" -> [ | R:2 {}; wP:1 {} | ] \" + + . + + . + + bP +\" emb wP, bP pre IsSeventh(a3) and not WhiteEnds() +RULE BlackRightPassant: + [ | | ] \" + ... + bP.wP + ... + ? ... + ... + ?..-wP +\" -> [ | | ] \" + ... + .... + ... + ? bP. + ... + ?... +\" emb wP, bP pre not WhiteEnds() +RULE BlackLeftPassant: + [ | | ] \" + ... + wP.bP + ... + . ?.. + ... + -wP? +\" -> [ | | ] \" + ... + .... + ... + bP ?.. + ... + ...? +\" emb wP, bP pre not WhiteEnds() +LOC 0 { + PLAYER 1 { + PAYOFF :(WhiteEnds()) - :(BlackEnds()) + MOVES + [WhiteBeat -> 1]; [WhiteMove -> 1]; [WhiteMoveTwo -> 1]; + [WhiteRightPassant -> 1]; [WhiteLeftPassant -> 1] + } + PLAYER 2 { PAYOFF :(BlackEnds()) - :(WhiteEnds()) } +} +LOC 1 { + PLAYER 1 { PAYOFF :(WhiteEnds()) - :(BlackEnds()) } + PLAYER 2 { + PAYOFF :(BlackEnds()) - :(WhiteEnds()) + MOVES + [BlackBeat -> 0]; [BlackMove -> 0]; [BlackMoveTwo -> 0]; + [BlackRightPassant -> 0]; [BlackLeftPassant -> 0] + } +} +MODEL [ | | ] \" + ... ... ... ... + ... ... ... ... + ... ... ... ... + bP.bP bP.bP bP.bP bP.bP + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + wP wP.wP wP.wP wP.wP wP. + ... ... ... ... + ... ... ... ... +\" +") + +let breakthrough_str = (" +PLAYERS 1, 2 +DATA depth: 2, adv_ratio: 2 +REL DiagW (x, y) = ex z (C(x, z) and (R(y, z) or R(z, y))) +REL DiagB (x, y) = ex z (C(z, x) and (R(y, z) or R(z, y))) +RULE WhiteDiag: + [ a, b | W { a }; _opt_B { b } | - ] + -> + [ a, b | W { b } | - ] + emb W, B pre DiagW(a, b) and not ex x (B(x) and not ex y C(y, x)) +RULE WhiteStraight: + [ | B:1 {}; R:2 {} | ] \" + + . + + W +\" -> [ | B:1 {}; R:2 {} | + ] \" + + W + + . +\" emb W, B pre not ex x (B(x) and not ex y C(y, x)) +RULE BlackDiag: + [ a, b | B { a }; _opt_W { b } | - ] + -> + [ a, b | B { b } | - ] + emb W, B pre DiagB(a, b) and not ex x (W(x) and not ex y C(x, y)) +RULE BlackStraight: + [ | R:2 {}; W:1 {} | ] \" + + B + + . +\" -> [ | R:2 {}; W:1 {} | + ] \" + + . + + B +\" emb W, B pre not ex x (W(x) and not ex y C(x, y)) +LOC 0 { + PLAYER 1 { + PAYOFF + :(ex x (W(x) and not ex y C(x, y))) - :(ex x (B(x) and not ex y C(y, x))) + MOVES + [WhiteDiag -> 1]; [WhiteStraight -> 1] + } + PLAYER 2 { + PAYOFF + :(ex x (B(x) and not ex y C(y, x))) - :(ex x (W(x) and not ex y C(x, y))) + } +} +LOC 1 { + PLAYER 1 { + PAYOFF + :(ex x (W(x) and not ex y C(x, y))) - :(ex x (B(x) and not ex y C(y, x))) + } + PLAYER 2 { + PAYOFF + :(ex x (B(x) and not ex y C(y, x))) - :(ex x (W(x) and not ex y C(x, y))) + MOVES + [BlackDiag -> 0]; [BlackStraight -> 0] + } +} +MODEL [ | | ] \" + ... ... ... ... + B B..B B..B B..B B.. + ... ... ... ... + B..B B..B B..B B..B + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + W W..W W..W W..W W.. + ... ... ... ... + W..W W..W W..W W..W +\" +") + + +let checkers_str = (" +PLAYERS 1, 2 +DATA depth: 4, adv_ratio: 2 +REL w(x) = W(x) or Wq(x) +REL b(x) = B(x) or Bq(x) +REL AnyDiag (x, y) = + DiagWa (x, y) or DiagWb (x, y) or DiagBa (x, y) or DiagBb (x, y) +REL Diag2 (x, y, z) = DiagW2 (x, y, z) or DiagB2 (x, y, z) +REL BeatsW (x, y) = ex z (b(z) and not b(y) and not w(y) and DiagW2 (x, z, y)) +REL BeatsWX (x, y) = ex z (b(z) and not b(y) and not w(y) and Diag2 (x, z, y)) +REL BeatsB (x, y) = ex z (w(z) and not b(y) and not w(y) and DiagB2 (x, z, y)) +REL BeatsBX (x, y) = ex z (w(z) and not b(y) and not w(y) and Diag2 (x, z, y)) +REL BJumps() = ex x, y ((B(x) and BeatsB (x, y)) or (Bq(x) and BeatsBX (x, y))) +REL WJumps() = ex x, y ((W(x) and BeatsW (x, y)) or (Wq(x) and BeatsWX (x, y))) +RULE RedMove: + [ a, b | W { a } | - ] -> [ a, b | W { b } | - ] emb w, b + pre (not IsEight(b)) and (DiagWa(a, b) or DiagWb(a, b)) and not WJumps() +RULE WhiteMove: + [ a, b | B { a } | - ] -> [ a, b | B { b } | - ] emb w, b + pre (not IsFirst(b)) and (DiagBa(a, b) or DiagBb(a, b)) and not BJumps() +RULE RedPromote: + [ a, b | W { a } | - ] -> [ a, b | Wq { b } | - ] emb w, b + pre (IsEight(b)) and (DiagWa(a, b) or DiagWb(a, b)) and not WJumps() +RULE WhitePromote: + [ a, b | B { a } | - ] -> [ a, b | Bq { b } | - ] emb w, b + pre (IsFirst(b)) and (DiagBa(a, b) or DiagBb(a, b)) and not BJumps() +RULE RedQMove: + [ a, b | Wq { a } | - ] -> [ a, b | Wq { b } | - ] emb w, b + pre AnyDiag (a, b) and not WJumps() +RULE WhiteQMove: + [ a, b | Bq { a } | - ] -> [ a, b | Bq { b } | - ] emb w, b + pre AnyDiag (a, b) and not BJumps() +RULE RedBeat: + [ a, b, c | W { a }; b { b } | - ] -> [ a, b, c | W { c } | - ] emb w, b + pre DiagW2 (a, b, c) and not IsEight(c) + post not ex x, y (_new_W(x) and BeatsWX (x, y)) +RULE WhiteBeat: + [ a, b, c | B { a }; w { b } | - ] -> [ a, b, c | B { c } | - ] emb w, b + pre DiagB2 (a, b, c) and not IsFirst(c) + post not ex x, y (_new_B(x) and BeatsBX (x, y)) +RULE RedBeatBoth: + [ a, b, c | W { a }; b { b } | - ] -> [ a, b, c | W { c } | - ] emb w, b + pre _new_W(a) and Diag2 (a, b, c) and not IsEight(c) + post not ex x, y (_new_W(x) and BeatsWX (x, y)) +RULE WhiteBeatBoth: + [ a, b, c | B { a }; w { b } | - ] -> [ a, b, c | B { c } | - ] emb w, b + pre _new_B(a) and Diag2 (a, b, c) and not IsFirst(c) + post not ex x, y (_new_B(x) and BeatsBX (x, y)) +RULE RedBeatPromote: + [ a, b, c | W { a }; b { b } | - ] -> [ a, b, c | Wq { c } | - ] emb w, b + pre DiagW2 (a, b, c) and IsEight(c) +RULE WhiteBeatPromote: + [ a, b, c | B { a }; w { b } | - ] -> [ a, b, c | Bq { c } | - ] emb w, b + pre DiagB2 (a, b, c) and IsFirst(c) +RULE RedBeatCont: + [ a, b, c | W { a }; b { b } | - ] -> [ a, b, c | W { c } | - ] emb w, b + pre DiagW2 (a, b, c) and not IsEight(c) + post ex x, y (_new_W(x) and BeatsWX (x, y)) +RULE WhiteBeatCont: + [ a, b, c | B { a }; w { b } | - ] -> [ a, b, c | B { c } | - ] emb w, b + pre DiagB2 (a, b, c) and not IsFirst(c) + post ex x, y (_new_B(x) and BeatsBX (x, y)) +RULE RedBeatBothCont: + [ a, b, c | W { a }; b { b } | - ] -> [ a, b, c | W { c } | - ] emb w, b + pre _new_W(a) and Diag2 (a, b, c) and not IsEight(c) + post ex x, y (_new_W(x) and BeatsWX (x, y)) +RULE WhiteBeatBothCont: + [ a, b, c | B { a }; w { b } | - ] -> [ a, b, c | B { c } | - ] emb w, b + pre _new_B(a) and Diag2 (a, b, c) and not IsFirst(c) + post ex x, y (_new_B(x) and BeatsBX (x, y)) +RULE RedQBeat: + [ a, b, c | Wq { a }; b { b } | - ] -> [ a, b, c | Wq { c } | - ] emb w, b + pre Diag2 (a, b, c) +RULE WhiteQBeat: + [ a, b, c | Bq { a }; w { b } | - ] -> [ a, b, c | Bq { c } | - ] emb w, b + pre Diag2 (a, b, c) +LOC 0 { + PLAYER 1 { + PAYOFF :(ex x w(x)) - :(ex x b(x)) + MOVES + [RedMove -> 1]; [RedPromote -> 1]; [RedQMove -> 1]; + [RedBeat -> 1]; [RedBeatPromote -> 1]; [RedQBeat -> 1]; + [RedBeatCont -> 2] + } + PLAYER 2 { + PAYOFF :(ex x b(x)) - :(ex x w(x)) + } +} +LOC 1 { + PLAYER 1 { + PAYOFF :(ex x w(x)) - :(ex x b(x)) + } + PLAYER 2 { + PAYOFF :(ex x b(x)) - :(ex x w(x)) + MOVES + [WhiteMove -> 0]; [WhitePromote -> 0]; [WhiteQMove -> 0]; + [WhiteBeat -> 0]; [WhiteBeatPromote -> 0]; [WhiteQBeat -> 0]; + [WhiteBeatCont -> 3] + } +} +LOC 2 { + PLAYER 1 { + PAYOFF :(ex x w(x)) - :(ex x b(x)) + MOVES [RedBeatBoth -> 1]; [RedBeatPromote -> 1]; [RedBeatBothCont -> 2] + } + PLAYER 2 { + PAYOFF :(ex x b(x)) - :(ex x w(x)) + } +} +LOC 3 { + PLAYER 1 { + PAYOFF :(ex x w(x)) - :(ex x b(x)) + } + PLAYER 2 { + PAYOFF :(ex x b(x)) - :(ex x w(x)) + MOVES + [WhiteBeatBoth -> 0]; [WhiteBeatPromote -> 0]; [WhiteBeatBothCont -> 3] + } +} +MODEL [ | Wq:1 { }; Bq:1 { } | + ] \" + ... ... ... ... + B.. B.. B.. B.. + ... ... ... ... + B.. B.. B.. B.. + ... ... ... ... + B.. B.. B.. B.. + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + W.. W.. W.. W.. + ... ... ... ... + W.. W.. W.. W.. + ... ... ... ... + W.. W.. W.. W.. +\" with +IsFirst(x) = not ex z C(z, x) ; +IsEight(x) = not ex z C(x, z) ; +DiagWa (x, y) = ex z (C(x, z) and R(y, z)) ; +DiagBa (x, y) = ex z (C(z, x) and R(z, y)) ; +DiagWb (x, y) = ex z (C(x, z) and R(z, y)) ; +DiagBb (x, y) = ex z (C(z, x) and R(y, z)) ; +DiagW2 (x, y, z) = + (DiagWa (x, y) and DiagWa (y, z)) or (DiagWb (x, y) and DiagWb (y, z)) ; +DiagB2 (x, y, z) = + (DiagBa (x, y) and DiagBa (y, z)) or (DiagBb (x, y) and DiagBb (y, z)) +") + +let gomoku_str = (" +PLAYERS 1, 2 +DATA rCircle: circle, rCross: line, adv_ratio: 5, depth: 2 +REL Row5 (x, y, z, v, w) = R(x, y) and R(y, z) and R(z, v) and R(v, w) +REL Col5 (x, y, z, v, w) = C(x, y) and C(y, z) and C(z, v) and C(v, w) +REL DiagA5 (x, y, z, v, w) = + DiagA(x, y) and DiagA(y, z) and DiagA(z, v) and DiagA(v, w) +REL DiagB5 (x, y, z, v, w) = + DiagB(x, y) and DiagB(y, z) and DiagB(z, v) and DiagB(v, w) +REL Conn5 (x, y, z, v, w) = + Row5(x,y,z,v,w) or Col5(x,y,z,v,w) or DiagA5(x,y,z,v,w) or DiagB5(x,y,z,v,w) +REL WinQ() = + ex x,y,z,v,w (Q(x) and Q(y) and Q(z) and Q(v) and Q(w) and Conn5(x,y,z,v,w)) +REL WinP() = + ex x,y,z,v,w (P(x) and P(y) and P(z) and P(v) and P(w) and Conn5(x,y,z,v,w)) +RULE Cross: + [a1 | P:1 {}; Q:1 {} | - ] + -> + [a1 | P (a1); Q:1 {} | - ] + emb Q, P pre not WinQ() +RULE Circle: + [a1 | P:1 {}; Q:1 {} | - ] + -> + [a1 | P:1 {}; Q (a1) | - ] + emb Q, P pre not WinP() +LOC 0 { + PLAYER 1 { + PAYOFF :(WinP()) - :(WinQ()) + MOVES [Cross -> 1] + } + PLAYER 2 { PAYOFF :(WinQ()) - :(WinP()) } +} +LOC 1 { + PLAYER 1 { PAYOFF :(WinP()) - :(WinQ()) } + PLAYER 2 { + PAYOFF :(WinQ()) - :(WinP()) + MOVES [Circle -> 0] + } +} +MODEL [ | P:1 {}; Q:1 {} | ] \" + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... + ... ... ... ... +\" with DiagA (x, y) = ex u (R(x, u) and C(u, y)); + DiagB (x, y) = ex u (R(x, u) and C(y, u)) +") + +let entanglement_str = (" +PLAYERS 1, 2 +RULE Follow: + [ a1, a2 | C { (a2) }; R { (a1) } | + vx { a1->0., a2->0. }; vy { a1->0., a2->0. }; + x { a1->-10., a2->-10. }; y { a1->-10., a2->10. } ] + -> + [ a1, a2 | C { (a1) }; R { (a1) } | + vx { a1->0., a2->0. }; vy { a1->0., a2->0. }; + x { a1->-10., a2->-10. }; y { a1->-10., a2->10. } ] +emb R, C +RULE Wait: + [ a1 | R { (a1) } | + vx { a1->0. }; vy { a1->0. }; x { a1->-10. }; y { a1->-10. } ] + -> + [ a1 | R { (a1) } | + vx { a1->0. }; vy { a1->0. }; x { a1->-10. }; y { a1->-10. } ] +emb R, C +RULE Run: + [ a1, a2 | C:1 { }; E { (a1, a2) }; R { (a1) }; _opt_C { (a1) } | + vx { a1->0., a2->0. }; vy { a1->0., a2->0. }; + x { a1->-10., a2->10. }; y { a1->-10., a2->-10. } ] + -> + [ a1, a2 | C:1 { }; E { (a1, a2) }; R { (a2) }; _opt_C { (a1) } | + vx { a1->0., a2->0. }; vy { a1->0., a2->0. }; + x { a1->-10., a2->10. }; y { a1->-10., a2->-10. } ] +emb R, C +LOC 0 { + PLAYER 1 { + PAYOFF 0. + MOVES [Follow -> 1]; [Wait -> 1] + } + PLAYER 2 { PAYOFF 0. } +} +LOC 1 { + PLAYER 1 { PAYOFF 1. } + PLAYER 2 { + PAYOFF -1. + MOVES [Run -> 0] + } + } +MODEL [ d4, a2, a1, b1, b2, e4, c2, c1, f4, d2, d1, f1, f2, g1, g2, h1, h2, e1, e2, i1, i2 | C { (d4); (e4); (f4) }; E { (a2, a1); (a2, b2); (a1, a2); (a1, b1); (b1, a1); (b1, b2); (b1, c1); (b2, a2); (b2, b1); (b2, c2); (c2, b2); (c2, c1); (c2, d2); (c1, b1); (c1, c2); (c1, d1); (d2, c2); (d2, d1); (d2, e1); (d1, c1); (d1, d2); (d1, e2); (f1, f2); (f1, g1); (f1, e1); (f2, f1); (f2, g2); (f2, e2); (g1, f1); (g1, g2); (g1, h1); (g2, f2); (g2, g1); (g2, h2); (h1, g1); (h1, h2); (h1, i1); (h2, g2); (h2, h1); (h2, i2); (e1, d2); (e1, f1); (e1, e2); (e2, d1); (e2, f2); (e2, e1); (i1, h1); (i1, i2); (i2, h2); (i2, i1) }; R { (e1) }; _opt_C:1 { } | vx { d4->0., a2->0., a1->0., b1->0., b2->0., e4->0., c2->0., c1->0., f4->0., d2->0., d1->0., f1->0., f2->0., g1->0., g2->0., h1->0., h2->0., e1->0., e2->0., i1->0., i2->0. }; vy { d4->0., a2->0., a1->0., b1->0., b2->0., e4->0., c2->0., c1->0., f4->0., d2->0., d1->0., f1->0., f2->0., g1->0., g2->0., h1->0., h2->0., e1->0., e2->0., i1->0., i2->0. }; x { d4->100., a2->-50., a1->-50., b1->0., b2->0., e4->150., c2->50., c1->50., f4->200., d2->100., d1->100., f1->200., f2->200., g1->250., g2->250., h1->300., h2->300., e1->150., e2->150., i1->350., i2->350. }; y { d4->-150., a2->-100., a1->-50., b1->-50., b2->-100., e4->0., c2->-100., c1->-50., f4->-150., d2->-100., d1->-50., f1->-100., f2->-50., g1->-100., g2->-50., h1->-100., h2->-50., e1->-100., e2->-50., i1->-100., i2->-50. } ] +") + +let tictactoe_str = (" +PLAYERS 1, 2 +DATA r1: circle, r2: line, adv_ratio: 5, depth: 3 +REL DiagA (x, y) = ex u (R(x, u) and C(u, y)) +REL DiagB (x, y) = ex u (R(x, u) and C(y, u)) +REL Row3 (x, y, z) = R(x, y) and R(y, z) +REL Col3 (x, y, z) = C(x, y) and C(y, z) +REL DiagA3 (x, y, z) = DiagA(x, y) and DiagA(y, z) +REL DiagB3 (x, y, z) = DiagB(x, y) and DiagB(y, z) +REL Conn3 (x, y, z) = + Row3(x, y, z) or Col3(x, y, z) or DiagA3(x, y, z) or DiagB3(x, y, z) +REL WinQ() = ex x, y, z (Q(x) and Q(y) and Q(z) and Conn3(x, y, z)) +REL WinP() = ex x, y, z (P(x) and P(y) and P(z) and Conn3(x, y, z)) +RULE Cross: + [a | P:1 {} | - ] -> [a | P (a) | - ] emb Q, P pre not WinQ() +RULE Circle: + [a | Q:1 {} | - ] -> [a | Q (a) | - ] emb Q, P pre not WinP() +LOC 0 { + PLAYER 1 { PAYOFF :(WinP()) - :(WinQ()) + MOVES [Cross -> 1] } + PLAYER 2 { PAYOFF :(WinQ()) - :(WinP()) } +} +LOC 1 { + PLAYER 1 { PAYOFF :(WinP()) - :(WinQ()) } + PLAYER 2 { PAYOFF :(WinQ()) - :(WinP()) + MOVES [Circle -> 0] } +} +MODEL [ | P:1 {}; Q:1 {} | ] \" + + . . . + + . . . + + . . . +\" +") + +let predef_games = + [ + "Breakthrough", breakthrough_str; + "Checkers", checkers_str; + "Chess", chess_str; + "Connect4", connect4_str; + "Entanglement", entanglement_str; + "Gomoku", gomoku_str; + "Pawn-Whopping", pawn_whopping_str; + "Tic-Tac-Toe", tictactoe_str; + ] + +let games = ref [compile_game_data "Tic-Tac-Toe" tictactoe_str] Modified: trunk/Toss/Client/JsHandler.js =================================================================== --- trunk/Toss/WebClient/JsHandler.js 2012-02-10 02:21:07 UTC (rev 1672) +++ trunk/Toss/Client/JsHandler.js 2012-02-11 22:16:36 UTC (rev 1673) @@ -237,13 +237,12 @@ } function caml_blit_string(s1, i1, s2, i2, len) { if (len === 0) return; - if (i2 === s2.last && i1 === 0 && s1.last == len) { - var s = s1.bytes; - if (s !== null) - s2.bytes += s1.bytes; - else - s2.bytes += s1.getBytes(); - s2.last += len; + if (i2 === s2.last && s2.bytes != null) { + var b = s1.bytes; + if (b == null) b = s1.toBytes (); + if (i1 > 0 || s1.last > len) b = b.slice(i1, i1 + len); + s2.bytes += b; + s2.last += b.length; return; } var a = s2.array; @@ -296,12 +295,12 @@ } } else return 1; - } else if (a instanceof Array && a[0] == (a[0]|0)) { + } else if (a instanceof Array && a[0] === (a[0]|0)) { var ta = a[0]; if (ta === 250) { a = a[1]; continue; - } else if (b instanceof Array && b[0] == (b[0]|0)) { + } else if (b instanceof Array && b[0] === (b[0]|0)) { var tb = b[0]; if (tb === 250) { b = b[1]; @@ -328,7 +327,7 @@ } else return 1; } else if (b instanceof MlString || - (b instanceof Array && b[0] == (b[0]|0))) { + (b instanceof Array && b[0] === (b[0]|0))) { return -1; } else { if (a < b) return -1; @@ -510,12 +509,41 @@ } function caml_greaterequal (x, y) { return +(caml_compare(x,y,false) >= 0); } function caml_greaterthan (x, y) { return +(caml_compare(x,y,false) > 0); } +function caml_int64_to_bytes(x) { + return [x[3] >> 8, x[3] & 0xff, x[2] >> 16, (x[2] >> 8) & 0xff, x[2] & 0xff, + x[1] >> 16, (x[1] >> 8) & 0xff, x[1] & 0xff]; +} +function caml_int64_bits_of_float (x) { + if (!isFinite(x)) { + if (isNaN(x)) return [255, 1, 0, 0xfff0]; + return (x > 0)?[255,0,0,0x7ff0]:[255,0,0,0xfff0]; + } + var sign = (x>=0)?0:0x8000; + if (sign) x = -x; + var exp = Math.floor(Math.LOG2E*Math.log(x)) + 1023; + if (exp <= 0) { + exp = 0; + x /= Math.pow(2,-1026); + } else { + x /= Math.pow(2,exp-1027); + if (x < 16) { x *= 2; exp -=1; } + if (exp == 0) { x /= 2; } + } + var k = Math.pow(2,24); + var r3 = x|0; + x = (x - r3) * k; + var r2 = x|0; + x = (x - r2) * k; + var r1 = x|0; + r3 = (r3 &0xf) | sign | exp << 4; + return [255, r1, r2, r3]; +} function caml_hash_univ_param (count, limit, obj) { var hash_accu = 0; function hash_aux (obj) { limit --; if (count < 0 || limit < 0) return; - if (obj instanceof Array && obj[0] == (obj[0]|0)) { + if (obj instanceof Array && obj[0] === (obj[0]|0)) { switch (obj[0]) { case 248: count --; @@ -542,10 +570,10 @@ for (var i = 0; i < l; i++) hash_accu = (hash_accu * 19 + b.charCodeAt(i)) | 0; } - } else if (obj == (obj|0)) { + } else if (obj === (obj|0)) { count --; hash_accu = (hash_accu * 65599 + obj) | 0; - } else if (obj == +obj) { + } else if (obj === +obj) { count--; var p = caml_int64_to_bytes (caml_int64_bits_of_float (obj)); for (var i = 7; i >= 0; i--) hash_accu = (hash_accu * 19 + p[i]) | 0; @@ -948,4 +976,4 @@ if( y.fun ) { x.fun = y.fun; return 0; } var i = y.length; while (i--) x[i] = y[i]; return 0; } @@ Diff output truncated at 100000 characters. @@ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |