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}