package com.datascience.core.nominal.decision; import java.util.HashMap; import java.util.Map; import com.datascience.core.base.Worker; import com.datascience.core.nominal.NominalProject; import com.datascience.core.nominal.Quality; /* * @author: Artur Ambroziak */ public abstract class WorkerQualityCalculator { private ILabelProbabilityDistributionCostCalculator labelProbabilityDistributionCostCalculator; public abstract double getError(NominalProject project, Worker w, String from, String to); public WorkerQualityCalculator(ILabelProbabilityDistributionCostCalculator lpdcc){ this.labelProbabilityDistributionCostCalculator = lpdcc; } public double getCost(NominalProject project, Worker w){ Map<String, Double> workerPriors = project.getResults().getWorkerResult(w).getPrior( project.getData().getWorkerAssigns(w), project.getData().getCategories()); double cost = 0.; for (String c : project.getData().getCategories()) { Map<String, Double> softLabel = getSoftLabelForHardCategoryLabel(project, w, c, workerPriors); cost += labelProbabilityDistributionCostCalculator.predictedLabelCost(softLabel, project.getData().getCostMatrix()) * workerPriors.get(c); } return cost; } public Map<Worker, Double> getCosts(NominalProject project){ Map<Worker, Double> ret = new HashMap<Worker, Double>(); for (Worker w : project.getData().getWorkers()){ ret.put(w, getCost(project, w)); } return ret; } public double getQuality(NominalProject project, Worker w){ return Quality.fromCost(project, getCost(project, w)); } private Map<String, Double> getSoftLabelForHardCategoryLabel(NominalProject project, Worker w, String label, Map<String, Double> workerPriors) { // Pr(c | label) = Pr(label | c) * Pr (c) / Pr(label) Map<String, Double> result = new HashMap<String, Double>(); for (String source : project.getData().getCategories()) { double soft = 0.; if (workerPriors.get(label) > 0){ double error = getError(project, w, source, label); soft = project.getAlgorithm().prior(source) * error / workerPriors.get(label); } result.put(source, soft); } return result; } }