src/Tools/Metis/src/Waiting.sml
author blanchet
Thu, 16 Sep 2010 07:30:15 +0200
changeset 39444 beabb8443ee4
parent 39443 e330437cd22a
child 39501 aaa7078fff55
permissions -rw-r--r--
MIT license -> BSD License
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                                                *)
39444
beabb8443ee4 MIT license -> BSD License
blanchet
parents: 39443
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,...} =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
          map (fn (w,(_,cl)) => (w, Clause.id cl, cl)) (Heap.toList clauses))
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
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
val mkModelClauses = map mkModelClause;
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 =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
    if null cls then K ()
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
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   198
      val dist = dist + Math.ln (Real.fromInt (length cls))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   199
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   200
      fun addCl ((mcl,cl),acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   201
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   202
            val weight = clauseWeight parameters models dist mcl cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   203
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   204
            Heap.add acc (weight,(dist,cl))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   205
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   206
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   207
      val clauses = List.foldl addCl clauses (zip mcls cls)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
      val () = perturbModels modelParameters models mcls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
      Waiting {parameters = parameters, clauses = clauses, models = models}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
fun add waiting (_,[]) = waiting
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   215
  | add waiting (dist,cls) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   216
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   217
(*MetisTrace3
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   218
      val () = Print.trace pp "Waiting.add: waiting" waiting
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   219
      val () = Print.trace (Print.ppList Clause.pp) "Waiting.add: cls" cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   222
      val waiting = add' waiting dist (mkModelClauses cls) cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   223
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   224
(*MetisTrace3
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   225
      val () = Print.trace pp "Waiting.add: waiting" waiting
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   227
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   228
      waiting
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   229
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   230
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   231
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
  fun cmp ((w1,_),(w2,_)) = Real.compare (w1,w2);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   234
  fun empty parameters axioms conjecture =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   236
        val {models = modelParameters, ...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   237
        val clauses = Heap.new cmp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   238
        and models = map (initialModel axioms conjecture) modelParameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
        Waiting {parameters = parameters, clauses = clauses, models = models}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
  fun new 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 mAxioms = mkModelClauses axioms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
        and mConjecture = mkModelClauses conjecture
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   247
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   248
        val waiting = empty parameters mAxioms mConjecture
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   249
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
        add' waiting 0.0 (mAxioms @ mConjecture) (axioms @ conjecture)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   251
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   252
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   253
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   254
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   255
(* Removing the lightest clause.                                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   256
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
fun remove (Waiting {parameters,clauses,models}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   259
    if Heap.null clauses then NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   260
    else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   261
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   262
        val ((_,dcl),clauses) = Heap.remove clauses
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   263
        val waiting =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   264
            Waiting
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   265
              {parameters = parameters, clauses = clauses, models = models}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   266
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   267
        SOME (dcl,waiting)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   268
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   269
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
end