code: public void associate()
  	{
  		// initialize data structures
  		matches.reset();
  		unassociatedSrc.reset();
  
  		if( srcPositive.size == 0 && srcNegative.size == 0 )
  			return;
  		if( dstPositive.size == 0 && dstNegative.size == 0 )
  			return;
  
  		// find and add the matches
  		assoc.setSource((FastQueue)srcPositive);
  		assoc.setDestination((FastQueue) dstPositive);
  		assoc.associate();
  		FastQueue<AssociatedIndex> m = assoc.getMatches();
  		for( int i = 0; i < m.size; i++ ) {
  			AssociatedIndex a = m.data[i];
  			int globalSrcIndex = srcPositive.data[a.src].index;
  			int globalDstIndex = dstPositive.data[a.dst].index;
  			matches.grow().setAssociation(globalSrcIndex,globalDstIndex,a.fitScore);
  		}
  		GrowQueue_I32 un = assoc.getUnassociatedSource();
  		for( int i = 0; i < un.size; i++ ) {
  			unassociatedSrc.add(srcPositive.data[un.get(i)].index);
  		}
  		assoc.setSource((FastQueue)srcNegative);
  		assoc.setDestination((FastQueue) dstNegative);
  		assoc.associate();
  		m = assoc.getMatches();
  		for( int i = 0; i < m.size; i++ ) {
  			AssociatedIndex a = m.data[i];
  			int globalSrcIndex = srcNegative.data[a.src].index;
  			int globalDstIndex = dstNegative.data[a.dst].index;
  			matches.grow().setAssociation(globalSrcIndex,globalDstIndex,a.fitScore);
  		}
  		un = assoc.getUnassociatedSource();
  		for( int i = 0; i < un.size; i++ ) {
  			unassociatedSrc.add(srcNegative.data[un.get(i)].index);
  		}
  	}
docs: Associates the features together.