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_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_simulate(data): x, t = data model = SINDy() model.fit(x, t) x1 = model.simulate(x[0], t) assert len(x1) == len(t)
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_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_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_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_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_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_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_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_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_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_print_discrete_time_multiple_trajectories( data_discrete_time_multiple_trajectories, capsys): x = data_discrete_time_multiple_trajectories model = SINDy(discrete_time=True) model.fit(x, multiple_trajectories=True) model.print() out, _ = capsys.readouterr() assert len(out) > 1
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_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_fit_warn(data_lorenz, params, warning): x, t = data_lorenz model = SINDy(optimizer=STLSQ(**params)) with pytest.warns(warning): model.fit(x, t) with pytest.warns(None) as warn_record: model.fit(x, t, quiet=True) assert len(warn_record) == 0
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_get_feature_names_len(data_lorenz): x, t = data_lorenz model = SINDy() with pytest.raises(NotFittedError): model.get_feature_names() model.fit(x, t) # Assumes default library is polynomial features of degree 2 assert len(model.get_feature_names()) == 10
def test_predict_multiple_trajectories(data_multiple_trajctories): x, t = data_multiple_trajctories model = SINDy() model.fit(x, t=t, multiple_trajectories=True) # Should fail if multiple_trajectories flag is not set with pytest.raises(ValueError): model.predict(x) p = model.predict(x, multiple_trajectories=True) assert len(p) == len(x)
def test_equations(data, capsys): x, t = data model = SINDy() model.fit(x, t) out, _ = capsys.readouterr() assert len(out) == 0 model.print(precision=2) out, _ = capsys.readouterr() assert len(out) > 0
def test_predict_discrete_time_multiple_trajectories( data_discrete_time_multiple_trajectories, ): x = data_discrete_time_multiple_trajectories model = SINDy(discrete_time=True) model.fit(x, multiple_trajectories=True) # Should fail if multiple_trajectories flag is not set with pytest.raises(ValueError): model.predict(x) y = model.predict(x, multiple_trajectories=True) assert len(y) == len(x)
def test_score(data): x, t, u, _ = data model = SINDy() model.fit(x, u=u, t=t) assert model.score(x, u=u) <= 1 assert model.score(x, u=u, t=t) <= 1 assert model.score(x, u=u, x_dot=x) <= 1 assert model.score(x, u=u, t=t, x_dot=x) <= 1
def test_score(data): x, t = data model = SINDy() model.fit(x, t) assert model.score(x) <= 1 assert model.score(x, t) <= 1 assert model.score(x, x_dot=x) <= 1 assert model.score(x, t, x_dot=x) <= 1
def test_extra_u_warn_discrete(data_discrete_time_c): x, u = data_discrete_time_c model = SINDy(discrete_time=True) model.fit(x) with pytest.warns(UserWarning): model.predict(x, u=u) with pytest.warns(UserWarning): model.score(x, u=u) with pytest.warns(UserWarning): model.simulate(x[0], u=u, t=10)
def test_predict_multiple_trajectories(data_multiple_trajctories): x, t = data_multiple_trajctories u = [np.ones((xi.shape[0], 2)) for xi in x] model = SINDy() model.fit(x, u=u, t=t, multiple_trajectories=True) # Should fail if multiple_trajectories flag is not set with pytest.raises(ValueError): model.predict(x, u=u) p = model.predict(x, u=u, multiple_trajectories=True) assert len(p) == len(x)
def test_extra_u_warn(data_lorenz_c_1d): x, t, u, _ = data_lorenz_c_1d model = SINDy() model.fit(x, t=t) with pytest.warns(UserWarning): model.predict(x, u=u) with pytest.warns(UserWarning): model.score(x, u=u) with pytest.warns(UserWarning): model.simulate(x[0], t=t, u=u)
def test_u_omitted(data_lorenz_c_1d): x, t, u, _ = data_lorenz_c_1d model = SINDy() model.fit(x, u=u, t=t) with pytest.raises(TypeError): model.predict(x) with pytest.raises(TypeError): model.score(x) with pytest.raises(TypeError): model.simulate(x[0], t=t)