/*
* 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.metric.v2;
import java.io.Serializable;
import org.deidentifier.arx.framework.check.groupify.HashGroupify;
import org.deidentifier.arx.framework.check.groupify.HashGroupifyEntry;
import org.deidentifier.arx.framework.data.GeneralizationHierarchy;
/**
* A class that supports associating input with output
* @author Florian Kohlmayer, Fabian Prasser
*
*/
public class TupleMatcher implements Serializable {
/** SVUID*/
private static final long serialVersionUID = -5081573765755187296L;
/** Data*/
private final int[][][] hierarchies;
/** Data*/
private final int[][] data;
/** Data*/
private final int[] tuple;
/**
* Creates a new instance
* @param hierarchies
* @param input
*/
TupleMatcher(GeneralizationHierarchy[] hierarchies, int[][] input) {
// Store hierarchies
this.hierarchies = new int[input[0].length][][];
for (int dimension = 0; dimension < this.hierarchies.length; dimension++) {
this.hierarchies[dimension] = hierarchies[dimension].getArray();
}
// Store data
this.data = input;
// Create tuple
this.tuple = new int[this.hierarchies.length];
}
/**
* Returns the entry for the given input tuple
* @param row
* @param generalization
* @param groupify
* @return
*/
HashGroupifyEntry getEntry(int row, int[] generalization, HashGroupify groupify) {
// Transform the tuple
int[] inputtuple = data[row];
for (int dimension = 0; dimension < tuple.length; dimension++) {
tuple[dimension] = hierarchies[dimension][inputtuple[dimension]][generalization[dimension]];
}
// Return
return groupify.getEntry(tuple);
}
}