/**
* Copyright (C) 2001-3, Anthony Harrison anh23@pitt.edu This library is free
* software; you can redistribute it and/or modify it under the terms of the GNU
* Lesser General Public License as published by the Free Software Foundation;
* either version 2.1 of the License, or (at your option) any later version.
* This library 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 Lesser General Public License for more
* details. You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.jactr.core.chunk;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.chunk.five.ISubsymbolicChunk5;
import org.jactr.core.production.request.ChunkTypeRequest;
/*
* sorts descending based on current activation
*/
/*
* sorts by activation, descending
*/
/**
* Description of the Class
*
* @author harrison
* @created April 18, 2003
*/
public class ChunkActivationComparator implements java.util.Comparator<IChunk>
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(ChunkActivationComparator.class);
ChunkTypeRequest _pattern;
/*
* 1 one <two 0 one=two -1 one>two
*/
/**
* Description of the Method
*
* @param one
* Description of the Parameter
* @param two
* Description of the Parameter
* @return Description of the Return Value
*/
public int compare(IChunk one, IChunk two)
{
/*
* exact same chunk
*/
if (one == two || (one != null && one.equals(two))) return 0;
ISubsymbolicChunk sc1 = one.getSubsymbolicChunk();
ISubsymbolicChunk sc2 = two.getSubsymbolicChunk();
double base1 = sc1.getActivation();
double base2 = sc2.getActivation();
if (_pattern != null)
try
{
base1 = ((ISubsymbolicChunk5) sc1).getActivation(_pattern);
base2 = ((ISubsymbolicChunk5) sc2).getActivation(_pattern);
}
catch (ClassCastException cce)
{
if (LOGGER.isDebugEnabled())
LOGGER.debug("Someone isnt a subsymbolicchunk5");
}
// System.out.println(one+": "+base1+" <=> "+two+": "+base2);
/*
* this will eliminate chunks of the same activation, but possibly different
* chunks - dumb mistake
*/
// if (base1 == base2)
// {
// return 0;
// }
// else
if (base1 < base2) return 1;
if (base1 == base2) /*
* this is necessary because this comparator is often
* used in a set situation
*
* @see DefaultSlotSearchSupport.findCandidates(). If we
* just return -1 all the time when the activations
* are equal, then searching for a specific chunk
* in the set might abort early. This was the case
* when candidateList.removeAll(cullSet) was being
* called in findCandidates and cullSet was not
* actually removed.
*/
// sort by something deterministic - name..
return one.getSymbolicChunk().getName().compareTo(
two.getSymbolicChunk().getName());
return -1;
}
/**
* Sets the pattern attribute of the IChunkActivationComparator object
*
* @param p
* The new pattern value
*/
public void setChunkTypeRequest(ChunkTypeRequest p)
{
_pattern = p;
}
}