/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.apache.samoa.instances;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

/**
 * 
 * @author abifet
 */
public class DenseInstanceData implements InstanceData {

  public DenseInstanceData(double[] array) {
    this.attributeValues = array;
  }

  public DenseInstanceData(int length) {
    this.attributeValues = new double[length];
  }

  public DenseInstanceData() {
    this(0);
  }

  protected double[] attributeValues;

  @Override
  public int numAttributes() {
    return this.attributeValues.length;
  }

  @Override
  public double value(int indexAttribute) {
    return this.attributeValues[indexAttribute];
  }

  @Override
  public boolean isMissing(int indexAttribute) {
    return Double.isNaN(this.value(indexAttribute));
  }

  @Override
  public int numValues() {
    return numAttributes();
  }

  @Override
  public int index(int indexAttribute) {
    return indexAttribute;
  }

  @Override
  public double valueSparse(int indexAttribute) {
    return value(indexAttribute);
  }

  @Override
  public boolean isMissingSparse(int indexAttribute) {
    return isMissing(indexAttribute);
  }

  /*
   * @Override public double value(Attribute attribute) { return
   * value(attribute.index()); }
   */

  @Override
  public double[] toDoubleArray() {
    return attributeValues.clone();
  }

  @Override
  public void setValue(int attributeIndex, double d) {
    this.attributeValues[attributeIndex] = d;
  }

}
