@Override public void zero() { this.clear(); }
@Override public double angle( final InfiniteVector<KeyType> other) { return Math.acos(this.cosine(other)); }
@Override public double dot( final InfiniteVector<KeyType> other) { return this.dotProduct(other); }
@Override public InfiniteVector<KeyType> plus( final InfiniteVector<KeyType> other) { final InfiniteVector<KeyType> result = this.clone(); result.plusEquals(other); return result; }
@Override public double sum() { double sum = 0.0; for( ScalarMap.Entry<KeyType> entry : this.entrySet() ) { sum += entry.getValue(); } return sum; }
@Override public InfiniteVector<KeyType> toInfiniteVector() { final DefaultInfiniteVector<KeyType> result = new DefaultInfiniteVector<KeyType>(this.size()); for (ScalarMap.Entry<KeyType> entry : this.entrySet()) { result.set(entry.getKey(), entry.getValue()); } return result; }
@Override public double cosine( final InfiniteVector<KeyType> other) { final double dotProduct = this.dotProduct(other); if (dotProduct == 0.0) { return 0.0; } else { final double thisNorm = this.norm2Squared(); final double otherNorm = other.norm2Squared(); return dotProduct / Math.sqrt(thisNorm * otherNorm); } }
@Override public boolean equals( final InfiniteVector<KeyType> other, final double effectiveZero) { return (other != null) && this.euclideanDistance(other) <= effectiveZero; }
@Override public void scaledMinusEquals( final double scaleFactor, final InfiniteVector<KeyType> other) { for (ScalarMap.Entry<KeyType> entry : other.entrySet()) { this.decrement(entry.getKey(), scaleFactor * entry.getValue()); } }
@Override public double euclideanDistance( final InfiniteVector<KeyType> other) { return Math.sqrt(this.euclideanDistanceSquared(other)); }
@Override @SuppressWarnings("unchecked") public boolean equals( final Object other) { return (other == this) || (other instanceof InfiniteVector<?> && this.equals((InfiniteVector<KeyType>) other, 0.0)); }
@Override public InfiniteVector<KeyType> minus( final InfiniteVector<KeyType> other) { final InfiniteVector<KeyType> result = this.clone(); result.minusEquals(other); return result; }
@Override public double norm1() { double result = 0.0; for (ScalarMap.Entry<KeyType> entry : this.entrySet()) { result += Math.abs(entry.getValue()); } return result; }
@Override public InfiniteVector<KeyType> toInfiniteVector() { final DefaultInfiniteVector<KeyType> result = new DefaultInfiniteVector<KeyType>(this.size()); for (ScalarMap.Entry<KeyType> entry : this.entrySet()) { result.set(entry.getKey(), entry.getValue()); } return result; }
@Override public double cosine( final InfiniteVector<KeyType> other) { final double dotProduct = this.dotProduct(other); if (dotProduct == 0.0) { return 0.0; } else { final double thisNorm = this.norm2Squared(); final double otherNorm = other.norm2Squared(); return dotProduct / Math.sqrt(thisNorm * otherNorm); } }
@Override public boolean equals( final InfiniteVector<KeyType> other, final double effectiveZero) { return (other != null) && this.euclideanDistance(other) <= effectiveZero; }
@Override public void scaledMinusEquals( final double scaleFactor, final InfiniteVector<KeyType> other) { for (ScalarMap.Entry<KeyType> entry : other.entrySet()) { this.decrement(entry.getKey(), scaleFactor * entry.getValue()); } }
@Override public double euclideanDistance( final InfiniteVector<KeyType> other) { return Math.sqrt(this.euclideanDistanceSquared(other)); }