/*
* 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.examples;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.deidentifier.arx.DataType;
import org.deidentifier.arx.aggregates.HierarchyBuilder;
import org.deidentifier.arx.aggregates.HierarchyBuilder.Type;
import org.deidentifier.arx.aggregates.HierarchyBuilderGroupingBased.Level;
import org.deidentifier.arx.aggregates.HierarchyBuilderIntervalBased;
import org.deidentifier.arx.aggregates.HierarchyBuilderIntervalBased.Interval;
import org.deidentifier.arx.aggregates.HierarchyBuilderIntervalBased.Range;
import org.deidentifier.arx.aggregates.HierarchyBuilderOrderBased;
import org.deidentifier.arx.aggregates.HierarchyBuilderRedactionBased;
import org.deidentifier.arx.aggregates.HierarchyBuilderRedactionBased.Order;
import cern.colt.Arrays;
/**
* This class implements examples of how to use the builders for generalization hierarchies.
*
* @author Fabian Prasser
* @author Florian Kohlmayer
*/
public class Example18 extends Example {
/**
* Entry point.
*
* @param args The arguments
*/
public static void main(String[] args) {
redactionBased();
intervalBased();
orderBased();
ldlCholesterol();
dates();
loadStore();
}
/**
* Exemplifies the use of the order-based builder.
*/
private static void dates() {
String stringDateFormat = "yyyy-MM-dd HH:mm";
DataType<Date> dateType = DataType.createDate(stringDateFormat);
// Create the builder
HierarchyBuilderOrderBased<Date> builder = HierarchyBuilderOrderBased.create(dateType, false);
// Define grouping fanouts
builder.getLevel(0).addGroup(10, dateType.createAggregate().createIntervalFunction());
builder.getLevel(1).addGroup(2, dateType.createAggregate().createIntervalFunction());
// Alternatively
// builder.setAggregateFunction(AggregateFunction.INTERVAL(DataType.INTEGER));
// builder.getLevel(0).addFanout(10);
// builder.getLevel(1).addFanout(2);
System.out.println("---------------------");
System.out.println("ORDER-BASED DATE HIERARCHY");
System.out.println("---------------------");
System.out.println("");
System.out.println("SPECIFICATION");
// Print specification
for (Level<Date> level : builder.getLevels()) {
System.out.println(level);
}
// Print info about resulting groups
System.out.println("Resulting levels: "+Arrays.toString(builder.prepare(getExampleDateData(stringDateFormat))));
System.out.println("");
System.out.println("RESULT");
// Print resulting hierarchy
printArray(builder.build().getHierarchy());
System.out.println("");
}
/**
* Returns example data.
*
* @return
*/
private static String[] getExampleData(){
String[] result = new String[100];
for (int i=0; i< result.length; i++){
result[i] = String.valueOf(i);
}
return result;
}
/**
* Returns example date data.
*
* @param stringFormat
* @return
*/
private static String[] getExampleDateData(String stringFormat){
SimpleDateFormat format = new SimpleDateFormat(stringFormat);
String[] result = new String[100];
for (int i=0; i< result.length; i++){
Calendar date = GregorianCalendar.getInstance();
date.add(Calendar.HOUR, i);
result[i] = format.format(date.getTime());
}
return result;
}
/**
* Returns example data.
*
* @return
*/
private static String[] getExampleLDLData() {
String[] result = new String[100];
for (int i=0; i< result.length; i++){
result[i] = String.valueOf(Math.random() * 9.9d);
}
return result;
}
/**
* Exemplifies the use of the interval-based builder.
*/
private static void intervalBased() {
// Create the builder
HierarchyBuilderIntervalBased<Long> builder = HierarchyBuilderIntervalBased.create(
DataType.INTEGER,
new Range<Long>(0l,0l,Long.MIN_VALUE / 4),
new Range<Long>(100l,100l,Long.MAX_VALUE / 4));
// Define base intervals
builder.setAggregateFunction(DataType.INTEGER.createAggregate().createIntervalFunction(true, false));
builder.addInterval(0l, 20l);
builder.addInterval(20l, 33l);
// Define grouping fanouts
builder.getLevel(0).addGroup(2);
builder.getLevel(1).addGroup(3);
System.out.println("------------------------");
System.out.println("INTERVAL-BASED HIERARCHY");
System.out.println("------------------------");
System.out.println("");
System.out.println("SPECIFICATION");
// Print specification
for (Interval<Long> interval : builder.getIntervals()){
System.out.println(interval);
}
// Print specification
for (Level<Long> level : builder.getLevels()) {
System.out.println(level);
}
// Print info about resulting levels
System.out.println("Resulting levels: "+Arrays.toString(builder.prepare(getExampleData())));
System.out.println("");
System.out.println("RESULT");
// Print resulting hierarchy
printArray(builder.build().getHierarchy());
System.out.println("");
}
/**
* Exemplifies the use of the interval-based builder for LDL cholesterol
* in mmol/l.
*/
private static void ldlCholesterol() {
// Create the builder
HierarchyBuilderIntervalBased<Double> builder = HierarchyBuilderIntervalBased.create(DataType.DECIMAL);
// Define base intervals
builder.addInterval(0d, 1.8d, "very low");
builder.addInterval(1.8d, 2.6d, "low");
builder.addInterval(2.6d, 3.4d, "normal");
builder.addInterval(3.4d, 4.1d, "borderline high");
builder.addInterval(4.1d, 4.9d, "high");
builder.addInterval(4.9d, 10d, "very high");
// Define grouping fanouts
builder.getLevel(0).addGroup(2, "low").addGroup(2, "normal").addGroup(2, "high");
builder.getLevel(1).addGroup(2, "low-normal").addGroup(1, "high");
System.out.println("--------------------------");
System.out.println("LDL-CHOLESTEROL HIERARCHY");
System.out.println("--------------------------");
System.out.println("");
System.out.println("SPECIFICATION");
// Print specification
for (Interval<Double> interval : builder.getIntervals()){
System.out.println(interval);
}
// Print specification
for (Level<Double> level : builder.getLevels()) {
System.out.println(level);
}
// Print info about resulting levels
System.out.println("Resulting levels: "+Arrays.toString(builder.prepare(getExampleLDLData())));
System.out.println("");
System.out.println("RESULT");
// Print resulting hierarchy
printArray(builder.build().getHierarchy());
System.out.println("");
}
/**
* Shows how to load and store hierarchy specifications.
*/
private static void loadStore() {
try {
HierarchyBuilderRedactionBased<?> builder = HierarchyBuilderRedactionBased.create(Order.RIGHT_TO_LEFT,
Order.RIGHT_TO_LEFT,
' ', '*');
builder.save("test.ahs");
HierarchyBuilder<?> loaded = HierarchyBuilder.create("test.ahs");
if (loaded.getType() == Type.REDACTION_BASED) {
builder = (HierarchyBuilderRedactionBased<?>)loaded;
System.out.println("-------------------------");
System.out.println("REDACTION-BASED HIERARCHY");
System.out.println("-------------------------");
System.out.println("");
System.out.println("SPECIFICATION");
// Print info about resulting groups
System.out.println("Resulting levels: "+Arrays.toString(builder.prepare(getExampleData())));
System.out.println("");
System.out.println("RESULT");
// Print resulting hierarchy
printArray(builder.build().getHierarchy());
System.out.println("");
} else {
System.out.println("Incompatible type of builder");
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Exemplifies the use of the order-based builder.
*/
private static void orderBased() {
// Create the builder
HierarchyBuilderOrderBased<Long> builder = HierarchyBuilderOrderBased.create(DataType.INTEGER, false);
// Define grouping fanouts
builder.getLevel(0).addGroup(10, DataType.INTEGER.createAggregate().createIntervalFunction());
builder.getLevel(1).addGroup(2, DataType.INTEGER.createAggregate().createIntervalFunction());
// Alternatively
// builder.setAggregateFunction(AggregateFunction.INTERVAL(DataType.INTEGER));
// builder.getLevel(0).addFanout(10);
// builder.getLevel(1).addFanout(2);
System.out.println("---------------------");
System.out.println("ORDER-BASED HIERARCHY");
System.out.println("---------------------");
System.out.println("");
System.out.println("SPECIFICATION");
// Print specification
for (Level<Long> level : builder.getLevels()) {
System.out.println(level);
}
// Print info about resulting groups
System.out.println("Resulting levels: "+Arrays.toString(builder.prepare(getExampleData())));
System.out.println("");
System.out.println("RESULT");
// Print resulting hierarchy
printArray(builder.build().getHierarchy());
System.out.println("");
}
/**
* Exemplifies the use of the redaction-based builder.
*/
private static void redactionBased() {
// Create the builder
HierarchyBuilderRedactionBased<?> builder = HierarchyBuilderRedactionBased.create(Order.RIGHT_TO_LEFT,
Order.RIGHT_TO_LEFT,
' ', '*');
System.out.println("-------------------------");
System.out.println("REDACTION-BASED HIERARCHY");
System.out.println("-------------------------");
System.out.println("");
System.out.println("SPECIFICATION");
// Print info about resulting groups
System.out.println("Resulting levels: "+Arrays.toString(builder.prepare(getExampleData())));
System.out.println("");
System.out.println("RESULT");
// Print resulting hierarchy
printArray(builder.build().getHierarchy());
System.out.println("");
}
}