Thread: [Toss-devel-svn] SF.net SVN: toss:[1366] trunk/Toss (Page 5)
Status: Beta
Brought to you by:
lukaszkaiser
|
From: <luk...@us...> - 2011-03-17 22:03:37
|
Revision: 1366
http://toss.svn.sourceforge.net/toss/?rev=1366&view=rev
Author: lukstafi
Date: 2011-03-17 22:03:28 +0000 (Thu, 17 Mar 2011)
Log Message:
-----------
FormulaOps: Generalized maps over formulas and real expressions; fixed flatten_ands. Arena: print game data; refined game comparison. GameSimpl: fixed and improved reduction of equal and complement relations (stage 1); stage 3: intersections of relations and of a relation with inverse of another (remaining: handling of superfluous EQ equivalences).
Modified Paths:
--------------
trunk/Toss/Arena/Arena.ml
trunk/Toss/Arena/Arena.mli
trunk/Toss/Arena/DiscreteRule.ml
trunk/Toss/Formula/Formula.ml
trunk/Toss/Formula/Formula.mli
trunk/Toss/Formula/FormulaOps.ml
trunk/Toss/Formula/FormulaOps.mli
trunk/Toss/GGP/GDL.ml
trunk/Toss/GGP/GDLTest.ml
trunk/Toss/GGP/GameSimpl.ml
trunk/Toss/GGP/GameSimpl.mli
trunk/Toss/GGP/GameSimplTest.ml
trunk/Toss/GGP/tests/breakthrough-raw.toss
trunk/Toss/GGP/tests/breakthrough-simpl.toss
trunk/Toss/GGP/tests/connect5-raw.toss
trunk/Toss/GGP/tests/connect5-simpl.toss
trunk/Toss/Solver/Structure.ml
trunk/Toss/Solver/Structure.mli
Modified: trunk/Toss/Arena/Arena.ml
===================================================================
--- trunk/Toss/Arena/Arena.ml 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/Arena/Arena.ml 2011-03-17 22:03:28 UTC (rev 1366)
@@ -341,6 +341,11 @@
Format.fprintf ppf "@[<1>PLAYERS@ %a@]@ "
(Aux.fprint_sep_list "," Format.pp_print_string)
(List.map fst (List.sort (fun (_,x) (_,y) -> x-y) player_names));
+ if data <> [] then
+ Format.fprintf ppf "@[<1>DATA@ %a@]@ "
+ (Aux.fprint_sep_list ","
+ (fun ppf (k,v) -> Format.fprintf ppf "@[<1>%s@,:@ %s@]" k v))
+ data;
List.iter (fun (rname, r) ->
Format.fprintf ppf "@[<1>RULE %s:@ %a@]@ " rname
ContinuousRule.fprint r) rules;
@@ -420,6 +425,12 @@
}}) game.rules},
{state with
struc = f state.struc}
+
+let map_to_discrete f game =
+ {game with
+ rules = List.map (fun (rn, r) ->
+ rn, {r with ContinuousRule.discrete =
+ f r.ContinuousRule.discrete}) game.rules}
(* Compare two (game, state) pairs and explain the first difference
met. Formulas and expressions are compared for syntactical
@@ -458,14 +469,38 @@
let pnames2 = List.sort cmp_pn g2.player_names in
if pnames1 <> pnames2 then
raise (Diff_result "Game players are given in different order.");
- let norm_loc loc =
- {loc with
- moves = List.sort Pervasives.compare loc.moves;
- payoffs = Array.map (
- FormulaOps.map_to_formulas_expr FormulaOps.flatten_formula)
- loc.payoffs} in
- if Array.map norm_loc g1.graph <> Array.map norm_loc g2.graph
- then raise (Diff_result "Games have different graphs");
+ Array.iteri (fun i loc1 ->
+ let loc2 = g2.graph.(i) in
+ let dmoves1 = Aux.list_diff loc1.moves loc2.moves in
+ if dmoves1 <> [] then raise (Diff_result (
+ let label, dest = List.hd dmoves1 in
+ Printf.sprintf
+ "At location %d, only the first game has label %s->%d"
+ i label.rule dest));
+ let dmoves2 = Aux.list_diff loc2.moves loc1.moves in
+ if dmoves2 <> [] then raise (Diff_result (
+ let label, dest = List.hd dmoves1 in
+ Printf.sprintf
+ "At location %d, only the second game has label %s->%d"
+ i label.rule dest));
+ if loc1.player <> loc2.player then raise (Diff_result (
+ Printf.sprintf
+ "At location %d, the first game has player %d, second %d"
+ i loc1.player loc2.player));
+ Array.iteri (fun p poff1 ->
+ let poff1 =
+ FormulaOps.map_to_formulas_expr FormulaOps.flatten_formula
+ poff1 in
+ let poff2 =
+ FormulaOps.map_to_formulas_expr FormulaOps.flatten_formula
+ loc2.payoffs.(p) in
+ if poff1 <> poff2 then raise (Diff_result (
+ Printf.sprintf
+ "At location %d, payffs for player %d differ:\n%s\nvs.\n%s"
+ i p (Formula.real_str poff1)
+ (Formula.real_str poff2)));
+ ) loc1.payoffs
+ ) g1.graph;
if List.sort Pervasives.compare g1.defined_rels <>
List.sort Pervasives.compare g2.defined_rels
then raise (Diff_result "Games have different defined relations");
Modified: trunk/Toss/Arena/Arena.mli
===================================================================
--- trunk/Toss/Arena/Arena.mli 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/Arena/Arena.mli 2011-03-17 22:03:28 UTC (rev 1366)
@@ -116,6 +116,10 @@
(Structure.structure -> Structure.structure) -> game * game_state ->
game * game_state
+(** Map to the structure representation of discrete part of rules. *)
+val map_to_discrete :
+ (DiscreteRule.rule -> DiscreteRule.rule) -> game -> game
+
(** Compare two (game, state) pairs and explain the first difference
met. Formulas and expressions are compared for syntactical
equality. Players need to be given in the same order. Data is
Modified: trunk/Toss/Arena/DiscreteRule.ml
===================================================================
--- trunk/Toss/Arena/DiscreteRule.ml 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/Arena/DiscreteRule.ml 2011-03-17 22:03:28 UTC (rev 1366)
@@ -425,7 +425,7 @@
| None -> false
| Some sp ->
sp = "new" || sp = "del" || sp = "right" || sp = "lhs") in
- (* We name the new elements with their rule correspondents (note
+ (* We name the matched elements with their rule correspondents (note
that in the nonstruct case the LHS and RHS elements have the same
names due to renaming during rule compilation). *)
let model =
@@ -920,6 +920,17 @@
| phi -> Right phi) conjs in
let lhs_extracted = posi @ nega in
let precond = Formula.And conjs in
+ (* {{{ log entry *)
+ if !debug_level > 2 then (
+ Printf.printf
+ "translate_from_precond:\nposi=\n%s\nnega=\n%s\nprecond=\n%s\n%!"
+ (Formula.sprint (Formula.And (List.map (fun (rel,args) ->
+ Formula.Rel (rel,args)) posi)))
+ (Formula.sprint (Formula.And (List.map (fun (rel,args) ->
+ Formula.Rel (rel,args)) nega)))
+ (Formula.sprint precond)
+ );
+ (* }}} *)
let fvars = FormulaOps.free_vars precond in
let local_vars =
List.filter (fun v->
Modified: trunk/Toss/Formula/Formula.ml
===================================================================
--- trunk/Toss/Formula/Formula.ml 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/Formula/Formula.ml 2011-03-17 22:03:28 UTC (rev 1366)
@@ -106,6 +106,10 @@
;;
+let is_atom = function
+ Rel _ | Eq _ | In _ | RealExpr _ -> true
+ | _ -> false
+
(* Helper power function, used in parser. *)
let rec pow p n =
if n = 0 then Const 1. else if n = 1 then p else Times (p, pow p (n-1))
Modified: trunk/Toss/Formula/Formula.mli
===================================================================
--- trunk/Toss/Formula/Formula.mli 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/Formula/Formula.mli 2011-03-17 22:03:28 UTC (rev 1366)
@@ -70,6 +70,7 @@
val compare : formula -> formula -> int
+val is_atom : formula -> bool
(** {2 Printing Functions} *)
Modified: trunk/Toss/Formula/FormulaOps.ml
===================================================================
--- trunk/Toss/Formula/FormulaOps.ml 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/Formula/FormulaOps.ml 2011-03-17 22:03:28 UTC (rev 1366)
@@ -123,6 +123,72 @@
| Rel _ | Eq _ | In _ -> true
| _ -> false
+(* Generalized map over formula and real expression types. *)
+type formula_and_expr_map = {
+ map_Rel : string -> fo_var array -> formula;
+ map_Eq : fo_var -> fo_var -> formula;
+ map_In : fo_var -> mso_var -> formula;
+ map_RealExpr : real_expr -> sign_op -> formula;
+ map_Not : formula -> formula;
+ map_And : formula list -> formula;
+ map_Or : formula list -> formula;
+ map_Ex : var list -> formula -> formula;
+ map_All : var list -> formula -> formula;
+
+ map_RVar : string -> real_expr;
+ map_Const : float -> real_expr;
+ map_Times : real_expr -> real_expr -> real_expr;
+ map_Plus : real_expr -> real_expr -> real_expr;
+ map_Fun : string -> fo_var -> real_expr;
+ map_Char : formula -> real_expr;
+ map_Sum : fo_var list -> formula -> real_expr -> real_expr
+}
+
+let identity_map = {
+ map_Rel = (fun rel args -> Rel (rel, args));
+ map_Eq = (fun x y -> Eq (x, y));
+ map_In = (fun x ys -> In (x, ys));
+ map_RealExpr = (fun expr sign -> RealExpr (expr, sign));
+ map_Not = (fun phi -> Not phi);
+ map_And = (fun conjs -> And conjs);
+ map_Or = (fun disjs -> Or disjs);
+ map_Ex = (fun vs phi -> Ex (vs, phi));
+ map_All = (fun vs phi -> All (vs, phi));
+
+ map_RVar = (fun v -> RVar v);
+ map_Const = (fun c -> Const c);
+ map_Times = (fun expr1 expr2 -> Times (expr1, expr2));
+ map_Plus = (fun expr1 expr2 -> Plus (expr1, expr2));
+ map_Fun = (fun f v -> Fun (f, v));
+ map_Char = (fun phi -> Char phi);
+ map_Sum = (fun vs guard expr -> Sum (vs, guard, expr))
+}
+
+let rec map_formula gmap = function
+ | Rel (rel, args) -> gmap.map_Rel rel args
+ | Eq (x, y) -> gmap.map_Eq x y
+ | In (x, ys) -> gmap.map_In x ys
+ | RealExpr (expr, sign) ->
+ gmap.map_RealExpr (map_real_expr gmap expr) sign
+ | Not phi -> gmap.map_Not (map_formula gmap phi)
+ | And conjs -> gmap.map_And (List.map (map_formula gmap) conjs)
+ | Or disjs -> gmap.map_Or (List.map (map_formula gmap) disjs)
+ | Ex (vs, phi) -> gmap.map_Ex vs (map_formula gmap phi)
+ | All (vs, phi) -> gmap.map_All vs (map_formula gmap phi)
+
+and map_real_expr gmap = function
+ | RVar v -> gmap.map_RVar v
+ | Const c -> gmap.map_Const c
+ | Times (expr1, expr2) ->
+ gmap.map_Times (map_real_expr gmap expr1) (map_real_expr gmap expr2)
+ | Plus (expr1, expr2) ->
+ gmap.map_Plus (map_real_expr gmap expr1) (map_real_expr gmap expr2)
+ | Fun (f, v) -> gmap.map_Fun f v
+ | Char phi -> gmap.map_Char (map_formula gmap phi)
+ | Sum (vs, guard, expr) ->
+ gmap.map_Sum vs (map_formula gmap guard) (map_real_expr gmap expr)
+
+
(* Map [f] to all literals (i.e. atoms or not(atom)'s) in the given
formula. Preserves order of subformulas. *)
let rec map_to_literals f g = function
@@ -534,10 +600,6 @@
(* Simplify. *)
(* ------------------------------------------------------------------------- *)
-let is_atom = function
- Rel _ | Eq _ | In _ | RealExpr _ -> true
- | _ -> false
-
let str_contains c s =
try let _ = String.index s c in true with Not_found -> false
@@ -694,43 +756,37 @@
if simp_p = p && simp_q = q then Times (p, q) else
simplify_re ~do_pnf ~do_formula (Times (simp_p, simp_q))
+
(* Flatten "and"s and "or"s in a formula --
i.e. associativity. Remove double negation along the way. *)
-let rec flatten_formula phi =
- let rec flat_and = function
- | And conjs -> Aux.concat_map flat_and conjs
- | phi ->
- match flatten_formula phi with
- | And _ as phi -> flat_and phi
- | phi -> [phi] in
- let rec flat_or = function
- | Or disjs -> Aux.concat_map flat_or disjs
- | phi ->
- match flatten_formula phi with
- | Or _ as phi -> flat_or phi
- | phi -> [phi] in
- match phi with
- | Or [phi] -> flatten_formula phi
- | And [phi] -> flatten_formula phi
- | Or _ -> Or (flat_or phi)
- | And _ -> And (flat_and phi)
- | All (vs, phi) -> All (vs, flatten_formula phi)
- | Ex (vs, phi) -> Ex (vs, flatten_formula phi)
- | Not (Not phi) -> flatten_formula phi
- | Not phi -> Not (flatten_formula phi)
- | (Rel _ | Eq _ | In _ | RealExpr _) as atom -> atom
+let flatten_formula =
+ let flat_and = function And conjs -> conjs | phi -> [phi] in
+ let flat_or = function Or disjs -> disjs | phi -> [phi] in
+ map_formula {identity_map with
+ map_And = (function
+ | [conj] -> conj
+ | conjs -> And (Aux.concat_map flat_and conjs));
+ map_Or = (function
+ | [disj] -> disj
+ | disjs -> Or (Aux.concat_map flat_or disjs));
+ map_Not = (function Not phi -> phi | phi -> Not phi)}
-let rec flatten_ors = function
- | Or disjs -> Aux.concat_map flatten_ors disjs
+let rec flatten_or = function
+ | Or disjs -> Aux.concat_map flatten_or disjs
+ | Not (Not phi) | Not (And [Not phi]) | Not (Or [Not phi]) ->
+ flatten_or phi
| phi -> [phi]
(* Formula as a list of conjuncts, with one level of distributing
negation over disjunction and pushing quantifiers inside. *)
let rec flatten_ands = function
| And conjs -> Aux.concat_map flatten_ands conjs
+ | Or [phi] -> flatten_ands phi
+ | Not (And [phi]) -> flatten_ands (Not phi)
| Not (Or disjs) ->
- List.map (fun d -> Not d)
- (Aux.concat_map flatten_ors disjs)
+ Aux.concat_map flatten_ands
+ (List.map (fun d -> Not d)
+ (Aux.concat_map flatten_or disjs))
| All (vs, phi) ->
List.map (fun phi -> All (vs, phi)) (flatten_ands phi)
| Ex (vs, phi) as arg ->
@@ -742,6 +798,7 @@
let bound_phi = match bound_conjs with
| [phi] -> phi | _ -> And bound_conjs in
free_conjs @ [Ex (vs, bound_phi)])
+ | Not (Not phi) -> flatten_ands phi
| phi -> [phi]
(* Simplify the formula by removing relational literals, depending on
@@ -750,7 +807,9 @@
track of the sign (variance) of a position. (Does not descend the
real part currently.) [implies] is applied to atoms only. Repeat
the removal till fixpoint since it can "unpack" literals e.g. from
- conjunctions to disjunctions. *)
+ conjunctions to disjunctions.
+
+ TODO: traverse the real part too. *)
let remove_redundant ?(implies=(=)) phi =
let implied_by x y = implies y x in
let literal neg phis =
Modified: trunk/Toss/Formula/FormulaOps.mli
===================================================================
--- trunk/Toss/Formula/FormulaOps.mli 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/Formula/FormulaOps.mli 2011-03-17 22:03:28 UTC (rev 1366)
@@ -19,6 +19,34 @@
(** {2 Mapping to atoms and variable substitution.} *)
+(** Generalized map over formula and real expression types. *)
+type formula_and_expr_map = {
+ map_Rel : string -> fo_var array -> formula;
+ map_Eq : fo_var -> fo_var -> formula;
+ map_In : fo_var -> mso_var -> formula;
+ map_RealExpr : real_expr -> sign_op -> formula;
+ map_Not : formula -> formula;
+ map_And : formula list -> formula;
+ map_Or : formula list -> formula;
+ map_Ex : var list -> formula -> formula;
+ map_All : var list -> formula -> formula;
+
+ map_RVar : string -> real_expr;
+ map_Const : float -> real_expr;
+ map_Times : real_expr -> real_expr -> real_expr;
+ map_Plus : real_expr -> real_expr -> real_expr;
+ map_Fun : string -> fo_var -> real_expr;
+ map_Char : formula -> real_expr;
+ map_Sum : fo_var list -> formula -> real_expr -> real_expr
+}
+
+(** Identity map to be refined using the [with] clause. *)
+val identity_map : formula_and_expr_map
+
+(** Map through the structure adjusting subformulas/subexpressions. *)
+val map_formula : formula_and_expr_map -> formula -> formula
+val map_real_expr : formula_and_expr_map -> real_expr -> real_expr
+
(** Map [f] to all literals (i.e. atoms or not(atom)'s) in the given
formula. Preserves order of subformulas. *)
val map_to_literals : (formula -> formula) -> (real_expr -> real_expr) ->
Modified: trunk/Toss/GGP/GDL.ml
===================================================================
--- trunk/Toss/GGP/GDL.ml 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/GGP/GDL.ml 2011-03-17 22:03:28 UTC (rev 1366)
@@ -540,7 +540,7 @@
(** Generate all tuples for equivalences, to faciliate further
transformations of formulas in the game definition (outside of
translation). *)
-let equivalences_all_tuples = ref false (* true *)
+let equivalences_all_tuples = ref (* false *) true
open Aux.BasicOperators
Modified: trunk/Toss/GGP/GDLTest.ml
===================================================================
--- trunk/Toss/GGP/GDLTest.ml 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/GGP/GDLTest.ml 2011-03-17 22:03:28 UTC (rev 1366)
@@ -140,9 +140,9 @@
| None -> ()
let a () =
- GDL.debug_level := 4;
- GameSimpl.debug_level := 4;
- DiscreteRule.debug_level := 4;
+ (* GDL.debug_level := 4; *)
+ (* GameSimpl.debug_level := 4; *)
+ (* DiscreteRule.debug_level := 4; *)
let breakthrough = load_rules "./GGP/examples/breakthrough.gdl" in
let connect5 = load_rules "./GGP/examples/connect5.gdl" in
let tictactoe = load_rules "./GGP/examples/tictactoe.gdl" in
Modified: trunk/Toss/GGP/GameSimpl.ml
===================================================================
--- trunk/Toss/GGP/GameSimpl.ml 2011-03-17 18:58:07 UTC (rev 1365)
+++ trunk/Toss/GGP/GameSimpl.ml 2011-03-17 22:03:28 UTC (rev 1366)
@@ -5,17 +5,28 @@
The simplification of structures, associated formulas and Toss
rules is specified by transformations described below. Rules can
- be refined or new rules added to each stage.
+ be refined or new simplification rules added to each stage.
- (1) Identify relations in the structure that are not fluents nor
+ TODO: use [DiscreteRule.special_rel_of rel = Some "opt"]
+ instead of [DiscreteRule.special_rel_of rel <> None]? (To protect
+ against GDL using identifiers starting with underscore.)
+
+ (1) Reduce equivalent or complement relations.
+
+ (1a) If [introduce_complement] is on, for each (unary) predicate
+ that does not have its complement in the structure, introduce the
+ complement.
+
+ (1b) Identify relations in the structure that are not fluents nor
defined relations and that are equal to or are complements of
other relations in the structure. Select a single relation / a
predicate (called "the original" below), that is smaller than its
- complement (if the complement is in the signature), and replace
- all selected relations with it (or its negation), in all formulas
- of the definition. Remove the other relations from the structure.
+ complement (if the complement is in the signature, but see (1a)),
+ and replace all selected relations with it (or its negation), in
+ all formulas of the definition. Remove the other relations from
+ the structure.
- (1a) We need to update LHS structures of rules (for presentation
+ (1c) We need to update LHS structures of rules (for presentation
and game modification purposes, since the simple transformation
above of the "embedding formula" suffices for the "compiled" rule
representation). Replace the identified relations in the "embedded
@@ -23,9 +34,9 @@
that occur positively in the LHS and are complements of their
original. Derive all the tuples of embedded relations that are
required to be absent for a match (not present, even optionally,
- in the LHS). (1a1) Rename relations equivalent to their
- originals. (1a2) Remove the non-optional tuples for relations that
- are complements of their originals and (1a3) add tuples of
+ in the LHS). (1c1) Rename relations equivalent to their
+ originals. (1c2) Remove the non-optional tuples for relations that
+ are complements of their originals and (1c3) add tuples of
originals that are complements of relations that are required to
be absent.
@@ -35,18 +46,43 @@
that are weaker/stronger than another present over the same tuple
in the given conjunction/disjunction.
- (3) For each pair of static unary predicates with nonempty
- intersection, introduce new predicate for their conjunction. For
- each pair of static binary predicates, introduce two new
- predicates: one for their conjunction and the other for
- conjunction of one of the predicates and the inverse of the other.
+ (3) Add intersections of non-fluent relations to the structure
+ when they co-occur in formulas. For binary relations, also add
+ intersections of a relation and an inverse of another.
- (3a) Replace each conjunction of pair of unary/binary predicates
- over the same variables, with one of introduced predicates. For
- several possibilities of replacement pick one arbitrarily
- (currently, in the order of occurrence in the formula).
+ (3a) Eliminate conjoined static (non-fluents and not defined)
+ relations in formulas that are applied to the same arguments and
+ introduce a new relation for their conjunction (by intersetcting
+ their tuples).
- (4) Remove from the structure relations that are no longer used.
+ (3b) For binary static relations, collect pairs such that one
+ relation is applied to arguments in reverse order than the other
+ one, and introduce a new relation for intersection of one with the
+ inverse of the other.
+
+ (3c) Repeat till no more atoms can be glued in this way.
+
+ (3d) Since too long names would be unreadable anyway, introduce
+ fresh relation names for the glued relations and remember the
+ correspondence in game data.
+
+ (3e) The eliminated co-occurrences are relevant only for tuples
+ present in rewrite rules (LHS structures), not for absent ones
+ (since these are conjoined negations). Replace them in the LHS
+ structures as in (3a)-(3b), but only if all of replaced relations
+ occur as non-embedded (i.e. "tau_h") (since embedded relations
+ will have reuired-to-be-absent occurrences, and these cannot be
+ handled by conjoining).
+
+ TODO or warning: with the current specification (and
+ implementation), inconsistency between the structure-based
+ representation and the "embedding formula"-based representation of
+ discrete rules is possible: when the optimization replaces (in the
+ embedding formula) a conjunction of relations considered embedded.
+
+ (4) Update rewrite rule signatures to contain all introduced
+ relations. Remove from the structures relations that are no longer
+ used.
*)
open Formula
@@ -54,6 +90,7 @@
let debug_level = ref 0
+let introduce_complement = ref true
(* Collect universally quantified subformulas and compute the size of
@@ -80,12 +117,13 @@
let trunk, univs = separate_univ phi in
trunk - List.fold_left (+) 0 (List.map FormulaOps.size univs)
+module Tups = Structure.Tuples
-let simplify ?(join_rel_names=fun x _ -> x) (game, state) =
+let simplify (game, state) =
let struc = state.Arena.struc in
let signat = Structure.rel_signature struc in
let nelems = Structure.Elems.cardinal struc.Structure.elements in
- let tcard tups = Structure.Tuples.cardinal tups in
+ let tcard tups = Tups.cardinal tups in
let fluents =
Aux.unique_sorted
(Aux.concat_map (fun (_,r) ->
@@ -97,7 +135,71 @@
(String.concat ", " fluents)
);
(* }}} *)
- (* prepare for (1) and (2) *)
+ (* 1 *)
+ let add_rel rel acc =
+ match rel with
+ | Rel (rel,_) -> Aux.Strings.add rel acc
+ | _ -> acc in
+ let used_rels =
+ Arena.fold_over_formulas ~include_defined_rels:false
+ (FormulaOps.fold_over_atoms add_rel)
+ game Aux.Strings.empty in
+ let complemented = ref [] in
+ let predicate_tups =
+ Structure.Elems.fold (fun e tups -> Tups.add [|e|] tups)
+ struc.Structure.elements Tups.empty in
+ let struc = ref struc in
+ let signat = ref signat in
+ let used_rels = ref used_rels in
+ let complements =
+ List.fold_left (fun table (rel,arity) ->
+ let rel_tups =
+ Structure.StringMap.find rel !struc.Structure.relations in
+ let ntups = tcard rel_tups in
+ let crel =
+ Structure.StringMap.fold (fun rel2 rel2_tups crel ->
+ let arity2 = List.assoc rel2 !signat in
+ if crel <> None || arity2 <> arity then crel
+ else
+ let ntups2 = tcard rel2_tups in
+ if ntups >= ntups2 &&
+ ntups + ntups2 = Aux.int_pow nelems arity &&
+ not (List.mem rel2 fluents) &&
+ Tups.is_empty (Tups.inter rel_tups rel2_tups)
+ then (
+ (* {{{ log entry *)
+ if !debug_level > 3 then (
+ Printf.printf "Complements: rel=%s; crel=%s\n%!" rel rel2
+ );
+ (* }}} *)
+ Some rel2
+ ) else None
+ ) !struc.Structure.relations None in
+ let crel =
+ if not !introduce_complement || arity <> 1 ||
+ crel <> None || ntups <= nelems / 2
+ then crel
+ else
+ (* 1a *)
+ let crel =
+ Aux.not_conflicting_name ~truncate:true !used_rels "C" in
+ (* {{{ log entry *)
+ if !debug_level > 3 then (
+ Printf.printf "Complemented: crel=%s\n%!" crel
+ );
+ (* }}} *)
+ complemented := (crel, rel) :: !complemented;
+ struc := Structure.add_rels !struc crel
+ (Tups.elements (Tups.diff predicate_tups rel_tups));
+ signat := (crel, arity) :: !signat;
+ used_rels := Aux.Strings.add crel !used_rels;
+ Some crel in
+ Aux.StrMap.add rel crel table
+ ) Aux.StrMap.empty !signat in
+ let struc = !struc in
+ let signat = !signat in
+ let complements rel = Aux.StrMap.find rel complements in
+ (* prepare for (1bc) and (2) *)
let subset_table =
List.fold_left (fun table (rel,arity) ->
let rel_tups =
@@ -105,7 +207,7 @@
let row =
List.fold_left (fun row (rel2,arity2) ->
if arity2 = arity &&
- Structure.Tuples.subset rel_tups
+ Tups.subset rel_tups
(Structure.StringMap.find rel2 struc.Structure.relations)
then Aux.Strings.add rel2 row
else row
@@ -122,42 +224,22 @@
(* }}} *)
let included_in rel1 rel2 =
Aux.Strings.mem rel2 (Aux.StrMap.find rel1 subset_table) in
- let compl_table =
- List.fold_left (fun table (rel,arity) ->
- let rel_tups =
- Structure.StringMap.find rel struc.Structure.relations in
- let row =
- List.fold_left (fun row (rel2,arity2) ->
- if arity2 <> arity then row
- else
- let rel2_tups =
- Structure.StringMap.find rel2 struc.Structure.relations in
- let ntups = tcard rel_tups and ntups2 = tcard rel2_tups in
- if ntups >= ntups2 &&
- ntups + ntups2 = Aux.int_pow nelems arity &&
- Structure.Tuples.is_empty
- (Structure.Tuples.inter rel_tups rel2_tups)
- then Aux.Strings.add rel2 row
- else row
- ) Aux.Strings.empty signat in
- Aux.StrMap.add rel row table
- ) Aux.StrMap.empty signat in
- let complement rel1 rel2 =
- Aux.Strings.mem rel2 (Aux.StrMap.find rel1 compl_table) in
- (* 1 *)
+ (* 1b *)
let equivalent =
List.map (fun (rel1, arity) ->
- try
- let rel2, _ =
- List.find (fun (rel2, arity2) ->
- arity = arity2 &&
- not (List.mem rel2 fluents ||
- List.mem_assoc rel2 game.Arena.defined_rels) &&
- (complement rel1 rel2 ||
- (included_in rel1 rel2 && included_in rel2 rel1))
- ) signat in
- rel1, (rel2, complement rel1 rel2)
- with Not_found -> rel1, (rel1, false)
+ match complements rel1 with
+ | Some rel2 -> rel1, (rel2, true)
+ | None ->
+ try
+ let rel2, _ =
+ List.find (fun (rel2, arity2) ->
+ arity = arity2 &&
+ not (List.mem rel2 fluents ||
+ List.mem_assoc rel2 game.Arena.defined_rels) &&
+ included_in rel1 rel2 && included_in rel2 rel1
+ ) signat in
+ rel1, (rel2, false)
+ with Not_found -> rel1, (rel1, false)
) signat in
let removable rel =
let spec = DiscreteRule.special_rel_of rel in
@@ -165,6 +247,7 @@
match spec with
| None -> rel
| Some spec -> DiscreteRule.orig_rel_of rel in
+ rel <> "" &&
not (List.mem rel fluents) &&
not (List.mem_assoc rel game.Arena.defined_rels) &&
not (List.exists (fun (_,(rel2,_)) -> rel2=rel) equivalent) &&
@@ -195,7 +278,7 @@
(* Also have to apply to LHS structures... Don't use
{!ContinuousRule.apply_to_sides} as we don't need to
recompile. *)
- (* 1a *)
+ (* 1c *)
let map_rhs rhs = Structure.clear_rels rhs removable in
let game =
{game with
@@ -216,9 +299,9 @@
let tups =
try Structure.StringMap.find rel
lhs_struc.Structure.relations
- with Not_found -> Structure.Tuples.empty in
+ with Not_found -> Tups.empty in
if removable rel &&
- not (Structure.Tuples.is_empty tups) &&
+ not (Tups.is_empty tups) &&
snd (List.assoc rel equivalent) (* is complement *)
then (
(* {{{ log entry *)
@@ -236,10 +319,10 @@
Aux.unique_sorted (kept_emb_rels @ added_emb_rels) in
let new_emb_rels =
Aux.list_diff added_emb_rels kept_emb_rels in
- let ltups = Structure.Tuples.elements in
+ let ltups = Tups.elements in
let lhs_neg_tups =
r.ContinuousRule.compiled.DiscreteRule.lhs_neg_tups in
- (* 1a1: renaming removable relations to their originals *)
+ (* 1c1: renaming removable relations to their originals *)
let lhs_struc =
Structure.StringMap.fold (fun rel tups lhs_struc ->
let spec = DiscreteRule.special_rel_of rel in
@@ -254,13 +337,13 @@
match spec with
| None -> orig
| Some spec -> "_"^spec^"_"^orig in
- if not neg (* 1a1 *)
- || (neg && spec = Some "opt") (* not-1a2 *)
+ if not neg (* 1c1 *)
+ || (neg && spec = Some "opt") (* not-1c2 *)
then
Structure.add_rels lhs_struc...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-18 00:20:02
|
Revision: 1367
http://toss.svn.sourceforge.net/toss/?rev=1367&view=rev
Author: lukaszkaiser
Date: 2011-03-18 00:19:55 +0000 (Fri, 18 Mar 2011)
Log Message:
-----------
Release preparations and documentation fixes and additions.
Modified Paths:
--------------
trunk/Toss/Makefile
trunk/Toss/www/contact.xml
trunk/Toss/www/ideas.xml
Modified: trunk/Toss/Makefile
===================================================================
--- trunk/Toss/Makefile 2011-03-17 22:03:28 UTC (rev 1366)
+++ trunk/Toss/Makefile 2011-03-18 00:19:55 UTC (rev 1367)
@@ -6,16 +6,19 @@
TossServer: Server/Server.native
cp _build/Server/Server.native TossServer
-RELEASE=0.5
+RELEASE=0.6
Release: Client Server doc
- rm -f *~ Formula/*~ Solver/*~ Arena/*~ Play/*~ Client/*~ www/*~
+ rm -f *~ Formula/*~ Solver/*~ Arena/*~ Play/*~ GGP/*~ \
+ Language/*~ Server/*~ Client/*~ www/*~ WebClient/~
+ make -C www/reference
make -C www
mkdir ../toss_$(RELEASE)
cp -r * ../toss_$(RELEASE)
mv ../toss_$(RELEASE) .
- find toss_$(RELEASE) -name '.svn' -exec rm -rf {} \;
rm -rf toss_$(RELEASE)/Toss.docdir
- mv toss_$(RELEASE)/_build/Toss.docdir toss_$(RELEASE)/doc
+ rm -f toss_$(RELEASE)/www/code_doc
+ mv toss_$(RELEASE)/_build/Toss.docdir toss_$(RELEASE)/www/code_doc
rm -rf toss_$(RELEASE)/_build toss_$(RELEASE)/gmon.out
zip -r toss_$(RELEASE).zip toss_$(RELEASE)
rm -rf toss_$(RELEASE)
Modified: trunk/Toss/www/contact.xml
===================================================================
--- trunk/Toss/www/contact.xml 2011-03-17 22:03:28 UTC (rev 1366)
+++ trunk/Toss/www/contact.xml 2011-03-18 00:19:55 UTC (rev 1367)
@@ -39,10 +39,10 @@
</par>
</section>
<section title="Email" lang="fr">
- <par>Toss is an open source project hosted by
+ <par>Toss est un projet open source hébergé par
<a href="http://sourceforge.net">SourceForge</a>
- and distributed under the BSD licence.<br/></par>
- <par>Contact us by writing to:
+ et distribué sous la licence BSD.<br/></par>
+ <par>Contactez-nous par écrit à
<mailto address="tos...@li..."/>
</par>
</section>
@@ -71,12 +71,20 @@
Toss Subversion Repository</a></item>
</itemize>
</section>
+ <section title="Toss Liens" lang="fr">
+ <itemize>
+ <item><a href="http://sourceforge.net/projects/toss/">Projet Toss à
+ SourceForge.net</a></item>
+ <item><a href="http://toss.svn.sourceforge.net/viewvc/toss/trunk/Toss/">
+ Toss Subversion Repository</a></item>
+ </itemize>
+ </section>
<section title="Game Playing Links" lang="en">
<itemize>
<item><a href="http://www.apronus.com/chess/wbeditor.php">Apronus Chess
- Board Editor</a> is our favorite site for simple chess boards.
+ Board Editor</a> is our favorite site for simple chess board editing.
</item>
<item><a href="http://www.dozingcatsoftware.com/Gridlock/">Gridlock</a>
@@ -155,8 +163,40 @@
Turn</a> możesz zagrać w różne gry planszowe.</item>
</itemize>
</section>
+ <section title="Liens vers les Programmes les Jeux" lang="fr">
+ <itemize>
+ <item><a href="http://www.apronus.com/chess/wbeditor.php">Apronus Chess
+ Board Editor</a> est notre site favori pour l'édition simple
+ d'échiquier.
+ </item>
+ <item><a href="http://www.dozingcatsoftware.com/Gridlock/">Gridlock</a>
+ est une collection de jeux open-source. Il est agréable de jouer
+ mais ne permet pas de changer le jeu.
+ </item>
+ <item><a href="http://www.zillions-of-games.com/">Zillions of Games</a>
+ est un langage de définition des jeux avec un simulateur et un grand
+ bibliothèque de jeux. Il est très agréable mais malheureusement
+ pas open source.
+ </item>
+
+ <item><a href="http://www.kurnik.pl/">Kurnik</a>
+ est un site polonais sur lequel vous pouvez jouer à des jeux divers.
+ </item>
+
+ <item><a href="http://abstractstrategy.com/main.html">Abstract
+ Strategy Games</a> site vous permet d'apprendre et de jouer
+ à des jeux abstraits de stratégie.
+ </item>
+
+ <item><a href="http://www.yourturnmyturn.com/">Your Turn My
+ Turn</a> vous permet de jouer à divers jeux en ligne.
+ </item>
+ </itemize>
+ </section>
+
+
<section title="Modelling Links" lang="en">
<itemize>
<item><a href="http://edu.kde.org/step/">Step</a>
@@ -212,19 +252,37 @@
</item>
</itemize>
</section>
+ <section title="Liens de Modélisation" lang="fr">
+ <itemize>
+ <item><a href="http://edu.kde.org/step/">Step</a>
+ est un simulateur open-source de physique, une partie de KDE Education
+ Projet. Il peut être utilisé pour simulation de systèmes avec
+ la dynamique continue.
+ </item>
+ <item><a href="http://www.iseesystems.com/softwares/Education/StellaSoftware.aspx">STELLA</a> est un simulateur commercial, permettant d'utiliser la
+ dynamique continue et discrète.
+ </item>
+ <item><a href="http://ptolemy.eecs.berkeley.edu/">Ptolemy</a> projet
+ étudie de modélisation, de simulation et la conception de systèmes
+ concurrents, en temps réel. Ce projet permet d'utiliser différents
+ modèles de calcul qui régissent les interactions entre les composants.
+ </item>
+ </itemize>
+ </section>
+
+
<section title="Team" lang="en">
<par>Toss originates from our work in the
<a href="http://www.algosyn.rwth-aachen.de/">AlgoSyn</a> research group.
Many people contributed, here we name just a few. Current leaders:</par>
<itemize>
- <item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
+ <item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
<item>Tobias Ganzow</item>
- <item>Łukasz Stafiniak</item>
- <item>Michał Wójcik</item>
+ <item>Łukasz Stafiniak</item>
+ <item>Michał Wójcik</item>
</itemize>
-
<par>Friends who helped us a lot with discussion and code.</par>
<itemize>
<item>Dietmar Berwanger</item>
@@ -238,19 +296,17 @@
<item>Peter Cholewinski</item>
</itemize>
</section>
-
<section title="Team" lang="de">
<par>Toss hat angefangen während der Arbeit im
<a href="http://www.algosyn.rwth-aachen.de/">AlgoSyn</a>
Graduiertenkolleg. Viele haben dazu beigetragen, hier benennen wir
nur einige Mitwirkende. Zur Zeit programmieren am meisten:</par>
<itemize>
- <item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
+ <item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
<item>Tobias Ganzow</item>
- <item>Łukasz Stafiniak</item>
- <item>Michał Wójcik</item>
+ <item>Łukasz Stafiniak</item>
+ <item>Michał Wójcik</item>
</itemize>
-
<par>Freunde die uns sehr geholfen haben.</par>
<itemize>
<item>Dietmar Berwanger</item>
@@ -264,19 +320,17 @@
<item>Peter Cholewinski</item>
</itemize>
</section>
-
<section title="Team" lang="pl">
<par>Toss wywodzi się z prac i dyskusji w gronie
<a href="http://www.algosyn.rwth-aachen.de/">AlgoSyn</a>.
Wiele osób pracowało nad Tossem w różnych okresach, tutaj
wymieniamy tylko niektóre z nich. Obecnie najwięcej pracują:</par>
<itemize>
- <item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
+ <item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
<item>Tobias Ganzow</item>
- <item>Łukasz Stafiniak</item>
- <item>Michał Wójcik</item>
+ <item>Łukasz Stafiniak</item>
+ <item>Michał Wójcik</item>
</itemize>
-
<par>Przyjaciele, którzy bardzo nam pomogli.</par>
<itemize>
<item>Dietmar Berwanger</item>
@@ -290,5 +344,29 @@
<item>Peter Cholewinski</item>
</itemize>
</section>
+ <section title="Team" lang="fr">
+ <par>Toss Toss est originaire de notre travail dans le groupe de
+ recherche <a href="http://www.algosyn.rwth-aachen.de/">AlgoSyn</a>.
+ Plusieurs personnes ont contribué, ici, nous n'en nommer pas tous.
+ Les dirigeants actuels:</par>
+ <itemize>
+ <item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
+ <item>Tobias Ganzow</item>
+ <item>Łukasz Stafiniak</item>
+ <item>Michał Wójcik</item>
+ </itemize>
+ <par>Les amis qui nous ont aidé par la discussion et le code.</par>
+ <itemize>
+ <item>Dietmar Berwanger</item>
+ <item>Matko Botincan</item>
+ <item>Diana Fischer</item>
+ </itemize>
+ <par>Un autre groupe de personnes, qui ont travaillé sur la version
+ la plus ancienne de Toss (environ 2004), a été dirigée par:</par>
+ <itemize>
+ <item>Alexander Kharitonov</item>
+ <item>Peter Cholewinski</item>
+ </itemize>
+ </section>
</personal>
Modified: trunk/Toss/www/ideas.xml
===================================================================
--- trunk/Toss/www/ideas.xml 2011-03-17 22:03:28 UTC (rev 1366)
+++ trunk/Toss/www/ideas.xml 2011-03-18 00:19:55 UTC (rev 1367)
@@ -46,11 +46,11 @@
<itemize>
<item>Toss Mailing List:
<mailto address="tos...@li..."/></item>
- <item>Łukasz Kaiser (GSoC admin):
+ <item>Łukasz Kaiser (GSoC admin):
<mailto address="luk...@gm..."/></item>
- <item>Łukasz Stafiniak (GSoC backup admin):
+ <item>Łukasz Stafiniak (GSoC backup admin):
<mailto address="luk...@gm..."/></item>
- <item>Michał Wójcik:
+ <item>Michał Wójcik:
<mailto address="mic...@gm..."/></item>
</itemize>
</section>
@@ -85,8 +85,8 @@
project, but it can become very interesting in the last phase!
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Michał Wójcik, Tobias Ganzow,
- Łukasz Stafiniak, Łukasz Kaiser
+ Michał Wójcik, Tobias Ganzow,
+ Łukasz Stafiniak, Łukasz Kaiser
</par>
</section>
@@ -121,7 +121,7 @@
and to be able to use and debug them in parallel.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Łukasz Kaiser, Tobias Ganzow, Łukasz Stafiniak
+ Łukasz Kaiser, Tobias Ganzow, Łukasz Stafiniak
</par>
</section>
@@ -160,7 +160,7 @@
interface design is necessary, and a lot of testing to make it right.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Dietmar Berwanger, Michał Wójcik, Diana Fischer
+ Dietmar Berwanger, Michał Wójcik, Diana Fischer
</par>
</section>
@@ -198,7 +198,7 @@
their optimization techniques or constraint solving will be helpful.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Tobias Ganzow, Łukasz Kaiser, Łukasz Stafiniak
+ Tobias Ganzow, Łukasz Kaiser, Łukasz Stafiniak
</par>
</section>
@@ -240,7 +240,7 @@
Still, passion for GGP is the best recommendation for this project!
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Łukasz Stafiniak, Łukasz Kaiser, maybe someone from GGP Galaxy
+ Łukasz Stafiniak, Łukasz Kaiser, maybe someone from GGP Galaxy
</par>
</section>
@@ -275,7 +275,7 @@
already improve playing strength. OCaml experience is required.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Łukasz Stafiniak, Łukasz Kaiser
+ Łukasz Stafiniak, Łukasz Kaiser
</par>
</section>
@@ -312,9 +312,52 @@
to hard, depending on how much effort one makes to adapt automatic play.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Łukasz Kaiser, Dietmar Berwanger, Tobias Ganzow
+ Łukasz Kaiser, Dietmar Berwanger, Tobias Ganzow
</par>
</section>
+ <section title="Idea: Language for Games and Strategies">
+ <par><em>Description and Goals.</em>
+ At present, one can only define a fixed game in a .toss file and only
+ in the fixed syntax. It should be allowed to also define preferences
+ of the players (heuristics) and their strategies — e.g. choices of
+ playout methods (UCT or Maximax) or their parameters. And use a more
+ friendly and defineable syntax. This project will adapt
+ the merged Speagram code with Toss to these ends.
+ <br/><br/></par>
+ <par><em>Deliverables.</em>
+ By mid-terms the merged Speagram code should be functional both
+ as Toss parser and at least for most of the old Speagram examples.
+ By the end it should fully support varying syntax, maybe using
+ defined relations for types, and allow to define players' strategies.
+ <br/><br/></par>
+ <par><em>Modules (in planned construction order).</em>
+ <enumerate>
+ <item>Clean up Language directory, remove higher-order functions</item>
+ <item>Change rewriting engine in Language to the Toss one</item>
+ <item>Change external actions in Language to the ones used in Toss game
+ parsing (add, change rules, model, defines relations, etc.)</item>
+ <item>Test the Language module as Toss parser</item>
+ <item>Use defined rels instead of Language types</item>
+ <item>Allow strategy definitions in Language</item>
+ </enumerate>
+ <br/></par>
+ <par><em>Needed Skills and Difficulty.</em>
+ This project is ambitious and requires good knowledge of OCaml.
+ The general goal is to make a nice language for games and strategies,
+ the proposed way is just one of the possibilities. If you have
+ a passion for linguistics and want to mix it with formal models,
+ this is something for you! Just think what is possible in such a rich
+ formal model as Toss — you can finally give formal semantics to
+ actions in all tenses ("I did / do / will do"), as well as preferences
+ and subgoals ("I prefer / would like to") and many other expressions
+ of this kind. That's difficult, but it may be very rewarding!
+ <br/><br/></par>
+ <par><em>Possible Mentors (in order of preference):</em>
+ Łukasz Kaiser, Łukasz Stafiniak
+ </par>
+ </section>
+
+
</personal>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-18 16:57:39
|
Revision: 1368
http://toss.svn.sourceforge.net/toss/?rev=1368&view=rev
Author: lukstafi
Date: 2011-03-18 16:57:31 +0000 (Fri, 18 Mar 2011)
Log Message:
-----------
GameSimpl: stage 3: glueing conjoined relations completed; eliminating redundant equivalence relations.
Modified Paths:
--------------
trunk/Toss/Formula/Aux.ml
trunk/Toss/Formula/Aux.mli
trunk/Toss/GGP/GDL.ml
trunk/Toss/GGP/GDL.mli
trunk/Toss/GGP/GDLTest.ml
trunk/Toss/GGP/GameSimpl.ml
trunk/Toss/GGP/GameSimplTest.ml
trunk/Toss/GGP/tests/breakthrough-raw.toss
trunk/Toss/GGP/tests/breakthrough-simpl.toss
trunk/Toss/GGP/tests/connect5-raw.toss
trunk/Toss/GGP/tests/connect5-simpl.toss
Modified: trunk/Toss/Formula/Aux.ml
===================================================================
--- trunk/Toss/Formula/Aux.ml 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/Formula/Aux.ml 2011-03-18 16:57:31 UTC (rev 1368)
@@ -54,6 +54,7 @@
module BasicOperators = struct
let (-|) f g x = f (g x)
+ let (<|) f x = f x
end
open BasicOperators
@@ -220,6 +221,14 @@
| _::tl -> aux (n+1) tl in
aux 0 l
+let pop_find p l =
+ let rec aux acc = function
+ | hd::tl when p hd -> hd, List.rev_append acc tl
+ | hd::tl (* when not p hd *) -> aux (hd::acc) tl
+ | [] -> raise Not_found in
+ aux [] l
+
+
let maximal cmp l =
let rec aux acc = function
| hd::tl when
Modified: trunk/Toss/Formula/Aux.mli
===================================================================
--- trunk/Toss/Formula/Aux.mli 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/Formula/Aux.mli 2011-03-18 16:57:31 UTC (rev 1368)
@@ -25,6 +25,8 @@
sig
(** Function composition. *)
val ( -| ) : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b
+ (** Function application (to avoid parentheses). *)
+ val ( <| ) : ('a -> 'b) -> 'a -> 'b
end
val int_pow : int -> int -> int
@@ -141,6 +143,9 @@
counting from zero. *)
val find_index : 'a -> 'a list -> int
+(** Find an element satisfying the predicate and separate it from the list. *)
+val pop_find : ('a -> bool) -> 'a list -> 'a * 'a list
+
(** Return the list of maximal elements, under the given less-or-equal
comparison (the input does not need to be sorted). (Currently, of
equal elements only the last one is preserved.) *)
Modified: trunk/Toss/GGP/GDL.ml
===================================================================
--- trunk/Toss/GGP/GDL.ml 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/GDL.ml 2011-03-18 16:57:31 UTC (rev 1368)
@@ -537,10 +537,12 @@
(** Expand static relations that do not have ground facts and have
arity above the threshold. *)
let expand_arity_above = ref 0
+
(** Generate all tuples for equivalences, to faciliate further
transformations of formulas in the game definition (outside of
translation). *)
-let equivalences_all_tuples = ref (* false *) true
+type pair_matrix = Pairs_all | Pairs_triang | Pairs_star
+let equivalences_all_tuples = ref Pairs_triang
open Aux.BasicOperators
@@ -1609,14 +1611,14 @@
(term_str a) (term_str b);
assert false
-(*
+
let triang_matrix elems =
let rec aux acc = function
| [] -> acc
| hd::tl -> aux (List.map (fun e->[|hd; e|]) tl @ acc) tl in
aux [] elems
-*)
+
let term_to_blank masks next_arg =
let mask_cands =
Aux.map_try (fun mask ->
@@ -1769,17 +1771,20 @@
(List.map (fun t -> snd (toss_var masks t)) terms) in
constrained_vars := vars @ !constrained_vars;
let tups =
- if !equivalences_all_tuples
- then
- (* generating more relations to faciliate "contraction" of
- co-occurring relations in GameSimpl, which will also clean
- the redundant atoms *)
- Aux.concat_map (fun v -> Aux.map_some (fun w ->
- if v=w then None else Some [|v; w|]) vars) vars
- else
- (* (4b) are equivalences, so we just build a "star" *)
- match vars with [] -> []
- | v::vs -> List.map (fun w -> [|v; w|]) vs in
+ match !equivalences_all_tuples with
+ | Pairs_all ->
+ Aux.concat_map (fun v -> Aux.map_some (fun w ->
+ if v=w then None else Some [|v; w|]) vars) vars
+ | Pairs_triang ->
+ (* generating more relations to faciliate "contraction" of
+ co-occurring relations in GameSimpl -- since it
+ GameSimpl handles inversion, no need for bidirectional
+ links *)
+ triang_matrix vars
+ | Pairs_star ->
+ (* (4b) are equivalences, so we just build a "star" *)
+ match vars with [] -> []
+ | v::vs -> List.map (fun w -> [|v; w|]) vs in
List.map (fun tup -> Formula.Rel (rname, tup)) tups
) terms
) pos_path_subterms) in
@@ -1800,16 +1805,16 @@
(List.map (fun t -> snd (toss_var masks t)) terms) in
(* these don't get constrained since they'll occur negatively *)
let tups =
- if !equivalences_all_tuples
- then
- Aux.concat_map
- (fun v ->
- if v = ntossvar then []
- else [[|v; ntossvar|]; [|ntossvar; v|]]) tossvars
- else
- Aux.map_some (fun v ->
- if v = ntossvar then None
- else Some [|v; ntossvar|]) tossvars in
+ match !equivalences_all_tuples with
+ | Pairs_all ->
+ Aux.concat_map
+ (fun v ->
+ if v = ntossvar then []
+ else [[|v; ntossvar|]; [|ntossvar; v|]]) tossvars
+ | Pairs_triang | Pairs_star ->
+ Aux.map_some (fun v ->
+ if v = ntossvar then None
+ else Some [|v; ntossvar|]) tossvars in
List.map (fun tup -> Formula.Rel (rname, tup)) tups
| _ -> []
) pos_path_subterms in
@@ -2128,14 +2133,15 @@
(List.map (fun t -> snd (toss_var masks t)) terms) in
constrained_vars := vars @ !constrained_vars;
let tups =
- if !equivalences_all_tuples
- then
- Aux.concat_map (fun v -> Aux.map_some (fun w ->
- if v=w then None else Some [|v; w|]) vars) vars
- else
- match vars with [] -> []
- | v::vs -> Aux.map_some (fun w ->
- if v=w then None else Some [|v; w|]) vs in
+ match !equivalences_all_tuples with
+ | Pairs_all ->
+ Aux.concat_map (fun v -> Aux.map_some (fun w ->
+ if v=w then None else Some [|v; w|]) vars) vars
+ | Pairs_triang ->
+ triang_matrix vars
+ | Pairs_star ->
+ match vars with [] -> []
+ | v::vs -> List.map (fun w -> [|v; w|]) vs in
List.map (fun tup -> Formula.Rel (rname, tup)) tups
) terms
) neg_path_subterms in
@@ -3431,7 +3437,7 @@
} in
(* {{{ log entry *)
(* *
- let file = open_out "./GGP/tests/connect5-raw.toss" in
+ let file = open_out "./GGP/tests/breakthrough-raw.toss" in
output_string file (Arena.state_str result);
close_out file;
* *)
@@ -3451,7 +3457,7 @@
) loc_noop_legal in
(* {{{ log entry *)
(* *
- let file = open_out "./GGP/tests/connect5-simpl.toss" in
+ let file = open_out "./GGP/tests/breakthrough-simpl.toss" in
output_string file (Arena.state_str result);
close_out file;
* *)
Modified: trunk/Toss/GGP/GDL.mli
===================================================================
--- trunk/Toss/GGP/GDL.mli 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/GDL.mli 2011-03-18 16:57:31 UTC (rev 1368)
@@ -6,6 +6,9 @@
val aggregate_drop_negative : bool ref
val aggregate_fixpoint : bool ref
+type pair_matrix = Pairs_all | Pairs_triang | Pairs_star
+val equivalences_all_tuples : pair_matrix ref
+
val manual_translation : bool ref
val manual_game : string ref
val top_exec_path : string ref
Modified: trunk/Toss/GGP/GDLTest.ml
===================================================================
--- trunk/Toss/GGP/GDLTest.ml 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/GDLTest.ml 2011-03-18 16:57:31 UTC (rev 1368)
@@ -146,5 +146,5 @@
let breakthrough = load_rules "./GGP/examples/breakthrough.gdl" in
let connect5 = load_rules "./GGP/examples/connect5.gdl" in
let tictactoe = load_rules "./GGP/examples/tictactoe.gdl" in
- let gdl_def, toss_def = GDL.translate_game (Const "x") connect5 in
+ let gdl_def, toss_def = GDL.translate_game (Const "white") breakthrough in
ignore gdl_def; ignore connect5; ignore breakthrough; ignore tictactoe
Modified: trunk/Toss/GGP/GameSimpl.ml
===================================================================
--- trunk/Toss/GGP/GameSimpl.ml 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/GameSimpl.ml 2011-03-18 16:57:31 UTC (rev 1368)
@@ -7,6 +7,9 @@
rules is specified by transformations described below. Rules can
be refined or new simplification rules added to each stage.
+ Assuming that relations beginning with EQ__ are equivalences,
+ eliminate redundant occurrences.
+
TODO: use [DiscreteRule.special_rel_of rel = Some "opt"]
instead of [DiscreteRule.special_rel_of rel <> None]? (To protect
against GDL using identifiers starting with underscore.)
@@ -48,7 +51,8 @@
(3) Add intersections of non-fluent relations to the structure
when they co-occur in formulas. For binary relations, also add
- intersections of a relation and an inverse of another.
+ intersections of a relation and an inverse of another. Filter out
+ unnecessary equivalence relations.
(3a) Eliminate conjoined static (non-fluents and not defined)
relations in formulas that are applied to the same arguments and
@@ -60,16 +64,23 @@
one, and introduce a new relation for intersection of one with the
inverse of the other.
- (3c) Repeat till no more atoms can be glued in this way.
+ (3c) Filter out relations beginning with "EQ__" by: (3c1)
+ collecting equivalent elements in families of sets indexed by EQ
+ relations; (3c2) keeping an EQ relation, outside of glueing group,
+ only if its arguments are not yet in the same partition wrt. the
+ relation. Do it after glueing not to preclude intersections, take
+ into account the glueing reductions.
- (3d) Since too long names would be unreadable anyway, introduce
+ (3d) Repeat till no more atoms can be glued in this way.
+
+ (3e) Since too long names would be unreadable anyway, introduce
fresh relation names for the glued relations and remember the
correspondence in game data.
- (3e) The eliminated co-occurrences are relevant only for tuples
+ (3f) The eliminated co-occurrences are relevant only for tuples
present in rewrite rules (LHS structures), not for absent ones
(since these are conjoined negations). Replace them in the LHS
- structures as in (3a)-(3b), but only if all of replaced relations
+ structures as in (3a)-(3c), but only if all of replaced relations
occur as non-embedded (i.e. "tau_h") (since embedded relations
will have reuired-to-be-absent occurrences, and these cannot be
handled by conjoining).
@@ -437,7 +448,7 @@
(Tups.inter graph1 inv_graph) in
Structure.add_rels struc grel tuples in
- (* preparing (3a-b-c) *)
+ (* preparing (3a-d) *)
let add_rel rel acc =
match rel with
| Rel (rel,_) -> Aux.Strings.add rel acc
@@ -451,6 +462,8 @@
let signat = ref signat in
let glued = ref [] in (* bindings introduced by [glue] *)
let glued_inv = ref [] in (* bingings introduced by [glue_inv] *)
+ let is_equiv rel =
+ String.length rel >= 4 && String.sub rel 0 4 = "EQ__" in
(* 3a *)
let glue rels =
let args_keys =
@@ -500,9 +513,55 @@
else (rel1, args1)::loop more
| (args, rel)::rels -> (rel, args)::loop rels
| [] -> [] in
- loop rels
- in
- (* the step of 3c *)
+ loop rels in
+ (* 3c *)
+ let glue_equiv rels =
+ (* only partition, process later, add the original grels to
+ filtered rels *)
+ let grels, rels = List.partition (fun (rel,_) ->
+ List.mem_assoc rel !glued || List.mem_assoc rel !glued_inv) rels in
+ let eq_sets = Aux.concat_map (fun (rel, args) ->
+ if List.mem_assoc rel !glued
+ then List.map (fun r->r,args) (List.assoc rel !glued)
+ else if List.mem_assoc rel !glued_inv
+ then
+ let rel1, rel2 = List.assoc rel !glued_inv in
+ [rel1, args; rel2, args]
+ else assert false) grels in
+ (* 3c1 *)
+ let eq_sets =
+ Aux.collect (List.filter (is_equiv -| fst) eq_sets) in
+ let build_sets tups =
+ List.fold_left (fun sets args ->
+ let args = Array.to_list args in
+ (let try set, sets =
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) args) sets in
+ Aux.unique_sorted (args @ set) :: sets
+ with Not_found -> args::sets)
+ ) [] tups in
+ let eq_sets =
+ List.map (fun (rel, tups) -> rel, build_sets tups) eq_sets in
+ (* 3c2 *)
+ let _, rels = List.fold_left (fun (eq_sets, rels as old)
+ (rel, args as atom) ->
+ let sets, eq_sets =
+ try Aux.pop_assoc rel eq_sets
+ with Not_found -> [], eq_sets in
+ let argset = Array.to_list args in
+ (let try set, sets =
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) argset) sets in
+ if List.for_all (fun a->List.mem a set) argset
+ then old
+ else
+ (rel, Aux.unique_sorted (argset @ set) :: sets)::eq_sets,
+ atom::rels
+ with Not_found -> (rel, argset::sets)::eq_sets, atom::rels)
+ ) (eq_sets, []) rels in
+ grels @ rels in
+
+ (* the step of 3d *)
let gluable rel =
not (List.mem rel fluents) &&
not (List.mem_assoc rel game.Arena.defined_rels) in
@@ -515,7 +574,8 @@
| phi -> Aux.Right phi) conjs in
let result =
List.map (fun (rel, args) -> Rel (rel, args))
- (glue_inv (glue poslits)) in
+ (*glue_equiv <| glue_inv <| glue <| poslits why wrong?*)
+ (glue_equiv (glue_inv (glue poslits))) in
And (result @ subtasks));
map_Or = (fun disjs ->
let neglits, subtasks = Aux.partition_map (function
@@ -525,7 +585,7 @@
List.map (fun (rel, args) -> Not (Rel (rel, args)))
(glue_inv (glue neglits)) in
Or (result @ subtasks))} in
- (* 3c *)
+ (* 3d *)
let rec glue_fixpoint phi =
let old_used_rels = !used_rels in
let res = glue_phi (FormulaOps.flatten_formula phi) in
@@ -533,7 +593,7 @@
else glue_fixpoint res in
let game =
Arena.map_to_formulas glue_fixpoint game in
- (* 3d *)
+ (* 3e *)
let more_data =
Aux.map_some (fun (crel, orig_rel) ->
if Aux.Strings.mem crel !used_rels then
@@ -554,7 +614,7 @@
let state = {state with Arena.struc = !struc} in
let signat = !signat in
- (* 3e-3a *)
+ (* 3f-3a *)
(* rather than keeping the unaffected relations/tuples, we only
return the replaced ones *)
let glue_lhs rels =
@@ -569,7 +629,7 @@
Printf.printf "rels=%s\n%!" (String.concat ", " rels);
assert false)
) args_keys in
- (* 3e-3b *)
+ (* 3f-3b *)
let glue_inv_lhs rels =
let rels = List.map (fun (rel,args) -> args,rel) rels in
let rec loop = function
@@ -590,9 +650,53 @@
else loop more
| _::rels -> loop rels
| [] -> [] in
- loop rels
- in
- (* 3e *)
+ loop rels in
+
+ (* 3f-3c *)
+ let glue_equiv_lhs rels =
+ let grels, rels = List.partition (fun (rel,_) ->
+ List.mem_assoc rel !glued || List.mem_assoc rel !glued_inv) rels in
+ let eq_sets = Aux.concat_map (fun (rel, args) ->
+ if List.mem_assoc rel !glued
+ then List.map (fun r->r,args) (List.assoc rel !glued)
+ else if List.mem_assoc rel !glued_inv
+ then
+ let rel1, rel2 = List.assoc rel !glued_inv in
+ [rel1, args; rel2, args]
+ else assert false) grels in
+ (* 3c1 *)
+ let eq_sets =
+ Aux.collect (List.filter (is_equiv -| fst) eq_sets) in
+ let build_sets tups =
+ List.fold_left (fun sets args ->
+ let args = Array.to_list args in
+ (let try set, sets =
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) args) sets in
+ Aux.unique_sorted (args @ set) :: sets
+ with Not_found -> args::sets)
+ ) [] tups in
+ let eq_sets =
+ List.map (fun (rel, tups) -> rel, build_sets tups) eq_sets in
+ (* 3c2 *)
+ let _, drels = List.fold_left (fun (eq_sets, drels)
+ (rel, args as atom) ->
+ let sets, eq_sets =
+ try Aux.pop_assoc rel eq_sets
+ with Not_found -> [], eq_sets in
+ let argset = Array.to_list args in
+ (let try set, sets =
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) argset) sets in
+ if List.for_all (fun a->List.mem a set) argset
+ then (rel, set::sets)::eq_sets, atom::drels
+ else (rel, Aux.unique_sorted (argset @ set) :: sets)
+ :: eq_sets, drels
+ with Not_found -> (rel, argset::sets)::eq_sets, drels)
+ ) (eq_sets, []) rels in
+ drels in
+
+ (* 3f *)
let glue_struc lhs emb_rels =
let cands = Structure.StringMap.fold
(fun rel tups cands ->
@@ -613,13 +717,18 @@
lhs, cands
) (lhs, cands) result in
let result = glue_inv_lhs cands in
- List.fold_left
- (fun lhs (grel, (rel1, rel2), args, inv_args) ->
+ let lhs, cands = List.fold_left
+ (fun (lhs, cands) (grel, (rel1, rel2), args, inv_args) ->
let lhs = Structure.add_rel lhs grel args in
let lhs = Structure.del_rel lhs rel1 args in
let lhs = Structure.del_rel lhs rel2 inv_args in
- lhs
- ) lhs result in
+ let cands = (grel, args)::
+ List.filter (fun (rel,_) -> rel<>rel1 && rel<>rel2) cands in
+ lhs, cands
+ ) (lhs, cands) result in
+ let result = glue_equiv_lhs cands in
+ List.fold_left (fun lhs (drel, args) ->
+ Structure.del_rel lhs drel args) lhs result in
let game = Arena.map_to_discrete
(fun r -> {r with DiscreteRule.lhs_struc =
glue_struc r.DiscreteRule.lhs_struc r.DiscreteRule.emb_rels})
Modified: trunk/Toss/GGP/GameSimplTest.ml
===================================================================
--- trunk/Toss/GGP/GameSimplTest.ml 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/GameSimplTest.ml 2011-03-18 16:57:31 UTC (rev 1368)
@@ -48,7 +48,7 @@
]
-let a =
+let a =
Aux.run_test_if_target "GameSimplTest" tests
let a () =
Modified: trunk/Toss/GGP/tests/breakthrough-raw.toss
===================================================================
--- trunk/Toss/GGP/tests/breakthrough-raw.toss 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/tests/breakthrough-raw.toss 2011-03-18 16:57:31 UTC (rev 1368)
@@ -1,5 +1,4 @@
PLAYERS white, black
-DATA
RULE move_x1_y1_x2_y2_0:
[cellholds_x1_y1__blank_, cellholds_x2_y2__blank_, control__blank_ |
_opt_cellholds_x2_y2_black {
@@ -92,10 +91,8 @@
cellholds_x2_y2_white(cellholds_x377_y369__blank_)))
RULE move_x_y1_x_y2_0:
[cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
- EQ___cellholds_x2_y2_MV1_x2 {
+ EQ___cellholds_x2_y2_MV1_x2
(cellholds_x_y1__blank_, cellholds_x_y2__blank_);
- (cellholds_x_y2__blank_, cellholds_x_y1__blank_)
- };
_opt_cellholds_x2_y2_black {cellholds_x_y1__blank_; control__blank_};
_opt_cellholds_x2_y2_white (control__blank_);
_opt_control_black {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
@@ -228,10 +225,8 @@
cellholds_x2_y2_white(cellholds_x377_y369__blank_)))
RULE move_x_y1_x_y2_1:
[cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
- EQ___cellholds_x2_y2_MV1_x2 {
+ EQ___cellholds_x2_y2_MV1_x2
(cellholds_x_y1__blank_, cellholds_x_y2__blank_);
- (cellholds_x_y2__blank_, cellholds_x_y1__blank_)
- };
_opt_cellholds_x2_y2_black (control__blank_);
_opt_cellholds_x2_y2_white {cellholds_x_y1__blank_; control__blank_};
_opt_control_black {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
Modified: trunk/Toss/GGP/tests/breakthrough-simpl.toss
===================================================================
--- trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-18 16:57:31 UTC (rev 1368)
@@ -4,7 +4,8 @@
EQ___cellholds_x2_y2_MV1_x2__AND__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2,
R0:
succ__cellholds_x2_y2_MV1_x2__cellholds_x2_y2_MV1_x2__AND__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2,
- R2: EQ___cellholds_x2_y2_MV1_x2__AND_INV__R1,
+ R2:
+ EQ___cellholds_x2_y2_MV1_x2__AND_INV__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2,
R:
succ__cellholds_x2_y2_MV1_x2__cellholds_x2_y2_MV1_x2__AND_INV__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2
RULE move_x1_y1_x2_y2_0:
@@ -79,19 +80,21 @@
ex cellholds_x377_y369__blank_
(cellholds_x2_y2_white(cellholds_x377_y369__blank_) and
not control_MV1(cellholds_x377_y369__blank_)))
-RULE move_x_y1_x_y2_0:
- [cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
- _opt_cellholds_x2_y2_black {cellholds_x_y1__blank_; control__blank_};
- _opt_cellholds_x2_y2_white (control__blank_);
- _opt_control_black {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
- _opt_control_white {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
- cellholds_x2_y2_white (cellholds_x_y1__blank_);
- control_white (control__blank_)
+RULE move_x1_y1_x2_y2_1:
+ [cellholds_x1_y1__blank_, cellholds_x2_y2__blank_, control__blank_ |
+ R0 (cellholds_x2_y2__blank_, cellholds_x1_y1__blank_);
+ _opt_cellholds_x2_y2_black (control__blank_);
+ _opt_cellholds_x2_y2_white {
+ cellholds_x1_y1__blank_; cellholds_x2_y2__blank_; control__blank_};
+ _opt_control_black {cellholds_x1_y1__blank_; cellholds_x2_y2__blank_};
+ _opt_control_white {cellholds_x1_y1__blank_; cellholds_x2_y2__blank_};
+ cellholds_x2_y2_black (cellholds_x1_y1__blank_);
+ control_black (control__blank_)
|
] ->
- [cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
- cellholds_x2_y2_white (cellholds_x_y2__blank_);
- control_black (control__blank_)
+ [cellholds_x1_y1__blank_, cellholds_x2_y2__blank_, control__blank_ |
+ cellholds_x2_y2_black (cellholds_x2_y2__blank_);
+ control_white (control__blank_)
|
]
emb cellholds_x2_y2_black, cellholds_x2_y2_white, control_black,
@@ -113,9 +116,9 @@
ex cellholds_x377_y369__blank_
(cellholds_x2_y2_white(cellholds_x377_y369__blank_) and
not control_MV1(cellholds_x377_y369__blank_)))
-RULE move_x1_y1_x2_y2_1:
+RULE move_x1_y1_x2_y2_10:
[cellholds_x1_y1__blank_, cellholds_x2_y2__blank_, control__blank_ |
- R0 (cellholds_x2_y2__blank_, cellholds_x1_y1__blank_);
+ R (cellholds_x1_y1__blank_, cellholds_x2_y2__blank_);
_opt_cellholds_x2_y2_black (control__blank_);
_opt_cellholds_x2_y2_white {
cellholds_x1_y1__blank_; cellholds_x2_y2__blank_; control__blank_};
@@ -149,21 +152,20 @@
ex cellholds_x377_y369__blank_
(cellholds_x2_y2_white(cellholds_x377_y369__blank_) and
not control_MV1(cellholds_x377_y369__blank_)))
-RULE move_x1_y1_x2_y2_10:
- [cellholds_x1_y1__blank_, cellholds_x2_y2__blank_, control__blank_ |
- R (cellholds_x1_y1__blank_, cellholds_x2_y2__blank_);
- _opt_cellholds_x2_y2_black (control__blank_);
- _opt_cellholds_x2_y2_white {
- cellholds_x1_y1__blank_; cellholds_x2_y2__blank_; control__blank_};
- _opt_control_black {cellholds_x1_y1__blank_; cellholds_x2_y2__blank_};
- _opt_control_white {cellholds_x1_y1__blank_; cellholds_x2_y2__blank_};
- cellholds_x2_y2_black (cellholds_x1_y1__blank_);
- control_black (control__blank_)
+RULE move_x_y1_x_y2_0:
+ [cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
+ R1 (cellholds_x_y1__blank_, cellholds_x_y2__blank_);
+ _opt_cellholds_x2_y2_black {cellholds_x_y1__blank_; control__blank_};
+ _opt_cellholds_x2_y2_white (control__blank_);
+ _opt_control_black {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
+ _opt_control_white {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
+ cellholds_x2_y2_white (cellholds_x_y1__blank_);
+ control_white (control__blank_)
|
] ->
- [cellholds_x1_y1__blank_, cellholds_x2_y2__blank_, control__blank_ |
- cellholds_x2_y2_black (cellholds_x2_y2__blank_);
- control_white (control__blank_)
+ [cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
+ cellholds_x2_y2_white (cellholds_x_y2__blank_);
+ control_black (control__blank_)
|
]
emb cellholds_x2_y2_black, cellholds_x2_y2_white, control_black,
@@ -187,6 +189,7 @@
not control_MV1(cellholds_x377_y369__blank_)))
RULE move_x_y1_x_y2_1:
[cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
+ R2 (cellholds_x_y1__blank_, cellholds_x_y2__blank_);
_opt_cellholds_x2_y2_black (control__blank_);
_opt_cellholds_x2_y2_white {cellholds_x_y1__blank_; control__blank_};
_opt_control_black {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
@@ -406,7 +409,7 @@
(cellholds_1_2_MV1, cellholds_2_3_MV1);
(cellholds_1_1_MV1, cellholds_2_2_MV1)
};
- R2 {
+ R1 {
(cellholds_8_7_MV1, cellholds_8_8_MV1);
(cellholds_8_6_MV1, cellholds_8_7_MV1);
(cellholds_8_5_MV1, cellholds_8_6_MV1);
@@ -464,6 +467,64 @@
(cellholds_1_2_MV1, cellholds_1_3_MV1);
(cellholds_1_1_MV1, cellholds_1_2_MV1)
};
+ R2 {
+ (cellholds_8_8_MV1, cellholds_8_7_MV1);
+ (cellholds_8_7_MV1, cellholds_8_6_MV1);
+ (cellholds_8_6_MV1, cellholds_8_5_MV1);
+ (cellholds_8_5_MV1, cellholds_8_4_MV1);
+ (cellholds_8_4_MV1, cellholds_8_3_MV1);
+ (cellholds_8_3_MV1, cellholds_8_2_MV1);
+ (cellholds_8_2_MV1, cellholds_8_1_MV1);
+ (cellholds_7_8_MV1, cellholds_7_7_MV1);
+ (cellholds_7_7_MV1, cellholds_7_6_MV1);
+ (cellholds_7_6_MV1, cellholds_7_5_MV1);
+ (cellholds_7_5_MV1, cellholds_7_4_MV1);
+ (cellholds_7_4_MV1, cellholds_7_3_MV1);
+ (cellholds_7_3_MV1, cellholds_7_2_MV1);
+ (cellholds_7_2_MV1, cellholds_7_1_MV1);
+ (cellholds_6_8_MV1, cellholds_6_7_MV1);
+ (cellholds_6_7_MV1, cellholds_6_6_MV1);
+ (cellholds_6_6_MV1, cellholds_6_5_MV1);
+ (cellholds_6_5_MV1, cellholds_6_4_MV1);
+ (cellholds_6_4_MV1, cellholds_6_3_MV1);
+ (cellholds_6_3_MV1, cellholds_6_2_MV1);
+ (cellholds_6_2_MV1, cellholds_6_1_MV1);
+ (cellholds_5_8_MV1, cellholds_5_7_MV1);
+ (cellholds_5_7_MV1, cellholds_5_6_MV1);
+ (cellholds_5_6_MV1, cellholds_5_5_MV1);
+ (cellholds_5_5_MV1, cellholds_5_4_MV1);
+ (cellholds_5_4_MV1, cellholds_5_3_MV1);
+ (cellholds_5_3_MV1, cellholds_5_2_MV1);
+ (cellholds_5_2_MV1, cellholds_5_1_MV1);
+ (cellholds_4_8_MV1, cellholds_4_7_MV1);
+ (cellholds_4_7_MV1, cellholds_4_6_MV1);
+ (cellholds_4_6_MV1, cellholds_4_5_MV1);
+ (cellholds_4_5_MV1, cellholds_4_4_MV1);
+ (cellholds_4_4_MV1, cellholds_4_3_MV1);
+ (cellholds_4_3_MV1, cellholds_4_2_MV1);
+ (cellholds_4_2_MV1, cellholds_4_1_MV1);
+ (cellholds_3_8_MV1, cellholds_3_7_MV1);
+ (cellholds_3_7_MV1, cellholds_3_6_MV1);
+ (cellholds_3_6_MV1, cellholds_3_5_MV1);
+ (cellholds_3_5_MV1, cellholds_3_4_MV1);
+ (cellholds_3_4_MV1, cellholds_3_3_MV1);
+ (cellholds_3_3_MV1, cellholds_3_2_MV1);
+ (cellholds_3_2_MV1, cellholds_3_1_MV1);
+ (cellholds_2_8_MV1, cellholds_2_7_MV1);
+ (cellholds_2_7_MV1, cellholds_2_6_MV1);
+ (cellholds_2_6_MV1, cellholds_2_5_MV1);
+ (cellholds_2_5_MV1, cellholds_2_4_MV1);
+ (cellholds_2_4_MV1, cellholds_2_3_MV1);
+ (cellholds_2_3_MV1, cellholds_2_2_MV1);
+ (cellholds_2_2_MV1, cellholds_2_1_MV1);
+ (cellholds_1_8_MV1, cellholds_1_7_MV1);
+ (cellholds_1_7_MV1, cellholds_1_6_MV1);
+ (cellholds_1_6_MV1, cellholds_1_5_MV1);
+ (cellholds_1_5_MV1, cellholds_1_4_MV1);
+ (cellholds_1_4_MV1, cellholds_1_3_MV1);
+ (cellholds_1_3_MV1, cellholds_1_2_MV1);
+ (cellholds_1_2_MV1, cellholds_1_1_MV1)
+ };
cellholds_x2_1_MV1 {
cellholds_8_1_MV1; cellholds_7_1_MV1; cellholds_6_1_MV1;
cellholds_5_1_MV1; cellholds_4_1_MV1; cellholds_3_1_MV1;
Modified: trunk/Toss/GGP/tests/connect5-raw.toss
===================================================================
--- trunk/Toss/GGP/tests/connect5-raw.toss 2011-03-18 00:19:55 UTC (rev 1367)
+++ trunk/Toss/GGP/tests/connect5-raw.toss 2011-03-18 16:57:31 UTC (rev 1368)
@@ -1,5 +1,4 @@
PLAYERS x, o
-DATA
RULE mark_x149_y149_0:
[cell_x149_y149__blank_, control__blank_ |
_opt_cell_x_y_b (control__blank_);
@@ -23,22 +22,12 @@
EQ___cell_x_y_MV1_x(cell_x160_a23__blank_, cell_x160_c31__blank_) and
EQ___cell_x_y_MV1_x(cell_x160_a23__blank_, cell_x160_d23__blank_) and
EQ___cell_x_y_MV1_x(cell_x160_a23__blank_, cell_x160_e23__blank_) and
- EQ___cell_x_y_MV1_x(cell_x160_b23__blank_, cell_x160_a23__blank_) and
EQ___cell_x_y_MV1_x(cell_x160_b23__blank_, cell_x160_c31__blank_) and
EQ___cell_x_y_MV1_x(cell_x160_b23__blank_, cell_x160_d23__blank_) and
EQ___cell_x_y_MV1_x(cell_x160_b23__blank_, cell_x160_e23__blank_) and
- EQ___cell_x_y_MV1_x(cell_x160_c31__blank_, cell_x160_a23__blank_) and
- EQ___cell_x_y_MV1_x(cell_x160_c31__blank_, cell_x160_b23__blank_) and
EQ___cell_x_y_MV1_x(cell_x160_c31__blank_, cell_x160_d23__bl...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-20 16:56:40
|
Revision: 1372
http://toss.svn.sourceforge.net/toss/?rev=1372&view=rev
Author: lukaszkaiser
Date: 2011-03-20 16:56:34 +0000 (Sun, 20 Mar 2011)
Log Message:
-----------
Correct looping in Heuristic.
Modified Paths:
--------------
trunk/Toss/GGP/Makefile
trunk/Toss/Play/Heuristic.ml
trunk/Toss/www/navigation.xml
Modified: trunk/Toss/GGP/Makefile
===================================================================
--- trunk/Toss/GGP/Makefile 2011-03-19 19:24:33 UTC (rev 1371)
+++ trunk/Toss/GGP/Makefile 2011-03-20 16:56:34 UTC (rev 1372)
@@ -16,12 +16,12 @@
GDLTestDebug:
%.black: examples/%.gdl ../TossServer
- OCAMLRUNPARAM=b; export OCAMLRUNPARAM; ../TossServer -vv &
+ OCAMLRUNPARAM=b; export OCAMLRUNPARAM; ../TossServer -d 2 &
java -jar gamecontroller-cli.jar play $< 600 10 1 -random 1 -remote 2 toss localhost 8110 1 | grep results
killall -v TossServer
%.white: examples/%.gdl ../TossServer
- OCAMLRUNPARAM=b; export OCAMLRUNPARAM; ../TossServer -vv &
+ OCAMLRUNPARAM=b; export OCAMLRUNPARAM; ../TossServer -d 2 &
java -jar gamecontroller-cli.jar play $< 600 10 1 -random 2 -remote 1 toss localhost 8110 1 | grep results
killall -v TossServer
Modified: trunk/Toss/Play/Heuristic.ml
===================================================================
--- trunk/Toss/Play/Heuristic.ml 2011-03-19 19:24:33 UTC (rev 1371)
+++ trunk/Toss/Play/Heuristic.ml 2011-03-20 16:56:34 UTC (rev 1372)
@@ -623,6 +623,7 @@
List.filter (fun (rel,_) -> not (Strings.mem rel frels)) rels in
let rec aux all_vars = function
| Rel _ | Eq _ | In _ as phi -> phi
+ | Not (Rel _) | Not (Eq _) | Not (In _) as phi -> phi
| Not psi -> aux all_vars (FormulaOps.nnf ~neg:true psi)
| Or phis -> Or (List.map (aux all_vars) phis)
| And phis (* as phi when (has_rels frels phi) *) ->
Modified: trunk/Toss/www/navigation.xml
===================================================================
--- trunk/Toss/www/navigation.xml 2011-03-19 19:24:33 UTC (rev 1371)
+++ trunk/Toss/www/navigation.xml 2011-03-20 16:56:34 UTC (rev 1372)
@@ -4,7 +4,7 @@
<navigation>
<menu lang="en">
<item href="/" id="Home">Home</item>
- <item href="/ideas.html" id="ideas">GSoC Ideas</item>
+ <!-- <item href="/ideas.html" id="ideas">GSoC Ideas</item> -->
<item href="http://tplay.org">Play Online</item>
<item href="http://sourceforge.net/project/showfiles.php?group_id=115606"
>Download Toss</item>
@@ -27,7 +27,7 @@
<menu lang="de">
<item href="/" id="Home">Home</item>
- <item href="/ideas.html" id="ideas">GSoC Ideen</item>
+ <!-- <item href="/ideas.html" id="ideas">GSoC Ideen</item> -->
<item href="http://tplay.org">Online Spielen</item>
<item href="http://sourceforge.net/project/showfiles.php?group_id=115606"
>Toss Runterladen</item>
@@ -50,7 +50,7 @@
<menu lang="pl">
<item href="/" id="Home">Strona Domowa</item>
- <item href="/ideas.html" id="ideas">Pomysły na GSoC</item>
+ <!-- <item href="/ideas.html" id="ideas">Pomysły na GSoC</item> -->
<item href="http://tplay.org">Graj Online</item>
<item href="http://sourceforge.net/project/showfiles.php?group_id=115606"
>Ściągnij Tossa</item>
@@ -73,7 +73,7 @@
<menu lang="fr">
<item href="/" id="Home">Accueil</item>
- <item href="/ideas.html" id="ideas">Idées GSoC</item>
+ <!-- <item href="/ideas.html" id="ideas">Idées GSoC</item> -->
<item href="http://tplay.org">Jouez en Ligne</item>
<item href="http://sourceforge.net/project/showfiles.php?group_id=115606"
>Téléchargez Toss</item>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-21 09:38:41
|
Revision: 1373
http://toss.svn.sourceforge.net/toss/?rev=1373&view=rev
Author: lukstafi
Date: 2011-03-21 09:38:35 +0000 (Mon, 21 Mar 2011)
Log Message:
-----------
Test fixes.
Modified Paths:
--------------
trunk/Toss/Arena/DiscreteRule.ml
trunk/Toss/Play/Game.ml
trunk/Toss/Play/GameTest.ml
Modified: trunk/Toss/Arena/DiscreteRule.ml
===================================================================
--- trunk/Toss/Arena/DiscreteRule.ml 2011-03-20 16:56:34 UTC (rev 1372)
+++ trunk/Toss/Arena/DiscreteRule.ml 2011-03-21 09:38:35 UTC (rev 1373)
@@ -176,7 +176,24 @@
(* Find all embeddings of a rule. Does not guarantee that rewriting
will succeed for all of them. *)
let find_matchings model rule_obj =
- Solver.M.evaluate model rule_obj.lhs_form
+ (* {{{ log entry *)
+ if !debug_level > 3 then (
+ Printf.printf "find_matchings: lhs_form=\n%s\n...%!"
+ (Formula.sprint rule_obj.lhs_form);
+ );
+ if !debug_level > 4 then (
+ Printf.printf "find_matchings: model=\n%s\n...%!"
+ (Structure.sprint model);
+ );
+ (* }}} *)
+ let res = Solver.M.evaluate model rule_obj.lhs_form in
+ (* {{{ log entry *)
+ if !debug_level > 3 then (
+ Printf.printf "find_matchings: result=%s\n%!"
+ (AssignmentSet.str res)
+ );
+ (* }}} *)
+ res
(* Convert assignment to an embedding of the LHS structure. *)
let assignment_to_embedding rule_obj asgn =
Modified: trunk/Toss/Play/Game.ml
===================================================================
--- trunk/Toss/Play/Game.ml 2011-03-20 16:56:34 UTC (rev 1372)
+++ trunk/Toss/Play/Game.ml 2011-03-21 09:38:35 UTC (rev 1373)
@@ -1206,34 +1206,40 @@
let play = match effort with
| None -> play
| Some effort ->
- {play with agents=Array.map
- (function
- | Tree_search (subgames, sth, params, agents) ->
- Tree_search (
- subgames, sth, {params with iters=effort},
- agents)
- | Maximax_evgame (
- subgames, cooperative, depth, use_pruning) ->
- Maximax_evgame
- (subgames, cooperative, effort, use_pruning)
- | (Random_move | External _) as agent -> agent
- ) play.agents} in
+ {play with agents=Array.map
+ (function
+ | Tree_search (subgames, sth, params, agents) ->
+ Tree_search (
+ subgames, sth, {params with iters=effort},
+ agents)
+ | Maximax_evgame (
+ subgames, cooperative, depth, use_pruning) ->
+ Maximax_evgame
+ (subgames, cooperative, effort, use_pruning)
+ | (Random_move | External _) as agent -> agent
+ ) play.agents} in
(* {{{ log entry *)
if !debug_level > 2 then printf "\nsuggest:\n%!";
(* }}} *)
(match
- toss ~grid_size:Move.cGRID_SIZE play play_state
- with
- | Aux.Left (bpos, moves, memory, _) ->
- (* [suggest] does not update the state, rule application
- should do it *)
- (* {{{ log entry *)
-
- if !debug_level > 1 then
- printf "suggest: pos %d out of %d -- %s\n%!" bpos
- (Array.length moves)
- (Move.move_gs_str (play.game, play_state.game_state) moves.(bpos));
+ toss ~grid_size:Move.cGRID_SIZE play play_state
+ with
+ | Aux.Left (bpos, moves, memory, _) ->
+ (* [suggest] does not update the state, rule application
+ should do it *)
+ (* {{{ log entry *)
+ if !debug_level > 1 then
+ printf "suggest: pos %d out of %d -- %s\n%!" bpos
+ (Array.length moves)
+ (Move.move_gs_str (play.game, play_state.game_state) moves.(bpos));
(* }}} *)
- Some (moves.(bpos), {play_state with memory=memory})
- | Aux.Right payoffs -> None)
+ Some (moves.(bpos), {play_state with memory=memory})
+ | Aux.Right payoffs ->
+ (* {{{ log entry *)
+ if !debug_level > 2 then (
+ Printf.printf "Suggest: found payoffs = %a\n%!"
+ (Aux.array_fprint (fun ppf -> Printf.fprintf ppf "%F")) payoffs
+ );
+ (* }}} *)
+ None)
Modified: trunk/Toss/Play/GameTest.ml
===================================================================
--- trunk/Toss/Play/GameTest.ml 2011-03-20 16:56:34 UTC (rev 1372)
+++ trunk/Toss/Play/GameTest.ml 2011-03-21 09:38:35 UTC (rev 1373)
@@ -335,11 +335,11 @@
"play: breakthrough suggest in GDL simplified game" >::
(fun () ->
let horizon, advr, state =
- get_loc_game breakthrough_simpl_game 1 in
+ get_loc_game breakthrough_simpl_game 0 in
(* Game.set_debug_level 5; *)
let move_opt = (let p,ps = Game.initialize_default state
~advr ?horizon
- ~loc:1 ~effort:1
+ ~loc:0 ~effort:1
~search_method:"alpha_beta_ord" () in
Game.suggest p ps) in
assert_bool "Game is not over yet -- some move expected."
@@ -352,19 +352,19 @@
let struc =
Structure.del_rel struc "cellholds_x2_y2_black"
(Array.map (Structure.find_elem struc)
- [|"cellholds_2_7__blank_"|]) in
+ [|"cellholds_2_7_MV1"|]) in
let struc =
Structure.del_rel struc "cellholds_x2_y2_white"
(Array.map (Structure.find_elem struc)
- [|"cellholds_3_2__blank_"|]) in
+ [|"cellholds_3_2_MV1"|]) in
let struc =
Structure.del_rel struc "cellholds_x2_y2_white"
(Array.map (Structure.find_elem struc)
- [|"cellholds_4_1__blank_"|]) in
+ [|"cellholds_4_1_MV1"|]) in
let struc =
Structure.add_rel struc "cellholds_x2_y2_black"
(Array.map (Structure.find_elem struc)
- [|"cellholds_4_1__blank_"|]) in
+ [|"cellholds_4_1_MV1"|]) in
struc in
let horizon, advr, state =
get_loc_game ~update_struc breakthrough_simpl_game 0 in
@@ -379,7 +379,7 @@
"game not over: "^move_gs_str (snd state) moves.(bpos)
| Aux.Right poffs ->
Printf.sprintf "{W: %F; B: %F}" poffs.(0) poffs.(1))
- (Aux.Right [| -1.0; 1.0 |]) move_opt;
+ (Aux.Right [| 0.0; 100.0 |]) move_opt;
let payoffs = Array.to_list
(Array.mapi (fun i v->string_of_int i,v)
(fst state).Arena.graph.((snd state).Arena.cur_loc).Arena.payoffs)
@@ -390,7 +390,7 @@
let answ =
String.concat ", " (List.sort compare (List.map ev payoffs)) in
assert_equal ~msg:"black wins: direct" ~printer:(fun x->x)
- "0: -1., 1: 1." answ;
+ "0: 0., 1: 100." answ;
);
@@ -1038,13 +1038,14 @@
let a () =
Heuristic.debug_level := 4;
FFTNF.debug_level := 4;
+ (* DiscreteRule.debug_level := 5; *)
Game.set_debug_level 10
let a () = Heuristic.use_monotonic := false
-let a () =
+let a =
match test_filter
- ["Game:0:misc:3:play: breakthrough suggest in GDL simplified game"]
+ ["Game:0:misc:4:breakthrough payoff GDL simplified game"]
tests
with
| Some tests -> ignore (run_test_tt ~verbose:true tests)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-21 23:38:19
|
Revision: 1376
http://toss.svn.sourceforge.net/toss/?rev=1376&view=rev
Author: lukstafi
Date: 2011-03-21 23:38:06 +0000 (Mon, 21 Mar 2011)
Log Message:
-----------
GDL action translation adopted to game simplification. GDL test cases extended with action translation tests. Small GDL test case: tictactoe. More logging.
Modified Paths:
--------------
trunk/Toss/Arena/Arena.ml
trunk/Toss/Arena/Arena.mli
trunk/Toss/Arena/ContinuousRule.ml
trunk/Toss/Arena/ContinuousRule.mli
trunk/Toss/GGP/GDL.ml
trunk/Toss/GGP/GDL.mli
trunk/Toss/GGP/GDLParser.mly
trunk/Toss/GGP/GDLTest.ml
trunk/Toss/GGP/GameSimpl.ml
trunk/Toss/GGP/GameSimpl.mli
trunk/Toss/GGP/GameSimplTest.ml
trunk/Toss/GGP/tests/breakthrough-simpl.toss
trunk/Toss/GGP/tests/connect5-simpl.toss
Added Paths:
-----------
trunk/Toss/GGP/tests/tictactoe-raw.toss
trunk/Toss/GGP/tests/tictactoe-simpl.toss
Modified: trunk/Toss/Arena/Arena.ml
===================================================================
--- trunk/Toss/Arena/Arena.ml 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/Arena/Arena.ml 2011-03-21 23:38:06 UTC (rev 1376)
@@ -60,6 +60,14 @@
(* -------------------- PARSER HELPER ------------------------------ *)
+let emb_of_names (game, state) rname emb_str =
+ let lhs =
+ (List.assoc rname game.rules
+ ).ContinuousRule.discrete.DiscreteRule.lhs_struc in
+ List.map (fun (lhs_e, m_e) ->
+ Structure.find_elem lhs lhs_e, Structure.find_elem state.struc m_e)
+ emb_str
+
(* Rules with which a player with given number can move. *)
let rules_for_player player_no game =
let rules_of_loc l =
@@ -935,11 +943,9 @@
let r = List.assoc r_name state_game.rules in
let matches = ContinuousRule.matches_post struc r state.time in
(* matches are from LHS to model *)
- let name (lhs,rhs) =
- Structure.elem_str (ContinuousRule.lhs r) lhs ^ " -> " ^
- Structure.elem_str struc rhs in
- let mname m = String.concat ", " (List.map name m) in
- ((state_game, state), String.concat "; " (List.map mname matches))
+ ((state_game, state),
+ String.concat "; " (
+ List.map (ContinuousRule.embedding_str r struc) matches))
with Not_found ->
((state_game, state), "ERR getting "^r_name^" matches, rule not found")
)
Modified: trunk/Toss/Arena/Arena.mli
===================================================================
--- trunk/Toss/Arena/Arena.mli 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/Arena/Arena.mli 2011-03-21 23:38:06 UTC (rev 1376)
@@ -40,6 +40,10 @@
val empty_state : game * game_state
+(** Translate from names to elements to get rule embedding. *)
+val emb_of_names :
+ game * game_state -> string -> (string * string) list -> (int * int) list
+
(** Rules with which a player with given number can move. *)
val rules_for_player : int -> game -> string list
Modified: trunk/Toss/Arena/ContinuousRule.ml
===================================================================
--- trunk/Toss/Arena/ContinuousRule.ml 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/Arena/ContinuousRule.ml 2011-03-21 23:38:06 UTC (rev 1376)
@@ -250,6 +250,11 @@
fprint Format.str_formatter r;
Format.flush_str_formatter ()
+let embedding_str r struc emb =
+ let name (lhs_e,rhs_e) =
+ Structure.elem_str (lhs r) lhs_e ^ " -> " ^
+ Structure.elem_str struc rhs_e in
+ String.concat ", " (List.map name emb)
(* Compare two rules and explain the first difference
met. Formulas and expressions are compared for structural equality. *)
Modified: trunk/Toss/Arena/ContinuousRule.mli
===================================================================
--- trunk/Toss/Arena/ContinuousRule.mli 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/Arena/ContinuousRule.mli 2011-03-21 23:38:06 UTC (rev 1376)
@@ -39,6 +39,8 @@
val fprint : Format.formatter -> rule -> unit
val print : rule -> unit
val sprint : rule -> string
+val embedding_str :
+ rule -> Structure.structure -> (int * int) list -> string
(** {2 Applying function to side structures} *)
Modified: trunk/Toss/GGP/GDL.ml
===================================================================
--- trunk/Toss/GGP/GDL.ml 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/GDL.ml 2011-03-21 23:38:06 UTC (rev 1376)
@@ -484,6 +484,9 @@
(V_1 - V_K) :(phi_1) + ... (V_n - V_K) :(phi_n)" thus removing
phi_K from translation.
+ (8d) Finally, we simplify the result. Unused predicates are not
+ removed, because some of them will be needed for action translation.
+
(9) To translate an incoming action, we:
(9a) find the "lead legal" term to which the "does move" ground
@@ -544,6 +547,9 @@
type pair_matrix = Pairs_all | Pairs_triang | Pairs_star
let equivalences_all_tuples = ref Pairs_triang
+(** Generate test case for the given game name. *)
+let generate_test_case = ref None
+
open Aux.BasicOperators
type term =
@@ -659,6 +665,28 @@
| Currently arg -> "true", [arg]
| Does (arg1, arg2) -> "does", [arg1; arg2]
+let fprint_gdl_transl_data ?(details=false) ppf gdl =
+ (* TODO: print more data if needed *)
+ Format.fprintf ppf "GDL_DATA@,{@[<1>FLUENTS@ %a;@ PLAYING_AS@ %d;"
+ (Aux.fprint_sep_list ";" Format.pp_print_string) gdl.fluents
+ gdl.playing_as;
+ Aux.StrMap.iter (fun rname data ->
+ Format.fprintf ppf "@ @[<1>RULE@ %s:@ LEGAL=@,%s;@ PRECOND=@,%a;@ "
+ rname (term_str data.lead_legal) Formula.fprint data.precond;
+ Format.fprintf ppf "{@[<1>RHS ADD:@ ";
+ Aux.fprint_sep_list ";" Format.pp_print_string ppf
+ (List.map (fun (rel,args) -> rel^"("^String.concat ", "
+ (Array.to_list args)^")") data.rhs_add);
+ Format.fprintf ppf "@]}@]"
+ ) gdl.tossrule_data;
+ Format.fprintf ppf "@]}"
+
+let sprint_gdl_transl_data ?(details=false) gdl =
+ ignore (Format.flush_str_formatter ());
+ Format.fprintf Format.str_formatter "@[%a@]"
+ (fprint_gdl_transl_data ~details) gdl;
+ Format.flush_str_formatter ()
+
let rec body_of_literal = function
| Pos (Distinct args) ->
[Aux.Right ("distinct", args)] (* not negated actually! *)
@@ -3435,18 +3463,26 @@
time = 0.;
cur_loc = 0;
} in
- (* {{{ log entry *)
- (* *
- let file = open_out "./GGP/tests/breakthrough-raw.toss" in
- output_string file (Arena.state_str result);
- close_out file;
- * *)
+ (* {{{ log entry *)
+ (match !generate_test_case with
+ | None -> ()
+ | Some game_name ->
+ let file = open_out ("./GGP/tests/"^game_name^"-raw.toss") in
+ output_string file (Arena.state_str result);
+ close_out file);
if !debug_level > 1 then (
Printf.printf "\n\nGDL.translate_game: before simplification --\n%s\n%!"
(Arena.sprint_state result)
);
(* }}} *)
+ (* 8d *)
let result = GameSimpl.simplify result in
+ let tossrule_data =
+ Aux.StrMap.mapi (fun rname rdata ->
+ let r = List.assoc rname (fst result).Arena.rules in
+ {rdata with precond =
+ r.ContinuousRule.compiled.DiscreteRule.lhs_form}
+ ) !tossrule_data in
let playing_as = find_player player_term in
let noop_actions =
Array.mapi (fun loc noops->
@@ -3456,18 +3492,19 @@
| _ -> None
) loc_noop_legal in
(* {{{ log entry *)
- (* *
- let file = open_out "./GGP/tests/breakthrough-simpl.toss" in
- output_string file (Arena.state_str result);
- close_out file;
- * *)
+ (match !generate_test_case with
+ | None -> ()
+ | Some game_name ->
+ let file = open_out ("./GGP/tests/"^game_name^"-simpl.toss") in
+ output_string file (Arena.state_str result);
+ close_out file);
if !debug_level > 1 then (
Printf.printf "\n\nGDL.translate_game: after simplification --\n%s\n%!"
(Arena.sprint_state result)
);
(* }}} *)
{anchor_terms = !anchor_terms;
- tossrule_data = !tossrule_data;
+ tossrule_data = tossrule_data;
t_elements = t_elements;
playing_as = playing_as;
noop_actions = noop_actions;
@@ -3500,88 +3537,90 @@
let actions = Array.of_list actions in
let location = (fst state).Arena.graph.(loc) in
let player_action = actions.(location.Arena.player) in
+ let struc = (snd state).Arena.struc in
+ (* {{{ log entry *)
+ if !debug_level > 2 then (
+ Printf.printf "\ntranslate_incoming_move:\nGDL=%s\n%!"
+ (sprint_gdl_transl_data gdl)
+ );
+ if !debug_level > 3 then (
+ Printf.printf "STRUC=%s\n%!" (Structure.sprint struc)
+ );
+ (* }}} *)
(* 9a *)
let tossrules =
Aux.strmap_filter (fun _ rdata ->
try ignore (match_meta [] [] [player_action] [rdata.lead_legal]); true
with Not_found -> false
) gdl.tossrule_data in
- let tossrules = Aux.collect
- (List.map (fun (rname, rdata) ->
- rdata.lead_legal,
- (rname, rdata.precond, rdata.rhs_add, rdata.struc_elems,
- rdata.fixvar_elemvars)) tossrules) in
- let lead, tossrules =
- match tossrules with
- | [lead, tossrules] -> lead, tossrules
- | _ -> assert false in
(* {{{ log entry *)
if !debug_level > 0 then (
- Printf.printf "GDL.translate_incoming_move: action=%s; lead=%s\n%!"
- (term_str player_action) (term_str lead)
+ Printf.printf "GDL.translate_incoming_move: action=%s\n%!"
+ (term_str player_action)
);
(* }}} *)
(* 9c *)
- let fixed_inst, _ =
- match_meta [] [] [player_action] [lead] in
- let struc = (snd state).Arena.struc in
- let candidates = Aux.map_some (
- fun (rname, precond, add, struc_elems, fixvar_elemvars) ->
+ let candidates = Aux.map_some (fun (rname, rdata) ->
+ let fixed_inst, _ =
+ match_meta [] [] [player_action] [rdata.lead_legal] in
(* 9d *)
(* {{{ log entry *)
- if !debug_level > 4 then (
- Printf.printf "fixvar_elemvars: %s\n%!"
- (String.concat "; "
- (List.map (fun (v,ts)->v^": "^
- String.concat ", " (List.map (fun (t,_)->term_str t) ts))
- fixvar_elemvars))
- );
+ if !debug_level > 4 then (
+ Printf.printf "fixvar_elemvars: %s\n%!"
+ (String.concat "; "
+ (List.map (fun (v,ts)->v^": "^
+ String.concat ", " (List.map (fun (t,_)->term_str t) ts))
+ rdata.fixvar_elemvars))
+ );
(* }}} *)
- let anchors = Aux.concat_map (fun (v,t) ->
- let elemvars = List.assoc v fixvar_elemvars in
- Aux.concat_map (fun (mask, pevs) ->
- Aux.concat_map (fun (path, evs) ->
- let pred = List.assoc t
- (List.assoc path (List.assoc mask gdl.anchor_terms)) in
- List.map (fun ev->
- Formula.Rel (pred, [|Formula.fo_var_of_string
- (String.lowercase ev)|])) evs)
- pevs) elemvars
- ) fixed_inst in
- let precond = Formula.And (anchors @ [precond]) in
+ let anchors = Aux.concat_map (fun (v,t) ->
+ let elemvars = List.assoc v rdata.fixvar_elemvars in
+ Aux.concat_map (fun (mask, pevs) ->
+ Aux.concat_map (fun (path, evs) ->
+ let pred = List.assoc t
+ (List.assoc path (List.assoc mask gdl.anchor_terms)) in
+ List.map (fun ev->
+ Formula.Rel (pred, [|Formula.fo_var_of_string
+ (String.lowercase ev)|])) evs)
+ pevs) elemvars
+ ) fixed_inst in
+ let precond = Formula.And (anchors @ [rdata.precond]) in
(* {{{ log entry *)
- if !debug_level > 4 then (
- Printf.printf "GDL.translate_incoming_move: trying precond=\n%s\n...%!"
- (Formula.sprint precond)
- );
+ if !debug_level > 2 then (
+ Printf.printf
+ "GDL.translate_incoming_move: rule=%s; trying precond=\n%s\n...%!"
+ rname (Formula.sprint precond)
+ );
(* }}} *)
- let signat = Structure.rel_signature struc in
- let rule =
- DiscreteRule.translate_from_precond ~precond ~add
- ~emb_rels:gdl.fluents ~signat ~struc_elems in
- let lhs_struc = rule.DiscreteRule.lhs_struc in
- let rule = DiscreteRule.compile_rule
- (Structure.rel_signature struc) [] rule in
- let asgns =
- DiscreteRule.find_matchings struc rule in
+ let signat = Structure.rel_signature struc in
+ let rule =
+ DiscreteRule.translate_from_precond ~precond ~add:rdata.rhs_add
+ ~emb_rels:gdl.fluents ~signat ~struc_elems:rdata.struc_elems in
+ let lhs_struc = rule.DiscreteRule.lhs_struc in
+ let rule = DiscreteRule.compile_rule signat [] rule in
+ let asgns =
+ DiscreteRule.find_matchings struc rule in
(* {{{ log entry *)
- if !debug_level > 2 then (
- Printf.printf "found %s\n%!" (AssignmentSet.str asgns)
- );
+ if !debug_level > 2 then (
+ Printf.printf "found %s\n%!" (AssignmentSet.str asgns)
+ );
(* }}} *)
(* faster *)
(* let emb =
DiscreteRule.choose_match (snd state).Arena.struc rule asgns in *)
(* but we should check whether there's no ambiguity... *)
- match
- DiscreteRule.enumerate_matchings struc rule asgns
- with
- | [] -> None
- | [emb] -> Some (rname, emb, lhs_struc)
- | _ -> failwith
- ("GDL.translate_incoming_move: match ambiguity for rule "^rname)
+ match
+ DiscreteRule.enumerate_matchings struc rule asgns
+ with
+ | [] -> None
+ | [emb] -> Some (rname, emb, lhs_struc)
+ | _ -> failwith
+ ("GDL.translate_incoming_move: match ambiguity for rule "^rname)
) tossrules in
match candidates with
+ | [] ->
+ failwith
+ "GDL.translate_incoming_move: no matching rule found"
| [rname, emb, lhs_struc] ->
(* {{{ log entry *)
if !debug_level > 0 then (
@@ -3593,9 +3632,21 @@
);
(* }}} *)
rname, emb
- | _ -> failwith
- ("GDL.translate_incoming_move: ambiguity among rules "^
- String.concat ", " (List.map Aux.fst3 candidates))
+ | _ ->
+ (* {{{ log entry *)
+ if !debug_level > 0 then (
+ Printf.printf "GDL.translate_incoming_move: ambiguity\n%!";
+ List.iter (fun (rname, emb, lhs_struc) ->
+ Printf.printf "rname=%s; emb=%s\n%!"
+ rname
+ (String.concat ", " (List.map (fun (v,e) ->
+ Structure.elem_str lhs_struc v ^ ": " ^
+ Structure.elem_str struc e) emb))) candidates
+ );
+ (* }}} *)
+ failwith
+ ("GDL.translate_incoming_move: ambiguity among rules "^
+ String.concat ", " (List.map Aux.fst3 candidates))
(*
Modified: trunk/Toss/GGP/GDL.mli
===================================================================
--- trunk/Toss/GGP/GDL.mli 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/GDL.mli 2011-03-21 23:38:06 UTC (rev 1376)
@@ -9,6 +9,9 @@
type pair_matrix = Pairs_all | Pairs_triang | Pairs_star
val equivalences_all_tuples : pair_matrix ref
+(** Generate test case for the given game name. *)
+val generate_test_case : string option ref
+
val manual_translation : bool ref
val manual_game : string ref
val top_exec_path : string ref
@@ -96,11 +99,19 @@
term -> game_descr_entry list -> int ->
(Arena.game * Arena.game_state) * (int * int * float) option * gdl_translation
+val translate_incoming_move :
+ gdl_translation -> Arena.game * Arena.game_state -> term list ->
+ string * DiscreteRule.matching
+(** As {!GDL.translate_incoming_move}, but with optional manual translation. *)
val translate_last_action :
gdl_translation -> Arena.game * Arena.game_state -> term list ->
string * DiscreteRule.matching
(** Rule name, embedding, game state. *)
+val translate_outgoing_move :
+ gdl_translation -> Arena.game * Arena.game_state ->
+ string -> (int * int) list -> string
+(** As {!GDL.translate_outgoing_move}, but with optional manual translation. *)
val translate_move : gdl_translation -> Arena.game * Arena.game_state ->
string -> (int * int) list -> string
Modified: trunk/Toss/GGP/GDLParser.mly
===================================================================
--- trunk/Toss/GGP/GDLParser.mly 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/GDLParser.mly 2011-03-21 23:38:06 UTC (rev 1376)
@@ -14,8 +14,9 @@
%token FORALL EXISTS EOF
-%start parse_game_description parse_request
+%start parse_game_description parse_request parse_term
%type <GDL.request> parse_request request
+%type <GDL.term> parse_term
%type <GDL.game_descr_entry list> parse_game_description game_description
@@ -173,3 +174,6 @@
parse_request:
| request EOF { $1 }
+
+parse_term:
+ | term EOF { $1 }
Modified: trunk/Toss/GGP/GDLTest.ml
===================================================================
--- trunk/Toss/GGP/GDLTest.ml 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/GDLTest.ml 2011-03-21 23:38:06 UTC (rev 1376)
@@ -5,6 +5,12 @@
GDLParser.parse_game_description KIFLexer.lex
(Lexing.from_string s)
+let parse_term s =
+ GDLParser.parse_term KIFLexer.lex
+ (Lexing.from_string s)
+
+let pte = parse_term
+
let state_of_file s =
let f = open_in s in
let res =
@@ -19,6 +25,14 @@
(Lexing.from_channel f) in
(* List.map GDL.rule_of_entry *) descr
+let emb_str (game, state) (rname, emb) =
+ let r = List.assoc rname game.Arena.rules in
+ let struc = state.Arena.struc in
+ ContinuousRule.embedding_str r struc emb
+
+let norm_move (rname,emb) =
+ rname, List.sort Pervasives.compare emb
+
let check_alternate players playout =
let rec aux turn playout =
match turn, playout with
@@ -30,6 +44,47 @@
else aux turn playout in
aux players playout
+let game_test_case ~game_name ~player ~loc0_rule_name ~loc0_emb
+ ~loc0_move ~loc0_noop ~loc1 ~loc1_rule_name ~loc1_emb ~loc1_noop
+ ~loc1_move =
+ let game = load_rules ("./GGP/examples/"^game_name^".gdl") in
+ let gdl, res = GDL.translate_game (Const player) game in
+ let goal = state_of_file ("./GGP/tests/"^game_name^"-simpl.toss") in
+ let resf = open_out ("./GGP/tests/"^game_name^"-temp.toss") in
+ let res_str = Arena.state_str res in
+ output_string resf res_str;
+ close_out resf;
+ let eq, msg = Arena.compare_diff goal res in
+ assert_bool
+ ("GGP/examples/"^game_name^".gdl to GGP/tests/"^game_name^
+ "-simpl.toss, see GGP/tests/"^game_name^"-temp.toss: "^msg)
+ eq;
+ Sys.remove ("./GGP/tests/"^game_name^"-temp.toss");
+ let rname = loc0_rule_name in
+ let emb =
+ Arena.emb_of_names res rname loc0_emb in
+ let transl =
+ GDL.translate_outgoing_move gdl res rname emb in
+ assert_equal ~printer:(fun x->x) loc0_move transl;
+ let move =
+ GDL.translate_incoming_move gdl res
+ [pte loc0_move; pte loc0_noop] in
+ assert_equal ~msg:"own incoming move" ~printer:(emb_str res)
+ (norm_move (rname, emb)) (norm_move move);
+ let req = Arena.ApplyRuleInt (rname, emb, 0.1, []) in
+ let ((game,state), _) = Arena.handle_request res req in
+ let res = game, {state with Arena.cur_loc = loc1} in
+ let rname = loc1_rule_name in
+ let emb =
+ Arena.emb_of_names res rname loc1_emb in
+ let move =
+ GDL.translate_incoming_move gdl res
+ [pte loc1_noop; pte loc1_move] in
+ assert_equal ~msg:"opponent incoming move"
+ ~printer:(emb_str res)
+ (norm_move (rname, emb)) (norm_move move)
+
+
let tests = "GDL" >::: [
"saturate" >::
@@ -82,46 +137,56 @@
(String.concat "\n"
(List.map GDL.exp_def_str res));
);
+
+ "tictactoe" >::
+ (fun () ->
+ game_test_case ~game_name:"tictactoe" ~player:"xplayer"
+ ~loc0_rule_name:"mark_x_y_0"
+ ~loc0_emb:[
+ "cell_x_y__blank_", "cell_2_2_MV1";
+ "control__blank_", "control_MV1"]
+ ~loc0_move:"(mark 2 2)" ~loc0_noop:"noop"
+ ~loc1:1 ~loc1_rule_name:"mark_x_y_1"
+ ~loc1_emb:[
+ "cell_x_y__blank_", "cell_1_1_MV1";
+ "control__blank_", "control_MV1"]
+ ~loc1_noop:"noop" ~loc1_move:"(mark 1 1)"
+ );
]
let bigtests = "GDLBig" >::: [
"connect5" >::
(fun () ->
- let connect5 = load_rules "./GGP/examples/connect5.gdl" in
- let _, res = GDL.translate_game (Const "x") connect5 in
- let goal = state_of_file "./GGP/tests/connect5-simpl.toss" in
- let resf = open_out "./GGP/tests/connect5-temp.toss" in
- let res_str = Arena.state_str res in
- output_string resf res_str;
- close_out resf;
- let eq, msg = Arena.compare_diff goal res in
- assert_bool
- ("GGP/examples/connect5.gdl to GGP/tests/connect5-simpl.toss, \
- see GGP/tests/connect5-temp.toss: "^msg)
- eq;
- Sys.remove "./GGP/tests/connect5-temp.toss"
+ game_test_case ~game_name:"connect5" ~player:"x"
+ ~loc0_rule_name:"mark_x149_y149_0"
+ ~loc0_emb:[
+ "cell_x149_y149__blank_", "cell_e_f_MV1";
+ "control__blank_", "control_MV1"]
+ ~loc0_move:"(mark e f)" ~loc0_noop:"noop"
+ ~loc1:1 ~loc1_rule_name:"mark_x159_y159_1"
+ ~loc1_emb:[
+ "cell_x159_y159__blank_", "cell_f_g_MV1";
+ "control__blank_", "control_MV1"]
+ ~loc1_noop:"noop" ~loc1_move:"(mark f g)"
);
"breakthrough" >::
(fun () ->
- let breakthrough = load_rules "./GGP/examples/breakthrough.gdl" in
- let _, res = GDL.translate_game (Const "white") breakthrough in
- let goal = state_of_file "./GGP/tests/breakthrough-simpl.toss" in
- let resf = open_out "./GGP/tests/breakthrough-temp.toss" in
- let res_str = Arena.state_str res in
- output_string resf res_str;
- close_out resf;
- let eq, msg = Arena.compare_diff goal res in
- assert_bool
- ("GGP/examples/breakthrough.gdl to \
- GGP/tests/breakthrough-simpl.toss, see
- GGP/tests/breakthrough-temp.toss: "^msg)
- eq;
- Sys.remove "./GGP/tests/breakthrough-temp.toss"
+ game_test_case ~game_name:"breakthrough" ~player:"white"
+ ~loc0_rule_name:"move_x1_y1_x2_y2_00"
+ ~loc0_emb:[
+ "cellholds_x1_y1__blank_", "cellholds_2_2_MV1";
+ "cellholds_x2_y2__blank_", "cellholds_3_3_MV1";
+ "control__blank_", "control_MV1"]
+ ~loc0_move:"(move 2 2 3 3)" ~loc0_noop:"noop" ~loc1:1
+ ~loc1_rule_name:"move_x1_y1_x2_y2_1"
+ ~loc1_emb:[
+ "cellholds_x1_y1__blank_", "cellholds_7_7_MV1";
+ "cellholds_x2_y2__blank_", "cellholds_6_6_MV1";
+ "control__blank_", "control_MV1"]
+ ~loc1_noop:"noop" ~loc1_move:"(move 7 7 6 6)"
);
-
-
]
@@ -132,19 +197,26 @@
Aux.run_test_if_target "GDLTest" bigtests
let a () =
+ GDL.debug_level := 4;
+ (* GameSimpl.debug_level := 4; *)
+ (* DiscreteRule.debug_level := 4; *)
+ ()
+
+let a () =
match test_filter
- ["GDL:2:masks"]
- tests
+ [(* "GDLBig:1:breakthrough" *) "GDLBig:0:connect5"]
+ bigtests
with
| Some tests -> ignore (run_test_tt ~verbose:true tests)
| None -> ()
let a () =
+ let game_name = "tictactoe" in
+ let player = "xplayer" in
(* GDL.debug_level := 4; *)
(* GameSimpl.debug_level := 4; *)
(* DiscreteRule.debug_level := 4; *)
- let breakthrough = load_rules "./GGP/examples/breakthrough.gdl" in
- let connect5 = load_rules "./GGP/examples/connect5.gdl" in
- let tictactoe = load_rules "./GGP/examples/tictactoe.gdl" in
- let gdl_def, toss_def = GDL.translate_game (Const "white") breakthrough in
- ignore gdl_def; ignore connect5; ignore breakthrough; ignore tictactoe
+ GDL.generate_test_case := Some game_name;
+ let game = load_rules ("./GGP/examples/"^game_name^".gdl") in
+ ignore (GDL.translate_game (Const player) game);
+ GDL.generate_test_case := None
Modified: trunk/Toss/GGP/GameSimpl.ml
===================================================================
--- trunk/Toss/GGP/GameSimpl.ml 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/GameSimpl.ml 2011-03-21 23:38:06 UTC (rev 1376)
@@ -93,7 +93,7 @@
(4) Update rewrite rule signatures to contain all introduced
relations. Remove from the structures relations that are no longer
- used.
+ used; if [keep_predicates] is true, do not remove predicates.
*)
open Formula
@@ -130,7 +130,7 @@
module Tups = Structure.Tuples
-let simplify (game, state) =
+let simplify ?(keep_predicates=true) (game, state) =
let struc = state.Arena.struc in
let signat = Structure.rel_signature struc in
let nelems = Structure.Elems.cardinal struc.Structure.elements in
@@ -747,6 +747,7 @@
if DiscreteRule.special_rel_of rel = None then rel
else DiscreteRule.orig_rel_of rel in
let res =
+ (not keep_predicates || List.assoc rel signat > 1) &&
not (List.mem rel fluents) &&
not (List.mem_assoc rel game.Arena.defined_rels) &&
not (Aux.Strings.mem rel used_rels) in
Modified: trunk/Toss/GGP/GameSimpl.mli
===================================================================
--- trunk/Toss/GGP/GameSimpl.mli 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/GameSimpl.mli 2011-03-21 23:38:06 UTC (rev 1376)
@@ -11,4 +11,5 @@
val niceness : Formula.formula -> int
val simplify :
+ ?keep_predicates:bool ->
Arena.game * Arena.game_state -> Arena.game * Arena.game_state
Modified: trunk/Toss/GGP/GameSimplTest.ml
===================================================================
--- trunk/Toss/GGP/GameSimplTest.ml 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/GameSimplTest.ml 2011-03-21 23:38:06 UTC (rev 1376)
@@ -59,23 +59,16 @@
| Some tests -> ignore (run_test_tt ~verbose:true tests)
| None -> ()
+(* The action below is used to regenerate the test targets when
+ {!GameSimpl.simplify} changes. *)
let a () =
- let breakthrough = state_of_file "./GGP/tests/breakthrough-raw.toss" in
- Printf.printf "\nINPUT:\n%s\n%!" (Arena.state_str breakthrough);
- GameSimpl.debug_level := 4;
- let res = GameSimpl.simplify breakthrough in
- let resf = open_out "./GGP/tests/breakthrough-simpl.toss" in
- let res_str = Arena.state_str res in
- output_string resf res_str;
- close_out resf;
- Printf.printf "\nRESULT:\n%s\n%!" res_str
+ let game_name = "tictactoe" in
-let a () =
- let connect5 = state_of_file "./GGP/tests/connect5-raw.toss" in
- Printf.printf "\nINPUT:\n%s\n%!" (Arena.state_str connect5);
+ let game = state_of_file ("./GGP/tests/"^game_name^"-raw.toss") in
+ Printf.printf "\nINPUT:\n%s\n%!" (Arena.state_str game);
GameSimpl.debug_level := 4;
- let res = GameSimpl.simplify connect5 in
- let resf = open_out "./GGP/tests/connect5-simpl.toss" in
+ let res = GameSimpl.simplify game in
+ let resf = open_out ("./GGP/tests/"^game_name^"-simpl.toss") in
let res_str = Arena.state_str res in
output_string resf res_str;
close_out resf;
Modified: trunk/Toss/GGP/tests/breakthrough-simpl.toss
===================================================================
--- trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-21 10:39:44 UTC (rev 1375)
+++ trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-21 23:38:06 UTC (rev 1376)
@@ -525,16 +525,87 @@
(cellholds_1_3_MV1, cellholds_1_2_MV1);
(cellholds_1_2_MV1, cellholds_1_1_MV1)
};
+ cellholds_1_y2_MV1 {
+ cellholds_1_8_MV1; cellholds_1_7_MV1; cellholds_1_6_MV1;
+ cellholds_1_5_MV1; cellholds_1_4_MV1; cellholds_1_3_MV1;
+ cellholds_1_2_MV1; cellholds_1_1_MV1
+ };
+ cellholds_2_y2_MV1 {
+ cellholds_2_8_MV1; cellholds_2_7_MV1; cellholds_2_6_MV1;
+ cellholds_2_5_MV1; cellholds_2_4_MV1; cellholds_2_3_MV1;
+ cellholds_2_2_MV1; cellholds_2_1_MV1
+ };
+ cellholds_3_y2_MV1 {
+ cellholds_3_8_MV1; cellholds_3_7_MV1; cellholds_3_6_MV1;
+ cellholds_3_5_MV1; cellholds_3_4_MV1; cellholds_3_3_MV1;
+ cellholds_3_2_MV1; cellholds_3_1_MV1
+ };
+ cellholds_4_y2_MV1 {
+ cellholds_4_8_MV1; cellholds_4_7_MV1; cellholds_4_6_MV1;
+ cellholds_4_5_MV1; cellholds_4_4_MV1; cellholds_4_3_MV1;
+ cellholds_4_2_MV1; cellholds_4_1_MV1
+ };
+ cellholds_5_y2_MV1 {
+ cellholds_5_8_MV1; cellholds_5_7_MV1; cellholds_5_6_MV1;
+ cellholds_5_5_MV1; cellholds_5_4_MV1; cellholds_5_3_MV1;
+ cellholds_5_2_MV1; cellholds_5_1_MV1
+ };
+ cellholds_6_y2_MV1 {
+ cellholds_6_8_MV1; cellholds_6_7_MV1; cellholds_6_6_MV1;
+ cellholds_6_5_MV1; cellholds_6_4_MV1; cellholds_6_3_MV1;
+ cellholds_6_2_MV1; cellholds_6_1_MV1
+ };
+ cellholds_7_y2_MV1 {
+ cellholds_7_8_MV1; cellholds_7_7_MV1; cellholds_7_6_MV1;
+ cellholds_7_5_MV1; cellholds_7_4_MV1; cellholds_7_3_MV1;
+ cellholds_7_2_MV1; cellholds_7_1_MV1
+ };
+ cellholds_8_y2_MV1 {
+ cellholds_8_8_MV1; cellholds_8_7_MV1; cellholds_8_6_MV1;
+ cellholds_8_5_MV1; cellholds_8_4_MV1; cellholds_8_3_MV1;
+ cellholds_8_2_MV1; cellholds_8_1_MV1
+ };
cellholds_x2_1_MV1 {
cellholds_8_1_MV1; cellholds_7_1_MV1; cellholds_6_1_MV1;
cellholds_5_1_MV1; cellholds_4_1_MV1; cellholds_3_1_MV1;
cellholds_2_1_MV1; cellholds_1_1_MV1
};
+ cellholds_x2_2_MV1 {
+ cellholds_8_2_MV1; cellholds_7_2_MV1; cellholds_6_2_MV1;
+ cellholds_5_2_MV1; cellholds_4_2_MV1; cellholds_3_2_MV1;
+ cellholds_2_2_MV1; cellholds_1_2_MV1
+ };
+ cellholds_x2_3_MV1 {
+ cellholds_8_3_MV1; cellholds_7_3_MV1; cellholds_6_3_MV1;
+ cellholds_5_3_MV1; cellholds_4_3_MV1; cellholds_3_3_MV1;
+ cellholds_2_3_MV1; cellholds_1_3_MV1
+ };
+ cellholds_x2_4_MV1 {
+ cellholds_8_4_MV1; cellholds_7_4_MV1; cellholds_6_4_MV1;
+ cellholds_5_4_MV1; cellholds_4_4_MV1; cellholds_3_4_MV1;
+ cellholds_2_4_MV1; cellholds_1_4_MV1
+ };
+ cellholds_x2_5_MV1 {
+ cellholds_8_5_MV1; cellholds_7_5_MV1; cellholds_6_5_MV1;
+ cellholds_5_5_MV1; cellholds_4_5_MV1; cellholds_3_5_MV1;
+ cellholds_2_5_MV1; cellholds_1_5_MV1
+ };
+ cellholds_x2_6_MV1 {
+ cellholds_8_6_MV1; cellholds_7_6_MV1; cellholds_6_6_MV1;
+ cellholds_5_6_MV1; cellholds_4_6_MV1; cellholds_3_6_MV1;
+ cellholds_2_6_MV1; cellholds_1_6_MV1
+ };
+ cellholds_x2_7_MV1 {
+ cellholds_8_7_MV1; cellholds_7_7_MV1; cellholds_6_7_MV1;
+ cellholds_5_7_MV1; cellholds_4_7_MV1; cellholds_3...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-22 09:04:41
|
Revision: 1377
http://toss.svn.sourceforge.net/toss/?rev=1377&view=rev
Author: lukstafi
Date: 2011-03-22 09:04:34 +0000 (Tue, 22 Mar 2011)
Log Message:
-----------
Possible Solver problem: investigate the test. Generalized monotonicity test.
Modified Paths:
--------------
trunk/Toss/Play/Heuristic.ml
trunk/Toss/Play/HeuristicTest.ml
trunk/Toss/Solver/SolverTest.ml
Modified: trunk/Toss/Play/Heuristic.ml
===================================================================
--- trunk/Toss/Play/Heuristic.ml 2011-03-21 23:38:06 UTC (rev 1376)
+++ trunk/Toss/Play/Heuristic.ml 2011-03-22 09:04:34 UTC (rev 1377)
@@ -971,6 +971,15 @@
FormulaOps.free_vars pre = [] in
let monotonic = !use_monotonic && List.for_all free_pre rules &&
List.for_all DiscreteRule.monotonic drules in
+ (* {{{ log entry *)
+ if !debug_level > 1 then (
+ Printf.printf
+ "default_heuristic_old: monotonic=%b; use_monotonic=%b; \
+ free_pre rules=%b; monotone rules=%b\n%!"
+ monotonic !use_monotonic (List.for_all free_pre rules)
+ (List.for_all DiscreteRule.monotonic drules)
+ );
+ (* }}} *)
let advr =
match advr with Some r -> r | None ->
if monotonic then default_monot_adv_ratio
Modified: trunk/Toss/Play/HeuristicTest.ml
===================================================================
--- trunk/Toss/Play/HeuristicTest.ml 2011-03-21 23:38:06 UTC (rev 1376)
+++ trunk/Toss/Play/HeuristicTest.ml 2011-03-22 09:04:34 UTC (rev 1377)
@@ -307,6 +307,18 @@
));
+ "default_heuristic_old: connect5 of GDL translation" >::
+ (fun () ->
+ let (game,state) =
+ state_of_file "./GGP/tests/connect5-simpl.toss" in
+ let loc_heurs =
+ Heuristic.default_heuristic_old ~struc:state.Arena.struc
+ ~advr:4.0 game in
+ assert_equal ~printer:(fun x->x)
+ "SHOULD GENERATE AS FOR A MONOTONIC GAME"
+ (Formula.sprint_real loc_heurs.(0).(0));
+ );
+
"default_heuristic_old: expansion breakthrough of GDL translation" >::
(fun () ->
let (game,state) =
@@ -432,17 +444,17 @@
]
-let a =
+let a () =
Aux.run_test_if_target "HeuristicTest" tests
-let a =
+let a () =
Aux.run_test_if_target "HeuristicTest" bigtests
-let a () =
+let a =
Heuristic.debug_level := 5
-let a () =
- match test_filter ["Heuristic:10:default_heuristic_old: expansion breakthrough of GDL translation"]
+let a =
+ match test_filter ["Heuristic:10:default_heuristic_old: connect5 of GDL translation"]
tests
with
| Some tests -> ignore (run_test_tt ~verbose:true tests)
Modified: trunk/Toss/Solver/SolverTest.ml
===================================================================
--- trunk/Toss/Solver/SolverTest.ml 2011-03-21 23:38:06 UTC (rev 1376)
+++ trunk/Toss/Solver/SolverTest.ml 2011-03-22 09:04:34 UTC (rev 1377)
@@ -256,6 +256,390 @@
real_val_eq "[ | R { (a, a); (a, b) } | ] "
"Sum (x, y | R (x, y) : 1)" 2.;
);
+
+ "eval: GDL" >::
+ (fun () ->
+ eval_eq
+ "[CONTROL_MV1, CELLHOLDS_8_8_MV1, CELLHOLDS_8_7_MV1, CELLHOLDS_8_6_MV1,
+ CELLHOLDS_8_5_MV1, CELLHOLDS_8_4_MV1, CELLHOLDS_8_3_MV1, CELLHOLDS_8_2_MV1,
+ CELLHOLDS_8_1_MV1, CELLHOLDS_7_8_MV1, CELLHOLDS_7_7_MV1, CELLHOLDS_7_6_MV1,
+ CELLHOLDS_7_5_MV1, CELLHOLDS_7_4_MV1, CELLHOLDS_7_3_MV1, CELLHOLDS_7_2_MV1,
+ CELLHOLDS_7_1_MV1, CELLHOLDS_6_8_MV1, CELLHOLDS_6_7_MV1, CELLHOLDS_6_6_MV1,
+ CELLHOLDS_6_5_MV1, CELLHOLDS_6_4_MV1, CELLHOLDS_6_3_MV1, CELLHOLDS_6_2_MV1,
+ CELLHOLDS_6_1_MV1, CELLHOLDS_5_8_MV1, CELLHOLDS_5_7_MV1, CELLHOLDS_5_6_MV1,
+ CELLHOLDS_5_5_MV1, CELLHOLDS_5_4_MV1, CELLHOLDS_5_3_MV1, CELLHOLDS_5_2_MV1,
+ CELLHOLDS_5_1_MV1, CELLHOLDS_4_8_MV1, CELLHOLDS_4_7_MV1, CELLHOLDS_4_6_MV1,
+ CELLHOLDS_4_5_MV1, CELLHOLDS_4_4_MV1, CELLHOLDS_4_3_MV1, CELLHOLDS_4_2_MV1,
+ CELLHOLDS_4_1_MV1, CELLHOLDS_3_8_MV1, CELLHOLDS_3_7_MV1, CELLHOLDS_3_6_MV1,
+ CELLHOLDS_3_5_MV1, CELLHOLDS_3_4_MV1, CELLHOLDS_3_3_MV1, CELLHOLDS_3_2_MV1,
+ CELLHOLDS_3_1_MV1, CELLHOLDS_2_8_MV1, CELLHOLDS_2_7_MV1, CELLHOLDS_2_6_MV1,
+ CELLHOLDS_2_5_MV1, CELLHOLDS_2_4_MV1, CELLHOLDS_2_3_MV1, CELLHOLDS_2_2_MV1,
+ CELLHOLDS_2_1_MV1, CELLHOLDS_1_8_MV1, CELLHOLDS_1_7_MV1, CELLHOLDS_1_6_MV1,
+ CELLHOLDS_1_5_MV1, CELLHOLDS_1_4_MV1, CELLHOLDS_1_3_MV1, CELLHOLDS_1_2_MV1,
+ CELLHOLDS_1_1_MV1 |
+ CELLHOLDS_1_Y2_MV1 {
+ CELLHOLDS_1_8_MV1; CELLHOLDS_1_7_MV1; CELLHOLDS_1_6_MV1;
+ CELLHOLDS_1_5_MV1; CELLHOLDS_1_4_MV1; CELLHOLDS_1_3_MV1;
+ CELLHOLDS_1_2_MV1; CELLHOLDS_1_1_MV1
+ };
+ CELLHOLDS_2_Y2_MV1 {
+ CELLHOLDS_2_8_MV1; CELLHOLDS_2_7_MV1; CELLHOLDS_2_6_MV1;
+ CELLHOLDS_2_5_MV1; CELLHOLDS_2_4_MV1; CELLHOLDS_2_3_MV1;
+ CELLHOLDS_2_2_MV1; CELLHOLDS_2_1_MV1
+ };
+ CELLHOLDS_3_Y2_MV1 {
+ CELLHOLDS_3_8_MV1; CELLHOLDS_3_7_MV1; CELLHOLDS_3_6_MV1;
+ CELLHOLDS_3_5_MV1; CELLHOLDS_3_4_MV1; CELLHOLDS_3_3_MV1;
+ CELLHOLDS_3_2_MV1; CELLHOLDS_3_1_MV1
+ };
+ CELLHOLDS_4_Y2_MV1 {
+ CELLHOLDS_4_8_MV1; CELLHOLDS_4_7_MV1; CELLHOLDS_4_6_MV1;
+ CELLHOLDS_4_5_MV1; CELLHOLDS_4_4_MV1; CELLHOLDS_4_3_MV1;
+ CELLHOLDS_4_2_MV1; CELLHOLDS_4_1_MV1
+ };
+ CELLHOLDS_5_Y2_MV1 {
+ CELLHOLDS_5_8_MV1; CELLHOLDS_5_7_MV1; CELLHOLDS_5_6_MV1;
+ CELLHOLDS_5_5_MV1; CELLHOLDS_5_4_MV1; CELLHOLDS_5_3_MV1;
+ CELLHOLDS_5_2_MV1; CELLHOLDS_5_1_MV1
+ };
+ CELLHOLDS_6_Y2_MV1 {
+ CELLHOLDS_6_8_MV1; CELLHOLDS_6_7_MV1; CELLHOLDS_6_6_MV1;
+ CELLHOLDS_6_5_MV1; CELLHOLDS_6_4_MV1; CELLHOLDS_6_3_MV1;
+ CELLHOLDS_6_2_MV1; CELLHOLDS_6_1_MV1
+ };
+ CELLHOLDS_7_Y2_MV1 {
+ CELLHOLDS_7_8_MV1; CELLHOLDS_7_7_MV1; CELLHOLDS_7_6_MV1;
+ CELLHOLDS_7_5_MV1; CELLHOLDS_7_4_MV1; CELLHOLDS_7_3_MV1;
+ CELLHOLDS_7_2_MV1; CELLHOLDS_7_1_MV1
+ };
+ CELLHOLDS_8_Y2_MV1 {
+ CELLHOLDS_8_8_MV1; CELLHOLDS_8_7_MV1; CELLHOLDS_8_6_MV1;
+ CELLHOLDS_8_5_MV1; CELLHOLDS_8_4_MV1; CELLHOLDS_8_3_MV1;
+ CELLHOLDS_8_2_MV1; CELLHOLDS_8_1_MV1
+ };
+ CELLHOLDS_X2_1_MV1 {
+ CELLHOLDS_8_1_MV1; CELLHOLDS_7_1_MV1; CELLHOLDS_6_1_MV1;
+ CELLHOLDS_5_1_MV1; CELLHOLDS_4_1_MV1; CELLHOLDS_3_1_MV1;
+ CELLHOLDS_2_1_MV1; CELLHOLDS_1_1_MV1
+ };
+ CELLHOLDS_X2_2_MV1 {
+ CELLHOLDS_8_2_MV1; CELLHOLDS_7_2_MV1; CELLHOLDS_6_2_MV1;
+ CELLHOLDS_5_2_MV1; CELLHOLDS_4_2_MV1; CELLHOLDS_3_2_MV1;
+ CELLHOLDS_2_2_MV1; CELLHOLDS_1_2_MV1
+ };
+ CELLHOLDS_X2_3_MV1 {
+ CELLHOLDS_8_3_MV1; CELLHOLDS_7_3_MV1; CELLHOLDS_6_3_MV1;
+ CELLHOLDS_5_3_MV1; CELLHOLDS_4_3_MV1; CELLHOLDS_3_3_MV1;
+ CELLHOLDS_2_3_MV1; CELLHOLDS_1_3_MV1
+ };
+ CELLHOLDS_X2_4_MV1 {
+ CELLHOLDS_8_4_MV1; CELLHOLDS_7_4_MV1; CELLHOLDS_6_4_MV1;
+ CELLHOLDS_5_4_MV1; CELLHOLDS_4_4_MV1; CELLHOLDS_3_4_MV1;
+ CELLHOLDS_2_4_MV1; CELLHOLDS_1_4_MV1
+ };
+ CELLHOLDS_X2_5_MV1 {
+ CELLHOLDS_8_5_MV1; CELLHOLDS_7_5_MV1; CELLHOLDS_6_5_MV1;
+ CELLHOLDS_5_5_MV1; CELLHOLDS_4_5_MV1; CELLHOLDS_3_5_MV1;
+ CELLHOLDS_2_5_MV1; CELLHOLDS_1_5_MV1
+ };
+ CELLHOLDS_X2_6_MV1 {
+ CELLHOLDS_8_6_MV1; CELLHOLDS_7_6_MV1; CELLHOLDS_6_6_MV1;
+ CELLHOLDS_5_6_MV1; CELLHOLDS_4_6_MV1; CELLHOLDS_3_6_MV1;
+ CELLHOLDS_2_6_MV1; CELLHOLDS_1_6_MV1
+ };
+ CELLHOLDS_X2_7_MV1 {
+ CELLHOLDS_8_7_MV1; CELLHOLDS_7_7_MV1; CELLHOLDS_6_7_MV1;
+ CELLHOLDS_5_7_MV1; CELLHOLDS_4_7_MV1; CELLHOLDS_3_7_MV1;
+ CELLHOLDS_2_7_MV1; CELLHOLDS_1_7_MV1
+ };
+ CELLHOLDS_X2_8_MV1 {
+ CELLHOLDS_8_8_MV1; CELLHOLDS_7_8_MV1; CELLHOLDS_6_8_MV1;
+ CELLHOLDS_5_8_MV1; CELLHOLDS_4_8_MV1; CELLHOLDS_3_8_MV1;
+ CELLHOLDS_2_8_MV1; CELLHOLDS_1_8_MV1
+ };
+ CELLHOLDS_X2_Y2_BLACK {
+ CELLHOLDS_8_8_MV1; CELLHOLDS_7_8_MV1; CELLHOLDS_7_7_MV1;
+ CELLHOLDS_7_6_MV1; CELLHOLDS_6_8_MV1; CELLHOLDS_6_6_MV1;
+ CELLHOLDS_5_8_MV1; CELLHOLDS_5_7_MV1; CELLHOLDS_4_8_MV1;
+ CELLHOLDS_4_7_MV1; CELLHOLDS_3_7_MV1; CELLHOLDS_3_6_MV1;
+ CELLHOLDS_1_8_MV1; CELLHOLDS_1_7_MV1; CELLHOLDS_1_6_MV1;
+ CELLHOLDS_1_5_MV1
+ };
+ CELLHOLDS_X2_Y2_MV1:1 {};
+ CELLHOLDS_X2_Y2_WHITE {
+ CELLHOLDS_8_3_MV1; CELLHOLDS_8_1_MV1; CELLHOLDS_7_4_MV1;
+ CELLHOLDS_7_1_MV1; CELLHOLDS_6_3_MV1; CELLHOLDS_6_1_MV1;
+ CELLHOLDS_5_4_MV1; CELLHOLDS_5_3_MV1; CELLHOLDS_5_1_MV1;
+ CELLHOLDS_4_2_MV1; CELLHOLDS_4_1_MV1; CELLHOLDS_3_2_MV1;
+ CELLHOLDS_2_2_MV1; CELLHOLDS_2_1_MV1; CELLHOLDS_1_3_MV1;
+ CELLHOLDS_1_1_MV1
+ };
+ CONTROL_BLACK (CONTROL_MV1); CONTROL_MV1 (CONTROL_MV1);
+ CONTROL_WHITE:1 {}; INDEX__CELLHOLDS_X2_Y2_MV1_X2:1 {};
+ INDEX__CELLHOLDS_X2_Y2_MV1_Y2:1 {};
+ R {
+ (CELLHOLDS_8_7_MV1, CELLHOLDS_7_8_MV1);
+ (CELLHOLDS_8_6_MV1, CELLHOLDS_7_7_MV1);
+ (CELLHOLDS_8_5_MV1, CELLHOLDS_7_6_MV1);
+ (CELLHOLDS_8_4_MV1, CELLHOLDS_7_5_MV1);
+ (CELLHOLDS_8_3_MV1, CELLHOLDS_7_4_MV1);
+ (CELLHOLDS_8_2_MV1, CELLHOLDS_7_3_MV1);
+ (CELLHOLDS_8_1_MV1, CELLHOLDS_7_2_MV1);
+ (CELLHOLDS_7_7_MV1, CELLHOLDS_6_8_MV1);
+ (CELLHOLDS_7_6_MV1, CELLHOLDS_6_7_MV1);
+ (CELLHOLDS_7_5_MV1, CELLHOLDS_6_6_MV1);
+ (CELLHOLDS_7_4_MV1, CELLHOLDS_6_5_MV1);
+ (CELLHOLDS_7_3_MV1, CELLHOLDS_6_4_MV1);
+ (CELLHOLDS_7_2_MV1, CELLHOLDS_6_3_MV1);
+ (CELLHOLDS_7_1_MV1, CELLHOLDS_6_2_MV1);
+ (CELLHOLDS_6_7_MV1, CELLHOLDS_5_8_MV1);
+ (CELLHOLDS_6_6_MV1, CELLHOLDS_5_7_MV1);
+ (CELLHOLDS_6_5_MV1, CELLHOLDS_5_6_MV1);
+ (CELLHOLDS_6_4_MV1, CELLHOLDS_5_5_MV1);
+ (CELLHOLDS_6_3_MV1, CELLHOLDS_5_4_MV1);
+ (CELLHOLDS_6_2_MV1, CELLHOLDS_5_3_MV1);
+ (CELLHOLDS_6_1_MV1, CELLHOLDS_5_2_MV1);
+ (CELLHOLDS_5_7_MV1, CELLHOLDS_4_8_MV1);
+ (CELLHOLDS_5_6_MV1, CELLHOLDS_4_7_MV1);
+ (CELLHOLDS_5_5_MV1, CELLHOLDS_4_6_MV1);
+ (CELLHOLDS_5_4_MV1, CELLHOLDS_4_5_MV1);
+ (CELLHOLDS_5_3_MV1, CELLHOLDS_4_4_MV1);
+ (CELLHOLDS_5_2_MV1, CELLHOLDS_4_3_MV1);
+ (CELLHOLDS_5_1_MV1, CELLHOLDS_4_2_MV1);
+ (CELLHOLDS_4_7_MV1, CELLHOLDS_3_8_MV1);
+ (CELLHOLDS_4_6_MV1, CELLHOLDS_3_7_MV1);
+ (CELLHOLDS_4_5_MV1, CELLHOLDS_3_6_MV1);
+ (CELLHOLDS_4_4_MV1, CELLHOLDS_3_5_MV1);
+ (CELLHOLDS_4_3_MV1, CELLHOLDS_3_4_MV1);
+ (CELLHOLDS_4_2_MV1, CELLHOLDS_3_3_MV1);
+ (CELLHOLDS_4_1_MV1, CELLHOLDS_3_2_MV1);
+ (CELLHOLDS_3_7_MV1, CELLHOLDS_2_8_MV1);
+ (CELLHOLDS_3_6_MV1, CELLHOLDS_2_7_MV1);
+ (CELLHOLDS_3_5_MV1, CELLHOLDS_2_6_MV1);
+ (CELLHOLDS_3_4_MV1, CELLHOLDS_2_5_MV1);
+ (CELLHOLDS_3_3_MV1, CELLHOLDS_2_4_MV1);
+ (CELLHOLDS_3_2_MV1, CELLHOLDS_2_3_MV1);
+ (CELLHOLDS_3_1_MV1, CELLHOLDS_2_2_MV1);
+ (CELLHOLDS_2_7_MV1, CELLHOLDS_1_8_MV1);
+ (CELLHOLDS_2_6_MV1, CELLHOLDS_1_7_MV1);
+ (CELLHOLDS_2_5_MV1, CELLHOLDS_1_6_MV1);
+ (CELLHOLDS_2_4_MV1, CELLHOLDS_1_5_MV1);
+ (CELLHOLDS_2_3_MV1, CELLHOLDS_1_4_MV1);
+ (CELLHOLDS_2_2_MV1, CELLHOLDS_1_3_MV1);
+ (CELLHOLDS_2_1_MV1, CELLHOLDS_1_2_MV1)
+ };
+ R0 {
+ (CELLHOLDS_7_7_MV1, CELLHOLDS_8_8_MV1);
+ (CELLHOLDS_7_6_MV1, CELLHOLDS_8_7_MV1);
+ (CELLHOLDS_7_5_MV1, CELLHOLDS_8_6_MV1);
+ (CELLHOLDS_7_4_MV1, CELLHOLDS_8_5_MV1);
+ (CELLHOLDS_7_3_MV1, CELLHOLDS_8_4_MV1);
+ (CELLHOLDS_7_2_MV1, CELLHOLDS_8_3_MV1);
+ (CELLHOLDS_7_1_MV1, CELLHOLDS_8_2_MV1);
+ (CELLHOLDS_6_7_MV1, CELLHOLDS_7_8_MV1);
+ (CELLHOLDS_6_6_MV1, CELLHOLDS_7_7_MV1);
+ (CELLHOLDS_6_5_MV1, CELLHOLDS_7_6_MV1);
+ (CELLHOLDS_6_4_MV1, CELLHOLDS_7_5_MV1);
+ (CELLHOLDS_6_3_MV1, CELLHOLDS_7_4_MV1);
+ (CELLHOLDS_6_2_MV1, CELLHOLDS_7_3_MV1);
+ (CELLHOLDS_6_1_MV1, CELLHOLDS_7_2_MV1);
+ (CELLHOLDS_5_7_MV1, CELLHOLDS_6_8_MV1);
+ (CELLHOLDS_5_6_MV1, CELLHOLDS_6_7_MV1);
+ (CELLHOLDS_5_5_MV1, CELLHOLDS_6_6_MV1);
+ (CELLHOLDS_5_4_MV1, CELLHOLDS_6_5_MV1);
+ (CELLHOLDS_5_3_MV1, CELLHOLDS_6_4_MV1);
+ (CELLHOLDS_5_2_MV1, CELLHOLDS_6_3_MV1);
+ (CELLHOLDS_5_1_MV1, CELLHOLDS_6_2_MV1);
+ (CELLHOLDS_4_7_MV1, CELLHOLDS_5_8_MV1);
+ (CELLHOLDS_4_6_MV1, CELLHOLDS_5_7_MV1);
+ (CELLHOLDS_4_5_MV1, CELLHOLDS_5_6_MV1);
+ (CELLHOLDS_4_4_MV1, CELLHOLDS_5_5_MV1);
+ (CELLHOLDS_4_3_MV1, CELLHOLDS_5_4_MV1);
+ (CELLHOLDS_4_2_MV1, CELLHOLDS_5_3_MV1);
+ (CELLHOLDS_4_1_MV1, CELLHOLDS_5_2_MV1);
+ (CELLHOLDS_3_7_MV1, CELLHOLDS_4_8_MV1);
+ (CELLHOLDS_3_6_MV1, CELLHOLDS_4_7_MV1);
+ (CELLHOLDS_3_5_MV1, CELLHOLDS_4_6_MV1);
+ (CELLHOLDS_3_4_MV1, CELLHOLDS_4_5_MV1);
+ (CELLHOLDS_3_3_MV1, CELLHOLDS_4_4_MV1);
+ (CELLHOLDS_3_2_MV1, CELLHOLDS_4_3_MV1);
+ (CELLHOLDS_3_1_MV1, CELLHOLDS_4_2_MV1);
+ (CELLHOLDS_2_7_MV1, CELLHOLDS_3_8_MV1);
+ (CELLHOLDS_2_6_MV1, CELLHOLDS_3_7_MV1);
+ (CELLHOLDS_2_5_MV1, CELLHOLDS_3_6_MV1);
+ (CELLHOLDS_2_4_MV1, CELLHOLDS_3_5_MV1);
+ (CELLHOLDS_2_3_MV1, CELLHOLDS_3_4_MV1);
+ (CELLHOLDS_2_2_MV1, CELLHOLDS_3_3_MV1);
+ (CELLHOLDS_2_1_MV1, CELLHOLDS_3_2_MV1);
+ (CELLHOLDS_1_7_MV1, CELLHOLDS_2_8_MV1);
+ (CELLHOLDS_1_6_MV1, CELLHOLDS_2_7_MV1);
+ (CELLHOLDS_1_5_MV1, CELLHOLDS_2_6_MV1);
+ (CELLHOLDS_1_4_MV1, CELLHOLDS_2_5_MV1);
+ (CELLHOLDS_1_3_MV1, CELLHOLDS_2_4_MV1);
+ (CELLHOLDS_1_2_MV1, CELLHOLDS_2_3_MV1);
+ (CELLHOLDS_1_1_MV1, CELLHOLDS_2_2_MV1)
+ };
+ R1 {
+ (CELLHOLDS_8_7_MV1, CELLHOLDS_8_8_MV1);
+ (CELLHOLDS_8_6_MV1, CELLHOLDS_8_7_MV1);
+ (CELLHOLDS_8_5_MV1, CELLHOLDS_8_6_MV1);
+ (CELLHOLDS_8_4_MV1, CELLHOLDS_8_5_MV1);
+ (CELLHOLDS_8_3_MV1, CELLHOLDS_8_4_MV1);
+ (CELLHOLDS_8_2_MV1, CELLHOLDS_8_3_MV1);
+ (CELLHOLDS_8_1_MV1, CELLHOLDS_8_2_MV1);
+ (CELLHOLDS_7_7_MV1, CELLHOLDS_7_8_MV1);
+ (CELLHOLDS_7_6_MV1, CELLHOLDS_7_7_MV1);
+ (CELLHOLDS_7_5_MV1, CELLHOLDS_7_6_MV1);
+ (CELLHOLDS_7_4_MV1, CELLHOLDS_7_5_MV1);
+ (CELLHOLDS_7_3_MV1, CELLHOLDS_7_4_MV1);
+ (CELLHOLDS_7_2_MV1, CELLHOLDS_7_3_MV1);
+ (CELLHOLDS_7_1_MV1, CELLHOLDS_7_2_MV1);
+ (CELLHOLDS_6_7_MV1, CELLHOLDS_6_8_MV1);
+ (CELLHOLDS_6_6_MV1, CELLHOLDS_6_7_MV1);
+ (CELLHOLDS_6_5_MV1, CELLHOLDS_6_6_MV1);
+ (CELLHOLDS_6_4_MV1, CELLHOLDS_6_5_MV1);
+ (CELLHOLDS_6_3_MV1, CELLHOLDS_6_4_MV1);
+ (CELLHOLDS_6_2_MV1, CELLHOLDS_6_3_MV1);
+ (CELLHOLDS_6_1_MV1, CELLHOLDS_6_2_MV1);
+ (CELLHOLDS_5_7_MV1, CELLHOLDS_5_8_MV1);
+ (CELLHOLDS_5_6_MV1, CELLHOLDS_5_7_MV1);
+ (CELLHOLDS_5_5_MV1, CELLHOLDS_5_6_MV1);
+ (CELLHOLDS_5_4_MV1, CELLHOLDS_5_5_MV1);
+ (CELLHOLDS_5_3_MV1, CELLHOLDS_5_4_MV1);
+ (CELLHOLDS_5_2_MV1, CELLHOLDS_5_3_MV1);
+ (CELLHOLDS_5_1_MV1, CELLHOLDS_5_2_MV1);
+ (CELLHOLDS_4_7_MV1, CELLHOLDS_4_8_MV1);
+ (CELLHOLDS_4_6_MV1, CELLHOLDS_4_7_MV1);
+ (CELLHOLDS_4_5_MV1, CELLHOLDS_4_6_MV1);
+ (CELLHOLDS_4_4_MV1, CELLHOLDS_4_5_MV1);
+ (CELLHOLDS_4_3_MV1, CELLHOLDS_4_4_MV1);
+ (CELLHOLDS_4_2_MV1, CELLHOLDS_4_3_MV1);
+ (CELLHOLDS_4_1_MV1, CELLHOLDS_4_2_MV1);
+ (CELLHOLDS_3_7_MV1, CELLHOLDS_3_8_MV1);
+ (CELLHOLDS_3_6_MV1, CELLHOLDS_3_7_MV1);
+ (CELLHOLDS_3_5_MV1, CELLHOLDS_3_6_MV1);
+ (CELLHOLDS_3_4_MV1, CELLHOLDS_3_5_MV1);
+ (CELLHOLDS_3_3_MV1, CELLHOLDS_3_4_MV1);
+ (CELLHOLDS_3_2_MV1, CELLHOLDS_3_3_MV1);
+ (CELLHOLDS_3_1_MV1, CELLHOLDS_3_2_MV1);
+ (CELLHOLDS_2_7_MV1, CELLHOLDS_2_8_MV1);
+ (CELLHOLDS_2_6_MV1, CELLHOLDS_2_7_MV1);
+ (CELLHOLDS_2_5_MV1, CELLHOLDS_2_6_MV1);
+ (CELLHOLDS_2_4_MV1, CELLHOLDS_2_5_MV1);
+ (CELLHOLDS_2_3_MV1, CELLHOLDS_2_4_MV1);
+ (CELLHOLDS_2_2_MV1, CELLHOLDS_2_3_MV1);
+ (CELLHOLDS_2_1_MV1, CELLHOLDS_2_2_MV1);
+ (CELLHOLDS_1_7_MV1, CELLHOLDS_1_8_MV1);
+ (CELLHOLDS_1_6_MV1, CELLHOLDS_1_7_MV1);
+ (CELLHOLDS_1_5_MV1, CELLHOLDS_1_6_MV1);
+ (CELLHOLDS_1_4_MV1, CELLHOLDS_1_5_MV1);
+ (CELLHOLDS_1_3_MV1, CELLHOLDS_1_4_MV1);
+ (CELLHOLDS_1_2_MV1, CELLHOLDS_1_3_MV1);
+ (CELLHOLDS_1_1_MV1, CELLHOLDS_1_2_MV1)
+ };
+ R2 {
+ (CELLHOLDS_8_8_MV1, CELLHOLDS_8_7_MV1);
+ (CELLHOLDS_8_7_MV1, CELLHOLDS_8_6_MV1);
+ (CELLHOLDS_8_6_MV1, CELLHOLDS_8_5_MV1);
+ (CELLHOLDS_8_5_MV1, CELLHOLDS_8_4_MV1);
+ (CELLHOLDS_8_4_MV1, CELLHOLDS_8_3_MV1);
+ (CELLHOLDS_8_3_MV1, CELLHOLDS_8_2_MV1);
+ (CELLHOLDS_8_2_MV1, CELLHOLDS_8_1_MV1);
+ (CELLHOLDS_7_8_MV1, CELLHOLDS_7_7_MV1);
+ (CELLHOLDS_7_7_MV1, CELLHOLDS_7_6_MV1);
+ (CELLHOLDS_7_6_MV1, CELLHOLDS_7_5_MV1);
+ (CELLHOLDS_7_5_MV1, CELLHOLDS_7_4_MV1);
+ (CELLHOLDS_7_4_MV1, CELLHOLDS_7_3_MV1);
+ (CELLHOLDS_7_3_MV1, CELLHOLDS_7_2_MV1);
+ (CELLHOLDS_7_2_MV1, CELLHOLDS_7_1_MV1);
+ (CELLHOLDS_6_8_MV1, CELLHOLDS_6_7_MV1);
+ (CELLHOLDS_6_7_MV1, CELLHOLDS_6_6_MV1);
+ (CELLHOLDS_6_6_MV1, CELLHOLDS_6_5_MV1);
+ (CELLHOLDS_6_5_MV1, CELLHOLDS_6_4_MV1);
+ (CELLHOLDS_6_4_MV1, CELLHOLDS_6_3_MV1);
+ (CELLHOLDS_6_3_MV1, CELLHOLDS_6_2_MV1);
+ (CELLHOLDS_6_2_MV1, CELLHOLDS_6_1_MV1);
+ (CELLHOLDS_5_8_MV1, CELLHOLDS_5_7_MV1);
+ (CELLHOLDS_5_7_MV1, CELLHOLDS_5_6_MV1);
+ (CELLHOLDS_5_6_MV1, CELLHOLDS_5_5_MV1);
+ (CELLHOLDS_5_5_MV1, CELLHOLDS_5_4_MV1);
+ (CELLHOLDS_5_4_MV1, CELLHOLDS_5_3_MV1);
+ (CELLHOLDS_5_3_MV1, CELLHOLDS_5_2_MV1);
+ (CELLHOLDS_5_2_MV1, CELLHOLDS_5_1_MV1);
+ (CELLHOLDS_4_8_MV1, CELLHOLDS_4_7_MV1);
+ (CELLHOLDS_4_7_MV1, CELLHOLDS_4_6_MV1);
+ (CELLHOLDS_4_6_MV1, CELLHOLDS_4_5_MV1);
+ (CELLHOLDS_4_5_MV1, CELLHOLDS_4_4_MV1);
+ (CELLHOLDS_4_4_MV1, CELLHOLDS_4_3_MV1);
+ (CELLHOLDS_4_3_MV1, CELLHOLDS_4_2_MV1);
+ (CELLHOLDS_4_2_MV1, CELLHOLDS_4_1_MV1);
+ (CELLHOLDS_3_8_MV1, CELLHOLDS_3_7_MV1);
+ (CELLHOLDS_3_7_MV1, CELLHOLDS_3_6_MV1);
+ (CELLHOLDS_3_6_MV1, CELLHOLDS_3_5_MV1);
+ (CELLHOLDS_3_5_MV1, CELLHOLDS_3_4_MV1);
+ (CELLHOLDS_3_4_MV1, CELLHOLDS_3_3_MV1);
+ (CELLHOLDS_3_3_MV1, CELLHOLDS_3_2_MV1);
+ (CELLHOLDS_3_2_MV1, CELLHOLDS_3_1_MV1);
+ (CELLHOLDS_2_8_MV1, CELLHOLDS_2_7_MV1);
+ (CELLHOLDS_2_7_MV1, CELLHOLDS_2_6_MV1);
+ (CELLHOLDS_2_6_MV1, CELLHOLDS_2_5_MV1);
+ (CELLHOLDS_2_5_MV1, CELLHOLDS_2_4_MV1);
+ (CELLHOLDS_2_4_MV1, CELLHOLDS_2_3_MV1);
+ (CELLHOLDS_2_3_MV1, CELLHOLDS_2_2_MV1);
+ (CELLHOLDS_2_2_MV1, CELLHOLDS_2_1_MV1);
+ (CELLHOLDS_1_8_MV1, CELLHOLDS_1_7_MV1);
+ (CELLHOLDS_1_7_MV1, CELLHOLDS_1_6_MV1);
+ (CELLHOLDS_1_6_MV1, CELLHOLDS_1_5_MV1);
+ (CELLHOLDS_1_5_MV1, CELLHOLDS_1_4_MV1);
+ (CELLHOLDS_1_4_MV1, CELLHOLDS_1_3_MV1);
+ (CELLHOLDS_1_3_MV1, CELLHOLDS_1_2_MV1);
+ (CELLHOLDS_1_2_MV1, CELLHOLDS_1_1_MV1)
+ };
+ _del_CELLHOLDS_X2_Y2_WHITE (CELLHOLDS_8_2_MV1);
+ _del_CONTROL_WHITE (CONTROL_MV1);
+ _new_CELLHOLDS_X2_Y2_WHITE (CELLHOLDS_8_3_MV1);
+ _new_CONTROL_BLACK (CONTROL_MV1); init__CELLHOLDS_X2_Y2_MV1_X2:1 {};
+ init__CELLHOLDS_X2_Y2_MV1_Y2:1 {}; role__CELLHOLDS_X2_Y2_MV1_X2:1 {};
+ role__CELLHOLDS_X2_Y2_MV1_Y2:1 {}
+ |
+]"
+ "(CELLHOLDS_X2_6_MV1(cellholds_x2_y2__blank_) and
+ CELLHOLDS_X2_6_MV1(cellholds_x2_y2__blank_) and
+ CELLHOLDS_4_Y2_MV1(cellholds_x2_y2__blank_) and
+ CELLHOLDS_4_Y2_MV1(cellholds_x2_y2__blank_) and
+ CELLHOLDS_X2_7_MV1(cellholds_x1_y1__blank_) and
+ CELLHOLDS_X2_7_MV1(cellholds_x1_y1__blank_) and
+ CELLHOLDS_3_Y2_MV1(cellholds_x1_y1__blank_) and
+ CELLHOLDS_3_Y2_MV1(cellholds_x1_y1__blank_) and
+ R(cellholds_x1_y1__blank_, cellholds_x2_y2__blank_) and
+ CONTROL_BLACK(control__blank_) and
+ CELLHOLDS_X2_Y2_BLACK(cellholds_x1_y1__blank_) and
+ not CONTROL_MV1(cellholds_x1_y1__blank_) and
+ not CONTROL_MV1(cellholds_x2_y2__blank_) and
+ not CELLHOLDS_X2_Y2_BLACK(cellholds_x2_y2__blank_) and
+ not CONTROL_WHITE(control__blank_) and
+ not cellholds_x1_y1__blank_ = cellholds_x2_y2__blank_ and
+ not cellholds_x1_y1__blank_ = control__blank_ and
+ not cellholds_x2_y2__blank_ = control__blank_ and
+ not
+ ex cellholds_x374_8__blank_
+ (CELLHOLDS_X2_8_MV1(cellholds_x374_8__blank_) and
+ not CONTROL_MV1(cellholds_x374_8__blank_) and
+ CELLHOLDS_X2_Y2_WHITE(cellholds_x374_8__blank_)) and
+ ex cellholds_x375_y368__blank_
+ (CELLHOLDS_X2_Y2_BLACK(cellholds_x375_y368__blank_) and
+ not CONTROL_MV1(cellholds_x375_y368__blank_)) and
+ not
+ ex cellholds_x376_1__blank_
+ (CELLHOLDS_X2_1_MV1(cellholds_x376_1__blank_) and
+ not CONTROL_MV1(cellholds_x376_1__blank_) and
+ CELLHOLDS_X2_Y2_BLACK(cellholds_x376_1__blank_)) and
+ ex cellholds_x377_y369__blank_
+ (CELLHOLDS_X2_Y2_WHITE(cellholds_x377_y369__blank_) and
+ not CONTROL_MV1(cellholds_x377_y369__blank_)))"
+ "{ cellholds_x1_y1__blank_->42{ cellholds_x2_y2__blank_->35 } }";
+ );
+
] ;;
let a =
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-22 18:23:01
|
Revision: 1378
http://toss.svn.sourceforge.net/toss/?rev=1378&view=rev
Author: lukaszkaiser
Date: 2011-03-22 18:22:54 +0000 (Tue, 22 Mar 2011)
Log Message:
-----------
Extending real expr simplification to rename sum-variables.
Modified Paths:
--------------
trunk/Toss/Formula/FormulaOps.ml
trunk/Toss/Formula/FormulaOps.mli
trunk/Toss/Formula/FormulaOpsTest.ml
trunk/Toss/Solver/SolverTest.ml
trunk/Toss/WebClient/Login.js
trunk/Toss/WebClient/index.html
trunk/Toss/www/xsl/include/common.xsl
Modified: trunk/Toss/Formula/FormulaOps.ml
===================================================================
--- trunk/Toss/Formula/FormulaOps.ml 2011-03-22 09:04:34 UTC (rev 1377)
+++ trunk/Toss/Formula/FormulaOps.ml 2011-03-22 18:22:54 UTC (rev 1378)
@@ -29,6 +29,7 @@
match psi with
Rel _ | Eq _ | In _ | RealExpr _ as atom -> if neg then Not atom else atom
| Not phi -> if neg then nnf ~neg:false phi else nnf ~neg:true phi
+ | And [f] | Or [f] -> nnf ~neg f
| And (flist) when neg -> Or (List.map (nnf ~neg:true) flist)
| And (flist) -> And (List.map (nnf ~neg:false) flist)
| Or (flist) when neg -> And (List.map (nnf ~neg:true) flist)
@@ -320,7 +321,8 @@
| Sum (vs, phi, r) ->
let in_vs (s, _) = List.exists (fun v -> var_str v = s) vs in
let new_vs = List.filter (fun x -> not (in_vs x)) subst in
- if new_vs = [] then Sum(vs, phi, r) else Sum(vs, subst_vars new_vs phi, r)
+ if new_vs = [] then Sum(vs, phi, r) else
+ Sum(vs, subst_vars new_vs phi, subst_vars_expr new_vs r)
(* Helper function: strip digits from string end except if it starts with one. *)
let rec strip_digits s =
@@ -675,7 +677,7 @@
(* Recursively simplify a formula *)
-let rec simplify ?(do_pnf=false) ?(do_re=true) phi =
+let rec simplify ?(do_pnf=false) ?(do_re=true) ?(ni=0) phi =
let do_simplify phi =
let (ids, rev_ids, free_id) = (Hashtbl.create 7, Hashtbl.create 7, ref 1) in
let boolean_phi = BoolFormula.bool_formula_of_formula_arg phi (ids, rev_ids, free_id) in
@@ -687,7 +689,7 @@
Rel _ | Eq _ | In _ as atom -> atom
| RealExpr (re, sgn) as rx ->
if do_re then
- RealExpr (simplify_re ~do_pnf ~do_formula:true re, sgn)
+ RealExpr (simplify_re ~do_pnf ~do_formula:true ~ni re, sgn)
else rx
| Not psi -> do_simplify (Not (simplify_subformulas psi))
| And (flist) -> do_simplify (And (List.rev_map simplify_subformulas flist))
@@ -719,15 +721,34 @@
) else
simplified_prenex_phi
-and simplify_re ?(do_pnf=false) ?(do_formula=true) = function
+and simplify_re ?(do_pnf=false) ?(do_formula=true) ?(ni=0) = function
| RVar _ | Const _ | Fun _ as atom -> atom
| Char phi ->
- if do_formula then Char (simplify ~do_pnf ~do_re:true phi) else Char phi
+ let name_i = ref ni in
+ let namef () = incr name_i; string_of_int !name_i in
+ let subst_l l = List.map (fun v -> (var_str v, "fo__cx_" ^ namef())) l in
+ let get_fo sl = List.map (fun (_, v) -> var_of_string v) sl in
+ let new_phi = match nnf phi with
+ | Ex (x, f) when List.for_all is_fo x ->
+ let sl = subst_l x in Ex (get_fo sl, subst_vars sl f)
+ | All (x, f) when List.for_all is_fo x ->
+ let sl = subst_l x in All (get_fo sl, subst_vars sl f)
+ | psi -> print_endline ("PSi: " ^ (Formula.str psi)); psi in
+ if do_formula then
+ Char (simplify ~do_pnf ~do_re:true ~ni new_phi)
+ else Char new_phi
| Sum (l, phi, re) ->
- let re_simp = simplify_re ~do_pnf ~do_formula re in
- if do_formula then
- Sum (l, simplify ~do_pnf ~do_re:true phi, re_simp)
- else Sum (l, phi, re_simp)
+ let name_i = ref ni in
+ let namef () = incr name_i; string_of_int !name_i in
+ let subst_l = List.map (fun v -> (var_str v, "fo__sx_" ^ namef())) l in
+ let new_re = subst_vars_expr subst_l re in
+ let re_simp = simplify_re ~do_pnf ~do_formula ~ni:!name_i new_re in
+ let new_phi = subst_vars subst_l phi in
+ let phi_simp =
+ if do_formula then simplify ~do_pnf ~do_re:true ~ni:!name_i new_phi else
+ new_phi in
+ Sum (List.map (fun (_, v) -> fo_var_of_string v) subst_l,
+ phi_simp, re_simp)
| Plus _ | Times (Const _, _) | Times (_, Const _) as x ->
let rec get_linear = function
| Plus (p, q) -> List.rev_append (get_linear p) (get_linear q)
@@ -743,18 +764,21 @@
| (c, x) :: ls when c = 0. -> collect_linear ls
| (c, x) :: (d, y) :: ls when x = y ->
collect_linear ((c +. d, x) :: ls)
- | x :: y :: ls -> Plus (one x, collect_linear (y :: ls)) in
+ | x :: y :: ls ->
+ let rest = collect_linear (y :: ls) in
+ if one x = Const 0. then rest else if rest = Const 0. then one x else
+ Plus (one x, rest) in
let l = get_linear x in
let cmp (c, x) (d, y) =
let x = Pervasives.compare x y in
if x <> 0 then x else if c > d then 1 else if d > c then -1 else 0 in
- let s = List.map (fun (c, r) -> (c, simplify_re ~do_pnf ~do_formula r)) l in
+ let s = List.map (fun (c,r)->(c,simplify_re ~do_pnf ~do_formula ~ni r)) l in
collect_linear (List.sort cmp s)
| Times (p, q) ->
- let simp_p = simplify_re ~do_pnf ~do_formula p in
- let simp_q = simplify_re ~do_pnf ~do_formula q in
+ let simp_p = simplify_re ~do_pnf ~do_formula ~ni p in
+ let simp_q = simplify_re ~do_pnf ~do_formula ~ni q in
if simp_p = p && simp_q = q then Times (p, q) else
- simplify_re ~do_pnf ~do_formula (Times (simp_p, simp_q))
+ simplify_re ~do_pnf ~do_formula ~ni (Times (simp_p, simp_q))
(* Flatten "and"s and "or"s in a formula --
Modified: trunk/Toss/Formula/FormulaOps.mli
===================================================================
--- trunk/Toss/Formula/FormulaOps.mli 2011-03-22 09:04:34 UTC (rev 1377)
+++ trunk/Toss/Formula/FormulaOps.mli 2011-03-22 18:22:54 UTC (rev 1378)
@@ -113,10 +113,11 @@
(** {2 Simplification} *)
(** Recursively simplify a formula *)
-val simplify : ?do_pnf : bool -> ?do_re : bool -> formula -> formula
+val simplify : ?do_pnf : bool -> ?do_re : bool -> ?ni:int -> formula -> formula
(** Recursively simplify a real expr *)
-val simplify_re : ?do_pnf: bool -> ?do_formula: bool -> real_expr -> real_expr
+val simplify_re : ?do_pnf: bool -> ?do_formula: bool -> ?ni:int ->
+ real_expr -> real_expr
val pnf : formula -> formula
Modified: trunk/Toss/Formula/FormulaOpsTest.ml
===================================================================
--- trunk/Toss/Formula/FormulaOpsTest.ml 2011-03-22 09:04:34 UTC (rev 1377)
+++ trunk/Toss/Formula/FormulaOpsTest.ml 2011-03-22 18:22:54 UTC (rev 1378)
@@ -252,6 +252,10 @@
simp_eq ":f(x) + 3 * :f(x)" "4 * :f(x)";
simp_eq " 3 + 4 * 5 - 12" "11";
simp_eq ":(ex x R(x)) - :(ex x R(x))" "0";
+ simp_eq ":(ex x P(x)) - :(ex y P(y))" "0";
+ simp_eq "Sum (x | P(x) : :f(x)) - Sum (y | P(y) : :f(y))" "0";
+ simp_eq ("Sum (x | P(x) : Sum (y | Q(y) : :f(x)))" ^
+ "- Sum (y | P(y) : Sum (z | Q(z) : :f(y)))") "0";
);
"prenex" >::
Modified: trunk/Toss/Solver/SolverTest.ml
===================================================================
--- trunk/Toss/Solver/SolverTest.ml 2011-03-22 09:04:34 UTC (rev 1377)
+++ trunk/Toss/Solver/SolverTest.ml 2011-03-22 18:22:54 UTC (rev 1378)
@@ -259,385 +259,360 @@
"eval: GDL" >::
(fun () ->
+ Solver.set_debug_level 2;
eval_eq
- "[CONTROL_MV1, CELLHOLDS_8_8_MV1, CELLHOLDS_8_7_MV1, CELLHOLDS_8_6_MV1,
- CELLHOLDS_8_5_MV1, CELLHOLDS_8_4_MV1, CELLHOLDS_8_3_MV1, CELLHOLDS_8_2_MV1,
- CELLHOLDS_8_1_MV1, CELLHOLDS_7_8_MV1, CELLHOLDS_7_7_MV1, CELLHOLDS_7_6_MV1,
- CELLHOLDS_7_5_MV1, CELLHOLDS_7_4_MV1, CELLHOLDS_7_3_MV1, CELLHOLDS_7_2_MV1,
- CELLHOLDS_7_1_MV1, CELLHOLDS_6_8_MV1, CELLHOLDS_6_7_MV1, CELLHOLDS_6_6_MV1,
- CELLHOLDS_6_5_MV1, CELLHOLDS_6_4_MV1, CELLHOLDS_6_3_MV1, CELLHOLDS_6_2_MV1,
- CELLHOLDS_6_1_MV1, CELLHOLDS_5_8_MV1, CELLHOLDS_5_7_MV1, CELLHOLDS_5_6_MV1,
- CELLHOLDS_5_5_MV1, CELLHOLDS_5_4_MV1, CELLHOLDS_5_3_MV1, CELLHOLDS_5_2_MV1,
- CELLHOLDS_5_1_MV1, CELLHOLDS_4_8_MV1, CELLHOLDS_4_7_MV1, CELLHOLDS_4_6_MV1,
- CELLHOLDS_4_5_MV1, CELLHOLDS_4_4_MV1, CELLHOLDS_4_3_MV1, CELLHOLDS_4_2_MV1,
- CELLHOLDS_4_1_MV1, CELLHOLDS_3_8_MV1, CELLHOLDS_3_7_MV1, CELLHOLDS_3_6_MV1,
- CELLHOLDS_3_5_MV1, CELLHOLDS_3_4_MV1, CELLHOLDS_3_3_MV1, CELLHOLDS_3_2_MV1,
- CELLHOLDS_3_1_MV1, CELLHOLDS_2_8_MV1, CELLHOLDS_2_7_MV1, CELLHOLDS_2_6_MV1,
- CELLHOLDS_2_5_MV1, CELLHOLDS_2_4_MV1, CELLHOLDS_2_3_MV1, CELLHOLDS_2_2_MV1,
- CELLHOLDS_2_1_MV1, CELLHOLDS_1_8_MV1, CELLHOLDS_1_7_MV1, CELLHOLDS_1_6_MV1,
- CELLHOLDS_1_5_MV1, CELLHOLDS_1_4_MV1, CELLHOLDS_1_3_MV1, CELLHOLDS_1_2_MV1,
- CELLHOLDS_1_1_MV1 |
- CELLHOLDS_1_Y2_MV1 {
- CELLHOLDS_1_8_MV1; CELLHOLDS_1_7_MV1; CELLHOLDS_1_6_MV1;
- CELLHOLDS_1_5_MV1; CELLHOLDS_1_4_MV1; CELLHOLDS_1_3_MV1;
- CELLHOLDS_1_2_MV1; CELLHOLDS_1_1_MV1
+ "[CONTROL, C8_8, C8_7, C8_6,
+ C8_5, C8_4, C8_3, C8_2,
+ C8_1, C7_8, C7_7, C7_6,
+ C7_5, C7_4, C7_3, C7_2,
+ C7_1, C6_8, C6_7, C6_6,
+ C6_5, C6_4, C6_3, C6_2,
+ C6_1, C5_8, C5_7, C5_6,
+ C5_5, C5_4, C5_3, C5_2,
+ C5_1, C4_8, C4_7, C4_6,
+ C4_5, C4_4, C4_3, C4_2,
+ C4_1, C3_8, C3_7, C3_6,
+ C3_5, C3_4, C3_3, C3_2,
+ C3_1, C2_8, C2_7, C2_6,
+ C2_5, C2_4, C2_3, C2_2,
+ C2_1, C1_8, C1_7, C1_6,
+ C1_5, C1_4, C1_3, C1_2,
+ C1_1 |
+ C1_Y2 {
+ C1_8; C1_7; C1_6;
+ C1_5; C1_4; C1_3;
+ C1_2; C1_1
};
- CELLHOLDS_2_Y2_MV1 {
- CELLHOLDS_2_8_MV1; CELLHOLDS_2_7_MV1; CELLHOLDS_2_6_MV1;
- CELLHOLDS_2_5_MV1; CELLHOLDS_2_4_MV1; CELLHOLDS_2_3_MV1;
- CELLHOLDS_2_2_MV1; CELLHOLDS_2_1_MV1
+ C2_Y2 {
+ C2_8; C2_7; C2_6;
+ C2_5; C2_4; C2_3;
+ C2_2; C2_1
};
- CELLHOLDS_3_Y2_MV1 {
- CELLHOLDS_3_8_MV1; CELLHOLDS_3_7_MV1; CELLHOLDS_3_6_MV1;
- CELLHOLDS_3_5_MV1; CELLHOLDS_3_4_MV1; CELLHOLDS_3_3_MV1;
- CELLHOLDS_3_2_MV1; CELLHOLDS_3_1_MV1
+ C3_Y2 {
+ C3_8; C3_7; C3_6;
+ C3_5; C3_4; C3_3;
+ C3_2; C3_1
};
- CELLHOLDS_4_Y2_MV1 {
- CELLHOLDS_4_8_MV1; CELLHOLDS_4_7_MV1; CELLHOLDS_4_6_MV1;
- CELLHOLDS_4_5_MV1; CELLHOLDS_4_4_MV1; CELLHOLDS_4_3_MV1;
- CELLHOLDS_4_2_MV1; CELLHOLDS_4_1_MV1
+ C4_Y2 {
+ C4_8; C4_7; C4_6;
+ C4_5; C4_4; C4_3;
+ C4_2; C4_1
};
- CELLHOLDS_5_Y2_MV1 {
- CELLHOLDS_5_8_MV1; CELLHOLDS_5_7_MV1; CELLHOLDS_5_6_MV1;
- CELLHOLDS_5_5_MV1; CELLHOLDS_5_4_MV1; CELLHOLDS_5_3_MV1;
- CELLHOLDS_5_2_MV1; CELLHOLDS_5_1_MV1
+ C5_Y2 {
+ C5_8; C5_7; C5_6;
+ C5_5; C5_4; C5_3;
+ C5_2; C5_1
};
- CELLHOLDS_6_Y2_MV1 {
- CELLHOLDS_6_8_MV1; CELLHOLDS_6_7_MV1; CELLHOLDS_6_6_MV1;
- CELLHOLDS_6_5_MV1; CELLHOLDS_6_4_MV1; CELLHOLDS_6_3_MV1;
- CELLHOLDS_6_2_MV1; CELLHOLDS_6_1_MV1
+ C6_Y2 {
+ C6_8; C6_7; C6_6;
+ C6_5; C6_4; C6_3;
+ C6_2; C6_1
};
- CELLHOLDS_7_Y2_MV1 {
- CELLHOLDS_7_8_MV1; CELLHOLDS_7_7_MV1; CELLHOLDS_7_6_MV1;
- CELLHOLDS_7_5_MV1; CELLHOLDS_7_4_MV1; CELLHOLDS_7_3_MV1;
- CELLHOLDS_7_2_MV1; CELLHOLDS_7_1_MV1
+ C7_Y2 {
+ C7_8; C7_7; C7_6;
+ C7_5; C7_4; C7_3;
+ C7_2; C7_1
};
- CELLHOLDS_8_Y2_MV1 {
- CELLHOLDS_8_8_MV1; CELLHOLDS_8_7_MV1; CELLHOLDS_8_6_MV1;
- CELLHOLDS_8_5_MV1; CELLHOLDS_8_4_MV1; CELLHOLDS_8_3_MV1;
- CELLHOLDS_8_2_MV1; CELLHOLDS_8_1_MV1
+ C8_Y2 {
+ C8_8; C8_7; C8_6;
+ C8_5; C8_4; C8_3;
+ C8_2; C8_1
};
- CELLHOLDS_X2_1_MV1 {
- CELLHOLDS_8_1_MV1; CELLHOLDS_7_1_MV1; CELLHOLDS_6_1_MV1;
- CELLHOLDS_5_1_MV1; CELLHOLDS_4_1_MV1; CELLHOLDS_3_1_MV1;
- CELLHOLDS_2_1_MV1; CELLHOLDS_1_1_MV1
+ CX2_1 {
+ C8_1; C7_1; C6_1;
+ C5_1; C4_1; C3_1;
+ C2_1; C1_1
};
- CELLHOLDS_X2_2_MV1 {
- CELLHOLDS_8_2_MV1; CELLHOLDS_7_2_MV1; CELLHOLDS_6_2_MV1;
- CELLHOLDS_5_2_MV1; CELLHOLDS_4_2_MV1; CELLHOLDS_3_2_MV1;
- CELLHOLDS_2_2_MV1; CELLHOLDS_1_2_MV1
+ CX2_2 {
+ C8_2; C7_2; C6_2;
+ C5_2; C4_2; C3_2;
+ C2_2; C1_2
};
- CELLHOLDS_X2_3_MV1 {
- CELLHOLDS_8_3_MV1; CELLHOLDS_7_3_MV1; CELLHOLDS_6_3_MV1;
- CELLHOLDS_5_3_MV1; CELLHOLDS_4_3_MV1; CELLHOLDS_3_3_MV1;
- CELLHOLDS_2_3_MV1; CELLHOLDS_1_3_MV1
+ CX2_3 {
+ C8_3; C7_3; C6_3;
+ C5_3; C4_3; C3_3;
+ C2_3; C1_3
};
- CELLHOLDS_X2_4_MV1 {
- CELLHOLDS_8_4_MV1; CELLHOLDS_7_4_MV1; CELLHOLDS_6_4_MV1;
- CELLHOLDS_5_4_MV1; CELLHOLDS_4_4_MV1; CELLHOLDS_3_4_MV1;
- CELLHOLDS_2_4_MV1; CELLHOLDS_1_4_MV1
+ CX2_4 {
+ C8_4; C7_4; C6_4;
+ C5_4; C4_4; C3_4;
+ C2_4; C1_4
};
- CELLHOLDS_X2_5_MV1 {
- CELLHOLDS_8_5_MV1; CELLHOLDS_7_5_MV1; CELLHOLDS_6_5_MV1;
- CELLHOLDS_5_5_MV1; CELLHOLDS_4_5_MV1; CELLHOLDS_3_5_MV1;
- CELLHOLDS_2_5_MV1; CELLHOLDS_1_5_MV1
+ CX2_5 {
+ C8_5; C7_5; C6_5;
+ C5_5; C4_5; C3_5;
+ C2_5; C1_5
};
- CELLHOLDS_X2_6_MV1 {
- CELLHOLDS_8_6_MV1; CELLHOLDS_7_6_MV1; CELLHOLDS_6_6_MV1;
- CELLHOLDS_5_6_MV1; CELLHOLDS_4_6_MV1; CELLHOLDS_3_6_MV1;
- CELLHOLDS_2_6_MV1; CELLHOLDS_1_6_MV1
+ CX2_6 {
+ C8_6; C7_6; C6_6;
+ C5_6; C4_6; C3_6;
+ C2_6; C1_6
};
- CELLHOLDS_X2_7_MV1 {
- CELLHOLDS_8_7_MV1; CELLHOLDS_7_7_MV1; CELLHOLDS_6_7_MV1;
- CELLHOLDS_5_7_MV1; CELLHOLDS_4_7_MV1; CELLHOLDS_3_7_MV1;
- CELLHOLDS_2_7_MV1; CELLHOLDS_1_7_MV1
+ CX2_7 {
+ C8_7; C7_7; C6_7;
+ C5_7; C4_7; C3_7;
+ C2_7; C1_7
};
- CELLHOLDS_X2_8_MV1 {
- CELLHOLDS_8_8_MV1; CELLHOLDS_7_8_MV1; CELLHOLDS_6_8_MV1;
- CELLHOLDS_5_8_MV1; CELLHOLDS_4_8_MV1; CELLHOLDS_3_8_MV1;
- CELLHOLDS_2_8_MV1; CELLHOLDS_1_8_MV1
+ CX2_8 {
+ C8_8; C7_8; C6_8;
+ C5_8; C4_8; C3_8;
+ C2_8; C1_8
};
- CELLHOLDS_X2_Y2_BLACK {
- CELLHOLDS_8_8_MV1; CELLHOLDS_7_8_MV1; CELLHOLDS_7_7_MV1;
- CELLHOLDS_7_6_MV1; CELLHOLDS_6_8_MV1; CELLHOLDS_6_6_MV1;
- CELLHOLDS_5_8_MV1; CELLHOLDS_5_7_MV1; CELLHOLDS_4_8_MV1;
- CELLHOLDS_4_7_MV1; CELLHOLDS_3_7_MV1; CELLHOLDS_3_6_MV1;
- CELLHOLDS_1_8_MV1; CELLHOLDS_1_7_MV1; CELLHOLDS_1_6_MV1;
- CELLHOLDS_1_5_MV1
+ CX2_Y2_BLACK {
+ C8_8; C7_8; C7_7;
+ C7_6; C6_8; C6_6;
+ C5_8; C5_7; C4_8;
+ C4_7; C3_7; C3_6;
+ C1_8; C1_7; C1_6;
+ C1_5
};
- CELLHOLDS_X2_Y2_MV1:1 {};
- CELLHOLDS_X2_Y2_WHITE {
- CELLHOLDS_8_3_MV1; CELLHOLDS_8_1_MV1; CELLHOLDS_7_4_MV1;
- CELLHOLDS_7_1_MV1; CELLHOLDS_6_3_MV1; CELLHOLDS_6_1_MV1;
- CELLHOLDS_5_4_MV1; CELLHOLDS_5_3_MV1; CELLHOLDS_5_1_MV1;
- CELLHOLDS_4_2_MV1; CELLHOLDS_4_1_MV1; CELLHOLDS_3_2_MV1;
- CELLHOLDS_2_2_MV1; CELLHOLDS_2_1_MV1; CELLHOLDS_1_3_MV1;
- CELLHOLDS_1_1_MV1
+ CX2_Y2:1 {};
+ CX2_Y2_WHITE {
+ C8_3; C8_1; C7_4;
+ C7_1; C6_3; C6_1;
+ C5_4; C5_3; C5_1;
+ C4_2; C4_1; C3_2;
+ C2_2; C2_1; C1_3;
+ C1_1
};
- CONTROL_BLACK (CONTROL_MV1); CONTROL_MV1 (CONTROL_MV1);
- CONTROL_WHITE:1 {}; INDEX__CELLHOLDS_X2_Y2_MV1_X2:1 {};
- INDEX__CELLHOLDS_X2_Y2_MV1_Y2:1 {};
+ CONTROL_BLACK (CONTROL); CONTROL (CONTROL);
+ CONTROL_WHITE:1 {}; INDEX__CX2_Y2_X2:1 {};
+ INDEX__CX2_Y2_Y2:1 {};
R {
- (CELLHOLDS_8_7_MV1, CELLHOLDS_7_8_MV1);
- (CELLHOLDS_8_6_MV1, CELLHOLDS_7_7_MV1);
- (CELLHOLDS_8_5_MV1, CELLHOLDS_7_6_MV1);
- (CELLHOLDS_8_4_MV1, CELLHOLDS_7_5_MV1);
- (CELLHOLDS_8_3_MV1, CELLHOLDS_7_4_MV1);
- (CELLHOLDS_8_2_MV1, CELLHOLDS_7_3_MV1);
- (CELLHOLDS_8_1_MV1, CELLHOLDS_7_2_MV1);
- (CELLHOLDS_7_7_MV1, CELLHOLDS_6_8_MV1);
- (CELLHOLDS_7_6_MV1, CELLHOLDS_6_7_MV1);
- (CELLHOLDS_7_5_MV1, CELLHOLDS_6_6_MV1);
- (CELLHOLDS_7_4_MV1, CELLHOLDS_6_5_MV1);
- (CELLHOLDS_7_3_MV1, CELLHOLDS_6_4_MV1);
- (CELLHOLDS_7_2_MV1, CELLHOLDS_6_3_MV1);
- (CELLHOLDS_7_1_MV1, CELLHOLDS_6_2_MV1);
- (CELLHOLDS_6_7_MV1, CELLHOLDS_5_8_MV1);
- (CELLHOLDS_6_6_MV1, CELLHOLDS_5_7_MV1);
- (CELLHOLDS_6_5_MV1, CELLHOLDS_5_6_MV1);
- (CELLHOLDS_6_4_MV1, CELLHOLDS_5_5_MV1);
- (CELLHOLDS_6_3_MV1, CELLHOLDS_5_4_MV1);
- (CELLHOLDS_6_2_MV1, CELLHOLDS_5_3_MV1);
- (CELLHOLDS_6_1_MV1, CELLHOLDS_5_2_MV1);
- (CELLHOLDS_5_7_MV1, CELLHOLDS_4_8_MV1);
- (CELLHOLDS_5_6_MV1, CELLHOLDS_4_7_MV1);
- (CELLHOLDS_5_5_MV1, CELLHOLDS_4_6_MV1);
- (CELLHOLDS_5_4_MV1, CELLHOLDS_4_5_MV1);
- (CELLHOLDS_5_3_MV1, CELLHOLDS_4_4_MV1);
- (CELLHOLDS_5_2_MV1, CELLHOLDS_4_3_MV1);
- (CELLHOLDS_5_1_MV1, CELLHOLDS_4_2_MV1);
- (CELLHOLDS_4_7_MV1, CELLHOLDS_3_8_MV1);
- (CELLHOLDS_4_6_MV1, CELLHOLDS_3_7_MV1);
- (CELLHOLDS_4_5_MV1, CELLHOLDS_3_6_MV1);
- (CELLHOLDS_4_4_MV1, CELLHOLDS_3_5_MV1);
- (CELLHOLDS_4_3_MV1, CELLHOLDS_3_4_MV1);
- (CELLHOLDS_4_2_MV1, CELLHOLDS_3_3_MV1);
- (CELLHOLDS_4_1_MV1, CELLHOLDS_3_2_MV1);
- (CELLHOLDS_3_7_MV1, CELLHOLDS_2_8_MV1);
- (CELLHOLDS_3_6_MV1, CELLHOLDS_2_7_MV1);
- (CELLHOLDS_3_5_MV1, CELLHOLDS_2_6_MV1);
- (CELLHOLDS_3_4_MV1, CELLHOLDS_2_5_MV1);
- (CELLHOLDS_3_3_MV1, CELLHOLDS_2_4_MV1);
- (CELLHOLDS_3_2_MV1, CELLHOLDS_2_3_MV1);
- (CELLHOLDS_3_1_MV1, CELLHOLDS_2_2_MV1);
- (CELLHOLDS_2_7_MV1, CELLHOLDS_1_8_MV1);
- (CELLHOLDS_2_6_MV1, CELLHOLDS_1_7_MV1);
- (CELLHOLDS_2_5_MV1, CELLHOLDS_1_6_MV1);
- (CELLHOLDS_2_4_MV1, CELLHOLDS_1_5_MV1);
- (CELLHOLDS_2_3_MV1, CELLHOLDS_1_4_MV1);
- (CELLHOLDS_2_2_MV1, CELLHOLDS_1_3_MV1);
- (CELLHOLDS_2_1_MV1, CELLHOLDS_1_2_MV1)
+ (C8_7, C7_8);
+ (C8_6, C7_7);
+ (C8_5, C7_6);
+ (C8_4, C7_5);
+ (C8_3, C7_4);
+ (C8_2, C7_3);
+ (C8_1, C7_2);
+ (C7_7, C6_8);
+ (C7_6, C6_7);
+ (C7_5, C6_6);
+ (C7_4, C6_5);
+ (C7_3, C6_4);
+ (C7_2, C6_3);
+ (C7_1, C6_2);
+ (C6_7, C5_8);
+ (C6_6, C5_7);
+ (C6_5, C5_6);
+ (C6_4, C5_5);
+ (C6_3, C5_4);
+ (C6_2, C5_3);
+ (C6_1, C5_2);
+ (C5_7, C4_8);
+ (C5_6, C4_7);
+ (C5_5, C4_6);
+ (C5_4, C4_5);
+ (C5_3, C4_4);
+ (C5_2, C4_3);
+ (C5_1, C4_2);
+ (C4_7, C3_8);
+ (C4_6, C3_7);
+ (C4_5, C3_6);
+ (C4_4, C3_5);
+ (C4_3, C3_4);
+ (C4_2, C3_3);
+ (C4_1, C3_2);
+ (C3_7, C2_8);
+ (C3_6, C2_7);
+ (C3_5, C2_6);
+ (C3_4, C2_5);
+ (C3_3, C2_4);
+ (C3_2, C2_3);
+ (C3_1, C2_2);
+ (C2_7, C1_8);
+ (C2_6, C1_7);
+ (C2_5, C1_6);
+ (C2_4, C1_5);
+ (C2_3, C1_4);
+ (C2_2, C1_3);
+ (C2_1, C1_2)
};
R0 {
- (CELLHOLDS_7_7_MV1, CELLHOLDS_8_8_MV1);
- (CELLHOLDS_7_6_MV1, CELLHOLDS_8_7_MV1);
- (CELLHOLDS_7_5_MV1, CELLHOLDS_8_6_MV1);
- (CELLHOLDS_7_4_MV1, CELLHOLDS_8_5_MV1);
- (CELLHOLDS_7_3_MV1, CELLHOLDS_8_4_MV1);
- (CELLHOLDS_7_2_MV1, CELLHOLDS_8_3_MV1);
- (CELLHOLDS_7_1_MV1, CELLHOLDS_8_2_MV1);
- (CELLHOLDS_6_7_MV1, CELLHOLDS_7_8_MV1);
- (CELLHOLDS_6_6_MV1, CELLHOLDS_7_7_MV1);
- (CELLHOLDS_6_5_MV1, CELLHOLDS_7_6_MV1);
- (CELLHOLDS_6_4_MV1, CELLHOLDS_7_5_MV1);
- (CELLHOLDS_6_3_MV1, CELLHOLDS_7_4_MV1);
- (CELLHOLDS_6_2_MV1, CELLHOLDS_7_3_MV1);
- (CELLHOLDS_6_1_MV1, CELLHOLDS_7_2_MV1);
- (CELLHOLDS_5_7_MV1, CELLHOLDS_6_8_MV1);
- (CELLHOLDS_5_6_MV1, CELLHOLDS_6_7_MV1);
- (CELLHOLDS_5_5_MV1, CELLHOLDS_6_6_MV1);
- (CELLHOLDS_5_4_MV1, CELLHOLDS_6_5_MV1);
- (CELLHOLDS_5_3_MV1, CELLHOLDS_6_4_MV1);
- (CELLHOLDS_5_2_MV1, CELLHOLDS_6_3_MV1);
- (CELLHOLDS_5_1_MV1, CELLHOLDS_6_2_MV1);
- (CELLHOLDS_4_7_MV1, CELLHOLDS_5_8_MV1);
- (CELLHOLDS_4_6_MV1, CELLHOLDS_5_7_MV1);
- (CELLHOLDS_4_5_MV1, CELLHOLDS_5_6_MV1);
- (CELLHOLDS_4_4_MV1, CELLHOLDS_5_5_MV1);
- (CELLHOLDS_4_3_MV1, CELLHOLDS_5_4_MV1);
- (CELLHOLDS_4_2_MV1, CELLHOLDS_5_3_MV1);
- (CELLHOLDS_4_1_MV1, CELLHOLDS_5_2_MV1);
- (CELLHOLDS_3_7_MV1, CELLHOLDS_4_8_MV1);
- (CELLHOLDS_3_6_MV1, CELLHOLDS_4_7_MV1);
- (CELLHOLDS_3_5_MV1, CELLHOLDS_4_6_MV1);
- (CELLHOLDS_3_4_MV1, CELLHOLDS_4_5_MV1);
- (CELLHOLDS_3_3_MV1, CELLHOLDS_4_4_MV1);
- (CELLHOLDS_3_2_MV1, CELLHOLDS_4_3_MV1);
- (CELLHOLDS_3_1_MV1, CELLHOLDS_4_2_MV1);
- (CELLHOLDS_2_7_MV1, CELLHOLDS_3_8_MV1);
- (CELLHOLDS_2_6_MV1, CELLHOLDS_3_7_MV1);
- (CELLHOLDS_2_5_MV1, CELLHOLDS_3_6_MV1);
- (CELLHOLDS_2_4_MV1, CELLHOLDS_3_5_MV1);
- (CELLHOLDS_2_3_MV1, CELLHOLDS_3_4_MV1);
- (CELLHOLDS_2_2_MV1, CELLHOLDS_3_3_MV1);
- (CELLHOLDS_2_1_MV1, CELLHOLDS_3_2_MV1);
- (CELLHOLDS_1_7_MV1, CELLHOLDS_2_8_MV1);
- (CELLHOLDS_1_6_MV1, CELLHOLDS_2_7_MV1);
- (CELLHOLDS_1_5_MV1, CELLHOLDS_2_6_MV1);
- (CELLHOLDS_1_4_MV1, CELLHOLDS_2_5_MV1);
- (CELLHOLDS_1_3_MV1, CELLHOLDS_2_4_MV1);
- (CELLHOLDS_1_2_MV1, CELLHOLDS_2_3_MV1);
- (CELLHOLDS_1_1_MV1, CELLHOLDS_2_2_MV1)
+ (C7_7, C8_8);
+ (C7_6, C8_7);
+ (C7_5, C8_6);
+ (C7_4, C8_5);
+ (C7_3, C8_4);
+ (C7_2, C8_3);
+ (C7_1, C8_2);
+ (C6_7, C7_8);
+ (C6_6, C7_7);
+ (C6_5, C7_6);
+ (C6_4, C7_5);
+ (C6_3, C7_4);
+ (C6_2, C7_3);
+ (C6_1, C7_2);
+ (C5_7, C6_8);
+ (C5_6, C6_7);
+ (C5_5, C6_6);
+ (C5_4, C6_5);
+ (C5_3, C6_4);
+ (C5_2, C6_3);
+ (C5_1, C6_2);
+ (C4_7, C5_8);
+ (C4_6, C5_7);
+ (C4_5, C5_6);
+ (C4_4, C5_5);
+ (C4_3, C5_4);
+ (C4_2, C5_3);
+ (C4_1, C5_2);
+ (C3_7, C4_8);
+ (C3_6, C4_7);
+ (C3_5, C4_6);
+ (C3_4, C4_5);
+ (C3_3, C4_4);
+ (C3_2, C4_3);
+ (C3_1, C4_2);
+ (C2_7, C3_8);
+ (C2_6, C3_7);
+ (C2_5, C3_6);
+ (C2_4, C3_5);
+ (C2_3, C3_4);
+ (C2_2, C3_3);
+ (C2_1, C3_2);
+ (C1_7, C2_8);
+ (C1_6, C2_7);
+ (C1_5, C2_6);
+ (C1_4, C2_5);
+ (C1_3, C2_4);
+ (C1_2, C2_3);
+ (C1_1, C2_2)
};
R1 {
- (CELLHOLDS_8_7_MV1, CELLHOLDS_8_8_MV1);
- (CELLHOLDS_8_6_MV1, CELLHOLDS_8_7_MV1);
- (CELLHOLDS_8_5_MV1, CELLHOLDS_8_6_MV1);
- (CELLHOLDS_8_4_MV1, CELLHOLDS_8_5_MV1);
- (CELLHOLDS_8_3_MV1, CELLHOLDS_8_4_MV1);
- (CELLHOLDS_8_2_MV1, CELLHOLDS_8_3_MV1);
- (CELLHOLDS_8_1_MV1, CELLHOLDS_8_2_MV1);
- (CELLHOLDS_7_7_MV1, CELLHOLDS_7_8_MV1);
- (CELLHOLDS_7_6_MV1, CELLHOLDS_7_7_MV1);
- (CELLHOLDS_7_5_MV1, CELLHOLDS_7_6_MV1);
- (CELLHOLDS_7_4_MV1, CELLHOLDS_7_5_MV1);
- (CELLHOLDS_7_3_MV1, CELLHOLDS_7_4_MV1);
- (CELLHOLDS_7_2_MV1, CELLHOLDS_7_3_MV1);
- (CELLHOLDS_7_1_MV1, CELLHOLDS_7_2_MV1);
- (CELLHOLDS_6_7_MV1, CELLHOLDS_6_8_MV1);
- (CELLHOLDS_6_6_MV1, CELLHOLDS_6_7_MV1);
- (CELLHOLDS_6_5_MV1, CELLHOLDS_6_6_MV1);
- (CELLHOLDS_6_4_MV1, CELLHOLDS_6_5_MV1);
- (CELLHOLDS_6_3_MV1, CELLHOLDS_6_4_MV1);
- (CELLHOLDS_6_2_MV1, CELLHOLDS_6_3_MV1);
- (CELLHOLDS_6_1_MV1, CELLHOLDS_6_2_MV1);
- (CELLHOLDS_5_7_MV1, CELLHOLDS_5_8_MV1);
- (CELLHOLDS_5_6_MV1, CELLHOLDS_5_7_MV1);
- (CELLHOLDS_5_5_MV1, CELLHOLDS_5_6_MV1);
- (CELLHOLDS_5_4_MV1, CELLHOLDS_5_5_MV1);
- (CELLHOLDS_5_3_MV1, CELLHOLDS_5_4_MV1);
- (CELLHOLDS_5_2_MV1, CELLHOLDS_5_3_MV1);
- (CELLHOLDS_5_1_MV1, CELLHOLDS_5_2_MV1);
- (CELLHOLDS_4_7_MV1, CELLHOLDS_4_8_MV1);
- (CELLHOLDS_4_6_MV1, CELLHOLDS_4_7_MV1);
- (CELLHOLDS_4_5_MV1, CELLHOLDS_4_6_MV1);
- (CELLHOLDS_4_4_MV1, CELLHOLDS_4_5_MV1);
- (CELLHOLDS_4_3_MV1, CELLHOLDS_4_4_MV1);
- (CELLHOLDS_4_2_MV1, CELLHOLDS_4_3_MV1);
- (CELLHOLDS_4_1_MV1, CELLHOLDS_4_2_MV1);
- (CELLHOLDS_3_7_MV1, CELLHOLDS_3_8_MV1);
- (CELLHOLDS_3_6_MV1, CELLHOLDS_3_7_MV1);
- (CELLHOLDS_3_5_MV1, CELLHOLDS_3_6_MV1);
- (CELLHOLDS_3_4_MV1, CELLHOLDS_3_5_MV1);
- (CELLHOLDS_3_3_MV1, CELLHOLDS_3_4_MV1);
- (CELLHOLDS_3_2_MV1, CELLHOLDS_3_3_MV1);
- (CELLHOLDS_3_1_MV1, CELLHOLDS_3_2_MV1);
- (CELLHOLDS_2_7_MV1, CELLHOLDS_2_8_MV1);
- (CELLHOLDS_2_6_MV1, CELLHOLDS_2_7_MV1);
- (CELLHOLDS_2_5_MV1, CELLHOLDS_2_6_MV1);
- (CELLHOLDS_2_4_MV1, CELLHOLDS_2_5_MV1);
- (CELLHOLDS_2_3_MV1, CELLHOLDS_2_4_MV1);
- (CELLHOLDS_2_2_MV1, CELLHOLDS_2_3_MV1);
- (CELLHOLDS_2_1_MV1, CELLHOLDS_2_2_MV1);
- (CELLHOLDS_1_7_MV1, CELLHOLDS_1_8_MV1);
- (CELLHOLDS_1_6_MV1, CELLHOLDS_1_7_MV1);
- (CELLHOLDS_1_5_MV1, CELLHOLDS_1_6_MV1);
- (CELLHOLDS_1_4_MV1, CELLHOLDS_1_5_MV1);
- (CELLHOLDS_1_3_MV1, CELLHOLDS_1_4_MV1);
- (CELLHOLDS_1_2_MV1, CELLHOLDS_1_3_MV1);
- (CELLHOLDS_1_1_MV1, CELLHOLDS_1_2_MV1)
+ (C8_7, C8_8);
+ (C8_6, C8_7);
+ (C8_5, C8_6);
+ (C8_4, C8_5);
+ (C8_3, C8_4);
+ (C8_2, C8_3);
+ (C8_1, C8_2);
+ (C7_7, C7_8);
+ (C7_6, C7_7);
+ (C7_5, C7_6);
+ (C7_4, C7_5);
+ (C7_3, C7_4);
+ (C7_2, C7_3);
+ (C7_1, C7_2);
+ (C6_7, C6_8);
+ (C6_6, C6_7);
+ (C6_5, C6_6);
+ (C6_4, C6_5);
+ (C6_3, C6_4);
+ (C6_2, C6_3);
+ (C6_1, C6_2);
+ (C5_7, C5_8);
+ (C5_6, C5_7);
+ (C5_5, C5_6);
+ (C5_4, C5_5);
+ (C5_3, C5_4);
+ (C5_2, C5_3);
+ (C5_1, C5_2);
+ (C4_7, C4_8);
+ (C4_6, C4_7);
+ (C4_5, C4_6);
+ (C4_4, C4_5);
+ (C4_3, C4_4);
+ (C4_2, C4_3);
+ (C4_1, C4_2);
+ (C3_7, C3_8);
+ (C3_6, C3_7);
+ (C3_5, C3_6);
+ (C3_4, C3_5);
+ (C3_3, C3_4);
+ (C3_2, C3_3);
+ (C3_1, C3_2);
+ (C2_7, C2_8);
+ (C2_6, C2_7);
+ (C2_5, C2_6);
+ (C2_4, C2_5);
+ (C2_3, C2_4);
+ (C2_2, C2_3);
+ (C2_1, C2_2);
+ (C1_7, C1_8);
+ (C1_6, C1_7);
+ (C1_5, C1_6);
+ (C1_4, C1_5);
+ (C1_3, C1_4);
+ (C1_2, C1_3);
+ (C1_1, C1_2)
};
R2 {
- (CELLHOLDS_8_8_MV1, CELLHOLDS_8_7_MV1);
- (CELLHOLDS_8_7_MV1, CELLHOLDS_8_6_MV1);
- (CELLHOLDS_8_6_MV1, CELLHOLDS_8_5_MV1);
- (CELLHOLDS_8_5_MV1, CELLHOLDS_8_4_MV1);
- (CELLHOLDS_8_4_MV1, CELLHOLDS_8_3_MV1);
- (CELLHOLDS_8_3_MV1, CELLHOLDS_8_2_MV1);
- (CELLHOLDS_8_2_MV1, CELLHOLDS_8_1_MV1);
- (CELLHOLDS_7_8_MV1, CELLHOLDS_7_7_MV1);
- (CELLHOLDS_7_7_MV1, CELLHOLDS_7_6_MV1);
- (CELLHOLDS_7_6_MV1, CELLHOLDS_7_5_MV1);
- (CELLHOLDS_7_5_MV1, CELLHOLDS_7_4_MV1);
- (CELLHOLDS_7_4_MV1, CELLHOLDS_7_3_MV1);
- (CELLHOLDS_7_3_MV1, CELLHOLDS_7_2_MV1);
- (CELLHOLDS_7_2_MV1, CELLHOLDS_7_1_MV1);
- (CELLHOLDS_6_8_MV1, CELLHOLDS_6_7_MV1);
- (CELLHOLDS_6_7_MV1, CELLHOLDS_6_6_MV1);
- (CELLHOLDS_6_6_MV1, CELLHOLDS_6_5_MV1);
- (CELLHOLDS_6_5_MV1, CELLHOLDS_6_4_MV1);
- (CELLHOLDS_6_4_MV1, CELLHOLDS_6_3_MV1);
- (CELLHOLDS_6_3_MV1, CELLHOLDS_6_2_MV1);
- (CELLHOLDS_6_2_MV1, CELLHOLDS_6_1_MV1);
- (CELLHOLDS_5_8_MV1, CELLHOLDS_5_7_MV1);
- (CELLHOLDS_5_7_MV1, CELLHOLDS_5_6_MV1);
- (CELLHOLDS_5_6_MV1, CELLHOLDS_5_5_MV1);
- (CELLHOLDS_5_5_MV1, CELLHOLDS_5_4_MV1);
- (CELLHOLDS_5_4_MV1, CELLHOLDS_5_3_MV1);
- (CELLHOLDS_5_3_MV1, CELLHOLDS_5_2_MV1);
- (CELLHOLDS_5_2_MV1, CELLHOLDS_5_1_MV1);
- (CELLHOLDS_4_8_MV1, CELLHOLDS_4_7_MV1);
- (CELLHOLDS_4_7_MV1, CELLHOLDS_4_6_MV1);
- (CELLHOLDS_4_6_MV1, CELLHOLDS_4_5_MV1);
- (CELLHOLDS_4_5_MV1, CELLHOLDS_4_4_MV1);
- (CELLHOLDS_4_4_MV1, CELLHOLDS_4_3_MV1);
- (CELLHOLDS_4_3_MV1, CELLHOLDS_4_2_MV1);
- (CELLHOLDS_4_2_MV1, CELLHOLDS_4_1_MV1);
- (CELLHOLDS_3_8_MV1, CELLHOLDS_3_7_MV1);
- (CELLHOLDS_3_7_MV1, CELLHOLDS_3_6_MV1);
- (CELLHOLDS_3_6_MV1, CELLHOLDS_3_5_MV1);
- (CELLHOLDS_3_5_MV1, CELLHOLDS_3_4_MV1);
- (CELLHOLDS_3_4_MV1, CELLHOLDS_3_3_MV1);
- (CELLHOLDS_3_3_MV1, CELLHOLDS_3_2_MV1);
- (CELLHOLDS_3_2_MV1, CELLHOLDS_3_1_MV1);
- (CELLHOLDS_2_8_MV1, CELLHOLDS_2_7_MV1);
- (CELLHOLDS_2_7_MV1, CELLHOLDS_2_6_MV1);
- (CELLHOLDS_2_6_MV1, CELLHOLDS_2_5_MV1);
- (CELLHOLDS_2_5_MV1, CELLHOLDS_2_4_MV1);
- (CELLHOLDS_2_4_MV1, CELLHOLDS_2_3_MV1);
- (CELLHOLDS_2_3_MV1, CELLHOLDS_2_2_MV1);
- (CELLHOLDS_2_2_MV1, CELLHOLDS_2_1_MV1);
- (CELLHOLDS_1_8_MV1, CELLHOLDS_1_7_MV1);
- (CELLHOLDS_1_7_MV1, CELLHOLDS_1_6_MV1);
- (CELLHOLDS_1_6_MV1, CELLHOLDS_1_5_MV1);
- (CELLHOLDS_1_5_MV1, CELLHOLDS_1_4_MV1);
- (CELLHOLDS_1_4_MV1, CELLHOLDS_1_3_MV1);
- (CELLHOLDS_1_3_MV1, CELLHOLDS_1_2_MV1);
- (CELLHOLDS_1_2_MV1, CELLHOLDS_1_1_MV1)
+ (C8_8, C8_7);
+ (C8_7, C8_6);
+ (C8_6, C8_5);
+ (C8_5, C8_4);
+ (C8_4, C8_3);
+ (C8_3, C8_2);
+ (C8_2, C8_1);
+ (C7_8, C7_7);
+ (C7_7, C7_6);
+ (C7_6, C7_5);
+ (C7_5, C7_4);
+ (C7_4, C7_3);
+ (C7_3, C7_2);
+ (C7_2, C7_1);
+ (C6_8, C6_7);
+ (C6_7, C6_6);
+ (C6_6, C6_5);
+ (C6_5, C6_4);
+ (C6_4, C6_3);
+ (C6_3, C6_2);
+ (C6_2, C6_1);
+ (C5_8, C5_7);
+ (C5_7, C5_6);
+ (C5_6, C5_5);
+ (C5_5, C5_4);
+ (C5_4, C5_3);
+ (C5_3, C5_2);
+ (C5_2, C5_1);
+ (C4_8, C4_7);
+ (C4_7, C4_6);
+ (C4_6, C4_5);
+ (C4_5, C4_4);
+ (C4_4, C4_3);
+ (C4_3, C4_2);
+ (C4_2, C4_1);
+ (C3_8, C3_7);
+ (C3_7, C3_6);
+ (C3_6, C3_5);
+ (C3_5, C3_4);
+ (C3_4, C3_3);
+ (C3_3, C3_2);
+ (C3_2, C3_1);
+ (C2_8, C2_7);
+ (C2_7, C2_6);
+ (C2_6, C2_5);
+ (C2_5, C2_4);
+ (C2_4, C2_3);
+ (C2_3, C2_2);
+ (C2_2, C2_1);
+ (C1_8, C1_7);
+ (C1_7, C1_6);
+ (C1_6, C1_5);
+ (C1_5, C1_4);
+ (C1_4, C1_3);
+ (C1_3, C1_2);
+ (C1_2, C1_1)
};
- _del_CELLHOLDS_X2_Y2_WHITE (CELLHOLDS_8_2_MV1);
- _del_CONTROL_WHITE (CONTROL_MV1);
- _new_CELLHOLDS_X2_Y2_WHITE (CELLHOLDS_8_3_MV1);
- _new_CONTROL_BLACK (CONTROL_MV1); init__CELLHOLDS_X2_Y2_MV1_X2:1 {};
- init__CELLHOLDS_X2_Y2_MV1_Y2:1 {}; role__CELLHOLDS_X2_Y2_MV1_X2:1 {};
- role__CELLHOLDS_X2_Y2_MV1_Y2:1 {}
- |
-]"
- "(CELLHOLDS_X2_6_MV1(cellholds_x2_y2__blank_) and
- CELLHOLDS_X2_6_MV1(cellholds_x2_y2__blank_) and
- CELLHOLDS_4_Y2_MV1(cellholds_x2_y2__blank_) and
- CELLHOLDS_4_Y2_MV1(cellholds_x2_y2__blank_) and
- CELLHOLDS_X2_7_MV1(cellholds_x1_y1__blank_) and
- CELLHOLDS_X2_7_MV1(cellholds_x1_y1__blank_) and
- CELLHOLDS_3_Y2_MV1(cellholds_x1_y1__blank_) and
- CELLHOLDS_3_Y2_MV1(cellholds_x1_y1__blank_) and
- R(cellholds_x1_y1__blank_, cellholds_x2_y2__blank_) and
- CONTROL_BLACK(control__blank_) and
- CELLHOLDS_X2_Y2_BLACK(cellholds_x1_y1__blank_) and
- not CONTROL_MV1(cellholds_x1_y1__blank_) and
- not CONTROL_MV1(cellholds_x2_y2__blank_) and
- not CELLHOLDS_X2_Y2_BLACK(cellholds_x2_y2__blank_) and
- not CONTROL_WHITE(control__blank_) and
- not cellholds_x1_y1__blank_ = cellholds_x2_y2__blank_ and
- not cellholds_x1_y1__blank_ = control__blank_ and
- not cellholds_x2_y2__blank_ = control__blank_ and
- not
- ex cellholds_x374_8__blank_
- (CELLHOLDS_X2_8_MV1(cellholds_x374_8__blank_) and
- not CONTROL_MV1(cellholds_x374_8__blank_) and
- CELLHOLDS_X2_Y2_WHITE(cellholds_x374_8__blank_)) and
- ex cellhold...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-23 00:41:39
|
Revision: 1379
http://toss.svn.sourceforge.net/toss/?rev=1379&view=rev
Author: lukstafi
Date: 2011-03-23 00:41:31 +0000 (Wed, 23 Mar 2011)
Log Message:
-----------
Generalized folds over formulas and real expressions. Major overhaul of monotonicity (detection and heuristics): distinction of positive, negative and indefinite fluents.
Modified Paths:
--------------
trunk/Toss/Arena/Arena.ml
trunk/Toss/Arena/Arena.mli
trunk/Toss/Arena/DiscreteRule.ml
trunk/Toss/Arena/DiscreteRule.mli
trunk/Toss/Formula/FFTNF.ml
trunk/Toss/Formula/FFTNF.mli
trunk/Toss/Formula/FFTNFTest.ml
trunk/Toss/Formula/FormulaOps.ml
trunk/Toss/Formula/FormulaOps.mli
trunk/Toss/GGP/GameSimpl.ml
trunk/Toss/Play/Heuristic.ml
trunk/Toss/Play/Heuristic.mli
trunk/Toss/Play/HeuristicTest.ml
trunk/Toss/Solver/SolverTest.ml
Modified: trunk/Toss/Arena/Arena.ml
===================================================================
--- trunk/Toss/Arena/Arena.ml 2011-03-22 18:22:54 UTC (rev 1378)
+++ trunk/Toss/Arena/Arena.ml 2011-03-23 00:41:31 UTC (rev 1379)
@@ -439,6 +439,17 @@
rules = List.map (fun (rn, r) ->
rn, {r with ContinuousRule.discrete =
f r.ContinuousRule.discrete}) game.rules}
+
+let all_fluents game =
+ let drules =
+ List.map (fun r -> (snd r).ContinuousRule.compiled) game.rules in
+ let fluents = List.map DiscreteRule.fluents drules in
+ let frels (posi_frels, nega_frels, indef_frels) =
+ Aux.Strings.union indef_frels
+ (Aux.Strings.union posi_frels nega_frels) in
+ List.fold_left Aux.Strings.union Aux.Strings.empty
+ (List.map frels fluents)
+
(* Compare two (game, state) pairs and explain the first difference
met. Formulas and expressions are compared for syntactical
Modified: trunk/Toss/Arena/Arena.mli
===================================================================
--- trunk/Toss/Arena/Arena.mli 2011-03-22 18:22:54 UTC (rev 1378)
+++ trunk/Toss/Arena/Arena.mli 2011-03-23 00:41:31 UTC (rev 1379)
@@ -124,6 +124,8 @@
val map_to_discrete :
(DiscreteRule.rule -> DiscreteRule.rule) -> game -> game
+val all_fluents : game -> Aux.Strings.t
+
(** Compare two (game, state) pairs and explain the first difference
met. Formulas and expressions are compared for syntactical
equality. Players need to be given in the same order. Data is
Modified: trunk/Toss/Arena/DiscreteRule.ml
===================================================================
--- trunk/Toss/Arena/DiscreteRule.ml 2011-03-22 18:22:54 UTC (rev 1378)
+++ trunk/Toss/Arena/DiscreteRule.ml 2011-03-23 00:41:31 UTC (rev 1379)
@@ -49,7 +49,13 @@
rlmap : (string * string) list option; (* rule_s on variables (?) *)
}
-(* We call fluents the relations that can be modified by a rule. *)
+(* Fluents are relations that are changed by rules. Distinguish two
+ subclasses of fluents: positive fluents occur only positively on
+ RHSes (are only added) and only negatively on LHSes and in
+ preconditions, and negative fluents only negatively on RHSes (are
+ only deleted) and only positively on LHSes and in
+ preconditions. (Call the remaining fluents indefinite.) See
+ Heuristic.ml. *)
let fluents_make ?(only_pos=false) f r =
let fl_make (s, tp) =
if tp = [] then None else
@@ -61,41 +67,34 @@
let fluents r =
let map_rels =
Aux.map_some (fun (rel,tups)->if tups=[] then None else Some rel) in
- map_rels r.rhs_pos_tuples @ map_rels r.rhs_neg_tuples
-
-(* A relation is monotonic if it cannot remove tuples. *)
-let monotonic r =
- List.for_all (fun (_,tups) -> tups = []) r.rhs_neg_tuples
+ let posi_cands = Aux.strings_of_list (map_rels r.rhs_pos_tuples) in
+ let nega_cands = Aux.strings_of_list (map_rels r.rhs_neg_tuples) in
+ let fluents = Aux.Strings.union posi_cands nega_cands in
+ let posi = Aux.Strings.diff posi_cands nega_cands
+ and nega = Aux.Strings.diff nega_cands posi_cands in
+ let posi_lhs, nega_lhs = FormulaOps.rels_signs r.lhs_form in
+ let posi = Aux.Strings.diff posi posi_lhs in
+ let nega = Aux.Strings.diff nega nega_lhs in
+ posi, nega, Aux.Strings.diff fluents (Aux.Strings.union posi nega)
(* A fluent precondition is an approximation to the condition on a
- structure for the fluent to appear at a position. *)
-let fluent_preconds rules signature fluents =
- (* Remove positive fluents as they could still be added later, also
- remove the fluent under consideration *)
- let module M = struct open Formula
- (* TODO: since OCaml 3.12 *) (* let open Formula in *)
- let rec negative_trace fluent neg = function
- | Rel (rel, _) as atom ->
- if rel = fluent || not neg && List.mem rel fluents
- then raise Not_found
- else atom
- | (Eq _ | In _ | RealExpr _) as atom -> atom
- | Not phi -> Not (negative_trace fluent (not neg) phi)
- | And conjs ->
- And (Aux.map_try (negative_trace fluent neg) conjs)
- | Or disjs ->
- Or (Aux.map_try (negative_trace fluent neg) disjs)
- | Ex (vs, phi) -> Ex (vs, negative_trace fluent neg phi)
- | All (vs, phi) -> All (vs, negative_trace fluent neg phi) end in
- let negative_trace fluent phi =
- try FormulaOps.flatten_formula (M.negative_trace fluent false phi)
- with Not_found -> Formula.And [] in
+ structure for the positive/negative fluent to appear/disappear at a
+ position. We are only interested in expanding preconditions of
+ positive and negative fluents.
+
+ TODO: currently, only a single absence/presence tuple is removed
+ from the precondition: the one from which it "derived"; shouldn't
+ all added and deleted tuples be removed? *)
+let fluent_preconds rules signature posi_frels nega_frels =
+ let fluents =
+ Aux.Strings.elements posi_frels @ Aux.Strings.elements nega_frels in
let fluent_precond rel =
(* rules that produce a fluent, together with its args *)
let rel_prods =
Aux.map_some (fun r ->
- if List.mem_assoc rel r.rhs_pos_tuples then
- let rel_tups = List.assoc rel r.rhs_pos_tuples in
+ let rhs_tuples = r.rhs_pos_tuples @ r.rhs_neg_tuples in
+ if List.mem_assoc rel rhs_tuples then
+ let rel_tups = List.assoc rel rhs_tuples in
if rel_tups <> [] then Some (r, rel_tups)
else None
else None) rules in
@@ -108,7 +107,27 @@
Aux.not_conflicting_names "av__" all_names
(Array.to_list (Array.make (signature rel) ())) in
(* Encapsulate the precondition as a defined relation *)
- let compose_pre r body args =
+ let compose_pre r body args =
+ let lhs_args =
+ match r.rlmap with
+ | None -> (* LHS and RHS vars are the same *)
+ args
+ | Some rlmap ->
+ Array.map (fun e->List.assoc e rlmap) args in
+ (* remove potential condition for absence/presence of the
+ fluent being just added / deleted *)
+ let body = FormulaOps.map_formula
+ {FormulaOps.identity_map with
+ (* remove the absence/presence condition of added/deleted
+ tuple (TODO: see header comment); we know by [rel \in
+ nega_frels/posi_frels] that the occurrence is
+ positive/negative *)
+ FormulaOps.map_Rel = (fun b_rel b_args ->
+ let b = rel = b_rel && lhs_args =
+ Array.map Formula.var_str b_args in
+ if b && Aux.Strings.mem rel nega_frels then Formula.And []
+ else if b && Aux.Strings.mem rel posi_frels then Formula.Or []
+ else Formula.Rel (b_rel, b_args))} body in
let args = Array.to_list args in
let body, other_vars, numap_cstr =
match r.rlmap with
@@ -131,9 +150,8 @@
else Formula.Ex (List.map (fun v-> `FO v) other_vars, body) in
let disjs =
Aux.concat_map
- (fun (r, lhs, args_l)-> List.map (compose_pre r lhs) args_l)
- (List.map (fun (r, args_l)->
- r, negative_trace rel r.lhs_form, args_l) rel_prods) in
+ (fun (r, args_l)-> List.map (compose_pre r r.lhs_form) args_l)
+ rel_prods in
let precond =
match disjs with
| [] -> failwith ("fluent_preconds: not a fluent: "^rel)
Modified: trunk/Toss/Arena/DiscreteRule.mli
===================================================================
--- trunk/Toss/Arena/DiscreteRule.mli 2011-03-22 18:22:54 UTC (rev 1378)
+++ trunk/Toss/Arena/DiscreteRule.mli 2011-03-23 00:41:31 UTC (rev 1379)
@@ -47,16 +47,23 @@
val elemvar_of_elem : elem_inv_names -> int -> string
-(* We call fluents the relations that can be modified by a rule. *)
-val fluents : rule_obj -> string list
+(** Fluents are relations that are changed by rules. Distinguish two
+ subclasses of fluents: positive fluents occur only positively on
+ RHSes (are only added) and only negatively on LHSes and in
+ preconditions, and negative fluents only negatively on RHSes (are
+ only deleted) and only positively on LHSes and in
+ preconditions. (Call the remaining fluents indefinite.) See
+ {!Heuristic}. *)
+val fluents : rule_obj -> Aux.Strings.t * Aux.Strings.t * Aux.Strings.t
val fluents_make : ?only_pos : bool -> (string -> int -> 'a) ->
rule_obj -> 'a list
-
-(* A relation is monotonic if it cannot remove tuples. *)
-val monotonic : rule_obj -> bool
+(** A fluent precondition is an approximation to the condition on a
+ structure for the positive/negative fluent to appear/disappear at a
+ position. We are only interested in expanding preconditions of
+ positive and negative fluents. *)
val fluent_preconds :
- rule_obj list -> (string -> int) -> string list ->
+ rule_obj list -> (string -> int) -> Aux.Strings.t -> Aux.Strings.t ->
(string * (string list * Formula.formula)) list
(* Helpers for special relations. *)
Modified: trunk/Toss/Formula/FFTNF.ml
===================================================================
--- trunk/Toss/Formula/FFTNF.ml 2011-03-22 18:22:54 UTC (rev 1378)
+++ trunk/Toss/Formula/FFTNF.ml 2011-03-23 00:41:31 UTC (rev 1379)
@@ -1,143 +1,143 @@
-(* Computing the FF Type Normal Form, and the FF Separation.
+(** Computing the FF Type Normal Form, and the FF Separation.
- {2 Computing the FF Type Normal Form}
+ {2 Computing the FF Type Normal Form}
- Because FFTNF adds considerably to the already high computational
- cost of computing TNF, we turn off some of its flexibility
- depending on the size of the normalized formula:
+ Because FFTNF adds considerably to the already high computational
+ cost of computing TNF, we turn off some of its flexibility
+ depending on the size of the normalized formula:
- (1) at parsimony level 1 (PARL1), we do not move atoms that are
- already protected (in the TNF sense) if that leads to formula
- duplication;
+ (1) at parsimony level 1 (PARL1), we do not move atoms that are
+ already protected (in the TNF sense) if that leads to formula
+ duplication;
- (2) at parsimony level 2 (PARL2), we do not reduce to PNF and do
- not move protected atoms at all.
+ (2) at parsimony level 2 (PARL2), we do not reduce to PNF and do
+ not move protected atoms at all.
- {3 Algorithm for calculating FFTNF(_<_):}
+ {3 Algorithm for calculating FFTNF(_<_):}
- 1: Reduce to partially negation-normal prenex-normal form with
- existential-first minimized alternation -- do not push negation
- inside an existentially quantified ground subformula; collapse
- nonalternating quantifiers into quantifying over sets of
- variables. We call a negated existentially quantified ground
- subformula -- or equivalently a universally quantified ground
- subformula -- a subtask. PARL2: do partial NNF but not PNF.
+ 1: Reduce to partially negation-normal prenex-normal form with
+ existential-first minimized alternation -- do not push negation
+ inside an existentially quantified ground subformula; collapse
+ nonalternating quantifiers into quantifying over sets of
+ variables. We call a negated existentially quantified ground
+ subformula -- or equivalently a universally quantified ground
+ subformula -- a subtask. PARL2: do partial NNF but not PNF.
- 2: Collapse conjunctions and disjunctions using associativity.
+ 2: Collapse conjunctions and disjunctions using associativity.
- 3: The processed part is maintained explicitly; the zipper is
- built during the depth-first search for unprocessed literal and
- is then zipped by pulling-out the selected literal. PARL2: mark
- protected literals as processed.
+ 3: The processed part is maintained explicitly; the zipper is
+ built during the depth-first search for unprocessed literal and
+ is then zipped by pulling-out the selected literal. PARL2: mark
+ protected literals as processed.
- The whole term is searched depth-first for a subtask or the best
- literal to pull-out. A subtask is preferred, otherwise the first
- best literal is selected.
+ The whole term is searched depth-first for a subtask or the best
+ literal to pull-out. A subtask is preferred, otherwise the first
+ best literal is selected.
- A literal that has all variables quantified in the scope of some
- variable of another literal is worse than the other literal. If
- their oldest (quantified with widest scope) variable is the same,
- compare using the ordering _<_. "a _<_ b" means that a is better
- than b -- should be pulled out earlier. "a _<_ b" returns false if
- it is indifferent whether a or b should be first.
+ A literal that has all variables quantified in the scope of some
+ variable of another literal is worse than the other literal. If
+ their oldest (quantified with widest scope) variable is the same,
+ compare using the ordering _<_. "a _<_ b" means that a is better
+ than b -- should be pulled out earlier. "a _<_ b" returns false if
+ it is indifferent whether a or b should be first.
- The subtask or literal to be pulled out is replaced by T = And[],
- forming the initial location (context[],[T]).
+ The subtask or literal to be pulled out is replaced by T = And[],
+ forming the initial location (context[],[T]).
- Note: the literal is treated as "conjoined", as opposed
- to "disjoined", to the surroundings, because disjunctions of
- literals are much rarer than conjunctions.
+ Note: the literal is treated as "conjoined", as opposed
+ to "disjoined", to the surroundings, because disjunctions of
+ literals are much rarer than conjunctions.
- 4: When a subtask/literal is placed in its final location it is
- marked as processed. Denote by Qn, Qn', etc., a quantifier over a
- set of variables, and by -Qn a quantifier that is complementary to
- Qn (e.g. -ex vs.Phi = all vs.Phi). The result of pulling out a
- literal L of a location (context[],[fill-loc]) (denoted also as
- context[][fill-loc]) by cases on context[]:
+ 4: When a subtask/literal is placed in its final location it is
+ marked as processed. Denote by Qn, Qn', etc., a quantifier over a
+ set of variables, and by -Qn a quantifier that is complementary to
+ Qn (e.g. -ex vs.Phi = all vs.Phi). The result of pulling out a
+ literal L of a location (context[],[fill-loc]) (denoted also as
+ context[][fill-loc]) by cases on context[]:
- (a) context'[Qn.[]] where Qn = Qn' union Qn'' for Qn'
- contained in Var(L) and Qn'' disjoint with Var(L)
+ (a) context'[Qn.[]] where Qn = Qn' union Qn'' for Qn'
+ contained in Var(L) and Qn'' disjoint with Var(L)
- (a1) empty Qn': pull-out(context'[],[Qn.[fill-loc]])
+ (a1) empty Qn': pull-out(context'[],[Qn.[fill-loc]])
- (a2) nonempty Qn': context'[Qn'.(L /\ Qn''.[fill-loc])]
+ (a2) nonempty Qn': context'[Qn'.(L /\ Qn''.[fill-loc])]
- (b) context'[[] /\ C]: pull-out(context'[],[[fill-loc] /\ C])
+ (b) context'[[] /\ C]: pull-out(context'[],[[fill-loc] /\ C])
- (c) context'[Qn.([] \/ D)] where Qn1=Qn & Var(L),
- Qn2=Qn & Var(L,[fill-loc]) \ Var(D), Qn3=Qn & Var(L,[fill-loc]) & Var(D)
- Qn4=Qn & Var(D) \ Qn3, Qn5=Qn & Var([fill-loc]) \ Qn1 \ Qn3,
- Qn6=Qn & Var([fill-loc],D)
+ (c) context'[Qn.([] \/ D)] where Qn1=Qn & Var(L),
+ Qn2=Qn & Var(L,[fill-loc]) \ Var(D), Qn3=Qn & Var(L,[fill-loc]) & Var(D)
+ Qn4=Qn & Var(D) \ Qn3, Qn5=Qn & Var([fill-loc]) \ Qn1 \ Qn3,
+ Qn6=Qn & Var([fill-loc],D)
- (c0) PARL1 and Qn1=Qn:
- context[L /\ [fill-loc]]
+ (c0) PARL1 and Qn1=Qn:
+ context[L /\ [fill-loc]]
- (c1) empty Qn3:
- pull-out(context'[Qn2.[] \/ Qn4.D],[fill-loc])
+ (c1) empty Qn3:
+ pull-out(context'[Qn2.[] \/ Qn4.D],[fill-loc])
- (c2) nonempty Qn3 and Qn1, (nonempty Qn1\Qn3 or empty Qn3\Qn1):
- context'[Qn3.(Qn1\Qn3.(L /\ Qn5.[fill-loc]) \/ Qn4.D)]
+ (c2) nonempty Qn3 and Qn1, (nonempty Qn1\Qn3 or empty Qn3\Qn1):
+ context'[Qn3.(Qn1\Qn3.(L /\ Qn5.[fill-loc]) \/ Qn4.D)]
- (c3) Qn existential, nonempty Qn3\Qn1, empty Qn1\Qn3:
- pull-out(context'[Qn2+3.[] \/ Qn3+4.D],[fill-loc])
+ (c3) Qn existential, nonempty Qn3\Qn1, empty Qn1\Qn3:
+ pull-out(context'[Qn2+3.[] \/ Qn3+4.D],[fill-loc])
- (c4) Qn universal, nonempty Qn3\Qn1, empty Qn1\Qn3:
- pull-out(context'[Qn.(([] \/ D) /\ ([fill-loc] \/ D))],[T])
+ (c4) Qn universal, nonempty Qn3\Qn1, empty Qn1\Qn3:
+ pull-out(context'[Qn.(([] \/ D) /\ ([fill-loc] \/ D))],[T])
- (d) context'[Qn.(([] \/ D) /\ C)] where Qn1=Qn & Var(L),
- Qn2=Qn & Var(L,[fill-loc],D) \ Var(C),
- Qn3=Qn & Var(L,[fill-loc],D) & Var(C)
- Qn4=Qn & Var(C) \ Qn3, Qn5=Qn & Var(D,C),
- Qn6=Qn & Var(L,[fill-loc],C)
+ (d) context'[Qn.(([] \/ D) /\ C)] where Qn1=Qn & Var(L),
+ Qn2=Qn & Var(L,[fill-loc],D) \ Var(C),
+ Qn3=Qn & Var(L,[fill-loc],D) & Var(C)
+ Qn4=Qn & Var(C) \ Qn3, Qn5=Qn & Var(D,C),
+ Qn6=Qn & Var(L,[fill-loc],C)
- (d0) PARL1 and Qn1=Qn:
- context[L /\ [fill-loc]]
+ (d0) PARL1 and Qn1=Qn:
+ context[L /\ [fill-loc]]
- (d1) empty Qn3:
- pull-out(context'[Qn2.([] \/ D) /\ Qn4.C],[fill-loc])
+ (d1) empty Qn3:
+ pull-out(context'[Qn2.([] \/ D) /\ Qn4.C],[fill-loc])
- (d2) Qn universal:
- pull-out(context'[Qn2+3.([] \/ D) /\ Qn3+4.C])
+ (d2) Qn universal:
+ pull-out(context'[Qn2+3.([] \/ D) /\ Qn3+4.C])
- (d3) Qn existential, nonempty Qn3:
- pull-out(context'[Qn6.([] /\ C) \/ Qn5.(D /\ C)],[fill-loc])
+ (d3) Qn existential, nonempty Qn3:
+ pull-out(context'[Qn6.([] /\ C) \/ Qn5.(D /\ C)],[fill-loc])
- (e) context'[[] \/ D] when no quantifier in context':
- context[L /\ [fill-loc]]
+ (e) context'[[] \/ D] when no quantifier in context':
+ context[L /\ [fill-loc]]
- (f) context'[([] \/ D) /\ C] when neither case (d) nor (e):
+ (f) context'[([] \/ D) /\ C] when neither case (d) nor (e):
- (f1) If the pulled-out literal is protected in current scope, leave
- it here.
- context[L /\ [fill-loc]]
+ (f1) If the pulled-out literal is protected in current scope, leave
+ it here.
+ context[L /\ [fill-loc]]
- (f2) when the nearest quantifier is existential:
- pull-out(context'[([] /\ C) \/ (D /\ C)], [fill-loc])
+ (f2) when the nearest quantifier is existential:
+ pull-out(context'[([] /\ C) \/ (D /\ C)], [fill-loc])
- (f3) context'[(([] \/ D) /\ C) \/ E] (when the nearest q. is universal):
- pull-out(context'[([] \/ D \/ E) /\ (C \/ E)], [fill-loc])
+ (f3) context'[(([] \/ D) /\ C) \/ E] (when the nearest q. is universal):
+ pull-out(context'[([] \/ D \/ E) /\ (C \/ E)], [fill-loc])
- The same rules are applied for subtasks, where we take
- Var(subtask)=empty, and a subtask is protected only when not in
- scope of any quantifier.
+ The same rules are applied for subtasks, where we take
+ Var(subtask)=empty, and a subtask is protected only when not in
+ scope of any quantifier.
- 5: since the literals in conjunctions have been scrambled by the
- zipping process, they are sorted into the order in which they have
- been processed.
+ 5: since the literals in conjunctions have been scrambled by the
+ zipping process, they are sorted into the order in which they have
+ been processed.
- Compact tentative specification of FFTNF(_<_):
+ Compact tentative specification of FFTNF(_<_):
- Consider a graph whose nodes are literals of a formula and two
- nodes are connected by an edge iff the literals share a
- variable. Direct the edges so that there is no edge a->b for
- b_<_a. The formula is in FFTNF(_<_) iff it is in TNF and the number
- of quantifiers a literal is in scope of never decreases along an
- edge, for some such directing of edges.
+ Consider a graph whose nodes are literals of a formula and two
+ nodes are connected by an edge iff the literals share a
+ variable. Direct the edges so that there is no edge a->b for
+ b_<_a. The formula is in FFTNF(_<_) iff it is in TNF and the number
+ of quantifiers a literal is in scope of never decreases along an
+ edge, for some such directing of edges.
- FIXME: the above specification is not correct (too weak).
+ FIXME: the above specification is not correct (too weak).
*)
@@ -1017,87 +1017,90 @@
-(* **************************************************
+(** **************************************************
- {2 Computing the FF Separation}
+ {2 Computing the FF Separation}
- Let FFSEP(F)(Phi) be
- ((V1,F11,...,F1N_1,Guard1), ..., (VM,FM1,...,FMN_M,GuardM))
- where
+ Let FFSEP(PF,NF)(Phi) be
+ ((V1,F11,...,F1N_1,Guard1), ..., (VM,FM1,...,FMN_M,GuardM))
+ where
- * {F1, ..., FMN_M} are all fluent atoms that occur positively in Phi and
- whose free variables are contained in the existential prefix of
- PNF(Phi) (where PNF is "prenex normal, existential-first with
- minimized alternation, form") plus the free variables of Phi
+ * {F1, ..., FMN_M} are all PF atoms that occur positively in Phi
+ and NF atoms that occur negatively in Phi, and whose free variables
+ are contained in the existential prefix of PNF(Phi) (where PNF is
+ "prenex normal, existential-first with minimized alternation,
+ form") plus the free variables of Phi
- * (ex V1 (F11/\.../\F1N_1/\Guard1) \/ ...
- \/ ex VM (FM1/\.../\FMN_M/\GuardM))
- is equivalent to Phi with minimal application of distributivity
- (GuardI can contain disjunctions if they don't contain any of FIj)
+ * (ex V1 (F11/\.../\F1N_1/\Guard1) \/ ...
+ \/ ex VM (FM1/\.../\FMN_M/\GuardM))
+ is equivalent to Phi with minimal application of distributivity
+ (GuardI can contain disjunctions if they don't contain any of FIj)
- {3 Algorithm for computing the FFSEP(F)(Phi):}
+ {3 Algorithm for computing the FFSEP(PF,NF)(Phi):}
- 1: Find the free variables FV and existential prefix variables
- EV. Let "active atoms" be the positive atoms R(tup) with [R \in F]
- and [tup \in EV+FV].
+ 1: Find the free variables FV and existential prefix variables
+ EV. Let "active atoms" be the positive/negative atoms R(tup) with
+ [R \in PF/NF] and [tup \in EV+FV].
- 2: Flatten the formula Phi (using associativity), and push negation
- inside (partial NN) only when there is an active atom in the subformula.
- (Use [TProc (Not ...)] otherwise.)
+ 2: Flatten the formula Phi (using associativity), and push negation
+ inside (partial NN) only when there is an active atom in the subformula.
+ (Use [TProc (Not ...)] otherwise.)
- 3: Loop using a forest initialized with a single tree of
- the formula and empty atoms list. (The "already processed
- literal" tag [TProc] will not be used.) The forest of trees with
- atoms will constitute the answer ((F11,...,F1N_1,Guard1), ...,
- (FM1,...,FMN_M,GuardM)).
+ 3: Loop using a forest initialized with a single tree of
+ the formula and empty atoms list. (The "already processed
+ literal" tag [TProc] will not be used.) The forest of trees with
+ atoms will constitute the answer ((F11,...,F1N_1,Guard1), ...,
+ (FM1,...,FMN_M,GuardM)).
- 4: Find a positive atom R(tup) with [R \in F] and [tup \in EV],
- building a zipper to it. (Preprocessing guarantees that all other
- literals are packed into [TProc] during the main loop.)
+ 4: Find a positive/negative literal R(tup) with [R \in PF/NF] and
+ [tup \in EV], building a zipper to it. (Preprocessing guarantees
+ that all other literals are packed into [TProc] during the main
+ loop.)
- The atom to be pulled out is replaced by T = And[], forming the
- initial location (context[],[T]).
+ The literal to be pulled out is replaced by T = And[] (note the NN
+ form -- T is not under a negation), forming the initial location
+ (context[],[T]).
- 5: In the final location, attach the pulled-out atom to the tree's
- list. For a nonempty context location
- pull-out(context[],[fill-loc]) by cases on context[]:
+ 5: In the final location, attach the pulled-out literal to the tree's
+ list. For a nonempty context location
+ pull-out(context[],[fill-loc]) by cases on context[]:
- (a) context'[Qn.[]]: pull-out(context[],Qn.[fill-loc])
+ (a) context'[Qn.[]]: pull-out(context[],Qn.[fill-loc])
- (b) context'[[] /\ C]: pull-out(context[],[fill-loc] /\ C)
+ (b) context'[[] /\ C]: pull-out(context[],[fill-loc] /\ C)
- (c) context'[Qn.([] \/ D)]:
+ (c) context'[Qn.([] \/ D)]:
- (c1) Qn existential: pull-out(context'[Qn.[] \/ Qn.D], [fill-loc])
+ (c1) Qn existential: pull-out(context'[Qn.[] \/ Qn.D], [fill-loc])
- (c2) Qn universal, FV([fill-loc]) & Qn is empty:
- pull-out(context'[[] \/ Qn.D], [fill-loc])
+ (c2) Qn universal, FV([fill-loc]) & Qn is empty:
+ pull-out(context'[[] \/ Qn.D], [fill-loc])
- (c3) Qn universal, FV([fill-loc]) & Qn is not empty:
- pull-out(context'[([] \/ Qn.D) /\ Qn.([fill-loc] \/ D)],[T])
+ (c3) Qn universal, FV([fill-loc]) & Qn is not empty:
+ pull-out(context'[([] \/ Qn.D) /\ Qn.([fill-loc] \/ D)],[T])
- (d) context'[([] \/ D) /\ C] when the nearest quantifier is
- existential or none:
- pull-out(context'[([] /\ C) \/ (D /\ C)], [fill-loc])
+ (d) context'[([] \/ D) /\ C] when the nearest quantifier is
+ existential or none:
+ pull-out(context'[([] /\ C) \/ (D /\ C)], [fill-loc])
- (e) context'[Qn.(([] \/ D) /\ C)] (when Qn is universal):
- pull-out(context'[Qn.([] \/ D) /\ Qn.C], [fill-loc])
+ (e) context'[Qn.(([] \/ D) /\ C)] (when Qn is universal):
+ pull-out(context'[Qn.([] \/ D) /\ Qn.C], [fill-loc])
- (f) context'[(([] \/ D) /\ C) \/ E] (when the nearest q. is universal):
- pull-out(context'[([] \/ D \/ E) /\ (C \/ E)], [fill-loc])
+ (f) context'[(([] \/ D) /\ C) \/ E] (when the nearest q. is universal):
+ pull-out(context'[([] \/ D \/ E) /\ (C \/ E)], [fill-loc])
- (g) [] \/ D: split the tree into [fill-loc] and D trees, sharing
- atom lists, add the new atom to the [fill-loc] tree only
+ (g) [] \/ D: split the tree into [fill-loc] and D trees, sharing
+ atom lists, add the new atom to the [fill-loc] tree only
- 6: V = FV(F11,...,FMN_M), erase quantification over V from
- Guard1,...,GuardM.
+ 6: V = FV(F11,...,FMN_M), erase quantification over V from
+ Guard1,...,GuardM.
*)
(* Steps 1 and 2: Find free vars FV and existential prefix vars EV,
flatten formula, build the tree while pushing negation inside
(flatten if possible) if the subformula contains active atoms. *)
-let ffsep_init frels phi =
+let ffsep_init posi_frels nega_frels phi =
let fvs = FormulaOps.free_vars phi in
let rec aux neg evs = function
| Ex (vs, phi) when not neg ->
@@ -1111,12 +1114,12 @@
| Rel _ | RealExpr _ | Eq _ | In _ -> evs in
let evs = aux false Vars.empty phi in
let fevs = add_vars fvs evs in
- let is_active rel vs =
- Strings.mem rel frels &&
+ let is_active neg rel vs =
+ (neg && Strings.mem rel nega_frels ||
+ (not neg && Strings.mem rel posi_frels)) &&
array_for_all (fun v->Vars.mem v fevs) vs in
let rec has_active neg = function
- | Rel (rel, vs) when neg -> false
- | Rel (rel, vs) -> is_active rel (Formula.var_tup vs)
+ | Rel (rel, vs) -> is_active neg rel (Formula.var_tup vs)
| Not phi -> has_active (not neg) phi
| And js | Or js -> List.exists (has_active neg) js
| Ex (_, phi) | All (_, phi) -> has_active neg phi
@@ -1127,7 +1130,8 @@
t=TProc (0, if neg then Not phi else phi)}
else
match phi with
- | Rel _ as atom -> assert (not neg);
+ | Rel _ as atom ->
+ (* the atom is actually a literal, negative if [rel \in NF] *)
{fvs=vars_of_list (FormulaOps.free_vars atom); t=TLit atom}
| Not phi -> build (not neg) phi
| Ex (vs, phi) ->
@@ -1260,8 +1264,8 @@
(* Step 3, point (g) of step 5, step 6. *)
-let ffsep frels phi =
- let fvs, evs, tree = ffsep_init frels phi in
+let ffsep posi_frels nega_frels phi =
+ let fvs, evs, tree = ffsep_init posi_frels nega_frels phi in
(* step 3 *)
let rec loop solved climbed =
match climbed with [] -> solved
Modified: trunk/Toss/Formula/FFTNF.mli
===================================================================
--- trunk/Toss/Formula/FFTNF.mli 2011-03-22 18:22:54 UTC (rev 1378)
+++ trunk/Toss/Formula/FFTNF.mli 2011-03-23 00:41:31 UTC (rev 1379)
@@ -36,5 +36,5 @@
val ffsep :
- Aux.Strings.t -> Formula.formula ->
+ Aux.Strings.t -> Aux.Strings.t -> Formula.formula ->
(Formula.fo_var list * Formula.formula list * Formula.formula) list
Modified: trunk/Toss/Formula/FFTNFTest.ml
===================================================================
--- trunk/Toss/Formula/FFTNFTest.ml 2011-03-22 18:22:54 UTC (rev 1378)
+++ trunk/Toss/Formula/FFTNFTest.ml 2011-03-23 00:41:31 UTC (rev 1379)
@@ -32,8 +32,8 @@
(* Alpha-conversion of the above. *)
let winQvwxyz_idempotent = "ex v ((Q(v) and (ex w2 ((R(v, w2) and Q(w2) and ex x2 ((R(w2, x2) and Q(x2) and ex y2 ((R(x2, y2) and Q(y2) and ex z2 ((R(y2, z2) and Q(z2))))))))) or ex w1 ((C(v, w1) and Q(w1) and ex x1 ((C(w1, x1) and Q(x1) and ex y1 ((C(x1, y1) and Q(y1) and ex z1 ((C(y1, z1) and Q(z1))))))))) or ex r0 ((R(v, r0) and ex w0 ((C(r0, w0) and ...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-23 13:00:10
|
Revision: 1380
http://toss.svn.sourceforge.net/toss/?rev=1380&view=rev
Author: lukstafi
Date: 2011-03-23 13:00:03 +0000 (Wed, 23 Mar 2011)
Log Message:
-----------
Fluents fix: consider all rules for sign check. GameSimpl: relation-with-inverse gluing bug fix; other minor bug fix. Tests: GDL test rule with inverse diagonal move; Server GDL auto-transl tictactoe more deterministic setup.
Modified Paths:
--------------
trunk/Toss/Arena/Arena.ml
trunk/Toss/Arena/Arena.mli
trunk/Toss/Arena/DiscreteRule.ml
trunk/Toss/Arena/DiscreteRule.mli
trunk/Toss/GGP/GDLTest.ml
trunk/Toss/GGP/GameSimpl.ml
trunk/Toss/GGP/GameSimplTest.ml
trunk/Toss/GGP/tests/breakthrough-simpl.toss
trunk/Toss/GGP/tests/connect5-simpl.toss
trunk/Toss/Play/Heuristic.ml
trunk/Toss/Play/HeuristicTest.ml
trunk/Toss/Server/ServerGDLTest.in2
trunk/Toss/Server/ServerGDLTest.out2
Modified: trunk/Toss/Arena/Arena.ml
===================================================================
--- trunk/Toss/Arena/Arena.ml 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Arena/Arena.ml 2011-03-23 13:00:03 UTC (rev 1380)
@@ -443,12 +443,7 @@
let all_fluents game =
let drules =
List.map (fun r -> (snd r).ContinuousRule.compiled) game.rules in
- let fluents = List.map DiscreteRule.fluents drules in
- let frels (posi_frels, nega_frels, indef_frels) =
- Aux.Strings.union indef_frels
- (Aux.Strings.union posi_frels nega_frels) in
- List.fold_left Aux.Strings.union Aux.Strings.empty
- (List.map frels fluents)
+ DiscreteRule.fluents drules
(* Compare two (game, state) pairs and explain the first difference
Modified: trunk/Toss/Arena/Arena.mli
===================================================================
--- trunk/Toss/Arena/Arena.mli 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Arena/Arena.mli 2011-03-23 13:00:03 UTC (rev 1380)
@@ -124,7 +124,7 @@
val map_to_discrete :
(DiscreteRule.rule -> DiscreteRule.rule) -> game -> game
-val all_fluents : game -> Aux.Strings.t
+val all_fluents : game -> Aux.Strings.t * Aux.Strings.t * Aux.Strings.t
(** Compare two (game, state) pairs and explain the first difference
met. Formulas and expressions are compared for syntactical
Modified: trunk/Toss/Arena/DiscreteRule.ml
===================================================================
--- trunk/Toss/Arena/DiscreteRule.ml 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Arena/DiscreteRule.ml 2011-03-23 13:00:03 UTC (rev 1380)
@@ -64,19 +64,26 @@
Aux.map_some fl_make r.rhs_pos_tuples
else Aux.map_some fl_make (r.rhs_pos_tuples @ r.rhs_neg_tuples)
-let fluents r =
+let fluents rules =
let map_rels =
Aux.map_some (fun (rel,tups)->if tups=[] then None else Some rel) in
- let posi_cands = Aux.strings_of_list (map_rels r.rhs_pos_tuples) in
- let nega_cands = Aux.strings_of_list (map_rels r.rhs_neg_tuples) in
+ let posi_cands = Aux.strings_of_list (
+ Aux.concat_map (fun r->map_rels r.rhs_pos_tuples) rules) in
+ let nega_cands = Aux.strings_of_list (
+ Aux.concat_map (fun r->map_rels r.rhs_neg_tuples) rules) in
let fluents = Aux.Strings.union posi_cands nega_cands in
let posi = Aux.Strings.diff posi_cands nega_cands
and nega = Aux.Strings.diff nega_cands posi_cands in
- let posi_lhs, nega_lhs = FormulaOps.rels_signs r.lhs_form in
+ let posi_lhs, nega_lhs =
+ List.fold_left (fun (posi,nega) r ->
+ let mp, mn = FormulaOps.rels_signs r.lhs_form in
+ Aux.Strings.union mp posi, Aux.Strings.union mn nega)
+ (Aux.Strings.empty, Aux.Strings.empty) rules in
let posi = Aux.Strings.diff posi posi_lhs in
let nega = Aux.Strings.diff nega nega_lhs in
posi, nega, Aux.Strings.diff fluents (Aux.Strings.union posi nega)
+
(* A fluent precondition is an approximation to the condition on a
structure for the positive/negative fluent to appear/disappear at a
position. We are only interested in expanding preconditions of
Modified: trunk/Toss/Arena/DiscreteRule.mli
===================================================================
--- trunk/Toss/Arena/DiscreteRule.mli 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Arena/DiscreteRule.mli 2011-03-23 13:00:03 UTC (rev 1380)
@@ -54,7 +54,7 @@
only deleted) and only positively on LHSes and in
preconditions. (Call the remaining fluents indefinite.) See
{!Heuristic}. *)
-val fluents : rule_obj -> Aux.Strings.t * Aux.Strings.t * Aux.Strings.t
+val fluents : rule_obj list -> Aux.Strings.t * Aux.Strings.t * Aux.Strings.t
val fluents_make : ?only_pos : bool -> (string -> int -> 'a) ->
rule_obj -> 'a list
Modified: trunk/Toss/GGP/GDLTest.ml
===================================================================
--- trunk/Toss/GGP/GDLTest.ml 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/GGP/GDLTest.ml 2011-03-23 13:00:03 UTC (rev 1380)
@@ -174,12 +174,12 @@
"breakthrough" >::
(fun () ->
game_test_case ~game_name:"breakthrough" ~player:"white"
- ~loc0_rule_name:"move_x1_y1_x2_y2_00"
+ ~loc0_rule_name:"move_x1_y1_x2_y2_0"
~loc0_emb:[
"cellholds_x1_y1__blank_", "cellholds_2_2_MV1";
- "cellholds_x2_y2__blank_", "cellholds_3_3_MV1";
+ "cellholds_x2_y2__blank_", "cellholds_1_3_MV1";
"control__blank_", "control_MV1"]
- ~loc0_move:"(move 2 2 3 3)" ~loc0_noop:"noop" ~loc1:1
+ ~loc0_move:"(move 2 2 1 3)" ~loc0_noop:"noop" ~loc1:1
~loc1_rule_name:"move_x1_y1_x2_y2_1"
~loc1_emb:[
"cellholds_x1_y1__blank_", "cellholds_7_7_MV1";
Modified: trunk/Toss/GGP/GameSimpl.ml
===================================================================
--- trunk/Toss/GGP/GameSimpl.ml 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/GGP/GameSimpl.ml 2011-03-23 13:00:03 UTC (rev 1380)
@@ -135,7 +135,9 @@
let signat = Structure.rel_signature struc in
let nelems = Structure.Elems.cardinal struc.Structure.elements in
let tcard tups = Tups.cardinal tups in
- let fluents = Arena.all_fluents game in
+ let posi_f, nega_f, indef_f = Arena.all_fluents game in
+ let fluents =
+ Aux.Strings.union (Aux.Strings.union posi_f nega_f) indef_f in
(* {{{ log entry *)
if !debug_level > 0 then (
Printf.printf "GameSimpl: fluents = %s\n%!"
@@ -188,24 +190,26 @@
then crel
else
(* 1a *)
- let crel =
- Aux.not_conflicting_name ~truncate:true !used_rels "C" in
+ let crel =
+ Aux.not_conflicting_name ~truncate:true !used_rels "C" in
(* {{{ log entry *)
- if !debug_level > 3 then (
- Printf.printf "Complemented: crel=%s\n%!" crel
- );
+ if !debug_level > 3 then (
+ Printf.printf "Complemented: crel=%s\n%!" crel
+ );
(* }}} *)
- complemented := (crel, rel) :: !complemented;
- struc := Structure.add_rels !struc crel
- (Tups.elements (Tups.diff predicate_tups rel_tups));
- signat := (crel, arity) :: !signat;
- used_rels := Aux.Strings.add crel !used_rels;
- Some crel in
+ complemented := (crel, rel) :: !complemented;
+ struc := Structure.add_rels !struc crel
+ (Tups.elements (Tups.diff predicate_tups rel_tups));
+ signat := (crel, arity) :: !signat;
+ used_rels := Aux.Strings.add crel !used_rels;
+ Some crel in
Aux.StrMap.add rel crel table
) Aux.StrMap.empty !signat in
let struc = !struc in
let signat = !signat in
- let complements rel = Aux.StrMap.find rel complements in
+ let complements rel =
+ try Aux.StrMap.find rel complements
+ with Not_found -> None in
(* prepare for (1bc) and (2) *)
let subset_table =
List.fold_left (fun table (rel,arity) ->
@@ -255,7 +259,7 @@
| None -> rel
| Some spec -> DiscreteRule.orig_rel_of rel in
rel <> "" &&
- not (Aux.Strings.mem rel fluents) &&
+ not (Aux.Strings.mem rel fluents) &&
not (List.mem_assoc rel game.Arena.defined_rels) &&
not (List.exists (fun (_,(rel2,_)) -> rel2=rel) equivalent) &&
not (Aux.Strings.mem (fst (List.assoc rel equivalent)) fluents ||
@@ -442,6 +446,12 @@
| _ -> assert false) tuples2) in
let tuples = Tups.elements
(Tups.inter graph1 inv_graph) in
+ (* {{{ log entry *)
+ if !debug_level > 3 then (
+ Printf.printf "Generating-inv: %s_INV_%s -- tuple: %s\n%!"
+ rel1 rel2 (Structure.tuple_str struc (List.hd tuples))
+ );
+ (* }}} *)
Structure.add_rels struc grel tuples in
(* preparing (3a-d) *)
@@ -503,7 +513,7 @@
Aux.not_conflicting_name ~truncate:true !used_rels "R" in
used_rels := Aux.Strings.add grel !used_rels;
glued_inv := (grel, rels) :: !glued_inv;
- struc := intersect_with_inv !struc grel rel1 rel2;
+ struc := intersect_with_inv !struc grel rel inv_rel;
signat := (grel, Array.length args) :: !signat;
(grel, args)::loop more)
else (rel1, args1)::loop more
@@ -531,8 +541,8 @@
List.fold_left (fun sets args ->
let args = Array.to_list args in
(let try set, sets =
- Aux.pop_find (fun set ->
- List.exists (fun a->List.mem a set) args) sets in
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) args) sets in
Aux.unique_sorted (args @ set) :: sets
with Not_found -> args::sets)
) [] tups in
@@ -546,8 +556,8 @@
with Not_found -> [], eq_sets in
let argset = Array.to_list args in
(let try set, sets =
- Aux.pop_find (fun set ->
- List.exists (fun a->List.mem a set) argset) sets in
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) argset) sets in
if List.for_all (fun a->List.mem a set) argset
then old
else
@@ -556,7 +566,7 @@
with Not_found -> (rel, argset::sets)::eq_sets, atom::rels)
) (eq_sets, []) rels in
grels @ rels in
-
+
(* the step of 3d *)
let gluable rel =
not (Aux.Strings.mem rel fluents) &&
@@ -667,8 +677,8 @@
List.fold_left (fun sets args ->
let args = Array.to_list args in
(let try set, sets =
- Aux.pop_find (fun set ->
- List.exists (fun a->List.mem a set) args) sets in
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) args) sets in
Aux.unique_sorted (args @ set) :: sets
with Not_found -> args::sets)
) [] tups in
@@ -682,8 +692,8 @@
with Not_found -> [], eq_sets in
let argset = Array.to_list args in
(let try set, sets =
- Aux.pop_find (fun set ->
- List.exists (fun a->List.mem a set) argset) sets in
+ Aux.pop_find (fun set ->
+ List.exists (fun a->List.mem a set) argset) sets in
if List.for_all (fun a->List.mem a set) argset
then (rel, set::sets)::eq_sets, atom::drels
else (rel, Aux.unique_sorted (argset @ set) :: sets)
@@ -744,7 +754,7 @@
else DiscreteRule.orig_rel_of rel in
let res =
(not keep_predicates || List.assoc rel signat > 1) &&
- not (Aux.Strings.mem rel fluents) &&
+ not (Aux.Strings.mem rel fluents) &&
not (List.mem_assoc rel game.Arena.defined_rels) &&
not (Aux.Strings.mem rel used_rels) in
(* {{{ log entry *)
Modified: trunk/Toss/GGP/GameSimplTest.ml
===================================================================
--- trunk/Toss/GGP/GameSimplTest.ml 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/GGP/GameSimplTest.ml 2011-03-23 13:00:03 UTC (rev 1380)
@@ -62,11 +62,11 @@
(* The action below is used to regenerate the test targets when
{!GameSimpl.simplify} changes. *)
let a () =
- let game_name = "tictactoe" in
-
+ let game_name = "connect5" in
+
let game = state_of_file ("./GGP/tests/"^game_name^"-raw.toss") in
Printf.printf "\nINPUT:\n%s\n%!" (Arena.state_str game);
- GameSimpl.debug_level := 4;
+ (* GameSimpl.debug_level := 5; *)
let res = GameSimpl.simplify game in
let resf = open_out ("./GGP/tests/"^game_name^"-simpl.toss") in
let res_str = Arena.state_str res in
Modified: trunk/Toss/GGP/tests/breakthrough-simpl.toss
===================================================================
--- trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-23 13:00:03 UTC (rev 1380)
@@ -308,55 +308,55 @@
cellholds_1_4_MV1, cellholds_1_3_MV1, cellholds_1_2_MV1, cellholds_1_1_MV1
|
R {
- (cellholds_8_7_MV1, cellholds_7_8_MV1);
- (cellholds_8_6_MV1, cellholds_7_7_MV1);
- (cellholds_8_5_MV1, cellholds_7_6_MV1);
- (cellholds_8_4_MV1, cellholds_7_5_MV1);
- (cellholds_8_3_MV1, cellholds_7_4_MV1);
- (cellholds_8_2_MV1, cellholds_7_3_MV1);
- (cellholds_8_1_MV1, cellholds_7_2_MV1);
- (cellholds_7_7_MV1, cellholds_6_8_MV1);
- (cellholds_7_6_MV1, cellholds_6_7_MV1);
- (cellholds_7_5_MV1, cellholds_6_6_MV1);
- (cellholds_7_4_MV1, cellholds_6_5_MV1);
- (cellholds_7_3_MV1, cellholds_6_4_MV1);
- (cellholds_7_2_MV1, cellholds_6_3_MV1);
- (cellholds_7_1_MV1, cellholds_6_2_MV1);
- (cellholds_6_7_MV1, cellholds_5_8_MV1);
- (cellholds_6_6_MV1, cellholds_5_7_MV1);
- (cellholds_6_5_MV1, cellholds_5_6_MV1);
- (cellholds_6_4_MV1, cellholds_5_5_MV1);
- (cellholds_6_3_MV1, cellholds_5_4_MV1);
- (cellholds_6_2_MV1, cellholds_5_3_MV1);
- (cellholds_6_1_MV1, cellholds_5_2_MV1);
- (cellholds_5_7_MV1, cellholds_4_8_MV1);
- (cellholds_5_6_MV1, cellholds_4_7_MV1);
- (cellholds_5_5_MV1, cellholds_4_6_MV1);
- (cellholds_5_4_MV1, cellholds_4_5_MV1);
- (cellholds_5_3_MV1, cellholds_4_4_MV1);
- (cellholds_5_2_MV1, cellholds_4_3_MV1);
- (cellholds_5_1_MV1, cellholds_4_2_MV1);
- (cellholds_4_7_MV1, cellholds_3_8_MV1);
- (cellholds_4_6_MV1, cellholds_3_7_MV1);
- (cellholds_4_5_MV1, cellholds_3_6_MV1);
- (cellholds_4_4_MV1, cellholds_3_5_MV1);
- (cellholds_4_3_MV1, cellholds_3_4_MV1);
- (cellholds_4_2_MV1, cellholds_3_3_MV1);
- (cellholds_4_1_MV1, cellholds_3_2_MV1);
- (cellholds_3_7_MV1, cellholds_2_8_MV1);
- (cellholds_3_6_MV1, cellholds_2_7_MV1);
- (cellholds_3_5_MV1, cellholds_2_6_MV1);
- (cellholds_3_4_MV1, cellholds_2_5_MV1);
- (cellholds_3_3_MV1, cellholds_2_4_MV1);
- (cellholds_3_2_MV1, cellholds_2_3_MV1);
- (cellholds_3_1_MV1, cellholds_2_2_MV1);
- (cellholds_2_7_MV1, cellholds_1_8_MV1);
- (cellholds_2_6_MV1, cellholds_1_7_MV1);
- (cellholds_2_5_MV1, cellholds_1_6_MV1);
- (cellholds_2_4_MV1, cellholds_1_5_MV1);
- (cellholds_2_3_MV1, cellholds_1_4_MV1);
- (cellholds_2_2_MV1, cellholds_1_3_MV1);
- (cellholds_2_1_MV1, cellholds_1_2_MV1)
+ (cellholds_7_8_MV1, cellholds_8_7_MV1);
+ (cellholds_7_7_MV1, cellholds_8_6_MV1);
+ (cellholds_7_6_MV1, cellholds_8_5_MV1);
+ (cellholds_7_5_MV1, cellholds_8_4_MV1);
+ (cellholds_7_4_MV1, cellholds_8_3_MV1);
+ (cellholds_7_3_MV1, cellholds_8_2_MV1);
+ (cellholds_7_2_MV1, cellholds_8_1_MV1);
+ (cellholds_6_8_MV1, cellholds_7_7_MV1);
+ (cellholds_6_7_MV1, cellholds_7_6_MV1);
+ (cellholds_6_6_MV1, cellholds_7_5_MV1);
+ (cellholds_6_5_MV1, cellholds_7_4_MV1);
+ (cellholds_6_4_MV1, cellholds_7_3_MV1);
+ (cellholds_6_3_MV1, cellholds_7_2_MV1);
+ (cellholds_6_2_MV1, cellholds_7_1_MV1);
+ (cellholds_5_8_MV1, cellholds_6_7_MV1);
+ (cellholds_5_7_MV1, cellholds_6_6_MV1);
+ (cellholds_5_6_MV1, cellholds_6_5_MV1);
+ (cellholds_5_5_MV1, cellholds_6_4_MV1);
+ (cellholds_5_4_MV1, cellholds_6_3_MV1);
+ (cellholds_5_3_MV1, cellholds_6_2_MV1);
+ (cellholds_5_2_MV1, cellholds_6_1_MV1);
+ (cellholds_4_8_MV1, cellholds_5_7_MV1);
+ (cellholds_4_7_MV1, cellholds_5_6_MV1);
+ (cellholds_4_6_MV1, cellholds_5_5_MV1);
+ (cellholds_4_5_MV1, cellholds_5_4_MV1);
+ (cellholds_4_4_MV1, cellholds_5_3_MV1);
+ (cellholds_4_3_MV1, cellholds_5_2_MV1);
+ (cellholds_4_2_MV1, cellholds_5_1_MV1);
+ (cellholds_3_8_MV1, cellholds_4_7_MV1);
+ (cellholds_3_7_MV1, cellholds_4_6_MV1);
+ (cellholds_3_6_MV1, cellholds_4_5_MV1);
+ (cellholds_3_5_MV1, cellholds_4_4_MV1);
+ (cellholds_3_4_MV1, cellholds_4_3_MV1);
+ (cellholds_3_3_MV1, cellholds_4_2_MV1);
+ (cellholds_3_2_MV1, cellholds_4_1_MV1);
+ (cellholds_2_8_MV1, cellholds_3_7_MV1);
+ (cellholds_2_7_MV1, cellholds_3_6_MV1);
+ (cellholds_2_6_MV1, cellholds_3_5_MV1);
+ (cellholds_2_5_MV1, cellholds_3_4_MV1);
+ (cellholds_2_4_MV1, cellholds_3_3_MV1);
+ (cellholds_2_3_MV1, cellholds_3_2_MV1);
+ (cellholds_2_2_MV1, cellholds_3_1_MV1);
+ (cellholds_1_8_MV1, cellholds_2_7_MV1);
+ (cellholds_1_7_MV1, cellholds_2_6_MV1);
+ (cellholds_1_6_MV1, cellholds_2_5_MV1);
+ (cellholds_1_5_MV1, cellholds_2_4_MV1);
+ (cellholds_1_4_MV1, cellholds_2_3_MV1);
+ (cellholds_1_3_MV1, cellholds_2_2_MV1);
+ (cellholds_1_2_MV1, cellholds_2_1_MV1)
};
R0 {
(cellholds_7_7_MV1, cellholds_8_8_MV1);
Modified: trunk/Toss/GGP/tests/connect5-simpl.toss
===================================================================
--- trunk/Toss/GGP/tests/connect5-simpl.toss 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/GGP/tests/connect5-simpl.toss 2011-03-23 13:00:03 UTC (rev 1380)
@@ -730,31 +730,31 @@
(cell_a_a_MV1, cell_b_b_MV1)
};
R2 {
- (cell_h_g_MV1, cell_g_h_MV1); (cell_h_f_MV1, cell_g_g_MV1);
- (cell_h_e_MV1, cell_g_f_MV1); (cell_h_d_MV1, cell_g_e_MV1);
- (cell_h_c_MV1, cell_g_d_MV1); (cell_h_b_MV1, cell_g_c_MV1);
- (cell_h_a_MV1, cell_g_b_MV1); (cell_g_g_MV1, cell_f_h_MV1);
- (cell_g_f_MV1, cell_f_g_MV1); (cell_g_e_MV1, cell_f_f_MV1);
- (cell_g_d_MV1, cell_f_e_MV1); (cell_g_c_MV1, cell_f_d_MV1);
- (cell_g_b_MV1, cell_f_c_MV1); (cell_g_a_MV1, cell_f_b_MV1);
- (cell_f_g_MV1, cell_e_h_MV1); (cell_f_f_MV1, cell_e_g_MV1);
- (cell_f_e_MV1, cell_e_f_MV1); (cell_f_d_MV1, cell_e_e_MV1);
- (cell_f_c_MV1, cell_e_d_MV1); (cell_f_b_MV1, cell_e_c_MV1);
- (cell_f_a_MV1, cell_e_b_MV1); (cell_e_g_MV1, cell_d_h_MV1);
- (cell_e_f_MV1, cell_d_g_MV1); (cell_e_e_MV1, cell_d_f_MV1);
- (cell_e_d_MV1, cell_d_e_MV1); (cell_e_c_MV1, cell_d_d_MV1);
- (cell_e_b_MV1, cell_d_c_MV1); (cell_e_a_MV1, cell_d_b_MV1);
- (cell_d_g_MV1, cell_c_h_MV1); (cell_d_f_MV1, cell_c_g_MV1);
- (cell_d_e_MV1, cell_c_f_MV1); (cell_d_d_MV1, cell_c_e_MV1);
- (cell_d_c_MV1, cell_c_d_MV1); (cell_d_b_MV1, cell_c_c_MV1);
- (cell_d_a_MV1, cell_c_b_MV1); (cell_c_g_MV1, cell_b_h_MV1);
- (cell_c_f_MV1, cell_b_g_MV1); (cell_c_e_MV1, cell_b_f_MV1);
- (cell_c_d_MV1, cell_b_e_MV1); (cell_c_c_MV1, cell_b_d_MV1);
- (cell_c_b_MV1, cell_b_c_MV1); (cell_c_a_MV1, cell_b_b_MV1);
- (cell_b_g_MV1, cell_a_h_MV1); (cell_b_f_MV1, cell_a_g_MV1);
- (cell_b_e_MV1, cell_a_f_MV1); (cell_b_d_MV1, cell_a_e_MV1);
- (cell_b_c_MV1, cell_a_d_MV1); (cell_b_b_MV1, cell_a_c_MV1);
- (cell_b_a_MV1, cell_a_b_MV1)
+ (cell_g_h_MV1, cell_h_g_MV1); (cell_g_g_MV1, cell_h_f_MV1);
+ (cell_g_f_MV1, cell_h_e_MV1); (cell_g_e_MV1, cell_h_d_MV1);
+ (cell_g_d_MV1, cell_h_c_MV1); (cell_g_c_MV1, cell_h_b_MV1);
+ (cell_g_b_MV1, cell_h_a_MV1); (cell_f_h_MV1, cell_g_g_MV1);
+ (cell_f_g_MV1, cell_g_f_MV1); (cell_f_f_MV1, cell_g_e_MV1);
+ (cell_f_e_MV1, cell_g_d_MV1); (cell_f_d_MV1, cell_g_c_MV1);
+ (cell_f_c_MV1, cell_g_b_MV1); (cell_f_b_MV1, cell_g_a_MV1);
+ (cell_e_h_MV1, cell_f_g_MV1); (cell_e_g_MV1, cell_f_f_MV1);
+ (cell_e_f_MV1, cell_f_e_MV1); (cell_e_e_MV1, cell_f_d_MV1);
+ (cell_e_d_MV1, cell_f_c_MV1); (cell_e_c_MV1, cell_f_b_MV1);
+ (cell_e_b_MV1, cell_f_a_MV1); (cell_d_h_MV1, cell_e_g_MV1);
+ (cell_d_g_MV1, cell_e_f_MV1); (cell_d_f_MV1, cell_e_e_MV1);
+ (cell_d_e_MV1, cell_e_d_MV1); (cell_d_d_MV1, cell_e_c_MV1);
+ (cell_d_c_MV1, cell_e_b_MV1); (cell_d_b_MV1, cell_e_a_MV1);
+ (cell_c_h_MV1, cell_d_g_MV1); (cell_c_g_MV1, cell_d_f_MV1);
+ (cell_c_f_MV1, cell_d_e_MV1); (cell_c_e_MV1, cell_d_d_MV1);
+ (cell_c_d_MV1, cell_d_c_MV1); (cell_c_c_MV1, cell_d_b_MV1);
+ (cell_c_b_MV1, cell_d_a_MV1); (cell_b_h_MV1, cell_c_g_MV1);
+ (cell_b_g_MV1, cell_c_f_MV1); (cell_b_f_MV1, cell_c_e_MV1);
+ (cell_b_e_MV1, cell_c_d_MV1); (cell_b_d_MV1, cell_c_c_MV1);
+ (cell_b_c_MV1, cell_c_b_MV1); (cell_b_b_MV1, cell_c_a_MV1);
+ (cell_a_h_MV1, cell_b_g_MV1); (cell_a_g_MV1, cell_b_f_MV1);
+ (cell_a_f_MV1, cell_b_e_MV1); (cell_a_e_MV1, cell_b_d_MV1);
+ (cell_a_d_MV1, cell_b_c_MV1); (cell_a_c_MV1, cell_b_b_MV1);
+ (cell_a_b_MV1, cell_b_a_MV1)
};
cell_a_y_MV1 {
cell_a_h_MV1; cell_a_g_MV1; cell_a_f_MV1; cell_a_e_MV1; cell_a_d_MV1;
Modified: trunk/Toss/Play/Heuristic.ml
===================================================================
--- trunk/Toss/Play/Heuristic.ml 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Play/Heuristic.ml 2011-03-23 13:00:03 UTC (rev 1380)
@@ -991,32 +991,12 @@
let use_monotonic = ref true
let default_heuristic_old ?struc ?advr
- {Arena.rules=rules; Arena.graph=graph} =
+ ({Arena.rules=rules; Arena.graph=graph} as game) =
(* TODO: cache the default heuristic in game definition or state *)
let drules =
List.map (fun r -> (snd r).ContinuousRule.compiled) rules in
- let fluents = List.map DiscreteRule.fluents drules in
let posi_frels, nega_frels, indef_frels =
- List.fold_left (fun (posi_frels, nega_frels, indef_frels)
- (more_posi, more_nega, more_indef) ->
- let posi =
- Aux.Strings.diff more_posi
- (Aux.Strings.union nega_frels indef_frels) in
- let nega =
- Aux.Strings.diff more_nega
- (Aux.Strings.union posi_frels indef_frels) in
- let more =
- Aux.Strings.union more_indef
- (Aux.Strings.union more_posi more_nega) in
- let indef =
- Aux.Strings.diff more
- (Aux.Strings.union posi nega) in
- Aux.Strings.union posi
- (Aux.Strings.diff posi_frels more),
- Aux.Strings.union nega
- (Aux.Strings.diff nega_frels more),
- Aux.Strings.union indef indef_frels
- ) (Aux.Strings.empty, Aux.Strings.empty, Aux.Strings.empty) fluents in
+ Arena.all_fluents game in
let array_plus ar =
Array.fold_right (fun x y->Plus (x, y)) ar (Const 0.) in
let all_payoffs =
Modified: trunk/Toss/Play/HeuristicTest.ml
===================================================================
--- trunk/Toss/Play/HeuristicTest.ml 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Play/HeuristicTest.ml 2011-03-23 13:00:03 UTC (rev 1380)
@@ -62,28 +62,8 @@
(fun r ar si -> (r,ar)::si)
signat_struc.Structure.rel_signature [] in
let drules = List.map (DiscreteRule.compile_rule signature []) rules in
- let fluents = List.map DiscreteRule.fluents drules in
let posi_frels, nega_frels, indef_frels =
- List.fold_left (fun (posi_frels, nega_frels, indef_frels)
- (more_posi, more_nega, more_indef) ->
- let posi =
- Aux.Strings.diff more_posi
- (Aux.Strings.union nega_frels indef_frels) in
- let nega =
- Aux.Strings.diff more_nega
- (Aux.Strings.union posi_frels indef_frels) in
- let more =
- Aux.Strings.union more_indef
- (Aux.Strings.union more_posi more_nega) in
- let indef =
- Aux.Strings.diff more
- (Aux.Strings.union posi nega) in
- Aux.Strings.union posi
- (Aux.Strings.diff posi_frels more),
- Aux.Strings.union nega
- (Aux.Strings.diff nega_frels more),
- Aux.Strings.union indef indef_frels
- ) (Aux.Strings.empty, Aux.Strings.empty, Aux.Strings.empty) fluents in
+ DiscreteRule.fluents drules in
let posi_poff_rels, nega_poff_rels =
FormulaOps.rels_signs_expr payoff in
let all_poff_rels =
Modified: trunk/Toss/Server/ServerGDLTest.in2
===================================================================
--- trunk/Toss/Server/ServerGDLTest.in2 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Server/ServerGDLTest.in2 2011-03-23 13:00:03 UTC (rev 1380)
@@ -3,9 +3,9 @@
Sender: GAMEMASTER
Receiver: GAMEPLAYER
Content-type: text/acl
-Content-length: 1652
+Content-length: 1664
-(START MATCH.3316980891 OPLAYER ((ROLE XPLAYER) (ROLE OPLAYER) (INIT (CELL 1 1 B)) (INIT (CELL 1 2 B)) (INIT (CELL 1 3 B)) (INIT (CELL 2 1 B)) (INIT (CELL 2 2 B)) (INIT (CELL 2 3 B)) (INIT (CELL 3 1 B)) (INIT (CELL 3 2 B)) (INIT (CELL 3 3 B)) (INIT (CONTROL XPLAYER)) (<= (NEXT (CELL ?X ?Y ?PLAYER)) (DOES ?PLAYER (MARK ?X ?Y))) (<= (NEXT (CELL ?X ?Y ?MARK)) (TRUE (CELL ?X ?Y ?MARK)) (DOES ?PLAYER (MARK ?M ?N)) (DISTINCTCELL ?X ?Y ?M ?N)) (<= (NEXT (CONTROL XPLAYER)) (TRUE (CONTROL OPLAYER))) (<= (NEXT (CONTROL OPLAYER)) (TRUE (CONTROL XPLAYER))) (<= (ROW ?X ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL ?X 1 ?PLAYER)) (TRUE (CELL ?X 2 ?PLAYER)) (TRUE (CELL ?X 3 ?PLAYER))) (<= (COLUMN ?Y ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL 1 ?Y ?PLAYER)) (TRUE (CELL 2 ?Y ?PLAYER)) (TRUE (CELL 3 ?Y ?PLAYER))) (<= (DIAGONAL ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL 1 1 ?PLAYER)) (TRUE (CELL 2 2 ?PLAYER)) (TRUE (CELL 3 3 ?PLAYER))) (<= (DIAGONAL ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL 1 3 ?PLAYER)) (TRUE (CELL 2 2 ?PLAYER)) (TRUE (CELL 3 1 ?PLAYER))) (<= (LINE ?PLAYER) (ROW ?X ?PLAYER)) (<= (LINE ?PLAYER) (COLUMN ?Y ?PLAYER)) (<= (LINE ?PLAYER) (DIAGONAL ?PLAYER)) (<= OPEN (TRUE (CELL ?X ?Y B))) (<= (DISTINCTCELL ?X ?Y ?M ?N) (DISTINCT ?X ?M)) (<= (DISTINCTCELL ?X ?Y ?M ?N) (DISTINCT ?Y ?N)) (<= (LEGAL ?PLAYER (MARK ?X ?Y)) (TRUE (CELL ?X ?Y B)) (TRUE (CONTROL ?PLAYER))) (<= (LEGAL ?PLAYER NOOP) (NOT (TRUE (CONTROL ?PLAYER)))) (<= (GOAL ?PLAYER 100) (LINE ?PLAYER)) (<= (GOAL ?PLAYER 50) (NOT (LINE XPLAYER)) (NOT (LINE OPLAYER)) (NOT OPEN)) (<= (GOAL ?PLAYER1 0) (LINE ?PLAYER2) (DISTINCT ?PLAYER1 ?PLAYER2)) (<= TERMINAL (LINE ?PLAYER)) (<= TERMINAL (NOT OPEN))) 30 30)
+(START MATCH.3316980891 OPLAYER ((ROLE XPLAYER) (ROLE OPLAYER) (INIT (CELL 1 1 XPLAYER)) (INIT (CELL 1 2 OPLAYER)) (INIT (CELL 1 3 B)) (INIT (CELL 2 1 B)) (INIT (CELL 2 2 B)) (INIT (CELL 2 3 B)) (INIT (CELL 3 1 B)) (INIT (CELL 3 2 B)) (INIT (CELL 3 3 B)) (INIT (CONTROL XPLAYER)) (<= (NEXT (CELL ?X ?Y ?PLAYER)) (DOES ?PLAYER (MARK ?X ?Y))) (<= (NEXT (CELL ?X ?Y ?MARK)) (TRUE (CELL ?X ?Y ?MARK)) (DOES ?PLAYER (MARK ?M ?N)) (DISTINCTCELL ?X ?Y ?M ?N)) (<= (NEXT (CONTROL XPLAYER)) (TRUE (CONTROL OPLAYER))) (<= (NEXT (CONTROL OPLAYER)) (TRUE (CONTROL XPLAYER))) (<= (ROW ?X ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL ?X 1 ?PLAYER)) (TRUE (CELL ?X 2 ?PLAYER)) (TRUE (CELL ?X 3 ?PLAYER))) (<= (COLUMN ?Y ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL 1 ?Y ?PLAYER)) (TRUE (CELL 2 ?Y ?PLAYER)) (TRUE (CELL 3 ?Y ?PLAYER))) (<= (DIAGONAL ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL 1 1 ?PLAYER)) (TRUE (CELL 2 2 ?PLAYER)) (TRUE (CELL 3 3 ?PLAYER))) (<= (DIAGONAL ?PLAYER) (ROLE ?PLAYER) (TRUE (CELL 1 3 ?PLAYER)) (TRUE (CELL 2 2 ?PLAYER)) (TRUE (CELL 3 1 ?PLAYER))) (<= (LINE ?PLAYER) (ROW ?X ?PLAYER)) (<= (LINE ?PLAYER) (COLUMN ?Y ?PLAYER)) (<= (LINE ?PLAYER) (DIAGONAL ?PLAYER)) (<= OPEN (TRUE (CELL ?X ?Y B))) (<= (DISTINCTCELL ?X ?Y ?M ?N) (DISTINCT ?X ?M)) (<= (DISTINCTCELL ?X ?Y ?M ?N) (DISTINCT ?Y ?N)) (<= (LEGAL ?PLAYER (MARK ?X ?Y)) (TRUE (CELL ?X ?Y B)) (TRUE (CONTROL ?PLAYER))) (<= (LEGAL ?PLAYER NOOP) (NOT (TRUE (CONTROL ?PLAYER)))) (<= (GOAL ?PLAYER 100) (LINE ?PLAYER)) (<= (GOAL ?PLAYER 50) (NOT (LINE XPLAYER)) (NOT (LINE OPLAYER)) (NOT OPEN)) (<= (GOAL ?PLAYER1 0) (LINE ?PLAYER2) (DISTINCT ?PLAYER1 ?PLAYER2)) (<= TERMINAL (LINE ?PLAYER)) (<= TERMINAL (NOT OPEN))) 30 30)
POST / HTTP/1.0
Accept: text/delim
@@ -23,7 +23,7 @@
Content-type: text/acl
Content-length: 41
-(PLAY MATCH.3316980891 ((MARK 1 2) NOOP))
+(PLAY MATCH.3316980891 ((MARK 3 3) NOOP))
POST / HTTP/1.0
Accept: text/delim
@@ -50,22 +50,4 @@
Content-type: text/acl
Content-length: 41
-(PLAY MATCH.3316980891 (NOOP (MARK 1 1)))
-
-POST / HTTP/1.0
-Accept: text/delim
-Sender: GAMEMASTER
-Receiver: GAMEPLAYER
-Content-type: text/acl
-Content-length: 41
-
-(PLAY MATCH.3316980891 ((MARK 2 3) NOOP))
-
-POST / HTTP/1.0
-Accept: text/delim
-Sender: GAMEMASTER
-Receiver: GAMEPLAYER
-Content-type: text/acl
-Content-length: 41
-
-(STOP MATCH.3316980891 (NOOP (MARK 3 3)))
+(STOP MATCH.3316980891 (NOOP (MARK 3 2)))
Modified: trunk/Toss/Server/ServerGDLTest.out2
===================================================================
--- trunk/Toss/Server/ServerGDLTest.out2 2011-03-23 00:41:31 UTC (rev 1379)
+++ trunk/Toss/Server/ServerGDLTest.out2 2011-03-23 13:00:03 UTC (rev 1380)
@@ -22,20 +22,10 @@
Content-type: text/acl
Content-length: 10
-(MARK 1 1)
+(MARK 3 2)
HTTP/1.0 200 OK
Content-type: text/acl
Content-length: 4
-NOOP
-HTTP/1.0 200 OK
-Content-type: text/acl
-Content-length: 10
-
-(MARK 3 3)
-HTTP/1.0 200 OK
-Content-type: text/acl
-Content-length: 4
-
DONE
ERR processing completed -- EOF
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-23 14:18:20
|
Revision: 1381
http://toss.svn.sourceforge.net/toss/?rev=1381&view=rev
Author: lukaszkaiser
Date: 2011-03-23 14:18:12 +0000 (Wed, 23 Mar 2011)
Log Message:
-----------
Branching-based monotonicity, some www cleanup.
Modified Paths:
--------------
trunk/Toss/GGP/Makefile
trunk/Toss/Play/Heuristic.ml
trunk/Toss/www/ideas.xml
trunk/Toss/www/xsl/books.xsl
trunk/Toss/www/xsl/main.xsl
trunk/Toss/www/xsl/publications.xsl
Added Paths:
-----------
trunk/Toss/www/xsl/bibtex.xsl
trunk/Toss/www/xsl/common.xsl
trunk/Toss/www/xsl/layout-games.xsl
trunk/Toss/www/xsl/layout.xsl
Removed Paths:
-------------
trunk/Toss/www/style.css
trunk/Toss/www/xsl/include/
trunk/Toss/www/xsl/main.xsl~
trunk/Toss/www/xsl/publications-games-past.xsl
Modified: trunk/Toss/GGP/Makefile
===================================================================
--- trunk/Toss/GGP/Makefile 2011-03-23 13:00:03 UTC (rev 1380)
+++ trunk/Toss/GGP/Makefile 2011-03-23 14:18:12 UTC (rev 1381)
@@ -16,11 +16,13 @@
GDLTestDebug:
%.black: examples/%.gdl ../TossServer
+ make -C ..
OCAMLRUNPARAM=b; export OCAMLRUNPARAM; ../TossServer -d 2 &
java -jar gamecontroller-cli.jar play $< 600 10 1 -random 1 -remote 2 toss localhost 8110 1 | grep results
killall -v TossServer
%.white: examples/%.gdl ../TossServer
+ make -C ..
OCAMLRUNPARAM=b; export OCAMLRUNPARAM; ../TossServer -d 2 &
java -jar gamecontroller-cli.jar play $< 600 10 1 -random 2 -remote 1 toss localhost 8110 1 | grep results
killall -v TossServer
Modified: trunk/Toss/Play/Heuristic.ml
===================================================================
--- trunk/Toss/Play/Heuristic.ml 2011-03-23 13:00:03 UTC (rev 1380)
+++ trunk/Toss/Play/Heuristic.ml 2011-03-23 14:18:12 UTC (rev 1381)
@@ -1008,9 +1008,10 @@
Aux.Strings.union posi_poff_rels nega_poff_rels in
let frels = Aux.Strings.union indef_frels
(Aux.Strings.union posi_frels nega_frels) in
- let monotonic = !use_monotonic &&
- Aux.Strings.is_empty
- (Aux.Strings.inter all_poff_rels indef_frels) in
+ let moves = match struc with | None -> [||] | Some strc ->
+ Move.gen_moves Move.cGRID_SIZE rules strc graph.(0) in
+ let monotonic = !use_monotonic && (Array.length moves > 60 ||
+ Aux.Strings.is_empty (Aux.Strings.inter all_poff_rels indef_frels)) in
(* {{{ log entry *)
if !debug_level > 1 then (
Printf.printf
Modified: trunk/Toss/www/ideas.xml
===================================================================
--- trunk/Toss/www/ideas.xml 2011-03-23 13:00:03 UTC (rev 1380)
+++ trunk/Toss/www/ideas.xml 2011-03-23 14:18:12 UTC (rev 1381)
@@ -85,7 +85,6 @@
project, but it can become very interesting in the last phase!
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Michał Wójcik, Tobias Ganzow,
Łukasz Stafiniak, Łukasz Kaiser
</par>
</section>
@@ -121,7 +120,7 @@
and to be able to use and debug them in parallel.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Łukasz Kaiser, Tobias Ganzow, Łukasz Stafiniak
+ Łukasz Kaiser, Łukasz Stafiniak
</par>
</section>
@@ -160,7 +159,7 @@
interface design is necessary, and a lot of testing to make it right.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Dietmar Berwanger, Michał Wójcik, Diana Fischer
+ Łukasz Kaiser, Łukasz Stafiniak
</par>
</section>
@@ -198,7 +197,7 @@
their optimization techniques or constraint solving will be helpful.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Tobias Ganzow, Łukasz Kaiser, Łukasz Stafiniak
+ Łukasz Kaiser, Łukasz Stafiniak
</par>
</section>
@@ -312,7 +311,7 @@
to hard, depending on how much effort one makes to adapt automatic play.
<br/><br/></par>
<par><em>Possible Mentors (in order of preference):</em>
- Łukasz Kaiser, Dietmar Berwanger, Tobias Ganzow
+ Łukasz Kaiser
</par>
</section>
Deleted: trunk/Toss/www/style.css
===================================================================
--- trunk/Toss/www/style.css 2011-03-23 13:00:03 UTC (rev 1380)
+++ trunk/Toss/www/style.css 2011-03-23 14:18:12 UTC (rev 1381)
@@ -1,90 +0,0 @@
-/* General */
-
-html {
- height: 100%;
-}
-
-body {
- /* background-color: #222222; */
- /* height: 60%; */
- /* width: 90%; */
-}
-
-#top {
- margin-left: 13%;
- margin-right: 13%;
- font-size: 4em;
- font-family: Times, serif;
- color: #787878;
- font-weight: bold;
- background-color: #ffffff;
- padding: 5px;
-}
-
-#tossi {
- float: right;
- margin-top: 0em;
-}
-
-#bottom {
- margin-left: 13%;
- margin-right: 13%;
- background-color: #ffffff;
- text-align: right;
- padding: 5px;
- padding-top: 3em;
-}
-
-#sidebar {
- text-align: center;
- margin-left: 13%;
- margin-right: 13%;
- border-width: 5px 0px 5px 0px;
- border-color: #787878;
- border-style: solid;
- background-color: #ffffff;
- padding: 10px 0px 10px 0px;
-}
-
-
-/* Content */
-
-.main {
- margin-left: 13%;
- margin-right: 13%;
- height: 100%;
- background-color: #ffffff;
- padding: 20px;
-}
-
-.main h1 {
- text-align: center;
-}
-
-.main a, a:link, a:active, a:visited, a:hover {
- color: #787878; /*#b2cde0;*/
-}
-
-.nav-sep {
- background-color: #787878;
- width: 5px;
-}
-
-.iface {
- border-width: 1px;
- border-color: #787878;
- border-style: solid
-}
-
-#sidebar a {
- font-size: 1.2em;
- font-weight: bold;
- color: #787878;
- width: 100%;
- margin: 1em;
-}
-
-#sidebar a:hover {
- text-decoration: none;
- color: black;
-}
Copied: trunk/Toss/www/xsl/bibtex.xsl (from rev 1380, trunk/Toss/www/xsl/include/bibtex.xsl)
===================================================================
--- trunk/Toss/www/xsl/bibtex.xsl (rev 0)
+++ trunk/Toss/www/xsl/bibtex.xsl 2011-03-23 14:18:12 UTC (rev 1381)
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xsl:stylesheet SYSTEM "xhtml1-lat1.ent">
+
+<xsl:stylesheet version="1.0"
+ xmlns:bibtex="http://bibtexml.sf.net/"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<xsl:strip-space elements="*"/>
+
+<xsl:template match="bibtex:file">
+ <table class="bibtex-bibliography">
+ <xsl:apply-templates select="*" mode="number">
+ <xsl:sort select="@id" data-type="text"/>
+ </xsl:apply-templates>
+ </table>
+</xsl:template>
+
+<xsl:template match="bibtex:file" mode="number">
+ <table class="bibtex-bibliography">
+ <xsl:apply-templates select="*" mode="number">
+ <xsl:sort select="@id" data-type="text"/>
+ </xsl:apply-templates>
+ </table>
+</xsl:template>
+
+<xsl:template match="bibtex:file" mode="id">
+ <table class="bibtex-bibliography">
+ <xsl:apply-templates select="*" mode="id">
+ <xsl:sort select="@id" data-type="text"/>
+ </xsl:apply-templates>
+ </table>
+</xsl:template>
+
+<xsl:template match="bibtex:entry">
+ <xsl:param name="index"/>
+ <tr>
+ <td class="index">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$index"/>
+ <xsl:text>]</xsl:text>
+ </td>
+ <td class="entry">
+ <xsl:apply-templates select="*"/>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="bibtex:entry" mode="number">
+ <xsl:apply-templates select=".">
+ <xsl:with-param name="index" select="position()"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="bibtex:entry" mode="id">
+ <xsl:apply-templates select=".">
+ <xsl:with-param name="index" select="@id"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="bibtex:book|bibtex:inbook|bibtex:booklet|
+ bibtex:proceedings|
+ bibtex:manual|bibtex:techreport|
+ bibtex:unpublished|bibtex:misc">
+ <xsl:apply-templates select="bibtex:authors|bibtex:editors"/>
+ <xsl:text>. </xsl:text>
+ <xsl:apply-templates select="bibtex:title">
+ <xsl:with-param name="type">book</xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:if test="not(substring(bibtex:title, string-length(bibtex:title)) = '.' or substring(bibtex:title, string-length(bibtex:title)) = '!' or substring(bibtex:title, string-length(bibtex:title)) = '?')">
+ <xsl:text>.</xsl:text>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:if test="../bibtex:techreport">
+ <xsl:text>Technical Report. </xsl:text>
+ </xsl:if>
+ <xsl:call-template name="publisher"/>
+</xsl:template>
+
+<xsl:template match="bibtex:mastersthesis|bibtex:phdthesis">
+ <xsl:apply-templates select="bibtex:authors"/>
+ <xsl:text>. </xsl:text>
+ <xsl:apply-templates select="bibtex:chapter"/>
+ <xsl:apply-templates select="bibtex:title">
+ <xsl:with-param name="type">book</xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:if test="not(substring(bibtex:title, string-length(bibtex:title)) = '.' or substring(bibtex:title, string-length(bibtex:title)) = '!' or substring(bibtex:title, string-length(bibtex:title)) = '?')">
+ <xsl:text>.</xsl:text>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:if test="../bibtex:phdthesis">
+ <xsl:text>PhD thesis</xsl:text>
+ </xsl:if>
+ <xsl:if test="../bibtex:mastersthesis">
+ <xsl:text>Master's thesis</xsl:text>
+ </xsl:if>
+ <xsl:if test="bibtex:school">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="bibtex:school"/>
+ </xsl:if>
+ <xsl:if test="bibtex:year">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="bibtex:year"/>
+ </xsl:if>
+ <xsl:text>.</xsl:text>
+ <xsl:if test="not(bibtex:year)">
+ <xsl:text> </xsl:text>
+ <xsl:text>To appear.</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibtex:article">
+ <xsl:apply-templates select="bibtex:authors"/>
+ <xsl:text>. </xsl:text>
+ <xsl:apply-templates select="bibtex:title">
+ <xsl:with-param name="type">article</xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:if test="not(substring(bibtex:title, string-length(bibtex:title)) = '.' or substring(bibtex:title, string-length(bibtex:title)) = '!' or substring(bibtex:title, string-length(bibtex:title)) = '?')">
+ <xsl:text>.</xsl:text>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <em>
+ <xsl:apply-templates select="bibtex:journal"/>
+ </em>
+ <!-- <xsl:apply-templates select="bibtex:editors"/> -->
+ <xsl:call-template name="journal-volume"/>
+ <!-- <xsl:apply-templates select="bibtex:series"/> -->
+ <xsl:apply-templates select="bibtex:pages"/>
+ <xsl:if test="bibtex:year">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="bibtex:year"/>
+ </xsl:if>
+ <xsl:text>.</xsl:text>
+ <xsl:if test="not(bibtex:year)">
+ <!-- previously, 'To appear' would be output automagically;
+ changed this to output of the bibtex-field note -->
+ <xsl:if test="bibtex:note">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="bibtex:note"/>
+ <!--<xsl:text>To appear.</xsl:text>-->
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibtex:incollection">
+ <xsl:apply-templates select="bibtex:authors"/>
+ <xsl:text>. </xsl:text>
+ <xsl:apply-templates select="bibtex:title">
+ <xsl:with-param name="type">incollection</xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:if test="not(substring(bibtex:title, string-length(bibtex:title)) = '.' or substring(bibtex:title, string-length(bibtex:title)) = '!' or substring(bibtex:title, string-length(bibtex:title)) = '?')">
+ </xsl:if>
+ <xsl:if test="bibtex:booktitle">
+ <xsl:text>. In </xsl:text>
+ <em>
+ <xsl:apply-templates select="bibtex:booktitle"/>
+ </em>
+ </xsl:if>
+ <xsl:apply-templates select="bibtex:editors"/>
+ <xsl:apply-templates select="bibtex:volume"/>
+ <xsl:apply-templates select="bibtex:series"/>
+ <xsl:apply-templates select="bibtex:pages"/>
+ <xsl:choose>
+ <xsl:when test="bibtex:year and not(bibtex:publisher|bibtex:howpublished|bibtex:institution)">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>. </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="publisher"/>
+</xsl:template>
+
+<xsl:template match="bibtex:inproceedings|bibtex:conference">
+ <xsl:apply-templates select="bibtex:authors"/>
+ <xsl:text>. </xsl:text>
+ <xsl:apply-templates select="bibtex:title">
+ <xsl:with-param name="type">inproceedings</xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:if test="not(substring(bibtex:title, string-length(bibtex:title)) = '.' or substring(bibtex:title, string-length(bibtex:title)) = '!' or substring(bibtex:title, string-length(bibtex:title)) = '?')">
+ <xsl:text>.</xsl:text>
+ </xsl:if>
+ <xsl:text> In </xsl:text>
+ <em>
+ <xsl:apply-templates select="bibtex:booktitle"/>
+ </em>
+ <xsl:apply-templates select="bibtex:editors"/>
+ <xsl:apply-templates select="bibtex:volume"/>
+ <xsl:apply-templates select="bibtex:series"/>
+ <xsl:apply-templates select="bibtex:pages"/>
+ <xsl:if test="bibtex:address">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="bibtex:address"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="bibtex:year and not(bibtex:publisher|bibtex:howpublished|bibtex:institution)">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>. </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="publisherofproceedings" />
+</xsl:template>
+
+
+<xsl:template match="bibtex:abstract|bibtex:url"/>
+
+<xsl:template match="bibtex:authors">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="bibtex:editors">
+ <xsl:choose>
+ <xsl:when test="../bibtex:authors">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>, Ed</xsl:text>
+ <xsl:if test="count(bibtex:person)>1"><xsl:text>s</xsl:text></xsl:if>
+ <xsl:text>.)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates />
+ <xsl:text> (Ed</xsl:text>
+ <xsl:if test="count(bibtex:person)>1"><xsl:text>s</xsl:text></xsl:if>
+ <xsl:text>.)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibtex:person">
+ <!-- Special treatment for the last author -->
+ <xsl:choose>
+ <xsl:when test="position()=last() and bibtex:last='Others'">
+ <xsl:text>et al.</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="position()=last() and not(position()=1)">
+ <xsl:text>and </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <!-- don't print a comma if there are only two authors and for the last author -->
+ <xsl:choose>
+ <xsl:when test="count(../bibtex:person)=2 and position()=1">
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:when test="position()=last()">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>, </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibtex:person/bibtex:last|bibtex:person/bibtex:prelast">
+ <xsl:apply-templates/>
+ <xsl:if test="not(position()=last())">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibtex:person/bibtex:first|bibtex:person/bibtex:middle">
+ <xsl:value-of select="substring(.,1,1)"/>
+ <xsl:text>. </xsl:text>
+</xsl:template>
+
+<xsl:template match="bibtex:title" name="title">
+ <xsl:param name="type">article</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="../bibtex:url">
+ <xsl:variable name="url" select="../bibtex:url"/>
+ <a href="{$url}" class="bibtex-title {$type}"><xsl:apply-templates/></a>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="bibtex-title {$type}"><xsl:apply-templates/></span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="journal-volume">
+ <xsl:if test="bibtex:volume">
+ <xsl:text>, vol. </xsl:text>
+ <xsl:value-of select="bibtex:volume"/>
+ <xsl:if test="bibtex:number">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="bibtex:number"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibtex:volume">
+ <xsl:text>, vol. </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text> of</xsl:text>
+</xsl:template>
+
+<xsl:template match="bibtex:number">
+ <xsl:apply-templates />
+</xsl:template>
+
+<xsl:template match="bibtex:doi|bibtex:isbn|bibtex:issn|bibtex:lccn">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select='substring-after(name(.),"bibtex:")'/>
+ <xsl:text>:</xsl:text>
+ <xsl:apply-templates />
+</xsl:template>
+
+<xsl:template match="bibtex:year|bibtex:publisher|
+ bibtex:institution|bibtex:booktitle|
+ bibtex:organization|bibtex:journal|
+ bibtex:address|bibtex:school|
+ bibtex:howpublished">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template match="bibtex:series">
+ <xsl:if test="not(../bibtex:volume)">
+ <xsl:text>,</xsl:text>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template match="bibtex:pages">
+ <xsl:text>, pp. </xsl:text>
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template match="bibtex:chapter">
+ <xsl:text>`</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>' in </xsl:text>
+</xsl:template>
+
+<xsl:template name="publisher">
+ <xsl:if test="bibtex:publisher|bibtex:howpublished|bibtex:institution">
+ <xsl:apply-templates select="bibtex:publisher|bibtex:howpublished|bibtex:institution"/>
+ <xsl:if test="bibtex:address">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="bibtex:address"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="bibtex:year">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>. </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="bibtex:year">
+ <xsl:apply-templates select="bibtex:year"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>To appear</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>.</xsl:text>
+</xsl:template>
+
+<xsl:template name="publisherofproceedings">
+ <xsl:if test="bibtex:publisher|bibtex:howpublished|bibtex:institution">
+ <xsl:apply-templates select="bibtex:publisher|bibtex:howpublished|bibtex:institution"/>
+ <xsl:choose>
+ <xsl:when test="bibtex:year">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>. </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="bibtex:year">
+ <xsl:apply-templates select="bibtex:year"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>To appear</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>.</xsl:text>
+</xsl:template>
+
+<xsl:template match="bibtex:abstract">
+ <xsl:copy-of select="node()"/>
+</xsl:template>
+
+<xsl:template match="bibtex:note">
+ <xsl:copy-of select="node()"/>
+</xsl:template>
+
+
+<!-- Handling bibtex-output -->
+
+<xsl:template match="bibtex:entry" mode="bibtex">
+ <xsl:apply-templates mode="bibtex"/>
+</xsl:template>
+
+<xsl:template match="bibtex:entry/*/bibtex:abstract" mode="bibtex"/>
+
+<xsl:template match="bibtex:entry/bibtex:*" mode="bibtex">
+ <xsl:text>@</xsl:text>
+ <xsl:value-of select='substring-after(name(),"bibtex:")'/>
+ <xsl:text>{</xsl:text>
+ <xsl:value-of select="../@id"/>
+ <xsl:text>,</xsl:text>
+ <br/>
+ <!-- <xsl:text>
</xsl:text> -->
+ <xsl:apply-templates mode="bibtex"/>
+ <xsl:text>}</xsl:text>
+ <br/>
+ <!-- <xsl:text>
</xsl:text> -->
+</xsl:template>
+
+<xsl:template match="bibtex:entry/*/bibtex:authors" mode="bibtex">
+
+ <xsl:text>author = {</xsl:text>
+ <xsl:apply-templates mode="bibtex"/>
+ <xsl:text>},</xsl:text>
+ <br/>
+</xsl:template>
+
+<xsl:template match="bibtex:entry/*/bibtex:editors" mode="bibtex">
+
+ <xsl:text>editor = {</xsl:text>
+ <xsl:apply-templates mode="bibtex"/>
+ <xsl:text>},</xsl:text>
+ <br/>
+</xsl:template>
+
+<xsl:template match="bibtex:person" mode="bibtex">
+ <xsl:apply-templates mode="bibtex"/>
+ <xsl:if test="not(position()=last())">
+ <xsl:text> and </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibtex:person/*" mode="bibtex">
+ <xsl:apply-templates mode="bibtex"/>
+ <xsl:if test="not(position()=last())">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- All other bibtex tags. -->
+<xsl:template match="bibtex:entry/*/bibtex:*" mode="bibtex">
+
+ <xsl:value-of select='substring-after(name(),"bibtex:")'/>
+ <xsl:text> = {</xsl:text>
+ <xsl:apply-templates mode="bibtex"/>
+ <xsl:text>},</xsl:text>
+ <br/>
+</xsl:template>
+
+</xsl:stylesheet>
Modified: trunk/Toss/www/xsl/books.xsl
===================================================================
--- trunk/Toss/www/xsl/books.xsl 2011-03-23 13:00:03 UTC (rev 1380)
+++ trunk/Toss/www/xsl/books.xsl 2011-03-23 14:18:12 UTC (rev 1381)
@@ -7,8 +7,8 @@
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
-<xsl:include href="include/layout.xsl"/>
-<xsl:include href="include/bibtex.xsl"/>
+<xsl:include href="layout.xsl"/>
+<xsl:include href="bibtex.xsl"/>
<xsl:template match="books">
<xsl:apply-templates select="include"/>
Copied: trunk/Toss/www/xsl/common.xsl (from rev 1380, trunk/Toss/www/xsl/include/common.xsl)
===================================================================
--- trunk/Toss/www/xsl/common.xsl (rev 0)
+++ trunk/Toss/www/xsl/common.xsl 2011-03-23 14:18:12 UTC (rev 1381)
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xsl:stylesheet SYSTEM "xhtml1-lat1.ent">
+
+<xsl:stylesheet
+ version='1.0'
+ xmlns:bibtex='http://bibtexml.sf.net/'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns="http://www.w3.org/1999/xhtml">
+
+<xsl:preserve-space elements="par item"/>
+
+<xsl:template match="html">
+ <xsl:copy-of select="node()"/>
+</xsl:template>
+
+<xsl:template match="section">
+ <xsl:choose>
+ <xsl:when test="@id">
+ <h3 id="{@id}"><xsl:value-of select="@title"/></h3>
+ </xsl:when>
+ <xsl:otherwise>
+ <h3><xsl:value-of select="@title"/></h3>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates />
+</xsl:template>
+
+<xsl:template match="subsection">
+ <h4><xsl:value-of select="@title"/></h4>
+ <xsl:apply-templates />
+</xsl:template>
+
+<xsl:template match="enumerate">
+ <ol>
+ <xsl:apply-templates />
+ </ol>
+</xsl:template>
+
+<xsl:template match="itemize">
+ <xsl:variable name="style-mod">
+ <xsl:if test="@style='none'">list-style: none;</xsl:if>
+ <xsl:if test="@style='no-indent'">list-style: none; margin-left: 0px;</xsl:if>
+ </xsl:variable>
+ <ul style="{$style-mod}">
+ <xsl:choose>
+ <xsl:when test="@type='sort'">
+ <xsl:for-each select="item">
+ <xsl:sort select="."/>
+ <li class="{@new}"><xsl:apply-templates /></li>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:when test="@type='sort-after-first-space'">
+ <xsl:for-each select="item">
+ <xsl:sort select="substring-after(., ' ')"/>
+ <li class="{@new}"><xsl:apply-templates /></li>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates />
+ </xsl:otherwise>
+ </xsl:choose>
+ </ul>
+</xsl:template>
+
+<xsl:template match="item">
+ <li class="{@new}"><xsl:apply-templates /></li>
+</xsl:template>
+
+<xsl:template match="games-section">
+ <xsl:choose>
+ <xsl:when test="$lang='de'">
+ <h3><a href="http://tplay.org">Online Spielen gegen Toss</a></h3>
+ <xsl:apply-templates />
+ <p><a href="http://tplay.org">Weitere Spiele</a></p>
+ </xsl:when>
+ <xsl:when test="$lang='pl'">
+ <h3><a href="http://tplay.org">Zagraj Online z Tossem</a></h3>
+ <xsl:apply-templates />
+ <p><a href="http://tplay.org">Więcej gier</a></p>
+ </xsl:when>
+ <xsl:when test="$lang='fr'">
+ <h3><a href="http://tplay.org">Jouez en Ligne contre Toss</a></h3>
+ <xsl:apply-templates />
+ <p><a href="http://tplay.org">Plus de Jeux</a></p>
+ </xsl:when>
+ <xsl:otherwise>
+ <h3><a href="http://tplay.org">Play Online Against Toss</a></h3>
+ <xsl:apply-templates />
+ <p><a href="http://tplay.org">More Games</a></p>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template match="game-div">
+ <div class="game-div"><xsl:apply-templates /></div>
+</xsl:template>
+
+<xsl:template match="ggp-game">
+ <a href="http://euklid.inf.tu-dresden.de:8180/ggpserver/public/view_state.jsp?matchID={@match_id}&stepNumber=1&seconds=1"><xsl:value-of select="@name" /></a>
+ (<xsl:value-of select="@match_id" />)
+</xsl:template>
+
+<xsl:template match="em">
+ <em><xsl:apply-templates /></em>
+</xsl:template>
+
+<xsl:template match="strong">
+ <strong><xsl:apply-templates /></strong>
+</xsl:template>
+
+<xsl:template match="br">
+ <br/>
+</xsl:template>
+
+
+<xsl:template match="lecture-title">
+
+ <xsl:variable name="index" select="count(../preceding-sibling::*)"/> <!-- position() of the parent (ie of /item)-->
+
+ <xsl:choose>
+ <xsl:when test="link/@inactive">
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="title[@lang='de']">
+ <a href="{link}" ><xsl:value-of select="title[@lang='de']"/><!-- link to the lecture page--></a>
+ <xsl:if test="./grade"> <!-- If there are evaluation data-->
+ <span style="margin-left: 2em"> </span>
+ <a href="#" onclick="{concat('show_lecture_title(',$index , ')')}; return false;" rel="nofollow" class="evaluation"> <!-- call show_lecture($index) from main.js which changes the attribute 'display' of span with id='lecture_title$index'-->
+ Studentische Bewertung
+ </a>
+ <span style="display: none; margin-left: 2em; font-size: 90%" id="{concat('lecture_title', $index)}"><!---->Vorlesung:
+ <xsl:value-of select="grade[@tograde='lecture' and @part='int']"></xsl:value-of>,<xsl:value-of select="grade[@tograde='lecture' and @part='frac']"></xsl:value-of>
+ <span style="margin-left: 1em">Dozent: </span>
+ <xsl:value-of select="grade[@tograde='docent' and @part='int']"></xsl:value-of>,<xsl:value-of select="grade[@tograde='docent' and @part='frac']"></xsl:value-of>
+ </span>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="title[@lang='en']">
+ <a href="{link}" ><xsl:value-of select="title[@lang='en']"/></a>
+ <xsl:if test="./grade"> <!-- If there are evaluation data-->
+ <span style="margin-left: 2em"> </span>
+ <a href="#" onclick="{concat('show_lecture_title(',$index , ')')}; return false;" rel="nofollow" class="evaluation">
+ Students' Evaluation
+ </a>
+ <span style="display: none; margin-left: 2em; font-size: 90%" id="{concat('lecture_title', $index)}">lecture:
+ <xsl:value-of select="grade[@tograde='lecture' and @part='int']"></xsl:value-of>.<xsl:value-of select="grade[@tograde='lecture' and @part='frac']"></xsl:value-of>
+ <span style="margin-left: 1em">docent: </span>
+ <xsl:value-of select="grade[@tograde='docent' and @part='int']"></xsl:value-of>.<xsl:value-of select="grade[@tograde='docent' and @part='frac']"></xsl:value-of>
+ </span>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="a">
+ <xsl:choose>
+ <xsl:when test="@inactive">
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="{@href}"><xsl:apply-templates /></a>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="quote">
+ <blockquote><xsl:apply-templates /></blockquote>
+</xsl:template>
+
+<xsl:template match="image">
+ <div class="image">
+ <img src="{$topdir}/img/{@src}" alt="{@title}"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="game-link">
+ <xsl:choose>
+ <xsl:when test="$lang='de'">
+ <a href="http://tplay.org/index.html?game={@game}"
+ title="Spiel {@game}" class="game-link" id="game-link-{@game}">
+ <img class="game-img" src="{$topdir}/img/{@game}.png"
+ alt="{@game}-Brett" id="game-img-{@game}" />
+ </a>
+ </xsl:when>
+ <xsl:when test="$lang='pl'">
+ <a href="http://tplay.org/index.html?game={@game}"
+ title="Graj w {@game}" class="game-link" id="game-link-{@game}">
+ <img class="game-img" src="{$topdir}/img/{@game}.png"
+ alt="Plansza {@game}" id="game-img-{@game}" />
+ </a>
+ </xsl:when>
+ <xsl:when test="$lang='fr'">
+ <a href="http://tplay.org/index.html?game={@game}"
+ title="Jouez au {@game}" class="game-link" id="game-link-{@game}">
+ <img class="game-img" src="{$topdir}/img/{@game}.png"
+ alt="Bord de {@game}" id="game-img-{@game}" />
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="http://tplay.org/index.html?game={@game}"
+ title="Play {@game}" class="game-link" id="game-link-{@game}">
+ <img class="game-img" src="{$topdir}/img/{@game}.png"
+ alt="{@game} Board" id="game-img-{@game}" />
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="flag">
+ <img src="/img/flags/{@country}.gif" alt="{@country}"/>
+
+</xsl:template>
+
+<xsl:template name="mail">
+ <xsl:param name="user"/>
+ <xsl:param name="domain"/>
+ <xsl:param name="title" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="$title">
+ <script type="text/javascript">begin_mailto("<xsl:value-of select="$user"/>", "<xsl:value-of select="$domain"/>", "true");</script><xsl:value-of select="$title"/><script type="text/javascript">end_mailto();</script>
+ </xsl:when>
+ <xsl:otherwise>
+ <script type="text/javascript">begin_mailto("<xsl:value-of select="$user"/>", "<xsl:value-of select="$domain"...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-23 17:47:09
|
Revision: 1383
http://toss.svn.sourceforge.net/toss/?rev=1383&view=rev
Author: lukaszkaiser
Date: 2011-03-23 17:47:00 +0000 (Wed, 23 Mar 2011)
Log Message:
-----------
Cleanups, deleting unused files, www upload script and smaller release without pdfs.
Modified Paths:
--------------
trunk/Toss/Makefile
trunk/Toss/TossTest.ml
trunk/Toss/WebClient/Main.js
trunk/Toss/www/Makefile
Added Paths:
-----------
trunk/Toss/www/upload_sourceforge.sh
Removed Paths:
-------------
trunk/Toss/Solver/FFSolver.ml
trunk/Toss/Solver/FFSolver.mli
trunk/Toss/Solver/FFSolverTest.ml
trunk/Toss/www/img/flags/
trunk/Toss/www/xsl/authors-person-extract.xsl
trunk/Toss/www/xsl/games.xsl
trunk/Toss/www/xsl/layout-games.xsl
Modified: trunk/Toss/Makefile
===================================================================
--- trunk/Toss/Makefile 2011-03-23 16:10:48 UTC (rev 1382)
+++ trunk/Toss/Makefile 2011-03-23 17:47:00 UTC (rev 1383)
@@ -20,6 +20,7 @@
rm -f toss_$(RELEASE)/www/code_doc
mv toss_$(RELEASE)/_build/Toss.docdir toss_$(RELEASE)/www/code_doc
rm -rf toss_$(RELEASE)/_build toss_$(RELEASE)/gmon.out
+ rm -rf toss_$(RELEASE)/www/pub
zip -r toss_$(RELEASE).zip toss_$(RELEASE)
rm -rf toss_$(RELEASE)
Deleted: trunk/Toss/Solver/FFSolver.ml
===================================================================
--- trunk/Toss/Solver/FFSolver.ml 2011-03-23 16:10:48 UTC (rev 1382)
+++ trunk/Toss/Solver/FFSolver.ml 2011-03-23 17:47:00 UTC (rev 1383)
@@ -1,1285 +0,0 @@
-(* A solver based on the FF Type Normal Form and {!AssignmentSet}s
- without predetermined order of variables. Continuous aspects
- (polynomials, real variables, formulas characterizing reals) are
- not developed yet (but real expressions with [Sum]s, [Char]acteristic
- and real functions are available).
-
- If the first element of AssignmentSet.FO assoc list has a negative
- number instead of an element, it stores the common assignments for
- all context elements different than the context elements of the
- rest of the list, and the number is the negated number of these
- elements (so it is always smaller than zero and the rest of the
- list can be empty). This convention is respected by modules
- {!AssignmentSet} and {!FFSolver}, but not necessarily ohters. *)
-
-open Formula
-open Printf
-
-let debug_level = ref 0
-
-
-open Structure
-module A = AssignmentSet
-
-module Vars = Set.Make (struct
- type t = Formula.var
- let compare = Pervasives.compare
-end)
-let add_vars nvs vs =
- List.fold_left (fun vs nv -> Vars.add nv vs) vs nvs
-let vars_of_list nvs =
- add_vars nvs Vars.empty
-let sum_vars vars = List.fold_left Vars.union Vars.empty vars
-let vars_of_array nvs =
- Array.fold_left (fun vs nv -> Vars.add nv vs) Vars.empty nvs
-
-let sb_str struc sb =
- String.concat ", " (List.map (fun (v,e) ->
- var_str v^"->"^Structure.elem_str struc e) sb)
-
-let rec is_unique_assoc = function
- | [] -> true
- | (e,_)::tl -> if List.mem_assoc e tl then false
- else is_unique_assoc tl
-
-(*
- let aFO lnum (v,assgns) =
- Printf.printf "(%d:%s) %!" lnum (var_str v);
- if is_unique_assoc assgns then A.FO (v, assgns)
- else failwith
- ("not unique "^string_of_int lnum^": "^A.str (A.FO (v,assgns)))
-*)
-
-(* Exception handling unwinds the stack to the most recent point
- selecting a value for a witness.
-
- It's possible to more thoroughly handle witnesses, by accumulating
- all variables whose change might result in change of the resulting
- assignment set; but unsure if it would be a considerable
- gain. Currently witnesses are only reported for literals. *)
-exception Unsatisfiable_FO of Vars.t
-exception Unsatisfiable
-
-let rec map_try ?catch f = function
- | [] -> []
- | hd::tl ->
- let try r = f hd in
- r :: map_try ?catch f tl
- with
- | Unsatisfiable_FO witnesses as exc ->
- if catch = None || Vars.mem (Aux.unsome catch) witnesses
- then map_try ?catch f tl
- else raise exc
- | Unsatisfiable ->
- map_try ?catch f tl
-
-let rec fold_try ?catch f accu = function
- | [] -> accu
- | hd::tl ->
- try
- fold_try ?catch f (f accu hd) tl
- with
- | Unsatisfiable_FO witnesses as exc ->
- if catch = None || Vars.mem (Aux.unsome catch) witnesses
- then fold_try ?catch f accu tl
- else raise exc
- | Unsatisfiable ->
- fold_try ?catch f accu tl
-
-let debug_count = ref 0
-
-let list_existsi p l =
- let rec aux i = function
- | [] -> false
- | a::l -> p i a || aux (i+1) l in
- aux 0 l
-
-let explicit_v_domain v aset =
- let rec aux = function
- | A.FO (v1, dis_assgns) when v1 = v ->
- let dis_assgns =
- match dis_assgns with
- | (e,_)::dis_assgns when e < 0 -> dis_assgns
- | _ -> dis_assgns in
- elems_of_list (List.map fst dis_assgns)
- | A.FO (v1, assgns) ->
- List.fold_left Elems.union Elems.empty
- (List.map (fun (_,aset) -> aux aset) assgns)
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet"
- | _ -> Elems.empty in
- aux aset
-
-(* Remove a variable from an assignment by projecting on the given
- element; if the variable does not admit the element, raise
- [Unsatisfiable]. *)
-let project_v_on_elem v e aset =
- let rec aux = function
- | A.Empty -> raise Unsatisfiable
- | A.Any -> A.Any
- | A.FO (v1, dis_assgns) when v1 = v ->
- let other_aset, dis_assgns =
- match dis_assgns with
- | (e,aset)::dis_assgns when e < 0 -> aset, dis_assgns
- | _ -> A.Empty, dis_assgns in
- (try List.assoc e dis_assgns
- with Not_found ->
- if other_aset = A.Empty then raise Unsatisfiable
- else other_aset)
- | A.FO (v1, assgns) ->
- let assgns =
- map_try (fun (e, aset) -> e, aux aset) assgns in
- if assgns = [] then raise Unsatisfiable
- else A.FO (v1, assgns)
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet" in
- aux aset
-
-(* Remove a variable from an assignment by projecting always on the implicit
- elements; if the variable does not admit implicit elements, raise
- [Unsatisfiable]. (Corresponds to projecting on an element outside of
- {!FFSolver.explicit_v_domain}.) *)
-let project_v_on_implicit v aset =
- let rec aux = function
- | A.Empty -> raise Unsatisfiable
- | A.Any -> A.Any
- | A.FO (v1, (e,aset)::_) when e < 0 && v1 = v -> aset
- | A.FO (v1, _) when v1 = v -> raise Unsatisfiable
- | A.FO (v1, assgns) ->
- let assgns =
- map_try (fun (e, aset) -> e, aux aset) assgns in
- if assgns = [] then raise Unsatisfiable
- else A.FO (v1, assgns)
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet" in
- aux aset
-
-let rec aset_fo_vars = function
- | A.Empty | A.Any -> []
- | A.FO (v, assgns) ->
- v :: Aux.concat_map aset_fo_vars (List.map snd assgns)
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet"
-
-(* For debugging. Brute force check. *)
-(* FIXME: doesn't handle "other element contexts"
-let aset_subsumed all_elems a b =
- let vars = aset_fo_vars a in
- let asbs = A.fo_assgn_to_list all_elems vars a in
- let asbs =
- Aux.unique (=) (List.map (List.sort Pervasives.compare) asbs) in
- let bsbs = A.fo_assgn_to_list all_elems vars b in
- let bsbs =
- Aux.unique (=) (List.map (List.sort Pervasives.compare) bsbs) in
- (* {{{ log entry *)
- if !debug_level > 3 then (
- printf "subsumption: test %d <= %d\n%!"
- (List.length asbs) (List.length bsbs);
- );
- (* }}} *)
- List.for_all (fun asb ->
- List.exists (fun bsb ->
- try
- List.for_all (fun (v,ae) ->
- List.assoc v bsb = ae) asb
- with Not_found -> false) bsbs) asbs
-*)
-
-(* We assume that for every "not ex psi" subformula, "ex psi" is
- ground, and that every other occurrence of negation is in a literal
- (it is guaranteed by {!FFTNF.ff_tnf}). We assume that every
- existentially quantified single disjunct [Ex (vs, Or [phi])] marks
- the fact that the body [phi] does not have universal quantifiers
- (guaranteed by {!FFSolver.add_locvar_info}).
-
- We use the structure of the formula to organize search and build
- the result on the recursive stack. Accumulated substitution stores
- the most recent variable first, it represents the path from root to
- the current position in the aset being built. Our approach
- resembles constraint propagation: we split the "search space" by
- assigning values to a variable once we encounter the first "good"
- constraint on that variable. We organize conjunctive constraints
- into three queues: currently handled, delayed1: positive has more
- than one undefined position or negative with exactly one undefined
- position, delayed2: would have to split on all elements. We fold
- over disjunctive constraints by keeping the aset subtree to which
- we merge from the current context to produce the final answer. (It
- is initialized with Empty aset.) In the same way we fold over
- assignments for local variables: existentially quantified variables
- that do not have a universal quantifier in their scope.
-
- The rules to merge (disjoin) the current aset (cur-aset) and the
- current position (cur-pos):
-
- (a) cur-aset=Any: return Any (subsumption)
-
- (b) no more conjuncts in subformula: return Any (subsumption the
- other way round) -- descending the recursion stack will rebuild the
- final aset
-
- (c) introducing a variable v that is also the root of cur-aset:
-
- (c1) map-try over the cur-pos values of v, passing as aset to disjoin
- the corresponding cur-aset subtree, or Empty if cur-aset does not
- admit given value
-
- (c2) if map-try returned non-empty, add to it cur-aset subtrees of v
- values outside of map-try results (if empty, raise Unsatisfiable)
-
- (d) introducing a (non-local) variable v that does not occur in cur-aset:
- (includes case cur-aset=Empty)
-
- (d1) map-try over the cur-pos values of v, passing as aset to disjoin
- the whole cur-aset
-
- (d2) if map-try returned non-empty, add to it the whole cur-aset
- for v set to all elements outside of map-try results (unless
- cur-aset is Empty); if map-try returned empty, raise Unsatisfiable
- [TODO: this can benefit from extending the definition of asets with
- "other-than" subtree]
-
- (e) introducing a variable v that occurs in cur-aset:
-
- (e1) cut the cur-aset into a forest: the aset without v (for each
- occurrence of v in cur-aset removing the corresponding assignment
- of its parent variable, perhaps recursively if it was a single
- assignment), and the asets composed of a single path to each
- occurrence of v and its subtree ("flower-trees")
-
- (e2) pull-out v by copying the trunk in front of each child-subtree
- of v, for each "flower-tree"
-
- (e3) merge the resulting trees starting with "cur-aset with holes",
- observing that they have the same order of variables as
- "accumulator" on relevant paths, with v at root
-
- (e1-e3) observe that during merger, the "cur-aset with holes" will
- be cloned over, and the v-occurrence-child-subtrees will either be
- reintroduced to their original places or the holes kept, depending
- on what v-assignment the clone belongs to; this observation is used
- for the actual implementation
-
- (e4) apply the case (c)
-
- (f) introducing a local variable v (it cannot occur in cur-aset):
- fold-try over the cur-pos values of v, passing as the initial aset
- to disjoin the whole cur-aset.
-
- If the first element of [dis_assgns] assoc list has a negative
- number instead of an element, it stores the common assignments for
- all context elements different than the context elements of the
- rest of the list. This convention is respected by modules
- {!AssignmentSet} and {!FFSolver}, but not ohters.
-*)
-(* Model used only for debugging. *)
-let merge model all_elems num_elems is_local v init_domain
- sb cur_aset eval_cont =
- let rec aux = function (* v not in local_vars *)
- | A.MSO _ | A.Real _ -> failwith
- "FFSolver.evaluate: MSO and Real not supported yet"
- (* a *)
- | A.Any -> A.Any
- (* c *)
- | A.FO (v1, dis_assgns) when v1 = v ->
- let other_aset, num_implicit, dis_assgns =
- match dis_assgns with
- | (e,aset)::dis_assgns when e < 0 -> aset, ~-e, dis_assgns
- | _ -> A.Empty, 10000 (*ignored*), dis_assgns in
- let num_anys = ref 0 and other_used = ref 0 in
- let choose e =
- let ret_aset =
- eval_cont ((v, e)::sb)
- (try List.assoc e dis_assgns
- with Not_found -> incr other_used; other_aset) in
- if ret_aset = A.Any then incr num_anys;
- e, ret_aset in
- (* c1 *)
- let pos_assgns =
- map_try ~catch:(v :> var) choose init_domain in
- if pos_assgns = [] then raise Unsatisfiable
- else
- (* c2 *)
- let more_assgns = Aux.map_some (fun ((e,aset) as e_aset) ->
- if List.mem_assoc e pos_assgns
- then None else (
- if aset = A.Any then incr num_anys;
- Some e_aset))
- dis_assgns in
- let new_implicit = num_implicit - !other_used in
- let other_assgns =
- if other_aset = A.Empty || new_implicit <= 0
- then []
- else [~-new_implicit, other_aset] in
- if other_aset = A.Any then
- num_anys := !num_anys + new_implicit;
- if !num_anys >= num_elems then A.Any
- else A.FO (v, other_assgns @ pos_assgns @ more_assgns)
-
- (* d *)
- | _ when not (A.mem_assoc v cur_aset) ->
- (* Unlikely to be useful, but for completeness... *)
- let num_anys = ref 0 in
- let choose e =
- let ret_aset =
- eval_cont ((v, e)::sb) cur_aset in
- if ret_aset = A.Any then incr num_anys;
- e, ret_aset in
- (* d1 *)
- let pos_assgns =
- map_try ~catch:(v :> var) choose init_domain in
- if pos_assgns = [] then raise Unsatisfiable
- else if !num_anys = num_elems then A.Any
- else if cur_aset = A.Empty
- then A.FO (v, pos_assgns)
- else
- (* d2 *)
- let num_implicit = num_elems - List.length pos_assgns in
- let other_assgns =
- if num_implicit <= 0 then []
- else [~-num_implicit, cur_aset] in
- A.FO (v, other_assgns @ pos_assgns)
-
- (* e *)
- | _ -> (* when A.mem_assoc v cur_aset *)
- let domain = explicit_v_domain v cur_aset in
- let pull_v e =
- e, project_v_on_elem v e cur_aset in
- let pos_assgns = map_try pull_v (Elems.elements domain) in
- let num_implicit = num_elems - List.length pos_assgns in
- let other_assgns =
- if num_implicit <= 0 then []
- else try
- [~-num_implicit, project_v_on_implicit v cur_aset]
- with Unsatisfiable -> [] in
- let assgns = other_assgns @ pos_assgns in
- if assgns = [] then raise Unsatisfiable
- else aux (A.FO (v, assgns)) in
-
- if is_local then
- (* f *)
- let choose cur_aset e =
- eval_cont ((v, e)::sb) cur_aset in
- let pos_assgns =
- fold_try ~catch:(v :> var) choose cur_aset init_domain in
- if pos_assgns = A.Empty then raise Unsatisfiable
- else pos_assgns
-
- else aux cur_aset
-
-
-(* Use a bigger assignment set as the first argument. *)
-(* Model used only for debugging. *)
-let rec sum_assignment_sets model all_elems num_elems aset1 aset2 =
- (* [sb] always has the form [v, e] *)
- let rec cont disjs sb aset1 =
- aux aset1 (List.assoc (snd (List.hd sb)) disjs)
- and aux aset1 = function
- | A.Empty -> aset1
- | A.Any -> A.Any (* subsumption *)
- | A.FO (v, (impl, other_aset2)::dis_assgns) when impl < 0 ->
- (* doing some of [merge] work to avoid enumerating all elements
- as the init_domain *)
- if A.mem_assoc v aset1 then
- let domain = explicit_v_domain v aset1 in
- let domain = add_elems (List.map fst dis_assgns) domain in
- (* {{{ log entry *)
- if !debug_level > 4 then (
- printf "sum: var %s -- explicit domain: %s\n%!" (var_str v)
- (String.concat ", " (List.map (Structure.elem_str model)
- (Elems.elements domain)));
- );
- (* }}} *)
- let num_anys = ref 0 in
- let assgns = List.map (fun e ->
- let aset2 =
- try List.assoc e dis_assgns with Not_found -> other_aset2 in
- let aset1 =
- try project_v_on_elem v e aset1
- with Unsatisfiable -> A.Empty in
- let aset = aux aset1 aset2 in
- assert (aset <> A.Empty);
- if aset = A.Any then incr num_anys;
- e, aset) (Elems.elements domain) in
- let num_implicit = num_elems - (Elems.cardinal domain) in
- if !num_anys >= num_elems then A.Any
- else if num_implicit <= 0 then A.FO (v, assgns)
- else
- let other_aset1 = project_v_on_implicit v aset1 in
- A.FO (v,(~-num_implicit, aux other_aset1 other_aset2)::assgns)
- else (* project v *)
- let assgns = List.map snd dis_assgns in
- let aset2 = List.fold_left aux other_aset2 assgns in
- aux aset1 aset2
- | A.FO (v, assgns) ->
- let init_domain = List.map fst assgns in
- merge model all_elems num_elems false v init_domain
- [] aset1 (cont assgns)
- | A.Real _ | A.MSO _ ->
- failwith "Real/MSO assignments not supported yet" in
- aux aset1 aset2
-
-(* Remove existentially quantified variables from the solution. *)
-(* Model used only for debugging. *)
-and project model all_elems num_elems aset v =
- match aset with
- | A.Empty -> A.Empty
- | A.Any -> A.Any
- | A.FO (_, []) -> assert false
- | A.FO (v1, [e, aset]) when v1 = v -> aset
- | A.FO (v1, (_, aset)::assgns) when v1 = v ->
- List.fold_left (sum_assignment_sets model all_elems num_elems) aset
- (List.map snd assgns)
- | A.FO (v1, assgns) ->
- A.FO (v1, List.map (fun (e, aset) ->
- e, project model all_elems num_elems aset v) assgns)
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet"
-
-(* "Negate" the assignment set wrt. [all_elems]. *)
-let rec complement all_elems num_elems = function
- | A.Empty -> A.Any
- | A.Any -> A.Empty
- | A.FO (_, []) -> assert false
- | A.FO (v, (impl, A.Any)::dis_assgns) when impl < 0 ->
- let deeper = Aux.map_some
- (fun (e, aset) ->
- let assgn = complement all_elems num_elems aset in
- if assgn = A.Empty then None else Some (e, assgn))
- dis_assgns in
- if deeper = [] then A.Empty else A.FO (v, deeper)
- | A.FO (v, all_assgns) ->
- let other_aset, num_implicit, dis_assgns =
- match all_assgns with
- | (impl, other_aset)::dis_assgns when impl < 0 ->
- other_aset, ~-impl, dis_assgns
- | _ -> A.Empty, num_elems - List.length all_assgns, all_assgns in
- let dropout = ref false in
- let deeper = Aux.map_some
- (fun (e, aset) ->
- let assgn = complement all_elems num_elems aset in
- if assgn = A.Empty then (dropout := true; None)
- else Some (e, assgn))
- dis_assgns in
- let other_aset = complement all_elems num_elems other_aset in
- if not !dropout then
- A.FO (v, (~-num_implicit, other_aset)::deeper)
- else
- let other_assgns = Aux.map_some (fun e->
- if List.mem_assoc e dis_assgns then None
- else Some (e, other_aset)) all_elems in
- let assgns = deeper @ other_assgns in
- if assgns = [] then A.Empty else A.FO (v, assgns)
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet"
-
-(* Join several assignment sets using de Morgan laws. *)
-(* TODO: optimize! write "join" analogous to "merge" to avoid going
- through complement *)
-(* Model used only for debugging. *)
-let intersect_assignment_sets model all_elems num_elems asets =
- match asets with
- | [] -> A.Any
- | [aset] -> aset
- | aset::asets ->
- let negated = List.map (complement all_elems num_elems) asets in
- let neg_aset = complement all_elems num_elems aset in
- (* {{{ log entry *)
- if !debug_level > 3 then (
- printf "intersect: negated asets: %s\n%!"
- (String.concat "; " (
- List.map (AssignmentSet.named_str model) ((neg_aset::negated))));
- );
- (* }}} *)
- let union =
- List.fold_left (sum_assignment_sets model all_elems num_elems)
- neg_aset negated in
- (* {{{ log entry *)
- if !debug_level > 3 then (
- printf "intersect: union negated: %s\n%!"
- (AssignmentSet.named_str model union);
- );
- (* }}} *)
- let res = complement all_elems num_elems union in
- (* {{{ log entry *)
- if !debug_level > 3 then (
- printf "intersect: result: %s\n%!"
- (AssignmentSet.named_str model res);
- );
- (* }}} *)
- res
-
-(* Remove universally quantified variables from the solution. *)
-(* Model used only for debugging. *)
-let universal model all_elems num_elems aset v =
- let rec aux = function
- | A.Empty -> raise Unsatisfiable
- | A.Any -> A.Any
- | A.FO (_, []) -> assert false
- | A.FO (v1, all_assgns) when v1 = v ->
- let other_aset, num_implicit, dis_assgns =
- match all_assgns with
- | (e,aset)::dis_assgns when e < 0 -> aset, ~-e, dis_assgns
- | _ -> A.Empty, num_elems - List.length all_assgns, all_assgns in
- if other_aset = A.Empty && num_implicit > 0
- then (
- (* {{{ log entry *)
- if !debug_level > 3 then (
- printf "universal: v=%s -- not enough elements\n%!"
- (Formula.var_str v);
- );
- (* }}} *)
- raise Unsatisfiable
- ) else
- let aset =
- intersect_assignment_sets model all_elems num_elems
- (List.map snd all_assgns) in
- if aset = A.Empty then (
- (* {{{ log entry *)
- if !debug_level > 3 then (
- printf "universal: v=%s -- no common subassignment\n%!"
- (Formula.var_str v);
- );
- (* }}} *)
- raise Unsatisfiable
- ) else aset
- | A.FO (v1, assgns) ->
- let assgns =
- map_try (fun (e, aset) -> e, aux aset) assgns in
- if assgns = [] then raise Unsatisfiable
- else A.FO (v1, assgns)
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet" in
- aux aset
-
-
-(* "Negate" the second assignment set wrt. [all_elems] and add it to the
- first aset. *)
-(* Model used only for debugging. *)
-(* FIXME: handle "other element contexts". *)
-let rec add_complement model all_elems num_elems disj_aset = function
- | A.Empty -> A.Any
- | A.Any ->
- if disj_aset = A.Empty then raise Unsatisfiable;
- disj_aset
- | A.FO (_, []) -> assert false
- | A.FO (v, assgns) ->
- let add_cont sb dset =
- let e = snd (List.hd sb) in
- let cset =
- (* Empty will turn into Any on recursive callback *)
- try List.assoc e assgns with Not_found -> A.Empty in
- add_complement model all_elems num_elems dset cset in
- merge model all_elems num_elems false v all_elems [] disj_aset add_cont
-
- | A.Real _ | A.MSO _ ->
- failwith "FFSolver: Real/MSO assignments not supported yet"
-
-
-let evaluate model ?(sb=[]) ?(disj_aset=A.Empty) phi =
- (* {{{ log entry *)
- let guard_number = ref 0 in
- if !debug_level > 1 then (
- printf "evaluate: phi=%s; sb=%s; disj_aset=%s\n%!"
- (Formula.str phi) (sb_str model sb)
- (AssignmentSet.named_str model disj_aset);
- );
- (* }}} *)
- let all_elems = Elems.elements model.elements in
- let num_elems = Elems.cardinal model.elements in
-
- (* Process conjunctions by passing the remaining conjuncts a la CPS,
- filtering according to subsumption with the current alternative
- (cur-aset), accumulating assignments in a substitution and
- rebuilding the resulting aset on return. Disjunctions are
- processed by fold-try of the solution process with cur-aset as
- accumulator. Branch on a variable when it is first encountered in
- a literal. Eliminate a variable (and sum its branches) from the
- assignment set when exiting an existential quantifier [TODO:
- optimize]. Check universally quantified variables for coverage.
-
- Do not return [A.Empty], raise [Unsatisfiable] instead. *)
- let rec solve local_vars delayed2 delayed1 conj_cont sb cur_aset =
- (* {{{ log entry *)
- if !debug_level > 3 then (
- printf "solve: remaining=%s\nsolve: sb=%s\nsolve: disj_aset=%s\n%!"
- (Formula.str (And (conj_cont @ delayed1 @ delayed2)))
- (sb_str model sb) (AssignmentSet.named_str model cur_aset);
- );
- (* }}} *)
- (* a *)
- if cur_aset = A.Any then (
- (* {{{ log entry *)
- if !debug_level > 2 then (
- printf "a: cur_aset=Any subsuming phi=%s\n%!"
- (Formula.str (And (conj_cont @ delayed1 @ delayed2)))
- );
- (* }}} *)
- A.Any
- ) else match conj_cont with
- | [] ->
- if delayed1 <> []
- then solve local_vars delayed2 [] (List.rev delayed1) sb cur_aset
- else if delayed2 <> []
- then solve local_vars [] [] (List.rev delayed2) sb cur_aset
- (* b *)
- else (
- (* {{{ log entry *)
- if !debug_level > 2 then (
- printf "b: phi=[] subsuming cur_aset=%s\n%!"
- (AssignmentSet.named_str model cur_aset);
- );
- (* }}} *)
- A.Any (* subsuming [cur_aset] *)
- )
- | Rel (relname, vtup) as atom :: conj_cont ->
- let tuples_s =
- try StringMap.find relname model.relations
- with Not_found -> Tuples.empty in
- (let try tup = Array.map (fun v->List.assoc v sb) vtup in
- if not (Tuples.mem tup tuples_s)
- then raise (Unsatisfiable_FO (vars_of_array (var_tup vtup)))
- else if conj_cont <> []
- then solve local_vars delayed2 delayed1 conj_cont sb cur_aset
- else if delayed1 <> []
- then solve local_vars delayed2 [] (List.rev delayed1) sb cur_aset
- else solve local_vars [] [] (List.rev delayed2) sb cur_aset
- with Not_found ->
- (* we will add new variables one at a time *)
- let nvi =
- Aux.array_argfind (fun v->not (List.mem_assoc v sb)) vtup in
- let nvar = vtup.(nvi) in
- let oldvars =
- Aux.array_find_all (fun v->List.mem_assoc v sb) vtup in
- let multi_unkn = Aux.array_existsi
- (fun i v->i>nvi && not (List.mem v oldvars)) vtup in
- if multi_unkn && conj_cont <> [] then (* delay *)
- solve local_vars delayed2 (atom::delayed1) conj_cont
- sb cur_aset
- else
- (* to narrow the domain, lookup incidence of known vars,
- filter for partial match and project on the nvar
- position *)
- let tuples_i =
- try StringMap.find relname model.incidence
- with Not_found -> IntMap.empty in
- let tups_sets = List.map (fun v->
- try IntMap.find (List.assoc v sb) tuples_i
- with Not_found -> Tuples.empty) oldvars in
- let tuples =
- match tups_sets with
- | [] -> tuples_s
- | [tups] -> tups
- | tups::tups_sets ->
- List.fold_left Tuples.inter tups tups_sets in
- if Tuples.is_empty tuples
- then raise
- (Unsatisfiable_FO (vars_of_array (var_tup vtup)))
- else
- let known_tup = Array.map
- (fun v -> try List.assoc v sb with Not_found -> -1)
- vtup in
- let init_domain =
- Tuples.fold (fun tup dom ->
- if Aux.array_for_all2 (fun known asked->
- known = -1 || known = asked) known_tup tup
- && not (List.mem tup.(nvi) dom)
- then tup.(nvi)::dom
- else dom) tuples [] in
- (* {{{ log entry *)
- if !debug_level > 2 then (
- printf "init_domain: sb=%s; phi=%s; dom=%s\n%!"
- (sb_str model sb) (Formula.str atom)
- (String.concat ", " (List.map (Structure.elem_str model)
- init_domain));
- );
- (* }}} *)
- if init_domain = []
- then raise
- (Unsatisfiable_FO (vars_of_array (var_tup vtup)))
- else if not multi_unkn && conj_cont = [] && delayed1 = [] &&
- delayed2 = []
- then (* no more vars and conjuncts *)
- merge model all_elems num_elems
- (Vars.mem (nvar :> var) local_vars)
- nvar init_domain sb cur_aset
- (fun _ _ -> A.Any) (* subsume *)
- else
- let conj_cont =
- if multi_unkn then atom::conj_cont else conj_cont in
- (* If not [multi_unkn] then for elements in [init_domain]
- rel holds *)
- merge model all_elems num_elems
- (Vars.mem (nvar :> var) local_vars)
- nvar init_domain sb cur_aset
- (solve local_vars delayed2 delayed1 conj_cont)
- )
-
- (* by analogy to the [Rel (relname, vtup)] case *)
- | Eq (x, y) as atom :: conj_cont ->
- let vtup = [x; y] in
- (try
- if not ...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-23 21:14:38
|
Revision: 1384
http://toss.svn.sourceforge.net/toss/?rev=1384&view=rev
Author: lukstafi
Date: 2011-03-23 21:14:31 +0000 (Wed, 23 Mar 2011)
Log Message:
-----------
Specification-level bug in monotonic heuristic generation. More encompassing monotonicity detection and more clean monotonic heuristic generation for approximately monotonic games.
Modified Paths:
--------------
trunk/Toss/Arena/DiscreteRule.ml
trunk/Toss/Arena/DiscreteRule.mli
trunk/Toss/Formula/Aux.ml
trunk/Toss/Formula/Aux.mli
trunk/Toss/Formula/FormulaOps.ml
trunk/Toss/Formula/FormulaOps.mli
trunk/Toss/Play/Heuristic.ml
trunk/Toss/Play/HeuristicTest.ml
Modified: trunk/Toss/Arena/DiscreteRule.ml
===================================================================
--- trunk/Toss/Arena/DiscreteRule.ml 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Arena/DiscreteRule.ml 2011-03-23 21:14:31 UTC (rev 1384)
@@ -2,6 +2,9 @@
let debug_level = ref 0
+let approximate_monotonic = ref true
+let prune_indef_vars = ref true
+
type matching = (int * int) list
type matchings = Assignments.assignment_set
@@ -55,7 +58,10 @@
preconditions, and negative fluents only negatively on RHSes (are
only deleted) and only positively on LHSes and in
preconditions. (Call the remaining fluents indefinite.) See
- Heuristic.ml. *)
+ Heuristic.ml.
+
+ In case [approximate_monotonic] is true, ignore what happens on
+ RHSes. *)
let fluents_make ?(only_pos=false) f r =
let fl_make (s, tp) =
if tp = [] then None else
@@ -72,8 +78,14 @@
let nega_cands = Aux.strings_of_list (
Aux.concat_map (fun r->map_rels r.rhs_neg_tuples) rules) in
let fluents = Aux.Strings.union posi_cands nega_cands in
- let posi = Aux.Strings.diff posi_cands nega_cands
- and nega = Aux.Strings.diff nega_cands posi_cands in
+ let posi =
+ if !approximate_monotonic
+ then fluents
+ else Aux.Strings.diff posi_cands nega_cands
+ and nega =
+ if !approximate_monotonic
+ then fluents
+ else Aux.Strings.diff nega_cands posi_cands in
let posi_lhs, nega_lhs =
List.fold_left (fun (posi,nega) r ->
let mp, mn = FormulaOps.rels_signs r.lhs_form in
@@ -89,17 +101,42 @@
position. We are only interested in expanding preconditions of
positive and negative fluents.
+ The fluent preconditions have closed subformulas eliminated, as
+ these do not differentiate between different actions (usually they
+ represent termination conditions). Also remove indefinite fluents
+ as these are heuristically assumed to be irrelevant in monotonic
+ games for long-term payoff behavior.
+
+ Additional (optional but on by default) heuristic pruning removes
+ also other atoms that contain variables that were constrained by
+ indefinite fluents (prune_indef_vars).
+
TODO: currently, only a single absence/presence tuple is removed
from the precondition: the one from which it "derived"; shouldn't
all added and deleted tuples be removed? *)
-let fluent_preconds rules signature posi_frels nega_frels =
- let fluents =
- Aux.Strings.elements posi_frels @ Aux.Strings.elements nega_frels in
- let fluent_precond rel =
+let fluent_preconds rules signature posi_frels nega_frels indef_frels =
+ let indef_vars_fold =
+ {FormulaOps.make_fold Aux.unique_append [] with
+ FormulaOps.fold_Rel = (fun rel args ->
+ if Aux.Strings.mem rel indef_frels
+ then Array.to_list args else [])} in
+ let collect_indef_vars phi =
+ FormulaOps.fold_formula indef_vars_fold phi in
+ let rem_closed indef_vars = function
+ | Formula.Eq (x, y) ->
+ List.mem x indef_vars || List.mem y indef_vars
+ | Formula.In (x, _) -> List.mem x indef_vars
+ | Formula.Rel (rel, args) ->
+ Aux.Strings.mem rel indef_frels ||
+ ( !prune_indef_vars &&
+ Aux.array_existsi (fun _ v -> List.mem v indef_vars) args)
+ | phi -> FormulaOps.free_vars phi = [] in
+ let fluent_precond is_posi rel =
(* rules that produce a fluent, together with its args *)
let rel_prods =
Aux.map_some (fun r ->
- let rhs_tuples = r.rhs_pos_tuples @ r.rhs_neg_tuples in
+ let rhs_tuples =
+ if is_posi then r.rhs_pos_tuples else r.rhs_neg_tuples in
if List.mem_assoc rel rhs_tuples then
let rel_tups = List.assoc rel rhs_tuples in
if rel_tups <> [] then Some (r, rel_tups)
@@ -121,6 +158,14 @@
args
| Some rlmap ->
Array.map (fun e->List.assoc e rlmap) args in
+ (* {{{ log entry *)
+ if !debug_level > 3 then (
+ Printf.printf "compose_pre: rel=%s; args=%s; lhs_args=%s\n%!"
+ rel
+ (String.concat ", " (Array.to_list args))
+ (String.concat ", " (Array.to_list lhs_args))
+ );
+ (* }}} *)
(* remove potential condition for absence/presence of the
fluent being just added / deleted *)
let body = FormulaOps.map_formula
@@ -135,6 +180,22 @@
if b && Aux.Strings.mem rel nega_frels then Formula.And []
else if b && Aux.Strings.mem rel posi_frels then Formula.Or []
else Formula.Rel (b_rel, b_args))} body in
+ (* {{{ log entry *)
+ if !debug_level > 2 then (
+ Printf.printf "fluent_preconds: body before pruning:\n%s\n%!"
+ (Formula.sprint body)
+ );
+ (* }}} *)
+ (* remove closed subformulas and indefinite fluents *)
+ let indef_vars = collect_indef_vars body in
+ let body =
+ FormulaOps.remove_subformulas (rem_closed indef_vars) body in
+ (* {{{ log entry *)
+ if !debug_level > 2 then (
+ Printf.printf "fluent_preconds: body after pruning:\n%s\n%!"
+ (Formula.sprint body)
+ );
+ (* }}} *)
let args = Array.to_list args in
let body, other_vars, numap_cstr =
match r.rlmap with
@@ -164,8 +225,17 @@
| [] -> failwith ("fluent_preconds: not a fluent: "^rel)
| [phi] -> phi
| _ -> Formula.Or disjs in
+ let precond = FormulaOps.prune_unused_quants precond in
+ (* {{{ log entry *)
+ if !debug_level > 2 then (
+ Printf.printf "fluent_preconds: result -- rel=%s(%s), precond=\n%s\n%!"
+ rel (String.concat ", " nu_args)
+ (Formula.sprint precond)
+ );
+ (* }}} *)
rel, (nu_args, precond) in
- List.map fluent_precond fluents
+ List.map (fluent_precond true) (Aux.Strings.elements posi_frels) @
+ List.map (fluent_precond false) (Aux.Strings.elements nega_frels)
(* {2 Embedding and rewriting.} *)
Modified: trunk/Toss/Arena/DiscreteRule.mli
===================================================================
--- trunk/Toss/Arena/DiscreteRule.mli 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Arena/DiscreteRule.mli 2011-03-23 21:14:31 UTC (rev 1384)
@@ -2,7 +2,13 @@
val debug_level : int ref
-(* Single match of a rule, and a set of matches. *)
+(** If [true], ignore what happens on RHSes of rules when assessing
+ if fluents are positive / negative (only check whether their
+ LHS+precondition occurrences are negative/positive). *)
+val approximate_monotonic : bool ref
+val prune_indef_vars : bool ref
+
+(** Single match of a rule, and a set of matches. *)
type matching = (int * int) list
type matchings = Assignments.assignment_set
@@ -63,7 +69,8 @@
position. We are only interested in expanding preconditions of
positive and negative fluents. *)
val fluent_preconds :
- rule_obj list -> (string -> int) -> Aux.Strings.t -> Aux.Strings.t ->
+ rule_obj list -> (string -> int) ->
+ Aux.Strings.t -> Aux.Strings.t -> Aux.Strings.t ->
(string * (string list * Formula.formula)) list
(* Helpers for special relations. *)
Modified: trunk/Toss/Formula/Aux.ml
===================================================================
--- trunk/Toss/Formula/Aux.ml 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Formula/Aux.ml 2011-03-23 21:14:31 UTC (rev 1384)
@@ -247,6 +247,10 @@
| [] -> [] in
idemp (List.sort Pervasives.compare l)
+let unique_append l1 l2 =
+ List.fold_left (fun l2 e ->
+ if List.mem e l2 then l2 else e::l2) l2 (List.rev l1)
+
(* TODO: that's quadratic, optimize? *)
let rec unique eq = function
| [] -> []
Modified: trunk/Toss/Formula/Aux.mli
===================================================================
--- trunk/Toss/Formula/Aux.mli 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Formula/Aux.mli 2011-03-23 21:14:31 UTC (rev 1384)
@@ -155,6 +155,10 @@
by {!Pervasives.compare}. Not tail-recursive. *)
val unique_sorted : 'a list -> 'a list
+(** [unique_append l1 l2] appends elements not occurring in [l2] to
+ it, without repeating elements. *)
+val unique_append : 'a list -> 'a list -> 'a list
+
(** Return the list of unique elements, under the given comparison
(the input does not need to be sorted). (Currently uses a
straightforward [n^2] algorithm. Currently not tail-recursive.) *)
Modified: trunk/Toss/Formula/FormulaOps.ml
===================================================================
--- trunk/Toss/Formula/FormulaOps.ml 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Formula/FormulaOps.ml 2011-03-23 21:14:31 UTC (rev 1384)
@@ -889,7 +889,10 @@
map_Or = (function
| [disj] -> disj
| disjs -> Or (Aux.concat_map flat_or disjs));
- map_Not = (function Not phi -> phi | phi -> Not phi)}
+ map_Not = (function
+ | Or [] -> And []
+ | And [] -> Or []
+ | Not phi -> phi | phi -> Not phi)}
let rec flatten_or = function
| Or disjs -> Aux.concat_map flatten_or disjs
@@ -921,6 +924,30 @@
| Not (Not phi) -> flatten_ands phi
| phi -> [phi]
+(* Currently, does not go down real expressions. *)
+let remove_subformulas psub phi =
+ let rec map_formula subf =
+ if psub subf then raise Not_found;
+ match subf with
+ | Rel _ | Eq _ | RealExpr _ | In _ -> subf
+ | Not phi -> Not (map_formula phi)
+ | And conjs -> And (Aux.map_try map_formula conjs)
+ | Or disjs -> Or (Aux.map_try map_formula disjs)
+ | Ex (vs, phi) -> Ex (vs, map_formula phi)
+ | All (vs, phi) -> All (vs, map_formula phi) in
+ try flatten_formula (map_formula phi)
+ with Not_found -> And []
+
+let unused_quants_map = {identity_map with
+ map_Ex = (fun vs phi ->
+ if Aux.list_inter vs (free_vars phi) = [] then phi
+ else Ex (vs, phi));
+ map_All = (fun vs phi ->
+ if Aux.list_inter vs (free_vars phi) = [] then phi
+ else All (vs, phi))}
+
+let prune_unused_quants = map_formula unused_quants_map
+
(* Simplify the formula by removing relational literals, depending on
what literals they are conjoined with up the tree, whether they are
in a disjunction and what literals they are disjoined with, keeping
Modified: trunk/Toss/Formula/FormulaOps.mli
===================================================================
--- trunk/Toss/Formula/FormulaOps.mli 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Formula/FormulaOps.mli 2011-03-23 21:14:31 UTC (rev 1384)
@@ -161,6 +161,13 @@
negation over disjunction and pushing quantifiers inside. *)
val flatten_ands : formula -> formula list
+(** "Erase" indicated subformulas from the formula. *)
+val remove_subformulas : (formula -> bool) -> formula -> formula
+
+(** Remove quantifiers that bind only variables not occurring freely
+ in the body. *)
+val prune_unused_quants : formula -> formula
+
(** Simplify the formula by removing relational literals, depending on
what literals they are conjoined with up the tree, whether they are
in a disjunction and what literals they are disjoined with, keeping
Modified: trunk/Toss/Play/Heuristic.ml
===================================================================
--- trunk/Toss/Play/Heuristic.ml 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Play/Heuristic.ml 2011-03-23 21:14:31 UTC (rev 1384)
@@ -51,11 +51,14 @@
module):
H(Phi) =
- Sum(V1, (F11\/...\/F1N_1) /\ Pre(F11/\.../\F1N_1) /\ Guard1,
+ Sum(V1, (F11\/...\/F1N_1) /\
+ (F11\/Pre(F11)) /\ ... /\ (F1N_1\/Pre(F1N_1) /\ Guard1,
CharSum(F11, ..., F1N_1)) +
... +
- Sum(VM, (FM1\/...\/FMN_M) /\ Pre(FM1/\.../\FMN_M) /\ GuardM,
+ Sum(VM, (FM1\/...\/FMN_M) /\
+ (FM1\/Pre(FM1)) /\ ... /\ (FMN_M\/Pre(FMN_M)) /\ GuardM,
CharSum(FM1, ..., FMN_M))
+
where:
* CharSum(Fi1, ..., FiN_i) = f(Char(Fi1) + ... + Char(FiN_i), N_i)
@@ -83,6 +86,15 @@
is equivalent to Phi with minimal application of distributivity
(GuardI can contain disjunctions if they don't contain any of FIj)
+ The fluent preconditions Pre() have closed subformulas eliminated,
+ as these do not differentiate between different actions (usually
+ they represent termination conditions). Also remove indefinite
+ fluents as these are heuristically assumed to be irrelevant in
+ monotonic games for long-term payoff behavior. Additional
+ (optional but on by default) heuristic pruning removes also other
+ atoms that contain variables that were constrained by indefinite
+ fluents (parameter {!DiscreteRule.prune_indef_vars}}).
+
**********
Algorithm Alg(Ex(V,Phi), Guard0):
@@ -888,7 +900,9 @@
let m = List.length literals in
let pre_guard = And (
Or literals ::
- List.map (FormulaOps.subst_once_rels preconds) atoms @ [guard]) in
+ List.map (fun atom ->
+ Or [atom; FormulaOps.subst_once_rels preconds atom])
+ atoms @ [guard]) in
Sum (avs, FormulaOps.simplify pre_guard, f_monot adv_ratio n m)
) guards in
sum_exprs parts
@@ -1075,7 +1089,7 @@
let fluent_preconds =
if monotonic then
Some (DiscreteRule.fluent_preconds drules signat
- posi_frels nega_frels)
+ posi_frels nega_frels indef_frels)
else None in
Array.mapi (fun i node -> Array.map
(fun payoff ->
Modified: trunk/Toss/Play/HeuristicTest.ml
===================================================================
--- trunk/Toss/Play/HeuristicTest.ml 2011-03-23 17:47:00 UTC (rev 1383)
+++ trunk/Toss/Play/HeuristicTest.ml 2011-03-23 21:14:31 UTC (rev 1384)
@@ -75,7 +75,8 @@
(Aux.Strings.inter all_poff_rels indef_frels) in
let fluent_preconds =
if monotonic then Some (
- DiscreteRule.fluent_preconds drules signat posi_frels nega_frels)
+ DiscreteRule.fluent_preconds drules signat
+ posi_frels nega_frels indef_frels)
else None in
Heuristic.of_payoff ?struc ?fluent_preconds advance_ratio
~posi_frels ~nega_frels frels payoff
@@ -267,14 +268,14 @@
rule_of_str sigPQ "[a | P:1 {}; Q:1 {} | ] -> [ | Q:1 {}; P(a) | ] emb P, Q";
rule_of_str sigPQ "[a | P:1 {}; Q:1 {} | ] -> [ | P:1 {}; Q(a) | ] emb P, Q"] in
assert_equal ~printer:(fun x->x) ~msg:"adv_ratio=1"
- "(Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (P(z) or P(y) or P(x)) and (not Q(x)) and (not Q(y)) and (not Q(z))) : (((:(P(x)) + :(P(y))) + :(P(z))) * 0.33)) + (-1. * Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (Q(z) or Q(y) or Q(x)) and (not P(x)) and (not P(y)) and (not P(z))) : (((:(Q(x)) + :(Q(y))) + :(Q(z))) * 0.33))))"
+ "(Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (P(x) or P(y) or P(z)) and ((not Q(x)) or P(x)) and ((not Q(y)) or P(y)) and ((not Q(z)) or P(z))) : (((:(P(x)) + :(P(y))) + :(P(z))) * 0.33)) + (-1. * Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (Q(x) or Q(y) or Q(z)) and ((not P(x)) or Q(x)) and ((not P(y)) or Q(y)) and ((not P(z)) or Q(z))) : (((:(Q(x)) + :(Q(y))) + :(Q(z))) * 0.33))))"
(Formula.real_str
(Heuristic.map_constants (fun c->(floor (c*.100.))/.100.)
(default_heuristic 1. rules
(real_of_str (":("^winPxyz^") - :("^winQxyz^")")))));
assert_equal ~printer:(fun x->x) ~msg:"adv_ratio=2"
- "(Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (P(z) or P(y) or P(x)) and (not Q(x)) and (not Q(y)) and (not Q(z))) : ((((:(P(x)) + :(P(y))) + :(P(z))) * ((:(P(x)) + :(P(y))) + :(P(z)))) * 0.11)) + (-1. * Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (Q(z) or Q(y) or Q(x)) and (not P(x)) and (not P(y)) and (not P(z))) : ((((:(Q(x)) + :(Q(y))) + :(Q(z))) * ((:(Q(x)) + :(Q(y))) + :(Q(z)))) * 0.11))))"
+ "(Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (P(x) or P(y) or P(z)) and ((not Q(x)) or P(x)) and ((not Q(y)) or P(y)) and ((not Q(z)) or P(z))) : ((((:(P(x)) + :(P(y))) + :(P(z))) * ((:(P(x)) + :(P(y))) + :(P(z)))) * 0.11)) + (-1. * Sum (z, y, x | (((R(x, y) and R(y, z)) or (C(x, y) and C(y, z)) or ex u, v ((C(z, u) and C(y, v) and R(y, u) and R(x, v))) or ex u, v ((R(y, u) and R(x, v) and C(v, y) and C(u, z)))) and (Q(x) or Q(y) or Q(z)) and ((not P(x)) or Q(x)) and ((not P(y)) or Q(y)) and ((not P(z)) or Q(z))) : ((((:(Q(x)) + :(Q(y))) + :(Q(z))) * ((:(Q(x)) + :(Q(y))) + :(Q(z)))) * 0.11))))"
(Formula.real_str
(Heuristic.map_constants (fun c->(floor (c*.100.))/.100.)
(default_heuristic 2. rules
@@ -287,14 +288,14 @@
rule_of_str sigPQ "[a | P:1 {}; Q:1 {} | ] -> [ | Q:1 {}; P(a) | ] emb P, Q";
rule_of_str sigPQ "[a | P:1 {}; Q:1 {} | ] -> [ | P:1 {}; Q(a) | ] emb P, Q"] in
assert_equal ~printer:(fun x->x) ~msg:"adv_ratio=2"
- "(Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (P(z) or P(y) or P(x) or P(w) or P(v)) and (not Q(v)) and (not Q(w)) and (not Q(x)) and (not Q(y)) and (not Q(z))) : ((((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))) * ((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z)))) * 0.04)) + (-1. * Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (Q(z) or Q(y) or Q(x) or Q(w) or Q(v)) and (not P(v)) and (not P(w)) and (not P(x)) and (not P(y)) and (not P(z))) : ((((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))) * ((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z)))) * 0.04))))"
+ "(Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (P(z) or P(y) or P(x) or P(w) or P(v)) and ((not Q(z)) or P(z)) and ((not Q(y)) or P(y)) and ((not Q(x)) or P(x)) and ((not Q(w)) or P(w)) and ((not Q(v)) or P(v))) : ((((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))) * ((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z)))) * 0.04)) + (-1. * Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (Q(z) or Q(y) or Q(x) or Q(w) or Q(v)) and ((not P(z)) or Q(z)) and ((not P(y)) or Q(y)) and ((not P(x)) or Q(x)) and ((not P(w)) or Q(w)) and ((not P(v)) or Q(v))) : ((((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))) * ((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z)))) * 0.04))))"
(Formula.real_str
((* Heuristic.map_constants (fun c->(floor (c*.100.))/.100.) *)
(default_heuristic 2. rules
(real_of_str (":("^winPvwxyz^") - :("^winQvwxyz^")")))));
assert_equal ~printer:(fun x->x) ~msg:"adv_ratio=3"
- "(Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (P(z) or P(y) or P(x) or P(w) or P(v)) and (not Q(v)) and (not Q(w)) and (not Q(x)) and (not Q(y)) and (not Q(z))) : ((((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))) * (((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))) * ((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))))) * 0.008)) + (-1. * Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (Q(z) or Q(y) or Q(x) or Q(w) or Q(v)) and (not P(v)) and (not P(w)) and (not P(x)) and (not P(y)) and (not P(z))) : ((((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))) * (((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))) * ((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))))) * 0.008))))"
+ "(Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (P(z) or P(y) or P(x) or P(w) or P(v)) and ((not Q(z)) or P(z)) and ((not Q(y)) or P(y)) and ((not Q(x)) or P(x)) and ((not Q(w)) or P(w)) and ((not Q(v)) or P(v))) : ((((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))) * (((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))) * ((((:(P(v)) + :(P(w))) + :(P(x))) + :(P(y))) + :(P(z))))) * 0.008)) + (-1. * Sum (z, y, x, w, v | (((R(v, w) and R(w, x) and R(x, y) and R(y, z)) or (C(v, w) and C(w, x) and C(x, y) and C(y, z)) or ex r, s, t, u ((C(z, u) and R(y, u) and C(y, t) and R(x, t) and C(x, s) and R(w, s) and C(w, r) and R(v, r))) or ex r, s, t, u ((R(y, u) and R(x, t) and R(w, s) and R(v, r) and C(u, z) and C(t, y) and C(s, x) and C(r, w)))) and (Q(z) or Q(y) or Q(x) or Q(w) or Q(v)) and ((not P(z)) or Q(z)) and ((not P(y)) or Q(y)) and ((not P(x)) or Q(x)) and ((not P(w)) or Q(w)) and ((not P(v)) or Q(v))) : ((((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))) * (((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))) * ((((:(Q(v)) + :(Q(w))) + :(Q(x))) + :(Q(y))) + :(Q(z))))) * 0.008))))"
(Formula.real_str
((* Heuristic.map_constants (fun c->(floor (c*.1000.))/.1000.) *)
(default_heuristic 3. rules
@@ -328,15 +329,14 @@
"default_heuristic_old: connect5 of GDL translation" >::
(fun () ->
- skip_if true "turns out connect5 is not monotonic";
let (game,state) =
state_of_file "./GGP/tests/connect5-simpl.toss" in
let loc_heurs =
Heuristic.default_heuristic_old ~struc:state.Arena.struc
~advr:4.0 game in
assert_equal ~printer:(fun x->x)
- "SHOULD GENERATE AS FOR A MONOTONIC GAME"
- (Formula.sprint_real loc_heurs.(0).(0));
+ "((50. + (-50. * (((Sum (cell_x61_y61__blank_, cell_x60_y60__blank_, cell_x59_y59__blank_, cell_x58_y58__blank_, cell_x57_y57__blank_ | ((cell_x_y_o(cell_x61_y61__blank_) or cell_x_y_o(cell_x60_y60__blank_) or cell_x_y_o(cell_x59_y59__blank_) or cell_x_y_o(cell_x58_y58__blank_) or cell_x_y_o(cell_x57_y57__blank_)) and (cell_x_y_b(cell_x61_y61__blank_) or cell_x_y_o(cell_x61_y61__blank_)) and (cell_x_y_b(cell_x60_y60__blank_) or cell_x_y_o(cell_x60_y60__blank_)) and (cell_x_y_b(cell_x59_y59__blank_) or cell_x_y_o(cell_x59_y59__blank_)) and (cell_x_y_b(cell_x58_y58__blank_) or cell_x_y_o(cell_x58_y58__blank_)) and (cell_x_y_b(cell_x57_y57__blank_) or cell_x_y_o(cell_x57_y57__blank_)) and R2(cell_x61_y61__blank_, cell_x60_y60__blank_) and R2(cell_x60_y60__blank_, cell_x59_y59__blank_) and R2(cell_x59_y59__blank_, cell_x58_y58__blank_) and R2(cell_x58_y58__blank_, cell_x57_y57__blank_)) : ((((((:(cell_x_y_o(cell_x61_y61__blank_)) + :(cell_x_y_o(cell_x60_y60__blank_))) + :(cell_x_y_o(cell_x59_y59__blank_))) + :(cell_x_y_o(cell_x58_y58__blank_))) + :(cell_x_y_o(cell_x57_y57__blank_))) * (((((:(cell_x_y_o(cell_x61_y61__blank_)) + :(cell_x_y_o(cell_x60_y60__blank_))) + :(cell_x_y_o(cell_x59_y59__blank_))) + :(cell_x_y_o(cell_x58_y58__blank_))) + :(cell_x_y_o(cell_x57_y57__blank_))) * (((((:(cell_x_y_o(cell_x61_y61__blank_)) + :(cell_x_y_o(cell_x60_y60__blank_))) + :(cell_x_y_o(cell_x59_y59__blank_))) + :(cell_x_y_o(cell_x58_y58__blank_))) + :(cell_x_y_o(cell_x57_y57__blank_))) * ((((:(cell_x_y_o(cell_x61_y61__blank_)) + :(cell_x_y_o(cell_x60_y60__blank_))) + :(cell_x_y_o(cell_x59_y59__blank_))) + :(cell_x_y_o(cell_x58_y58__blank_))) + :(cell_x_y_o(cell_x57_y57__blank_)))))) * 0.0016)) + Sum (cell_x56_y56__blank_, cell_x55_y55__blank_, cell_x54_y54__blank_, cell_x53_y53__blank_, cell_x52_y52__blank_ | ((cell_x_y_o(cell_x56_y56__blank_) or cell_x_y_o(cell_x55_y55__blank_) or cell_x_y_o(cell_x54_y54__blank_) or cell_x_y_o(cell_x53_y53__blank_) or cell_x_y_o(cell_x52_y52__blank_)) and (cell_x_y_b(cell_x56_y56__blank_) or cell_x_y_o(cell_x56_y56__blank_)) and (cell_x_y_b(cell_x55_y55__blank_) or cell_x_y_o(cell_x55_y55__blank_)) and (cell_x_y_b(cell_x54_y54__blank_) or cell_x_y_o(cell_x54_y54__blank_)) and (cell_x_y_b(cell_x53_y53__blank_) or cell_x_y_o(cell_x53_y53__blank_)) and (cell_x_y_b(cell_x52_y52__blank_) or cell_x_y_o(cell_x52_y52__blank_)) and R1(cell_x56_y56__blank_, cell_x55_y55__blank_) and R1(cell_x55_y55__blank_, cell_x54_y54__blank_) and R1(cell_x54_y54__blank_, cell_x53_y53__blank_) and R1(cell_x53_y53__blank_, cell_x52_y52__blank_)) : ((((((:(cell_x_y_o(cell_x56_y56__blank_)) + :(cell_x_y_o(cell_x55_y55__blank_))) + :(cell_x_y_o(cell_x54_y54__blank_))) + :(cell_x_y_o(cell_x53_y53__blank_))) + :(cell_x_y_o(cell_x52_y52__blank_))) * (((((:(cell_x_y_o(cell_x56_y56__blank_)) + :(cell_x_y_o(cell_x55_y55__blank_))) + :(cell_x_y_o(cell_x54_y54__blank_))) + :(cell_x_y_o(cell_x53_y53__blank_))) + :(cell_x_y_o(cell_x52_y52__blank_))) * (((((:(cell_x_y_o(cell_x56_y56__blank_)) + :(cell_x_y_o(cell_x55_y55__blank_))) + :(cell_x_y_o(cell_x54_y54__blank_))) + :(cell_x_y_o(cell_x53_y53__blank_))) + :(cell_x_y_o(cell_x52_y52__blank_))) * ((((:(cell_x_y_o(cell_x56_y56__blank_)) + :(cell_x_y_o(cell_x55_y55__blank_))) + :(cell_x_y_o(cell_x54_y54__blank_))) + :(cell_x_y_o(cell_x53_y53__blank_))) + :(cell_x_y_o(cell_x52_y52__blank_)))))) * 0.0016))) + Sum (cell_e8_y51__blank_, cell_d8_y51__blank_, cell_c8_y51__blank_, cell_b8_y51__blank_, cell_a8_y51__blank_ | ((cell_x_y_o(cell_a8_y51__blank_) or cell_x_y_o(cell_b8_y51__blank_) or cell_x_y_o(cell_c8_y51__blank_) or cell_x_y_o(cell_d8_y51__blank_) or cell_x_y_o(cell_e8_y51__blank_)) and (cell_x_y_b(cell_a8_y51__blank_) or cell_x_y_o(cell_a8_y51__blank_)) and (cell_x_y_b(cell_b8_y51__blank_) or cell_x_y_o(cell_b8_y51__blank_)) and (cell_x_y_b(cell_c8_y51__blank_) or cell_x_y_o(cell_c8_y51__blank_)) and (cell_x_y_b(cell_d8_y51__blank_) or cell_x_y_o(cell_d8_y51__blank_)) and (cell_x_y_b(cell_e8_y51__blank_) or cell_x_y_o(cell_e8_y51__blank_)) and R0(cell_d8_y51__blank_, cell_e8_y51__blank_) and R0(cell_c8_y51__blank_, cell_d8_y51__blank_) and R0(cell_b8_y51__blank_, cell_c8_y51__blank_) and R0(cell_a8_y51__blank_, cell_b8_y51__blank_)) : ((((((:(cell_x_y_o(cell_a8_y51__blank_)) + :(cell_x_y_o(cell_b8_y51__blank_))) + :(cell_x_y_o(cell_c8_y51__blank_))) + :(cell_x_y_o(cell_d8_y51__blank_))) + :(cell_x_y_o(cell_e8_y51__blank_))) * (((((:(cell_x_y_o(cell_a8_y51__blank_)) + :(cell_x_y_o(cell_b8_y51__blank_))) + :(cell_x_y_o(cell_c8_y51__blank_))) + :(cell_x_y_o(cell_d8_y51__blank_))) + :(cell_x_y_o(cell_e8_y51__blank_))) * (((((:(cell_x_y_o(cell_a8_y51__blank_)) + :(cell_x_y_o(cell_b8_y51__blank_))) + :(cell_x_y_o(cell_c8_y51__blank_))) + :(cell_x_y_o(cell_d8_y51__blank_))) + :(cell_x_y_o(cell_e8_y51__blank_))) * ((((:(cell_x_y_o(cell_a8_y51__blank_)) + :(cell_x_y_o(cell_b8_y51__blank_))) + :(cell_x_y_o(cell_c8_y51__blank_))) + :(cell_x_y_o(cell_d8_y51__blank_))) + :(cell_x_y_o(cell_e8_y51__blank_)))))) * 0.0016))) + Sum (cell_x51_e7__blank_, cell_x51_d7__blank_, cell_x51_c7__blank_, cell_x51_b7__blank_, cell_x51_a7__blank_ | ((cell_x_y_o(cell_x51_a7__blank_) or cell_x_y_o(cell_x51_b7__blank_) or cell_x_y_o(cell_x51_c7__blank_) or cell_x_y_o(cell_x51_d7__blank_) or cell_x_y_o(cell_x51_e7__blank_)) and (cell_x_y_b(cell_x51_a7__blank_) or cell_x_y_o(cell_x51_a7__blank_)) and (cell_x_y_b(cell_x51_b7__blank_) or cell_x_y_o(cell_x51_b7__blank_)) and (cell_x_y_b(cell_x51_c7__blank_) or cell_x_y_o(cell_x51_c7__blank_)) and (cell_x_y_b(cell_x51_d7__blank_) or cell_x_y_o(cell_x51_d7__blank_)) and (cell_x_y_b(cell_x51_e7__blank_) or cell_x_y_o(cell_x51_e7__blank_)) and R(cell_x51_d7__blank_, cell_x51_e7__blank_) and R(cell_x51_c7__blank_, cell_x51_d7__blank_) and R(cell_x51_b7__blank_, cell_x51_c7__blan...
[truncated message content] |
|
From: <luk...@us...> - 2011-03-24 13:27:55
|
Revision: 1385
http://toss.svn.sourceforge.net/toss/?rev=1385&view=rev
Author: lukstafi
Date: 2011-03-24 13:27:48 +0000 (Thu, 24 Mar 2011)
Log Message:
-----------
GameSimpl: do not inverse-glue any relation with an equivalence relation (the latter is symmetric). Heuristic: looser (but more sensible) restrictions on expansion pattern-search-tree growth.
Modified Paths:
--------------
trunk/Toss/Formula/Aux.ml
trunk/Toss/Formula/Aux.mli
trunk/Toss/GGP/GameSimpl.ml
trunk/Toss/GGP/GameSimplTest.ml
trunk/Toss/GGP/tests/breakthrough-simpl.toss
trunk/Toss/Play/Heuristic.ml
trunk/Toss/Play/HeuristicTest.ml
Modified: trunk/Toss/Formula/Aux.ml
===================================================================
--- trunk/Toss/Formula/Aux.ml 2011-03-23 21:14:31 UTC (rev 1384)
+++ trunk/Toss/Formula/Aux.ml 2011-03-24 13:27:48 UTC (rev 1385)
@@ -239,6 +239,16 @@
| [] -> acc in
List.rev (aux [] l)
+let add_to_maximal cmp l1 l2 =
+ let rec aux acc = function
+ | hd::tl when
+ not (List.exists (fun x-> cmp hd x) acc) &&
+ not (List.exists (fun x-> cmp hd x) tl) ->
+ aux (hd::acc) tl
+ | hd::tl -> aux acc tl
+ | [] -> acc in
+ List.rev (aux (List.rev l2) l1)
+
(* Not tail-recursive. *)
let unique_sorted l =
let rec idemp = function
Modified: trunk/Toss/Formula/Aux.mli
===================================================================
--- trunk/Toss/Formula/Aux.mli 2011-03-23 21:14:31 UTC (rev 1384)
+++ trunk/Toss/Formula/Aux.mli 2011-03-24 13:27:48 UTC (rev 1385)
@@ -151,6 +151,10 @@
equal elements only the last one is preserved.) *)
val maximal : ('a -> 'a -> bool) -> 'a list -> 'a list
+(** Assuming that [l2] already has only maximal elements,
+ [add_to_maximal cmp l1 l2] computes [maximal cmp (l1 @ l2)]. *)
+val add_to_maximal : ('a -> 'a -> bool) -> 'a list -> 'a list -> 'a list
+
(** Return the list of structurally unique elements, in order sorted
by {!Pervasives.compare}. Not tail-recursive. *)
val unique_sorted : 'a list -> 'a list
Modified: trunk/Toss/GGP/GameSimpl.ml
===================================================================
--- trunk/Toss/GGP/GameSimpl.ml 2011-03-23 21:14:31 UTC (rev 1384)
+++ trunk/Toss/GGP/GameSimpl.ml 2011-03-24 13:27:48 UTC (rev 1385)
@@ -62,7 +62,10 @@
(3b) For binary static relations, collect pairs such that one
relation is applied to arguments in reverse order than the other
one, and introduce a new relation for intersection of one with the
- inverse of the other.
+ inverse of the other, but only if neither of them is an
+ equivalence relation beginning with "EQ__" -- in the latter case,
+ use a relation introduced in (3a) (introduce if not present), only
+ with arguments in order reverse to the order of non-EQ relation.
(3c) Filter out relations beginning with "EQ__" by: (3c1)
collecting equivalent elements in families of sets indexed by EQ
@@ -189,14 +192,14 @@
crel <> None || ntups <= nelems / 2
then crel
else
- (* 1a *)
+ (* 1a *)
let crel =
Aux.not_conflicting_name ~truncate:true !used_rels "C" in
- (* {{{ log entry *)
+ (* {{{ log entry *)
if !debug_level > 3 then (
Printf.printf "Complemented: crel=%s\n%!" crel
);
- (* }}} *)
+ (* }}} *)
complemented := (crel, rel) :: !complemented;
struc := Structure.add_rels !struc crel
(Tups.elements (Tups.diff predicate_tups rel_tups));
@@ -471,23 +474,24 @@
let is_equiv rel =
String.length rel >= 4 && String.sub rel 0 4 = "EQ__" in
(* 3a *)
+ let glue_rels_args rels args =
+ let rels = List.sort String.compare rels in
+ (let try grel = Aux.rev_assoc !glued rels in
+ grel, args
+ with Not_found ->
+ let grel =
+ Aux.not_conflicting_name ~truncate:true !used_rels "R" in
+ used_rels := Aux.Strings.add grel !used_rels;
+ glued := (grel, rels) :: !glued;
+ struc := intersect_rels !struc grel rels;
+ signat := (grel, Array.length args) :: !signat;
+ grel, args) in
let glue rels =
let args_keys =
Aux.collect (List.map (fun (rel,args)->args,rel) rels) in
List.map (function
| args, [rel] -> rel, args
- | args, rels ->
- let rels = List.sort String.compare rels in
- (let try grel = Aux.rev_assoc !glued rels in
- grel, args
- with Not_found ->
- let grel =
- Aux.not_conflicting_name ~truncate:true !used_rels "R" in
- used_rels := Aux.Strings.add grel !used_rels;
- glued := (grel, rels) :: !glued;
- struc := intersect_rels !struc grel rels;
- signat := (grel, Array.length args) :: !signat;
- grel, args)
+ | args, rels -> glue_rels_args rels args
) args_keys in
(* 3b *)
let glue_inv rels =
@@ -500,22 +504,30 @@
if List.mem_assoc args2 more
then
let rel2, more = Aux.pop_assoc args2 more in
- let rels =
- if rel1 < rel2 then rel1, rel2 else rel2, rel1 in
- let rel, args, inv_rel, inv_args =
- if rel1 == fst rels
- then rel1, args1, rel2, args2
- else rel2, args2, rel1, args1 in
- (let try grel = Aux.rev_assoc !glued_inv rels in
- (grel, args)::loop more
- with Not_found ->
- let grel =
- Aux.not_conflicting_name ~truncate:true !used_rels "R" in
- used_rels := Aux.Strings.add grel !used_rels;
- glued_inv := (grel, rels) :: !glued_inv;
- struc := intersect_with_inv !struc grel rel inv_rel;
- signat := (grel, Array.length args) :: !signat;
- (grel, args)::loop more)
+ if is_equiv rel1 || is_equiv rel2 then
+ let args, inv_args =
+ if is_equiv rel1 then args1, args2
+ else args2, args1 in
+ let rels = [rel1; rel2] in
+ let result = glue_rels_args rels inv_args in
+ result::loop more
+ else
+ let rels =
+ if rel1 < rel2 then rel1, rel2 else rel2, rel1 in
+ let rel, args, inv_rel, inv_args =
+ if rel1 == fst rels
+ then rel1, args1, rel2, args2
+ else rel2, args2, rel1, args1 in
+ (let try grel = Aux.rev_assoc !glued_inv rels in
+ (grel, args)::loop more
+ with Not_found ->
+ let grel =
+ Aux.not_conflicting_name ~truncate:true !used_rels "R" in
+ used_rels := Aux.Strings.add grel !used_rels;
+ glued_inv := (grel, rels) :: !glued_inv;
+ struc := intersect_with_inv !struc grel rel inv_rel;
+ signat := (grel, Array.length args) :: !signat;
+ (grel, args)::loop more)
else (rel1, args1)::loop more
| (args, rel)::rels -> (rel, args)::loop rels
| [] -> [] in
@@ -644,15 +656,27 @@
if List.mem_assoc args2 more
then
let rel2, more = Aux.pop_assoc args2 more in
- let rels =
- if rel1 < rel2 then rel1, rel2 else rel2, rel1 in
- let rel, args, inv_rel, inv_args =
- if rel1 == fst rels
- then rel1, args1, rel2, args2
- else rel2, args2, rel1, args1 in
- (let try grel = Aux.rev_assoc !glued_inv rels in
- (grel, rels, args, inv_args)::loop more
- with Not_found -> assert false)
+ if is_equiv rel1 || is_equiv rel2 then
+ let eq_rel, eq_args, inv_rel, inv_args =
+ if is_equiv rel1 then rel1, args1, rel2, args2
+ else rel2, args2, rel1, args1 in
+ let rels = [rel1; rel2] in
+ let rels = List.sort String.compare rels in
+ (* pretend the equivalence is the inverted one *)
+ let result =
+ Aux.rev_assoc !glued rels,
+ (inv_rel, eq_rel), inv_args, eq_args in
+ result::loop more
+ else
+ let rels =
+ if rel1 < rel2 then rel1, rel2 else rel2, rel1 in
+ let rel, args, inv_rel, inv_args =
+ if rel1 == fst rels
+ then rel1, args1, rel2, args2
+ else rel2, args2, rel1, args1 in
+ (let try grel = Aux.rev_assoc !glued_inv rels in
+ (grel, rels, args, inv_args)::loop more
+ with Not_found -> assert false)
else loop more
| _::rels -> loop rels
| [] -> [] in
Modified: trunk/Toss/GGP/GameSimplTest.ml
===================================================================
--- trunk/Toss/GGP/GameSimplTest.ml 2011-03-23 21:14:31 UTC (rev 1384)
+++ trunk/Toss/GGP/GameSimplTest.ml 2011-03-24 13:27:48 UTC (rev 1385)
@@ -62,7 +62,7 @@
(* The action below is used to regenerate the test targets when
{!GameSimpl.simplify} changes. *)
let a () =
- let game_name = "connect5" in
+ let game_name = (* "breakthrough" *) (* "connect5" *) "tictactoe" in
let game = state_of_file ("./GGP/tests/"^game_name^"-raw.toss") in
Printf.printf "\nINPUT:\n%s\n%!" (Arena.state_str game);
Modified: trunk/Toss/GGP/tests/breakthrough-simpl.toss
===================================================================
--- trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-23 21:14:31 UTC (rev 1384)
+++ trunk/Toss/GGP/tests/breakthrough-simpl.toss 2011-03-24 13:27:48 UTC (rev 1385)
@@ -4,8 +4,6 @@
EQ___cellholds_x2_y2_MV1_x2__AND__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2,
R0:
succ__cellholds_x2_y2_MV1_x2__cellholds_x2_y2_MV1_x2__AND__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2,
- R2:
- EQ___cellholds_x2_y2_MV1_x2__AND_INV__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2,
R:
succ__cellholds_x2_y2_MV1_x2__cellholds_x2_y2_MV1_x2__AND_INV__succ__cellholds_x2_y2_MV1_y2__cellholds_x2_y2_MV1_y2
RULE move_x1_y1_x2_y2_0:
@@ -189,7 +187,7 @@
not control_MV1(cellholds_x377_y369__blank_)))
RULE move_x_y1_x_y2_1:
[cellholds_x_y1__blank_, cellholds_x_y2__blank_, control__blank_ |
- R2 (cellholds_x_y1__blank_, cellholds_x_y2__blank_);
+ R1 (cellholds_x_y2__blank_, cellholds_x_y1__blank_);
_opt_cellholds_x2_y2_black (control__blank_);
_opt_cellholds_x2_y2_white {cellholds_x_y1__blank_; control__blank_};
_opt_control_black {cellholds_x_y1__blank_; cellholds_x_y2__blank_};
@@ -467,64 +465,6 @@
(cellholds_1_2_MV1, cellholds_1_3_MV1);
(cellholds_1_1_MV1, cellholds_1_2_MV1)
};
- R2 {
- (cellholds_8_8_MV1, cellholds_8_7_MV1);
- (cellholds_8_7_MV1, cellholds_8_6_MV1);
- (cellholds_8_6_MV1, cellholds_8_5_MV1);
- (cellholds_8_5_MV1, cellholds_8_4_MV1);
- (cellholds_8_4_MV1, cellholds_8_3_MV1);
- (cellholds_8_3_MV1, cellholds_8_2_MV1);
- (cellholds_8_2_MV1, cellholds_8_1_MV1);
- (cellholds_7_8_MV1, cellholds_7_7_MV1);
- (cellholds_7_7_MV1, cellholds_7_6_MV1);
- (cellholds_7_6_MV1, cellholds_7_5_MV1);
- (cellholds_7_5_MV1, cellholds_7_4_MV1);
- (cellholds_7_4_MV1, cellholds_7_3_MV1);
- (cellholds_7_3_MV1, cellholds_7_2_MV1);
- (cellholds_7_2_MV1, cellholds_7_1_MV1);
- (cellholds_6_8_MV1, cellholds_6_7_MV1);
- (cellholds_6_7_MV1, cellholds_6_6_MV1);
- (cellholds_6_6_MV1, cellholds_6_5_MV1);
- (cellholds_6_5_MV1, cellholds_6_4_MV1);
- (cellholds_6_4_MV1, cellholds_6_3_MV1);
- (cellholds_6_3_MV1, cellholds_6_2_MV1);
- (cellholds_6_2_MV1, cellholds_6_1_MV1);
- (cellholds_5_8_MV1, cellholds_5_7_MV1);
- (cellholds_5_7_MV1, cellholds_5_6_MV1);
- (cellholds_5_6_MV1, cellholds_5_5_MV1);
- (cellholds_5_5_MV1, cellholds_5_4_MV1);
- (cellholds_5_4_MV1, cellholds_5_3_MV1);
- (cellholds_5_3_MV1, cellholds_5_2_MV1);
- (cellholds_5_2_MV1, cellholds_5_1_MV1);
- (cellholds_4_8_MV1, cellholds_4_7_MV1);
- (cellholds_4_7_MV1, cellholds_4_6_MV1);
- (cellholds_4_6_MV1, cellholds_4_5_MV1);
- (cellholds_4_5_MV1, cellholds_4_4_MV1);
- (cellholds_4_4_MV1, cellholds_4_3_MV1);
- (cellholds_4_3_MV1, cellholds_4_2_MV1);
- (cellholds_4_2_MV1, cellholds_4_1_MV1);
- (cellholds_3_8_MV1, cellholds_3_7_MV1);
- (cellholds_3_7_MV1, cellholds_3_6_MV1);
- (cellholds_3_6_MV1, cellholds_3_5_MV1);
- (cellholds_3_5_MV1, cellholds_3_4_MV1);
- (cellholds_3_4_MV1, cellholds_3_3_MV1);
- (cellholds_3_3_MV1, cellholds_3_2_MV1);
- (cellholds_3_2_MV1, cellholds_3_1_MV1);
- (cellholds_2_8_MV1, cellholds_2_7_MV1);
- (cellholds_2_7_MV1, cellholds_2_6_MV1);
- (cellholds_2_6_MV1, cellholds_2_5_MV1);
- (cellholds_2_5_MV1, cellholds_2_4_MV1);
- (cellholds_2_4_MV1, cellholds_2_3_MV1);
- (cellholds_2_3_MV1, cellholds_2_2_MV1);
- (cellholds_2_2_MV1, cellholds_2_1_MV1);
- (cellholds_1_8_MV1, cellholds_1_7_MV1);
- (cellholds_1_7_MV1, cellholds_1_6_MV1);
- (cellholds_1_6_MV1, cellholds_1_5_MV1);
- (cellholds_1_5_MV1, cellholds_1_4_MV1);
- (cellholds_1_4_MV1, cellholds_1_3_MV1);
- (cellholds_1_3_MV1, cellholds_1_2_MV1);
- (cellholds_1_2_MV1, cellholds_1_1_MV1)
- };
cellholds_1_y2_MV1 {
cellholds_1_8_MV1; cellholds_1_7_MV1; cellholds_1_6_MV1;
cellholds_1_5_MV1; cellholds_1_4_MV1; cellholds_1_3_MV1;
Modified: trunk/Toss/Play/Heuristic.ml
===================================================================
--- trunk/Toss/Play/Heuristic.ml 2011-03-23 21:14:31 UTC (rev 1384)
+++ trunk/Toss/Play/Heuristic.ml 2011-03-24 13:27:48 UTC (rev 1385)
@@ -244,7 +244,6 @@
conjunctions whose sets of variable instantiations is a subset of
some other.
- TODO: perhaps the costly filtering above can be made online?
*)
open Formula
open Aux
@@ -386,6 +385,9 @@
let expanded_descr max_alt_descr elems rels struc
all_vars xvars xsubsts =
+ (* for doing (m) online *)
+ let cmp_insts (_,_,insts1) (_,_,insts2) =
+ List.for_all (fun sb->List.mem sb insts2) insts1 in
let alt_descr = ref 0 in
let max_arity =
find_max (-) (List.map (fun (_,tups) ->
@@ -399,21 +401,21 @@
let partition_substs substs =
let rec aux_x acc = function
| TrieLeaf sbs, [] ->
- TrieLeaf (List.rev acc::sbs)
+ TrieLeaf (List.rev acc::sbs)
| TrieNode map, ((_, e as xe)::sb as xesb) ->
- (try
- let trie =
- aux_x (xe::acc) (List.assoc e map, sb) in
- TrieNode (replace_assoc e trie map)
- with Not_found ->
- raise (Outside_subst (List.rev_append acc xesb)))
+ (try
+ let trie =
+ aux_x (xe::acc) (List.assoc e map, sb) in
+ TrieNode (replace_assoc e trie map)
+ with Not_found ->
+ raise (Outside_subst (List.rev_append acc xesb)))
| trie, sb -> assert false in
let rec aux_y acc (trie, outside as res) = function
| [] -> assert false
| (x, _):: _ as sb when x = vx ->
- (try
- aux_x acc (trie, sb), outside
- with Outside_subst sb -> trie, sb::outside)
+ (try
+ aux_x acc (trie, sb), outside
+ with Outside_subst sb -> trie, sb::outside)
| ye::sb -> aux_y (ye::acc) res sb in
let trie, outside =
List.fold_left (aux_y []) (xsubsts_trie, []) substs in
@@ -505,10 +507,10 @@
match res with
| [] -> assert false
| hd::tl ->
- (* e *)
- let res =
- List.fold_left VarTups.inter hd tl in
- rel, res
+ (* e *)
+ let res =
+ List.fold_left VarTups.inter hd tl in
+ rel, res
) rels in
(* f *)
let new_atoms = concat_map (fun (rel, tups) ->
@@ -524,7 +526,7 @@
(* g *)
let assgns = Solver.M.evaluate_partial struc path_assgns atom in
let _ = if !debug_level > 3 then (printf "yxvars=%s\n"
- (String.concat ", "(List.map var_str yxvars)); flush stdout) in
+ (String.concat ", "(List.map var_str yxvars)); flush stdout) in
let substs = AssignmentSet.fo_assgn_to_list elems yxvars assgns in
(* sort substitutions while checking for (i) *)
let substs, repeating_inst, vs_insts =
@@ -555,41 +557,55 @@
printf "node-ret-2: %s\n" (Formula.str atom); flush stdout) in
Some (Left (yvars, atom::path_atoms, vs_insts))
end else if outside_count > 0 (* only the initial call has 0 *)
- && new_outside_count >= outside_count
+ && new_outside_count >= outside_count
(* h *)
- then
- let _ = if !debug_level > 3 then (printf "node-ret-3\n"; flush stdout) in
- None
- else
- let _ = if !debug_level > 3 then (
- printf "node-ret-4: %s\n" (Formula.str atom); flush stdout) in
- Some (Right (atom, assgns, new_inside, new_outside_count))
+ then
+ let _ = if !debug_level > 3 then (printf "node-ret-3\n"; flush stdout) in
+ None
+ else
+ let _ = if !debug_level > 3 then (
+ printf "node-ret-4: %s\n" (Formula.str atom); flush stdout) in
+ Some (Right (atom, assgns, new_inside, new_outside_count))
) new_atoms in
let viable_leafs, new_subnodes =
partition_choice new_substs in
+ (* {{{ log entry *)
+ if !debug_level > 3 then (
+ Printf.printf
+ "node(path=%s): # of viable leafs=%d, # of new subnodes=%d\n%!"
+ (Formula.str (And path_atoms))
+ (List.length viable_leafs) (List.length new_subnodes)
+ );
+ (* }}} *)
(* i *)
let viable_leafs, avoid_atoms =
List.fold_left (
fun (viable_leafs, avoid_atoms)
(atom, path_assgns, inside_yxsubsts, outside_count) ->
+ let viable_num = List.length viable_leafs in
+ (* {{{ log entry *)
if !debug_level > 3 then (
- printf "subnode-atom: %s inside #=%d outside #=%d\n"
+ printf "subnode-atom: %s inside #=%d outside #=%d\
+ viables #=%d skipping=%b\n%!"
(Formula.str atom) (List.length inside_yxsubsts)
- outside_count;
- flush stdout);
+ outside_count viable_num (viable_num > max_alt_descr);
+ );
+ (* }}} *)
let avoid_atoms = atom::avoid_atoms in
- let viable_leafs =
- (if !alt_descr < max_alt_descr then
- node ~more_vars:(max_arity - 1)
- ~path_atoms:(atom::path_atoms) ~path_assgns
- ~avoid_atoms ~new_yvars
- ~yvars ~yxvars
- ~all_vars ~inside_yxsubsts ~outside_count
- else [])
- @ viable_leafs in
- viable_leafs, avoid_atoms
+ if viable_num > max_alt_descr
+ then viable_leafs, avoid_atoms
+ else
+ let viable_leafs =
+ add_to_maximal cmp_insts
+ (node ~more_vars:(max_arity - 1)
+ ~path_atoms:(atom::path_atoms) ~path_assgns
+ ~avoid_atoms ~new_yvars
+ ~yvars ~yxvars
+ ~all_vars ~inside_yxsubsts ~outside_count)
+ viable_leafs in
+ viable_leafs, avoid_atoms
) (viable_leafs, avoid_atoms) new_subnodes in
- if more_vars <= 0 || !alt_descr >= max_alt_descr
+ if more_vars <= 0 || List.length viable_leafs > max_alt_descr
then viable_leafs
else
(* j *)
@@ -598,22 +614,20 @@
let new_yvars =
if more_vars = max_arity - 1 then [nvar]
else nvar::new_yvars in
- node ~more_vars:(more_vars - 1) ~path_atoms ~path_assgns
- ~avoid_atoms
- ~new_yvars ~yvars:(nvar::yvars)
- ~yxvars:(nvar::yxvars) ~all_vars:(Strings.add nvar_name all_vars)
- ~inside_yxsubsts ~outside_count
- @ viable_leafs in
+ add_to_maximal cmp_insts
+ (node ~more_vars:(more_vars - 1) ~path_atoms ~path_assgns
+ ~avoid_atoms
+ ~new_yvars ~yvars:(nvar::yvars)
+ ~yxvars:(nvar::yxvars) ~all_vars:(Strings.add nvar_name all_vars)
+ ~inside_yxsubsts ~outside_count)
+ viable_leafs in
let viable_leafs =
node ~more_vars:(max_arity - 1) ~new_yvars:[] ~yvars:[]
~path_atoms:[] ~path_assgns:Any ~avoid_atoms:[]
~yxvars:xvars ~all_vars
~inside_yxsubsts:(List.map (fun sb->[sb]) xsubsts)
~outside_count:0 in
- (* m *)
- let viable_leafs = maximal
- (fun (_,_,insts1) (_,_,insts2) ->
- List.for_all (fun sb->List.mem sb insts2) insts1) viable_leafs in
+ let viable_leafs = maximal cmp_insts viable_leafs in
let disjuncts =
List.map (fun (yvars, atoms, vs_insts) ->
if yvars = [] then And atoms
Modified: trunk/Toss/Play/HeuristicTest.ml
===================================================================
--- trunk/Toss/Play/HeuristicTest.ml 2011-03-23 21:14:31 UTC (rev 1384)
+++ trunk/Toss/Play/HeuristicTest.ml 2011-03-24 13:27:48 UTC (rev 1385)
@@ -347,7 +347,7 @@
Heuristic.default_heuristic_old ~struc:state.Arena.struc
~advr:2.0 game in
assert_equal ~printer:(fun x->x)
- "(100. * ((0.96875 + (1.9375 * :((not ex cellholds_x27_y26__blank_ ((cellholds_x2_y2_black(cellholds_x27_y26__blank_) and (not control_MV1(cellholds_x27_y26__blank_)))))))) + Sum (cellholds_x26_8__blank_ | (cellholds_x2_y2_white(cellholds_x26_8__blank_) and (not control_MV1(cellholds_x26_8__blank_))) : (0.0625 + Sum (y | R2(cellholds_x26_8__blank_, y) : (0.125 + Sum (y0 | R2(y, y0) : (0.25 + Sum (y1 | R2(y0, y1) : (0.5 + Sum (y2 | (R2(y1, y2) and cellholds_x2_4_MV1(y2)) : 1.)))))))))))"
+ "(100. * ((0.99609375 + (1.9921875 * :((not ex cellholds_x27_y26__blank_ ((cellholds_x2_y2_black(cellholds_x27_y26__blank_) and (not control_MV1(cellholds_x27_y26__blank_)))))))) + Sum (cellholds_x26_8__blank_ | (cellholds_x2_y2_white(cellholds_x26_8__blank_) and (not control_MV1(cellholds_x26_8__blank_))) : (0.0078125 + Sum (y | R1(y, cellholds_x26_8__blank_) : (0.015625 + Sum (y0 | R1(y0, y) : (0.03125 + Sum (y1 | R1(y1, y0) : (0.0625 + Sum (y2 | R1(y2, y1) : (0.125 + Sum (y3 | R1(y3, y2) : (0.25 + Sum (y4 | R1(y4, y3) : (0.5 + Sum (y5 | R1(y5, y4) : 1.)))))))))))))))))"
(Formula.real_str loc_heurs.(0).(0));
);
@@ -473,10 +473,10 @@
let a () =
DiscreteRule.debug_level := 4;
- Heuristic.debug_level := 3
+ Heuristic.debug_level := 4
let a () =
- match test_filter ["Heuristic:11:default_heuristic_old: connect5 of GDL translation"]
+ match test_filter ["Heuristic:12:default_heuristic_old: expansion breakthrough of GDL translation"]
tests
with
| Some tests -> ignore (run_test_tt ~verbose:true tests)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-24 16:08:10
|
Revision: 1386
http://toss.svn.sourceforge.net/toss/?rev=1386&view=rev
Author: lukstafi
Date: 2011-03-24 16:08:04 +0000 (Thu, 24 Mar 2011)
Log Message:
-----------
Diagnostic display of cardinality of graphs of all relations in GDL translation result.
Modified Paths:
--------------
trunk/Toss/GGP/GDL.ml
trunk/Toss/Solver/Structure.ml
trunk/Toss/Solver/Structure.mli
Modified: trunk/Toss/GGP/GDL.ml
===================================================================
--- trunk/Toss/GGP/GDL.ml 2011-03-24 13:27:48 UTC (rev 1385)
+++ trunk/Toss/GGP/GDL.ml 2011-03-24 16:08:04 UTC (rev 1386)
@@ -3491,13 +3491,19 @@
| Some ([_; lead_term], _, _) -> Some lead_term
| _ -> None
) loc_noop_legal in
- (* {{{ log entry *)
+ (* {{{ log entry *)
(match !generate_test_case with
| None -> ()
| Some game_name ->
let file = open_out ("./GGP/tests/"^game_name^"-simpl.toss") in
output_string file (Arena.state_str result);
close_out file);
+ if !debug_level > -1 then (
+ Printf.printf "\n\nGDL.translate_game: simplified rel sizes --\n%s\n%!"
+ (String.concat ", "(List.map (fun (rel,ar) ->
+ rel^":"^string_of_int ar) (Structure.rel_sizes
+ (snd result).Arena.struc)))
+ );
if !debug_level > 1 then (
Printf.printf "\n\nGDL.translate_game: after simplification --\n%s\n%!"
(Arena.sprint_state result)
Modified: trunk/Toss/Solver/Structure.ml
===================================================================
--- trunk/Toss/Solver/Structure.ml 2011-03-24 13:27:48 UTC (rev 1385)
+++ trunk/Toss/Solver/Structure.ml 2011-03-24 16:08:04 UTC (rev 1386)
@@ -80,7 +80,11 @@
StringMap.fold (fun r ar si -> (r,ar)::si)
struc.rel_signature []
+let rel_sizes struc =
+ StringMap.fold (fun r tups si -> (r,Tuples.cardinal tups)::si)
+ struc.relations []
+
(* Return the list of relation tuples incident to an element [e] in [struc]. *)
let incident struc e =
let acc_incident rname inc_map acc =
Modified: trunk/Toss/Solver/Structure.mli
===================================================================
--- trunk/Toss/Solver/Structure.mli 2011-03-24 13:27:48 UTC (rev 1385)
+++ trunk/Toss/Solver/Structure.mli 2011-03-24 16:08:04 UTC (rev 1386)
@@ -61,6 +61,9 @@
val rel_signature : structure -> (string * int) list
+(** Cardinality of graphs of all relations in the structure. *)
+val rel_sizes : structure -> (string * int) list
+
(** {2 Printing structures} *)
(** Print the elements [e] as string. *)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-24 18:05:56
|
Revision: 1387
http://toss.svn.sourceforge.net/toss/?rev=1387&view=rev
Author: lukaszkaiser
Date: 2011-03-24 18:05:50 +0000 (Thu, 24 Mar 2011)
Log Message:
-----------
Size-based predicate ordering in formula compilation.
Modified Paths:
--------------
trunk/Toss/Formula/FormulaOps.ml
trunk/Toss/Formula/FormulaOps.mli
trunk/Toss/Makefile
trunk/Toss/Solver/Solver.ml
trunk/Toss/Solver/SolverTest.ml
trunk/Toss/Solver/Structure.ml
trunk/Toss/Solver/Structure.mli
Modified: trunk/Toss/Formula/FormulaOps.ml
===================================================================
--- trunk/Toss/Formula/FormulaOps.ml 2011-03-24 16:08:04 UTC (rev 1386)
+++ trunk/Toss/Formula/FormulaOps.ml 2011-03-24 18:05:50 UTC (rev 1387)
@@ -1307,9 +1307,9 @@
let is_fo = function `FO _ -> true | _ -> false in
List.filter is_fo (free_vars f)
-let rec order_by_fv acc_fv = function
+let rec order_by_fv structure acc_fv = function
| [] -> []
- | [f] -> [order_by_fv_phi acc_fv f]
+ | [f] -> [order_by_fv_phi structure acc_fv f]
| l ->
let cross x =
let fv = free_vars x in
@@ -1317,27 +1317,36 @@
let (cf, o) = List.partition cross l in
if cf = [] then (
let new_fv = free_vars (List.hd l) in
- order_by_fv new_fv l
+ order_by_fv structure new_fv l
) else (
let new_fv = acc_fv @ (free_vars_fo (And cf)) in
- (List.map (order_by_fv_phi acc_fv) cf) @ (order_by_fv new_fv o)
+ (List.map (order_by_fv_phi structure acc_fv) cf) @
+ (order_by_fv structure new_fv o)
)
-and order_by_fv_phi acc_fv = function
+and order_by_fv_phi structure acc_fv = function
| And fl ->
let is_pred = function Rel (_, [|_|]) -> true | _ -> false in
- let (p, np) = List.partition is_pred fl in
- let res = And (order_by_fv acc_fv (p @ np)) in
+ let (p_raw, np) = List.partition is_pred fl in
+ let p = match structure with | None -> p_raw | Some struc ->
+ let card = function | Rel (r,_) -> Structure.rel_size struc r | _-> 0 in
+ let cmp x y = (card x) - (card y) in
+ List.sort cmp p_raw in
+ let res = And (order_by_fv structure acc_fv (p @ np)) in
if !debug_level > 1 then print_endline ("fvordered and: " ^ (str res));
res
| Or fl ->
let is_pred = function Rel (_, [|_|]) -> true | _ -> false in
- let (p, np) = List.partition is_pred fl in
- let res = Or (order_by_fv acc_fv (p @ np)) in
+ let (p_raw, np) = List.partition is_pred fl in
+ let p = match structure with | None -> p_raw | Some struc ->
+ let card = function | Rel (r,_) -> Structure.rel_size struc r | _-> 0 in
+ let cmp x y = (card x) - (card y) in
+ List.sort cmp p_raw in
+ let res = Or (order_by_fv structure acc_fv (p @ np)) in
if !debug_level > 1 then print_endline ("fvordered or: " ^ (str res));
res
- | Ex (vs, phi) -> Ex (vs, order_by_fv_phi acc_fv phi)
- | All (vs, phi) -> All (vs, order_by_fv_phi acc_fv phi)
+ | Ex (vs, phi) -> Ex (vs, order_by_fv_phi structure acc_fv phi)
+ | All (vs, phi) -> All (vs, order_by_fv_phi structure acc_fv phi)
| f -> f
let rec push_in_quant phi =
@@ -1364,12 +1373,12 @@
let rec push_quant f = push_in_quant (flatten_sort (f))
-let tnf_fv phi =
+let tnf_fv ?structure phi =
let fv = free_vars phi in
let psi = rename_quant_avoiding [] (Ex (fv, phi)) in
match mso_last (flatten (del_vars_quant fv (tnf psi))) with
- | Or fl -> Or (List.map (order_by_fv_phi []) fl)
- | f -> order_by_fv_phi [] f
+ | Or fl -> Or (List.map (order_by_fv_phi structure []) fl)
+ | f -> order_by_fv_phi structure [] f
(* Assign emptyset to the MSO-variable v by replacing "x in X" with "false". *)
let assign_emptyset v phi =
Modified: trunk/Toss/Formula/FormulaOps.mli
===================================================================
--- trunk/Toss/Formula/FormulaOps.mli 2011-03-24 16:08:04 UTC (rev 1386)
+++ trunk/Toss/Formula/FormulaOps.mli 2011-03-24 18:05:50 UTC (rev 1387)
@@ -187,7 +187,8 @@
in a NNF form which pushes quantifiers inside as strongly as possible. *)
val tnf : formula -> formula
val tnf_re : real_expr -> real_expr
-val tnf_fv : formula -> formula (** first existentially quantifies free vars *)
+val tnf_fv : ?structure : Structure.structure ->
+ formula -> formula (** first existentially quantifies free vars *)
(** {2 Convert to CNF or DNF} *)
Modified: trunk/Toss/Makefile
===================================================================
--- trunk/Toss/Makefile 2011-03-24 16:08:04 UTC (rev 1386)
+++ trunk/Toss/Makefile 2011-03-24 18:05:50 UTC (rev 1387)
@@ -57,8 +57,8 @@
OCAMLBUILDNOPP=ocamlbuild -log build.log -j 8 -menhir ../menhir_conf \
$(OCB_LIB) $(OCB_CFLAG) $(OCB_LFLAG)
-FormulaINC=Formula/Sat
-SolverINC=Formula,Formula/Sat,Solver/RealQuantElim
+FormulaINC=Formula/Sat,Formula,Solver
+SolverINC=Formula,Solver,Formula/Sat,Solver/RealQuantElim
ArenaINC=Formula,Formula/Sat,Solver/RealQuantElim,Solver
PlayINC=Formula,Formula/Sat,Solver/RealQuantElim,Solver,Arena
GGPINC=Formula,Formula/Sat,Solver/RealQuantElim,Solver,Arena,Play
Modified: trunk/Toss/Solver/Solver.ml
===================================================================
--- trunk/Toss/Solver/Solver.ml 2011-03-24 16:08:04 UTC (rev 1386)
+++ trunk/Toss/Solver/Solver.ml 2011-03-24 18:05:50 UTC (rev 1387)
@@ -39,7 +39,7 @@
formulas_check = Hashtbl.create 3 ;
}
-let register_formula_do solver phi =
+let register_formula_do struc solver phi =
let rec check_form = function
Ex (vs, phi) -> check_form phi
| phi -> phi in
@@ -49,7 +49,7 @@
(Hashtbl.find solver.formulas_eval res, res)
with Not_found ->
if !debug_level > 0 then print_endline ("Entered " ^ (str phi));
- let psi = FormulaOps.tnf_fv phi in
+ let psi = FormulaOps.tnf_fv ~structure:struc phi in
if !debug_level > 0 then print_endline ("Registering " ^ (str psi));
let id = Hashtbl.length solver.formulas_eval + 1 in
Hashtbl.add solver.reg_formulas phi id;
@@ -57,7 +57,7 @@
Hashtbl.add solver.formulas_check id (check_form psi);
(psi, id)
-let register_formula_s solver phi =
+let register_formula_s struc solver phi =
try
let res = Hashtbl.find solver.reg_formulas phi in
if !debug_level > 0 then print_endline ("DirectFound " ^ (str phi));
@@ -65,14 +65,15 @@
with Not_found ->
match Formula.flatten phi with
| And fl ->
- let rfl = List.map (fun f -> fst (register_formula_do solver f)) fl in
+ let rfl = List.map (fun f ->
+ fst (register_formula_do struc solver f)) fl in
let id = Hashtbl.length solver.formulas_eval + 1 in
let psi = Formula.flatten (Or (FormulaOps.to_dnf (And rfl))) in
Hashtbl.add solver.reg_formulas phi id;
Hashtbl.add solver.formulas_eval id psi;
Hashtbl.add solver.formulas_check id psi;
id
- | _ -> let (_, id) = register_formula_do solver phi in id
+ | _ -> let (_, id) = register_formula_do struc solver phi in id
let get_formula solver i = Hashtbl.find solver.formulas_eval i
@@ -357,7 +358,8 @@
let phi_id = Hashtbl.find solver.reg_formulas phi in
Hashtbl.find solver.formulas_eval phi_id
with Not_found ->
- Hashtbl.find solver.formulas_eval (snd(register_formula_do solver phi)) in
+ Hashtbl.find solver.formulas_eval
+ (snd(register_formula_do struc solver phi)) in
let eval_no_fv phi =
if FormulaOps.free_vars phi = [] then (
if !debug_level > 1 then
@@ -472,14 +474,14 @@
let solver = new_solver ()
let evaluate struc phi =
- evaluate solver ~formula:(register_formula_s solver phi) struc
+ evaluate solver ~formula:(register_formula_s struc solver phi) struc
let evaluate_real = evaluate_real
let evaluate_partial struc intpr phi =
- evaluate_partial_aset solver ~formula:(register_formula_s solver phi)
+ evaluate_partial_aset solver ~formula:(register_formula_s struc solver phi)
struc intpr
let check struc phi =
- check solver ~formula:(register_formula_s solver phi) struc
+ check solver ~formula:(register_formula_s struc solver phi) struc
let get_real_val re struc = get_real_val_cache solver struc re
let formula_str phi =
(* let phi = Hashtbl.find solver.formulas_check phi in *)
Modified: trunk/Toss/Solver/SolverTest.ml
===================================================================
--- trunk/Toss/Solver/SolverTest.ml 2011-03-24 16:08:04 UTC (rev 1386)
+++ trunk/Toss/Solver/SolverTest.ml 2011-03-24 18:05:50 UTC (rev 1387)
@@ -259,7 +259,7 @@
] ;;
-let a () =
+let a =
match test_filter [""] tests with
| Some tests -> Aux.run_test_if_target "SolverTest" tests
| None -> ()
Modified: trunk/Toss/Solver/Structure.ml
===================================================================
--- trunk/Toss/Solver/Structure.ml 2011-03-24 16:08:04 UTC (rev 1386)
+++ trunk/Toss/Solver/Structure.ml 2011-03-24 18:05:50 UTC (rev 1387)
@@ -57,6 +57,12 @@
(* ----------------------- BASIC HELPER FUNCTIONS --------------------------- *)
+(* Number of tuples in a relation. *)
+let rel_size struc rel =
+ try
+ Tuples.cardinal (StringMap.find rel struc.relations)
+ with Not_found -> 0
+
(* Reverse a map: make a string IntMap from an int StringMap. *)
let rev_string_to_int_map map =
StringMap.fold (fun n e m -> IntMap.add e n m) map IntMap.empty
Modified: trunk/Toss/Solver/Structure.mli
===================================================================
--- trunk/Toss/Solver/Structure.mli 2011-03-24 16:08:04 UTC (rev 1386)
+++ trunk/Toss/Solver/Structure.mli 2011-03-24 18:05:50 UTC (rev 1387)
@@ -34,6 +34,8 @@
(** {2 Basic helper functions} *)
+(** Size of a relation, i.e. number of tuples in it. *)
+val rel_size : structure -> string -> int
(** Reverse a map: make a string IntMap from an int StringMap. *)
val rev_string_to_int_map : int StringMap.t -> string IntMap.t
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-24 21:21:48
|
Revision: 1388
http://toss.svn.sourceforge.net/toss/?rev=1388&view=rev
Author: lukaszkaiser
Date: 2011-03-24 21:21:42 +0000 (Thu, 24 Mar 2011)
Log Message:
-----------
Small corrections, timeout settings.
Modified Paths:
--------------
trunk/Toss/Formula/FormulaOps.ml
trunk/Toss/Formula/FormulaOps.mli
trunk/Toss/GGP/GDL.ml
trunk/Toss/Makefile
trunk/Toss/Play/Play.ml
trunk/Toss/Server/Server.ml
trunk/Toss/Solver/Solver.ml
trunk/Toss/WebClient/index.html
Modified: trunk/Toss/Formula/FormulaOps.ml
===================================================================
--- trunk/Toss/Formula/FormulaOps.ml 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/Formula/FormulaOps.ml 2011-03-24 21:21:42 UTC (rev 1388)
@@ -1307,9 +1307,9 @@
let is_fo = function `FO _ -> true | _ -> false in
List.filter is_fo (free_vars f)
-let rec order_by_fv structure acc_fv = function
+let rec order_by_fv sizes acc_fv = function
| [] -> []
- | [f] -> [order_by_fv_phi structure acc_fv f]
+ | [f] -> [order_by_fv_phi sizes acc_fv f]
| l ->
let cross x =
let fv = free_vars x in
@@ -1317,36 +1317,38 @@
let (cf, o) = List.partition cross l in
if cf = [] then (
let new_fv = free_vars (List.hd l) in
- order_by_fv structure new_fv l
+ order_by_fv sizes new_fv l
) else (
let new_fv = acc_fv @ (free_vars_fo (And cf)) in
- (List.map (order_by_fv_phi structure acc_fv) cf) @
- (order_by_fv structure new_fv o)
+ (List.map (order_by_fv_phi sizes acc_fv) cf) @
+ (order_by_fv sizes new_fv o)
)
-and order_by_fv_phi structure acc_fv = function
+and order_by_fv_phi sizes acc_fv = function
| And fl ->
let is_pred = function Rel (_, [|_|]) -> true | _ -> false in
let (p_raw, np) = List.partition is_pred fl in
- let p = match structure with | None -> p_raw | Some struc ->
- let card = function | Rel (r,_) -> Structure.rel_size struc r | _-> 0 in
- let cmp x y = (card x) - (card y) in
- List.sort cmp p_raw in
- let res = And (order_by_fv structure acc_fv (p @ np)) in
+ let p = match sizes with | None -> p_raw | Some slist ->
+ let card = function
+ | Rel (r, _) -> (try List.assoc r slist with Not_found -> 0)
+ | _-> 0 in
+ List.sort (fun x y -> (card x) - (card y)) p_raw in
+ let res = And (order_by_fv sizes acc_fv (p @ np)) in
if !debug_level > 1 then print_endline ("fvordered and: " ^ (str res));
res
| Or fl ->
let is_pred = function Rel (_, [|_|]) -> true | _ -> false in
let (p_raw, np) = List.partition is_pred fl in
- let p = match structure with | None -> p_raw | Some struc ->
- let card = function | Rel (r,_) -> Structure.rel_size struc r | _-> 0 in
- let cmp x y = (card x) - (card y) in
- List.sort cmp p_raw in
- let res = Or (order_by_fv structure acc_fv (p @ np)) in
+ let p = match sizes with | None -> p_raw | Some slist ->
+ let card = function
+ | Rel (r, _) -> (try List.assoc r slist with Not_found -> 0)
+ | _-> 0 in
+ List.sort (fun x y -> (card x) - (card y)) p_raw in
+ let res = Or (order_by_fv sizes acc_fv (p @ np)) in
if !debug_level > 1 then print_endline ("fvordered or: " ^ (str res));
res
- | Ex (vs, phi) -> Ex (vs, order_by_fv_phi structure acc_fv phi)
- | All (vs, phi) -> All (vs, order_by_fv_phi structure acc_fv phi)
+ | Ex (vs, phi) -> Ex (vs, order_by_fv_phi sizes acc_fv phi)
+ | All (vs, phi) -> All (vs, order_by_fv_phi sizes acc_fv phi)
| f -> f
let rec push_in_quant phi =
@@ -1373,12 +1375,12 @@
let rec push_quant f = push_in_quant (flatten_sort (f))
-let tnf_fv ?structure phi =
+let tnf_fv ?sizes phi =
let fv = free_vars phi in
let psi = rename_quant_avoiding [] (Ex (fv, phi)) in
match mso_last (flatten (del_vars_quant fv (tnf psi))) with
- | Or fl -> Or (List.map (order_by_fv_phi structure []) fl)
- | f -> order_by_fv_phi structure [] f
+ | Or fl -> Or (List.map (order_by_fv_phi sizes []) fl)
+ | f -> order_by_fv_phi sizes [] f
(* Assign emptyset to the MSO-variable v by replacing "x in X" with "false". *)
let assign_emptyset v phi =
Modified: trunk/Toss/Formula/FormulaOps.mli
===================================================================
--- trunk/Toss/Formula/FormulaOps.mli 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/Formula/FormulaOps.mli 2011-03-24 21:21:42 UTC (rev 1388)
@@ -187,7 +187,7 @@
in a NNF form which pushes quantifiers inside as strongly as possible. *)
val tnf : formula -> formula
val tnf_re : real_expr -> real_expr
-val tnf_fv : ?structure : Structure.structure ->
+val tnf_fv : ?sizes : (string * int) list ->
formula -> formula (** first existentially quantifies free vars *)
Modified: trunk/Toss/GGP/GDL.ml
===================================================================
--- trunk/Toss/GGP/GDL.ml 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/GGP/GDL.ml 2011-03-24 21:21:42 UTC (rev 1388)
@@ -3498,7 +3498,7 @@
let file = open_out ("./GGP/tests/"^game_name^"-simpl.toss") in
output_string file (Arena.state_str result);
close_out file);
- if !debug_level > -1 then (
+ if !debug_level > 1 then (
Printf.printf "\n\nGDL.translate_game: simplified rel sizes --\n%s\n%!"
(String.concat ", "(List.map (fun (rel,ar) ->
rel^":"^string_of_int ar) (Structure.rel_sizes
Modified: trunk/Toss/Makefile
===================================================================
--- trunk/Toss/Makefile 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/Makefile 2011-03-24 21:21:42 UTC (rev 1388)
@@ -57,8 +57,8 @@
OCAMLBUILDNOPP=ocamlbuild -log build.log -j 8 -menhir ../menhir_conf \
$(OCB_LIB) $(OCB_CFLAG) $(OCB_LFLAG)
-FormulaINC=Formula/Sat,Formula,Solver
-SolverINC=Formula,Solver,Formula/Sat,Solver/RealQuantElim
+FormulaINC=Formula/Sat
+SolverINC=Formula,Formula/Sat,Solver/RealQuantElim
ArenaINC=Formula,Formula/Sat,Solver/RealQuantElim,Solver
PlayINC=Formula,Formula/Sat,Solver/RealQuantElim,Solver,Arena
GGPINC=Formula,Formula/Sat,Solver/RealQuantElim,Solver,Arena,Play
Modified: trunk/Toss/Play/Play.ml
===================================================================
--- trunk/Toss/Play/Play.ml 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/Play/Play.ml 2011-03-24 21:21:42 UTC (rev 1388)
@@ -47,8 +47,8 @@
(* Maximax unfolding upto depth. *)
let rec unfold_maximax_upto ?(ab=false) count game heur t =
- if count = 0 || Game.get_timeout () || timed_out () then (
- if !debug_level > 1 && (Game.get_timeout() || timed_out()) then
+ if count = 0 || timed_out () then (
+ if !debug_level > 1 && timed_out() then
print_endline "Timeout";
t
) else
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/Server/Server.ml 2011-03-24 21:21:42 UTC (rev 1388)
@@ -394,15 +394,14 @@
else
let mov_msg =
if GDL.our_turn !gdl_transl !state then (
- let time_used =
- int_of_float time_started -
- int_of_float (ceil (Sys.time ())) in
+ let time_used = time_started -. Sys.time () in
let p, ps =
match !play, !play_state with
| Some play, Some play_state ->
play, play_state
| _ -> assert false in
- ignore (Unix.alarm (!playclock - time_used - 1));
+ ignore (Unix.alarm (!playclock - (int_of_float time_used) - 1));
+ Play.set_timeout (float(!playclock) -. time_used -. 1.5);
if !no_gtree then
let res = Game.suggest p ps in
Game.cancel_timeout ();
Modified: trunk/Toss/Solver/Solver.ml
===================================================================
--- trunk/Toss/Solver/Solver.ml 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/Solver/Solver.ml 2011-03-24 21:21:42 UTC (rev 1388)
@@ -49,7 +49,7 @@
(Hashtbl.find solver.formulas_eval res, res)
with Not_found ->
if !debug_level > 0 then print_endline ("Entered " ^ (str phi));
- let psi = FormulaOps.tnf_fv ~structure:struc phi in
+ let psi = FormulaOps.tnf_fv ~sizes:(Structure.rel_sizes struc) phi in
if !debug_level > 0 then print_endline ("Registering " ^ (str psi));
let id = Hashtbl.length solver.formulas_eval + 1 in
Hashtbl.add solver.reg_formulas phi id;
Modified: trunk/Toss/WebClient/index.html
===================================================================
--- trunk/Toss/WebClient/index.html 2011-03-24 18:05:50 UTC (rev 1387)
+++ trunk/Toss/WebClient/index.html 2011-03-24 21:21:42 UTC (rev 1388)
@@ -115,7 +115,21 @@
</p>
<ul class="welcome-list">
-<li>Play Breakthrough, Checkers, Chess, Connect4, Gomoku, Pawn Whopping
+ <li>Play
+ <a href="http://en.wikipedia.org/wiki/Breakthrough_(board_game)"
+ >Breakthrough,</a>
+ <a href="http://en.wikipedia.org/wiki/English_draughts"
+ >Checkers,</a>
+ <a href="http://en.wikipedia.org/wiki/Chess"
+ >Chess,</a>
+ <a href="http://en.wikipedia.org/wiki/Connect4"
+ >Connect4,</a>
+ <a href="http://en.wikipedia.org/wiki/Entanglement_(graph_measure)"
+ >Entanglement,</a>
+ <a href="http://en.wikipedia.org/wiki/Gomoku"
+ >Gomoku,</a>
+ <a href="http://en.wikipedia.org/wiki/Pawn_(chess)"
+ >Pawn-Whopping,</a>
and many other board games</li>
<li>Challenge your friends or play a fast game against the computer for fun</li>
<li>Focus fully on the game thanks to our intuitive clean interface</li>
@@ -198,7 +212,7 @@
<p class="game-par">
<button onclick="new_play('Pawn-Whopping')"
class="boldobt">Pawn-Whopping</button>
- (<a href="http://en.wikipedia.org/wiki/Pawn-Whopping">info</a>)
+ (<a href="http://en.wikipedia.org/wiki/Pawn_(chess)">info</a>)
</p>
<ul class="plays-list" id="plays-list-Pawn-Whopping">
<li style="display: none;"/>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-25 00:23:12
|
Revision: 1389
http://toss.svn.sourceforge.net/toss/?rev=1389&view=rev
Author: lukaszkaiser
Date: 2011-03-25 00:23:06 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
Better timeout resolution in GameTree.
Modified Paths:
--------------
trunk/Toss/Play/GameTree.ml
trunk/Toss/Play/GameTree.mli
trunk/Toss/Play/Play.ml
trunk/Toss/Server/Server.ml
Modified: trunk/Toss/Play/GameTree.ml
===================================================================
--- trunk/Toss/Play/GameTree.ml 2011-03-24 21:21:42 UTC (rev 1388)
+++ trunk/Toss/Play/GameTree.ml 2011-03-25 00:23:06 UTC (rev 1389)
@@ -58,26 +58,29 @@
(* Abstract game tree unfolding function, calls argument functions for work. *)
-let rec unfold_abstract ?(depth=0) game
+let rec unfold_abstract ?(timeout=fun () -> false) ?(depth=0) game
~info_terminal ~info_leaf ~info_node ~choice = function
| Terminal _ -> raise Not_found
| Leaf (state, player, info) ->
+ if timeout() then raise Not_found;
let moves = Move.list_moves game state in
- if moves = [||] then
+ if moves = [||] then (
Terminal (state, player, info_terminal depth game state player info)
- else
+ ) else
let leaf_of_move leaf_s =
+ if timeout() then raise Not_found;
let l_pl = game.Arena.graph.(leaf_s.Arena.cur_loc).Arena.player in
let l_info = info_leaf (depth+1) game leaf_s l_pl player in
Leaf (leaf_s, l_pl, l_info) in
let children = Array.map (fun (m, s) -> (m, leaf_of_move s)) moves in
Node (state, player,info_node depth game state player children,children)
| Node (state, player, info, children) ->
+ if timeout() then raise Not_found;
let n = choice depth game state player info children in
let (move, child) = children.(n) in
- let child_unfolded = unfold_abstract ~depth:(depth+1) game
- ~info_terminal:info_terminal ~info_leaf:info_leaf ~info_node:info_node
- ~choice:choice child in
+ let child_unfolded = unfold_abstract ~timeout:timeout ~depth:(depth+1)
+ game ~info_terminal:info_terminal ~info_leaf:info_leaf
+ ~info_node:info_node ~choice:choice child in
children.(n) <- (move, child_unfolded);
Node (state, player, info_node depth game state player children, children)
@@ -191,9 +194,10 @@
choice depth game state player info children
(* Main unfolding function. *)
-let unfold ?(ab=false) game heur ~info_leaf ~info_node ~choice =
+let unfold ?(timeout=fun () -> false) ?(ab=false) game heur
+ ~info_leaf ~info_node ~choice =
let (last_vals, stop_vals) = (ref None, ref None) in
- unfold_abstract game
+ unfold_abstract ~timeout:timeout game
~info_terminal:(info_terminal_f info_leaf)
~info_leaf:(info_leaf_f ab last_vals stop_vals info_leaf heur)
~info_node:(info_node_f info_node)
@@ -218,16 +222,17 @@
let move_s (m, n) = Move.move_gs_str_short (state n) m in
if !debug_level > 0 then print_endline
("\nBest Moves: " ^ (String.concat ", " (List.map move_s maxs)));
- if List.exists (fun x -> nonleaf (snd x)) maxs then
+ if List.exists (fun x -> nonleaf (snd x)) maxs then (
let (m, t) = Aux.random_elem maxs in (m, state t)
- else ( (* Do *not* take a shallow leaf if possible. *)
+ ) else ( (* Do *not* take a shallow leaf if possible. *)
let nonleaves = Aux.array_find_all (fun (_,c) -> nonleaf c) succ in
- if nonleaves = [] then
+ if nonleaves = [] then (
let (m, t) = Aux.random_elem maxs in (m, state t)
- else
+ ) else (
let upd_max mv (_, c) = max mv (node_values c).(p) in
let sx = (node_values (snd (List.hd nonleaves))).(p) in
let mx = List.fold_left upd_max sx nonleaves in
let mxs = List.filter (fun (_,c) -> (node_values c).(p)=mx) nonleaves in
let (m, t) = Aux.random_elem mxs in (m, state t)
+ )
)
Modified: trunk/Toss/Play/GameTree.mli
===================================================================
--- trunk/Toss/Play/GameTree.mli 2011-03-24 21:21:42 UTC (rev 1388)
+++ trunk/Toss/Play/GameTree.mli 2011-03-25 00:23:06 UTC (rev 1389)
@@ -33,7 +33,7 @@
('a, 'b) abstract_game_tree
(** Abstract game tree unfolding function, calls argument functions for work. *)
-val unfold_abstract : ?depth:int -> Arena.game ->
+val unfold_abstract : ?timeout : (unit -> bool) -> ?depth : int -> Arena.game ->
info_terminal : (int -> Arena.game -> Arena.game_state -> int -> 'a -> 'b) ->
info_leaf : (int -> Arena.game -> Arena.game_state -> int -> int -> 'a) ->
info_node : (int -> Arena.game -> Arena.game_state -> int ->
@@ -85,7 +85,8 @@
Formula.real_expr array array -> 'a game_tree
(** Game tree unfolding. *)
-val unfold : ?ab:bool -> Arena.game -> Formula.real_expr array array ->
+val unfold : ?timeout : (unit -> bool) -> ?ab:bool -> Arena.game ->
+ Formula.real_expr array array ->
info_leaf : (int -> Arena.game -> Arena.game_state -> 'a) ->
info_node : (int -> int -> float array ->
(Move.move * 'a game_tree) array -> 'a) ->
Modified: trunk/Toss/Play/Play.ml
===================================================================
--- trunk/Toss/Play/Play.ml 2011-03-24 21:21:42 UTC (rev 1388)
+++ trunk/Toss/Play/Play.ml 2011-03-25 00:23:06 UTC (rev 1389)
@@ -6,9 +6,9 @@
let set_debug_level i = debug_level := i
let timeout = ref 0.
-let set_timeout t = timeout := Unix.time() +. t
+let set_timeout t = timeout := Unix.gettimeofday() +. t
let cancel_timeout () = timeout := 0.
-let timed_out () = !timeout > 1. && Unix.time() > !timeout
+let timed_out () = !timeout > 1. && Unix.gettimeofday() +. 0.01 > !timeout
(* ------------ MAXIMAX BY DEPTH ------------- *)
@@ -42,7 +42,7 @@
(* Maximax by depth unfolding function. Throws Not_found if ready. *)
let unfold_maximax ?(ab=false) game heur =
- unfold ~ab:ab game heur ~info_leaf:(fun _ _ _ -> 0)
+ unfold ~timeout:timed_out ~ab:ab game heur ~info_leaf:(fun _ _ _ -> 0)
~info_node:(maxdepth_node) ~choice:(maximax_depth_choice ab)
(* Maximax unfolding upto depth. *)
@@ -51,11 +51,12 @@
if !debug_level > 1 && timed_out() then
print_endline "Timeout";
t
- ) else
+ ) else
try
- let u = unfold_maximax ~ab:ab game heur t in
- if !debug_level > 0 then Printf.printf "%d,%!" (size u);
- unfold_maximax_upto ~ab:ab (count-1) game heur u
+ if timed_out() then t else
+ let u = unfold_maximax ~ab:ab game heur t in
+ if !debug_level > 0 then Printf.printf "%d,%!" (size u);
+ unfold_maximax_upto ~ab:ab (count-1) game heur u
with Not_found -> t
(* Maximax unfold upto depth and choose move. *)
@@ -64,5 +65,7 @@
if !debug_level > 0 then Printf.printf "Using Alpha-Beta: %B\n%!" ab;
let t = init game state (fun _ _ _ -> 0) heur in
let u = unfold_maximax_upto ~ab count game heur t in
+ if !debug_level > 0 then Printf.printf "Timeout %f%!"
+ (Unix.gettimeofday() -. !timeout);
if !debug_level > 1 then print_endline (str string_of_int u);
choose_move game u
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-24 21:21:42 UTC (rev 1388)
+++ trunk/Toss/Server/Server.ml 2011-03-25 00:23:06 UTC (rev 1389)
@@ -56,9 +56,9 @@
Unix.setsockopt sock Unix.SO_REUSEADDR true;
Unix.bind sock (Unix.ADDR_INET (get_inet_addr (addr_s), port));
Unix.listen sock 99; (* maximally 99 pending requests *)
- let timeout = ref (Unix.time () +. float (!dtimeout)) in
- while !dtimeout < 0 || Unix.time () < !timeout do
- timeout := Unix.time () +. float (!dtimeout);
+ let timeout = ref (Unix.gettimeofday () +. float (!dtimeout)) in
+ while !dtimeout < 0 || Unix.gettimeofday () < !timeout do
+ timeout := Unix.gettimeofday () +. float (!dtimeout);
let (cl_sock, _) = Unix.accept sock in
f (Unix.in_channel_of_descr cl_sock) (Unix.out_channel_of_descr cl_sock);
Unix.close cl_sock;
@@ -401,7 +401,7 @@
play, play_state
| _ -> assert false in
ignore (Unix.alarm (!playclock - (int_of_float time_used) - 1));
- Play.set_timeout (float(!playclock) -. time_used -. 1.5);
+ Play.set_timeout (float(!playclock) -. time_used -. 0.02);
if !no_gtree then
let res = Game.suggest p ps in
Game.cancel_timeout ();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-25 02:06:57
|
Revision: 1390
http://toss.svn.sourceforge.net/toss/?rev=1390&view=rev
Author: lukaszkaiser
Date: 2011-03-25 02:06:51 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
Avoid too fast terminal unfolding.
Modified Paths:
--------------
trunk/Toss/Play/GameTree.ml
trunk/Toss/Play/Play.ml
trunk/Toss/Server/Server.ml
Modified: trunk/Toss/Play/GameTree.ml
===================================================================
--- trunk/Toss/Play/GameTree.ml 2011-03-25 00:23:06 UTC (rev 1389)
+++ trunk/Toss/Play/GameTree.ml 2011-03-25 02:06:51 UTC (rev 1390)
@@ -60,7 +60,8 @@
(* Abstract game tree unfolding function, calls argument functions for work. *)
let rec unfold_abstract ?(timeout=fun () -> false) ?(depth=0) game
~info_terminal ~info_leaf ~info_node ~choice = function
- | Terminal _ -> raise Not_found
+ | Terminal _ ->
+ if !debug_level > 0 then print_endline "Terminal Unfold"; raise Not_found
| Leaf (state, player, info) ->
if timeout() then raise Not_found;
let moves = Move.list_moves game state in
Modified: trunk/Toss/Play/Play.ml
===================================================================
--- trunk/Toss/Play/Play.ml 2011-03-25 00:23:06 UTC (rev 1389)
+++ trunk/Toss/Play/Play.ml 2011-03-25 02:06:51 UTC (rev 1390)
@@ -19,9 +19,15 @@
let maximax_depth_choice ab stop_vals dp game cur_state player info children =
let mval child = (node_values (snd child)).(player), node_info (snd child) in
- let cmp c1 c2 =
+ let cmp_raw c1 c2 =
let (v1, d1), (v2, d2) = mval c1, mval c2 in
if v1 > v2 then 1 else if v2 > v1 then -1 else d1 - d2 in
+ let cmp c1 c2 =
+ match snd c1, snd c2 with
+ | Terminal _, Terminal _ -> cmp_raw c1 c2
+ | Terminal _, _ -> -1
+ | _, Terminal _ -> 1
+ | _, _ -> cmp_raw c1 c2 in
let res = Aux.random_elem (Aux.array_argfind_all_max cmp children) in
if !debug_level > 2 then
print_endline (Structure.str (state (snd children.(res))).Arena.struc);
@@ -63,9 +69,11 @@
let maximax_unfold_choose count game state heur =
let ab = Heuristic.is_constant_sum heur in (* TODO: payoffs as well! *)
if !debug_level > 0 then Printf.printf "Using Alpha-Beta: %B\n%!" ab;
+ if !debug_level > 3 then
+ Array.iter (fun h -> Array.iter Formula.print_real h) heur;
let t = init game state (fun _ _ _ -> 0) heur in
let u = unfold_maximax_upto ~ab count game heur t in
if !debug_level > 0 then Printf.printf "Timeout %f%!"
(Unix.gettimeofday() -. !timeout);
- if !debug_level > 1 then print_endline (str string_of_int u);
+ if !debug_level > 2 then print_endline (str string_of_int u);
choose_move game u
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-25 00:23:06 UTC (rev 1389)
+++ trunk/Toss/Server/Server.ml 2011-03-25 02:06:51 UTC (rev 1390)
@@ -311,7 +311,7 @@
game_modified := false;
play := Some p; play_state := Some ps;
playclock := playcl;
- g_heur := Some (Heuristic.default_heuristic
+ g_heur := Some (Heuristic.default_heuristic
~struc:(snd !state).Arena.struc
~advr:4. (fst !state));
"HTTP/1.0 200 OK\r\nContent-type: text/acl\r\nContent-length: 5"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-25 17:06:26
|
Revision: 1391
http://toss.svn.sourceforge.net/toss/?rev=1391&view=rev
Author: lukaszkaiser
Date: 2011-03-25 17:06:20 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
Correcting manual breakthrough translation.
Modified Paths:
--------------
trunk/Toss/GGP/GDL.ml
trunk/Toss/Server/Server.ml
Added Paths:
-----------
trunk/Toss/GGP/examples/breakthrough_orig.gdl
Modified: trunk/Toss/GGP/GDL.ml
===================================================================
--- trunk/Toss/GGP/GDL.ml 2011-03-25 02:06:51 UTC (rev 1390)
+++ trunk/Toss/GGP/GDL.ml 2011-03-25 17:06:20 UTC (rev 1391)
@@ -3884,7 +3884,7 @@
match actions with
| [Func ("MOVE", [Const x1; Const y1; Const x2; Const y2]);
Const "NOOP"] when x1 = x2 ->
- "WhiteMove",
+ "WhiteStraight",
["a1", Structure.board_coords_name (s2i x1, s2i y1);
"a2", Structure.board_coords_name (s2i x2, s2i y2)]
| [Func ("MOVE", [Const x1; Const y1; Const x2; Const y2]);
@@ -3895,7 +3895,7 @@
| [Const "NOOP";
Func ("MOVE", [Const x1; Const y1; Const x2; Const y2])]
when x1 = x2 ->
- "BlackMove",
+ "BlackStraight",
["a2", Structure.board_coords_name (s2i x1, s2i y1);
"a1", Structure.board_coords_name (s2i x2, s2i y2)]
| [Const "NOOP";
@@ -4007,7 +4007,7 @@
let struc = (snd new_state).Arena.struc in
match emb with
| [(_,a); (_,b)] ->
- let a, b = if rule = "BlackMove" then a, b else b, a in
+ let a, b = if rule = "BlackStraight" then a, b else b, a in
let x1, y1 =
Structure.board_elem_coords (Structure.elem_str struc a)
and x2, y2 =
Added: trunk/Toss/GGP/examples/breakthrough_orig.gdl
===================================================================
--- trunk/Toss/GGP/examples/breakthrough_orig.gdl (rev 0)
+++ trunk/Toss/GGP/examples/breakthrough_orig.gdl 2011-03-25 17:06:20 UTC (rev 1391)
@@ -0,0 +1,153 @@
+; breakthrough
+;
+; a player wins if he reaches the opposite side of the board
+; or if the opponent has no pieces left
+;
+; the game ends if one player wins (there is no draw)
+
+(role white)
+(role black)
+(init (cellholds 1 1 white))
+(init (cellholds 2 1 white))
+(init (cellholds 3 1 white))
+(init (cellholds 4 1 white))
+(init (cellholds 5 1 white))
+(init (cellholds 6 1 white))
+(init (cellholds 7 1 white))
+(init (cellholds 8 1 white))
+(init (cellholds 1 2 white))
+(init (cellholds 2 2 white))
+(init (cellholds 3 2 white))
+(init (cellholds 4 2 white))
+(init (cellholds 5 2 white))
+(init (cellholds 6 2 white))
+(init (cellholds 7 2 white))
+(init (cellholds 8 2 white))
+(init (cellholds 1 7 black))
+(init (cellholds 2 7 black))
+(init (cellholds 3 7 black))
+(init (cellholds 4 7 black))
+(init (cellholds 5 7 black))
+(init (cellholds 6 7 black))
+(init (cellholds 7 7 black))
+(init (cellholds 8 7 black))
+(init (cellholds 1 8 black))
+(init (cellholds 2 8 black))
+(init (cellholds 3 8 black))
+(init (cellholds 4 8 black))
+(init (cellholds 5 8 black))
+(init (cellholds 6 8 black))
+(init (cellholds 7 8 black))
+(init (cellholds 8 8 black))
+(init (control white))
+(<= (legal white (move ?x ?y1 ?x ?y2))
+ (true (control white))
+ (true (cellholds ?x ?y1 white))
+ (++ ?y1 ?y2)
+ (cellempty ?x ?y2))
+(<= (legal white (move ?x1 ?y1 ?x2 ?y2))
+ (true (control white))
+ (true (cellholds ?x1 ?y1 white))
+ (++ ?y1 ?y2)
+ (++ ?x1 ?x2)
+ (not (true (cellholds ?x2 ?y2 white))))
+(<= (legal white (move ?x1 ?y1 ?x2 ?y2))
+ (true (control white))
+ (true (cellholds ?x1 ?y1 white))
+ (++ ?y1 ?y2)
+ (++ ?x2 ?x1)
+ (not (true (cellholds ?x2 ?y2 white))))
+(<= (legal black (move ?x ?y1 ?x ?y2))
+ (true (control black))
+ (true (cellholds ?x ?y1 black))
+ (++ ?y2 ?y1)
+ (cellempty ?x ?y2))
+(<= (legal black (move ?x1 ?y1 ?x2 ?y2))
+ (true (control black))
+ (true (cellholds ?x1 ?y1 black))
+ (++ ?y2 ?y1)
+ (++ ?x1 ?x2)
+ (not (true (cellholds ?x2 ?y2 black))))
+(<= (legal black (move ?x1 ?y1 ?x2 ?y2))
+ (true (control black))
+ (true (cellholds ?x1 ?y1 black))
+ (++ ?y2 ?y1)
+ (++ ?x2 ?x1)
+ (not (true (cellholds ?x2 ?y2 black))))
+(<= (legal white noop)
+ (true (control black)))
+(<= (legal black noop)
+ (true (control white)))
+(<= (next (cellholds ?x2 ?y2 ?player))
+ (role ?player)
+ (does ?player (move ?x1 ?y1 ?x2 ?y2)))
+(<= (next (cellholds ?x3 ?y3 ?state))
+ (true (cellholds ?x3 ?y3 ?state))
+ (role ?player)
+ (does ?player (move ?x1 ?y1 ?x2 ?y2))
+ (distinctcell ?x1 ?y1 ?x3 ?y3)
+ (distinctcell ?x2 ?y2 ?x3 ?y3))
+(<= (next (control white))
+ (true (control black)))
+(<= (next (control black))
+ (true (control white)))
+(<= terminal
+ whitewin)
+(<= terminal
+ blackwin)
+(<= (goal white 100)
+ whitewin)
+(<= (goal white 0)
+ (not whitewin))
+(<= (goal black 100)
+ blackwin)
+(<= (goal black 0)
+ (not blackwin))
+(<= (cell ?x ?y)
+ (index ?x)
+ (index ?y))
+(<= (cellempty ?x ?y)
+ (cell ?x ?y)
+ (not (true (cellholds ?x ?y white)))
+ (not (true (cellholds ?x ?y black))))
+(<= (distinctcell ?x1 ?y1 ?x2 ?y2)
+ (cell ?x1 ?y1)
+ (cell ?x2 ?y2)
+ (distinct ?x1 ?x2))
+(<= (distinctcell ?x1 ?y1 ?x2 ?y2)
+ (cell ?x1 ?y1)
+ (cell ?x2 ?y2)
+ (distinct ?y1 ?y2))
+(<= whitewin
+ (index ?x)
+ (true (cellholds ?x 8 white)))
+(<= whitewin
+ (not blackcell))
+(<= blackwin
+ (index ?x)
+ (true (cellholds ?x 1 black)))
+(<= blackwin
+ (not whitecell))
+(<= whitecell
+ (cell ?x ?y)
+ (true (cellholds ?x ?y white)))
+(<= blackcell
+ (cell ?x ?y)
+ (true (cellholds ?x ?y black)))
+(index 1)
+(index 2)
+(index 3)
+(index 4)
+(index 5)
+(index 6)
+(index 7)
+(index 8)
+(++ 1 2)
+(++ 2 3)
+(++ 3 4)
+(++ 4 5)
+(++ 5 6)
+(++ 6 7)
+(++ 7 8)
+
+
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-25 02:06:51 UTC (rev 1390)
+++ trunk/Toss/Server/Server.ml 2011-03-25 17:06:20 UTC (rev 1391)
@@ -622,7 +622,7 @@
parse_game_descr (String.uppercase gdl) in
if !load_gdl then (
GDL.tictactoe_descr := Some (load_rules "tictactoe.gdl");
- GDL.breakthrough_descr := Some (load_rules "breakthrough.gdl");
+ GDL.breakthrough_descr := Some (load_rules "breakthrough_orig.gdl");
GDL.connect5_descr := Some (load_rules "connect5.gdl");
GDL.connect4_descr := Some (load_rules "connect4.gdl");
GDL.pawn_whopping_descr := Some (load_rules "pawn_whopping.gdl");
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-25 20:12:26
|
Revision: 1392
http://toss.svn.sourceforge.net/toss/?rev=1392&view=rev
Author: lukstafi
Date: 2011-03-25 20:12:20 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
More logging. Heuristic: optional force-competitive reduces the default_heuristic_old to zero-sum (off by default, but currently always set on when playing GDL).
Modified Paths:
--------------
trunk/Toss/Arena/Arena.ml
trunk/Toss/Arena/Arena.mli
trunk/Toss/Arena/ContinuousRule.ml
trunk/Toss/Arena/ContinuousRule.mli
trunk/Toss/Arena/DiscreteRule.ml
trunk/Toss/Arena/DiscreteRule.mli
trunk/Toss/GGP/GDL.ml
trunk/Toss/Play/Heuristic.ml
trunk/Toss/Play/Heuristic.mli
trunk/Toss/Server/Server.ml
Modified: trunk/Toss/Arena/Arena.ml
===================================================================
--- trunk/Toss/Arena/Arena.ml 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Arena/Arena.ml 2011-03-25 20:12:20 UTC (rev 1392)
@@ -322,7 +322,7 @@
let equational_def_style = ref true
-let fprint_state ppf
+let fprint_state_full print_compiled_rules ppf
({rules = rules;
graph = graph;
num_players = num_players;
@@ -356,7 +356,7 @@
data;
List.iter (fun (rname, r) ->
Format.fprintf ppf "@[<1>RULE %s:@ %a@]@ " rname
- ContinuousRule.fprint r) rules;
+ (ContinuousRule.fprint_full print_compiled_rules) r) rules;
Array.iter (fun loc ->
Format.fprintf ppf "@[<1>LOC %d@ {@,@[<1>@,%a@]@,}@]@ "
loc.id (fprint_loc_body struc player_names) loc) graph;
@@ -368,12 +368,19 @@
Format.fprintf ppf "@[<1>TIME@ %F@]@ " time;
Format.fprintf ppf "@]"
+let fprint_state = fprint_state_full false
+
let print_state r = fprint_state Format.std_formatter r
let sprint_state r =
ignore (Format.flush_str_formatter ());
fprint_state Format.str_formatter r;
Format.flush_str_formatter ()
+let sprint_state_full r =
+ ignore (Format.flush_str_formatter ());
+ fprint_state_full true Format.str_formatter r;
+ Format.flush_str_formatter ()
+
let str game = sprint_state (game, snd empty_state)
let state_str state = sprint_state state
Modified: trunk/Toss/Arena/Arena.mli
===================================================================
--- trunk/Toss/Arena/Arena.mli 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Arena/Arena.mli 2011-03-25 20:12:20 UTC (rev 1392)
@@ -64,9 +64,13 @@
syntax. Defaults to [true]. *)
val equational_def_style : bool ref
+val fprint_state_full :
+ bool -> Format.formatter -> game * game_state -> unit
val fprint_state : Format.formatter -> game * game_state -> unit
val print_state : game * game_state -> unit
val sprint_state : game * game_state -> string
+(** For the rules of the game, also print their compiled forms. *)
+val sprint_state_full : game * game_state -> string
(** The order of following entries matters: [DefPlayers] adds more
players, with consecutive numbers starting from first available;
Modified: trunk/Toss/Arena/ContinuousRule.ml
===================================================================
--- trunk/Toss/Arena/ContinuousRule.ml 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Arena/ContinuousRule.ml 2011-03-25 20:12:20 UTC (rev 1392)
@@ -227,7 +227,7 @@
let has_update r = r.update <> []
(* List.exists (fun ((f, a), t) -> t <> Term.FVar (f,a)) r.update *)
-let fprint f r =
+let fprint_full print_compiled f r =
Format.fprintf f "@[<1>%a" DiscreteRule.fprint_rule r.discrete;
if has_dynamics r then
Format.fprintf f "@ @[<hv>dynamics@ %a@]"
@@ -235,6 +235,9 @@
if has_update r then
Format.fprintf f "@ @[<hv>update@ %a@]"
(Term.fprint_eqs ~diff:false) r.update;
+ if print_compiled then
+ Format.fprintf f "@ @[<1>compiled@ %a@]"
+ DiscreteRule.fprint_rule_obj r.compiled;
if r.discrete.DiscreteRule.pre <> Formula.And [] then
Format.fprintf f "@ @[<1>pre@ %a@]" Formula.fprint
r.discrete.DiscreteRule.pre;
@@ -244,6 +247,8 @@
Format.fprintf f "@ @[<1>post@ %a@]" Formula.fprint r.post;
Format.fprintf f "@]"
+let fprint = fprint_full false
+
let print r = fprint Format.std_formatter r
let sprint r =
ignore (Format.flush_str_formatter ());
Modified: trunk/Toss/Arena/ContinuousRule.mli
===================================================================
--- trunk/Toss/Arena/ContinuousRule.mli 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Arena/ContinuousRule.mli 2011-03-25 20:12:20 UTC (rev 1392)
@@ -36,6 +36,7 @@
(** Print a rule to string. *)
val str : rule -> string
+val fprint_full : bool -> Format.formatter -> rule -> unit
val fprint : Format.formatter -> rule -> unit
val print : rule -> unit
val sprint : rule -> string
Modified: trunk/Toss/Arena/DiscreteRule.ml
===================================================================
--- trunk/Toss/Arena/DiscreteRule.ml 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Arena/DiscreteRule.ml 2011-03-25 20:12:20 UTC (rev 1392)
@@ -1155,7 +1155,19 @@
Formula.str obj.lhs_form ^ "-> " ^
Formula.str (And (plits @ nlits))
+let fprint_rule_obj f obj =
+ let plits = Aux.concat_map (fun (r, tups) ->
+ List.map (fun tup->Rel (r,Array.map (fun v->`FO v) tup)) tups)
+ obj.rhs_pos_tuples in
+ let nlits = Aux.concat_map (fun (r, tups) ->
+ List.map (fun tup->Not (Rel (r,Array.map (fun v->`FO v) tup)))
+ tups)
+ obj.rhs_neg_tuples in
+ Format.fprintf f "@[<1>%a@ ->@ %a@]"
+ Formula.fprint obj.lhs_form
+ Formula.fprint (And (plits @ nlits))
+
let fprint_matching f matching =
let matched f (lhs,rhs) = Format.fprintf f "%d->%d" lhs rhs in
Format.fprintf f "[@,@[%a@]@,]"
Modified: trunk/Toss/Arena/DiscreteRule.mli
===================================================================
--- trunk/Toss/Arena/DiscreteRule.mli 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Arena/DiscreteRule.mli 2011-03-25 20:12:20 UTC (rev 1392)
@@ -157,6 +157,9 @@
val fprint_rule :
Format.formatter -> rule -> unit
+val fprint_rule_obj :
+ Format.formatter -> rule_obj -> unit
+
val print_rule : rule -> unit
val sprint_rule : rule -> string
Modified: trunk/Toss/GGP/GDL.ml
===================================================================
--- trunk/Toss/GGP/GDL.ml 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/GGP/GDL.ml 2011-03-25 20:12:20 UTC (rev 1392)
@@ -3506,7 +3506,7 @@
);
if !debug_level > 1 then (
Printf.printf "\n\nGDL.translate_game: after simplification --\n%s\n%!"
- (Arena.sprint_state result)
+ (Arena.sprint_state_full result)
);
(* }}} *)
{anchor_terms = !anchor_terms;
Modified: trunk/Toss/Play/Heuristic.ml
===================================================================
--- trunk/Toss/Play/Heuristic.ml 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Play/Heuristic.ml 2011-03-25 20:12:20 UTC (rev 1392)
@@ -254,8 +254,12 @@
let debug_level = ref 0
+(* Irrespective of the shape of payoffs, take the difference of
+ heuristics as the final heuristic for each player (in
+ {!Heuristic.default_heuristic_old}). *)
+let force_competitive = ref false
(* TODO: not exporting these in the API as global variables? *)
-let default_nonmonot_adv_ratio = 2.0
+let default_nonmonot_adv_ratio = 4.0
let default_monot_adv_ratio = 4.0
let suggest_expansion_coef = 0.5
@@ -1078,15 +1082,20 @@
let moves = match struc with | None -> [||] | Some strc ->
Move.gen_moves Move.cGRID_SIZE rules strc graph.(0) in
let monotonic = !use_monotonic && (Array.length moves > 60 ||
- Aux.Strings.is_empty (Aux.Strings.inter all_poff_rels indef_frels)) in
+ Aux.Strings.is_empty (Aux.Strings.inter all_poff_rels indef_frels)) in
(* {{{ log entry *)
- if !debug_level > 1 then (
+ if !debug_level > 0 then (
Printf.printf
"default_heuristic_old: monotonic=%b; posi_frels=%s; nega_frels=%s;\
- indef_frels=%s\n%!"
+ indef_frels=%s; adv_ratio=%s\n%!"
monotonic (String.concat ", " (Aux.Strings.elements posi_frels))
(String.concat ", " (Aux.Strings.elements nega_frels))
(String.concat ", " (Aux.Strings.elements indef_frels))
+ (match advr with
+ | None -> "None "^ string_of_float (
+ if monotonic then default_monot_adv_ratio
+ else default_nonmonot_adv_ratio)
+ | Some r -> "Some "^ string_of_float r)
);
(* }}} *)
let advr =
@@ -1105,30 +1114,45 @@
Some (DiscreteRule.fluent_preconds drules signat
posi_frels nega_frels indef_frels)
else None in
- Array.mapi (fun i node -> Array.map
- (fun payoff ->
- (* {{{ log entry *)
- if !debug_level > (* 5 *) 1 then (
- Printf.printf
- "default_heuristic: Computing for loc %d of payoff %s...\n%!"
- i (Formula.sprint_real payoff);
- );
- if !debug_level = 5 then (
- Printf.printf
- "default_heuristic: Computing for loc %d\n%!" i;
- );
- (* }}} *)
- let res =
- of_payoff ?struc ?fluent_preconds advr ~posi_frels ~nega_frels
- frels payoff in
- (* {{{ log entry *)
- if !debug_level > (* 6 *) 1 then (
- Printf.printf "default_heuristic: %s\n%!"
- (Formula.sprint_real res)
- );
- (* }}} *)
- res)
- node.Arena.payoffs) graph
+ Array.mapi (fun i node ->
+ let res = Array.map
+ (fun payoff ->
+ (* {{{ log entry *)
+ if !debug_level > (* 5 *) 1 then (
+ Printf.printf
+ "default_heuristic: Computing for loc %d of payoff %s...\n%!"
+ i (Formula.sprint_real payoff);
+ );
+ if !debug_level = 5 then (
+ Printf.printf
+ "default_heuristic: Computing for loc %d\n%!" i;
+ );
+ (* }}} *)
+ let res =
+ of_payoff ?struc ?fluent_preconds advr ~posi_frels ~nega_frels
+ frels payoff in
+ (* {{{ log entry *)
+ if !debug_level > (* 6 *) 1 then (
+ Printf.printf "default_heuristic: %s\n%!"
+ (Formula.sprint_real res)
+ );
+ (* }}} *)
+ res)
+ node.Arena.payoffs in
+ if !force_competitive && Array.length res > 1
+ then
+ Array.mapi (fun p v ->
+ let opponents = ref None in
+ for i = 0 to Array.length res - 1 do
+ if i <> p then (
+ if !opponents = None then opponents := Some res.(i)
+ else opponents :=
+ Some (Plus (Aux.unsome !opponents, res.(i))))
+ done;
+ Plus (v, Times (Const (-1.), Aux.unsome !opponents))
+ ) res
+ else res
+ ) graph
let fluents_heuristic game =
let (no_players, rules) = (game.Arena.num_players, game.Arena.rules) in
@@ -1163,7 +1187,18 @@
Formula.Plus (p, Formula.Times (Formula.Const factor, h2.(i).(j)))) a) h1
let default_heuristic ?struc ?advr g =
- mix_heur (default_heuristic_old ?struc ?advr g) 0.2 (fluents_heuristic g)
+ let res =
+ mix_heur (default_heuristic_old ?struc ?advr g) 0.2
+ (fluents_heuristic g) in
+ if !debug_level > 1 then (
+ print_endline "HEURISTIC MATRIX:";
+ Array.iteri (fun loc poffs ->
+ Array.iteri (fun player poff ->
+ Printf.printf "LOC %d, player %d:\n%s\n%!"
+ loc player (Formula.sprint_real poff)
+ ) poffs ) res;
+ );
+ res
let is_constant_sum_one heur_arr =
let is_const r1 r2 =
Modified: trunk/Toss/Play/Heuristic.mli
===================================================================
--- trunk/Toss/Play/Heuristic.mli 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Play/Heuristic.mli 2011-03-25 20:12:20 UTC (rev 1392)
@@ -59,6 +59,11 @@
val debug_level : int ref
+(** Irrespective of the shape of payoffs, take the difference of
+ heuristics as the final heuristic for each player (in
+ {!Heuristic.default_heuristic_old}). *)
+val force_competitive : bool ref
+
(** Returns a disjunction of existentially quantified conjunctions of
atoms each disjunct being equivalent to the given formula in the
given model. Testing purposes mostly. *)
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-25 17:06:20 UTC (rev 1391)
+++ trunk/Toss/Server/Server.ml 2011-03-25 20:12:20 UTC (rev 1392)
@@ -205,10 +205,9 @@
let heur = match !game_modified, !g_heur with
| false, Some h -> h
| true, _ | _, None ->
- let adr = match advr with Some a -> a | None -> 4. in
g_heur := Some (Heuristic.default_heuristic
~struc:(snd !state).Arena.struc
- ~advr:adr (fst !state));
+ ?advr (fst !state));
Aux.unsome !g_heur in
let (move, _) = Play.maximax_unfold_choose effort
(fst !state) (snd !state) heur in
@@ -297,6 +296,8 @@
| Aux.Right (GDL.Start (_, player, game_descr, startcl, playcl)) ->
Random.self_init (); (* Random.init 1234; for repeatablity *)
+ let old_force_competitive = !Heuristic.force_competitive in
+ Heuristic.force_competitive := true;
let new_state, params, new_gdl_transl =
GDL.initialize_game player game_descr startcl in
state := new_state; gdl_transl := new_gdl_transl;
@@ -313,7 +314,8 @@
playclock := playcl;
g_heur := Some (Heuristic.default_heuristic
~struc:(snd !state).Arena.struc
- ~advr:4. (fst !state));
+ ?advr (fst !state));
+ Heuristic.force_competitive := old_force_competitive;
"HTTP/1.0 200 OK\r\nContent-type: text/acl\r\nContent-length: 5"
^ "\r\n\r\nREADY"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-25 22:24:36
|
Revision: 1393
http://toss.svn.sourceforge.net/toss/?rev=1393&view=rev
Author: lukaszkaiser
Date: 2011-03-25 22:24:30 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
GameTree corrections and better loging, more exact timers in Server.
Modified Paths:
--------------
trunk/Toss/Play/GameTree.ml
trunk/Toss/Play/GameTree.mli
trunk/Toss/Play/Play.ml
trunk/Toss/Server/Server.ml
trunk/Toss/examples/Gomoku.toss
trunk/Toss/examples/Tic-Tac-Toe.toss
Modified: trunk/Toss/Play/GameTree.ml
===================================================================
--- trunk/Toss/Play/GameTree.ml 2011-03-25 20:12:20 UTC (rev 1392)
+++ trunk/Toss/Play/GameTree.ml 2011-03-25 22:24:30 UTC (rev 1393)
@@ -13,23 +13,26 @@
(* node with state, player, moves and info *)
(* Abstract tree printing function. *)
-let rec str_abstract ?(depth=0) str_info str_info_terminal tree =
+let rec str_abstract ?(upto=100000000) ?(struc=true) ?(depth=0)
+ str_info str_info_terminal tree =
let s msg state player info_s =
- let struc_s = Structure.str state.Arena.struc in
+ let struc_s = if struc then Structure.str state.Arena.struc else "" in
let head_s = Printf.sprintf "Player %d loc %d time %.1f.\n"
player state.Arena.cur_loc state.Arena.time in
let res = "\n" ^ msg ^ head_s ^ struc_s ^ "\n" ^ info_s in
let prefix = if depth=0 then "" else (String.make depth '|') ^ " " in
Str.global_replace (Str.regexp "\n") ("\n" ^ prefix) res in
- match tree with
- | Terminal (state, player, info) ->
- s "Terminal. " state player (str_info_terminal info)
- | Leaf (state, player, info) -> s "Leaf. " state player (str_info info)
- | Node (state, player, info, children) ->
- let next_str (_, t) =
- str_abstract ~depth:(depth+1) str_info str_info_terminal t in
- let child_s = Array.to_list (Array.map next_str children) in
- String.concat "" ((s "Node. " state player (str_info info)) :: child_s)
+ if upto < 0 then " Cut;" else
+ match tree with
+ | Terminal (state, player, info) ->
+ s "Terminal. " state player (str_info_terminal info)
+ | Leaf (state, player, info) -> s "Leaf. " state player (str_info info)
+ | Node (state, player, info, children) ->
+ let next_str (_, t) =
+ str_abstract ~upto:(upto-1) ~struc:struc ~depth:(depth+1)
+ str_info str_info_terminal t in
+ let child_s = Array.to_list (Array.map next_str children) in
+ String.concat "" ((s "Node. " state player (str_info info)) :: child_s)
(* Number of nodes in the tree. *)
let rec size = function
@@ -88,7 +91,7 @@
(* -------------- TREES WITH PAYOFF AND HEURISTIC DATA --------------- *)
-let cPAYOFF_AS_HEUR = ref 1000.
+let cPAYOFF_AS_HEUR = ref 10000.
(* The general information in a game tree node. *)
type 'a node_info = {
@@ -107,18 +110,18 @@
(* Game tree printing function. *)
-let str f ?(depth=0) tree =
+let str f ?(upto=100000000) ?(struc=true) ?(depth=0) tree =
let fas a = String.concat "; " (List.map string_of_float (Array.to_list a)) in
let str_terminal i = "Payoffs: " ^ (fas i.payoffs) ^
" heurs: " ^ (fas i.heurs_t) ^ " info: " ^ (f i.info_t) in
let str_node i = "Heurs: " ^ (fas i.heurs) ^ " exact: " ^
(string_of_bool i.heurs_are_exact) ^ " info: " ^ (f i.info) in
- str_abstract ~depth:depth str_node str_terminal tree
+ str_abstract ~upto:upto ~struc:struc ~depth:depth str_node str_terminal tree
(* Get the payoffs / heuristics array of a game tree node. *)
let node_values = function
- | Terminal (_, _, i) ->
- Array.mapi (fun k p -> !cPAYOFF_AS_HEUR *. p +. i.heurs_t.(k)) i.payoffs
+ | Terminal (_, _, i) -> Array.mapi
+ (fun k p -> !cPAYOFF_AS_HEUR *. p +. 0.001 *. i.heurs_t.(k)) i.payoffs
| Leaf (_, _, i) -> i.heurs
| Node (_, _, i, _) -> i.heurs
Modified: trunk/Toss/Play/GameTree.mli
===================================================================
--- trunk/Toss/Play/GameTree.mli 2011-03-25 20:12:20 UTC (rev 1392)
+++ trunk/Toss/Play/GameTree.mli 2011-03-25 22:24:30 UTC (rev 1393)
@@ -14,8 +14,8 @@
(** node with state, player, moves *)
(** Abstract tree printing function. *)
-val str_abstract : ?depth:int -> ('a -> string) -> ('b -> string) ->
- ('a, 'b) abstract_game_tree -> string
+val str_abstract : ?upto:int -> ?struc:bool -> ?depth:int -> ('a -> string) ->
+ ('b -> string) -> ('a, 'b) abstract_game_tree -> string
(** Number of nodes in the tree. *)
val size : ('a, 'b) abstract_game_tree -> int
@@ -66,7 +66,8 @@
(** Game tree printing function. *)
-val str : ('a -> string) -> ?depth:int -> 'a game_tree -> string
+val str : ('a -> string) -> ?upto:int -> ?struc:bool -> ?depth:int ->
+ 'a game_tree -> string
(** The values of a game tree node. *)
val node_values : 'a game_tree -> float array
Modified: trunk/Toss/Play/Play.ml
===================================================================
--- trunk/Toss/Play/Play.ml 2011-03-25 20:12:20 UTC (rev 1392)
+++ trunk/Toss/Play/Play.ml 2011-03-25 22:24:30 UTC (rev 1393)
@@ -19,15 +19,9 @@
let maximax_depth_choice ab stop_vals dp game cur_state player info children =
let mval child = (node_values (snd child)).(player), node_info (snd child) in
- let cmp_raw c1 c2 =
+ let cmp c1 c2 =
let (v1, d1), (v2, d2) = mval c1, mval c2 in
if v1 > v2 then 1 else if v2 > v1 then -1 else d1 - d2 in
- let cmp c1 c2 =
- match snd c1, snd c2 with
- | Terminal _, Terminal _ -> cmp_raw c1 c2
- | Terminal _, _ -> -1
- | _, Terminal _ -> 1
- | _, _ -> cmp_raw c1 c2 in
let res = Aux.random_elem (Aux.array_argfind_all_max cmp children) in
if !debug_level > 2 then
print_endline (Structure.str (state (snd children.(res))).Arena.struc);
@@ -75,5 +69,6 @@
let u = unfold_maximax_upto ~ab count game heur t in
if !debug_level > 0 then Printf.printf "Timeout %f%!"
(Unix.gettimeofday() -. !timeout);
- if !debug_level > 2 then print_endline (str string_of_int u);
+ if !debug_level > 1 then
+ print_endline (str ~upto:1 ~struc:false string_of_int u);
choose_move game u
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-25 20:12:20 UTC (rev 1392)
+++ trunk/Toss/Server/Server.ml 2011-03-25 22:24:30 UTC (rev 1393)
@@ -163,7 +163,7 @@
let req_handle in_ch out_ch =
try
- let time_started = Sys.time () in
+ let time_started = Unix.gettimeofday () in
let line = read_in_line in_ch in
let req = req_of_str line in
let resp =
@@ -396,14 +396,14 @@
else
let mov_msg =
if GDL.our_turn !gdl_transl !state then (
- let time_used = time_started -. Sys.time () in
+ let time_used = time_started -. Unix.gettimeofday () in
let p, ps =
match !play, !play_state with
| Some play, Some play_state ->
play, play_state
| _ -> assert false in
ignore (Unix.alarm (!playclock - (int_of_float time_used) - 1));
- Play.set_timeout (float(!playclock) -. time_used -. 0.02);
+ Play.set_timeout (float(!playclock) -. time_used -. 0.03);
if !no_gtree then
let res = Game.suggest p ps in
Game.cancel_timeout ();
@@ -431,7 +431,7 @@
^ string_of_int msg_len ^ "\r\n\r\n" ^ mov_msg
in
if !debug_level > 0 then (
- Printf.printf "Resp-time: %F\n%!" (Sys.time () -. time_started);
+ Printf.printf "Resp-time: %F\n%!" (Unix.gettimeofday() -. time_started);
print_endline ("\nRepl: " ^ resp ^ "\n");
);
output_string out_ch (resp ^ "\n");
Modified: trunk/Toss/examples/Gomoku.toss
===================================================================
--- trunk/Toss/examples/Gomoku.toss 2011-03-25 20:12:20 UTC (rev 1392)
+++ trunk/Toss/examples/Gomoku.toss 2011-03-25 22:24:30 UTC (rev 1393)
@@ -1,5 +1,5 @@
PLAYERS 1, 2
-DATA r1: circle, r2: line, adv_ratio: 4, depth: 2
+DATA r1: circle, r2: 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) =
Modified: trunk/Toss/examples/Tic-Tac-Toe.toss
===================================================================
--- trunk/Toss/examples/Tic-Tac-Toe.toss 2011-03-25 20:12:20 UTC (rev 1392)
+++ trunk/Toss/examples/Tic-Tac-Toe.toss 2011-03-25 22:24:30 UTC (rev 1393)
@@ -1,5 +1,5 @@
PLAYERS 1, 2
-DATA r1: circle, r2: line, adv_ratio: 4, depth: 3
+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)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-26 16:05:04
|
Revision: 1397
http://toss.svn.sourceforge.net/toss/?rev=1397&view=rev
Author: lukaszkaiser
Date: 2011-03-26 16:04:58 +0000 (Sat, 26 Mar 2011)
Log Message:
-----------
Timeout in solver to improve timing.
Modified Paths:
--------------
trunk/Toss/Formula/Aux.ml
trunk/Toss/Formula/Aux.mli
trunk/Toss/Play/GameTree.ml
trunk/Toss/Play/Play.ml
trunk/Toss/Server/Server.ml
trunk/Toss/Solver/Solver.ml
trunk/Toss/Solver/Solver.mli
Modified: trunk/Toss/Formula/Aux.ml
===================================================================
--- trunk/Toss/Formula/Aux.ml 2011-03-26 00:30:21 UTC (rev 1396)
+++ trunk/Toss/Formula/Aux.ml 2011-03-26 16:04:58 UTC (rev 1397)
@@ -1,6 +1,8 @@
(* Auxiliary functions that operate on standard library data
structures and standard library-like definitions. *)
+exception Timeout of string
+
type ('a,'b) choice = Left of 'a | Right of 'b
Modified: trunk/Toss/Formula/Aux.mli
===================================================================
--- trunk/Toss/Formula/Aux.mli 2011-03-26 00:30:21 UTC (rev 1396)
+++ trunk/Toss/Formula/Aux.mli 2011-03-26 16:04:58 UTC (rev 1397)
@@ -1,6 +1,8 @@
(** Auxiliary functions that operate on standard library data
structures and standard library-like definitions. *)
+exception Timeout of string
+
type ('a, 'b) choice = Left of 'a | Right of 'b
module Strings : Set.S with type elt = string
Modified: trunk/Toss/Play/GameTree.ml
===================================================================
--- trunk/Toss/Play/GameTree.ml 2011-03-26 00:30:21 UTC (rev 1396)
+++ trunk/Toss/Play/GameTree.ml 2011-03-26 16:04:58 UTC (rev 1397)
@@ -64,22 +64,32 @@
let rec unfold_abstract ?(timeout=fun () -> false) ?(depth=0) game
~info_terminal ~info_leaf ~info_node ~choice = function
| Terminal _ ->
- if !debug_level > 0 then print_endline "Terminal Unfold"; raise Not_found
+ if !debug_level > 0 then print_endline "Terminal Unfold";
+ raise Not_found
| Leaf (state, player, info) ->
- if timeout() then raise Not_found;
+ if timeout() then raise (Aux.Timeout "GameTree.unfold_abstract.leaf1");
+ Solver.M.set_timeout timeout;
let moves = Move.list_moves game state in
if moves = [||] then (
+ if timeout() then (
+ Solver.M.clear_timeout();
+ raise (Aux.Timeout "GameTree.unfold_abstract.term");
+ );
Terminal (state, player, info_terminal depth game state player info)
) else
- let leaf_of_move leaf_s =
- if timeout() then raise Not_found;
+ let leaf_of_move i leaf_s =
+ if timeout() then (
+ Solver.M.clear_timeout();
+ raise (Aux.Timeout "GameTree.unfold_abstract.lm");
+ );
let l_pl = game.Arena.graph.(leaf_s.Arena.cur_loc).Arena.player in
let l_info = info_leaf (depth+1) game leaf_s l_pl player in
Leaf (leaf_s, l_pl, l_info) in
- let children = Array.map (fun (m, s) -> (m, leaf_of_move s)) moves in
+ let children = Array.mapi (fun i (m,s) -> (m,leaf_of_move i s)) moves in
+ Solver.M.clear_timeout ();
Node (state, player,info_node depth game state player children,children)
| Node (state, player, info, children) ->
- if timeout() then raise Not_found;
+ if timeout() then raise (Aux.Timeout "GameTree.unfold_abstract.node");
let n = choice depth game state player info children in
let (move, child) = children.(n) in
let child_unfolded = unfold_abstract ~timeout:timeout ~depth:(depth+1)
@@ -178,7 +188,7 @@
let heurs = Array.mapi (fun p _ -> pval p) (node_values (snd child)) in
let is_exact_child c = node_is_exact (snd children.(c)) in
let non_leaf c = match snd children.(c) with Leaf _ -> false | _ -> true in
- let exact_nonleaf c = is_exact_child c && non_leaf c in
+ (* let exact_nonleaf c = is_exact_child c && non_leaf c in *)
{ heurs= heurs;
heurs_are_exact =
List.exists non_leaf mids || List.for_all is_exact_child mids;
Modified: trunk/Toss/Play/Play.ml
===================================================================
--- trunk/Toss/Play/Play.ml 2011-03-26 00:30:21 UTC (rev 1396)
+++ trunk/Toss/Play/Play.ml 2011-03-26 16:04:58 UTC (rev 1397)
@@ -47,17 +47,18 @@
(* Maximax unfolding upto depth. *)
let rec unfold_maximax_upto ?(ab=false) count game heur t =
- if count = 0 || timed_out () then (
- if !debug_level > 1 && timed_out() then
- print_endline "Timeout";
- t
- ) else
+ if count = 0 || timed_out () then t else
try
- if timed_out() then t else
- let u = unfold_maximax ~ab:ab game heur t in
- if !debug_level > 0 then Printf.printf "%d,%!" (size u);
- unfold_maximax_upto ~ab:ab (count-1) game heur u
- with Not_found -> t
+ let u = unfold_maximax ~ab:ab game heur t in
+ if !debug_level > 0 then Printf.printf "%d,%!" (size u);
+ unfold_maximax_upto ~ab:ab (count-1) game heur u
+ with
+ | Not_found -> t
+ | Aux.Timeout msg ->
+ if !debug_level > 0 then
+ if !debug_level > 0 then Printf.printf "Timeout %f (%s)%!"
+ (Unix.gettimeofday() -. !timeout) msg;
+ t
(* Maximax unfold upto depth and choose move. *)
let maximax_unfold_choose count game state heur =
@@ -67,8 +68,6 @@
Array.iter (fun h -> Array.iter Formula.print_real h) heur;
let t = init game state (fun _ _ _ -> 0) heur in
let u = unfold_maximax_upto ~ab count game heur t in
- if !debug_level > 0 then Printf.printf "Timeout %f%!"
- (Unix.gettimeofday() -. !timeout);
if !debug_level > 1 then
print_endline (str ~upto:1 ~struc:false string_of_int u);
choose_move game u
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-26 00:30:21 UTC (rev 1396)
+++ trunk/Toss/Server/Server.ml 2011-03-26 16:04:58 UTC (rev 1397)
@@ -403,7 +403,7 @@
play, play_state
| _ -> assert false in
ignore (Unix.alarm (!playclock - (int_of_float time_used) - 1));
- Play.set_timeout (float(!playclock) -. time_used -. 0.03);
+ Play.set_timeout (float(!playclock) -. time_used -. 0.02);
if !no_gtree then
let res = Game.suggest p ps in
Game.cancel_timeout ();
Modified: trunk/Toss/Solver/Solver.ml
===================================================================
--- trunk/Toss/Solver/Solver.ml 2011-03-26 00:30:21 UTC (rev 1396)
+++ trunk/Toss/Solver/Solver.ml 2011-03-26 16:04:58 UTC (rev 1397)
@@ -20,8 +20,11 @@
let get_cache () = (!cache_struc, Hashtbl.copy !cache_results)
let set_cache (struc, res) = cache_struc := struc; cache_results := res
-
+let timeout = ref (fun () -> false)
+let check_timeout msg =
+ if !timeout () then (timeout := (fun () -> false); raise (Aux.Timeout msg));
+
(* ----------------------- BASIC TYPE DEFINITION -------------------------- *)
type solver = {
@@ -138,6 +141,7 @@
report (List.fold_left (sum elems) Empty asets)
| Ex ([], phi) | All ([], phi) -> failwith "evaluating empty quantifier"
| Ex (vl, phi) ->
+ check_timeout "Solver.eval.Ex";
let aset_vars = AssignmentSet.assigned_vars [] aset in
let in_aset = (* FIXME; TODO; same-name quantified vars?! (tnf_fv!) *)
if List.exists (fun v -> List.mem v aset_vars) vl then
@@ -150,6 +154,7 @@
let phi_asgn = eval model elems in_aset phi in
report (join aset (project_list elems phi_asgn vl))
| All (vl, phi) ->
+ check_timeout "Solver.eval.All";
let aset_vars = AssignmentSet.assigned_vars [] aset in
let in_aset = (* FIXME; TODO; same-name quantified vars?! (tnf_fv!) *)
if List.exists (fun v -> List.mem v aset_vars) vl then
@@ -327,6 +332,7 @@
with Not_found ->
if !debug_level > 0 then print_endline ("Eval_m " ^ (str phi));
let els = Set (Elems.cardinal struc.elements, struc.elements) in
+ check_timeout "Solver.eval_m";
let asg = eval struc (ref els) Any phi in
incr eval_counter;
Hashtbl.add !cache_results phi (asg, phi_rels phi);
@@ -408,8 +414,6 @@
print_endline ("sum vars " ^ (Formula.var_list_str vl));
print_endline ("all vars " ^ (Formula.var_list_str all_vs));
);
- (* let gd = FFTNF.ff_tnf (FFSolver.promote_for struc) guard in
- let asg_gd = join asg (FFSolver.evaluate struc gd) in *)
let asg_gd = join asg (eval_cache_sentences solver struc guard) in
let tps = tuples struc.elements (List.map var_str all_vs) asg_gd in
let add_val acc tp =
@@ -469,7 +473,7 @@
check_formula phi
-(* Interface to {!SolverIntf}. *)
+(* Interface *)
module M = struct
let solver = new_solver ()
@@ -483,11 +487,9 @@
let check struc phi =
check solver ~formula:(register_formula_s struc solver phi) struc
let get_real_val re struc = get_real_val_cache solver struc re
- let formula_str phi =
- (* let phi = Hashtbl.find solver.formulas_check phi in *)
- Formula.str phi
- let real_str expr =
- Formula.real_str expr
+
+ let set_timeout t = timeout := t
+ let clear_timeout () = timeout := (fun () -> false);
end
(* module M = FFSolver.M *)
Modified: trunk/Toss/Solver/Solver.mli
===================================================================
--- trunk/Toss/Solver/Solver.mli 2011-03-26 00:30:21 UTC (rev 1396)
+++ trunk/Toss/Solver/Solver.mli 2011-03-26 16:04:58 UTC (rev 1397)
@@ -25,6 +25,11 @@
(** Get the value of a real expression without free variables. *)
val get_real_val : Formula.real_expr -> Structure.structure -> float
+
+ (** Set timeout function. *)
+ val set_timeout : (unit -> bool) -> unit
+ (** Clear timeout function. *)
+ val clear_timeout : unit -> unit
end
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-29 15:52:24
|
Revision: 1403
http://toss.svn.sourceforge.net/toss/?rev=1403&view=rev
Author: lukaszkaiser
Date: 2011-03-29 15:52:15 +0000 (Tue, 29 Mar 2011)
Log Message:
-----------
Corrections to the german website version and other very small things.
Modified Paths:
--------------
trunk/Toss/Server/Server.ml
trunk/Toss/www/Makefile
trunk/Toss/www/contact.xml
trunk/Toss/www/create.xml
trunk/Toss/www/develop.xml
trunk/Toss/www/docs.xml
trunk/Toss/www/examples.xml
trunk/Toss/www/index.xml
trunk/Toss/www/play.xml
trunk/Toss/www/upload_sourceforge.sh
Modified: trunk/Toss/Server/Server.ml
===================================================================
--- trunk/Toss/Server/Server.ml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/Server/Server.ml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -403,7 +403,7 @@
play, play_state
| _ -> assert false in
ignore (Unix.alarm (!playclock - (int_of_float time_used) - 1));
- Play.set_timeout (float(!playclock) -. time_used -. 0.02);
+ Play.set_timeout (float(!playclock) -. time_used -. 0.07);
if !no_gtree then
let res = Game.suggest p ps in
Game.cancel_timeout ();
Modified: trunk/Toss/www/Makefile
===================================================================
--- trunk/Toss/www/Makefile 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/Makefile 2011-03-29 15:52:15 UTC (rev 1403)
@@ -4,7 +4,7 @@
code_doc_link:
ln -s ../_build/Toss.docdir code_doc
- rm code_doc/Toss.docdir
+ rm -f code_doc/Toss.docdir
cp code_doc/index.html code_doc/index.html.en
cp code_doc/index.html code_doc/index.html.de
cp code_doc/index.html code_doc/index.html.pl
Modified: trunk/Toss/www/contact.xml
===================================================================
--- trunk/Toss/www/contact.xml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/contact.xml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -25,8 +25,8 @@
<section title="Email" lang="de">
<par>Toss ist ein Open-Source Projekt, wird auf
<a href="http://sourceforge.net">SourceForge</a>
- gehosted und unter der BSD Lizenz disribuiert.<br/></par>
- <par>Man kann uns unter folgener Addresse erreichen:
+ gehosted und unter der BSD Lizenz distribuiert.<br/></par>
+ <par>Man kann uns unter folgener Adresse erreichen:
<mailto address="tos...@li..."/>
</par>
</section>
@@ -115,12 +115,12 @@
</item>
<item><a href="http://www.dozingcatsoftware.com/Gridlock/">Gridlock</a>
- ist eine Sammlung von Open-Source Spielen. Es spielt nett, erlaubt
- es aber nicht das Spiel zu editieren.
+ ist eine Sammlung von Open-Source Spielen. Es spielt gut, erlaubt
+ aber nicht das Spiel zu editieren.
</item>
<item><a href="http://www.zillions-of-games.com/">Zillions of Games</a>
- ist eine Sprache für Spieldefinitionen, ein Simulator und eine grosse
+ ist eine Sprache für Spieldefinitionen, ein Simulator und eine große
Bibliothek von Spielen. Leider ist es nicht Open-Source.
</item>
@@ -219,17 +219,17 @@
<section title="Links zu Simulation- und Modellierungprogrammen" lang="de">
<itemize>
<item><a href="http://edu.kde.org/step/">Step</a>
- ist ein Open-Source Physiksimulator, teil der KDE Education Project.
- Man kann damit Systeme mit kontiuerlicher Dynamik simulieren.
+ ist ein Open-Source Physiksimulator, ein Teil des KDE Education Project.
+ Man kann damit Systeme mit kontinuierliches Dynamik simulieren.
</item>
- <item><a href="http://www.iseesystems.com/softwares/Education/StellaSoftware.aspx">STELLA</a> ist ein kommerzieller Simulationsprogramm und erlaubt
- sowohl diskrete als auch kontinuerliche Dynamik.
+ <item><a href="http://www.iseesystems.com/softwares/Education/StellaSoftware.aspx">STELLA</a> ist ein kommerzielles Simulationsprogramm und erlaubt
+ sowohl diskrete als auch kontinuierliche Dynamik.
</item>
<item><a href="http://ptolemy.eecs.berkeley.edu/">Ptolemy</a> Projekt
- erforscht Modelierung, Simulation und das Design von Nebenläufigen im
- Echtzeit laufenden eingebeteten Systeme. Es erlaubt verschiedene
+ erforscht Modellierung, Simulation und das Design von nebenläufigen in
+ Echtzeit laufenden eingebetteten Systemen. Es erlaubt verschiedene
Modelle von Berechnungen gleichzeitig zu verknüpfen und zu nutzen.
</item>
</itemize>
@@ -297,9 +297,9 @@
</itemize>
</section>
<section title="Team" lang="de">
- <par>Toss hat angefangen während der Arbeit im
- <a href="http://www.algosyn.rwth-aachen.de/">AlgoSyn</a>
- Graduiertenkolleg. Viele haben dazu beigetragen, hier benennen wir
+ <par>Die Arbeit an Toss begann im Graduiertenkolleg
+ <a href="http://www.algosyn.rwth-aachen.de/">AlgoSyn</a>.
+ Viele haben dazu beigetragen, hier benennen wir
nur einige Mitwirkende. Zur Zeit programmieren am meisten:</par>
<itemize>
<item>Łukasz Kaiser (<mailto address="luk...@gm..."/>)</item>
@@ -307,7 +307,7 @@
<item>Łukasz Stafiniak</item>
<item>Michał Wójcik</item>
</itemize>
- <par>Freunde die uns sehr geholfen haben.</par>
+ <par>Freunde, die uns sehr geholfen haben.</par>
<itemize>
<item>Dietmar Berwanger</item>
<item>Matko Botincan</item>
Modified: trunk/Toss/www/create.xml
===================================================================
--- trunk/Toss/www/create.xml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/create.xml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -28,7 +28,7 @@
<section title="Zwei Methoden um ein neues Spiel in Toss zu erzeugen"
lang="de">
- <par>Wenn man schon genug online gespielt hat, kann man mit den wirklichen
+ <par>Wenn man genug online gespielt hat, kann man mit dem wirklichen
Spass in Toss anfangen und ein neues Spiel erschaffen. Zwei Wege
kann man dazu nutzen.</par>
<itemize>
@@ -36,7 +36,7 @@
<item>Die .toss Files kann man auch direkt editieren.</item>
</itemize>
<par>Um kleine Änderungen zu machen oder ein einfaches Beispiel zu
- definieren kann man wohl die GUI benutzen. Um kompliziertere Spiele zu
+ definieren kann man die GUI benutzen. Um kompliziertere Spiele zu
erzeugen und ganz neue Ideen zu realisieren ist es bequemer, die .toss
Files direkt in einem Editor zu bearbeiten.</par>
</section>
@@ -86,20 +86,20 @@
several other features.<br/></par>
<par><br/><toss-video/></par>
</section>
- <section title="Spiele im Toss GUI Erzeugen" lang="de">
+ <section title="Spiele in das Toss GUI Erzeugen" lang="de">
<par>Um die Toss GUI zu starten, muss man:</par>
<itemize>
<item>Toss <em>runterladen</em> von der
<a href="http://sourceforge.net/project/showfiles.php?group_id=115606">
SourceForge Seite</a>.</item>
<item><em>Toss ausführen</em>, indem man auf <em>Toss.py</em> clickt.
- Man kann am Anfang einer der Files im <em>examples</em> Verzeichniss
+ Man kann am Anfang einer der Files im <em>examples</em> Verzeichnis
öffnen.</item>
</itemize>
- <par>Wenn die GUI schon läuft, kann man am besten den
+ <par>Wenn die GUI schon läuft, kann man am besten das
<a href="http://vimeo.com/10110495">Toss Tutorial</a> unten angucken,
- wo es gezeigt wird, wie man ein einfaches Spiel in Toss vollständig
- definiert und wo auch andere Features erklärt sind.<br/></par>
+ wo gezeigt wird, wie man ein einfaches Spiel in Toss vollständig
+ definiert und auch andere Features erklärt sind.<br/></par>
<par><br/><toss-video/></par>
</section>
<section title="Tworzenie Gier w Interfejsie Graficznym Tossa" lang="pl">
@@ -155,14 +155,14 @@
</section>
<section title="Spiele in Text Form erschaffen" lang="de">
<par>Wir glauben, dass es für kompliziertere Spiele einfacher ist,
- ein Texteditor zu benutzen als die Toss GUI immer zu starten.
+ einen Texteditor zu benutzen, als die Toss GUI jedesmal zu starten.
Um die verschiedenen Felder im .toss Files zu verstehen ist es aber
- nötig, erstmal die Grundlagen von Toss durchzuarbeiten, z.B. indem
- man das Tutorial oben durchgeht, und auch das
+ nötig erstmal die Grundlagen von Toss durchzuarbeiten, z.B. indem
+ man das Tutorial oben durchgeht, das
<a href="reference/reference.pdf">reference.pdf</a> File wenigstens
- durchzublättert, und auch die <a href="docs.html">Dokumentation</a>.
+ durchblättert und die <a href="docs.html">Dokumentation</a> liest.
Danach kann man einfach die .toss Files im Editor
- bearbeiten, Mit einer von den folgenden kann man gut anfangen.
+ bearbeiten, mit einer des folgenden kann man gut anfangen.
</par>
<itemize>
<item><a href="http://toss.svn.sourceforge.net/viewvc/toss/trunk/Toss/examples/Breakthrough.toss?revision=1349">Breakthrough</a></item>
Modified: trunk/Toss/www/develop.xml
===================================================================
--- trunk/Toss/www/develop.xml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/develop.xml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -40,17 +40,17 @@
</section>
<section title="Vorbereitung" lang="de">
<itemize>
- <item>Ausser der Interfaces ist Toss fast vollständig in
+ <item>Mit Ausnahme des Interfaces ist Toss fast vollständig in
<a href="http://caml.inria.fr/">Objective Caml</a> geschrieben.
Um an Toss zu arbeiten braucht man ein gutes Verständnis von
OCaml und eine vollständige OCaml Installation.
</item>
<item>Das <em>Build System</em> von Toss basiert auf <em>ocamlbuild</em>
und nutzt <em>Makefiles</em> um die C Teile zu kompilieren.
- Man muss diese Tools installiert haben um Toss zu bauen.
+ Man muss diese Tools installiert haben, um Toss zu bauen.
</item>
<item>Wenn man Toss unter Ubuntu kompilieren möchte, braucht man
- Pakette, die mit folgender Zeile installiert werden können.<br/>
+ Pakete, die mit folgender Zeile installiert werden können.<br/>
sudo apt-get install g++ python-qt4 python-dev pyqt4-dev-tools
ocaml-findlib menhir libounit-ocaml-dev libapache2-mod-python
sqlite3 python-pysqlite2
@@ -60,7 +60,7 @@
SVN Repository</a> zum <em>Toss</em> Verzeichnis auszuchecken.<br/>
svn co https://toss.svn.sourceforge.net/svnroot/toss/trunk/Toss Toss
</item>
- <item>Im Toss Verzeichnis führe <em>make</em> aus und überprüfe,
+ <item>Führe <em>make</em> aus im Toss Verzeichnis und überprüfe,
dass es erfolgreich funktioniert hat.</item>
</itemize>
</section>
@@ -134,11 +134,11 @@
</section>
<section title="Toss Verstehen" lang="de">
<itemize>
- <item><a href="create.html">Erzeuge</a> wenigstens ein einfaches Spiel
- mit Toss um die Grundlagen zu verstehen.</item>
+ <item><a href="create.html">Erzeuge</a> mindestens ein einfaches Spiel
+ mit Toss, um die Grundlagen zu verstehen.</item>
<item>Lese die <a href="docs.html">Dokumentation</a> von Toss.
</item>
- <item>Vergesse nicht die <a href="reference/reference.pdf">
+ <item>Vergiss nicht die <a href="reference/reference.pdf">
Reference.pdf</a> durchzublättern.</item>
<item>Wenn man Toss programmiert, ist die
<a href="code_doc/">Quellcode Dokumentation</a> oft nützlich.</item>
@@ -194,11 +194,11 @@
</itemize>
</section>
<section title="Mit Toss Team Zusammenarbeiten" lang="de">
- <par>Wenn du eine Idee für Toss hast, ein Vorschlag, eine Anfrage,
+ <par>Wenn du eine Idee für Toss hast, einen Vorschlag, eine Anfrage,
wenn du Toss programmieren möchtest oder einfach mit uns reden,
- schreibe uns! Die angagiertesten Toss Developer beantworten
- täglich Fragen über Toss auch auf privaten Emails (unten), aber es ist
- am besten an <em>toss-devel</em> zu schreiben.</par>
+ schreibe uns! Die engagiertesten Toss Developer beantworten
+ täglich Fragen über Toss auch auf privaten Emails (unten), aber
+ es ist am besten an <em>toss-devel</em> zu schreiben.</par>
<itemize>
<item>Toss Mailingliste:
<mailto address="tos...@li..."/></item>
Modified: trunk/Toss/www/docs.xml
===================================================================
--- trunk/Toss/www/docs.xml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/docs.xml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -19,9 +19,9 @@
<par><br/><toss-video/></par>
</section>
<section title="Toss Benutzen" lang="de">
- <par>Um zu lehrnen wie man Toss benutzt um neue Spiele zu erschaffen,
+ <par>Um zu lernen, wie man Toss benutzt um neue Spiele zu erschaffen,
besuche die <a href="create.html">Neue Spiele Erzeugen</a> Seite oder
- fange schnell an mit dem Video Tutorial unten.<br/></par>
+ fange mit dem Video Tutorial unten an.<br/></par>
<par><br/><toss-video/></par>
</section>
<section title="Używanie Tossa" lang="pl">
@@ -48,13 +48,13 @@
for fast fact-checking.</par>
</section>
<section title="Referenz" lang="de">
- <par>"Toss Design and Specification" ist ein oft erneuerter Dokument
- in dem wir versuchen, ein Übersicht über die mathematische Grundlagen
- von Toss und die Hauptideen der Algorithmen die wir implementiert haben
- zu geben. Es ist am besten als
+ <par><em>Toss Design and Specification</em> ist ein ständig aktuliesiertes
+ Dokument, in dem wir versuchen, eine Übersicht über die mathematische
+ Grundlagen von Toss und die Hauptideen der Algorithmen, die wir
+ implementiert haben, zu geben. Es ist am besten als
<a href="reference/reference.pdf">reference.pdf</a> zu lesen, aber
- eine <a href="reference/">html Version</a> mit niedriegerer Qualität
- steht auch zur Verfügung falls man etwas ganz schnell finden muss.</par>
+ eine <a href="reference/">html Version</a> mit niedrigerer Qualität
+ steht auch zur Verfügung, falls man etwas ganz schnell finden muss.</par>
</section>
<section title="Opis" lang="pl">
<par>"Toss Design and Specification" to ciągle zmieniający się dokument,
@@ -84,8 +84,8 @@
Wir erzeugen <a href="code_doc/">Quellcode Dokumentation</a> von
Kommentaren mit Hilfe von
<a href="http://caml.inria.fr/pub/docs/manual-ocaml/manual029.html">
- ocamldoc</a>. Es ist die aktuellste Information über Toss Quellcode,
- die Modulen und deren Zussamenhänge.</section>
+ ocamldoc</a>. Es ist die aktuellste Information über den Toss Quellcode,
+ die Module und deren Zusammenhänge.</section>
<section title="Dokumentacja Kodu" lang="pl">
<a href="code_doc/">Dokumentację z komentarzy w kodzie</a> generujemy
przy pomocy
@@ -130,32 +130,35 @@
</itemize>
</section>
+
<section title="Mathematische Grundlagen von Toss" lang="de">
- <par>Um mehr über Toss zu erfahren, folge diese Links.</par>
+ <par>Um mehr über Toss zu erfahren, folge diesen Links.</par>
<itemize>
- <item><em>Eine kompakte Darstellung</em> der mathematischen Modell hinter
- Toss findet man in <a href="pub/playing_structure_rewriting_games.pdf">
+ <item><em>Eine kompakte Darstellung</em> des mathematischen Modells auf
+ dem Toss basiert findet man in
+ <a href="pub/playing_structure_rewriting_games.pdf">
Playing Structure Rewriting Games</a>.
</item>
- <item><em>Komplexität</em> einer syntaktischen Fragment of Toss wurde
- in dem Paper <a href="pub/graph_games_short.pdf">
+ <item><em>Die Komplexität</em> eines syntaktischen Fragments von Toss
+ wurde in dem Paper <a href="pub/graph_games_short.pdf">
Synthesis for Structure Rewriting Systems</a> analysiert.
</item>
- <item><em>Eine Presentation</em> über die Mathematik von Toss wurde bei
- <em>IIT Kanpur</em> gegeben und man kann sie
+ <item><em>Eine Präsentation</em> über die Mathematik von Toss wurde bei
+ <em>IIT Kanpur</em> gegeben und kann
<a href="http://www2.cse.iitk.ac.in/~fsttcs/2009/videos/star/LukaszKaiser.avi">
- online sehen</a>.
+ online angeschaut werden</a>.
</item>
- <item><em>Eine kürzere Presentation</em> über Toss als AI Programm wurde
- bei <em>AGI 2010</em> gegeben und man kann die auch
- <a href="http://www.vimeo.com/15326245">online sehen</a>.
+ <item><em>Eine kürzere Präsentation</em> über Toss als AI Programm wurde
+ bei <em>AGI 2010</em> gegeben und kann ebenfalls
+ <a href="http://www.vimeo.com/15326245">online angeschaut werden</a>.
</item>
</itemize>
</section>
+
<section title="Matematyczne Podstawy Tossa" lang="pl">
<par>Matematyczne podstawy Tossa są bardzo bogate. Poniższe linki
pozwalają zapoznać się z częścią z nich.</par>
Modified: trunk/Toss/www/examples.xml
===================================================================
--- trunk/Toss/www/examples.xml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/examples.xml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -29,9 +29,9 @@
</section>
<section title="Drei Gewinnt (Tic-Tac-Toe)" lang="de">
<par>Tic-Tac-Toe ist das einfachste Spiel in Toss.
- Die Spieler müssen nur die P und Q Prädikate an leere Positionen
- plazieren und die Gewinnbedingug ist durch eine einfache Formel gegeben.
- Man kann in Toss auch auf <i>Hint</i> klicken um ein Hinweis zu
+ Die Spieler müssen nur die Prädikate P und Q an leere Positionen
+ plazieren, die Gewinnbedingung ist durch eine einfache Formel gegeben.
+ Man kann in Toss auch auf <i>Hint</i> klicken, um ein Hinweis zu
bekommen.</par>
<itemize>
<item><em>(1) Tic Tac Toe.</em>
@@ -84,7 +84,7 @@
<image src="breakthrough_screen_small.png" /></a>
</section>
<section title="Einfache Brettspiele" lang="de">
- <par>Hier geben wir einige andere Beispiele von Brettspiele,
+ <par>Hier geben wir einige andere Beispiele von Brettspielen an,
die man leicht in Toss GUI erschaffen kann.</par>
<itemize>
<item><em>(2) Gomoku.</em>
Modified: trunk/Toss/www/index.xml
===================================================================
--- trunk/Toss/www/index.xml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/index.xml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -22,11 +22,11 @@
<section title="Über Toss" lang="de">
<par><em>Toss</em> erlaubt es, Spiele zu erzeugen, zu analysieren
- und zu spielen. Dank einem allgeminen Algorithmus ist es möglich,
- ein Spiel zu Bauen und direkt gegen dem Computer zu spielen.
- Hast du schon mal gewundert, wie man Schach spielt wenn die Brettmitte
- fehlt? Experimentiere mit deine Spielideen und trete
- gegen deine Freunde online an!
+ und zu spielen. Dank eines allgemeinen Algorithmus ist es möglich,
+ ein Spiel zu bauen und direkt gegen das Computer zu spielen. Hast
+ du Dich schon mal gefragt, wie man Schach spielt wenn die Brettmitte
+ fehlt? Experimentiere mit Deinen Spielideen und trete
+ gegen Deine Freunde online an!
</par>
</section>
@@ -76,9 +76,9 @@
<section title="Neue Spiele Erzeugen" lang="de">
<par>Das <a href="http://vimeo.com/10110495">Toss Tutorial</a> unten
- zeigt, wie man in Toss ein einfaches Spiel definieren kann, und es
+ zeigt, wie man in Toss ein einfaches Spiel definieren kann, und
erklärt auch einige andere Features von Toss. Mit Toss ist es möglich,
- deine Spielideen zu realisieren! Lehrne wie man mit Toss neue
+ Deine Spielideen zu realisieren! Lerne wie man mit Toss neue
<a href="create.html">Spiele erzeugt.</a>
<br/></par>
<par><br/><toss-video/></par>
@@ -131,30 +131,30 @@
<section title="Eigenschaften von Toss" lang="de">
- <par>Die Spiele in Toss sind durch relationale Strukturen definiert,
- und die Züge durch Graphersetzungregeln. Das Ergebniss eines Spiels
- wird durch Formeln der monadischer Logik zweiter Stufe definiert, die
- in Toss mit Zählquantoren erweitert ist, um reele Werte zu liefern.</par>
+ <par>Die Spiele in Toss sind durch relationale Strukturen definiert
+ und die Züge durch Graphersetzungsregeln. Das Ergebnis eines Spiels
+ wird durch Formeln der monadischen Logik zweiter Stufe definiert, die
+ in Toss mit Zählquantoren erweitert ist, um reelle Werte zu liefern.</par>
<itemize>
- <item><em>Strukturen</em> in Toss können beliebiege Relationen beinhalten
- und dazu noch zusätzliche Funktionen mir reelen Werte.</item>
- <item><em>Ersetzungsregeln</em> werden ausgeführt indem die Struktur
+ <item><em>Strukturen</em> in Toss können beliebige Relationen beinhalten
+ und zusätzlich Funktionen mit reellen Werten.</item>
+ <item><em>Ersetzungsregeln</em> werden ausgeführt, indem die Struktur
auf der linken Seite mit der Hauptstruktur gematcht wird und danach
- mit der auf der rechten Seite ersetzt wird.</item>
- <item><em>Kontinuerliche dynamik</em> kann durch ein ODE System
+ durch die Struktur auf der rechten Seite ersetzt wird.</item>
+ <item><em>Kontinuerliche Dynamik</em> kann durch ein ODE-System
eingegeben werden. Das erlaubt die Simulation von Bewegung und
- andere physykalischen Eigenschaften der Objekte.</item>
+ anderen physikalischen Eigenschaften der Objekte.</item>
<item><em>Zusätzliche Bedingungen</em> können die Ersetzungsregeln
- beschränken. Dazu gehören Prekonditionen, Invarianten, und
- Postkonditionen.</item>
+ einschränken. Dazu gehören Vorbedingungen, Invarianten, und
+ Nachbedingungen.</item>
<item><em>Logik</em> wird benutzt, um die Bedingungen und die Ergebnisse
zu definieren. In Toss ist die vollständige monadische Logik zweiter
Stufe implementiert, mit zusätzlichen Zählquantoren.</item>
- <item><em>Der Solver</em> in Toss ist stark optimiert. Es eliminiert
+ <item><em>Der Solver</em> in Toss ist stark optimiert. Er eliminiert
die Quantoren wenn möglich und dekomponiert die Formel
(mit Hilfe von <a href="http://minisat.se/">MiniSat</a>).</item>
<item><em>Hinweise</em> können dadurch allgemein in allen Spielen
- gegeben werden, der Zugauswahl passiert durch UCT oder Maximax.</item>
+ gegeben werden, die Zugauswahl passiert durch UCT oder Maximax.</item>
</itemize>
</section>
@@ -249,31 +249,32 @@
</section>
<section title="Mathematische Grundlagen von Toss" lang="de">
- <par>Um mehr über Toss zu erfahren, folge diese Links.</par>
+ <par>Um mehr über Toss zu erfahren, folge diesen Links.</par>
<itemize>
- <item><em>Eine kompakte Darstellung</em> der mathematischen Modell hinter
- Toss findet man in <a href="pub/playing_structure_rewriting_games.pdf">
+ <item><em>Eine kompakte Darstellung</em> des mathematischen Modells auf
+ dem Toss basiert findet man in
+ <a href="pub/playing_structure_rewriting_games.pdf">
Playing Structure Rewriting Games</a>.
</item>
- <item><em>Design und Specifikation</em> von Toss sind im
+ <item><em>Das Design und die Specifikation</em> von Toss sind in
<a href="reference/reference.pdf">reference.pdf</a> beschrieben.
</item>
- <item><em>Komplexität</em> einer syntaktischen Fragment of Toss wurde
- in dem Paper <a href="pub/graph_games_short.pdf">
+ <item><em>Die Komplexität</em> eines syntaktischen Fragments von Toss
+ wurde in dem Paper <a href="pub/graph_games_short.pdf">
Synthesis for Structure Rewriting Systems</a> analysiert.
</item>
- <item><em>Eine Presentation</em> über die Mathematik von Toss wurde bei
- <em>IIT Kanpur</em> gegeben und man kann sie
+ <item><em>Eine Präsentation</em> über die Mathematik von Toss wurde bei
+ <em>IIT Kanpur</em> gegeben und kann
<a href="http://www2.cse.iitk.ac.in/~fsttcs/2009/videos/star/LukaszKaiser.avi">
- online sehen</a>.
+ online angeschaut werden</a>.
</item>
- <item><em>Eine kürzere Presentation</em> über Toss als AI Programm wurde
- bei <em>AGI 2010</em> gegeben und man kann die auch
- <a href="http://www.vimeo.com/15326245">online sehen</a>.
+ <item><em>Eine kürzere Präsentation</em> über Toss als AI Programm wurde
+ bei <em>AGI 2010</em> gegeben und kann ebenfalls
+ <a href="http://www.vimeo.com/15326245">online angeschaut werden</a>.
</item>
</itemize>
</section>
Modified: trunk/Toss/www/play.xml
===================================================================
--- trunk/Toss/www/play.xml 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/play.xml 2011-03-29 15:52:15 UTC (rev 1403)
@@ -30,20 +30,20 @@
</section>
<section title="Allgemeines Spielen (General Game Playing)" lang="de">
<a href="http://en.wikipedia.org/wiki/General_Game_Playing">General
- Game Playing</a>, kurz GGP, fördert von einem Computer dass er
+ Game Playing</a>, kurz GGP, fordert von einem Computer, dass er
ein vorher unbekanntes Spiel spielt. Es ist ein stark wachsendes KI Feld
- mit Wissenschaftler bei <a href="http://games.stanford.edu/">Stanford</a>
- und in <a href="http://www.general-game-playing.de/">Deutschland</a>.
- Programme, die Spiele in GDL-Format spielen können kann man auf dem
+ mit Wissenschaftlern in <a href="http://games.stanford.edu/">Stanford</a>
+ und <a href="http://www.general-game-playing.de/">Deutschland</a>.
+ Programme, die Spiele in GDL-Format spielen können, kann man auf dem
<a href="http://euklid.inf.tu-dresden.de:8180/ggpserver/">
Dresden GGP Server</a> gegeneinander spielen lassen, und Toss hat
- da letztens auch einiger Erfolgreiche Partien gespielt.
+ da in letzter Zeit auch einige erfolgreiche Partien gespielt.
<br/>
Spiele im GDL-Format lassen sich nicht direkt Online darstellen, aber
das <a href="http://code.google.com/p/ggp-galaxy/">GGP Galaxy Project</a>
- hat letztens angefangen zu versuchen, dieses Problem zu beseitigen.
+ hat vor kurzem angefangen zu versuchen, dieses Problem zu beseitigen.
Die Spiele im Toss-Format kann man dagegen direkt Online ansehen und
- spielen. Darunter zeigen wir einige Spiele von Toss gegen Fluxplayer.
+ spielen. Unten zeigen wir einige Spiele von Toss gegen Fluxplayer.
</section>
<section title="Ogólne Programy do Gier (General Game Playing)" lang="pl">
<a href="http://en.wikipedia.org/wiki/General_Game_Playing">General
Modified: trunk/Toss/www/upload_sourceforge.sh
===================================================================
--- trunk/Toss/www/upload_sourceforge.sh 2011-03-28 09:37:24 UTC (rev 1402)
+++ trunk/Toss/www/upload_sourceforge.sh 2011-03-29 15:52:15 UTC (rev 1403)
@@ -1,6 +1,6 @@
#!/bin/bash
-#scp index.html.en $1,To...@we...:htdocs/index.html
-#scp -C *.html.* $1,To...@we...:htdocs/
+scp index.html.en $1,To...@we...:htdocs/index.html
+scp -C *.html.* $1,To...@we...:htdocs/
scp -C Publications/*.html.* $1,To...@we...:htdocs/Publications/
scp -C styles/* $1,To...@we...:htdocs/styles/
scp -C scripts/* $1,To...@we...:htdocs/scripts/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <luk...@us...> - 2011-03-29 17:16:16
|
Revision: 1404
http://toss.svn.sourceforge.net/toss/?rev=1404&view=rev
Author: lukaszkaiser
Date: 2011-03-29 17:16:10 +0000 (Tue, 29 Mar 2011)
Log Message:
-----------
Very small build corrections.
Modified Paths:
--------------
trunk/Toss/Makefile
trunk/Toss/www/reference/.cvsignore
Property Changed:
----------------
trunk/Toss/www/reference/
Modified: trunk/Toss/Makefile
===================================================================
--- trunk/Toss/Makefile 2011-03-29 15:52:15 UTC (rev 1403)
+++ trunk/Toss/Makefile 2011-03-29 17:16:10 UTC (rev 1404)
@@ -12,6 +12,7 @@
Language/*~ Server/*~ Client/*~ www/*~ WebClient/~
make -C www/reference
make -C www
+ make -C .
mkdir ../toss_$(RELEASE)
cp -r * ../toss_$(RELEASE)
mv ../toss_$(RELEASE) .
Property changes on: trunk/Toss/www/reference
___________________________________________________________________
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 .
*.html
*.html.de
*.html.en
*.png
*.css
reference.pdf
*.ps
*.dvi
*.aux
*.out
*.log
*.bbl
*.blg
*.idx
*.thm
*.snm
*.nav
*.toc
*.flc
*~
+ # 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 .
*.html
*.html.de
*.html.en
*.html.fr
*.html.pl
*.png
*.css
reference.pdf
*.ps
*.dvi
*.aux
*.out
*.log
*.bbl
*.blg
*.idx
*.thm
*.snm
*.nav
*.toc
*.flc
*~
Modified: trunk/Toss/www/reference/.cvsignore
===================================================================
--- trunk/Toss/www/reference/.cvsignore 2011-03-29 15:52:15 UTC (rev 1403)
+++ trunk/Toss/www/reference/.cvsignore 2011-03-29 17:16:10 UTC (rev 1404)
@@ -5,6 +5,8 @@
*.html
*.html.de
*.html.en
+*.html.fr
+*.html.pl
*.png
*.css
reference.pdf
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|