// Path: src/treecmp/metric/MatchingSplitMetric.java
// public class MatchingSplitMetric extends BaseMetric implements Metric {
//   private MatchingSplitMetricO3 ms03;
//   private MatchingSplitMetricOptRF msRF;
//   private MatchingSpliMetricFree msFree;
// 
//   public MatchingSplitMetric(){
//       super();
//       ms03 = new MatchingSplitMetricO3();
//       msRF = new MatchingSplitMetricOptRF();
//       msFree = new MatchingSpliMetricFree();
//   }
// 
//     public double getDistance(Tree t1, Tree t2, int... indexes) {
// 
//         if (IOSettings.getIOSettings().isOptMsMcByRf())
//             return msRF.getDistance(t1, t2);
// 
//         if (IOSettings.getIOSettings().isUseMsMcFreeLeafSet()) {
//             return msFree.getDistance(t1, t2);
//         }
// 
//         return ms03.getDistance(t1, t2);
//     }
// 
//     @Override
//     public AlignInfo getAlignment() {
//         if (IOSettings.getIOSettings().isOptMsMcByRf()) {
//             return null;
//         }
// 
//         if (IOSettings.getIOSettings().isUseMsMcFreeLeafSet()) {
//             return null;
//         }
//         return ms03.getAlignment();
//     }
// }
// 
// Path: src/treecmp/metric/RFMetric.java
// public class RFMetric extends BaseMetric implements Metric{
// 
//     public static double getRFDistance(Tree t1, Tree t2) {
// 
//         int n = t1.getExternalNodeCount();
//         if (n <= 3)
//             return 0;
// 
//         IdGroup idGroup = TreeUtils.getLeafIdGroup(t1);
//         BitSet[] s_t1=SplitDist.getSplits(t1, idGroup);
//         BitSet[] s_t2=SplitDist.getSplits(t2, idGroup);
//         int N1=s_t1.length;
//         int N2=s_t2.length;
//         int hashSetSize=(4*(N1+1))/3;
// 
//         HashSet<BitSet> s_t1_hs=new HashSet<BitSet>(hashSetSize);
// 
//         int i;
//         for(i=0;i<N1;i++){
//             s_t1_hs.add(s_t1[i]);
//         }
// 
//         int common=0;
//         for(i=0;i<N2;i++){
//              if (s_t1_hs.contains(s_t2[i])){
//                 common++;
//             }
//         }
// 
//         double dist=((double)N1+(double)N2)*0.5-(double)common;
//         return dist;
// 
//     }
// 
//     
// 
//     public double getDistance(Tree t1, Tree t2, int... indexes) {
// 
//         return RFMetric.getRFDistance(t1, t2);
// 
//     }
// }


import treecmp.metric.Metric;
import treecmp.metric.RFMetric;
import treecmp.metric.MatchingSplitMetric;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package treecmp.spr;


/**
 *
 * @author Damian
 */
public class UsprHeuristicMSMetric extends UsprHeuristicBaseMetric {

    @Override
    protected Metric getMetric(){
// Path: src/treecmp/metric/MatchingSplitMetric.java
// public class MatchingSplitMetric extends BaseMetric implements Metric {
//   private MatchingSplitMetricO3 ms03;
//   private MatchingSplitMetricOptRF msRF;
//   private MatchingSpliMetricFree msFree;
// 
//   public MatchingSplitMetric(){
//       super();
//       ms03 = new MatchingSplitMetricO3();
//       msRF = new MatchingSplitMetricOptRF();
//       msFree = new MatchingSpliMetricFree();
//   }
// 
//     public double getDistance(Tree t1, Tree t2, int... indexes) {
// 
//         if (IOSettings.getIOSettings().isOptMsMcByRf())
//             return msRF.getDistance(t1, t2);
// 
//         if (IOSettings.getIOSettings().isUseMsMcFreeLeafSet()) {
//             return msFree.getDistance(t1, t2);
//         }
// 
//         return ms03.getDistance(t1, t2);
//     }
// 
//     @Override
//     public AlignInfo getAlignment() {
//         if (IOSettings.getIOSettings().isOptMsMcByRf()) {
//             return null;
//         }
// 
//         if (IOSettings.getIOSettings().isUseMsMcFreeLeafSet()) {
//             return null;
//         }
//         return ms03.getAlignment();
//     }
// }
// 
// Path: src/treecmp/metric/RFMetric.java
// public class RFMetric extends BaseMetric implements Metric{
// 
//     public static double getRFDistance(Tree t1, Tree t2) {
// 
//         int n = t1.getExternalNodeCount();
//         if (n <= 3)
//             return 0;
// 
//         IdGroup idGroup = TreeUtils.getLeafIdGroup(t1);
//         BitSet[] s_t1=SplitDist.getSplits(t1, idGroup);
//         BitSet[] s_t2=SplitDist.getSplits(t2, idGroup);
//         int N1=s_t1.length;
//         int N2=s_t2.length;
//         int hashSetSize=(4*(N1+1))/3;
// 
//         HashSet<BitSet> s_t1_hs=new HashSet<BitSet>(hashSetSize);
// 
//         int i;
//         for(i=0;i<N1;i++){
//             s_t1_hs.add(s_t1[i]);
//         }
// 
//         int common=0;
//         for(i=0;i<N2;i++){
//              if (s_t1_hs.contains(s_t2[i])){
//                 common++;
//             }
//         }
// 
//         double dist=((double)N1+(double)N2)*0.5-(double)common;
//         return dist;
// 
//     }
// 
//     
// 
//     public double getDistance(Tree t1, Tree t2, int... indexes) {
// 
//         return RFMetric.getRFDistance(t1, t2);
// 
//     }
// }


// Path: src/treecmp/spr/UsprHeuristicMSMetric.java
import treecmp.metric.Metric;
import treecmp.metric.RFMetric;
import treecmp.metric.MatchingSplitMetric;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package treecmp.spr;


/**
 *
 * @author Damian
 */
public class UsprHeuristicMSMetric extends UsprHeuristicBaseMetric {

    @Override
    protected Metric getMetric(){
        return new MatchingSplitMetric();