RelationsUtils.java
01 /*
02  *  RelationsUtils.java
03  *
04  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
05  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
06  *
07  *  This file is part of GATE (see http://gate.ac.uk/), and is free
08  *  software, licenced under the GNU Library General Public License,
09  *  Version 2, June 1991 (in the distribution as file licence.html,
10  *  and also available at http://gate.ac.uk/gate/licence.html).
11  *
12  *  Valentin Tablan, 5 Mar 2012
13  *
14  *  $Id: RelationsUtils.java 15540 2012-03-07 14:22:16Z valyt $
15  */
16 package gate.relations;
17 
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.SortedSet;
21 import java.util.TreeSet;
22 
23 /**
24  * Utilities for working with relations.
25  */
26 public class RelationsUtils {
27   
28   /**
29    * Computes the transitive closure for symmetric transitive relations (such as
30    * co-reference). Given a relation name and a seed annotation ID, this method 
31    * returns the IDs for all annotations that are:
32    <ul>
33    *   <li>the seed annotation</li>
34    *   <li>in the given relation (regardless of position) with another 
35    *   annotation from this set</li>
36    </ul>
37    
38    @param relSet the {@link RelationSet} used as context.
39    @param relationName the relation to be used for computing the closure.
40    @param annotationId the ID for the seed annotation.
41    @return an array containing the IDs of all the annotations in the closure.
42    */
43   public static int[] transitiveClosure(RelationSet relSet,  
44       String relationName, int annotationId) {
45     List<Relation> relations = new ArrayList<Relation>();
46     for(int pos = 0; pos < relSet.getMaximumArity(); pos++) {
47       int[] constraint = new int[pos + 1];
48       for(int i = 0; i < pos; i++constraint[i= RelationSet.ANY;
49       constraint[pos= annotationId;
50       relations.addAll(relSet.getRelations(relationName, constraint));
51     }
52     
53     SortedSet<Integer> closure = new TreeSet<Integer>();
54     closure.add(annotationId);
55     for(Relation rel : relations) {
56       for(int annId : rel.getMembers()) closure.add(annId);
57     }
58     int[] res = new int[closure.size()];
59     int i = 0;
60     for(int annId : closureres[i++= annId;
61     return res;
62   }
63   
64 }