You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.3 KiB
131 lines
3.3 KiB
/*
|
|
* This file is part of a Java port of the program ltl2dstar
|
|
* (http://www.ltl2dstar.de/) for PRISM (http://www.prismmodelchecker.org/)
|
|
* Copyright (C) 2005-2007 Joachim Klein <j.klein@ltl2dstar.de>
|
|
* Copyright (c) 2007 Carlos Bederian
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
package jltl2dstar;
|
|
|
|
/** @file
|
|
* Provide class StateMapperFuzzy
|
|
*/
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Vector;
|
|
|
|
/**
|
|
* A mapping from KeyType to StateType, with ResultType as an alternative key type, which can be fuzzily matched
|
|
* using CandidateMatcher.
|
|
*/
|
|
public class StateMapperFuzzy <CandidateMatcher extends SafraTreeCandidateMatcher> implements StateMapperInterface<SafraTreeTemplate, SafraTree, DA_State>
|
|
{
|
|
private class ListValue {
|
|
SafraTree _key;
|
|
DA_State _state;
|
|
}
|
|
|
|
/** The hash map from StateType to MappedStateType */
|
|
private HashMap<AbstractedKeyType, Vector<ListValue>> _map;
|
|
private int _count;
|
|
|
|
/** Constructor. */
|
|
public StateMapperFuzzy() {
|
|
_count = 0;
|
|
_map = new HashMap<AbstractedKeyType, Vector<ListValue>>();
|
|
}
|
|
|
|
/** Clear the mapping. */
|
|
public void clear() {
|
|
_map.clear();
|
|
_count = 0;
|
|
}
|
|
|
|
/**
|
|
* Search for a mapping, fuzzily
|
|
* @param result the query
|
|
* @return the corresponding state or NULL otherwise
|
|
*/
|
|
public DA_State find(SafraTreeTemplate result) {
|
|
|
|
AbstractedKeyType search_key = new AbstractedKeyType(result.getState());
|
|
|
|
Vector<ListValue> list = _map.get(search_key);
|
|
if (list != null) {
|
|
for (ListValue elem : list) {
|
|
if (CandidateMatcher.isMatch(result, elem._key)) {
|
|
return elem._state;
|
|
}
|
|
}
|
|
}
|
|
// not found
|
|
return null;
|
|
}
|
|
|
|
|
|
/**
|
|
* Add a mapping
|
|
* @param key the key
|
|
* @param state the state
|
|
*/
|
|
public void add(SafraTree key, DA_State state) {
|
|
|
|
AbstractedKeyType akey = new AbstractedKeyType(key);
|
|
|
|
ListValue item = new ListValue();
|
|
|
|
item._key = key;
|
|
item._state = state;
|
|
|
|
if (_map.get(akey) == null) {
|
|
_map.put(akey, new Vector<ListValue>());
|
|
}
|
|
_map.get(akey).add(item);
|
|
|
|
_count++;
|
|
}
|
|
|
|
/** Get the number of trees */
|
|
public int size() {return _count;}
|
|
|
|
|
|
|
|
/**
|
|
* A structure that abstracts the Keytype to its abstracted properties
|
|
*/
|
|
private class AbstractedKeyType {
|
|
|
|
private SafraTree _key;
|
|
|
|
public AbstractedKeyType(SafraTree key) {_key = key;}
|
|
|
|
public int hashCode() {
|
|
return CandidateMatcher.hash(_key);
|
|
}
|
|
|
|
public boolean equals(AbstractedKeyType other) {
|
|
return CandidateMatcher.abstract_equal_to(_key, other._key);
|
|
}
|
|
|
|
public boolean equals(Object o) {
|
|
return (o.getClass() == this.getClass()) && this.equals((AbstractedKeyType) o);
|
|
}
|
|
|
|
public boolean lessThan(AbstractedKeyType other) {
|
|
return CandidateMatcher.abstract_less_than(_key, other._key);
|
|
}
|
|
}
|
|
}
|