Log in Help
Print
HomegatepluginsJAPE_Plussrccomontotextjapeautomaton 〉 TripleTransitions.java
 
/*
 *  TripleTransitions.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;

import java.util.Arrays;

import com.ontotext.jape.pda.StatePDA;
import com.ontotext.jape.pda.TransitionPDA;

/**
 * This class is used for the conversion from FSM to Automaton and from
 * Automaton to FSM.
 * 
 * @author petar.mitankin
 * 
 */
public class TripleTransitions {
	protected WholeSet states;
	protected ClosedHashOfLabels labels;
	protected StatePDA[] finalities;
	protected int finalitiesStored;
	protected int[] stateFinalities;
	protected int[] transitionsFrom;
	protected int[] transitionsLabel;
	protected int[] transitionsTo;
	protected int transitionsStored;
	protected int transitionsAlloced;

	public TripleTransitions() {
		states = new WholeSet(GenericWholeArrray.TYPE_INT);
		labels = new ClosedHashOfLabels();
		finalities = new StatePDA[64];
		stateFinalities = new int[32];
		for (int i = 0; i < stateFinalities.length; i++) {
			stateFinalities[i] = Constants.NO;
		}
		transitionsAlloced = 64;
		transitionsFrom = new int[transitionsAlloced];
		transitionsLabel = new int[transitionsAlloced];
		transitionsTo = new int[transitionsAlloced];
	}

	public void add(int from, TransitionPDA transition, int to) {
		if (transitionsStored == transitionsAlloced) {
			transitionsAlloced += transitionsAlloced / 2;
			transitionsFrom = GenericWholeArrray.realloc(transitionsFrom,
					transitionsAlloced, transitionsStored);
			transitionsLabel = GenericWholeArrray.realloc(transitionsLabel,
					transitionsAlloced, transitionsStored);
			transitionsTo = GenericWholeArrray.realloc(transitionsTo,
					transitionsAlloced, transitionsStored);
		}
		transitionsFrom[transitionsStored] = states.add(from);
		int id;
		if (transition.isEpsilon()) {
			labels.addEpsilon();
			id = Automaton.EPSILON;
		} else {
			id = labels.put(transition) + 1;// it is always > 0
		}
		transitionsLabel[transitionsStored] = id;
		transitionsTo[transitionsStored] = states.add(to);
		transitionsStored++;
		reallocStateFinalities();
	}

	private void reallocStateFinalities() {
		int statesStored = states.getStored();
		if (statesStored > stateFinalities.length) {
			int newStateFinalities[] = new int[2 * statesStored];
			int i;
			for (i = 0; i < stateFinalities.length; i++) {
				newStateFinalities[i] = stateFinalities[i];
			}
			for (; i < newStateFinalities.length; i++) {
				newStateFinalities[i] = Constants.NO;
			}
			stateFinalities = newStateFinalities;
		}
	}

	public void addAll(Automaton aut, AutomatonBuildHelp help) {
		int i;
		for (i = 0; i < transitionsStored; i++) {
			aut.addTransition(help, transitionsFrom[i], transitionsLabel[i],
					transitionsTo[i]);
		}
		int statesStored = (states.getStored() < aut.statesStored) ? states
				.getStored() : aut.statesStored;
		for (i = 0; i < statesStored; i++) {
			aut.stateFinalities.setElement(i, stateFinalities[i]);
		}
	}

	public void setTheInitialState(Automaton aut, int state) {
		int i = states.contains(state);
		if (i != -1) {
			aut.setTheInitialState(i);
		}
	}

	public void setStateFinality(StatePDA finalState) {
		int index = states.add(finalState.getIndex());
		reallocStateFinalities();
		if (finalitiesStored == finalities.length) {
			finalities = Arrays.copyOf(finalities, 2 * finalitiesStored);
		}
		finalities[finalitiesStored] = finalState;
		stateFinalities[index] = finalitiesStored;
		finalitiesStored++;
	}

	public void makeStateNonfinal(int state) {
		int index = states.add(state);
		reallocStateFinalities();
		stateFinalities[index] = Constants.NO;
	}

	public StatePDA[] getFinalitites() {
		return finalities;
	}
}