First stable release checklist
Since I'm now a free agent, after far too many years I have the time to complete a first release of bandicoot. I'm pretty excited about this, and I'm going to get started writing code in a couple days after finishing a workbench in my garage.
I collected a checklist of functionality that I think is necessary for a first release. Some of it could be dropped, if needed. The eventual goal (which has always been this) is API parity with Armadillo, or as close as we can get. Some of these are already done or partially completed, and some of these are already covered by issues I opened years ago, when I thought I would have the time then to complete this.
Matrix operations
Should require only C++
-
reshape()
(!49 (merged)) -
size()
(!51 (merged)) -
vectorise()
(!33 (merged)) -
as_scalar()
-
all()
andany()
(!52 (merged), !53 (merged), !54 (merged), !55 (merged), !56 (merged)) -
norm()
(!40 (merged), !42 (merged), !44 (merged)) -
normalise()
(!57 (merged))
Needs some interfacing with CUDA/OpenCL libraries or pre-existing kernels
-
eye()
,ones()
,zeros()
-
diagmat()
,diagvec()
(!45 (merged)) -
repmat()
(!30 (merged)),resize()
(!31 (merged)) -
Elementwise functions: exp()
,exp2()
, etc.; (!27 (merged)) -
Trigonometric functions: sin()
,cos()
, etc.; (!27 (merged)) -
Statistical functions: mean()
,median()
,stddev()
,var()
,range()
,cov()
,cor()
(!59 (merged), !62 (merged)) -
conv_to()
support to interface with Armadillo (!58 (merged))
May need custom kernels
-
Random number support: randu()
,randn()
,randi()
,(!28 (merged))randg()
-
linspace()
(!29 (merged)) -
join_rows()
,join_cols()
(!64 (merged)) -
dot()
-
accu()
-
(wait until next release, this is a bit more complicated than I thought)cumsum()
(could adaptaccu()
) -
min()
,max()
,index_max()
(!42 (merged), !47 (merged)) -
sort()
,sort_index()
(!65 (merged), !66 (merged)) -
symmatu()
,symmatl()
(!69 (merged)) -
find()
and variants (!67 (merged), !68 (merged)) -
Transpose support: trans()
,htrans()
,strans()
(!35 (merged)) -
det()
(!81 (merged)) -
cross()
(!83 (merged)) -
conv()
and convolutions (!84 (merged)) -
chol()
(Cholesky decomposition) -
eig_sym()
(!75 (merged)) -
lu()
(!74 (merged)) -
svd()
(!41 (merged)) -
pinv()
(!82 (merged)) -
solve()
(!109 (merged))
Support code
-
Add fill
struct and default tofill::zeros
(#28 (closed)) -
Some kind of system to cache compiled kernels on a system, so that every program does not need to compile every kernel when starting (!24 (merged)) -
Clarify linking situation: it should be possible to link against only CUDA or OpenCL, not both (!94 (merged)) -
Implement a wrapper library, like Armadillo? (This may be especially important since there are so many dependencies to link against.) (!97 (merged)) -
Better support for selecting one of multiple GPUs on a system programmatically or via environment variables (!93 (merged)) -
Design for an eventual ability to switch backends at runtime---or at least think about it (thought about it: this would require every object to know its backend and have the capability to migrate; let's save this for another version)
Things that aren't code
-
Simple matrix operation benchmarks (see Armadillo PASC presentation) -
Simple logistic regression (some basic benchmarks are already available) (#9 (closed)) -
Simple neural network examples(#10, #11, #12) (we can revisit this later) - The benchmarks above should be done on both nvidia and AMD devices, plus maybe something exotic that supports OpenCL to demonstrate breadth
-
Example usage of mlpack and ensmallen with GPU vs. CPU speedup(we can revisit this later) -
Develop a simple website (borrow from ensmallen or Armadillo presumably) -
Documentation (follow Armadillo style, but maybe write in Markdown, like ensmallen) (!94 (merged))
That's a lot of stuff, but hey, I have a lot of time now. I'll get started shortly, and if anyone has any comments, suggestions, or wants to help out, please feel free!