001/* Copyright (C) 2013 TU Dortmund 002 * This file is part of AutomataLib, http://www.automatalib.net/. 003 * 004 * AutomataLib is free software; you can redistribute it and/or 005 * modify it under the terms of the GNU Lesser General Public 006 * License version 3.0 as published by the Free Software Foundation. 007 * 008 * AutomataLib is distributed in the hope that it will be useful, 009 * but WITHOUT ANY WARRANTY; without even the implied warranty of 010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 011 * Lesser General Public License for more details. 012 * 013 * You should have received a copy of the GNU Lesser General Public 014 * License along with AutomataLib; if not, see 015 * http://www.gnu.de/documents/lgpl.en.html. 016 */ 017package net.automatalib.automata.fsa.impl.compact; 018 019import java.util.BitSet; 020 021import net.automatalib.automata.base.compact.AbstractCompactSimpleDet; 022import net.automatalib.automata.dot.DOTHelperFSA; 023import net.automatalib.automata.dot.DOTPlottableAutomaton; 024import net.automatalib.automata.fsa.MutableDFA; 025import net.automatalib.automata.fsa.abstractimpl.AbstractDFA; 026import net.automatalib.automata.fsa.abstractimpl.AbstractFSA; 027import net.automatalib.commons.util.Pair; 028import net.automatalib.graphs.dot.GraphDOTHelper; 029import net.automatalib.words.Alphabet; 030 031public class CompactDFA<I> extends AbstractCompactSimpleDet<I, Boolean> implements MutableDFA<Integer,I>, DOTPlottableAutomaton<Integer, I, Integer> { 032 public static final float DEFAULT_RESIZE_FACTOR = 1.5f; 033 public static final int DEFAULT_INIT_CAPACITY = 11; 034 035 private final BitSet acceptance = new BitSet(); 036 037 public CompactDFA(Alphabet<I> alphabet) { 038 super(alphabet); 039 } 040 041 public CompactDFA(Alphabet<I> alphabet, int stateCapacity) { 042 super(alphabet, stateCapacity); 043 } 044 045 public CompactDFA(Alphabet<I> alphabet, float resizeFactor) { 046 super(alphabet, resizeFactor); 047 } 048 049 public CompactDFA(Alphabet<I> alphabet, int stateCapacity, float resizeFactor) { 050 super(alphabet, stateCapacity, resizeFactor); 051 } 052 053 @Override 054 public void ensureCapacity(int oldCap, int newCap) { 055 acceptance.set(newCap); 056 } 057 058 059 060 061 @Override 062 public void flipAcceptance() { 063 acceptance.flip(0, size()); 064 } 065 066 067 068 @Override 069 public void clear() { 070 acceptance.clear(); 071 super.clear(); 072 } 073 074 075 public void setAccepting(int state, boolean accepting) { 076 acceptance.set(state, accepting); 077 } 078 079 @Override 080 public void setAccepting(Integer state, boolean accepting) { 081 setAccepting(state.intValue(), accepting); 082 } 083 084 085 @Override 086 public Integer addState(boolean accepting) { 087 return addState(Boolean.valueOf(accepting)); 088 } 089 090 091 public boolean isAccepting(int stateId) { 092 return acceptance.get(stateId); 093 } 094 095 @Override 096 public boolean isAccepting(Integer state) { 097 return isAccepting(state.intValue()); 098 } 099 100 @Override 101 public boolean accepts(Iterable<I> input) { 102 return AbstractDFA.accepts(this, input); 103 } 104 105 @Override 106 public Boolean computeSuffixOutput(Iterable<I> prefix, 107 Iterable<I> suffix) { 108 return AbstractFSA.computeSuffixOutput(this, prefix, suffix); 109 } 110 111 @Override 112 public Boolean computeOutput(Iterable<I> input) { 113 return AbstractFSA.computeOutput(this, input); 114 } 115 116 @Override 117 public Boolean getStateProperty(int stateId) { 118 return isAccepting(stateId); 119 } 120 121 @Override 122 public void initState(int stateId, Boolean property) { 123 setAccepting(stateId, property.booleanValue()); 124 } 125 126 127 @Override 128 public void setStateProperty(int stateId, Boolean property) { 129 setAccepting(stateId, property.booleanValue()); 130 } 131 132 @Override 133 public Integer addInitialState(boolean accepting) { 134 return addInitialState(Boolean.valueOf(accepting)); 135 } 136 137 @Override 138 public GraphDOTHelper<Integer, Pair<I, Integer>> getDOTHelper() { 139 return new DOTHelperFSA<>(this); 140 } 141 142}