/*******************************************************************************
* Copyright (c) 2007 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.demandpa.alg.refinepolicy;
import java.util.Arrays;
/**
* Default {@link RefinementPolicy} implementation, delegating to some provided {@link FieldRefinePolicy} and
* {@link CallGraphRefinePolicy}
* @author manu
*
*/
public abstract class AbstractRefinementPolicy implements RefinementPolicy {
protected static final int DEFAULT_NUM_PASSES = 4;
protected static final int LONGER_PASS_BUDGET = 12000;
private static final int SHORTER_PASS_BUDGET = 1000;
private static final int[] DEFAULT_BUDGET_PER_PASS;
static {
int[] tmp = new int[DEFAULT_NUM_PASSES];
tmp[0] = SHORTER_PASS_BUDGET;
Arrays.fill(tmp, 1, DEFAULT_NUM_PASSES, LONGER_PASS_BUDGET);
DEFAULT_BUDGET_PER_PASS = tmp;
}
protected final FieldRefinePolicy fieldRefinePolicy;
protected final CallGraphRefinePolicy cgRefinePolicy;
protected final int numPasses;
protected final int[] budgetPerPass;
public AbstractRefinementPolicy(FieldRefinePolicy fieldRefinePolicy, CallGraphRefinePolicy cgRefinePolicy, int numPasses,
int[] budgetPerPass) {
this.fieldRefinePolicy = fieldRefinePolicy;
this.cgRefinePolicy = cgRefinePolicy;
this.numPasses = numPasses;
this.budgetPerPass = budgetPerPass;
}
public AbstractRefinementPolicy(FieldRefinePolicy fieldRefinePolicy, CallGraphRefinePolicy cgRefinePolicy) {
this(fieldRefinePolicy, cgRefinePolicy, DEFAULT_NUM_PASSES, DEFAULT_BUDGET_PER_PASS);
}
@Override
public int getBudgetForPass(int passNum) {
return budgetPerPass[passNum];
}
@Override
public CallGraphRefinePolicy getCallGraphRefinePolicy() {
return cgRefinePolicy;
}
@Override
public FieldRefinePolicy getFieldRefinePolicy() {
return fieldRefinePolicy;
}
@Override
public int getNumPasses() {
return numPasses;
}
@Override
public boolean nextPass() {
// don't short-circuit since nextPass() can have side-effects
boolean fieldNextPass = fieldRefinePolicy.nextPass();
boolean callNextPass = cgRefinePolicy.nextPass();
return fieldNextPass || callNextPass;
}
}