[ 
https://issues.apache.org/jira/browse/MAHOUT-300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12836647#action_12836647
 ] 

Robin Anil commented on MAHOUT-300:
-----------------------------------

{code}
  public double dot(Vector x) {
    if (size() != x.size()) {
      throw new CardinalityException(size(), x.size());
    }
    if(this == x) return dotSelf();
    
    double result = 0;
    if (this instanceof DenseVector && x instanceof DenseVector) {
      for (int i = 0; i < x.size(); i++) {
        result += this.getQuick(i) * x.getQuick(i);
      }
      return result;
    }
    else if (this instanceof SequentialAccessSparseVector && x instanceof 
SequentialAccessSparseVector) {
      // For sparse SeqAccVectors. do dot product without lookup in a linear 
fashion
      Iterator<Element> myIter = iterateNonZero();
      Iterator<Element> otherIter = x.iterateNonZero();
      Element myCurrent = null;
      Element otherCurrent = null;
      while (myIter.hasNext() && otherIter.hasNext()) {
        if (myCurrent == null) myCurrent = myIter.next();
        if (otherCurrent == null) otherCurrent = otherIter.next();
        
        int myIndex = myCurrent.index();
        int otherIndex = otherCurrent.index();
        
        if (myIndex < otherIndex) {
          // due to the sparseness skipping occurs more hence checked before 
equality
          myCurrent = null;
        } else if (myIndex > otherIndex){
          otherCurrent = null;
        } else { // both are equal 
          result += myCurrent.get() * otherCurrent.get();
          myCurrent = null;
          otherCurrent = null;
        } 
      }
      return result;
    } else if (!(this instanceof SequentialAccessSparseVector) // rand.seq 
rand.rand dense.seq dense.rand
        && (x instanceof SequentialAccessSparseVector || x instanceof 
RandomAccessSparseVector)) {
      // Try to get the speed boost associated fast/normal seq access on x and 
quick lookup on this
      Iterator<Element> iter = x.iterateNonZero();
      while (iter.hasNext()) {
        Element element = iter.next();
        result += element.get() * getQuick(element.index());
      }
      return result;
    } else { // seq.rand. seq.dense rand.dense 
      // TODO: can optimize more based on the numDefaultElements in the vectors
      Iterator<Element> iter = iterateNonZero();
      while (iter.hasNext()) {
        Element element = iter.next();
        result += element.get() * x.getQuick(element.index());
      }
      return result;
    }
  }
  
  public double dotSelf() {
    double result = 0;
    if (this instanceof DenseVector) {
      for (int i = 0; i < size(); i++) {
        double value = this.getQuick(i);
        result += value * value;
      }
      return result;
    } else {
      Iterator<Element> iter = iterateNonZero();
      while (iter.hasNext()) {
        Element element = iter.next();
        double value = element.get();
        result += value * value;
      }
      return result;
    }
  }
{code}



> Solve performance issues with Vector Implementations
> ----------------------------------------------------
>
>                 Key: MAHOUT-300
>                 URL: https://issues.apache.org/jira/browse/MAHOUT-300
>             Project: Mahout
>          Issue Type: Improvement
>    Affects Versions: 0.3
>            Reporter: Robin Anil
>             Fix For: 0.3
>
>         Attachments: MAHOUT-300.patch, MAHOUT-300.patch, MAHOUT-300.patch, 
> MAHOUT-300.patch, MAHOUT-300.patch, MAHOUT-300.patch
>
>
> AbstractVector operations like times
>   public Vector times(double x) {
>     Vector result = clone();
>     Iterator<Element> iter = iterateNonZero();
>     while (iter.hasNext()) {
>       Element element = iter.next();
>       int index = element.index();
>       result.setQuick(index, element.get() * x);
>     }
>     return result;
>   }
> should be implemented as follows
>  public Vector times(double x) {
>     Vector result = clone();
>     Iterator<Element> iter = result.iterateNonZero();
>     while (iter.hasNext()) {
>       Element element = iter.next();
>       element.set(element.get() * x);
>     }
>     return result;
>   }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to