001    /**
002     * 
003     */
004    package calhoun.analysis.crf;
005    
006    import java.util.ArrayList;
007    
008    import calhoun.util.Assert;
009    
010    public class CacheStrategySpec {
011            public enum CacheStrategy { COMPOSITE, CONSTANT, SPARSE, UNSPECIFIED, DENSE_NODE_BOUNDARY, DENSE, LENGTHFUNCTION /*, INTERVAL, LENGTH, NO_CACHE */}
012    
013            public CacheStrategy  strategy;
014            public Object         details;
015            
016            public CacheStrategySpec(CacheStrategy strategy, Object details) {
017                    this.strategy = strategy;
018                    this.details = details;
019            }
020            
021            public CacheStrategySpec(CacheStrategy strategy) {
022                    this(strategy,null);
023            }
024            
025            /** Used in cases where the feature will return a value at every edge and/or node. */
026            public static class DenseCachingDetails {
027            
028                    public int nTables;
029                    public int nEvals;
030                    public int[] potential;
031                    public int[] tableNum;
032                    public short[] featureIndex;
033                    
034                    public void check() {
035                            Assert.a(nTables >= 0);
036                            Assert.a(potential.length == nEvals);
037                            Assert.a(tableNum.length == nEvals);
038                            Assert.a(featureIndex.length == nEvals);
039                            
040                            for (int j=0; j<nEvals; j++) {
041                                    Assert.a(potential[j] >=0);
042                                    Assert.a(tableNum[j]>=0);
043                                    Assert.a(tableNum[j] < nTables);
044                                    Assert.a(featureIndex[j] >=0);
045                            }
046                    }
047            }
048            
049            // Used when a FeatureManagerNodeBoundaries is an explicit length node feature and the value it returns is obtained by subtracting two cumulative sums.
050            public static class DenseBoundaryCachingDetails {
051                    
052                    public int nTables;
053                    public ArrayList<DenseBoundaryEntry> entries;
054                    
055                    public DenseBoundaryCachingDetails (int nTables) {
056                            this.nTables = nTables;
057                            entries = new ArrayList<DenseBoundaryEntry>();
058                    }
059                    
060                    public void add(int potential, int tableNum, int featureIndex, int rightPad, int leftPad) {
061                            entries.add(new DenseBoundaryEntry(potential,tableNum,featureIndex,rightPad,leftPad));
062                    }
063                    
064                    public void check() {
065                            int maxTable = 0;
066                            for (int j=0; j<entries.size(); j++) {
067                                    DenseBoundaryEntry dbe = entries.get(j);
068                                    dbe.check();
069                                    int tnum = dbe.tableNum;
070                                    if (tnum > maxTable) {
071                                            maxTable = tnum;
072                                    }                       
073                            }
074                            Assert.a(maxTable == (nTables-1));
075                    }
076            }
077            
078            public static class DenseBoundaryEntry {
079                    public int potential;
080                    public int tableNum;
081                    public int featureIndex;
082                    public int rightPad;
083                    public int leftPad;
084                    
085                    public DenseBoundaryEntry(int potential, int tableNum, int featureIndex, int rightPad, int leftPad) {
086                            this.potential = potential;
087                            this.tableNum = tableNum;
088                            this.featureIndex = featureIndex;
089                            this.rightPad = rightPad;
090                            this.leftPad = leftPad;
091                            check();
092                    }
093    
094                    private void check() {
095                            Assert.a(potential >= 0);
096                            Assert.a(tableNum >= 0);
097                            Assert.a(featureIndex >= 0);
098                            Assert.a(rightPad >= 0); 
099                            Assert.a(leftPad >= 0);      
100                    }
101            }
102            
103    }