import java.util.ArrayList;
import java.util.List;

class Segment {
    List<Integer> data = new ArrayList<>();
    int startIndex;
    int endIndex;

    Segment(List<Integer> d, int s, int e) {
        data = d;
        startIndex = s;
        endIndex = e;
    }
}

public class WindowedInference {

    // Pretend data source
    public static List<Integer> loadData(String id) {
        List<Integer> seq = new ArrayList<>();
        int[] values = { 10, 12, 15, 17, 19, 22, 25, 28, 30, 32 };
        for (int v : values)
            seq.add(v);
        return seq;
    }

    // Split sequence into segments
    public static List<Segment> makeSegments(List<Integer> seq, int segmentSize) {
        List<Segment> segments = new ArrayList<>();
        int index = 0;

        while (index + segmentSize <= seq.size()) {
            List<Integer> data = new ArrayList<>();
            for (int i = index; i < index + segmentSize; i++) {
                data.add(seq.get(i));
            }

            Segment s = new Segment(data, index, index + segmentSize - 1);
            segments.add(s);
            index += segmentSize; // non-overlapping
        }

        return segments;
    }

    // "Model": fake prediction by summing values in segment
    public static int predictSegment(Segment s) {
        int sum = 0;
        for (int v : s.data)
            sum += v;
        return sum;
    }

    // Aggregator: take max of all predictions
    public static int aggregatePredictions(List<Integer> preds) {
        if (preds.isEmpty())
            return 0;

        int max = preds.get(0);
        for (int p : preds) {
            if (p > max)
                max = p;
        }
        return max;
    }

    public static void main(String[] args) {

        // 1. Load data
        List<Integer> sequence = loadData("demo");

        // 2. Make segments
        int segmentSize = 3;
        List<Segment> segments = makeSegments(sequence, segmentSize);

        // 3. Predict each segment
        List<Integer> predictions = new ArrayList<>();

        for (Segment seg : segments) {
            int score = predictSegment(seg);
            predictions.add(score);

            System.out.print("Segment [" + seg.startIndex + "-" + seg.endIndex + "] values: ");
            for (int v : seg.data)
                System.out.print(v + " ");
            System.out.println("=> score = " + score);
        }

        // 4. Aggregate
        int globalScore = aggregatePredictions(predictions);

        System.out.println("\nGlobal aggregated score (max over segments): " + globalScore);
    }
}
