001    package org.maltparser.core.feature;
002    
003    import java.io.Serializable;
004    import java.util.ArrayList;
005    
006    import org.maltparser.core.exception.MaltChainedException;
007    import org.maltparser.core.feature.function.FeatureFunction;
008    import org.maltparser.core.feature.spec.SpecificationSubModel;
009    import org.maltparser.core.feature.value.FeatureValue;
010    
011    /**
012    *
013    *
014    * @author Johan Hall
015    */
016    public class FeatureVector extends ArrayList<FeatureFunction> implements Serializable {
017            public final static long serialVersionUID = 3256444702936019250L;
018            protected SpecificationSubModel specSubModel;
019            protected FeatureModel featureModel;
020    
021            
022            /**
023             * Constructs a feature vector
024             * 
025             * @param featureModel  the parent feature model
026             * @param specSubModel  the subspecifiction-model
027             * @throws MaltChainedException
028             */
029            public FeatureVector(FeatureModel featureModel, SpecificationSubModel specSubModel) throws MaltChainedException {
030                    setSpecSubModel(specSubModel);
031                    setFeatureModel(featureModel);
032                    for (String spec : specSubModel) {
033                            add(featureModel.identifyFeature(spec));        
034                    }
035            }
036            
037            /**
038             * Returns the subspecifiction-model.
039             * 
040             * @return the subspecifiction-model
041             */
042            public SpecificationSubModel getSpecSubModel() {
043                    return specSubModel;
044            }
045    
046            protected void setSpecSubModel(SpecificationSubModel specSubModel) {
047                    this.specSubModel = specSubModel;
048            }
049            
050            /**
051             * Returns the feature model that the feature vector belongs to.
052             * 
053             * @return the feature model that the feature vector belongs to
054             */
055            public FeatureModel getFeatureModel() {
056                    return featureModel;
057            }
058    
059            protected void setFeatureModel(FeatureModel featureModel) {
060                    this.featureModel = featureModel;
061            }
062            
063            /**
064             * Updates all feature value in the feature vector according to the current state.
065             * 
066             * @throws MaltChainedException
067             */
068            public void update() throws MaltChainedException {
069                    final int size =  size();
070                    for (int i = 0; i < size; i++) {
071                            get(i).update();
072                    }
073            }
074            
075            /**
076             * Updates the cardinality (number of distinct values) of a feature value associated with the feature function 
077             * 
078             * @throws MaltChainedException
079             */
080    //      public void updateCardinality() throws MaltChainedException {
081    //              final int size =  size();
082    //              for (int i = 0; i < size; i++) {
083    //                      get(i).updateCardinality();
084    //              }
085    //      }
086            
087            public FeatureValue getFeatureValue(int index) {
088                    if (index < 0 || index >= size()) {
089                            return null;
090                    }
091                    return get(index).getFeatureValue();
092            }
093            
094            /* (non-Javadoc)
095             * @see java.util.AbstractCollection#toString()
096             */
097            public String toString() {
098                    StringBuilder sb = new StringBuilder();
099                    for (FeatureFunction function : this) {
100                            if (function != null) {
101                                    sb.append(function.getFeatureValue().toString());
102                                    sb.append('\n');
103                            }
104                    }
105                    return sb.toString();
106            }
107    }