From d7e14b19816732d8efe6b586aaa493c2d924124c Mon Sep 17 00:00:00 2001
From: cloudygoose <cloudygooseg@gmail.com>
Date: Thu, 25 Jun 2015 23:50:50 +0800
Subject: [a little big]matrix dim added, now use m:dim() to determine whether
 vector or matrix

---
 Makefile                         |  2 +-
 luajit-2.0                       |  2 +-
 luarocks                         |  2 +-
 nerv/lib/matrix/generic/matrix.c |  2 ++
 nerv/lib/matrix/init.lua         |  7 ++++---
 nerv/lib/matrix/matrix.h         |  1 +
 nerv/matrix/generic/matrix.c     | 11 +++++++++--
 nerv/matrix/init.lua             | 25 +++++++++++++------------
 speech                           |  2 +-
 9 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/Makefile b/Makefile
index cc0c32e..fa888c3 100644
--- a/Makefile
+++ b/Makefile
@@ -11,4 +11,4 @@ install:
 speech:
 	cd speech/htk_io; $(PREFIX)/bin/luarocks make
 clean:
-	rm -r $(CURDIR)/install
+	cd nerv && make clean
diff --git a/luajit-2.0 b/luajit-2.0
index 11106aa..7f454ae 160000
--- a/luajit-2.0
+++ b/luajit-2.0
@@ -1 +1 @@
-Subproject commit 11106aa83374c95f88679452e997229ecedefdcc
+Subproject commit 7f454aed82ef364245ae73a16a04b21e2245e342
diff --git a/luarocks b/luarocks
index a0315b7..028b37f 160000
--- a/luarocks
+++ b/luarocks
@@ -1 +1 @@
-Subproject commit a0315b7bc2432ea517bb90ce39df0cc8b1cd2f65
+Subproject commit 028b37f2376225aa69c946beb44fd7dd68f32604
diff --git a/nerv/lib/matrix/generic/matrix.c b/nerv/lib/matrix/generic/matrix.c
index a64759e..5dbad48 100644
--- a/nerv/lib/matrix/generic/matrix.c
+++ b/nerv/lib/matrix/generic/matrix.c
@@ -24,6 +24,7 @@ Matrix *nerv_matrix_(create)(long nrow, long ncol, Status *status) {
     self->nrow = nrow;
     self->ncol = ncol;
     self->nmax = self->nrow * self->ncol;
+    self->dim = 2;
     MATRIX_DATA_ALLOC(&MATRIX_ELEM_PTR(self), &self->stride,
                      sizeof(MATRIX_ELEM) * self->ncol, self->nrow,
                      status);
@@ -47,6 +48,7 @@ Matrix *nerv_matrix_(getrow)(Matrix *self, int row) {
     Matrix *prow = (Matrix *)malloc(sizeof(Matrix));
     prow->ncol = self->ncol;
     prow->nrow = 1;
+    prow->dim = 1;
     prow->stride = self->stride;
     prow->nmax = prow->ncol;
     MATRIX_ELEM_PTR(prow) = MATRIX_ROW_PTR(self, row);
diff --git a/nerv/lib/matrix/init.lua b/nerv/lib/matrix/init.lua
index 1a8925f..89f89d6 100644
--- a/nerv/lib/matrix/init.lua
+++ b/nerv/lib/matrix/init.lua
@@ -1,6 +1,7 @@
 function nerv.Matrix:__tostring__()
     local ncol = self:ncol()
     local nrow = self:nrow()
+    local dim = self:dim()
     local strt = {}
     local fmt
     if self.fmt then
@@ -8,7 +9,7 @@ function nerv.Matrix:__tostring__()
     else
         fmt = "%.8f "
     end
-    if nrow == 1 then
+    if dim == 1 then
         for col = 0, ncol - 1 do
             table.insert(strt, string.format(fmt, self[col]))
         end
@@ -28,9 +29,9 @@ function nerv.Matrix:__tostring__()
 end
 
 -- gen: a function takes take indices of the matrix and return the generated
--- all entrys in the matrix will be assigned by calling gen(i, j)
+-- all entrys in the matrix will be assigned by calling gen(i, j), if self is a row vector, gen(j) will be called
 function nerv.Matrix:generate(gen)
-    if (self:nrow() == 1) then
+    if (self:dim() == 1) then
         for j = 0, self:ncol() - 1 do
             self[j] = gen(j)
         end
diff --git a/nerv/lib/matrix/matrix.h b/nerv/lib/matrix/matrix.h
index cbf32c2..67a6e30 100644
--- a/nerv/lib/matrix/matrix.h
+++ b/nerv/lib/matrix/matrix.h
@@ -6,6 +6,7 @@
 typedef struct Matrix {
     size_t stride;              /* size of a row */
     long ncol, nrow, nmax;    /* dimension of the matrix */
+    int dim; /* dim == 2 for a matrix, dim == 1 for row vector */
     union {
         float *f;
         double *d;
diff --git a/nerv/matrix/generic/matrix.c b/nerv/matrix/generic/matrix.c
index ff89e54..8efe608 100644
--- a/nerv/matrix/generic/matrix.c
+++ b/nerv/matrix/generic/matrix.c
@@ -31,7 +31,7 @@ static int nerv_matrix_(lua_newindex)(lua_State *L) {
     if (lua_isnumber(L, 2))
     {
         int idx = luaL_checkinteger(L, 2);
-        if (self->nrow == 1)
+        if (self->dim == 1)
         {
             if (idx < 0 || idx >= self->ncol)
                 nerv_error(L, "index must be within range [0, %d)", self->ncol);
@@ -57,7 +57,7 @@ static int nerv_matrix_(lua_index)(lua_State *L) {
     if (lua_isnumber(L, 2))
     {
         int idx = luaL_checkinteger(L, 2);
-        if (self->nrow == 1)
+        if (self->dim == 1)
         {
             if (idx < 0 || idx >= self->ncol)
                 nerv_error(L, "index must be within range [0, %d)", self->ncol);
@@ -86,6 +86,12 @@ static int nerv_matrix_(lua_ncol)(lua_State *L) {
     return 1;
 }
 
+static int nerv_matrix_(lua_dim)(lua_State *L) {
+    Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
+    lua_pushinteger(L, self->dim);
+    return 1;
+}
+
 static int nerv_matrix_(lua_nrow)(lua_State *L) {
     Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
     lua_pushinteger(L, self->nrow);
@@ -103,6 +109,7 @@ static const luaL_Reg nerv_matrix_(methods)[] = {
     {"set_elem", nerv_matrix_(lua_set_elem)},
     {"ncol", nerv_matrix_(lua_ncol)},
     {"nrow", nerv_matrix_(lua_nrow)},
+    {"dim", nerv_matrix_(lua_dim)},
     {"get_dataref_value", nerv_matrix_(lua_get_dataref_value)},
     {"__index__", nerv_matrix_(lua_index)},
     {"__newindex__", nerv_matrix_(lua_newindex)},
diff --git a/nerv/matrix/init.lua b/nerv/matrix/init.lua
index 1a8925f..f230e9f 100644
--- a/nerv/matrix/init.lua
+++ b/nerv/matrix/init.lua
@@ -1,6 +1,7 @@
 function nerv.Matrix:__tostring__()
     local ncol = self:ncol()
     local nrow = self:nrow()
+    local dim = self:dim()
     local strt = {}
     local fmt
     if self.fmt then
@@ -8,12 +9,7 @@ function nerv.Matrix:__tostring__()
     else
         fmt = "%.8f "
     end
-    if nrow == 1 then
-        for col = 0, ncol - 1 do
-            table.insert(strt, string.format(fmt, self[col]))
-        end
-        table.insert(strt, "\n")
-    else
+    if (dim == 2) then
         for row = 0, nrow - 1 do
             local rp = self[row]
             for col = 0, ncol - 1 do
@@ -21,6 +17,11 @@ function nerv.Matrix:__tostring__()
             end
             table.insert(strt, "\n")
         end
+    else
+        for col = 0, ncol - 1 do
+            table.insert(strt, string.format(fmt, self[col]))
+        end
+        table.insert(strt, "\n")
     end
     table.insert(strt, string.format(
         "[%s %d x %d]", self.__typename, nrow, ncol))
@@ -28,19 +29,19 @@ function nerv.Matrix:__tostring__()
 end
 
 -- gen: a function takes take indices of the matrix and return the generated
--- all entrys in the matrix will be assigned by calling gen(i, j)
+-- all entrys in the matrix will be assigned by calling gen(i, j), for a vector, gen(j) will be called.
 function nerv.Matrix:generate(gen)
-    if (self:nrow() == 1) then
-        for j = 0, self:ncol() - 1 do
-            self[j] = gen(j)
-        end
-    else
+    if (self:dim() == 2) then
         for i = 0, self:nrow() - 1 do
             local row = self[i]
             for j = 0, self:ncol() - 1 do
                 row[j] = gen(i, j)
             end
         end
+    else
+        for j = 0, self:ncol() - 1 do
+            self[j] = gen(j) 
+        end
     end
 end
 
diff --git a/speech b/speech
index 32eac09..08e33af 160000
--- a/speech
+++ b/speech
@@ -1 +1 @@
-Subproject commit 32eac093cc431849a92e5a2297c5fe646fd60556
+Subproject commit 08e33afa533af1f026ac271446a0c873fe0bb5cb
-- 
cgit v1.2.3-70-g09d2