package pl.piotrsukiennik.whowhen.classification.label;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import java.io.Serializable;
import java.util.*;
/**
* @author Piotr Sukiennik
*/
@JsonAutoDetect
public class LabelledIndexIntervals implements Serializable {
@JsonProperty
private List<double[]> resultData;
@JsonIgnore
private Map<String, Set<IndexInterval>> indexIntervals = new LinkedHashMap<String, Set<IndexInterval>>();
@JsonIgnore
private IndexInterval lastIndexInterval = new IndexInterval();
public LabelledIndexIntervals() {
}
public IndexInterval addIndexInterval( IndexInterval indexInterval ) {
Set<IndexInterval> intervalsForLabel = indexIntervals.get( indexInterval.getLabel() );
if ( intervalsForLabel == null ) {
intervalsForLabel = new TreeSet<IndexInterval>();
indexIntervals.put( indexInterval.getLabel(), intervalsForLabel );
}
intervalsForLabel.add( indexInterval );
return indexInterval;
}
public void applyLabel( String label, int where ) {
lastIndexInterval = lastIndexInterval.add( label, where );
}
public List<double[]> getResultData() {
return resultData;
}
public void setResultData( List<double[]> resultData ) {
this.resultData = resultData;
}
@JsonProperty
public Map<String, List<int[]>> getLabelledIndexRanges() {
Map<String, List<int[]>> output = new TreeMap<String, List<int[]>>();
for ( Map.Entry<String, Set<IndexInterval>> c : indexIntervals.entrySet() ) {
List<int[]> ranges = new ArrayList<int[]>();
for ( IndexInterval indexInterval : c.getValue() ) {
ranges.add( indexInterval.getRange() );
}
output.put( c.getKey(), ranges );
}
return output;
}
public TreeSet<IndexInterval> getIndexIntervals() {
TreeSet<IndexInterval> intervals = new TreeSet<IndexInterval>();
for ( Map.Entry<String, Set<IndexInterval>> c : indexIntervals.entrySet() ) {
intervals.addAll( c.getValue() );
}
return intervals;
}
public class IndexInterval implements Comparable<IndexInterval> {
private String label;
private int[] range = new int[2];
IndexInterval() {
}
IndexInterval( String label, Integer from ) {
this( label, from, from );
}
IndexInterval( String label, Integer from, Integer to ) {
this( label, new int[] { from, to } );
}
IndexInterval( String label, int[] range ) {
this.label = label;
this.range = range;
addIndexInterval( this );
}
public int[] getRange() {
return range;
}
public String getLabel() {
return label;
}
public void setLabel( String label ) {
this.label = label;
}
public int getFrom() {
return range[0];
}
public IndexInterval add( String label, int index ) {
if ( this.label == null || !this.label.equals( label ) || index - getTo() > 1 ) {
return new IndexInterval( label, index );
}
setTo( index );
return this;
}
public void setFrom( int from ) {
this.range[0] = from;
}
public int getTo() {
return range[1];
}
public void setTo( int to ) {
this.range[1] = to;
}
public int compareTo( IndexInterval o ) {
return Integer.compare( getFrom(), o.getFrom() );
}
@Override
public boolean equals( Object o ) {
if ( this == o )
return true;
if ( o == null || getClass() != o.getClass() )
return false;
IndexInterval that = (IndexInterval) o;
if ( label != null ? !label.equals( that.label ) : that.label != null )
return false;
if ( !Arrays.equals( range, that.range ) )
return false;
return true;
}
@Override
public int hashCode() {
int result = label != null ? label.hashCode() : 0;
result = 31 * result + ( range != null ? Arrays.hashCode( range ) : 0 );
return result;
}
}
}