[ https://issues.apache.org/jira/browse/MATH312?page=com.atlassian.jira.plugin.system.issuetabpanels:alltabpanel
]
Jake Mannix updated MATH312:

Attachment: MATH312.patch
New patch. This one has no reference to the "nonzero default values" for sparse vectors, which
can be addressed in another JIRA ticket. This patch now only deals with the following files:
* src/main/java/org/apache/commons/math/linear/RealVector.java only methods added are iterator(),
sparseIterator(), map(UnivariateRealFunction), mapToSelf(UnivariateRealFunction)
* src/main/java/org/apache/commons/math/analysis/UnivariateRealFunctions.java  a collection
of UnivariateRealFunction wrappers to java.lang.Math static methods.
* src/main/java/org/apache/commons/math/linear/AbstractRealVector.java  implements the above
methods, plus a ton more in the general case, so new implementations don't need to.
* src/main/java/org/apache/commons/math/linear/ArrayRealVector.java  primary change is to
extend AbstractRealVector
* src/main/java/org/apache/commons/math/linear/OpenMapRealVector.java  ditto
* src/test/java/org/apache/commons/math/linear/AbstractRealVectorTest.java  tests for the
new AbstractRealVector's new methods
* src/test/java/org/apache/commons/math/linear/ArrayRealVectorTest.java  update the inner
interface
* src/test/java/org/apache/commons/math/linear/SparseRealVectorTest.java  ditto
> RealVector interface could use some iterators (dense and sparse) and generic map() and
collect() methods.
> 
>
> Key: MATH312
> URL: https://issues.apache.org/jira/browse/MATH312
> Project: Commons Math
> Issue Type: New Feature
> Affects Versions: 2.0
> Environment: all
> Reporter: Jake Mannix
> Fix For: 2.1
>
> Attachments: MATH312.patch, MATH312.patch
>
>
> As discussed on the [math] list, there are other projects out there which would love
to get a chance to standardize on using commonsmath for things like linear algebra primitives,
as it would build a common base to build upon. But to do that, some wellknown and used techniques
for dealing with vectors, for one thing, are missing. Most glaringly is the treatment of
sparse vectors: giving no Iterator for nondefault values means external clients lose the
advantage of sparseness  only internal methods can skip around.
> Extending the RealVector interface with sparse (and dense) iterator methods would fix
this:
> {code}
> double getDefaultValue();
> Iterator<RealVector.Entry> iterator();
> Iterator<RealVector.Entry> nonDefaultIterator();
> {code}
> but there is another way to deal with vector data as well: instead of passing iterators
around, and worrying about all the lovely ConcurrentModification and unsupported "remove"
methods (which aren't the end of the world), we can instead expose generic map functions:
> {code}
> RealVector map(UnivariateRealFunction f);
> RealVector mapToSelf(UnivariateRealFunction f);
> {code}
> where RealVector mapToSelf(UnivariateRealFunction), which applies the function to the
vector's entries (checking whether the function preserves the default value up front allows
it to chose between the sparse or dense iterator), and map just applies mapToSelf to a copy.
> This doesn't exhaust all possible places where Iterators could be used helpfully (there's
also combining two vectors together via a {code}map(BinaryRealFunction, RealVector other){code}
which could be specialized nonlinear forms of addition or subtraction, and {code}double collect(UnivariateRealFunction,
BinaryRealFunction){code} which uses the iterates over all of the entries, applying the first
unary function to each entry, and then applying the binary function to combine this value
with the previous accumulated value  with "pow(2)", and "+" as the two functions, you get
L2 norm, with "abs()" and "+", you get L1 norm, etc...)

This message is automatically generated by JIRA.

You can reply to this email to add a comment to the issue online.
