[
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.