root/BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLClassGraph.java @ 50

リビジョン 50, 7.6 KB (コミッタ: atsuko, 11 年 前)

convergence & divergence 判定改良

  • 属性 svn:mime-type の設定値 text/plain
Rev行番号 
[2]1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package org.biohackathon.SPARQLBuilder.OWL;
6
7/**
8 *
9 * @author atsuko
10 */
11import java.util.*;
12
13public class OWLClassGraph extends LabeledMultiDigraph{
14    String startClass;
15    String endClass;
16    int nsteps;
17    int limit;
[34]18    int th;
[47]19    double concut;
20    double divcut;
[2]21       
22    public class LinkAndPath{
23        ClassLink classLink;
24        List<ClassLink> path;
[45]25        boolean converge;
[2]26        public LinkAndPath(ClassLink classLink, List<ClassLink> path){
27           this.classLink = classLink;
28           this.path = path;
[45]29           this.converge = false;
[2]30        }
[45]31       
32        public LinkAndPath(ClassLink classLink, List<ClassLink> path, boolean converge){
33           this.classLink = classLink;
34           this.path = path;
35           this.converge = converge;
36        }
[2]37    }
38   
[3]39    public OWLClassGraph(String startClass, String endClass){
[2]40        super();
[3]41        this.startClass = startClass;
42        addNode(startClass);
43        this.endClass = endClass;
44        addNode(endClass);
[41]45        nsteps = 3;
[3]46        limit = 1000;
[34]47        th = 0;
[47]48        concut = 2.0;
[48]49        divcut = - 2.0;
[2]50    }
51   
[3]52    public void generateGraph(List<List<ClassLink>> paths){
[15]53        ListIterator<List<ClassLink>> pit = paths.listIterator();
54        while( pit.hasNext() ){
[21]55            List<ClassLink> cls = pit.next();
56            String start = startClass;
57            ListIterator<ClassLink> cit = cls.listIterator();
58            while ( cit.hasNext() ){
59                // KOKO
60            }
[15]61        }
[2]62    }
63   
[29]64    public Path[] getPaths(OWLQueryBuilderImpl qb, int mode, boolean countLink){
[47]65        List<List<ClassLink>> paths = null;
66        if ( mode <= 1){
67            paths = searchPaths(qb, mode, countLink);
68        }else if ( mode == 2 ){
69            paths = searchPathsWithCut(qb);           
70        }else{
71            System.err.println("Mode is not correct");
72            return null;
73        }
[2]74        Path[] patharray = new Path[paths.size()];
75        ListIterator<List<ClassLink>> pit = paths.listIterator();
76        int i = 0;
77        while ( pit.hasNext() ){
[3]78            patharray[i] = new Path();
[2]79            patharray[i].setStartClass(startClass);
80            List<ClassLink> path = pit.next();
81            patharray[i].setClassLinks(path);
[8]82            ListIterator<ClassLink> cit = path.listIterator();
83            int min = Integer.MAX_VALUE;
84            while ( cit.hasNext() ){
85                ClassLink cl = cit.next();
86                if ( cl.getNumOfLinks() < min ){
87                    min = cl.getNumOfLinks();
88                }
89            }
90            patharray[i].setWidth(min);
[2]91            i++;
92        }
93        return patharray;
94    }
[45]95       
[32]96    private List<List<ClassLink>> searchPaths(OWLQueryBuilderImpl qb, int mode, boolean countLinks){
[15]97        List<List<ClassLink>> paths = new ArrayList<>();
[47]98        ClassLink crrLink = new ClassLink(null,startClass,Direction.both,0,0,0);
[15]99        List<LinkAndPath> lp = new LinkedList<>();
[2]100        lp.add(new LinkAndPath(crrLink, new LinkedList<ClassLink>()));
101        try{
102          for ( int i = 0; i < nsteps; i++ ){
103              ListIterator<LinkAndPath> lit = lp.listIterator();
[15]104              List<LinkAndPath> nextlp = new LinkedList<>();
[2]105              while ( lit.hasNext() ){
106                  LinkAndPath crrlp = lit.next();
[3]107                  ClassLink[] classLinks = null;
108                  // Mode
109                  if ( mode == 0 ){
[32]110                      classLinks = qb.getNextClass(null, crrlp.classLink.getLinkedClassURI(), limit, countLinks);
[3]111                  }else if ( mode == 1 ){
[41]112                      classLinks = qb.getNextClassViaInstanceLink(null, crrlp.classLink.getLinkedClassURI(), limit);
[3]113                  }else{ System.err.println("Mode is not correct."); }
[2]114                  for ( int j = 0 ; j < classLinks.length; j++ ){
[15]115                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
[2]116                      crrpath.add(classLinks[j]);
117                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
[15]118                          paths.add(new LinkedList<>(crrpath));
[34]119                          continue;
[2]120                      }
[34]121                      if ( countLinks == true && classLinks[j].getNumOfLinks() <= th){
122                          continue;
123                      }
[2]124                      nextlp.add(new LinkAndPath(classLinks[j],crrpath));
125                  }
126              }
[3]127              lp = nextlp;
[2]128          }
[15]129        }catch(Exception e){
130            System.err.println(e);
131        }
[21]132        return paths; 
[2]133    }
[45]134   
135    private List<List<ClassLink>> searchPathsWithCut(OWLQueryBuilderImpl qb){
136        List<List<ClassLink>> paths = new ArrayList<>();
[47]137        ClassLink crrLink = new ClassLink(null,startClass,Direction.both,0,0,0);
[45]138        List<LinkAndPath> lp = new LinkedList<>();
139        lp.add(new LinkAndPath(crrLink, new LinkedList<ClassLink>()));
140        try{
141          for ( int i = 0; i < nsteps; i++ ){
142              ListIterator<LinkAndPath> lit = lp.listIterator();
143              List<LinkAndPath> nextlp = new LinkedList<>();
144              while ( lit.hasNext() ){
145                  LinkAndPath crrlp = lit.next();
146                  ClassLink[] classLinks = null;
147                  classLinks = qb.getNextClassViaInstanceLink(null, crrlp.classLink.getLinkedClassURI(), limit);
148                  for ( int j = 0 ; j < classLinks.length; j++ ){
149                      List<ClassLink> crrpath = new LinkedList<>(crrlp.path);
150                      crrpath.add(classLinks[j]);
151                      if ( classLinks[j].getLinkedClassURI().equals(endClass) ){
152                          paths.add(new LinkedList<>(crrpath));
153                          continue;
154                      }
155                      boolean con = false;
[47]156                      boolean div = false;
157                      double conv = getValueForConvergence(classLinks[j].getNumOfOriginInstances(),
158                                                           classLinks[j].getNumOfLinkedInstances(),
159                                                           classLinks[j].getNumOfLinks());
[48]160                      //double divv = getValueForDivergence(classLinks[j].getNumOfOriginInstances(),
161                      //                                     classLinks[j].getNumOfLinkedInstances(),
162                      //                                     classLinks[j].getNumOfLinks());
[50]163                      if ( conv > concut ){ // convergence
[45]164                          con = true;
165                      }
[50]166                      if ( conv < divcut ){ // divergence
[47]167                          div = true;
168                      }
169                      if ( crrlp.converge == true && div == true ){ // converge & 縲€diverge
[45]170                          continue; // cut
171                      }
172                      nextlp.add(new LinkAndPath(classLinks[j], crrpath, con));
173                  }
174              }
175              lp = nextlp;
176          }
177        }catch(Exception e){
178            System.err.println(e);
179        }
180        return paths; 
181    }
[47]182   
183    private double getValueForConvergence(int numOfOriginInstances, int numOfLinkedInstances, int numOfLinks){
[48]184        //return (double) numOfLinks / (double) numOfLinkedInstances ;
[50]185        // Convergence plus, Divergence minus
186        return Math.log((double)numOfOriginInstances) - Math.log((double)numOfLinkedInstances);
[47]187    }
[45]188
[48]189    /*
[47]190    private double getValueForDivergence(int numOfOriginInstances, int numOfLinkedInstances, int numOfLinks){
[48]191        return (double) numOfLinks / (double) numOfOriginInstances ;
192        // return ;
193    }*/
[2]194}
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。