/*******************************************************************************
* Copyright 2012 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.modeling.research.approach1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import edu.isi.karma.rep.alignment.Node;
public class RankedSteinerSet implements Comparable<RankedSteinerSet>{
private Set<Node> nodes;
private List<Integer> cohesion;
public RankedSteinerSet(Set<Node> nodes) {
this.nodes = nodes;
this.cohesion = this.computeCohesion();
}
public Set<Node> getNodes() {
return nodes;
}
public String getCohesionString() {
String s = "";
for (Integer i : this.cohesion)
s += String.valueOf(i);
return s;
}
private List<Integer> computeCohesion() {
if (nodes == null)
return null;
List<String> patternIds = new ArrayList<String>();
for (Node n : nodes)
for (String s : n.getPatternIds())
patternIds.add(s);
Function<String, String> stringEqualiy = new Function<String, String>() {
@Override public String apply(final String s) {
return s;
}
};
Multimap<String, String> index =
Multimaps.index(patternIds, stringEqualiy);
List<Integer> frequencies = new ArrayList<Integer>();
for (String s : index.keySet()) {
frequencies.add(index.get(s).size());
}
Collections.sort(frequencies);
frequencies = Lists.reverse(frequencies);
return frequencies;
}
private int compareCohesions(List<Integer> c1, List<Integer> c2) {
if (c1 == null || c2 == null)
return 0;
for (int i = 0; i < c1.size(); i++) {
if (i < c2.size()) {
if (c1.get(i) > c2.get(i)) return 1;
else if (c1.get(i) < c2.get(i)) return -1;
}
}
if (c1.size() < c2.size())
return 1;
else if (c2.size() < c1.size())
return -1;
else
return 0;
}
// @Override
// public int compareTo(RankedSteinerSet s) {
//
// int size1 = this.nodes == null ? 0 : this.nodes.size();
// int size2 = s.getNodes() == null ? 0 : s.getNodes().size();
//
// if (size1 < size2)
// return -1;
// else if (size1 > size2)
// return 1;
// else
// return -compareCohesions(this.cohesion, s.cohesion);
// }
@Override
public int compareTo(RankedSteinerSet s) {
int size1 = this.nodes == null ? 0 : this.nodes.size();
int size2 = s.getNodes() == null ? 0 : s.getNodes().size();
int k = compareCohesions(this.cohesion, s.cohesion);
if (k > 0)
return -1;
else if (k < 0)
return 1;
else if (size1 < size2)
return -1;
else
return 1;
}
}