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            public FeatureValue getFeatureValue(int index) {
077                    if (index < 0 || index >= size()) {
078                            return null;
079                    }
080                    return get(index).getFeatureValue();
081            }
082            
083            public FeatureValue[] getFeatureValues() {
084                    final int size = size();
085                    FeatureValue[] featureValues = new FeatureValue[size];
086                    for (int i = 0; i < size; i++) {
087                            featureValues[i] = get(i).getFeatureValue();
088                    }
089                    return featureValues;
090            }
091            
092            /* (non-Javadoc)
093             * @see java.util.AbstractCollection#toString()
094             */
095            public String toString() {
096                    final StringBuilder sb = new StringBuilder();
097                    for (FeatureFunction function : this) {
098                            if (function != null) {
099                                    sb.append(function.getFeatureValue().toString());
100                                    sb.append('\n');
101                            }
102                    }
103                    return sb.toString();
104            }
105    }