Операция хранит родителей
Распишем формулу как DAG: связи идут от операндов к результатам. Leaf содержит число; операция знает родителей, forward value и локальные производные. Топологический порядок гарантирует готовность родителей перед вычислением узла. N03,N10.
Сквозной пример: x=2,w=3,b=1,a=xw,z=a+b,L=z². Узлы a,z,L зависят от предыдущих. Идентичность узла отличается от равенства значений: разные переменные могут содержать одинаковые числа.
Редактор. Граф задаётся JSON-массивом до20 узлов. Разрешены leaf,add,mul,tanh,relu. Parents должны быть объявлены раньше, IDs уникальны, output — последний узел. Это ограниченный декларативный формат, не выполнение JavaScript/Python из textarea. Изменять значения leaves можно непосредственно в JSON.
Эксперимент. Сравните z*z с выражением, где две копии z имеют разные IDs. Forward может совпасть, но структура накопления различается. Цикл и неизвестный parent отвергаются с объяснением.
Под капотом. Память графа включает edges, промежуточные values и gradients, а не только параметры модели. Общий узел достаточно вычислить один раз, но кратность его использования нельзя потерять. Это различие станет ключевым для обратного прохода.