def test_fit_multiple_trajectores(data_multiple_trajctories): x, t = data_multiple_trajctories u = [np.ones((xi.shape[0], 2)) for xi in x] model = SINDy() # Should fail if multiple_trajectories flag is not set with pytest.raises(ValueError): model.fit(x, u=u, t=t) # Should fail if either x or u is not a list with pytest.raises(ValueError): model.fit(x, u=u[0], multiple_trajectories=True) with pytest.raises(ValueError): model.fit(x[0], u=u, multiple_trajectories=True) # x and u should be lists of the same length with pytest.raises(ValueError): model.fit([x[:-1]], u=u, multiple_trajectories=True) model.fit(x, u=u, multiple_trajectories=True) check_is_fitted(model) model.fit(x, u=u, t=t, multiple_trajectories=True) assert model.score(x, u=u, t=t, multiple_trajectories=True) > 0.8 model = SINDy() model.fit(x, u=u, x_dot=x, multiple_trajectories=True) check_is_fitted(model) model = SINDy() model.fit(x, u=u, t=t, x_dot=x, multiple_trajectories=True) check_is_fitted(model)
def test_fit_multiple_trajectores(data_multiple_trajctories): x, t = data_multiple_trajctories model = SINDy() # Should fail if multiple_trajectories flag is not set with pytest.raises(ValueError): model.fit(x, t=t) model.fit(x, multiple_trajectories=True) check_is_fitted(model) model.fit(x, t=t, multiple_trajectories=True) assert model.score(x, t=t, multiple_trajectories=True) > 0.8 model = SINDy() model.fit(x, x_dot=x, multiple_trajectories=True) check_is_fitted(model) model = SINDy() model.fit(x, t=t, x_dot=x, multiple_trajectories=True) check_is_fitted(model) # Test validate_input t[0] = None with pytest.raises(ValueError): model.fit(x, t=t, multiple_trajectories=True)
def test_fit_discrete_time(data_discrete_time_c): x, u = data_discrete_time_c model = SINDy(discrete_time=True) model.fit(x, u=u) check_is_fitted(model) model = SINDy(discrete_time=True) model.fit(x[:-1], u=u[:-1], x_dot=x[1:]) check_is_fitted(model)
def test_fit_discrete_time(data_discrete_time): x = data_discrete_time model = SINDy(discrete_time=True) model.fit(x) check_is_fitted(model) model = SINDy(discrete_time=True) model.fit(x[:-1], x_dot=x[1:]) check_is_fitted(model)
def test_simulate_errors(data_lorenz): x, t = data_lorenz model = SINDy() model.fit(x, t) with pytest.raises(ValueError): model.simulate(x[0], t=1) model = SINDy(discrete_time=True) with pytest.raises(ValueError): model.simulate(x[0], t=[1, 2])
def test_simulate_errors(data_lorenz_c_1d): x, t, u, u_fun = data_lorenz_c_1d model = SINDy() model.fit(x, u=u, t=t) with pytest.raises(ValueError): model.simulate(x[0], t=1, u=u) model = SINDy(discrete_time=True) with pytest.raises(ValueError): model.simulate(x[0], t=[1, 2], u=u)
def test_differentiate(data_lorenz, data_multiple_trajctories): x, t = data_lorenz model = SINDy() model.differentiate(x, t) x, t = data_multiple_trajctories model.differentiate(x, t, multiple_trajectories=True) model = SINDy(discrete_time=True) with pytest.raises(RuntimeError): model.differentiate(x)
def test_t_default(data): x, t, u, _ = data dt = t[1] - t[0] model = SINDy() model.fit(x, u=u, t=dt) model_t_default = SINDy(t_default=dt) model_t_default.fit(x, u=u) np.testing.assert_allclose(model.coefficients(), model_t_default.coefficients()) np.testing.assert_almost_equal(model.score(x, u=u, t=dt), model_t_default.score(x, u=u))
def test_improper_shape_input(data_1d): x, t = data_1d # Ensure model successfully handles different data shapes model = SINDy() model.fit(x.flatten(), t) check_is_fitted(model) model = SINDy() model.fit(x.flatten(), t, x_dot=x.flatten()) check_is_fitted(model) model = SINDy() model.fit(x, t, x_dot=x.flatten()) check_is_fitted(model)
def test_fit_discrete_time_multiple_trajectories( data_discrete_time_multiple_trajectories, ): x = data_discrete_time_multiple_trajectories # Should fail if multiple_trajectories flag is not set model = SINDy(discrete_time=True) with pytest.raises(ValueError): model.fit(x) model.fit(x, multiple_trajectories=True) check_is_fitted(model) model = SINDy(discrete_time=True) model.fit(x, x_dot=x, multiple_trajectories=True) check_is_fitted(model)
def test_cross_validation(data_lorenz): x, t = data_lorenz dt = t[1] - t[0] model = SINDy(t_default=dt, differentiation_method=SINDyDerivative(kind="spline", s=1e-2)) param_grid = { "optimizer__threshold": [0.01, 0.1], "differentiation_method__kwargs": [ { "kind": "spline", "s": 1e-2 }, { "kind": "finite_difference", "k": 1 }, ], "feature_library__degree": [1, 2], } search = RandomizedSearchCV(model, param_grid, cv=TimeSeriesSplit(n_splits=3), n_iter=5) search.fit(x) check_is_fitted(search)
def test_integration_smoothed_finite_difference(data_lorenz): x, t = data_lorenz model = SINDy(differentiation_method=SmoothedFiniteDifference()) model.fit(x, t=t) check_is_fitted(model)
def test_simulate(data): x, t, u, u_fun = data model = SINDy() model.fit(x, u=u, t=t) x1 = model.simulate(x[0], t=t, u=u_fun) assert len(x1) == len(t)
def test_multiple_trajectories_errors(data_multiple_trajctories, data_discrete_time): x, t = data_multiple_trajctories model = SINDy() with pytest.raises(TypeError): model._process_multiple_trajectories(np.array(x, dtype=object), t, x) with pytest.raises(TypeError): model._process_multiple_trajectories(x, t, np.array(x, dtype=object)) # Test an option that doesn't get tested elsewhere model._process_multiple_trajectories(x, t, x, return_array=False) x = data_discrete_time model = SINDy(discrete_time=True) with pytest.raises(TypeError): model._process_multiple_trajectories(x, t, np.array(x, dtype=object))
def test_bad_t(data): x, t = data model = SINDy() # No t with pytest.raises(ValueError): model.fit(x, t=None) # Invalid value of t with pytest.raises(ValueError): model.fit(x, t=-1) # t is a list with pytest.raises(ValueError): model.fit(x, list(t)) # Wrong number of time points with pytest.raises(ValueError): model.fit(x, t[:-1]) # Two points in t out of order t[2], t[4] = t[4], t[2] with pytest.raises(ValueError): model.fit(x, t) t[2], t[4] = t[4], t[2] # Two matching times in t t[3] = t[5] with pytest.raises(ValueError): model.fit(x, t)
def test_trapping_inequality_constraints(thresholds, relax_optim, noise_levels): t = np.arange(0, 40, 0.05) x = odeint(lorenz, [-8, 8, 27], t) x = x + np.random.normal(0.0, noise_levels, x.shape) # if order is "feature" constraint_rhs = np.array([-10.0, -2.0]) constraint_matrix = np.zeros((2, 30)) constraint_matrix[0, 6] = 1.0 constraint_matrix[1, 17] = 1.0 feature_names = ["x", "y", "z"] opt = TrappingSR3( threshold=thresholds, constraint_lhs=constraint_matrix, constraint_rhs=constraint_rhs, constraint_order="feature", inequality_constraints=True, relax_optim=relax_optim, ) poly_lib = PolynomialLibrary(degree=2) model = SINDy( optimizer=opt, feature_library=poly_lib, differentiation_method=FiniteDifference(drop_endpoints=True), feature_names=feature_names, ) model.fit(x, t=t[1] - t[0]) assert np.all( np.dot(constraint_matrix, (model.coefficients()).flatten("F")) <= constraint_rhs) or np.allclose( np.dot(constraint_matrix, (model.coefficients()).flatten("F")), constraint_rhs)
def test_libraries(data_lorenz, library): x, t = data_lorenz model = SINDy(feature_library=library) model.fit(x, t) s = model.score(x, t) assert s <= 1
def test_mixed_inputs(data): x, t = data # Scalar t model = SINDy() model.fit(x, t=2) check_is_fitted(model) # x_dot is passed in model = SINDy() model.fit(x, x_dot=x) check_is_fitted(model) model = SINDy() model.fit(x, t, x_dot=x) check_is_fitted(model)
def test_simulate(data): x, t = data model = SINDy() model.fit(x, t) x1 = model.simulate(x[0], t) assert len(x1) == len(t)
def test_predict(data, optimizer): x, t = data model = SINDy(optimizer=optimizer) model.fit(x, t) x_dot = model.predict(x) assert x.shape == x_dot.shape
def test_simulate_discrete_time(data_discrete_time_c): x, u = data_discrete_time_c model = SINDy(discrete_time=True) model.fit(x, u=u) n_steps = x.shape[0] x1 = model.simulate(x[0], t=n_steps, u=u) assert len(x1) == n_steps
def test_print_discrete_time(data_discrete_time, capsys): x = data_discrete_time model = SINDy(discrete_time=True) model.fit(x) model.print() out, _ = capsys.readouterr() assert len(out) > 0
def test_get_feature_names_len(data_lorenz_c_1d): x, t, u, _ = data_lorenz_c_1d model = SINDy() model.fit(x, u=u, t=t) # Assumes default library is polynomial features of degree 2 assert len(model.get_feature_names()) == 15
def test_simulate_discrete_time(data_discrete_time): x = data_discrete_time model = SINDy(discrete_time=True) model.fit(x) n_steps = x.shape[0] x1 = model.simulate(x[0], n_steps) assert len(x1) == n_steps
def test_not_fitted(data_lorenz_c_1d): x, t, u, u_fun = data_lorenz_c_1d model = SINDy() with pytest.raises(NotFittedError): model.predict(x, u=u) with pytest.raises(NotFittedError): model.simulate(x[0], t=t, u=u_fun)
def test_parallel(data_lorenz): x, t = data_lorenz model = SINDy(n_jobs=4) model.fit(x, t) x_dot = model.predict(x) s = model.score(x, x_dot=x_dot) assert s >= 0.95
def test_parallel(data_lorenz_c_1d): x, t, u, _ = data_lorenz_c_1d model = SINDy(n_jobs=4) model.fit(x, u=u, t=t) x_dot = model.predict(x, u=u) s = model.score(x, u=u, x_dot=x_dot) assert s >= 0.95
def test_simulate_with_vector_control_input(data): x, t, u, _ = data model = SINDy() model.fit(x, u=u, t=t) x1 = model.simulate(x[0], t=t, u=u) assert len(x1) == len(t) - 1
def test_simulate_with_interp(data): x, t, u, _ = data model = SINDy() model.fit(x, u=u, t=t) u_fun = interp1d(t, u, axis=0) x1 = model.simulate(x[0], t=t[:-1], u=u_fun) assert len(x1) == len(t) - 1
def test_model_sindy_equivalence(data_lorenz_c_1d): x, t, u, _ = data_lorenz_c_1d model = SINDyEstimator().fit(x, t=t, u=u).fetch_model() sindy_model = SINDy().fit(x, t=t, u=u) assert_allclose(model.coefficients(), sindy_model.coefficients()) assert model.n_input_features_ == sindy_model.n_input_features_ assert model.n_output_features_ == sindy_model.n_output_features_ assert model.n_control_features_ == sindy_model.n_control_features_