/* DefaultBookBuilder.java created 2008-02-24
*
*/
package org.signalml.domain.book.test;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Random;
import org.signalml.domain.book.BookBuilder;
import org.signalml.domain.book.BookFormatException;
import org.signalml.domain.book.DefaultBookAtom;
import org.signalml.domain.book.DefaultMutableBook;
import org.signalml.domain.book.IncrementalBookWriter;
import org.signalml.domain.book.MPv5BookWriter;
import org.signalml.domain.book.MutableBook;
import org.signalml.domain.book.MutableBookSegment;
import org.signalml.domain.book.StandardBook;
import org.signalml.domain.book.StandardBookAtom;
import org.signalml.domain.book.StandardBookWriter;
/** DefaultBookBuilder
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class RandomBookBuilder implements BookBuilder {
private static RandomBookBuilder sharedInstance = null;
protected RandomBookBuilder() {
}
public static RandomBookBuilder getInstance() {
if (sharedInstance == null) {
synchronized (RandomBookBuilder.class) {
if (sharedInstance == null)
sharedInstance = new RandomBookBuilder();
}
}
return sharedInstance;
}
public MutableBook createBook(int channelCount, float samplingFrequency) {
return new DefaultMutableBook(channelCount, samplingFrequency);
}
@Override
public StandardBook readBook(File file) throws IOException, BookFormatException {
int channelCount = 21;
float samplingFrequency = 128;
int segmentLength = 20 * 128;
int i;
int e;
Random random = new Random();
DefaultMutableBook book = new DefaultMutableBook(channelCount, samplingFrequency);
MutableBookSegment[] segment1 = book.addNewSegment(0, segmentLength);
for (i=0; i<channelCount; i++) {
float energy = (float)(1000 * Math.abs(random.nextDouble()));
segment1[i].setSignalEnergy(energy);
segment1[i].setDecompositionEnergy(energy - ((float)(100 * Math.abs(random.nextDouble()))));
float[] samples = new float[segmentLength];
for (e=0; e<segmentLength; e++) {
samples[e] = (float)(100 * (random.nextDouble()-0.5));
}
segment1[i].setSignalSamples(samples);
for (e=0; e<20; e++) {
segment1[i].addAtom(createRandomAtom(random, e, samplingFrequency, segmentLength));
}
/*
segment1[i].addAtom(segment1[i].createAtom(StandardBookAtom.GABORWAVE_IDENTITY, 0, 100, 100, 0, 100, 0, 0) );
segment1[i].addAtom(segment1[i].createAtom(StandardBookAtom.GABORWAVE_IDENTITY, 0, 100, 100, 2560-1, 100, 0, 0) );
segment1[i].addAtom(segment1[i].createAtom(StandardBookAtom.GABORWAVE_IDENTITY, 0, 100, 100, 2560-1, 100, 2560/2-1, 0) );
segment1[i].addAtom(segment1[i].createAtom(StandardBookAtom.GABORWAVE_IDENTITY, 0, 100, 100, 0, 100, 2560/2-1, 0) );
segment1[i].addAtom(segment1[i].createAtom(StandardBookAtom.GABORWAVE_IDENTITY, 0, 100, 100, 2560/2, 100, 2560/4, 0) );
*/
}
MutableBookSegment[] segment2 = book.addNewSegment(20, segmentLength);
for (i=0; i<channelCount; i++) {
float energy = (float)(2000 * Math.abs(random.nextDouble()));
segment2[i].setSignalEnergy(energy);
segment2[i].setDecompositionEnergy(energy - ((float)(100 * Math.abs(random.nextDouble()))));
float[] samples = new float[segmentLength];
for (e=0; e<segmentLength; e++) {
samples[e] = (float)(100 * (random.nextDouble()-0.5));
}
segment2[i].setSignalSamples(samples);
for (e=0; e<30; e++) {
segment2[i].addAtom(createRandomAtom(random, e, samplingFrequency, segmentLength));
}
}
MutableBookSegment[] segment3 = book.addNewSegment(40, segmentLength);
for (i=0; i<channelCount; i++) {
float energy = (float)(3000 * Math.abs(random.nextDouble()));
segment3[i].setSignalEnergy(energy);
segment3[i].setDecompositionEnergy(energy - ((float)(100 * Math.abs(random.nextDouble()))));
float[] samples = new float[segmentLength];
for (e=0; e<segmentLength; e++) {
samples[e] = (float)(100 * (random.nextDouble()-0.5));
}
segment3[i].setSignalSamples(samples);
for (e=0; e<20; e++) {
segment3[i].addAtom(createRandomAtom(random, e, samplingFrequency, segmentLength));
}
}
book.setBookComment("Book comment");
book.setCalibration(1F);
book.setDate((new Date()).toString());
book.setDictionarySize(10000);
book.setEnergyPercent(95);
book.setMaxIterationCount(50);
book.setDictionaryType('x');
book.setSamplingFrequency(samplingFrequency);
book.setSignalChannelCount(21);
book.setTextInfo("Text info");
book.setWebSiteInfo("Web site info");
return book;
}
@Override
public void writeBookComplete(StandardBook book, File file) throws IOException {
IncrementalBookWriter bookWriter = writeBookIncremental(book, file);
int segmentCount = book.getSegmentCount();
for (int i=0; i<segmentCount; i++) {
bookWriter.writeSegment(book.getSegmentAt(i));
}
bookWriter.close();
}
@Override
public IncrementalBookWriter writeBookIncremental(StandardBook book, File file) throws IOException {
return new MPv5BookWriter(book, file);
}
private StandardBookAtom createRandomAtom(Random random, int iteration, float samplingFrequency, int segmentLength) {
DefaultBookAtom atom = new DefaultBookAtom(
samplingFrequency,
segmentLength,
StandardBookAtom.GABORWAVE_IDENTITY,
iteration,
(float)(100 * Math.abs(random.nextDouble())),
//(int) ( (segmentLength/2) * Math.abs( random.nextDouble() ) ),
2560/2-1,
//(int) (segmentLength * Math.abs( random.nextDouble() ) ),
2560-1,
(int)(segmentLength * Math.abs(random.nextDouble())),
(float)(100 * Math.abs(random.nextDouble())),
(float)(3.14 * random.nextDouble())
);
return atom;
}
@Override
public StandardBookWriter createBook() {
throw new UnsupportedOperationException("Not implemented: RandomBookBuilder.createBook");
}
@Override
public IncrementalBookWriter writeBookIncremental(StandardBookWriter book, String file) throws IOException {
throw new UnsupportedOperationException("Not implemented: RandomBookBuilder.writeBookIncremental");
}
}