// Copyright 2013 Thomas Müller // This file is part of MarMoT, which is licensed under GPLv3. package marmot.core; public class Transition extends State { private State previous_state_; private State state_; private int order_; public Transition(State previous_state, State state, int order) { super(); previous_state_ = previous_state; state_ = state; order_ = order; } @Override public int getOrder() { return order_; } @Override public boolean canTransitionTo(State other) { if (other.getOrder() != getOrder()) { assert other.getOrder() == 1; assert other.getIndex() == 0; return true; } State next = state_; State previous = ((Transition) other).previous_state_; /*System.err.println(this); System.err.println(other); System.err.println(previous); System.err.println(next); System.err.println(previous.equalIndexes(next)); System.err.println();*/ return previous.equalIndexes(next); } @Override public boolean equalIndexes(State other) { assert other instanceof Transition; Transition t = (Transition) other; return t.state_.equalIndexes(state_) && t.previous_state_.equalIndexes(previous_state_); } @Override public void incrementEstimatedCounts(double d) { estimated_count_ += d; state_.incrementEstimatedCounts(d); } @Override public void updateWeights(WeightVector weights) { if (estimated_count_ != 0.0) { weights.updateWeights(this, estimated_count_, true); state_.updateWeights(weights); estimated_count_ = 0.0; } } @Override public State getZeroOrderState() { return state_.getZeroOrderState(); } @Override public State getPreviousSubOrderState() { return previous_state_; } @Override public State getSubOrderState() { return state_; } @Override public int getIndex() { return state_.getIndex(); } @Override public State getSubLevelState() { return state_.getSubLevelState(); } @Override public void setSubLevelState(State sub_level_state) { throw new UnsupportedOperationException(); } @Override public State getSubLevel(int depth) { return state_.getSubLevel(depth); } @Override public String toString() { return "(" + previous_state_.toString() + " " + getZeroOrderState().toString() + ")"; } @Override public int getLevel() { return state_.getLevel(); } @Override public boolean check() { return previous_state_.check() && state_.check(); } @Override public State copy() { return super.copy(new Transition(previous_state_, state_, order_)); } }