/*
* 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.util.Arrays;
import de.linearbits.newtonraphson.NewtonRaphsonConfiguration;
/**
* Runtime configuration for the solver
* @author prasser
*
*/
public class ARXSolverConfiguration extends NewtonRaphsonConfiguration<ARXSolverConfiguration>{
/** SVUID*/
private static final long serialVersionUID = -7122709349147064168L;
/**
* Creates a new instance
* @return
*/
public static ARXSolverConfiguration create() {
return new ARXSolverConfiguration();
}
/**
* Default value.
* @return
*/
public static double getDefaultAccuracy() {
return 1e-6;
}
/**
* Default value.
* @return
*/
public static boolean getDefaultDeterministic() {
return true;
}
/**
* Default value.
* @return
*/
public static int getDefaultIterationsPerTry() {
return 1000;
}
/**
* Default value.
* @return
*/
public static int getDefaultIterationsTotal() {
return 10000;
}
/**
* Default value. Returns a set of start values for the solver in range [0,1][0,1]
* @return
*/
public static double[][] getDefaultStartValues() {
double[][] result = new double[16][];
int index = 0;
for (double d1 = 0d; d1 < 1d; d1 += 0.33d) {
for (double d2 = 0d; d2 < 1d; d2 += 0.33d) {
result[index++] = new double[] { d1, d2 };
}
}
return result;
}
/**
* Default value.
* @return
*/
public static int getDefaultTimePerTry() {
return 100;
}
/**
* Default value.
* @return
*/
public static int getDefaultTimeTotal() {
return 1000;
}
/** Modified*/
private boolean modified = false;
/**
* Creates a new instance
*/
private ARXSolverConfiguration() {
// Set default values
this.accuracy(getDefaultAccuracy());
this.iterationsPerTry(getDefaultIterationsPerTry());
this.iterationsTotal(getDefaultIterationsTotal());
this.timePerTry(getDefaultTimePerTry());
this.timeTotal(getDefaultTimeTotal());
this.setDeterministic(getDefaultDeterministic());
}
@Override
public ARXSolverConfiguration accuracy(double arg0) {
if (arg0 != super.getAccuracy()) {
modified = true;
}
return super.accuracy(arg0);
}
/**
* Clones this config
*/
public ARXSolverConfiguration clone() {
ARXSolverConfiguration result = ARXSolverConfiguration.create();
result.accuracy(this.getAccuracy());
result.iterationsPerTry(this.getIterationsPerTry());
result.iterationsTotal(this.getIterationsTotal());
result.timePerTry(this.getTimePerTry());
result.timeTotal(this.getTimeTotal());
result.preparedStartValues(this.getStartValues().clone());
return result;
}
/**
* Returns whether the solving process is deterministic
* @return
*/
public boolean isDeterministic() {
return super.getStartValues() != null;
}
/**
* Modified
* @return
*/
public boolean isModified() {
return this.modified;
}
@Override
public ARXSolverConfiguration iterationsPerTry(int arg0) {
if (arg0 != super.getIterationsPerTry()) {
modified = true;
}
return super.iterationsPerTry(arg0);
}
@Override
public ARXSolverConfiguration iterationsTotal(int arg0) {
if (arg0 != super.getIterationsTotal()) {
modified = true;
}
return super.iterationsTotal(arg0);
}
@Override
public ARXSolverConfiguration preparedStartValues(double[][] values) {
if ((super.getStartValues() == null && values != null) ||
(values == null && super.getStartValues() != null) ||
(values != null && !Arrays.equals(super.getStartValues(), values))) {
modified = true;
}
return super.preparedStartValues(values);
}
/**
* Sets the solving process to be deterministic
* @param deterministic
* @return
*/
public ARXSolverConfiguration setDeterministic(boolean deterministic) {
return preparedStartValues(deterministic ? getDefaultStartValues() : null);
}
/**
* Modified
*/
public void setUnmodified() {
this.modified = false;
}
@Override
public ARXSolverConfiguration timePerTry(int arg0) {
if (arg0 != super.getTimePerTry()) {
modified = true;
}
return super.timePerTry(arg0);
}
@Override
public ARXSolverConfiguration timeTotal(int arg0) {
if (arg0 != super.getTimeTotal()) {
modified = true;
}
return super.timeTotal(arg0);
}
}