PageRenderTime 43ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/src/edu/psu/chemxseer/structure/subsearch/Impl/indexfeature/NoPostingFeatures.java

https://github.com/Santa827/Chemxseer_subSearch
Java | 229 lines | 144 code | 19 blank | 66 comment | 22 complexity | f3f5425128833825299a6b227e5fa2db MD5 | raw file
  1. package edu.psu.chemxseer.structure.subsearch.Impl.indexfeature;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.FileInputStream;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.text.ParseException;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.Comparator;
  12. import java.util.List;
  13. import de.parmol.graph.Graph;
  14. import edu.psu.chemxseer.structure.preprocess.MyFactory;
  15. import edu.psu.chemxseer.structure.subsearch.Interfaces.GraphDatabase;
  16. import edu.psu.chemxseer.structure.subsearch.Interfaces.IOneFeature;
  17. /**
  18. * Implementation of a collection of features <type T> (in-memory), no posting files
  19. * @author dayuyuan
  20. *
  21. */
  22. public class NoPostingFeatures<T extends IOneFeature>{
  23. protected String featureFileName;
  24. protected boolean graphAvailabel;
  25. protected IOneFeature[] features; // The whole set of features
  26. /**
  27. * Copy constructor
  28. * @param template
  29. */
  30. public NoPostingFeatures(NoPostingFeatures<T> template){
  31. this.featureFileName = template.featureFileName;
  32. this.graphAvailabel = template.graphAvailabel;
  33. this.features = template.features;
  34. }
  35. /**
  36. * Construct and Load a Features from the Disk
  37. * @param newFeatureFile
  38. * @param factory
  39. */
  40. public NoPostingFeatures(String newFeatureFile, FeatureFactory factory){
  41. this.featureFileName = newFeatureFile;
  42. this.graphAvailabel = false;
  43. try {
  44. this.loadFeatures(factory);
  45. } catch (IOException e) {
  46. // TODO Auto-generated catch block
  47. e.printStackTrace();
  48. }
  49. }
  50. /**
  51. * Load the feature into memory, all the loaded features are of type "OneFeature"
  52. * @param featureFileName
  53. * @return
  54. * @throws IOException
  55. */
  56. private void loadFeatures(FeatureFactory factory) throws IOException{
  57. // First read file head
  58. BufferedReader bin = null;
  59. bin = new BufferedReader(new InputStreamReader(new FileInputStream(featureFileName)));
  60. String firstLine = bin.readLine();
  61. if(firstLine==null)
  62. return;
  63. features = new IOneFeature[Integer.parseInt(firstLine)];
  64. //System.out.println(this.features.length);
  65. // Read one Feature from feature file and Then load it into this.features
  66. int iter = 0;
  67. while((firstLine = bin.readLine())!=null){
  68. features[iter] = factory.genOneFeature(iter, firstLine);
  69. iter++;
  70. }
  71. // Finish Loading features into memory
  72. bin.close();
  73. }
  74. /**
  75. * Write the features to the featureFile and Construct a NoPostingFeatures class
  76. * @param featureFile
  77. * @param features
  78. * @param reserveID
  79. * @throws IOException
  80. */
  81. public NoPostingFeatures (String featureFile, List<T> features, boolean reserveID) throws IOException{
  82. //1. Update the featureID
  83. if(reserveID){
  84. int fID = 0;
  85. for(T oneFeature : features)
  86. oneFeature.setFeatureId(fID++);
  87. }
  88. //2. Prepare to write the feature file
  89. if(featureFile!=null){
  90. BufferedWriter featureWritter= new BufferedWriter (new FileWriter(featureFile));
  91. featureWritter.write(features.size() + "\n");
  92. // Write the feature file
  93. for(T oneFeature : features){
  94. featureWritter.write(oneFeature.toFeatureString() + '\n');
  95. }
  96. // finalize:
  97. if(featureWritter !=null)
  98. featureWritter.close();
  99. }
  100. buidlFeatures(features, reserveID);
  101. }
  102. public NoPostingFeatures(T[] features){
  103. this.features = features;
  104. }
  105. public NoPostingFeatures(List<T> features, boolean reserveID){
  106. this.buidlFeatures(features, reserveID);
  107. }
  108. private void buidlFeatures(List<T> features, boolean reserveID){
  109. this.features = new IOneFeature [features.size()];
  110. int i = 0;
  111. for(T oneFeature : features){
  112. this.features[i] = oneFeature;
  113. if(reserveID == false)
  114. oneFeature.setFeatureId(i);
  115. i++;
  116. }
  117. }
  118. public boolean createGraphs() throws ParseException{
  119. if(this.graphAvailabel)
  120. return false;
  121. for(int i = 0; i< this.features.length; i++)
  122. features[i].creatFeatureGraph(i);
  123. this.graphAvailabel = true;
  124. return true;
  125. }
  126. public boolean sortFeatures(Comparator<IOneFeature> comparator){
  127. Arrays.sort(this.features, comparator);
  128. return true;
  129. }
  130. public T getFeature(int index){
  131. return (T)features[index];
  132. }
  133. public int getfeatureNum(){
  134. return features.length;
  135. }
  136. public void saveFeatures(String newFileName) throws IOException {
  137. BufferedWriter featureWritter = null;
  138. if(newFileName!=null)
  139. featureWritter = new BufferedWriter(new FileWriter(newFileName));
  140. else featureWritter = new BufferedWriter(new FileWriter(featureFileName));
  141. featureWritter.write(this.features.length + "\n");
  142. // Write the feature file
  143. for(int i = 0; i< this.features.length; i++){
  144. featureWritter.write(features[i].toFeatureString() + '\n');
  145. }
  146. featureWritter.close();
  147. }
  148. public void setAllSelected() {
  149. for(int i = 0; i< this.features.length; i++)
  150. this.features[i].setSelected();
  151. }
  152. public void setAllUnSelected() {
  153. for(int i = 0; i< this.features.length; i++)
  154. this.features[i].setUnselected();
  155. }
  156. public NoPostingFeatures<T> mergeFeatures( NoPostingFeatures<T> featureTwo,
  157. String newFeatureFile) throws IOException{
  158. //0. Build the new selected features (In memory)
  159. List<T> newFeatures = new ArrayList<T>();
  160. for(int i = 0; i< this.getfeatureNum(); i++)
  161. newFeatures.add(this.getFeature(i));
  162. for(int j = 0; j< featureTwo.getfeatureNum(); j++)
  163. newFeatures.add(featureTwo.getFeature(j));
  164. return new NoPostingFeatures<T>(newFeatureFile, newFeatures, false);
  165. }
  166. /**
  167. * Return the List of Selected Features"
  168. * If NoPostingFeatures is desired, pls use the construcor
  169. * @return
  170. */
  171. public List<T> getSelectedFeatures() {
  172. List<T> results = new ArrayList<T>();
  173. for(int i = 0; i< this.features.length; i++){
  174. if(features[i].isSelected())
  175. results.add((T)features[i]);
  176. }
  177. return results;
  178. }
  179. /**
  180. * Return the List of Unselected Features:
  181. * If NoPostingFeatures is desired, pls use the constructor
  182. * @return
  183. */
  184. public List<T> getUnSelectedFeatures() {
  185. List<T> results = new ArrayList<T>();
  186. for(int i = 0; i< this.features.length; i++){
  187. if(!features[i].isSelected())
  188. results.add((T)features[i]);
  189. }
  190. return results;
  191. }
  192. //
  193. // @Override
  194. // public Graph[] loadGraphs(int startNum, int endNum) {
  195. // Graph[] results = new Graph[endNum-startNum];
  196. // for(int i = 0; i< results.length; i++)
  197. // results[i] = this.getFeature(i+startNum).getFeatureGraph();
  198. // return results;
  199. // }
  200. //
  201. // @Override
  202. // public String findGraphString(int id) {
  203. // return this.getFeature(id).getDFSCode();
  204. // }
  205. //
  206. // @Override
  207. // public int getTotalNum() {
  208. // return this.getfeatureNum();
  209. // }
  210. }