// Path: src/java/org/sidoh/collections/Pair.java
// public class Pair<T1, T2> {
// 	protected T1 v1;
// 	protected T2 v2;
// 	
// 	public Pair(T1 v1, T2 v2) {
// 		this.v1 = v1;
// 		this.v2 = v2;
// 	}
// 
// 	public T1 getV1() {
// 		return v1;
// 	}
// 
// 	public void setV1(T1 v1) {
// 		this.v1 = v1;
// 	}
// 
// 	public T2 getV2() {
// 		return v2;
// 	}
// 
// 	public void setV2(T2 v2) {
// 		this.v2 = v2;
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((v1 == null) ? 0 : v1.hashCode());
// 		result = prime * result + ((v2 == null) ? 0 : v2.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		Pair other = (Pair) obj;
// 		if (v1 == null) {
// 			if (other.v1 != null)
// 				return false;
// 		} else if (!v1.equals(other.v1))
// 			return false;
// 		if (v2 == null) {
// 			if (other.v2 != null)
// 				return false;
// 		} else if (!v2.equals(other.v2))
// 			return false;
// 		return true;
// 	}
// 	
// 	public String toString() {
// 		return "(" + v1 + "," + v2 + ")";
// 	}
// 
// 	public static <T1, T2> Pair<T1, T2> create(T1 v1, T2 v2) {
// 		return new Pair<T1, T2>(v1, v2);
// 	}
// }
// 
// Path: src/java/org/sidoh/io/Serializer.java
// public interface Serializer<T> {
// 	/**
// 	 * @param object
// 	 * @param out
// 	 * @throws IOException
// 	 */
// 	public void serialize(T object, OutputStream out) throws IOException;
// }
// 
// Path: src/java/org/sidoh/song_recognition/database/SongMetaData.java
// public class SongMetaData implements Serializable {
// 	private static final long serialVersionUID = -2438398130255866971L;
// 	
// 	private String filename;
// 	private String name;
// 	private int id;
// 
// 	public SongMetaData(String filename, String name, int id) {
// 		this.filename = filename;
// 		this.name = name;
// 		this.id = id;
// 	}
// 	
// 	public String getFilename() {
// 		return filename;
// 	}
// 
// 	public void setFilename(String filename) {
// 		this.filename = filename;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 
// 	public int getId() {
// 		return id;
// 	}
// 
// 	public void setId(int id) {
// 		this.id = id;
// 	}
// 		
// }


import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.sidoh.collections.IndexingDictionary;
import org.sidoh.collections.Pair;
import org.sidoh.io.Serializer;
import org.sidoh.song_recognition.database.SignatureDatabase.QueryResponse;
import org.sidoh.song_recognition.database.SongMetaData;
import org.sidoh.song_recognition.signature.StarHashSignature;
package org.sidoh.song_recognition.benchmark.report;



public class ReportEntry implements Serializable {
	public static final Serializer<ReportEntry> jsonSerializer = new Serializer<ReportEntry>() {
		@Override
		public void serialize(ReportEntry object, OutputStream out) throws IOException {
			// TODO Auto-generated method stub

			BufferedWriter b = new BufferedWriter(new OutputStreamWriter(out));

			b.append("{");
			b.append(String.format("\"clipName\" : \"%s\", ", object.getClipSongPart()));
			b.append(String.format("\"clipStart\" : %d,", object.getClipStart()));
			b.append(String.format("\"clipEnd\" : %d,", object.getClipEnd()));
			b.append(String.format("\"addedNoiseId\" : \"%s\",", object.getNoiseId()));
			b.append(String.format("\"matchFound\" : %d,", object.matchFound() ? 1 : 0));
			b.append(String.format("\"matchCorrect\" : %d,", object.matchCorrect ? 1 : 0));
			b.append(String.format("\"songId\" : \"%s\",", object.getSongId()));
			b.append(String.format("\"confidence\" : %.5f,", object.getConfidence()));
			b.append(String.format("\"hasSpectrogram\" : %d,", object.hasSpectrogram() ? 1 : 0));
			b.append(String.format("\"hasHistograms\" : %d", object.hasHistograms() ? 1 : 0));
			if (object.hasSpectrogram()) {
				b.append(String.format(",\"spectrogramPath\" : \"%s\"", object.getSpectrogramPath()));
			}
			if (object.hasHistograms()) {
				b.append(String.format(",\"histogramPaths\" : ["));
				
// Path: src/java/org/sidoh/collections/Pair.java
// public class Pair<T1, T2> {
// 	protected T1 v1;
// 	protected T2 v2;
// 	
// 	public Pair(T1 v1, T2 v2) {
// 		this.v1 = v1;
// 		this.v2 = v2;
// 	}
// 
// 	public T1 getV1() {
// 		return v1;
// 	}
// 
// 	public void setV1(T1 v1) {
// 		this.v1 = v1;
// 	}
// 
// 	public T2 getV2() {
// 		return v2;
// 	}
// 
// 	public void setV2(T2 v2) {
// 		this.v2 = v2;
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((v1 == null) ? 0 : v1.hashCode());
// 		result = prime * result + ((v2 == null) ? 0 : v2.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		Pair other = (Pair) obj;
// 		if (v1 == null) {
// 			if (other.v1 != null)
// 				return false;
// 		} else if (!v1.equals(other.v1))
// 			return false;
// 		if (v2 == null) {
// 			if (other.v2 != null)
// 				return false;
// 		} else if (!v2.equals(other.v2))
// 			return false;
// 		return true;
// 	}
// 	
// 	public String toString() {
// 		return "(" + v1 + "," + v2 + ")";
// 	}
// 
// 	public static <T1, T2> Pair<T1, T2> create(T1 v1, T2 v2) {
// 		return new Pair<T1, T2>(v1, v2);
// 	}
// }
// 
// Path: src/java/org/sidoh/io/Serializer.java
// public interface Serializer<T> {
// 	/**
// 	 * @param object
// 	 * @param out
// 	 * @throws IOException
// 	 */
// 	public void serialize(T object, OutputStream out) throws IOException;
// }
// 
// Path: src/java/org/sidoh/song_recognition/database/SongMetaData.java
// public class SongMetaData implements Serializable {
// 	private static final long serialVersionUID = -2438398130255866971L;
// 	
// 	private String filename;
// 	private String name;
// 	private int id;
// 
// 	public SongMetaData(String filename, String name, int id) {
// 		this.filename = filename;
// 		this.name = name;
// 		this.id = id;
// 	}
// 	
// 	public String getFilename() {
// 		return filename;
// 	}
// 
// 	public void setFilename(String filename) {
// 		this.filename = filename;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 
// 	public int getId() {
// 		return id;
// 	}
// 
// 	public void setId(int id) {
// 		this.id = id;
// 	}
// 		
// }


// Path: src/java/org/sidoh/song_recognition/benchmark/report/ReportEntry.java
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.sidoh.collections.IndexingDictionary;
import org.sidoh.collections.Pair;
import org.sidoh.io.Serializer;
import org.sidoh.song_recognition.database.SignatureDatabase.QueryResponse;
import org.sidoh.song_recognition.database.SongMetaData;
import org.sidoh.song_recognition.signature.StarHashSignature;

package org.sidoh.song_recognition.benchmark.report;



public class ReportEntry implements Serializable {
	public static final Serializer<ReportEntry> jsonSerializer = new Serializer<ReportEntry>() {
		@Override
		public void serialize(ReportEntry object, OutputStream out) throws IOException {
			// TODO Auto-generated method stub

			BufferedWriter b = new BufferedWriter(new OutputStreamWriter(out));

			b.append("{");
			b.append(String.format("\"clipName\" : \"%s\", ", object.getClipSongPart()));
			b.append(String.format("\"clipStart\" : %d,", object.getClipStart()));
			b.append(String.format("\"clipEnd\" : %d,", object.getClipEnd()));
			b.append(String.format("\"addedNoiseId\" : \"%s\",", object.getNoiseId()));
			b.append(String.format("\"matchFound\" : %d,", object.matchFound() ? 1 : 0));
			b.append(String.format("\"matchCorrect\" : %d,", object.matchCorrect ? 1 : 0));
			b.append(String.format("\"songId\" : \"%s\",", object.getSongId()));
			b.append(String.format("\"confidence\" : %.5f,", object.getConfidence()));
			b.append(String.format("\"hasSpectrogram\" : %d,", object.hasSpectrogram() ? 1 : 0));
			b.append(String.format("\"hasHistograms\" : %d", object.hasHistograms() ? 1 : 0));
			if (object.hasSpectrogram()) {
				b.append(String.format(",\"spectrogramPath\" : \"%s\"", object.getSpectrogramPath()));
			}
			if (object.hasHistograms()) {
				b.append(String.format(",\"histogramPaths\" : ["));
				
				Iterator<Entry<String, Pair<Double,String>>> itr = object.getHistograms().entrySet().iterator();