package edu.wiki.concept;
import edu.wiki.api.concept.IConceptIterator;
import edu.wiki.api.concept.IConceptVector;
import edu.wiki.api.concept.IConceptVectorData;
import gnu.trove.TDoubleProcedure;
import gnu.trove.TIntDoubleHashMap;
import gnu.trove.TIntDoubleIterator;
import java.io.Serializable;
public class TroveConceptVector implements IConceptVector, Serializable {
private static final long serialVersionUID = 5228670885044409972L;
private TIntDoubleHashMap valueMap;
private int size;
public TroveConceptVector(int size ) {
this.size = size;
valueMap = new TIntDoubleHashMap(size);
}
@Override
public void add(int key, double d) {
valueMap.put( key, valueMap.get( key ) + d );
}
@Override
public void add( IConceptVector v ) {
IConceptIterator it = v.iterator();
while( it.next() ) {
add( it.getId(), it.getValue() );
}
}
@Override
public int count() {
return valueMap.size();
}
@Override
public double get( int key ) {
return valueMap.get( key );
}
@Override
public IConceptVectorData getData() {
return new TroveConceptVectorData();
}
@Override
public IConceptIterator iterator() {
return new TroveConceptVectorIterator();
}
@Override
public IConceptIterator orderedIterator() {
return new TroveConceptVectorOrderedIterator( valueMap );
}
@Override
public void set( int key, double d ) {
if( d != 0 ) {
valueMap.put( key, d );
}
else {
valueMap.remove( key );
}
}
@Override
public int size() {
return size;
}
private class TroveConceptVectorData implements IConceptVectorData {
public int getConceptCount() {
return valueMap.size();
}
public double getNorm1() {
NormProcedure n1 = new NormProcedure( 1 );
valueMap.forEachValue( n1 );
return n1.getNorm();
}
public double getNorm2() {
NormProcedure n2 = new NormProcedure( 2 );
valueMap.forEachValue( n2 );
return n2.getNorm();
}
private class NormProcedure implements TDoubleProcedure {
int p;
double sum;
private NormProcedure( int p ) {
this.p = p;
sum = 0;
}
@Override
public boolean execute( double value ) {
if( p == 1 ) {
sum += value;
}
else {
sum += Math.pow( value, p );
}
return true;
}
private double getNorm() {
return Math.pow( sum, 1.0 / (double)p );
}
}
}
private class TroveConceptVectorIterator implements IConceptIterator {
TIntDoubleIterator valueIt;
private TroveConceptVectorIterator() {
reset();
}
@Override
public int getId() {
return valueIt.key();
}
@Override
public double getValue() {
return valueIt.value();
}
@Override
public boolean next() {
if( valueIt.hasNext() ) {
valueIt.advance();
return true;
}
return false;
}
@Override
public void reset() {
valueIt = valueMap.iterator();
}
}
}