class Optimizations {

    /**
     * Creates optimization that combines independent requests to same bucket into batches in order to reduce request count to remote storage.
     *
     * @return new instance of {@link BatchingOptimization}
     *
     * @see BatchingOptimization
     */
    public static Optimization batching() {
        return new BatchingOptimization(NopeOptimizationListener.INSTANCE);
    }

    /**
     * Creates optimization that can serve requests locally without synchronization with external storage until thresholds are not violated.
     *
     * @param delayParameters thresholds that control whether or not request can be served locally without synchronization with external storage
     *
     * @return new instance of {@link DelayOptimization}
     *
     * @see DelayOptimization
     */
    public static Optimization delaying(DelayParameters delayParameters) {
        return new DelayOptimization(delayParameters, NopeOptimizationListener.INSTANCE, TimeMeter.SYSTEM_MILLISECONDS);
    }

    /**
     * Creates optimization that can serve requests locally without synchronization with external storage until thresholds are not violated,
     * and additionally tries to predict aggregated consumption rate in whole cluster in order to reduce the risk of overconsumption that caused by {@link DelayOptimization}.
     *
     * @param delayParameters thresholds that control whether or not request can be served locally without synchronization with external storage
     * @param predictionParameters parameters that control the quality of prediction of distributed consumption rate
     *
     * @return new instance of {@link PredictiveOptimization}
     *
     * @see PredictiveOptimization
     * @see PredictionParameters
     * @see DelayParameters
     */
    public static Optimization predicting(DelayParameters delayParameters, PredictionParameters predictionParameters) {
        return new PredictiveOptimization(predictionParameters, delayParameters, NopeOptimizationListener.INSTANCE, TimeMeter.SYSTEM_MILLISECONDS);
    }

    /**
     * Has the same semantic as {@link #predicting(DelayParameters, PredictionParameters)} but uses default {@link PredictionParameters}.
     *
     * @param delayParameters thresholds that control whether or not request can be served locally without synchronization with external storage
     *
     * @return new instance of {@link PredictiveOptimization}
     *
     * @see PredictiveOptimization
     * @see PredictionParameters
     */
    public static Optimization predicting(DelayParameters delayParameters) {<FILL_FUNCTION_BODY>}

}

        PredictionParameters defaultPrediction = PredictionParameters.createDefault(delayParameters);
        return new PredictiveOptimization(defaultPrediction, delayParameters, NopeOptimizationListener.INSTANCE, TimeMeter.SYSTEM_MILLISECONDS);
    
<no_super_class>