PageRenderTime 42ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 1ms

/code/DomainTheory.java

http://silkin.googlecode.com/
Java | 1285 lines | 1118 code | 48 blank | 119 comment | 373 complexity | 2e58a1ba8b673ac985b961aeb6eb5c6c MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. import java.util.*;
  2. import java.io.*;
  3. import java.text.*;
  4. /** This class completes the definition of a Domain Theory in Prolog syntax. In this system, a Domain Theory is a grammar
  5. defining a Kinship System. This is the level at which 90% of the action takes place in Active Learning.
  6. <p>
  7. Because so many methods are defined at the Domain Theory level, the code files are broken into 4 classes:
  8. DT_Abstract1, DT_Abstract2, DomainTheory & Learned_DT.
  9. @author Gary Morris, Northern Virginia Community College garymorris2245@verizon.net
  10. */
  11. public class DomainTheory extends DT_Abstract2 {
  12. public static PrintWriter testOutFile;
  13. public static boolean SIMILARITY_ON = true;
  14. public static boolean LGG_ONLY = false;
  15. public TreeMap<String, String> kinTermSymbols;
  16. public int priorDTMSize = 0;
  17. DomainTheory(String langName, String auth, String date, boolean partl) {
  18. languageName = langName;
  19. author = auth;
  20. createDate = date;
  21. partial = partl;
  22. theory = new TreeMap();
  23. } // end of general constructor
  24. /* This zero-arg constructor is for use ONLY by Serialization */
  25. DomainTheory() {
  26. languageName = "";
  27. author = " ";
  28. createDate = " ";
  29. partial = false;
  30. theory = new TreeMap();
  31. } // end of no-arg constructor
  32. /* This constructor is for cloning a DomainTheory. It is intended for use in Learning & Leave One Out testing. */
  33. DomainTheory(DomainTheory model) {
  34. languageName = model.languageName;
  35. if (model.addressTerms) {
  36. languageName += "(Adr)";
  37. }
  38. ctxt = model.ctxt;
  39. author = model.author;
  40. createDate = UDate.today();
  41. partial = model.partial;
  42. addressTerms = model.addressTerms;
  43. polygamyOK = model.polygamyOK;
  44. theory = new TreeMap(model.theory);
  45. userDefinedProperties = model.userDefinedProperties;
  46. synonyms = model.synonyms;
  47. umbrellas = model.umbrellas;
  48. overlaps = model.overlaps;
  49. nonUmbrellas = model.nonUmbrellas;
  50. nonOverlaps = model.nonOverlaps;
  51. nonSynonyms = model.nonSynonyms;
  52. } // end of cloning constructor
  53. /* This constructor is for creating the second DT in a Context */
  54. DomainTheory(Context contxt, boolean adr, String auth) {
  55. languageName = contxt.languageName;
  56. if (adr) {
  57. languageName += "(Adr)";
  58. }
  59. ctxt = contxt;
  60. author = auth;
  61. createDate = UDate.today();
  62. partial = false;
  63. addressTerms = adr;
  64. polygamyOK = ctxt.polygamyPermit;
  65. theory = new TreeMap();
  66. dyadsUndefined = new DyadTMap();
  67. } // end of 2nd_DT constructor
  68. DomainTheory(String langName) {
  69. languageName = langName;
  70. author = "";
  71. createDate = " ";
  72. partial = false;
  73. theory = new TreeMap();
  74. } // end of minimal constructor
  75. public TreeMap<String, String> getKTSymbols() {
  76. Set<String> kTerms = dyadsUndefined.keySet();
  77. kTerms.addAll(dyadsDefined.keySet());
  78. int DTMsize = kTerms.size(), n = 0;
  79. // If there are no kin terms yet, punt.
  80. if (DTMsize == 0) {
  81. return null;
  82. }
  83. // If the number of kin terms has not changed, use existing TMap.
  84. if (kinTermSymbols != null && DTMsize == priorDTMSize) {
  85. return kinTermSymbols;
  86. }
  87. // Else, create new TMap & return it.
  88. priorDTMSize = DTMsize;
  89. kinTermSymbols = new TreeMap<String, String>();
  90. String[] letters = makeLetters(DTMsize);
  91. for (String kTm : kTerms) {
  92. kinTermSymbols.put(kTm, letters[n++]);
  93. }
  94. return kinTermSymbols;
  95. }
  96. public String[] makeLetters(int size) {
  97. String[] ltrs = new String[size];
  98. String[] set1 = {"", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
  99. "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
  100. "V", "W", "X", "Y", "Z"};
  101. String[] set2 = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
  102. "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
  103. "V", "W", "X", "Y", "Z"};
  104. int n1 = 0, n2 = 0;
  105. for (int i = 0; i < size; i++) {
  106. ltrs[i] = set1[n1] + set2[(n2++ % 26)];
  107. if (n2 == 26) {
  108. n1++;
  109. }
  110. }
  111. return ltrs;
  112. }
  113. public SynonymCandidate swapSingleUmbrella(Issue issue) {
  114. if (!(issue instanceof UmbrellaCandidate)) {
  115. return null;
  116. }
  117. UmbrellaCandidate cand = (UmbrellaCandidate) issue;
  118. if (cand.subTerms.size() != 1) {
  119. return null;
  120. }
  121. Iterator sub = cand.subTerms.entrySet().iterator();
  122. Map.Entry entry = (Map.Entry) sub.next();
  123. String subTerm = (String) entry.getKey();
  124. ArrayList<Object> supportLists = (ArrayList<Object>) entry.getValue(),
  125. subTermStr = (ArrayList<Object>) supportLists.get(0),
  126. subTermDys = (ArrayList<Object>) supportLists.get(1);
  127. if (!equivalentLists(cand.pcStringsCovered, subTermStr)) {
  128. return null;
  129. }
  130. // OK, first post this as a nonUmbrella
  131. if (nonUmbrellas == null) {
  132. nonUmbrellas = new TreeMap();
  133. }
  134. if (nonUmbrellas.get(cand.kinTerm) == null) {
  135. nonUmbrellas.put(cand.kinTerm, new ArrayList<Object>());
  136. }
  137. ArrayList<Object> baddies = (ArrayList<Object>) nonUmbrellas.get(cand.kinTerm);
  138. baddies.add(subTerm);
  139. // Now we need to convert this UmbrellaCandidate to a SynonymCandidate
  140. ArrayList<Object> qns = new ArrayList<Object>(), ktermDyads = new ArrayList<Object>();
  141. int order = cand.kinTerm.compareTo(subTerm);
  142. String termPair = (order < 0 ? cand.kinTerm + "/" + subTerm : subTerm + "/" + cand.kinTerm);
  143. TreeMap umbPos = null;
  144. if (dyadsUndefined != null) {
  145. umbPos = (TreeMap) dyadsUndefined.get(cand.kinTerm);
  146. }
  147. if (umbPos != null) {
  148. ktermDyads.addAll(harvestLeaves(umbPos));
  149. }
  150. if (dyadsDefined != null) {
  151. umbPos = (TreeMap) dyadsDefined.get(cand.kinTerm);
  152. }
  153. if (umbPos != null) {
  154. ktermDyads.addAll(harvestLeaves(umbPos));
  155. }
  156. qns.add("Could these 2 kinTerms be synonyms?");
  157. qns.add("Can you provide any dyads that fit one term, but not the other?");
  158. SynonymCandidate syn = new SynonymCandidate(cand.kinTerm, qns, termPair,
  159. cand.pcStringsCovered, ktermDyads, subTermDys);
  160. return syn;
  161. } // end of method swapSingleUmbrella
  162. public String addNoise(String kinTerm, Oracle orca, float classNoiseProbabililty, float spellNoiseProbabiliity) {
  163. // With probability = classNoiseProbabililty, pick an incorrect kinTerm
  164. // With probability = spellNoiseProbabiliity, make a 1-character activity in spelling this kinTerm
  165. double diceRoll = Math.random();
  166. int tries = 0;
  167. boolean keepOn = true;
  168. if (diceRoll <= classNoiseProbabililty) { // We'll add class (kinTerm) name noise
  169. ArrayList<Object> classNames = new ArrayList<Object>(theory.keySet());
  170. classNames.removeAll(nonTerms);
  171. while (keepOn) {
  172. int which = (int) Math.floor((Math.random() * classNames.size()));
  173. if (classNames.isEmpty()) {
  174. Context.breakpoint();
  175. }
  176. if (!((String) classNames.get(which)).equals(kinTerm)) {
  177. if (orca != null) {
  178. Oracle.NoiseRecord noiseRec = new Oracle.NoiseRecord("class", kinTerm, (String) classNames.get(which));
  179. orca.holder.add(noiseRec);
  180. }
  181. return (String) classNames.get(which);
  182. }
  183. if (tries++ > 20) {
  184. keepOn = false;
  185. }
  186. } // end of while loop
  187. } // end of adding class name noise
  188. // if we get here, no class name noise was added, so add spelling noise
  189. diceRoll = Math.random();
  190. if (diceRoll <= spellNoiseProbabiliity) {
  191. String noises = "xz";
  192. char xChar = noises.charAt(0), zChar = noises.charAt(1);
  193. char[] letters = kinTerm.toCharArray();
  194. int which = (int) Math.floor((Math.random() * letters.length));
  195. char victim = letters[which];
  196. if (victim != xChar) {
  197. letters[which] = xChar;
  198. } else {
  199. letters[which] = zChar;
  200. }
  201. String newTerm = new String(letters);
  202. if (orca != null) {
  203. Oracle.NoiseRecord noiseRec = new Oracle.NoiseRecord("spell", kinTerm, newTerm);
  204. orca.holder.add(noiseRec);
  205. }
  206. kinTerm = newTerm;
  207. } // end of spelling noise
  208. return kinTerm;
  209. } // end of method addNoise
  210. public TreeMap makeNEG(String kinTerm, TreeMap pos) {
  211. // At this point:
  212. // (a) dyads for Defined terms have already been validated & removed from dyadsUndefined
  213. // (b) all dyads for KNOWN synonyms have been converted to dyads for the base term
  214. // (c) there are no circular references in 'synonyms' or in 'umbrellas'
  215. // (d) we know that all overlaping pairs have the lexically-low term as key
  216. // POS = the subtree of dyadsUndefined for kinTerm
  217. // If kinTerm is not an umbrella term or subTerm, make NEG = to all dyads
  218. // for other terms (Defined or Undefined)
  219. // If kinTerm is a declared umbrella term, add to POS any dyads for known subTerms
  220. // (whether Defined or Undefined), and subtract them from NEG
  221. // If kinTerm is a declared subTerm term, subtract from NEG any dyads for the umbrella term
  222. // (whether Defined or Undefined)
  223. // If kinTerm is an overlapping term, subtract from NEG any dyads for the overlap compainion term
  224. // (whether Defined or Undefined)
  225. // 3/16/07 CHANGE: Don't add dyads for umbrella's sub-terms to umbrella's POS -- just subtract from NEG
  226. TreeMap neg = mergeNestedTrees(dyadsUndefined, dyadsDefined);
  227. neg.remove(kinTerm);
  228. if (umbrellas != null) {
  229. Iterator umbIter = umbrellas.entrySet().iterator();
  230. while (umbIter.hasNext()) {
  231. Map.Entry entry = (Map.Entry) umbIter.next();
  232. String umbTerm = (String) entry.getKey();
  233. ArrayList<Object> subTerms = (ArrayList<Object>) entry.getValue();
  234. if (subTerms.contains(kinTerm)) // any umbrella term encompassing kinTerm is deleted from Neg
  235. {
  236. neg.remove(umbTerm);
  237. } else if (umbTerm.equals(kinTerm)) // if kinTerm == umbTerm, delete its encompassed terms from Neg
  238. {
  239. for (int i = 0; i < subTerms.size(); i++) {
  240. neg.remove(subTerms.get(i));
  241. } // end of kinTerm==umbTerm
  242. }
  243. } // end of loop thru umbrella terms
  244. } // end of umbrellas-is-not-null
  245. if (overlaps != null && overlaps.get(kinTerm) != null) { // there are overlapping terms
  246. ArrayList<Object> oLapList = (ArrayList<Object>) overlaps.get(kinTerm);
  247. for (int i = 0; i < oLapList.size(); i++) {
  248. neg.remove(oLapList.get(i));
  249. }
  250. }
  251. return mergeSubTrees(neg); // NOTE: pos & neg now are both exactStr -> dyadList.
  252. }
  253. public ArrayList<Object> validateNewDyads(String kinTerm, int maxNoise) throws KSBadHornClauseException, KSNoChainOfRelations2Alter,
  254. KSInternalErrorException, KSConstraintInconsistency, ClassNotFoundException {
  255. // Confirm that all the dyads gathered for already-accepted definitions fit those definitions.
  256. // Detect Synonyms & Umbrellas if possible. For system-created auxiliary predicates (e.g. gen<aux>), ANY hits are noise.
  257. // If a few oddballs show up, refer them to User via an Anomaly.
  258. // if (kinTerm.equals("gagi_zhakka") || kinTerm.equals("nauwa_nani")) Context.breakpoint();
  259. ArrayList<Object> posHits = new ArrayList<Object>(),
  260. posMisses = new ArrayList<Object>(),
  261. bogusDyads = new ArrayList<Object>(),
  262. validationIssues = new ArrayList<Object>();
  263. if (kinTerm.indexOf("aux>") > -1) {
  264. return validationIssues;
  265. }
  266. KinTermDef ktd = (KinTermDef) theory.get(kinTerm);
  267. if (dyadsDefined == null) {
  268. dyadsDefined = new DyadTMap();
  269. }
  270. TreeMap defTermTM = (TreeMap) dyadsDefined.remove(kinTerm); // PC_Str => ArrayList<Object> of dyads
  271. TreeMap unDefTM = (TreeMap) dyadsUndefined.remove(kinTerm); // ditto
  272. if (defTermTM == null) {
  273. defTermTM = new TreeMap();
  274. }
  275. Iterator cbIter = ktd.expandedDefs.iterator();
  276. if (unDefTM != null) {
  277. while (cbIter.hasNext()) {
  278. ClauseBody cb = (ClauseBody) cbIter.next();
  279. ArrayList<Object> dyads = (ArrayList<Object>) unDefTM.get(cb.pcString);
  280. if (dyads != null) {
  281. Iterator dyIter = dyads.iterator();
  282. while (dyIter.hasNext()) {
  283. Dyad dy = (Dyad) dyIter.next();
  284. if (fit(cb, dy)) { // remove from unDefTM; add to defTermTM
  285. dyIter.remove();
  286. if (defTermTM.get(cb.pcString) == null) {
  287. defTermTM.put(cb.pcString, new ArrayList<Object>());
  288. }
  289. ((ArrayList<Object>) defTermTM.get(cb.pcString)).add(dy);
  290. posHits.add(dy);
  291. }
  292. } // end of while loop
  293. if (dyads.isEmpty()) {
  294. unDefTM.remove(cb.pcString); // don't leave empties behind
  295. }
  296. } // end of dyads != null
  297. } // end of loop thru CBs
  298. }
  299. if (!defTermTM.isEmpty()) {
  300. dyadsDefined.put(kinTerm, defTermTM); // put 'em back, unless empty
  301. }
  302. if (unDefTM != null && !unDefTM.isEmpty()) {
  303. dyadsUndefined.put(kinTerm, unDefTM);
  304. }
  305. posMisses.addAll(harvestLeaves(unDefTM));
  306. bogusDyads = findImposters(kinTerm, ktd.expandedDefs);
  307. if (posMisses.isEmpty() && bogusDyads.isEmpty()) {
  308. return validationIssues; // All is Well. We're done.
  309. }
  310. if (posMisses.size() > 0) { // Some "pos" dyads did not match current definition
  311. Iterator dyIter = posMisses.iterator();
  312. while (dyIter.hasNext()) {
  313. Dyad dy = (Dyad) dyIter.next();
  314. if (dy.confirmed || dy.kinTermType == 7) {
  315. dyIter.remove();
  316. } else {
  317. dy.challenged = true;
  318. }
  319. }
  320. if (posMisses.size() > 0) {
  321. String defArt = (posMisses.size() == 1 ? "This " : "These "),
  322. pl = (posMisses.size() == 1 ? "" : "s"),
  323. vb = (posMisses.size() == 1 ? " does" : " do"),
  324. phr = (posMisses.size() == 1 ? "Is this " : "Are these ");
  325. String question = defArt + posMisses.size() + " dyad" + pl + vb + " not match the accepted definition of "
  326. + kinTerm + ".\n\t\t" + phr
  327. + "dyad" + pl + " wrongly labeled, or is the accepted definition wrong?";
  328. Anomaly oops = new Anomaly(ktd, kinTerm, question, "falseNeg", posHits, posMisses, null, null);
  329. validationIssues.add(oops);
  330. }
  331. } // end of making Anomaly for posMisses
  332. if (bogusDyads.size() > 0) { // Some dyads for OTHER terms match current definition
  333. // Maybe they're errors. Or maybe they are a synonym or umbrella term.
  334. // See if there a lot or just a few per kinTerm
  335. TreeMap bogusTM = new TreeMap();
  336. for (int i = 0; i < bogusDyads.size(); i++) { // Sort 'em by kinTerm
  337. Dyad dy = (Dyad) bogusDyads.get(i);
  338. String kterm = dy.kinTerm;
  339. if (bogusTM.get(kterm) == null) {
  340. bogusTM.put(kterm, new ArrayList<Object>());
  341. }
  342. ArrayList<Object> termList = (ArrayList<Object>) bogusTM.get(kterm);
  343. termList.add(dy);
  344. } // end of loop thru dyads
  345. int limit = new Double(Math.ceil(posHits.size() * maxNoise / 100d)).intValue();
  346. Iterator iter = bogusTM.values().iterator();
  347. limit = Math.max(limit, MainPane.NUMBER_OF_EGOS); // NUMBER_OF_EGOS is the smallest limit allowed
  348. while (iter.hasNext()) { // more than 'limit' implies this is NOT noise, it's a term
  349. ArrayList<Object> dyLst = (ArrayList<Object>) iter.next();
  350. String kterm = ((Dyad) dyLst.get(0)).kinTerm;
  351. if (dyLst.size() > limit && !kterm.equals("no__term")) {
  352. bogusDyads.removeAll(dyLst);
  353. }
  354. } // end of loop thru bogusTM = dyads sorted by kinTerm
  355. iter = bogusDyads.iterator();
  356. ArrayList<Object> confirmedBogies = new ArrayList<Object>();
  357. while (iter.hasNext()) {
  358. Dyad dy = (Dyad) iter.next();
  359. if (dy.confirmed || dy.kinTermType == 7) {
  360. confirmedBogies.add(dy);
  361. iter.remove();
  362. } else {
  363. dy.challenged = true;
  364. }
  365. }
  366. // Now bogusDyads contains only a few oddball terms, not comfirmed dyads, synonyms or umbrellas (hopefully)
  367. if (bogusDyads.size() > 0) { // i.e. we haven't emptied it.
  368. for (int i = 0; i < bogusDyads.size(); i++) {
  369. ((Dyad) bogusDyads.get(i)).challenged = true;
  370. }
  371. String defArt = (bogusDyads.size() == 1 ? "This " : "These "),
  372. pl = (bogusDyads.size() == 1 ? "" : "s"),
  373. vb = (bogusDyads.size() == 1 ? " does" : " do"),
  374. ha = (bogusDyads.size() == 1 ? " has" : " have"),
  375. phr = (bogusDyads.size() == 1 ? "Is this " : "Are these "),
  376. confirmed = (confirmedBogies.isEmpty() ? "" : "\nNOTE: You previously confirmed "
  377. + confirmedBogies.size() + " such.");
  378. String question = defArt + bogusDyads.size() + " dyad" + pl + vb + " match the accepted definition of "
  379. + kinTerm + " but " + ha + " been given other kin term" + pl + ".\n\t\t" + phr
  380. + "dyad" + pl + " wrongly labeled, or should the accepted definition be revised?" + confirmed;
  381. Anomaly oops = new Anomaly(ktd, kinTerm, question, "falsePos", bogusDyads, posHits, null, null);
  382. validationIssues.add(oops);
  383. } // end of we-didn't-empty-it
  384. } // end of making Anomaly for imposters
  385. ctxt.featuresHaveChanged = true;
  386. return validationIssues;
  387. } // end of method validateNewDyads
  388. public ArrayList<Object> findImposters(String kinTerm, ArrayList<Object> componentCBs) throws KSBadHornClauseException, KSNoChainOfRelations2Alter,
  389. KSInternalErrorException, KSConstraintInconsistency, ClassNotFoundException {
  390. // We're looking for anything in dyadsUndefined that meets the definition of
  391. // a clause of kinTerm's definition, but represents some other term.
  392. // We know that will be the case for umbrella terms and their subterms.
  393. // those are OK -- Exclude those.
  394. ArrayList<Object> imposters = new ArrayList<Object>(),
  395. subTermsOfKinTerm = (umbrellas == null ? null : (ArrayList<Object>) umbrellas.get(kinTerm)),
  396. overlapsOfKinTerm = (overlaps == null ? null : (ArrayList<Object>) overlaps.get(kinTerm));
  397. if (kinTerm.indexOf("<aux>") > -1) {
  398. return imposters; // auxiliaries can't have imposters
  399. }
  400. Iterator iter = dyadsUndefined.entrySet().iterator(), cbIter;
  401. while (iter.hasNext()) {
  402. Map.Entry entry = (Map.Entry) iter.next();
  403. String term = (String) entry.getKey();
  404. TreeMap termMap = (TreeMap) entry.getValue();
  405. if (termMap == null || termMap.isEmpty()) {
  406. iter.remove(); // Don't leave empties lying around!
  407. } else {
  408. ArrayList<Object> subTermsOfTerm = (umbrellas == null ? null : (ArrayList<Object>) umbrellas.get(term)),
  409. overlapsOfTerm = (overlaps == null ? null : (ArrayList<Object>) overlaps.get(term));
  410. boolean doIt = (!kinTerm.equals(term)
  411. && (subTermsOfKinTerm == null || !subTermsOfKinTerm.contains(term))
  412. && (subTermsOfTerm == null || !subTermsOfTerm.contains(kinTerm))
  413. && (overlapsOfKinTerm == null || !overlapsOfKinTerm.contains(term))
  414. && (overlapsOfTerm == null || !overlapsOfTerm.contains(kinTerm)));
  415. if (doIt) { // doIt = neither term is a subterm or overlap of the other
  416. cbIter = componentCBs.iterator(); // (no umbrella or overlaps relationship)
  417. while (cbIter.hasNext()) {
  418. ClauseBody cb = (ClauseBody) cbIter.next();
  419. ArrayList<Object> potentialImposters = (ArrayList<Object>) termMap.get(cb.pcString);
  420. if (potentialImposters != null) { // found some
  421. // Now verify that these really do fit the definition of kinTerm
  422. for (int i = 0; i < potentialImposters.size(); i++) {
  423. Dyad dy = (Dyad) potentialImposters.get(i);
  424. if (fit(cb, dy)) {
  425. imposters.add(dy);
  426. }
  427. } // end of loop thru potentialImposters
  428. } // end of potentialImposters not null
  429. } // end of loop thru CBs for this kinTerm
  430. } // end of doIt
  431. } // end of term Map not null
  432. } // end of loop thru all dyadsUndefined
  433. return imposters;
  434. } // end of method findImposters
  435. public void removeChallengedDyads(ArrayList<Object> dyads) {
  436. // Remove from this list all dyads where challenged = true;
  437. Iterator iter = dyads.iterator();
  438. while (iter.hasNext()) {
  439. Dyad dyad = (Dyad) iter.next();
  440. if (dyad.challenged) {
  441. iter.remove();
  442. }
  443. } // end of loop thru dydas
  444. } // end of method removeChallengedDyads
  445. /*
  446. public void removeSynUmbDyads(String kinTerm, ArrayList<Object> listOfDyads) {
  447. // Remove from this list all dyads that are part of a proposed
  448. // synonym or umbrella relationship
  449. ArrayList<Object> seen = new ArrayList<Object>(), removem = new ArrayList<Object>();
  450. Iterator iter = listOfDyads.iterator();
  451. while (iter.hasNext()) {
  452. Dyad dy = (Dyad)iter.next();
  453. String kterm = dy.kinTerm;
  454. if (removem.contains(kterm)) iter.remove();
  455. else if (! seen.contains(kterm)) {
  456. seen.add(kterm);
  457. if (umbAlreadyPosted(kinTerm, kterm) || umbAlreadyPosted(kterm, kinTerm)) {
  458. removem.add(kterm);
  459. iter.remove();
  460. }else {
  461. int order = kinTerm.compareTo(kterm);
  462. String word_pair = ((order < 0) ? kinTerm + "/" + kterm : kterm + "/" + kinTerm),
  463. keyWord = ((order < 0) ? kinTerm : kterm);
  464. if (synonymAlreadyProposed(keyWord, word_pair)) {
  465. removem.add(kterm);
  466. iter.remove();
  467. }
  468. } // end of no-umbrella-so-check-for-synonyms
  469. } // end of not-seen-before
  470. } // end of loop thru dyads
  471. } // end of method removeSynUmbDyads
  472. */
  473. public void postAnomaliesForUser(String kinTerm, ArrayList<Object> anomalies) {
  474. // First merge any duplicate anomalies
  475. ArrayList<Issue> compactedAnomalies = new ArrayList<Issue>();
  476. while (anomalies.size() > 0) {
  477. Anomaly baseCase = (Anomaly) anomalies.remove(0);
  478. Iterator iter = anomalies.iterator();
  479. while (iter.hasNext()) {
  480. Anomaly nextCase = (Anomaly) iter.next();
  481. if (baseCase.isEquivalentTo(nextCase)) {
  482. baseCase.absorb(nextCase);
  483. iter.remove();
  484. }
  485. } // end of loop thru remaining anomalies
  486. compactedAnomalies.add(baseCase);
  487. } // end of while anomalies.size() > 0
  488. // Now post the compacted anomalies
  489. if (compactedAnomalies.size() > 0) {
  490. if (issuesForUser.get(kinTerm) == null) {
  491. issuesForUser.put(kinTerm, new ArrayList<Issue>());
  492. }
  493. issuesForUser.get(kinTerm).addAll(compactedAnomalies);
  494. }
  495. } // end of method postAnomaliesForUser
  496. public void detectSynonymsAndUmbrellas(String kinTerm, TreeMap prePos, TreeMap preNeg, int maxNoise)
  497. throws KSInternalErrorException {
  498. // First, exclude any pcString supported only by challenged dyads
  499. // if (kinTerm.equals("daddy") || kinTerm.equals("dad")) {
  500. // Context.breakpoint();
  501. // }
  502. TreeMap pos = new TreeMap(prePos),
  503. neg = new TreeMap(preNeg);
  504. ArrayList<Object> filteredKTermDys = new ArrayList<Object>(),
  505. filtered2KTermDys = new ArrayList<Object>();
  506. // Threshhold2 = maxNoise% * avgNmbrOfDyadsPerKinType
  507. int threshhold1 = Math.max(2, MainPane.NUMBER_OF_EGOS - 1),
  508. threshhold2 = (int) Math.floor(countLeaves(pos) * maxNoise / (100d * pos.size()));
  509. Iterator posIter = pos.entrySet().iterator();
  510. while (posIter.hasNext()) {
  511. ArrayList<Object> dyadList = (ArrayList<Object>) ((Map.Entry) posIter.next()).getValue(),
  512. tempLst = new ArrayList<Object>();
  513. Iterator listIter = dyadList.iterator();
  514. boolean killIt = true;
  515. int cntr = 0;
  516. while (listIter.hasNext()) {
  517. Dyad dy = (Dyad) listIter.next();
  518. if (!dy.challenged) {
  519. killIt = false;
  520. cntr++;
  521. tempLst.add(dy);
  522. }
  523. } // end of loop thru dyadList
  524. if (killIt) {
  525. posIter.remove();
  526. } else {
  527. if (cntr >= threshhold1) {
  528. filteredKTermDys.addAll(tempLst);
  529. }
  530. if (cntr >= threshhold2) {
  531. filtered2KTermDys.addAll(tempLst);
  532. }
  533. }
  534. } // end of loop thru pos
  535. Iterator negIter = neg.entrySet().iterator();
  536. while (negIter.hasNext()) {
  537. ArrayList<Object> dyadList = (ArrayList<Object>) ((Map.Entry) negIter.next()).getValue();
  538. Iterator listIter = dyadList.iterator();
  539. boolean killIt = true;
  540. while (listIter.hasNext() && killIt) {
  541. if (!((Dyad) listIter.next()).challenged) {
  542. killIt = false;
  543. }
  544. }
  545. if (killIt) {
  546. negIter.remove();
  547. }
  548. }
  549. // Let otherSet = the set of all terms in NEG having pcStrings that appear in POS
  550. // otherSet structure: kinTerm => List of pcStrings seen for that kinTerm
  551. ArrayList<Object> filteredKTermPCStr = new ArrayList<Object>(),
  552. filtered2KTermPCStr = new ArrayList<Object>();
  553. posIter = pos.entrySet().iterator();
  554. while (posIter.hasNext()) {
  555. Map.Entry entry = (Map.Entry) posIter.next();
  556. String pcStr = (String) entry.getKey();
  557. ArrayList<Object> dyadList = (ArrayList<Object>) entry.getValue();
  558. if (dyadList.size() >= threshhold1) {
  559. filteredKTermPCStr.add(pcStr);
  560. }
  561. if (dyadList.size() >= threshhold2) {
  562. filtered2KTermPCStr.add(pcStr);
  563. }
  564. } // end of loop thru pos for filtering
  565. posIter = filteredKTermPCStr.iterator();
  566. TreeMap filteredOtherSet = new TreeMap();
  567. while (posIter.hasNext()) {
  568. String pcStr = (String) posIter.next();
  569. ArrayList<Object> negDyads = (ArrayList<Object>) neg.get(pcStr);
  570. if (negDyads != null && negDyads.size() >= threshhold1) {
  571. for (int i = 0; i < negDyads.size(); i++) {
  572. Dyad dy = (Dyad) negDyads.get(i);
  573. String kterm = dy.kinTerm;
  574. if (!dy.challenged && filteredOtherSet.get(kterm) == null) {
  575. filteredOtherSet.put(kterm, new ArrayList<Object>());
  576. }
  577. } // end of loop thru negDyads
  578. }
  579. } // end of loop thru pcStrings in filteredKTermPCStr
  580. posIter = filtered2KTermPCStr.iterator();
  581. TreeMap filtered2OtherSet = new TreeMap();
  582. while (posIter.hasNext()) {
  583. String pcStr = (String) posIter.next();
  584. ArrayList<Object> negDyads = (ArrayList<Object>) neg.get(pcStr);
  585. if (negDyads != null && negDyads.size() >= threshhold2) {
  586. for (int i = 0; i < negDyads.size(); i++) {
  587. Dyad dy = (Dyad) negDyads.get(i);
  588. String kterm = dy.kinTerm;
  589. if (!dy.challenged && filtered2OtherSet.get(kterm) == null) {
  590. filtered2OtherSet.put(kterm, new ArrayList<Object>());
  591. }
  592. } // end of loop thru negDyads
  593. }
  594. } // end of loop thru pcStrings in filtered2KTermPCStr
  595. // Now analyze each term in filteredOtherSet & filtered2OtherSet.
  596. // Propose all synonyms, umbrellas, and overlaps.
  597. identifySynsEtc(filteredOtherSet, kinTerm, filteredKTermPCStr, filteredKTermDys, threshhold1, 1);
  598. if (threshhold2 > threshhold1) {
  599. identifySynsEtc(filtered2OtherSet, kinTerm, filtered2KTermPCStr, filtered2KTermDys, threshhold2, 2);
  600. }
  601. } // end of method detectSynonymsAndUmbrellas
  602. public void identifySynsEtc(TreeMap otherSet, String kinTerm, ArrayList<Object> kinTermPCStrings,
  603. ArrayList<Object> ktermDys, int threshhold, int typ)
  604. throws KSInternalErrorException {
  605. // otherSet structure: kinTerm => List of pcStrings seen for that kinTerm
  606. Iterator otherIter = otherSet.entrySet().iterator();
  607. while (otherIter.hasNext()) {
  608. Map.Entry otherEntry = (Map.Entry) otherIter.next();
  609. String term = (String) otherEntry.getKey();
  610. ArrayList<Object> otherTermPCStrings = (ArrayList<Object>) otherEntry.getValue(),
  611. otherTermDys = new ArrayList<Object>();
  612. if (dyadsUndefined != null && dyadsUndefined.get(term) != null) {
  613. TreeMap tMap = (TreeMap) dyadsUndefined.get(term);
  614. Iterator tMapIter = tMap.entrySet().iterator();
  615. while (tMapIter.hasNext()) {
  616. Map.Entry entry = (Map.Entry) tMapIter.next();
  617. String kType = (String) entry.getKey();
  618. ArrayList<Object> dys = (ArrayList<Object>) entry.getValue();
  619. if (dys.size() >= threshhold) {
  620. otherTermPCStrings.add(kType);
  621. otherTermDys.addAll(dys);
  622. }
  623. } // end of loop thru tMap
  624. } // end of loop thru dyadsUndefined
  625. if (dyadsDefined != null && dyadsDefined.get(term) != null) {
  626. TreeMap tMap = (TreeMap) dyadsDefined.get(term);
  627. Iterator tMapIter = tMap.entrySet().iterator();
  628. while (tMapIter.hasNext()) {
  629. Map.Entry entry = (Map.Entry) tMapIter.next();
  630. String kType = (String) entry.getKey();
  631. ArrayList<Object> dys = (ArrayList<Object>) entry.getValue();
  632. if (dys.size() >= threshhold) {
  633. otherTermPCStrings.add(kType);
  634. otherTermDys.addAll(dys);
  635. }
  636. } // end of loop thru tMap
  637. } // end of loop thru dyadsDefined
  638. if (equivalentLists(kinTermPCStrings, otherTermPCStrings)
  639. && !synAlreadyPosted(kinTerm, term)
  640. && !synRejected(kinTerm, term)) {
  641. proposeSynonymToUser(kinTerm, term, kinTermPCStrings, ktermDys, otherTermDys, typ);
  642. } else if (equivalentLists(kinTermPCStrings, otherTermPCStrings)
  643. && synAlreadyPosted(kinTerm, term)) {
  644. return;
  645. } else if (!(nonUmbrellas.get(kinTerm) != null && ((ArrayList<Object>) nonUmbrellas.get(kinTerm)).contains(term))
  646. && !umbAlreadyPosted(kinTerm, term)
  647. && isSupersetOf(kinTermPCStrings, otherTermPCStrings)) {
  648. postPotUmbrellas(kinTerm, kinTermPCStrings, term, otherTermPCStrings, otherTermDys, typ);
  649. } else if (!isSupersetOf(kinTermPCStrings, otherTermPCStrings)
  650. && !isSupersetOf(otherTermPCStrings, kinTermPCStrings)
  651. && !overlapProposed(kinTerm, term)) {
  652. ArrayList<Object> interSect = new ArrayList<Object>();
  653. for (int k = 0; k < otherTermPCStrings.size(); k++) {
  654. if (kinTermPCStrings.contains(otherTermPCStrings.get(k))) {
  655. interSect.add(otherTermPCStrings.get(k));
  656. }
  657. }
  658. if (interSect.size() > 0) {
  659. proposeOverlapToUser(kinTerm, term, interSect, ktermDys, otherTermDys, typ);
  660. }
  661. } // end of found-an-overlap
  662. } // end of loop thru otherSet
  663. } // end of method identifySynsEtc
  664. public boolean umbAlreadyPosted(String umb, String sub) {
  665. if (umbrellas != null && umbrellas.get(umb) != null
  666. && ((ArrayList<Object>) umbrellas.get(umb)).contains(sub)) {
  667. return true;
  668. }
  669. if (potUmbrellas == null) {
  670. return false;
  671. }
  672. if (potUmbrellas.get(umb) == null) {
  673. return false;
  674. }
  675. ArrayList<Object> umbList = (ArrayList<Object>) potUmbrellas.get(umb);
  676. // structure of potUmbrellas is: umbTerm -> {list of pcStrings, Quad, ... Quad }
  677. // where Quad = {subTerm, list of its pcStrings, list of Dyads, filterType}
  678. for (int i = 1; i < umbList.size(); i++) {
  679. ArrayList<Object> quad = (ArrayList<Object>) umbList.get(i);
  680. if (quad.contains(sub)) {
  681. return true;
  682. }
  683. }
  684. return false;
  685. } // end of method umbAlreadyPosted
  686. public void postPotUmbrellas(String umb, ArrayList<Object> umbStrings, String sub,
  687. ArrayList<Object> subStrings, ArrayList<Object> dyads, int typ) {
  688. if (umb.equals("no__term") || sub.equals("no__term")) {
  689. return;
  690. }
  691. if (potUmbrellas == null) {
  692. potUmbrellas = new TreeMap();
  693. }
  694. // structure of potUmbrellas is: umbTerm -> {list of pcStrings, Quad, ... Quad }
  695. // where Quad = {subTerm, list of its pcStrings, list of Dyads, filterType}
  696. // if (umb.equals("ancestor")) Context.breakpoint();
  697. if (potUmbrellas.get(umb) == null) {
  698. potUmbrellas.put(umb, new ArrayList<Object>());
  699. }
  700. ArrayList<Object> umbQuads = (ArrayList<Object>) potUmbrellas.get(umb);
  701. if (umbQuads.isEmpty()) {
  702. umbQuads.add(umbStrings);
  703. }
  704. ArrayList<Object> quad = new ArrayList<Object>();
  705. quad.add(sub);
  706. quad.add(subStrings);
  707. quad.add(dyads);
  708. quad.add(new Integer(typ));
  709. umbQuads.add(quad);
  710. } // end of method postPotUmbrellas
  711. public void proposeUmbrellas() {
  712. // Post all the proposals to issuesForUser
  713. Iterator umbIter = potUmbrellas.entrySet().iterator();
  714. while (umbIter.hasNext()) {
  715. Map.Entry entry = (Map.Entry) umbIter.next();
  716. String umbTerm = (String) entry.getKey();
  717. ArrayList<Object> quads = (ArrayList<Object>) entry.getValue(),
  718. subTerms = extractTerms(quads);
  719. if (!umbrellaAlreadyProposed(umbTerm) && !umbrellaAlreadyKnown(umbTerm, quads)
  720. && !allTermsDefined(umbTerm, subTerms)) {
  721. ArrayList<Object> umbPCStrings = (ArrayList<Object>) quads.remove(0),
  722. questions = new ArrayList<Object>();
  723. questions.add("The term '" + umbTerm + "' seems to be an umbrella term that covers other terms.\n"
  724. + "Is this correct?");
  725. if (issuesForUser.get(umbTerm) == null) {
  726. issuesForUser.put(umbTerm, new ArrayList<Issue>());
  727. }
  728. ArrayList<Issue> theIssues = issuesForUser.get(umbTerm);
  729. theIssues.add(new UmbrellaCandidate(umbTerm, questions, umbPCStrings, quads));
  730. }
  731. umbIter.remove();
  732. }
  733. } // end of method proposeUmbrellas
  734. public ArrayList<Object> extractTerms(ArrayList<Object> triples) {
  735. ArrayList<Object> terms = new ArrayList<Object>();
  736. // Element 0 of triples is not a triple
  737. for (int i = 1; i < triples.size(); i++) {
  738. terms.add(((ArrayList<Object>) triples.get(i)).get(0));
  739. }
  740. return terms;
  741. } // end of method extractTerms
  742. public boolean umbrellaAlreadyKnown(String umbTerm, ArrayList<Object> triples) {
  743. if (umbrellas == null || umbrellas.get(umbTerm) == null) {
  744. return false;
  745. }
  746. ArrayList<Object> subTerms = (ArrayList<Object>) umbrellas.get(umbTerm), propSubs = new ArrayList<Object>();
  747. // Element 0 of triples is not a triple
  748. for (int i = 1; i < triples.size(); i++) {
  749. propSubs.add(((ArrayList<Object>) triples.get(i)).get(0));
  750. }
  751. if (equivalentLists(subTerms, propSubs)) {
  752. return true;
  753. }
  754. return false;
  755. } // end of method umbrellaAlreadyKnown
  756. public boolean umbrellaAlreadyProposed(String umbTerm) {
  757. if (issuesForUser == null) {
  758. return false;
  759. }
  760. ArrayList<Issue> issues = issuesForUser.get(umbTerm);
  761. if (issues == null) {
  762. return false;
  763. }
  764. for (int i = 0; i < issues.size(); i++) {
  765. Issue issue = (Issue) issues.get(i);
  766. if (issue instanceof UmbrellaCandidate) {
  767. return true;
  768. }
  769. }
  770. return false;
  771. } // end of method umbrellaAlreadyProposed
  772. public boolean overlapProposed(String kinTerm, String term) {
  773. if (issuesForUser.get(term) == null) {
  774. return false;
  775. }
  776. Iterator iter = issuesForUser.get(term).iterator();
  777. while (iter.hasNext()) {
  778. Issue issue = (Issue) iter.next();
  779. if (issue instanceof OverlapCandidate) {
  780. OverlapCandidate cand = (OverlapCandidate) issue;
  781. if (cand.otherTerm.equals(kinTerm)) {
  782. return true;
  783. }
  784. }
  785. } // end of loop thru issues for 'term'
  786. return false;
  787. } // end of method overlapProposed
  788. public void dataSelection(String kinTerm, ArrayList<Object> ktMatches, TreeMap pos, TreeMap neg, TreeMap dataReqCounter)
  789. throws KSInternalErrorException, FileNotFoundException, JavaSystemException, IOException, KSNoChainOfRelations2Alter,
  790. KSBadHornClauseException, KSConstraintInconsistency, ClassNotFoundException, KSParsingErrorException {
  791. // if (kinTerm.equals("father_in_law")) Context.breakpoint();
  792. // Reduce the list of KTDs to a set of KT_EQCs which group the KTDs (perhaps singletons) via the Library.ktSigTree.
  793. TreeMap ktdToKTD_EQC = new TreeMap();
  794. ArrayList<Object> solidKTD_EQCmatches = makeKTD_EQCs(ktMatches, ktdToKTD_EQC),
  795. perfectFits = new ArrayList<Object>();
  796. // Analyze each KTD_EQC's hits & misses, stored on the EQC, and make a global list of CB_EQC non-Hits.
  797. // Also check for any perfect fits, and make list of PC_String non-Hits
  798. TreeMap pcStrNonHits = new TreeMap();
  799. ArrayList<Object> cbNonHits = analyzeKTD_EQC_HitsAndMisses(solidKTD_EQCmatches, perfectFits, neg, pcStrNonHits);
  800. if (solidKTD_EQCmatches.size() == 1) { // Only 1 good choice; propose it.
  801. proposeDefinition(kinTerm, (Library.KTD_EQC) solidKTD_EQCmatches.get(0));
  802. return;
  803. }
  804. // If we get here, there are multiple solidMatches (enclosers). Check for a perfect fit.
  805. if (perfectFits.size() > 0) {
  806. Library.KTD_EQC eqc = (Library.KTD_EQC) perfectFits.get(0),
  807. otherEQC;
  808. if (perfectFits.size() > 1) {
  809. int totalCBCount = eqc.countClauses(), otherCount;
  810. for (int i = 1; i < perfectFits.size(); i++) {
  811. otherEQC = (Library.KTD_EQC) perfectFits.get(i);
  812. otherCount = otherEQC.countClauses();
  813. if (otherCount < totalCBCount) {
  814. totalCBCount = otherCount;
  815. eqc = otherEQC;
  816. } // end of found-smaller-one
  817. } // end of loop thru eqcs
  818. System.out.println("\n\n\t\t***** NOTICE: More than 1 perfect fit for " + kinTerm + ". Chose smallest.");
  819. System.out.println("\t\t" + perfectFits);
  820. } // end of more-than-one-perfect-fit
  821. proposeDefinition(kinTerm, eqc);
  822. solidKTD_EQCmatches.remove(eqc);
  823. return;
  824. }
  825. if (dataReqCounter.get(kinTerm) != null
  826. && ((Counter) dataReqCounter.get(kinTerm)).total() >= Library.MAX_DRS_BEFORE_GUESS) {
  827. ((Counter) dataReqCounter.get(kinTerm)).zero();
  828. proposeDefinition(kinTerm, (Library.KTD_EQC) solidKTD_EQCmatches.get(0));
  829. System.out.println("\n\n\t\t***** Exceeded Data Req limit for " + kinTerm + ". Taking a Guess.");
  830. return;
  831. } // end of Data-Reqs-Aren't-Working-So-Guess
  832. // Compute Similarity scores for all languages in the KTD_EQCs & store in Library. Compute sum of weights.
  833. double wtSum = (SIMILARITY_ON ? sumSimScores(solidKTD_EQCmatches) : sumSimScoresALT(solidKTD_EQCmatches));
  834. TreeMap stringMisses = rankStrNonHits(pcStrNonHits, wtSum);
  835. if (stringMisses.size() > 0) { // found PC_Strings that can separate candidates
  836. // testOutFile.println("\t" + kinTerm + "\t" + countLeaves(pcStrNonHits));
  837. askUserForData(kinTerm, stringMisses, pos, neg);
  838. } else if (cbNonHits.size() > 0) {
  839. // Group all equivalent CBs from cbNonHits into CB_EQCs
  840. TreeMap unMatchedCB_EQCs = groupIntoCB_EQCs(cbNonHits, ktdToKTD_EQC, wtSum);
  841. // Now assign a score to each CB_EQC in unMatchedCB_EQCs and choose lowest scoring CB_EQC.
  842. TreeMap rankedEQCs = lowToHi(unMatchedCB_EQCs);
  843. if (dataReqCounter.get(kinTerm) == null) {
  844. dataReqCounter.put(kinTerm, new Counter());
  845. }
  846. ((Counter) dataReqCounter.get(kinTerm)).incr();
  847. // testOutFile.println("\t" + kinTerm + "\t" + cbNonHits.size());
  848. askUserForData(kinTerm, rankedEQCs, pos, neg);
  849. }
  850. } // end of method dataSelection
  851. public ArrayList<Object> makeKTD_EQCs(ArrayList<Object> matches, TreeMap ktdToKTD_EQC)
  852. throws FileNotFoundException, JavaSystemException, IOException {
  853. // Reduce the list of KTDs to a set of KT_EQCs which group the KTDs
  854. // (perhaps singletons) via the Library.ktSigTree.
  855. ArrayList<Object> solidKTD_EQCmatches = new ArrayList<Object>(), triple,
  856. noisyPos = null, noisyNeg = null;
  857. if (Library.ktSigCompressed == null) {
  858. String fileName = Library.libraryDirectory + "KTSigCompressed";
  859. BufferedReader file = new BufferedReader(new FileReader(fileName));
  860. Library.ktSigCompressed = Library.readKTSig(file);
  861. }
  862. KinTermDef ktd;
  863. Library.KTD_EQC eqc = null;
  864. Iterator iter = matches.iterator();
  865. while (iter.hasNext()) {
  866. Object obj = iter.next();
  867. // matches may contain KTDs (if it's solidKTMatches)
  868. // or it may contain triples (if it's noisyKTMatches)
  869. if (obj instanceof KinTermDef) {
  870. ktd = (KinTermDef) obj;
  871. } else {
  872. triple = (ArrayList<Object>) obj;
  873. ktd = (KinTermDef) triple.get(0);
  874. noisyPos = (ArrayList<Object>) triple.get(1);
  875. noisyNeg = (ArrayList<Object>) triple.get(2);
  876. }
  877. if (ktd == null || ktd.eqcSigExact == null) {
  878. Context.breakpoint();
  879. }
  880. ArrayList<Object> eqcList = (ArrayList<Object>) Library.ktSigCompressed.get(ktd.eqcSigExact);
  881. if (eqcList == null) { // null means only 1 KTD in Library has this eqcSigExact
  882. eqc = new Library.KTD_EQC(ktd.eqcSigExact, ktd);
  883. // Ck for prior rejection of this KTD_EQC
  884. if (ctxt.notRejected(eqc, addressTerms)) {
  885. solidKTD_EQCmatches.add(eqc);
  886. ktdToKTD_EQC.put(ktd, eqc);
  887. }
  888. } else {
  889. for (int i = 0; i < eqcList.size(); i++) {
  890. eqc = (Library.KTD_EQC) eqcList.get(i);
  891. if (eqc.hasMember(ktd)) {
  892. eqc.swapPrototype(new Library.KTD_Ptr(ktd));
  893. // Ck for prior rejection of this KTD_EQC
  894. if (ctxt.notRejected(eqc, addressTerms)) {
  895. if (!solidKTD_EQCmatches.contains(eqc)) {
  896. solidKTD_EQCmatches.add(eqc);
  897. }
  898. ktdToKTD_EQC.put(ktd, eqc);
  899. }
  900. break; // end the loop
  901. }
  902. } // end of loop thru eqcs in eqcList
  903. }
  904. if (noisyPos != null) {
  905. eqc.noisyPosDyads = noisyPos;
  906. }
  907. if (noisyNeg != null) {
  908. eqc.noisyNegDyads = noisyNeg;
  909. }
  910. } // end of loop thru ktds in matches
  911. return solidKTD_EQCmatches;
  912. } // end of method makeKTD_EQCs
  913. public ArrayList<Object> analyzeKTD_EQC_HitsAndMisses(ArrayList<Object> solidKTD_EQCmatches, ArrayList<Object> perfectFits,
  914. TreeMap neg, TreeMap pcStrNonHits)
  915. throws KSParsingErrorException, JavaSystemException, KSInternalErrorException, ClassNotFoundException,
  916. KSConstraintInconsistency, KSBadHornClauseException, KSNoChainOfRelations2Alter {
  917. ArrayList<Object> allNonHits = new ArrayList<Object>(); // set of all CBs in any eqc that didn't match POS or NEG
  918. Iterator iter = solidKTD_EQCmatches.iterator();
  919. while (iter.hasNext()) {
  920. Library.KTD_EQC eqc = (Library.KTD_EQC) iter.next();
  921. TreeMap eqcStringMisses = new TreeMap();
  922. pcStrNonHits.put(eqc, eqcStringMisses);
  923. // pcStrNonHits is eqc => PC_String => (typical) CB
  924. KinTermDef ktd = eqc.prototype.getKTD();
  925. eqc.misFits = new ArrayList<Object>(); // misFits = all expDef CBs that did not match POS
  926. eqc.baseMisFits = new ArrayList<Object>(); // baseMisFits = all un-expanded CBs with 1+ expansion missing POS
  927. eqc.baseFits = new ArrayList<Object>(); // baseFits = all base CBs that had at least 1 expansion hit POS
  928. for (int i = 0; i < ktd.expandedDefs.size(); i++) {
  929. ClauseBody cb = (ClauseBody) ktd.expandedDefs.get(i);
  930. String firstExpansion = (String) cb.expansionPath.get(0);
  931. int where = firstExpansion.indexOf(":") + 1;
  932. Integer baseCB = new Integer(firstExpansion.substring(where));
  933. if (cb.posHit) {
  934. if (!eqc.baseFits.contains(baseCB)) {
  935. eqc.baseFits.add(baseCB);
  936. }
  937. } else {
  938. eqc.misFits.add(new Integer(cb.seqNmbr));
  939. if (!eqc.baseMisFits.contains(baseCB)) {
  940. eqc.baseMisFits.add(baseCB);
  941. }
  942. ArrayList<Object> negDyads = (ArrayList<Object>) neg.get(cb.pcString);
  943. // cb wasn't a posHit. If it's not a negHit either, put into allNonHits
  944. if (negDyads == null) {
  945. allNonHits.add(cb);
  946. eqcStringMisses.put(cb.pcString, cb);
  947. } else {
  948. boolean hitOne = false;
  949. for (int j = 0; j < negDyads.size(); j++) {
  950. Dyad dy = (Dyad) negDyads.get(j);
  951. if (fit(cb, dy)) {
  952. hitOne = true;
  953. j = negDyads.size();
  954. }
  955. } // end of loop thru dyads
  956. if (!hitOne) {

Large files files are truncated, but you can click here to view the full file