package org.openlca.core.math;
import org.openlca.core.database.EntityCache;
import org.openlca.core.database.ImpactMethodDao;
import org.openlca.core.database.NwSetDao;
import org.openlca.core.matrix.cache.MatrixCache;
import org.openlca.core.model.Project;
import org.openlca.core.model.ProjectVariant;
import org.openlca.core.model.descriptors.ImpactMethodDescriptor;
import org.openlca.core.model.descriptors.NwSetDescriptor;
import org.openlca.core.results.ContributionResult;
import org.openlca.core.results.ProjectResultProvider;
public class ProjectCalculator {
private final IMatrixSolver solver;
private final MatrixCache matrixCache;
public ProjectCalculator(MatrixCache matrixCache, IMatrixSolver solver) {
this.matrixCache = matrixCache;
this.solver = solver;
}
public ProjectResultProvider solve(Project project, EntityCache cache) {
ProjectResultProvider result = new ProjectResultProvider(cache);
SystemCalculator calculator = new SystemCalculator(matrixCache, solver);
ImpactMethodDescriptor method = getImpactMethod(project);
NwSetDescriptor nwSet = getNwSet(project);
for (ProjectVariant v : project.getVariants()) {
CalculationSetup setup = new CalculationSetup(v.getProductSystem());
setup.setUnit(v.getUnit());
setup.setFlowPropertyFactor(v.getFlowPropertyFactor());
setup.setAmount(v.getAmount());
setup.allocationMethod = v.getAllocationMethod();
setup.impactMethod = method;
setup.nwSet = nwSet;
setup.parameterRedefs.addAll(v.getParameterRedefs());
setup.withCosts = true;
ContributionResult cr = calculator.calculateContributions(setup);
result.addResult(v, cr);
}
return result;
}
private ImpactMethodDescriptor getImpactMethod(Project project) {
if (project.getImpactMethodId() == null)
return null;
ImpactMethodDao dao = new ImpactMethodDao(matrixCache.getDatabase());
return dao.getDescriptor(project.getImpactMethodId());
}
private NwSetDescriptor getNwSet(Project project) {
if (project.getNwSetId() == null)
return null;
NwSetDao dao = new NwSetDao(matrixCache.getDatabase());
return dao.getDescriptor(project.getNwSetId());
}
}