У меня есть следующий код scala:
val gates = varNode.getGates()
val inMsgs = gates.map(g => g.getEndGate.getMessage())
val variableMarginal = inMsgs.reduceLeft((msg1, msg2) => msg1 * msg2)
Является ли это тем же самым, что и в C++ (предположим, мы знаем, что типы и базовый контейнер C++ - это вектор)?
std::vector<Gate *> gates = varNode.getGates();
// Assume that the first gate always has a valid message
double marginal = gates[0]->getEndGate()->getMessage();
for (int i = 1; i < gates.size(); ++i)
marginal *= gates[i]->getEndGate()->getMessage();
Меня смущает функция reduceLeft. Не могу понять, что он делает.
[EDIT] Класс Gate определяется следующим образом:
sealed abstract class Gate(initialMsg: SingleFactor) {
type END_GATE <: Gate
private var endGate: Option[END_GATE] = None
private var message: SingleFactor = initialMsg
private var oldMessage: SingleFactor = initialMsg
def setEndGate(gate: END_GATE) { endGate = Some(gate) }
def getEndGate(): END_GATE = endGate.get
def setMessage(newMessage: SingleFactor, msgIndex: Long) {
oldMessage = message
message = newMessage
}
def getMsgIndex(): Long = msgIndex
def getMessage(): SingleFactor = message
def getOldMessage(): SingleFactor = oldMessage
}
Насколько я вижу, вам нужна реализация SingleFactor и знать, не перегружен ли оператор *, то вы можете определить, что делает reduceLeft.
Я предполагаю, что inMsgs является вектором элементов SingleFactor (через.getMessage()) после завершения операции карты.
ReduceLeft будет захватывать первый SingleFactor и использовать оператор * для второго SingleFactor, результат которого будет использовать снова оператор * против третьего SingleFactor и т.д., В результате чего одно значение будет сохранено в переменнойMarginal.
для некоторых примеров использования reduceLeft вы можете прочитать это: http://alvinalexander.com/scala/scala-reduceleft-examples
для диагностики того, что делает сокращение, вы также можете изменить вызов reduceLeft на что-то вроде этого: (предполагая, что вы можете выполнить свой данный код Scala)
# the semicolons are not needed but are added in case you copy paste/single line the code
val variableMarginal = inMsgs.reduceLeft((msg1, msg2) => {
val result = msg1 * msg2;
println("msg1: "+ msg1 + " msg2: "+ msg2 + " result: "+result);
result })
Я думаю, что вы можете "эмулировать" сокращениеLeft в C++ с накоплением (API можно найти здесь: http://en.cppreference.com/w/cpp/algorithm/accumulate). В этом случае вы предоставляете двоичную операцию, как операция Scala * SingleFactor.
Gate
...