/*
* 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;
import java.io.Serializable;
/**
* This class models population properties for risk estimation
*
* @author Fabian Prasser
*/
public class ARXPopulationModel implements Serializable {
/** Regions*/
public static enum Region implements Serializable{
NONE("None", 0l),
AFRICA("Africa", 1100000000l),
AUSTRALIA("Australia", 23130900l),
EUROPE("Europe", 740000000l),
NORTH_AMERICA("North America", 565265000l),
SOUTH_AMERICA("South America", 385742554l),
EUROPEAN_UNION("European Union", 507420000l),
BRASIL("Brasil", 202656788l),
CANADA("Canada", 34834841l),
CHINA("China (PRC)", 1366040000l),
FRANCE("France", 65820916l),
GERMANY("Germany", 80767000l),
INDIA("India", 1210569573l),
UK("UK", 63705000l),
USA("USA", 317238626l);
/** Field */
private final String name;
/** Field */
private final long population;
/**
* Creates a new instance
* @param name
* @param population
*/
private Region(String name, long population) {
this.name = name;
this.population = population;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the population
*/
public long getPopulationSize() {
return population;
}
}
/** SVUID */
private static final long serialVersionUID = 6331644478717881214L;
/**
* Creates a new instance
* @param sampleSize
* @param samplingFraction
* @return
*/
public static ARXPopulationModel create(int sampleSize, double samplingFraction){
return new ARXPopulationModel(sampleSize, samplingFraction);
}
/**
* Creates a new instance
* @param populationSize
* @return
*/
public static ARXPopulationModel create(long populationSize){
return new ARXPopulationModel(populationSize);
}
/**
* Creates a new instance
* @param region
* @return
*/
public static ARXPopulationModel create(Region region){
return new ARXPopulationModel(region);
}
/** The region */
private Region region = Region.NONE;
/** TODO: This field is here for backwards compatibility only!*/
private double sampleFraction = 0.01d;
/** The sample fraction */
private Long populationSize;
/**
* Creates a new instance
* @param sampleSize
* @param samplingFraction
*/
private ARXPopulationModel(int sampleSize, double samplingFraction) {
this.region = Region.NONE;
this.populationSize = (long)(Math.round((double)sampleSize / samplingFraction));
}
/**
* Creates a new instance
* @param populationSize
*/
private ARXPopulationModel(long populationSize) {
this.region = Region.NONE;
this.populationSize = populationSize;
}
/**
* Creates a new instance
* @param region
*/
private ARXPopulationModel(Region region) {
this.region = region;
this.populationSize = region.getPopulationSize();
}
/**
* Clone constructor
* @param sampleFraction
*/
private ARXPopulationModel(Region region, long populationSize) {
this.region = region;
this.populationSize = populationSize;
}
/**
* Returns a clone of this object
*/
public ARXPopulationModel clone() {
return new ARXPopulationModel(region, populationSize);
}
/**
* Returns the population size
* @return
*/
public long getPopulationSize() {
return populationSize;
}
/**
* @return the region
*/
public Region getRegion() {
return region;
}
@Deprecated
public void makeBackwardsCompatible(int sampleSize) {
if (populationSize == null) {
if (region == null || region == Region.NONE) {
populationSize = (long) (Math.round((double) sampleSize / this.sampleFraction));
} else {
populationSize = region.getPopulationSize();
}
}
}
}