src/Tools/isac/MathEngBasic/model-def.sml
changeset 60762 f10bbfb2b3bb
parent 60760 3b173806efe2
child 60763 2121f1a39a64
equal deleted inserted replaced
60761:c3a97132157f 60762:f10bbfb2b3bb
    47   val i_model_empty : i_model_single
    47   val i_model_empty : i_model_single
    48   val i_model_empty_TEST: i_model_single_TEST
    48   val i_model_empty_TEST: i_model_single_TEST
    49 
    49 
    50   val member_vnt: variants -> variant -> bool
    50   val member_vnt: variants -> variant -> bool
    51   val max_variants: o_model -> i_model_TEST -> variants
    51   val max_variants: o_model -> i_model_TEST -> variants
    52   val max_variant_TEST: i_model_TEST -> variant
       
    53 
    52 
    54 (*from isac_test for Minisubpbl*)
    53 (*from isac_test for Minisubpbl*)
    55   val all_variants: ('a * variants * 'c * 'd * 'e) list -> variants
    54   val all_variants: ('a * variants * 'c * 'd * 'e) list -> variants
    56   val filter_variants': i_model_TEST -> variant -> i_model_TEST
    55   val filter_variants': i_model_TEST -> variant -> i_model_TEST
    57   val cnt_corrects: i_model_TEST -> int
    56   val cnt_corrects: i_model_TEST -> int
   143   map (fn (_, variants, _, _, _) => variants) model
   142   map (fn (_, variants, _, _, _) => variants) model
   144   |> flat
   143   |> flat
   145   |> distinct op =
   144   |> distinct op =
   146 fun filter_variants' i_singles n = 
   145 fun filter_variants' i_singles n = 
   147   filter (fn (_, variants, _, _, _) => member op= variants n) i_singles
   146   filter (fn (_, variants, _, _, _) => member op= variants n) i_singles
       
   147 
       
   148 (*OLD*)
       
   149 (*---*)
       
   150 fun some_input (Cor_TEST _) = true
       
   151   | some_input (Inc_TEST (_, _::_)) = true
       
   152   | some_input (Syn_TEST _) = true
       
   153   | some_input _ = false
       
   154 (*NEW*)
       
   155 
       
   156 (*OLD*)
   148 fun cnt_corrects i_model = 
   157 fun cnt_corrects i_model = 
   149   fold (curry op +) (map (fn (_, _, _, _, (Cor_TEST _, _)) => 1 | _ => 0) i_model) 0;
   158   fold (curry op +) (map (fn (_, _, _, _, (Cor_TEST _, _)) => 1 | _ => 0) i_model) 0;
       
   159 (*---*)
       
   160 fun cnt_corrects i_model = 
       
   161   fold (curry op +) (map (fn (_, _, _, _, (feedb, _)) =>
       
   162     if some_input feedb then 1 else 0) i_model) 0;
       
   163 (*NEW*)
   150 fun arrange_args [] _ = []
   164 fun arrange_args [] _ = []
   151   | arrange_args (sum :: ss) (cnt, all) = (sum, nth cnt all) :: (arrange_args ss (cnt + 1, all)) 
   165   | arrange_args (sum :: ss) (cnt, all) = (sum, nth cnt all) :: (arrange_args ss (cnt + 1, all)) 
   152 
   166 
   153 (*for cases with only one i_model *)
       
   154 (*TODO: with vvv--- and vvv- max_variants replace Pre_Conds.max_variant *)
       
   155 fun max_variant_TEST i_model =
       
   156     let
       
   157       val all_variants =
       
   158           map (fn (_, variants, _, _, _) => variants) i_model
       
   159           |> flat
       
   160           |> distinct op =
       
   161       val variants_separated = map (filter_variants' i_model) all_variants
       
   162       val sums_corr = map (cnt_corrects) variants_separated
       
   163       val sum_variant_s = arrange_args sums_corr (1, all_variants)
       
   164 
       
   165       val max_first = rev (sort (fn ((i, _), (j, _)) => int_ord (i, j)) sum_variant_s)
       
   166       val maxes = filter (fn (cnt, _) => curry op = (fst (hd max_first)) cnt) max_first
       
   167         |> map snd
       
   168     in
       
   169       hd maxes
       
   170     end
       
   171 (*in case of i_model max_variants = [] we take of o_model all_variants *)
   167 (*in case of i_model max_variants = [] we take of o_model all_variants *)
       
   168 (*
       
   169   reconsider design:
       
   170   ?a? take all_variants from o_model and consider feedback only in i_model
       
   171   ?b? only consider non-empty items
       
   172   ?c? start with met_patt; pbl_patt only for Problem.is_complete
       
   173 *)
   172 fun max_variants o_model i_model =
   174 fun max_variants o_model i_model =
   173     let
   175   let
   174       val all_variants =
   176 (*OLD*)
   175           map (fn (_, variants, _, _, _) => variants) i_model
   177     val all_variants =
   176           |> flat
   178         map (fn (_, variants, _, _, _) => variants) i_model
   177           |> distinct op =
   179         |> flat
   178       val variants_separated = map (filter_variants' i_model) all_variants
   180         |> distinct op =
   179       val sums_corr = map (cnt_corrects) variants_separated
   181 (*---* )
   180       val sum_variant_s = arrange_args sums_corr (1, all_variants)
   182     val all_variants = (*we do not count empty items (not yet input)*)
   181 
   183         map (fn (_, _, _, _, (Inc_TEST (_, []), _)) => []
   182       val max_first = rev (sort (fn ((i, _), (j, _)) => int_ord (i, j)) sum_variant_s)
   184           | (_, variants, _, _, _) => variants) i_model
   183       val maxes = filter (fn (cnt, _) => curry op = (fst (hd max_first)) cnt) max_first
   185       |> flat
   184         |> map snd
   186       |> distinct op =
   185     in
   187 ( *NEW*)
   186       if maxes = []
   188     val variants_separated = map (filter_variants' i_model) all_variants
   187       then map (fn (_, variants, _, _, _) => variants) o_model
   189     val sums_corr = map (cnt_corrects) variants_separated
   188           |> flat
   190     val sum_variant_s = arrange_args sums_corr (1, all_variants)
   189           |> distinct op =
   191 
   190       else maxes
   192     val max_first = rev (sort (fn ((i, _), (j, _)) => int_ord (i, j)) sum_variant_s)
   191     end
   193     val maxes = filter (fn (cnt, _) => curry op = (fst (hd max_first)) cnt) max_first
       
   194       |> map snd
       
   195   in
       
   196     if maxes = []
       
   197     then map (fn (_, variants, _, _, _) => variants) o_model
       
   198         |> flat
       
   199         |> distinct op =
       
   200     else maxes
       
   201   end
   192 
   202 
   193 
   203 
   194 (** definitions for O_Model.T **)
   204 (** definitions for O_Model.T **)
   195 
   205 
   196 type o_model_single =
   206 type o_model_single =