@Override
public void flatMap(Batch<DataPosteriorAssignment> data, Collector<DataPosteriorAssignment> out) {
for (int i = 0; i < data.getElements().size(); i++) {
for (Variable latentVariable : latentInterfaceVariables) {
DataPosteriorAssignment dataPosteriorAssignment = data.getElements().get(i);
if (!dataPosteriorAssignment.isObserved(latentVariable)){
UnivariateDistribution dist = dataPosteriorAssignment.getPosterior().getPosterior(latentVariable);
Variable interfaceVariable = this.svb.getDAG().getVariables().getVariableByName(latentVariable.getName() + DynamicVariables.INTERFACE_SUFFIX);
this.svb.getPlateuStructure().getNodeOfVar(latentVariable, i).setPDist(dist.toEFUnivariateDistribution().deepCopy(interfaceVariable));
this.svb.getPlateuStructure().getNodeOfVar(latentVariable, i).setAssignment(null);
}
}
}
DataOnMemory<DataInstance> dataBatch = new DataOnMemoryListContainer<DataInstance>(
attributes,
data.getElements().stream()
.map(d ->
new DataInstanceFromAssignment(d.getPosterior().getId(), d.getAssignment(), attributes, variables))
.collect(Collectors.toList())
);
List<DataPosteriorAssignment> posteriorAssignments = svb.computePosteriorAssignment(dataBatch, latentVariables);
for (DataPosteriorAssignment posterior: posteriorAssignments){
out.collect(posterior);
}
}