
\section{Process}

In order to allow the most agility, I followed the ``Release Early. Release Often'' paradigm.  Before implementing any functionality, I would first create a test case that would test it.  After implementing the functionality and making sure that the test case works, I would commit both the changes and corresponding test case.  My first goal, after defining an initial version of Language Reference Manual, was to enable the compilation of a very simple program.  The first step, I thought, was to be able to read and write images.  However, I ran into trouble getting the CamlImages project to compile and run and failed on all of the platforms that I tried (Windows, Cygwin, and Linux).

\section{Style Guide and Naming Conventions}

I used VIM to program in Ocaml and the native setup interfered with my development.  I resorted to installing the extension OMLet created by David Baelde and using its style.  It uses two spaces for indentation.  The only behavior I disliked was when declaring mutually recursive functions it would indent the ``and'' way too much.  In this case, the indentation should be removed or reduced.

There are some naming conventions that I have used.  Indices (which indicates which element in a matrix is being referenced) should be distinquished from dimensions (the declared size of the matrix).  The name ``ind'' is used for a single index and ``indl'' is used to reference a list of indices.  Likewise, ``dim'' and ``diml'' reference a dimension and a list of dimensions.

Functions and variables should be all lower case with ``underlines'' being used for readability.  Functions that produce strings should begin ``string\_of\_''.  Functions that reduce the ambiguity of the type and dimensionality of expressions should begin with ``resolve\_''.

An expression's type and dimensionality should not be resolved until every contained sub-expression is resolved.

\section{Project Timeline}

\begin{tabular}{l l}
March&
\begin{tabular}{l r p{35em}}
Sun &1 & Signed up to googlecode for SVN repository.\\
Wed &4 & First compiling version of parser, scanner, and abstract syntax tree.  Not all functionality implemented.\\
Sat &7 & Started writing up the language reference manual.\\
Tues &10 & Submitted the language reference manual.\\
Tues &24 & Discovered the need for the sizes of the input parameters to be specified and implemented it.\\
Fri &27 & Added syntatically checked AST (sast.mli - although later renamed sast.ml).\\
\end{tabular}\\
April&
\begin{tabular}{l r p{35em}}
Thurs &9 & {\bf{MILESTONE}} first version that compiles a program.  \ref{test:test-scalarcopy} test-scalarcopy works.\\
Fri &10&\ref{test:test-scalaraddf} test-scalaraddf works.\\
Fri &10&\ref{test:test-scalaraddi} test-scalaraddi works.\\
Fri &10&\ref{test:test-scalararithmetic1} test-scalararithmetic1 works.\\
Fri &10&\ref{test:test-scalararithmetic2} test-scalararithmetic2 works.\\
Sat &11&\ref{test:test-copy5a} test-copy5a works.\\
Sat &11&\ref{test:test-flip5a} test-flip5a works and made corresponding change in manual that was required to get this example to work.\\
Sat &11&\ref{test:test-flip5b} test-flip5b works, which uses \lit{size} on input.\\
Sat &18&\ref{test:test-copymat} test-copymat works.\\
Sat &18&\ref{test:test-copymat2} test-copymat2 works.\\
Sat &18&\ref{test:test-afun1} test-afun1 works - tests activation function without any optional function parameters.\\
Sat &18&\ref{test:test-afun2} test-afun2 works - tests activation function with optional parameter being overwritten.\\
Sat &18&\ref{test:test-afun3} test-afun3 works - tests activation function where default value of optional parameter is used.\\
Sat &18&\ref{test:test-copymat2} test-copymat2 works.\\
Sat &18&\ref{test:test-copymat2} test-copymat2 works.\\
Fri &24&\ref{test:test-module1a} test-module1a works - first working module definition test case.\\
Fri &24&\ref{test:fail-module1a1} fail-module1a1 works.\\
Sat &25&\ref{test:test-module1} test-module1 added that tests multidimensional neurons, although there was a bug that I later found and fixed.\\
\end{tabular}\\
May &
\begin{tabular}{l r p{35em}}
Sat &2 & defined the timing of Synapse more clearly and modified the outputs of almost all of the test cases.\\
Sat &2 & stopped trying to fix the functionality to read and write PPM images so that I could focus on core functionality.\\
Mon &4&\ref{test:fail-timing} fail-timing works.\\
Mon &4&\ref{test:test-temporaloffset} test-temporaloffset works.\\
Thurs &7&\ref{test:test-matrixadd} test-matrixadd works.\\
Thurs &7&\ref{test:test-matrixadd2} test-matrixadd2 and \ref{test:test-module1} test-module1 works.\\
Fri & 8 & Freeze on adding functionality to focus on project report and testing.\\
\end{tabular}\\

\end{tabular}

\section{Development Environment}

I used VIM on a Windows CYGWIN environment since Windows is installed on my laptop.  I installed both the Windows and CYGWIN version of OCaml and later deleted the Windows version.  There was a bug in the Windows interface which didn't appear in the console mode.  At one point I tried to install CamlImages, which brought on a lot of headaches and no success.  After this I tried to get everything to work without any additional packages.

I used Subversion through googlecode.com for source control and tracking, since Subversion is emperically better than CVS and anyone who continues to use CVS is stuck living in the dark ages.  The main improvement, in my opinion, is the ability to rename and move files while keeping the file history.  I used the Subversion client TortoiseSVN, one of the few redeeming features of Windows.

\section{Project Log}

\lstset{frame=single,numbers=left,breaklines=true,fancyvrb=true}

\VerbatimInput{ProjectLog.txt}
