commit c9cd7aa: [Minor] Lua_tensor: Add eugen method

Vsevolod Stakhov vsevolod at highsecure.ru
Tue Aug 25 14:49:07 UTC 2020


Author: Vsevolod Stakhov
Date: 2020-08-25 14:01:23 +0100
URL: https://github.com/rspamd/rspamd/commit/c9cd7aa05126042b80ea651699413b11deb9de8f

[Minor] Lua_tensor: Add eugen method

---
 src/lua/lua_tensor.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/src/lua/lua_tensor.c b/src/lua/lua_tensor.c
index 4fcc7e201..d14ec8831 100644
--- a/src/lua/lua_tensor.c
+++ b/src/lua/lua_tensor.c
@@ -35,6 +35,8 @@ LUA_FUNCTION_DEF (tensor, tostring);
 LUA_FUNCTION_DEF (tensor, index);
 LUA_FUNCTION_DEF (tensor, newindex);
 LUA_FUNCTION_DEF (tensor, len);
+LUA_FUNCTION_DEF (tensor, eugen);
+LUA_FUNCTION_DEF (tensor, mean);
 
 static luaL_reg rspamd_tensor_f[] = {
 		LUA_INTERFACE_DEF (tensor, load),
@@ -53,6 +55,8 @@ static luaL_reg rspamd_tensor_m[] = {
 		{"__index", lua_tensor_index},
 		{"__newindex", lua_tensor_newindex},
 		{"__len", lua_tensor_len},
+		LUA_INTERFACE_DEF (tensor, eugen),
+		LUA_INTERFACE_DEF (tensor, mean),
 		{NULL, NULL},
 };
 
@@ -465,10 +469,20 @@ lua_tensor_mul (lua_State *L)
 			return luaL_error (L, "incompatible dimensions %d x %d * %d x %d",
 					dims[0], shadow_dims[1], shadow_dims[0], dims[1]);
 		}
+		else if (shadow_dims[0] == 0) {
+			/* Row * Column -> matrix */
+			shadow_dims[0] = 1;
+			shadow_dims[1] = 1;
+		}
 
 		if (dims[0] == 0) {
 			/* Column */
 			dims[0] = 1;
+
+			if (dims[1] == 0) {
+				/* Column * row -> number */
+				dims[1] = 1;
+			}
 			res = lua_newtensor (L, 2, dims, true, true);
 		}
 		else if (dims[1] == 0) {
@@ -586,6 +600,31 @@ lua_tensor_len (lua_State *L)
 	return nret;
 }
 
+static gint
+lua_tensor_eugen (lua_State *L)
+{
+	struct rspamd_lua_tensor *t = lua_check_tensor (L, 1), *eugen;
+
+	if (t) {
+		if (t->ndims != 2 || t->dim[0] != t->dim[1]) {
+			return luaL_error (L, "expected square matrix NxN but got %dx%d",
+					t->dim[0], t->dim[1]);
+		}
+
+		eugen = lua_newtensor (L, 1, &t->dim[0], true, true);
+
+		if (!kad_ssyev_simple (t->dim[0], t->data, eugen->data)) {
+			lua_pop (L, 1);
+			return luaL_error (L, "kad_ssyev_simple failed (no blas?)");
+		}
+	}
+	else {
+		return luaL_error (L, "invalid arguments");
+	}
+
+	return 1;
+}
+
 static gint
 lua_load_tensor (lua_State * L)
 {


More information about the Commits mailing list