    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    }