Package mikera.vectorz.impl

Source Code of mikera.vectorz.impl.IndexVector

package mikera.vectorz.impl;

import mikera.indexz.Index;
import mikera.vectorz.AVector;
import mikera.vectorz.util.ErrorMessages;
import mikera.vectorz.util.IntArrays;
import mikera.vectorz.util.VectorzException;

/**
* A constrained immutable vector implementation wrapping an integer Index
*
* @author Mike
*/
@SuppressWarnings("serial")
public class IndexVector extends ASizedVector {
  private final Index index;
 
  private IndexVector(Index index) {
    super(index.length());
    this.index=index;
  }

  public static IndexVector of(int... values) {
    return new IndexVector(Index.of(values));
  }
 
  public IndexVector ofDoubles(double... values) {
    return new IndexVector(Index.wrap(IntArrays.create(values)));
  }
 
  /**
   * Creates an IndexVector wrapping the given immutable index
   *
   * WARNING: Index will be used as internal storage for the IndexVector
   * @param a
   * @return
   */
  public static IndexVector wrap(Index a) {
    return new IndexVector(a);   
  }

  @Override
  public double get(int i) {
    return index.get(i);
  }
 
  @Override
  public double unsafeGet(int i) {
    return index.unsafeGet(i);
  }

  @Override
  public void set(int i, double value) {
    throw new UnsupportedOperationException(ErrorMessages.immutable(this));
  }
 
  @Override
  public boolean isElementConstrained() {
    return true;
  }
 
  @Override
  public boolean isFullyMutable() {
    return false;
  }
 
  @Override
  public void getElements(double[] data, int offset) {
    IntArrays.copyIntsToDoubles(index.data,0,data,offset,length);
  }
 
  @Override
  public boolean isMutable() {
    return false;
  }

  @Override
  public AVector exactClone() {
    return new IndexVector(index.clone());
  }
 
  @Override
  public void validate() {
    if (length!=index.length()) throw new VectorzException("Incorrect index length!!");
    super.validate();
  }

  @Override
  public double dotProduct(double[] data, int offset) {
    double result=0.0;
    for (int i=0; i<length; i++) {
      result+=data[offset+i]*index.unsafeGet(i);
    }
    return result;
  }

}
TOP

Related Classes of mikera.vectorz.impl.IndexVector

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.