package mikera.vectorz.impl;

import java.util.Arrays;
import java.util.List;

import mikera.indexz.Index;
import mikera.matrixx.AMatrix;
import mikera.vectorz.AVector;
import mikera.vectorz.Op2;
import mikera.vectorz.Vector;
import mikera.vectorz.Vectorz;
import mikera.vectorz.util.ErrorMessages;
import mikera.vectorz.util.VectorzException;


/**
 * Abstract base class for Sparse vector implementations
 * @author Mike
 *
 */
@SuppressWarnings("serial")
public abstract class ASparseVector extends ASizedVector implements ISparseVector {

	protected ASparseVector(int length) {
		super(length);
	}

	/**
	 * Returns the number of non-sparse elements in the sparse vector.
	 * 
	 * This will be greater or equal to the number of non-zero elements
	 * 
	 * @return
	 */
	public abstract int nonSparseElementCount();
	
	@Override
	public abstract AVector nonSparseValues();
	
	@Override
	public abstract Index nonSparseIndex();
	
	@Override
	public double visitNonZero(IndexedElementVisitor elementVisitor) {
		Index ix=nonSparseIndex();
		int cnt=ix.length();
		if (cnt==0) return 0.0;
		AVector vs=nonSparseValues();
		for (int k=0; k getSlices() {
		// we prefer a ListWrapper for sparse vectors since it is O(1) to create.
		// downside: causes boxing on individual element accesses
		return new ListWrapper(this);
	}
	
	@Override
	public double elementProduct() {
		int n=nonSparseElementCount();
		if (n(elementCount()*0.25))) return super.clone();
		return SparseIndexedVector.create(this);
	}
	
	public boolean equals(ASparseVector v) {
		if (v==this) return true;
		if (v.length!=length) return false;
		
		Index ni=nonSparseIndex();
		for (int i=0; i 

Ads help maintain this website.