Log in Help
Print
HomegatepluginsJAPE_Plussrccomontotextjapeautomaton 〉 AutomatonMinimizationHelp.java
 
/*
 *  AutomatonMinimizationHelp.java
 *
 *  Copyright (c) 2010-2011, Ontotext (www.ontotext.com).
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *
 *  $Id$
 */
package com.ontotext.jape.automaton;

/**
 * This class is needed while minimizing an automaton.
 * 
 * @author petar.mitankin
 * 
 */
public class AutomatonMinimizationHelp {
	// states:
	protected int[] statesClassNumber;
	protected int[] statesNext;
	protected int[] statesPrev;
	protected int statesStored;

	// classes:
	protected int[] classesFirstState;
	protected int[] classesPower;
	protected int[] classesNewPower;
	protected int[] classesNewClass;
	protected int[] classesFirstLetter;
	protected int[] classesNext;
	protected int classesStored;
	protected int classesAlloced;
	protected int firstClass;

	// letters:
	protected int[] lettersLetter;
	protected int[] lettersNext;
	protected int lettersStored;
	protected int lettersAlloced;

	protected AutomatonMinimizationHelp(int statesStored) {
		this.statesStored = statesStored;
		statesClassNumber = new int[statesStored];
		statesNext = new int[statesStored];
		statesPrev = new int[statesStored];

		classesAlloced = 1024;
		classesFirstState = new int[classesAlloced];
		classesPower = new int[classesAlloced];
		classesNewPower = new int[classesAlloced];
		classesNewClass = new int[classesAlloced];
		classesFirstLetter = new int[classesAlloced];
		classesNext = new int[classesAlloced];
		firstClass = Constants.NO;

		lettersAlloced = 1024;
		lettersLetter = new int[lettersAlloced];
		lettersNext = new int[lettersAlloced];
	}

	protected void addState(int state, int classToAdd) {
		statesNext[state] = classesFirstState[classToAdd];
		if (classesFirstState[classToAdd] != Constants.NO) {
			statesPrev[classesFirstState[classToAdd]] = state;
		}
		statesPrev[state] = Constants.NO;
		statesClassNumber[state] = classToAdd;
		classesFirstState[classToAdd] = state;
		classesPower[classToAdd]++;
	}

	protected void addLetter(int classToAdd, int letter) {
		if (lettersStored == lettersAlloced) {
			int mem = lettersAlloced + lettersAlloced / 4;
			lettersLetter = GenericWholeArrray.realloc(lettersLetter, mem,
					lettersStored);
			lettersNext = GenericWholeArrray.realloc(lettersNext, mem,
					lettersStored);
			lettersAlloced = mem;
		}
		if (classesFirstLetter[classToAdd] == Constants.NO) {
			classesNext[classToAdd] = firstClass;
			firstClass = classToAdd;
		}
		lettersLetter[lettersStored] = letter;
		lettersNext[lettersStored] = classesFirstLetter[classToAdd];
		classesFirstLetter[classToAdd] = lettersStored;
		lettersStored++;
	}

	protected void reallocClasses() {
		int mem = classesAlloced + classesAlloced / 4;
		classesFirstState = GenericWholeArrray.realloc(classesFirstState, mem,
				classesStored);
		classesPower = GenericWholeArrray.realloc(classesPower, mem,
				classesStored);
		classesNewPower = GenericWholeArrray.realloc(classesNewPower, mem,
				classesStored);
		classesNewClass = GenericWholeArrray.realloc(classesNewClass, mem,
				classesStored);
		classesFirstLetter = GenericWholeArrray.realloc(classesFirstLetter,
				mem, classesStored);
		classesNext = GenericWholeArrray.realloc(classesNext, mem,
				classesStored);
		classesAlloced = mem;
	}

	protected void moveState(int state, int newClass) {
		int curClass = statesClassNumber[state];
		if (statesPrev[state] == Constants.NO) {
			classesFirstState[curClass] = statesNext[state];
		} else {
			statesNext[statesPrev[state]] = statesNext[state];
		}
		if (statesNext[state] != Constants.NO) {
			statesPrev[statesNext[state]] = statesPrev[state];
		}
		addState(state, newClass);
	}
}