/* * ARX: Powerful Data Anonymization * Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.deidentifier.arx.gui.model; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.deidentifier.arx.ARXPopulationModel; import org.deidentifier.arx.ARXPopulationModel.Region; import org.deidentifier.arx.ARXSolverConfiguration; /** * A model for risk analysis * * @author Fabian Prasser */ public class ModelRisk implements Serializable { /** * A enum for statistical models underlying attribute analyses * @author Fabian Prasser */ public static enum RiskModelForAttributes { SAMPLE_UNIQUENESS, POPULATION_UNIQUENESS_PITMAN, POPULATION_UNIQUENESS_ZAYATZ, POPULATION_UNIQUENESS_DANKAR, POPULATION_UNIQUENESS_SNB } /** * A enum for views * @author Fabian Prasser */ public static enum ViewRiskType { CLASSES_PLOT, CLASSES_TABLE, CELL_BASED, ATTRIBUTES, HIPAA_ATTRIBUTES, UNIQUES_DANKAR, UNIQUES_ALL, OVERVIEW } /** SVUID */ private static final long serialVersionUID = 5405871228130041796L; /** The default sample size */ private static final Region DEFAULT_REGION = Region.USA; /** Modified */ private boolean modified = false; /** Model */ private ARXPopulationModel populationModel = null; /** Model */ private ARXSolverConfiguration config = ARXSolverConfiguration.create(); /** Model */ private int maxQiSize = 10; /** Model */ private Map<ViewRiskType, Boolean> viewEnabledForInput = new HashMap<ViewRiskType, Boolean>(); /** Model */ private Map<ViewRiskType, Boolean> viewEnabledForOutput = new HashMap<ViewRiskType, Boolean>(); /** Model */ private RiskModelForAttributes riskModelForAttributes = RiskModelForAttributes.POPULATION_UNIQUENESS_DANKAR; /** Model */ private Double riskThresholdRecordsAtRisk; /** Model */ private Double riskThresholdHighestRisk; /** Model */ private Double riskThresholdSuccessRate; /** * Creates a new instance */ public ModelRisk() { this.populationModel = ARXPopulationModel.create(DEFAULT_REGION); } /** * @return the maxQiSize */ public int getMaxQiSize() { return maxQiSize; } /** * Returns the backing model * @return */ public ARXPopulationModel getPopulationModel() { return this.populationModel; } /** * @param handle * @return * @see org.deidentifier.arx.ARXPopulationModel#getPopulationSize() */ public double getPopulationSize() { return populationModel.getPopulationSize(); } /** * Returns the region * @return */ public Region getRegion() { return this.populationModel.getRegion(); } /** * Returns the risk model used for attribute analyses * @return */ public RiskModelForAttributes getRiskModelForAttributes() { return this.riskModelForAttributes; } /** * Returns a threshold * @return */ public double getRiskThresholdHighestRisk() { if (riskThresholdHighestRisk == null) { riskThresholdHighestRisk = 0.2d; } return riskThresholdHighestRisk; } /** * Returns a threshold * @return */ public double getRiskThresholdRecordsAtRisk() { if (riskThresholdRecordsAtRisk == null) { riskThresholdRecordsAtRisk = 0.05d; } return riskThresholdRecordsAtRisk; } /** * Returns a threshold * @return */ public double getRiskThresholdSuccessRate() { if (riskThresholdSuccessRate == null) { riskThresholdSuccessRate = 0.05d; } return riskThresholdSuccessRate; } /** * Returns the solver configuration */ public ARXSolverConfiguration getSolverConfiguration() { return config; } /** * Is this model modified * @return */ public boolean isModified() { return modified || config.isModified(); } /*** * Returns whether a view is enabled * @param view * @return */ public boolean isViewEnabledForInput(ViewRiskType view) { if (!viewEnabledForInput.containsKey(view)) { return true; } else { return viewEnabledForInput.get(view); } } /*** * Returns whether a view is enabled * @param view * @return */ public boolean isViewEnabledForOutput(ViewRiskType view) { if (!viewEnabledForOutput.containsKey(view)) { return true; } else { return viewEnabledForOutput.get(view); } } /** * @param maxQiSize the maxQiSize to set */ public void setMaxQiSize(int maxQiSize) { if (maxQiSize != this.maxQiSize) { this.modified = true; } this.maxQiSize = maxQiSize; } /** * Sets the population size * @param populationSize */ public void setPopulationSize(long populationSize) { if (populationSize != populationModel.getPopulationSize()) { this.populationModel = ARXPopulationModel.create(populationSize); this.modified = true; } } /** * Sets the region * @param region */ public void setRegion(Region region) { if (region != populationModel.getRegion()) { this.populationModel = ARXPopulationModel.create(region); this.modified = true; } } /** * Sets the risk model used for attribute analyses * @param model */ public void setRiskModelForAttributes(RiskModelForAttributes model) { this.riskModelForAttributes = model; } /** * Sets a threshold * @param threshold */ public void setRiskThresholdHighestRisk(double threshold) { if (this.riskThresholdHighestRisk == null || this.riskThresholdHighestRisk.doubleValue() != threshold) { this.modified = true; } this.riskThresholdHighestRisk = threshold; } /** * Sets a threshold * @param threshold */ public void setRiskThresholdRecordsAtRisk(double threshold) { if (this.riskThresholdRecordsAtRisk == null || this.riskThresholdRecordsAtRisk.doubleValue() != threshold) { this.modified = true; } this.riskThresholdRecordsAtRisk = threshold; } /** * Sets a threshold * @param threshold */ public void setRiskThresholdSuccessRate(double threshold) { if (this.riskThresholdSuccessRate == null || this.riskThresholdSuccessRate.doubleValue() != threshold) { this.modified = true; } this.riskThresholdSuccessRate = threshold; } /** * Set unmodified */ public void setUnmodified() { this.modified = false; this.config.setUnmodified(); } /** * Allows to enable/disable views * @param view * @param value */ public void setViewEnabledForInput(ViewRiskType view, boolean value) { this.viewEnabledForInput.put(view, value); } /** * Allows to enable/disable views * @param view * @param value */ public void setViewEnabledForOutput(ViewRiskType view, boolean value) { this.viewEnabledForOutput.put(view, value); } }