/*******************************************************************************
* 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;
public class CandidateSteinerSets {
private static final int MAX_SIZE = 1000;
private int maxNumberOfSteinerNodes;
private List<SteinerNodes> steinerSets;
public CandidateSteinerSets(int maxNumberOfSteinerNodes) {
this.maxNumberOfSteinerNodes = maxNumberOfSteinerNodes;
this.steinerSets = new ArrayList<SteinerNodes>();
}
public int numberOfCandidateSets() {
return this.steinerSets.size();
}
public List<SteinerNodes> getSteinerSets() {
return this.steinerSets;
}
public void updateSteinerSets(SemanticTypeMapping mapping) {
List<SteinerNodes> newSteinerNodes = new ArrayList<SteinerNodes>();
if (this.steinerSets.size() == 0) {
for (MappingStruct ms : mapping.getMappingStructs()) {
SteinerNodes sn = new SteinerNodes(maxNumberOfSteinerNodes);
sn.addNode(ms.getSource(), 1.0);
if (mapping.getType() == MappingType.DataNode) {
sn.addNode(ms.getTarget(), sn.getConfidence());
}
this.steinerSets.add(sn);
}
} else {
for (SteinerNodes nodeSet : this.steinerSets) {
for (MappingStruct ms : mapping.getMappingStructs()) {
SteinerNodes sn = new SteinerNodes(nodeSet);
if (mapping.getType() == MappingType.ClassNode) {
if (nodeSet.getNodes().contains(ms.getSource()))
continue;
sn.addNode(ms.getSource(), sn.getConfidence());
}
else if (mapping.getType() == MappingType.DataNode) {
if (nodeSet.getNodes().contains(ms.getSource()) &&
nodeSet.getNodes().contains(ms.getTarget()))
continue;
sn.addNode(ms.getSource(), sn.getConfidence());
sn.addNode(ms.getTarget(), sn.getConfidence());
}
newSteinerNodes.add(sn);
}
}
// sort Steiner nodes based on their score
Collections.sort(newSteinerNodes);
this.steinerSets.clear();
for (int i = 0; i < MAX_SIZE && i < newSteinerNodes.size(); i++)
this.steinerSets.add(newSteinerNodes.get(i));
}
}
}