Package com.meapsoft.composers

Source Code of com.meapsoft.composers.NNComposer

/*
*  Copyright 2006-2007 Columbia University.
*
*  This file is part of MEAPsoft.
*
*  MEAPsoft is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License version 2 as
*  published by the Free Software Foundation.
*
*  MEAPsoft 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
*  General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with MEAPsoft; if not, write to the Free Software
*  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
*  02110-1301 USA
*
*  See the file "COPYING" for the text of the license.
*/

package com.meapsoft.composers;

import java.text.NumberFormat;
import java.util.Collections;
import java.util.Vector;

import com.meapsoft.ChunkDist;
import com.meapsoft.EDLChunk;
import com.meapsoft.EDLFile;
import com.meapsoft.FeatChunk;
import com.meapsoft.FeatFile;

/**
* Program that composes an EDL by hopping around from chunk to chunk. Starts
* from a the first chunk in the source file. Always picks the nearest neighbor
* in feature space from current chunk. Should replicate Dan Ellis' ordercols.m.
*
* @author Ron Weiss (ronw@ee.columbia.edu)
*/
public class NNComposer extends SortComposer
{
  public static String oldDesc = "NNComposer starts at the first chunk and proceeds through the sound file from each chunk to its nearest neighbor, according to the features in the input features file.";

  //@mike: empty constructor just to sniff this guy
  //please don't call this constructor, it will not work
  public NNComposer()
  {
    initNameAndDescription("Nearest Neighbor", new String(oldDesc));
  }
 
  public NNComposer(String featFN, String outFN)
  {
    super(featFN, outFN);
  }

  public NNComposer(FeatFile featFN, EDLFile outFN)
  {
    super(featFN, outFN);
  }

  public NNComposer(String featFN, String outFN, ChunkDist cd)
  {
    super(featFN, outFN, cd);
  }

  public NNComposer(FeatFile featFN, EDLFile outFN, ChunkDist cd)
  {
    super(featFN, outFN, cd);
  }

  public void printUsageAndExit()
  {
    System.out
        .println("Usage: NNComposer [-options] features.feat \n\n"
            + "  where options include:\n"
            + "    -o output_file  the file to write the output to (defaults to sorted.edl)\n"
            + "    -g              debug mode (prints out chunk features on each line of output file)");
    printCommandLineOptions('i');
    printCommandLineOptions('d');
    printCommandLineOptions('c');
    System.out.println();
    System.exit(0);
  }

  /**
   * NNComposer constructor. Parses command line arguments
   */
  public NNComposer(String[] args)
  {
    super(args);
  }

  public EDLFile compose()
  {
    // initial chunk - pick it at random:
    // int randIdx = (int)Math.floor(featFile.chunks.size()*Math.random());
    // start with the first chunk
    FeatChunk currChunk = (FeatChunk) featFile.chunks.get(0);

    dist.setTarget(currChunk);

    Vector chunks = new Vector(featFile.chunks);

    NumberFormat fmt = NumberFormat.getInstance();
    fmt.setMaximumFractionDigits(3);

    double currTime = 0;
    while (chunks.size() > 0)
    {
      dist.setTarget(currChunk);
            currChunk = (FeatChunk) Collections.min(chunks, dist);
            chunks.remove(currChunk);

      // turn currChunk into an EDL chunk
      EDLChunk nc = new EDLChunk(currChunk, currTime);

      if (debug)
      {
        nc.comment = "    # feats = ";
        double[] feat = currChunk.getFeatures(featdim);
        for (int x = 0; x < feat.length - 1; x++)
          nc.comment += fmt.format(feat[x]) + ", ";
        nc.comment += fmt.format(feat[feat.length - 1]);
      }

      outFile.chunks.add(nc);

      currTime += currChunk.length;

      progress.setValue(progress.getValue() + 1);
    }

    // outFile now contains some chunks.
    outFile.haveReadFile = true;

    return outFile;
  }

  public static void main(String[] args)
  {
    NNComposer m = new NNComposer(args);
    long startTime = System.currentTimeMillis();

    m.run();

    System.out.println("Done. Took "
        + ((System.currentTimeMillis() - startTime) / 1000.0) + "s");
    System.exit(0);
  }
}
TOP

Related Classes of com.meapsoft.composers.NNComposer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.