src/Tools/Metis/src/Waiting.sml
author wenzelm
Sat, 07 Apr 2012 16:41:59 +0200
changeset 47389 e8552cba702d
parent 42102 fcfd07f122d4
child 72004 913162a47d9f
permissions -rw-r--r--
explicit checks stable_finished_theory/stable_command allow parallel asynchronous command transactions; tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     1
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     2
(* THE WAITING SET OF CLAUSES                                                *)
39502
cffceed8e7fa fix license
blanchet
parents: 39501
diff changeset
     3
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     4
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     6
structure Waiting :> Waiting =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     7
struct
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     8
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     9
open Useful;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    10
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    11
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    12
(* A type of waiting sets of clauses.                                        *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    13
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    14
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    15
type weight = real;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
type modelParameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
     {model : Model.parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
      initialPerturbations : int,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
      maxChecks : int option,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
      perturbations : int,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
      weight : weight}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
type parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
     {symbolsWeight : weight,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
      variablesWeight : weight,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
      literalsWeight : weight,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
      models : modelParameters list};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
type distance = real;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
datatype waiting =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    33
    Waiting of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    34
      {parameters : parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
       clauses : (weight * (distance * Clause.clause)) Heap.heap,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
       models : Model.model list};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
(* Basic operations.                                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
val defaultModels : modelParameters list =
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39407
diff changeset
    43
    [{model = Model.default,
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
      initialPerturbations = 100,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
      maxChecks = SOME 20,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
      perturbations = 0,
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39407
diff changeset
    47
      weight = 1.0}];
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
val default : parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
     {symbolsWeight = 1.0,
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39407
diff changeset
    51
      literalsWeight = 1.0,
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39407
diff changeset
    52
      variablesWeight = 1.0,
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
      models = defaultModels};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
fun size (Waiting {clauses,...}) = Heap.size clauses;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
val pp =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
    Print.ppMap
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
      (fn w => "Waiting{" ^ Int.toString (size w) ^ "}")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    60
      Print.ppString;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
val pp =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
    Print.ppMap
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    65
      (fn Waiting {clauses,...} =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    66
          List.map (fn (w,(_,cl)) => (w, Clause.id cl, cl)) (Heap.toList clauses))
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
      (Print.ppList (Print.ppTriple Print.ppReal Print.ppInt Clause.pp));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
(* Perturbing the models.                                                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
type modelClause = NameSet.set * Thm.clause;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
fun mkModelClause cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
      val lits = Clause.literals cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
      val fvs = LiteralSet.freeVars lits
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
      (fvs,lits)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    84
val mkModelClauses = List.map mkModelClause;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
fun perturbModel M cls =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    87
    if List.null cls then K ()
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
    else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
        val N = {size = Model.size M}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
        fun perturbClause (fv,cl) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
              val V = Model.randomValuation N fv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
              if Model.interpretClause M V cl then ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
              else Model.perturbClause M V cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
        fun perturbClauses () = app perturbClause cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
        fn n => funpow n perturbClauses ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
fun initialModel axioms conjecture parm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
      val {model,initialPerturbations,...} : modelParameters = parm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
      val m = Model.new model
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
      val () = perturbModel m conjecture initialPerturbations
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
      val () = perturbModel m axioms initialPerturbations
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
      m
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   114
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   115
fun checkModels parms models (fv,cl) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   116
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
      fun check ((parm,model),z) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
            val {maxChecks,weight,...} : modelParameters = parm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
            val n = {maxChecks = maxChecks}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   121
            val {T,F} = Model.check Model.interpretClause n model fv cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   122
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   123
            Math.pow (1.0 + Real.fromInt T / Real.fromInt (T + F), weight) * z
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   124
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   125
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
      List.foldl check 1.0 (zip parms models)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   127
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   128
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
fun perturbModels parms models cls =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
      fun perturb (parm,model) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   132
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
            val {perturbations,...} : modelParameters = parm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   135
            perturbModel model cls perturbations
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   136
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
      app perturb (zip parms models)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   140
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   141
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   142
(* Clause weights.                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
  fun clauseSymbols cl = Real.fromInt (LiteralSet.typedSymbols cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   148
  fun clauseVariables cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
      Real.fromInt (NameSet.size (LiteralSet.freeVars cl) + 1);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
  fun clauseLiterals cl = Real.fromInt (LiteralSet.size cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   152
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
  fun clausePriority cl = 1e~12 * Real.fromInt (Clause.id cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
  fun clauseWeight (parm : parameters) mods dist mcl cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   157
(*MetisTrace3
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   158
        val () = Print.trace Clause.pp "Waiting.clauseWeight: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
        val {symbolsWeight,variablesWeight,literalsWeight,models,...} = parm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   161
        val lits = Clause.literals cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   162
        val symbolsW = Math.pow (clauseSymbols lits, symbolsWeight)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   163
        val variablesW = Math.pow (clauseVariables lits, variablesWeight)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   164
        val literalsW = Math.pow (clauseLiterals lits, literalsWeight)
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39407
diff changeset
   165
        val modelsW = checkModels models mods mcl
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   166
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   167
        val () = trace ("Waiting.clauseWeight: dist = " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   168
                        Real.toString dist ^ "\n")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   169
        val () = trace ("Waiting.clauseWeight: symbolsW = " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   170
                        Real.toString symbolsW ^ "\n")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   171
        val () = trace ("Waiting.clauseWeight: variablesW = " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   172
                        Real.toString variablesW ^ "\n")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   173
        val () = trace ("Waiting.clauseWeight: literalsW = " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   174
                        Real.toString literalsW ^ "\n")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   175
        val () = trace ("Waiting.clauseWeight: modelsW = " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   176
                        Real.toString modelsW ^ "\n")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   177
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   178
        val weight = dist * symbolsW * variablesW * literalsW * modelsW
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   179
        val weight = weight + clausePriority cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   180
(*MetisTrace3
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   181
        val () = trace ("Waiting.clauseWeight: weight = " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   182
                        Real.toString weight ^ "\n")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   183
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   184
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   185
        weight
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   186
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   187
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   188
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   189
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   190
(* Adding new clauses.                                                       *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   191
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   192
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   193
fun add' waiting dist mcls cls =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   194
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   195
      val Waiting {parameters,clauses,models} = waiting
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   196
      val {models = modelParameters, ...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   197
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   198
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   199
      val _ = not (List.null cls) orelse
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   200
              raise Bug "Waiting.add': null"
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   201
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   202
      val _ = length mcls = length cls orelse
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   203
              raise Bug "Waiting.add': different lengths"
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   204
*)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   205
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   206
      val dist = dist + Math.ln (Real.fromInt (length cls))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   207
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
      fun addCl ((mcl,cl),acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
            val weight = clauseWeight parameters models dist mcl cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
            Heap.add acc (weight,(dist,cl))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   215
      val clauses = List.foldl addCl clauses (zip mcls cls)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   216
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   217
      val () = perturbModels modelParameters models mcls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   218
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   219
      Waiting {parameters = parameters, clauses = clauses, models = models}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   222
fun add waiting (dist,cls) =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   223
    if List.null cls then waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   224
    else
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   225
      let
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
(*MetisTrace3
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   227
        val () = Print.trace pp "Waiting.add: waiting" waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   228
        val () = Print.trace (Print.ppList Clause.pp) "Waiting.add: cls" cls
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   229
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   230
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   231
        val waiting = add' waiting dist (mkModelClauses cls) cls
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
(*MetisTrace3
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   234
        val () = Print.trace pp "Waiting.add: waiting" waiting
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
*)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   236
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   237
        waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   238
      end;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
  fun cmp ((w1,_),(w2,_)) = Real.compare (w1,w2);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
  fun empty parameters axioms conjecture =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   244
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   245
        val {models = modelParameters, ...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
        val clauses = Heap.new cmp
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   247
        and models = List.map (initialModel axioms conjecture) modelParameters
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   248
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   249
        Waiting {parameters = parameters, clauses = clauses, models = models}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   251
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   252
  fun new parameters {axioms,conjecture} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   253
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   254
        val mAxioms = mkModelClauses axioms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   255
        and mConjecture = mkModelClauses conjecture
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   256
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
        val waiting = empty parameters mAxioms mConjecture
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
      in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   259
        if List.null axioms andalso List.null conjecture then waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   260
        else add' waiting 0.0 (mAxioms @ mConjecture) (axioms @ conjecture)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   261
      end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   262
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   263
      handle e =>
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   264
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   265
          val () = Print.trace Print.ppException "Waiting.new: exception" e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   266
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   267
          raise e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   268
        end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   269
*)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   271
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   272
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   273
(* Removing the lightest clause.                                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   274
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   275
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   276
fun remove (Waiting {parameters,clauses,models}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   277
    if Heap.null clauses then NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   278
    else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   279
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   280
        val ((_,dcl),clauses) = Heap.remove clauses
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   281
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   282
        val waiting =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   283
            Waiting
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   284
              {parameters = parameters,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   285
               clauses = clauses,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   286
               models = models}
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   287
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   288
        SOME (dcl,waiting)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   289
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   290
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   291
end