я не могу делиться кодом. поэтому постарался придумать похожий пример.
представь себе какой-нибудь ПИД-регулятор, реализованный в виде класса, который принимает поступающие данные (итеративно), и дает считывать текущие показатели коррекции (конст-методом).
допустим, мы хотим промоделировать, какие параметры ПИД-регулятора приводят в лучшему результату по совокупности метрик.
метрики - это чистые функции, которые зависят от выхлопа ПИД-регулятора (который имеет состояние) и от ряда агрегирующих функций (ну, предположим, пусть будет эстиматор Зигеля и линейная регрессия методом наименьших квадратов). МНК, в свою очередь, зависит от значения ковариации и стандартного отклонения.
С точки зрения элегантности архитектуры, было бы неплохо, если бы мы могли скармливать новые данные в классы высшего уровня - в классы, реализующие метрики. Те бы у себя внутри инстанцировали бы классы ПИД-регуляторов и скормили бы им данные, те бы передали данны на уровень ниже, еще на уровень ниже, и так до самых дальних узлов графа зависимостей.
На практике это значит, что если у нас есть миллион метрик, то у нас будет несколько миллионов дублирующися регуляторов, на каждый из них будет еще в несколько раз больше линрегов, а те, в свою очередь, инстанцируют еще в несколько раз больше расчитывателй стдев. Проблема заключается в том, что у нас многие узлы этого графа зависимостей считаются глупо — по нескольку раз, в соответствии с количеством входящих ребер, и наш граф зависимостей становится деревом.
Мое нынешнее решение - некрасивое. Я скармливаю данные не "голове" графа, не самим метрикам — а "хвосту", т.е. самым примитивным агрегирующим функциям без зависимостей, т.е. без исходящих узлов, а остальные узлы формулирую как чистые функции (очевидно, без состояния), которые используют выхлоп этих агрегирующих функций.
Я думал насчет красивого решения, где скармливание данных в верхний класс расчета метрики не мутирует приватный инстанс ПИД-регулятора, а возвращает иммутабельное следующее его состояние - и аналогично со статистическими вычислителями, следующее состояние является иммутабельной копией.
При таком подходе было бы возможно переиспользование копий одного и того же ПИД-регулятора в разных метриках, которые бы адвансились независимо друг от друга, и красиво бы дедуплицировались.
На самом деле красивой дедупликации не произошло, и вышло и медленно, и прожорливо.
Вообще с такими хотелками в хаскель, где лень + шаринг могут такие вещи проворачивать.
Но там конечно, свои проблемы.