public static List <PredictDictionary> FromFilters(this PredictorPredictContext ctx, List <Filter> filters, PredictionOptions?options = null) { var qd = QueryLogic.Queries.QueryDescription(ctx.Predictor.MainQuery.Query.ToQueryName()); var qr = new QueryRequest { QueryName = qd.QueryName, GroupResults = ctx.Predictor.MainQuery.GroupResults, Filters = filters, /*Filters of Main Query not considered*/ Columns = ctx.Predictor.MainQuery.Columns.Select(c => new Column(c.Token.Token, null)).ToList(), Pagination = new Pagination.All(), Orders = Enumerable.Empty <Order>().ToList(), }; var mainQueryKeys = PredictorLogic.GetParentKeys(ctx.Predictor.MainQuery); var rt = QueryLogic.Queries.ExecuteQuery(qr); var subQueryResults = ctx.Predictor.SubQueries.ToDictionaryEx(sq => sq, sqe => { List <QueryToken> parentKeys = sqe.Columns.Where(a => a.Usage == PredictorSubQueryColumnUsage.ParentKey).Select(a => a.Token.Token).ToList(); QueryDescription sqd = QueryLogic.Queries.QueryDescription(sqe.Query.ToQueryName()); Dictionary <string, string> tokenReplacements = mainQueryKeys.ZipStrict(parentKeys, (m, p) => KVP.Create(m.FullKey(), p.FullKey())).ToDictionaryEx(); Filter[] mainFilters = filters.Select(f => Replace(f, tokenReplacements, sqd)).ToArray(); List <Filter> additionalFilters = sqe.Filters.ToFilterList(); List <Column> allColumns = sqe.Columns.Select(c => new Column(c.Token.Token, null)).ToList(); var qgr = new QueryRequest { QueryName = sqe.Query.ToQueryName(), GroupResults = true, Filters = mainFilters.Concat(additionalFilters).ToList(), Columns = allColumns, Orders = new List <Order>(), Pagination = new Pagination.All(), }; ResultTable resultTable = QueryLogic.Queries.ExecuteQuery(qgr); var tuples = sqe.Columns.Zip(resultTable.Columns, (sqc, rc) => (sqc: sqc, rc: rc)).ToList(); ResultColumn[] entityGroupKey = tuples.Extract(t => t.sqc.Usage == PredictorSubQueryColumnUsage.ParentKey).Select(a => a.rc).ToArray(); ResultColumn[] remainingKeys = tuples.Extract(t => t.sqc.Usage == PredictorSubQueryColumnUsage.SplitBy).Select(a => a.rc).ToArray(); var valuesTuples = tuples; return(resultTable.Rows.AgGroupToDictionary( row => row.GetValues(entityGroupKey), gr => gr.ToDictionaryEx( row => row.GetValues(remainingKeys), row => valuesTuples.ToDictionaryEx(t => t.sqc, t => row[t.rc]), ObjectArrayComparer.Instance ) )); });
private static double Evaluate(ExecutingProcess ep, PredictorEntity p, Action <decimal?> onProgress) { PredictorLogic.TrainSync(p, onReportProgres: (str, val) => onProgress(val)); return(p.ResultValidation !.Loss.Value); }