Я столкнулся с этой строкой в исходном коде Apache Spark
val (gradientSum, lossSum, miniBatchSize) = data
.sample(false, miniBatchFraction, 42 + i)
.treeAggregate((BDV.zeros[Double](n), 0.0, 0L))(
seqOp = (c, v) => {
// c: (grad, loss, count), v: (label, features)
val l = gradient.compute(v._2, v._1, bcWeights.value, Vectors.fromBreeze(c._1))
(c._1, c._2 + l, c._3 + 1)
},
combOp = (c1, c2) => {
// c: (grad, loss, count)
(c1._1 += c2._1, c1._2 + c2._2, c1._3 + c2._3)
}
)
У меня много проблем с чтением:
- Сначала я не могу найти что-либо в Интернете, которое объясняет, как работает
treeAggregate
, каков смысл параметров. - Во-вторых, здесь
.treeAggregate
, похоже, имеет два()(), следующих за именем метода. Что это может означать? Это какой-то специальный синтаксис scala, который я не понимаю. - Наконец, я вижу, как seqOp и comboOp возвращают 3 элемента кортежа, которые соответствуют ожидаемой левой стороне переменной, но какая из них фактически возвращается?
Это утверждение должно быть действительно продвинутым. Я не могу начать расшифровывать это.