def cell_affine_models(cell, step_sim, ntrain, ntest, tol, include_err): """cell_affine_models Parameters ---------- cell : cell step_sim : 1 time step (delta_t) simulator tol : each abs state is split further into num_splits cells in order to meet: modeling error < tol (module ntests samples) Returns ------- pwa.SubModel() Notes ------ """ # XXX: Generate different samples for each time step or reuse? # Not clear! sub_models = [] X, Y = getxy_ignoramous(cell, ntrain, step_sim) rm = RegressionModel(X, Y) X, Y = getxy_ignoramous(cell, ntest, step_sim) e_pc = rm.error_pc(X, Y) # error % if __debug__: print('error%:', e_pc) #error = np.linalg.norm(e_pc, 2) # error exceeds tol in error_dims error_dims = np.arange(len(e_pc))[np.where(e_pc >= tol)] if len(error_dims) > 0: err.warn('splitting on e%:{}, |e%|:{}'.format( e_pc, np.linalg.norm(e_pc, 2))) for split_cell in cell.split(axes=error_dims): sub_models_ = cell_affine_models( split_cell, step_sim, ntrain, ntest, tol, include_err) sub_models.extend(sub_models_) return sub_models else: #print('error%:', rm.error_pc(X, Y)) A, b = rm.Ab C, d = cell.ival_constraints.poly() e = rm.error(X, Y) if include_err else None dmap = pwa.DiscreteAffineMap(A, b, e) part = pwa.Partition(C, d, cell) sub_model = pwa.SubModel(part, dmap) if __debug__: print('----------------Finalized------------------') return [sub_model]
def cell_rel_affine_models(cell1, cell2, force, step_sim, ntrain, ntest, tol, include_err): """cell_affine_models Parameters ---------- cell1 : source cell cell2 : target cell step_sim : 1 time step (delta_t) simulator tol : each abs state is split further into num_splits cells in order to meet: modeling error < tol (module ntests samples) Returns ------- pwa.SubModel() Notes ------ """ # XXX: Generate different samples for each time step or reuse? # Not clear! sub_models = [] X, Y = getxy_rel_ignoramous(cell1, cell2, force, ntrain, step_sim) # No samples found => no model training_samples_found = len(X) != 0 if not training_samples_found: return [None] rm = RegressionModel(X, Y) X, Y = getxy_rel_ignoramous(cell1, cell2, True, ntest, step_sim) testing_samples_found = len(X) != 0 # If valid samples are found, compute e_pc (error %) and dims # where error % >= given tol if testing_samples_found: e_pc = rm.error_pc(X, Y) error_dims = np.arange(len(e_pc))[np.where(e_pc >= tol)] # Otherwise, forget it! else: e_pc = None error_dims = [] if __debug__: print('error%:', e_pc) if len(error_dims) > 0: err.warn('splitting on e%:{}, |e%|:{}'.format( e_pc, np.linalg.norm(e_pc, 2))) for split_cell1 in cell1.split(axes=error_dims): sub_models_ = cell_rel_affine_models( split_cell1, cell2, False, step_sim, ntrain, ntest, tol, include_err) sub_models.extend(sub_models_) return sub_models else: A, b = rm.Ab C1, d1 = cell1.ival_constraints.poly() C2, d2 = cell2.ival_constraints.poly() e = rm.error(X, Y) if (include_err and testing_samples_found) else None dmap = rel.DiscreteAffineMap(A, b, e) part1 = rel.Partition(C1, d1, cell1) part2 = rel.Partition(C2, d2, cell2) sub_model = rel.Relation(part1, part2, dmap) if __debug__: print('----------------Finalized------------------') return [sub_model]