package automenta.netention.linker.hueristic;
import automenta.netention.DefiniteValue;
import automenta.netention.Detail;
import automenta.netention.IndefiniteValue;
import automenta.netention.Link;
import automenta.netention.PropertyValue;
import automenta.netention.link.Satisfies;
import java.util.List;
import java.util.logging.Logger;
import java.util.Collection;
import java.util.LinkedList;
/**
Link Strength Heuristic
1.Inherited Pattern Similarity
2.Definite → Indefinite Satisfaction
3.Definite → Indefinite Dissatisfaction
4.Indefinite → Indefinite Similarity
5.
*
*/
public class DefaultHeuristicLinker extends HueristicLinker {
private static final Logger logger = Logger.getLogger(DefaultHeuristicLinker.class.getName());
@Override public Link compareSatisfying(Detail a, Detail b) {
double strength = 0;
//System.out.println(" comparing: " + a.getProperties() + " -> " + b.getProperties());
strength += getPatternStrength(a, b);
if (strength > 0.0) {
strength += getIndefiniteDefiniteComparison(a, b);
strength += getIndefiniteDefiniteComparison(b, a);
strength += getIndefiniteIndefiniteComparison(a, b);
}
return new Satisfies(strength);
}
/** strength of declared pattern correlation, a -> b, in [0..1.0] */
public double getPatternStrength(Detail a, Detail b) {
if (a.getPatterns().size() == 0)
return 0.0;
List<String> bPatterns = b.getPatterns();
double s = 0;
for (String aP : a.getPatterns()) {
if (bPatterns.contains(aP)) {
s += 1.0;
}
//TODO accumulate matched super-patterns
}
return s / ((double)a.getPatterns().size());
}
/** compare A.Indefinite's -> B.Definite's satisfaction or dissatisfaction*/
public double getIndefiniteDefiniteComparison(Detail a, Detail b) {
//TODO use numIndefiniteProperties rather than numTotalProperties ??
double numProperties = a.getProperties().size();
if (numProperties == 0.0)
return 0.0;
double s = 0;
for (PropertyValue aP : a.getProperties()) {
if (aP instanceof IndefiniteValue) {
IndefiniteValue iap = (IndefiniteValue) aP;
double maxSat = 0;
for (PropertyValue bP : getProperties(b, aP.getProperty())) {
if (bP instanceof DefiniteValue) {
DefiniteValue dbp = (DefiniteValue)bP;
double sat = satisifies(iap, dbp);
if (sat > maxSat)
maxSat = sat;
}
}
s += maxSat;
}
}
return s / numProperties;
}
public Collection<PropertyValue> getProperties(Detail d, String property) {
List<PropertyValue> lpv = new LinkedList();
for (PropertyValue pv : d.getProperties()) {
if (pv.getProperty().equals(property))
lpv.add(pv);
}
return lpv;
}
public double satisifies(IndefiniteValue i, DefiniteValue d) {
return d.satisfies(i);
// if (d instanceof IntegerIs) {
// IntegerIs dI = (IntegerIs) d;
// return dI.satisfies(i);
// }
// else if (d instanceof RealIs) {
// RealIs dR = (RealIs) d;
// return dR.satisfies(i);
// }
// else if (d instanceof StringIs) {
// return ((StringIs)d).satisfies(i);
// }
// else if (d instanceof GeoPointIs) {
// return ((GeoPointIs)d).satisfies(i);
// }
// else if (d instanceof NodeIs) {
//
// }
// else {
// logger.severe("unrecognized definite value type: " + d.getClass() + " for definiteValue " + d);
// }
// return false;
}
/** compare indefinite <-> indefinite satisfaction or dissatisfaction*/
public double getIndefiniteIndefiniteComparison(Detail a, Detail b) {
//TODO calculate indefinite -> indefinite detail mutual satisfaction / overlap */
return 0.0;
}
}