diff --git a/src/servers/tsfm/substrate/resolver.py b/src/servers/tsfm/substrate/resolver.py index f803dcd9..ead7f31d 100644 --- a/src/servers/tsfm/substrate/resolver.py +++ b/src/servers/tsfm/substrate/resolver.py @@ -73,15 +73,30 @@ "sktime.forecasting.trend.PolynomialTrendForecaster", # Detrender's default forecaster "sklearn.preprocessing.StandardScaler", "sklearn.preprocessing.MinMaxScaler", + "sktime.transformations.series.exponent.SqrtTransformer", + "sktime.transformations.series.detrend.ConditionalDeseasonalizer", + "sktime.transformations.series.outlier_detection.HampelFilter", + "sktime.forecasting.trend.TrendForecaster", + "sklearn.preprocessing.RobustScaler", # run_tabular_recipe transforms (panel -> features) "sktime.transformations.series.summarize.SummaryTransformer", "sktime.transformations.panel.catch22.Catch22", "sktime.transformations.panel.rocket.MiniRocket", - # run_tabular_recipe estimators: tsfm_regression / tsfm_clustering + "sktime.transformations.panel.rocket.MiniRocketMultivariate", + "sktime.transformations.panel.rocket.Rocket", + # run_tabular_recipe estimators: tsfm_regression / tsfm_classification / tsfm_clustering "sklearn.ensemble.RandomForestRegressor", "sklearn.ensemble.GradientBoostingRegressor", "sklearn.linear_model.Ridge", "sklearn.cluster.KMeans", + "sklearn.ensemble.ExtraTreesRegressor", + "sklearn.linear_model.LinearRegression", + "sklearn.linear_model.Lasso", + "sklearn.neighbors.KNeighborsRegressor", + "sklearn.ensemble.ExtraTreesClassifier", + "sklearn.ensemble.GradientBoostingClassifier", + "sklearn.linear_model.LogisticRegression", + "sklearn.neighbors.KNeighborsClassifier", }) diff --git a/src/servers/tsfm/tests/test_no_code_exec.py b/src/servers/tsfm/tests/test_no_code_exec.py index d6a0e57b..7f9b9eaf 100644 --- a/src/servers/tsfm/tests/test_no_code_exec.py +++ b/src/servers/tsfm/tests/test_no_code_exec.py @@ -109,6 +109,13 @@ def test_allowlisted_estimator_still_runs(): assert r.get("status") == "success", r +def test_every_allowed_class_imports(): + from ..substrate.resolver import ALLOWED_CLASSES, _import_target + + for path in ALLOWED_CLASSES: + assert isinstance(_import_target(path), type), path + + # File pointers: the read-back channel ------------------------------------------------------ def test_file_pointer_outside_data_roots_is_refused(): for p in ("/proc/self/environ", "file:///etc/passwd", "/etc/hostname",