View Javadoc

1   /*
2    * To change this template, choose Tools | Templates
3    * and open the template in the editor.
4    */
5   
6   package org.lcsim.recon.tracking.seedtracker.strategybuilder;
7   
8   import java.util.HashMap;
9   import java.util.HashSet;
10  import java.util.List;
11  import java.util.Map;
12  import java.util.Set;
13  
14  /**
15   *
16   * @author cozzy
17   */
18  public class SubsetScorer {
19          
20          Map<Set<DumbLayer>,Integer> setmap = new HashMap<Set<DumbLayer>,Integer>(); 
21          LayerWeight weighter = new LayerWeight(); 
22          Map<Set<DumbLayer>,Double> adjacencemap = new HashMap<Set<DumbLayer>,Double>(); 
23          
24          public SubsetScorer(List<Set<DumbLayer>> setlist, List<List<DumbLayer>> adjacentSets) {
25              
26              for (Set<DumbLayer> set : setlist) {
27                  if(setmap.containsKey(set)){
28                      setmap.put(set,setmap.get(set).intValue()+1);  
29                  } else {
30                      setmap.put(set,1); 
31                  }
32              }
33              
34             for (List<DumbLayer> list : adjacentSets) {
35                 //convert to a set because of faster lookup? (actually it might not be since the collection sizes are so small?)
36                 Set<DumbLayer> set = new HashSet<DumbLayer>(list.size());
37                 set.addAll(list); 
38                  if(adjacencemap.containsKey(set)){
39                      adjacencemap.put(set,adjacencemap.get(set).doubleValue()+1.0);  
40                  } else {
41                      adjacencemap.put(set,1.0); 
42                  }
43              }
44  
45             //Normalize adjacencies
46             for(Set<DumbLayer> s : adjacencemap.keySet()) {
47                 double pct = adjacencemap.get(s) / getUnweightedScore(s);
48                 if (pct>1.0) pct = 1.0; //Fix anomalous cases where the numerator is slightly (by no more than a few) bigger than the denominator
49  //             System.out.println(adjacencemap.get(s) + " , "+ getUnweightedScore(s) + ", " + s.toString());
50                 adjacencemap.put(s, pct);
51             }
52          }
53          
54          public void setLayerWeight(LayerWeight lw) {
55              weighter = lw; 
56          }
57          
58         
59          public SubsetScore getScoreObject(Set<DumbLayer> testset) {
60              
61              return new SubsetScore(getScore(testset), getUnweightedScore(testset), getAdjacence(testset)); 
62              
63          }
64          
65          
66          //s * Pi(w) * (1 + a*(adjacence))
67          //
68          public double getScore(Set<DumbLayer> testSet) {
69            return getUnweightedScore(testSet) * weighter.getWeight(testSet)
70                    * (  1 + 
71                         (getAdjacence(testSet))
72                           * weighter.getAdjacenceMultiplier() 
73                      ); 
74          }
75          
76          public int getUnweightedScore(Set<DumbLayer> testSet){
77              
78              int ret = 0; 
79              for (Set<DumbLayer> s : setmap.keySet()){
80                  if (s.containsAll(testSet)) {
81                      ret+= setmap.get(s).intValue();
82                  }
83              }
84              return ret;
85          }
86          
87          public double getAdjacence(Set<DumbLayer> testSet){
88              if (adjacencemap.containsKey(testSet)){
89                  return adjacencemap.get(testSet); 
90              } 
91              
92              return 0; 
93          }
94          
95          public void markUsed(Set<DumbLayer> testSet) {
96              for (Set<DumbLayer> s : setmap.keySet()){
97                  if (s.containsAll(testSet)) {
98                      setmap.put(s,0); 
99                  }
100             }
101         }
102         
103         
104     }