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 = |