// Copyright 2013 Thomas Müller // This file is part of MarMoT, which is licensed under GPLv3. package marmot.core; import java.util.Arrays; public class FeatureVector { @Override public String toString() { return "[features_=" + Arrays.toString(features_) + ", length_=" + length_ + ", is_state_=" + is_state_ + ", concat_=" + concat_ + ", sub_vector_=" + sub_vector_ + ", float_vector_=" + float_vector_ + "]"; } private int[] features_; private int length_; private boolean is_state_ = false; private boolean concat_; private FeatureVector sub_vector_; private FloatFeatureVector float_vector_; public FeatureVector(int capacity) { this(capacity, null, false); } public FeatureVector(int capacity, FeatureVector vector) { this(capacity, vector, true); } public FeatureVector(int capacity, FeatureVector vector, boolean concat) { features_ = new int[capacity]; length_ = 0; is_state_ = false; sub_vector_ = vector; concat_ = concat; } public Integer get(int index) { if (index < length_ || !concat_) return features_[index]; return sub_vector_.get(index - length_); } public boolean add(int feature) { if (feature >= 0) { if (length_ >= features_.length) { features_ = Arrays.copyOf(features_, features_.length * 2); } features_[length_++] = feature; } return true; } public int size() { if (concat_ && sub_vector_ != null) { return length_ + sub_vector_.size(); } return length_; } public boolean getIsState() { return is_state_; } public void setIsState(boolean is_state) { is_state_ = is_state; } public void append(FeatureVector vector) { if (features_.length < vector.size() + length_) { int[] features = new int[vector.size() + length_]; System.arraycopy(features_, 0, features, 0, length_); features_ = features; } for (int index = 0; index < vector.size(); index++) { add(vector.get(index)); } } public int getDepth() { if (sub_vector_ == null) return 0; return sub_vector_.getDepth() + 1; } public void setConcat(boolean concat) { concat_ = concat; } public FloatFeatureVector getFloatVector() { if (float_vector_ != null) { assert sub_vector_ == null; return float_vector_; } if (sub_vector_ != null) { return sub_vector_.getFloatVector(); } return null; } public void setFloatVector(FloatFeatureVector float_vector) { float_vector_ = float_vector; } }