PageRenderTime 36ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/src/edu/psu/chemxseer/structure/setcover/maxCoverStatus/Decomp/CoverStatus_Decomp_Index_SupSearch.java

https://github.com/Santa827/Chemxseer_subSearch
Java | 326 lines | 242 code | 34 blank | 50 comment | 57 complexity | fccb5633dfa4c5a259dfeeab0778f0fe MD5 | raw file
  1. package edu.psu.chemxseer.structure.setcover.maxCoverStatus.Decomp;
  2. import edu.psu.chemxseer.structure.setcover.IO.IInputSequential;
  3. import edu.psu.chemxseer.structure.setcover.featureGenerator.IFeatureSetConverter;
  4. import edu.psu.chemxseer.structure.setcover.maxCoverStatus.ICoverStatusStream;
  5. import edu.psu.chemxseer.structure.setcover.maxCoverStatus.Util_IntersectionSet;
  6. import edu.psu.chemxseer.structure.setcover.sets.ICoverSet_FeatureWrapper;
  7. import edu.psu.chemxseer.structure.util.IntersectionSet;
  8. public class CoverStatus_Decomp_Index_SupSearch extends CoverStatus_Decomp_Index implements ICoverStatusStream{
  9. public CoverStatus_Decomp_Index_SupSearch(int K, int classOneNumber, int classTwoNumber){
  10. super(K, classOneNumber, classTwoNumber);
  11. this.qCovered = new int[classOneNumber];
  12. }
  13. @Override
  14. public int getGain(ICoverSet_FeatureWrapper newSet) {
  15. return this.getGain(newSet, (short)-1);
  16. }
  17. @Override
  18. public boolean addNewSet(ICoverSet_FeatureWrapper newSet) {
  19. boolean result = super.addNewSetPrivate(newSet);
  20. if(result)
  21. this.updateScoreAdd(this.numOfSets-1);
  22. return result;
  23. }
  24. @Override
  25. public int[][] addNewSetWithReturn(ICoverSet_FeatureWrapper newSet) {
  26. boolean insert = super.addNewSetPrivate(newSet);
  27. if(insert)
  28. return this.updateScoreAddWithReturn(this.numOfSets-1);
  29. return null;
  30. }
  31. @Override
  32. public int getCoveredCount() {
  33. int count =0;
  34. for(int gID = 0; gID < this.classOneNumber; gID++){
  35. if(this.gfIndex[gID] == null)
  36. continue; // not feature covering this database graph
  37. else{
  38. IntersectionSet set = this.supCandidate(gID, (short)-1);
  39. if(set == null) // for the graph "gID", not feature contained in it
  40. continue;
  41. else count += this.classTwoNumber-set.size();
  42. }
  43. }
  44. return count;
  45. }
  46. @Override
  47. public int getGain(ICoverSet_FeatureWrapper oneSet, short exceptSetID) {
  48. int gain = 0;
  49. int[] containedDB = oneSet.containedDatabaseGraphs();
  50. for(int gID: containedDB){
  51. IntersectionSet candidates = supCandidate(gID,exceptSetID);
  52. if(candidates!=null){
  53. int currentSize = candidates.size();
  54. this.qCovered[gID] = this.classTwoNumber-currentSize;
  55. candidates.retainAll(oneSet.containedQueryGraphs());
  56. gain += currentSize-candidates.size(); // decrease of the candidate set size
  57. }
  58. else{
  59. gain += this.classTwoNumber- oneSet.containedQueryGraphs().length;
  60. this.qCovered[gID] = 0;
  61. }
  62. }
  63. this.qCoveredMinFeatureID = this.selectedFeatures[exceptSetID].getFetureID();
  64. return gain;
  65. }
  66. @Override
  67. public boolean swap(short oldSetID, ICoverSet_FeatureWrapper newSet) {
  68. ICoverSet_FeatureWrapper oldSet = this.selectedFeatures[oldSetID];
  69. boolean result= super.swapPrivate(oldSetID, newSet);
  70. if(result){
  71. this.updateScoreSwap(oldSet, newSet, oldSetID);
  72. }
  73. return result;
  74. }
  75. @Override
  76. public boolean removeSet(short sID) {
  77. ICoverSet_FeatureWrapper oldSet = this.selectedFeatures[sID];
  78. boolean result = super.removeFeaturePrivate(sID);
  79. if(result){
  80. this.updateScoreDelete(oldSet, sID);
  81. }
  82. return result;
  83. }
  84. @Override
  85. public boolean addSet(ICoverSet_FeatureWrapper oneSet, short sID) {
  86. boolean result = super.addFeaturePrivate(oneSet, sID);
  87. if(result){
  88. this.updateScoreAdd(sID);
  89. }
  90. return result;
  91. }
  92. /********************Private Member*******************************/
  93. private IntersectionSet supCandidate(int g, short exceptForFeatureF){
  94. // 1. First Fetch all features contained in query
  95. IntersectionSet result = new IntersectionSet();
  96. short[] features = this.gfIndex[g];
  97. // 2. Do intersection to generate the candidate set
  98. if(features == null)
  99. return null;
  100. else{
  101. boolean firstTime = true;
  102. for(int i = 0; i< features.length; i++){
  103. if(features[i] == -1 || features[i] == exceptForFeatureF)
  104. continue;
  105. else {
  106. ICoverSet_FeatureWrapper f = this.selectedFeatures[features[i]];
  107. if(firstTime){
  108. result.addAll(f.containedQueryGraphs());
  109. firstTime = false;
  110. }
  111. else
  112. result.retainAll(f.containedQueryGraphs());
  113. }
  114. }
  115. if(firstTime)
  116. return null;
  117. else return result;
  118. }
  119. }
  120. /******************For Gain &Inverted Index Update**********************/
  121. /**
  122. * (1) After adding the newSet, the score need to be re-assigned
  123. * (2) After adding the newSet, other set's score need to be updated
  124. * Eg. For another feature f, it is previous the only cover for <q, d> pair
  125. * but not after the inclusion of the new set, then f's gain must decrease by one
  126. * @param newSet
  127. */
  128. private void updateScoreAdd(int newSetID){
  129. this.featureGain[newSetID] =0;
  130. //2.1 Filter database graphs
  131. int[] qIDs = this.selectedFeatures[newSetID].notContainedQueryGraphs(this.classTwoNumber);
  132. for(int gID : this.selectedFeatures[newSetID].containedDatabaseGraphs()){
  133. this.updateScoreAdd(newSetID, gID, qIDs);
  134. }
  135. }
  136. private int[][] updateScoreAddWithReturn(int newSetID) {
  137. this.featureGain[newSetID] =0;
  138. //2.1 Filter database graphs
  139. int[] qIDs = this.selectedFeatures[newSetID].notContainedQueryGraphs(this.classTwoNumber);
  140. int[] gIDs = this.selectedFeatures[newSetID].containedDatabaseGraphs();
  141. int[][] result = new int[qIDs.length][];
  142. int[] xIterator = new int[qIDs.length];
  143. for(int w = 0; w< xIterator.length; w++){
  144. result[w] = new int[gIDs.length+1];
  145. result[w][0] = qIDs[w];
  146. xIterator[w] = 1;
  147. }
  148. for(int gID : gIDs){
  149. this.updateScoreAddWithReturn(newSetID, gID, qIDs, result, xIterator);
  150. }
  151. //save space
  152. for(int i = 0; i< result.length; i++){
  153. if(xIterator[i] < result[i].length){
  154. int[] temp = new int[xIterator[i]];
  155. for(int w = 0; w< xIterator[i]; w++)
  156. temp[w] = result[i][w];
  157. result[i] = temp;
  158. }
  159. }
  160. return result;
  161. }
  162. /**
  163. * After deleting oldSetID, <q, d> pair it covers
  164. * Another feature "f", it is become the only cover of the <q, d> pair, then it grain increase by 1
  165. * @param oldSetID
  166. */
  167. private void updateScoreDelete(ICoverSet_FeatureWrapper oldSet, int oldSetID){
  168. //2.1 Filter database graphs
  169. int[] qIDs = this.selectedFeatures[oldSetID].notContainedQueryGraphs(this.classTwoNumber);
  170. for(int gID : this.selectedFeatures[oldSetID].containedDatabaseGraphs()){
  171. this.updateScoreDelete(oldSetID, gID, qIDs);
  172. }
  173. }
  174. /**
  175. * For each of the <gID, qIDs> pair,
  176. * if this pair is covered by one set $fID$ except for the newSetID, then featureGain[fID]--
  177. * if this pair is covered by newSetID only, then featureGain[newSetID]++;
  178. * @param newSetID
  179. * @param gID
  180. * @param qIDs
  181. */
  182. private void updateScoreAdd(int newSetID, int gID, int[] qIDs){
  183. //this.selectedFeatures[newSetID].notContainedQueryGraphs(this.classTwoNumber)
  184. for(int qID : qIDs){
  185. int fID = Util_IntersectionSet.
  186. retain(gfIndex[gID], gfSize[gID], qfIndex[qID], qfSize[qID], newSetID);
  187. if(fID >=0)
  188. this.featureGain[fID]--;
  189. else if(fID == -1)
  190. this.featureGain[newSetID]++; // newSet is the only coverage
  191. }
  192. }
  193. private void updateScoreAddWithReturn(int newSetID, int gID, int[] qIDs,
  194. int[][] result, int[] xIterator) {
  195. for(int i = 0; i< qIDs.length; i++){
  196. int qID = qIDs[i];
  197. int fID = Util_IntersectionSet.
  198. retain(gfIndex[gID], gfSize[gID], qfIndex[qID], qfSize[qID], newSetID);
  199. if(fID >=0)
  200. this.featureGain[fID]--;
  201. else if(fID == -1){
  202. this.featureGain[newSetID]++; // newSet is the only coverage
  203. result[i][xIterator[i]++] = gID;
  204. }
  205. }
  206. }
  207. /**
  208. * For each of the <gID, qID> pair
  209. * if this pair is covered by one set $fID$ except for the oldSetID, then featureGain[fID]++;
  210. * if this pair is covered by oldSetID only, the featureGain[oldSetID]--;
  211. * @param oldSetID
  212. * @param gID
  213. * @param qIDs
  214. */
  215. private void updateScoreDelete(int oldSetID, int gID, int[] qIDs){
  216. for(int qID : qIDs){
  217. int fID = Util_IntersectionSet.
  218. retain(gfIndex[gID], gfSize[gID], qfIndex[qID], qfSize[qID], oldSetID);
  219. if(fID >=0)
  220. this.featureGain[fID]++;
  221. else if(fID == -1)
  222. this.featureGain[oldSetID]--; // newSet is the only coverage
  223. }
  224. }
  225. /**
  226. * Find all the <q, d> pairs covered by the oldset, covered by the newset
  227. *
  228. * @param oldSet
  229. * @param newSet
  230. * @param newSetID
  231. */
  232. private void updateScoreSwap(ICoverSet_FeatureWrapper oldSet, ICoverSet_FeatureWrapper newSet,
  233. int setID){
  234. IntersectionSet set = new IntersectionSet();
  235. set.addAll(newSet.containedQueryGraphs());
  236. set.removeAll(oldSet.containedQueryGraphs());
  237. int[] oldSetUncoveredQueriesOnly = set.getItems();
  238. int[] oldUncoveredQueries = oldSet.notContainedQueryGraphs(classTwoNumber);
  239. set.clear();
  240. set.addAll(oldSet.containedQueryGraphs());
  241. set.removeAll(newSet.containedQueryGraphs());
  242. int[] newSetUncoveredQueriesOnly = set.getItems();
  243. int[] newUncoveredQueries = newSet.notContainedQueryGraphs(classTwoNumber);
  244. int[] oldSetCoveredG = oldSet.containedDatabaseGraphs();
  245. int[] newSetCoveredG = newSet.containedDatabaseGraphs();
  246. int i =0, j=0;
  247. while(i < oldSetCoveredG.length && j < newSetCoveredG.length){
  248. if(oldSetCoveredG[i] < newSetCoveredG[j]){
  249. //oldSetCoveredG[i] is removed
  250. this.updateScoreDelete(setID, oldSetCoveredG[i], oldUncoveredQueries);
  251. i++;
  252. }
  253. else if(oldSetCoveredG[i] == newSetCoveredG[j]){
  254. // For queries covered by oldSet only, remove them
  255. this.updateScoreDelete(setID, oldSetCoveredG[i], oldSetUncoveredQueriesOnly);
  256. // For queries covered by newSet only, add them
  257. this.updateScoreAdd(setID, newSetCoveredG[j], newSetUncoveredQueriesOnly);
  258. i++; j++;
  259. }
  260. else{
  261. // newSetCoveredG[j] is newly added
  262. this.updateScoreAdd(setID, newSetCoveredG[j], newUncoveredQueries);
  263. }
  264. }
  265. for(; i< oldSetCoveredG.length; i++){
  266. this.updateScoreDelete(setID, oldSetCoveredG[i], oldUncoveredQueries);
  267. }
  268. for(; j < newSetCoveredG.length; i++){
  269. this.updateScoreAdd(setID, newSetCoveredG[i], newUncoveredQueries);
  270. }
  271. }
  272. @Override
  273. public boolean create(IInputSequential input, IFeatureSetConverter converter) {
  274. super.construct(input.getSetCount(), converter.getCountOneNumber(), converter.getCountTwoNumber());
  275. this.qCovered = new int[classOneNumber];
  276. // add each of the input feature to the inverted index
  277. ICoverSet_FeatureWrapper nextSet = input.nextSet();
  278. while(nextSet!=null){
  279. this.addNewSet(nextSet);
  280. nextSet = input.nextSet();
  281. }
  282. return true;
  283. }
  284. @Override
  285. // A feature f convers the <q, g> pair, if it does not contained in q but contained in g
  286. public short[] getCoveredSets(int qID, int gID) {
  287. short[] result= Util_IntersectionSet.retain(this.gfIndex[gID], this.qfIndex[qID]);
  288. if(result == null)
  289. return new short[0];
  290. else return result;
  291. }
  292. }