From 23fca430ba741b003883d36c723623ca01e61216 Mon Sep 17 00:00:00 2001
From: Scholivet Manon <manon.scholivet@etu.univ-amu.fr>
Date: Fri, 6 Jul 2018 14:52:43 +0200
Subject: [PATCH] =?UTF-8?q?ajout=20features=20morpho=20(M1-M24),=20r=C3=A9?=
 =?UTF-8?q?solution=20probleme=20pour=20l'ajout=20de=20chaine=20de=20carac?=
 =?UTF-8?q?t=C3=A8re=20longues=20dans=20un=20dico,=20ajout=20d'otpion=20-N?=
 =?UTF-8?q?=20dans=20maca=5Ftm=5Ftrain=20pour=20indiquer=20dans=20quels=20?=
 =?UTF-8?q?fichiers=20=C3=A9crire=20le=20modele=20et=20la=20structure=20du?=
 =?UTF-8?q?=20NN?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 maca_common/include/feat_types.h      |  28 +-
 maca_common/include/mcd.h             |  31 +-
 maca_common/include/word.h            |  27 ++
 maca_common/src/feat_types.c          |  55 ++-
 maca_common/src/hash.c                |   6 +-
 maca_common/src/mcd.c                 |  30 +-
 maca_trans_parser/src/feat_fct.c      | 579 +++++++++++++++++++++++++-
 maca_trans_parser/src/maca_tm_train.c |  15 +-
 8 files changed, 753 insertions(+), 18 deletions(-)

diff --git a/maca_common/include/feat_types.h b/maca_common/include/feat_types.h
index a6673b8..985e44a 100644
--- a/maca_common/include/feat_types.h
+++ b/maca_common/include/feat_types.h
@@ -1,7 +1,7 @@
 #ifndef __FEAT_TYPES__
 #define __FEAT_TYPES__
 
-#define FEAT_TYPE_NB 39
+#define FEAT_TYPE_NB 64
 
 #define FEAT_TYPE_UNKNOWN -1
 #define FEAT_TYPE_INDEX 0
@@ -45,6 +45,32 @@
 #define FEAT_TYPE_SGN 38
 #define FEAT_TYPE_LENGTH 39
 
+#define FEAT_TYPE_M1 40
+#define FEAT_TYPE_M2 41
+#define FEAT_TYPE_M3 42
+#define FEAT_TYPE_M4 43
+#define FEAT_TYPE_M5 44
+#define FEAT_TYPE_M6 45
+#define FEAT_TYPE_M7 46
+#define FEAT_TYPE_M8 47
+#define FEAT_TYPE_M9 48
+#define FEAT_TYPE_M10 49
+#define FEAT_TYPE_M11 50
+#define FEAT_TYPE_M12 51
+#define FEAT_TYPE_M13 52
+#define FEAT_TYPE_M14 53
+#define FEAT_TYPE_M15 54
+#define FEAT_TYPE_M16 55
+#define FEAT_TYPE_M17 56
+#define FEAT_TYPE_M18 57
+#define FEAT_TYPE_M19 58
+#define FEAT_TYPE_M20 59
+#define FEAT_TYPE_M21 60
+#define FEAT_TYPE_M22 61
+#define FEAT_TYPE_M23 62
+#define FEAT_TYPE_M24 63
+
+
 int feat_type_string2int(char *type_name);
 const char *feat_type_int2string(int type);
 #endif
diff --git a/maca_common/include/mcd.h b/maca_common/include/mcd.h
index a86626f..1bb7d83 100644
--- a/maca_common/include/mcd.h
+++ b/maca_common/include/mcd.h
@@ -8,7 +8,7 @@
 
 #define MCD_INVALID_VALUE -1
 
-#define MCD_WF_NB 48
+#define MCD_WF_NB 71
 
 #define MCD_WF_ID 0
 #define MCD_WF_OFFSET 0 /* ID and OFFSET are synonymous */
@@ -61,6 +61,33 @@
 #define MCD_WF_Person 45
 #define MCD_WF_Tense 46
 
+#define MCD_WF_M1 47
+#define MCD_WF_M2 48
+#define MCD_WF_M3 49
+#define MCD_WF_M4 50
+#define MCD_WF_M5 51
+#define MCD_WF_M6 52
+#define MCD_WF_M7 53
+#define MCD_WF_M8 54
+#define MCD_WF_M9 55
+#define MCD_WF_M10 56
+#define MCD_WF_M11 57
+#define MCD_WF_M12 58
+#define MCD_WF_M13 59
+#define MCD_WF_M14 60
+#define MCD_WF_M15 61
+#define MCD_WF_M16 62
+#define MCD_WF_M17 63
+#define MCD_WF_M18 64
+#define MCD_WF_M19 65
+#define MCD_WF_M20 66
+#define MCD_WF_M21 67
+#define MCD_WF_M22 68
+#define MCD_WF_M23 69
+#define MCD_WF_M24 70
+
+
+
 /*Abbr
 AdpType
 AdvType
@@ -170,8 +197,6 @@ Xtra*/
 #define mcd_get_z_col(m)        (m)->wf2col[MCD_WF_Z]
 
 
-
-
 #define mcd_set_form_col(m, v) (m)->wf[MCD_WF_FORM] = (v)
 
 
diff --git a/maca_common/include/word.h b/maca_common/include/word.h
index 81886ae..56df25a 100644
--- a/maca_common/include/word.h
+++ b/maca_common/include/word.h
@@ -94,6 +94,33 @@ typedef struct _word {
 #define word_get_U1(w)             (((w) == NULL) ? -1 : (w)->U1)
 #define word_get_index(w)          (((w) == NULL) ? -1 : (w)->index)
 
+#define word_get_M1(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M1])
+#define word_get_M2(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M2])
+#define word_get_M3(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M3])
+#define word_get_M4(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M4])
+#define word_get_M5(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M5])
+#define word_get_M6(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M6])
+#define word_get_M7(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M7])
+#define word_get_M8(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M8])
+#define word_get_M9(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M9])
+#define word_get_M10(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M10])
+#define word_get_M11(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M11])
+#define word_get_M12(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M12])
+#define word_get_M13(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M13])
+#define word_get_M14(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M14])
+#define word_get_M15(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M15])
+#define word_get_M16(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M16])
+#define word_get_M17(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M17])
+#define word_get_M18(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M18])
+#define word_get_M19(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M19])
+#define word_get_M20(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M20])
+#define word_get_M21(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M21])
+#define word_get_M22(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M22])
+#define word_get_M23(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M23])
+#define word_get_M24(w)              (((w) == NULL) ? -1 : (w)->wf_array[MCD_WF_M24])
+
+
+
 #define word_set_id(w, val)        ((w)->wf_array[MCD_WF_ID] = (val))
 #define word_set_form(w, val)      ((w)->wf_array[MCD_WF_FORM] = (val))
 #define word_set_lemma(w, val)     ((w)->wf_array[MCD_WF_LEMMA] = (val))
diff --git a/maca_common/src/feat_types.c b/maca_common/src/feat_types.c
index d6d39fb..8a2ba16 100644
--- a/maca_common/src/feat_types.c
+++ b/maca_common/src/feat_types.c
@@ -45,6 +45,32 @@ int feat_type_string2int(char *type_name)
   if(!strcmp(type_name, "Y")) return FEAT_TYPE_Y;
   if(!strcmp(type_name, "Z")) return FEAT_TYPE_Z;
   if(!strcmp(type_name, "TRANS")) return FEAT_TYPE_TRANS;
+
+  if(!strcmp(type_name, "M1")) return FEAT_TYPE_M1;
+  if(!strcmp(type_name, "M2")) return FEAT_TYPE_M2;
+  if(!strcmp(type_name, "M3")) return FEAT_TYPE_M3;
+  if(!strcmp(type_name, "M4")) return FEAT_TYPE_M4;
+  if(!strcmp(type_name, "M5")) return FEAT_TYPE_M5;
+  if(!strcmp(type_name, "M6")) return FEAT_TYPE_M6;
+  if(!strcmp(type_name, "M7")) return FEAT_TYPE_M7;
+  if(!strcmp(type_name, "M8")) return FEAT_TYPE_M8;
+  if(!strcmp(type_name, "M9")) return FEAT_TYPE_M9;
+  if(!strcmp(type_name, "M10")) return FEAT_TYPE_M10;
+  if(!strcmp(type_name, "M11")) return FEAT_TYPE_M11;
+  if(!strcmp(type_name, "M12")) return FEAT_TYPE_M12;
+  if(!strcmp(type_name, "M13")) return FEAT_TYPE_M13;
+  if(!strcmp(type_name, "M14")) return FEAT_TYPE_M14;
+  if(!strcmp(type_name, "M15")) return FEAT_TYPE_M15;
+  if(!strcmp(type_name, "M16")) return FEAT_TYPE_M16;
+  if(!strcmp(type_name, "M17")) return FEAT_TYPE_M17;
+  if(!strcmp(type_name, "M18")) return FEAT_TYPE_M18;
+  if(!strcmp(type_name, "M19")) return FEAT_TYPE_M19;
+  if(!strcmp(type_name, "M20")) return FEAT_TYPE_M20;
+  if(!strcmp(type_name, "M21")) return FEAT_TYPE_M21;
+  if(!strcmp(type_name, "M22")) return FEAT_TYPE_M22;
+  if(!strcmp(type_name, "M23")) return FEAT_TYPE_M23;
+  if(!strcmp(type_name, "M24")) return FEAT_TYPE_M24;
+	
   return FEAT_TYPE_UNKNOWN;
 }
 
@@ -91,6 +117,33 @@ const char *feat_type_int2string(int type)
   if(type == FEAT_TYPE_Z)           return "Z";
   if(type == FEAT_TYPE_UNKNOWN)     return "UNKNOWN";
   if(type == FEAT_TYPE_TRANS)       return "TRANS";
-  return "UNKNOWN";
+
+  if(type == FEAT_TYPE_M1) return "M1";
+  if(type == FEAT_TYPE_M2) return "M2";
+  if(type == FEAT_TYPE_M3) return "M3";
+  if(type == FEAT_TYPE_M4) return "M4";
+  if(type == FEAT_TYPE_M5) return "M5";
+  if(type == FEAT_TYPE_M6) return "M6";
+  if(type == FEAT_TYPE_M7) return "M7";
+  if(type == FEAT_TYPE_M8) return "M8";
+  if(type == FEAT_TYPE_M9) return "M9";
+  if(type == FEAT_TYPE_M10) return "M10";
+  if(type == FEAT_TYPE_M11) return "M11";
+  if(type == FEAT_TYPE_M12) return "M12";
+  if(type == FEAT_TYPE_M13) return "M13";
+  if(type == FEAT_TYPE_M14) return "M14";
+  if(type == FEAT_TYPE_M15) return "M15";
+  if(type == FEAT_TYPE_M16) return "M16";
+  if(type == FEAT_TYPE_M17) return "M17";
+  if(type == FEAT_TYPE_M18) return "M18";
+  if(type == FEAT_TYPE_M19) return "M19";
+  if(type == FEAT_TYPE_M20) return "M20";
+  if(type == FEAT_TYPE_M21) return "M21";
+  if(type == FEAT_TYPE_M22) return "M22";
+  if(type == FEAT_TYPE_M23) return "M23";
+  if(type == FEAT_TYPE_M24) return "M24";
+
+
+	return "UNKNOWN";
 }
 
diff --git a/maca_common/src/hash.c b/maca_common/src/hash.c
index cfbc7a5..b67b437 100644
--- a/maca_common/src/hash.c
+++ b/maca_common/src/hash.c
@@ -48,7 +48,7 @@ int hash_func(char *key, int size)
   int i;
   int l = strlen(key);
   int val = key[0];
-  for(i=1; i < l; i++)
+  for(i=1; i < l && i < 200; i++) // When hashing a key too long, keep only the 200th first char to avoid negative val
     val = val + i *i * abs(key[i]);
   return val % size;
 }
@@ -59,7 +59,9 @@ cell *hash_lookup(hash *h, char *key)
   cell *c;
   if(key == NULL) return NULL;
   index = hash_func(key, h->size);
-  for(c=h->array[index]; c; c = c->next)
+  for(c=h->array[index];
+c; 
+c = c->next)
     if(!strcmp(key, c->key))
       return c;
   return NULL;
diff --git a/maca_common/src/mcd.c b/maca_common/src/mcd.c
index a726143..280c2bb 100644
--- a/maca_common/src/mcd.c
+++ b/maca_common/src/mcd.c
@@ -558,7 +558,35 @@ int mcd_wf_code(char *wf)
   if(!strcmp(wf, "X")) return MCD_WF_X;
   if(!strcmp(wf, "Y")) return MCD_WF_Y;
   if(!strcmp(wf, "Z")) return MCD_WF_Z;
-  return -1;
+
+  if(!strcmp(wf, "M1")) return MCD_WF_M1;
+  if(!strcmp(wf, "M2")) return MCD_WF_M2;
+  if(!strcmp(wf, "M3")) return MCD_WF_M3;
+  if(!strcmp(wf, "M4")) return MCD_WF_M4;
+  if(!strcmp(wf, "M5")) return MCD_WF_M5;
+  if(!strcmp(wf, "M6")) return MCD_WF_M6;
+  if(!strcmp(wf, "M7")) return MCD_WF_M7;
+  if(!strcmp(wf, "M8")) return MCD_WF_M8;
+  if(!strcmp(wf, "M9")) return MCD_WF_M9;
+  if(!strcmp(wf, "M10")) return MCD_WF_M10;
+  if(!strcmp(wf, "M11")) return MCD_WF_M11;
+  if(!strcmp(wf, "M12")) return MCD_WF_M12;
+  if(!strcmp(wf, "M13")) return MCD_WF_M13;
+  if(!strcmp(wf, "M14")) return MCD_WF_M14;
+  if(!strcmp(wf, "M15")) return MCD_WF_M15;
+  if(!strcmp(wf, "M16")) return MCD_WF_M16;
+  if(!strcmp(wf, "M17")) return MCD_WF_M17;
+  if(!strcmp(wf, "M18")) return MCD_WF_M18;
+  if(!strcmp(wf, "M19")) return MCD_WF_M19;
+  if(!strcmp(wf, "M20")) return MCD_WF_M20;
+  if(!strcmp(wf, "M21")) return MCD_WF_M21;
+  if(!strcmp(wf, "M22")) return MCD_WF_M22;
+  if(!strcmp(wf, "M23")) return MCD_WF_M23;
+  if(!strcmp(wf, "M24")) return MCD_WF_M24;
+
+	
+
+	return -1;
 }
 
 
diff --git a/maca_trans_parser/src/feat_fct.c b/maca_trans_parser/src/feat_fct.c
index 7a45156..efc4c13 100644
--- a/maca_trans_parser/src/feat_fct.c
+++ b/maca_trans_parser/src/feat_fct.c
@@ -48,6 +48,33 @@ int s0X(void *c) {return word_get_X(stack_s0(config_get_stack((config *) c)));}
 int s0Y(void *c) {return word_get_Y(stack_s0(config_get_stack((config *) c)));}
 int s0Z(void *c) {return word_get_Z(stack_s0(config_get_stack((config *) c)));}
 
+int s0M1(void *c) {return word_get_M1(stack_s0(config_get_stack((config *) c)));}
+int s0M2(void *c) {return word_get_M2(stack_s0(config_get_stack((config *) c)));}
+int s0M3(void *c) {return word_get_M3(stack_s0(config_get_stack((config *) c)));}
+int s0M4(void *c) {return word_get_M4(stack_s0(config_get_stack((config *) c)));}
+int s0M5(void *c) {return word_get_M5(stack_s0(config_get_stack((config *) c)));}
+int s0M6(void *c) {return word_get_M6(stack_s0(config_get_stack((config *) c)));}
+int s0M7(void *c) {return word_get_M7(stack_s0(config_get_stack((config *) c)));}
+int s0M8(void *c) {return word_get_M8(stack_s0(config_get_stack((config *) c)));}
+int s0M9(void *c) {return word_get_M9(stack_s0(config_get_stack((config *) c)));}
+int s0M10(void *c) {return word_get_M10(stack_s0(config_get_stack((config *) c)));}
+int s0M11(void *c) {return word_get_M11(stack_s0(config_get_stack((config *) c)));}
+int s0M12(void *c) {return word_get_M12(stack_s0(config_get_stack((config *) c)));}
+int s0M13(void *c) {return word_get_M13(stack_s0(config_get_stack((config *) c)));}
+int s0M14(void *c) {return word_get_M14(stack_s0(config_get_stack((config *) c)));}
+int s0M15(void *c) {return word_get_M15(stack_s0(config_get_stack((config *) c)));}
+int s0M16(void *c) {return word_get_M16(stack_s0(config_get_stack((config *) c)));}
+int s0M17(void *c) {return word_get_M17(stack_s0(config_get_stack((config *) c)));}
+int s0M18(void *c) {return word_get_M18(stack_s0(config_get_stack((config *) c)));}
+int s0M19(void *c) {return word_get_M19(stack_s0(config_get_stack((config *) c)));}
+int s0M20(void *c) {return word_get_M20(stack_s0(config_get_stack((config *) c)));}
+int s0M21(void *c) {return word_get_M21(stack_s0(config_get_stack((config *) c)));}
+int s0M22(void *c) {return word_get_M22(stack_s0(config_get_stack((config *) c)));}
+int s0M23(void *c) {return word_get_M23(stack_s0(config_get_stack((config *) c)));}
+int s0M24(void *c) {return word_get_M24(stack_s0(config_get_stack((config *) c)));}
+
+
+
 int s0U1(void *c) {return word_get_U1(stack_s0(config_get_stack((config *) c)));}
 int s0sgn(void *c) {return word_get_signature(stack_s0(config_get_stack((config *) c)));}
 
@@ -87,6 +114,33 @@ int s1X(void *c) {return word_get_X(stack_s1(config_get_stack((config *) c)));}
 int s1Y(void *c) {return word_get_Y(stack_s1(config_get_stack((config *) c)));}
 int s1Z(void *c) {return word_get_Z(stack_s1(config_get_stack((config *) c)));}
 
+int s1M1(void *c) {return word_get_M1(stack_s1(config_get_stack((config *) c)));}
+int s1M2(void *c) {return word_get_M2(stack_s1(config_get_stack((config *) c)));}
+int s1M3(void *c) {return word_get_M3(stack_s1(config_get_stack((config *) c)));}
+int s1M4(void *c) {return word_get_M4(stack_s1(config_get_stack((config *) c)));}
+int s1M5(void *c) {return word_get_M5(stack_s1(config_get_stack((config *) c)));}
+int s1M6(void *c) {return word_get_M6(stack_s1(config_get_stack((config *) c)));}
+int s1M7(void *c) {return word_get_M7(stack_s1(config_get_stack((config *) c)));}
+int s1M8(void *c) {return word_get_M8(stack_s1(config_get_stack((config *) c)));}
+int s1M9(void *c) {return word_get_M9(stack_s1(config_get_stack((config *) c)));}
+int s1M10(void *c) {return word_get_M10(stack_s1(config_get_stack((config *) c)));}
+int s1M11(void *c) {return word_get_M11(stack_s1(config_get_stack((config *) c)));}
+int s1M12(void *c) {return word_get_M12(stack_s1(config_get_stack((config *) c)));}
+int s1M13(void *c) {return word_get_M13(stack_s1(config_get_stack((config *) c)));}
+int s1M14(void *c) {return word_get_M14(stack_s1(config_get_stack((config *) c)));}
+int s1M15(void *c) {return word_get_M15(stack_s1(config_get_stack((config *) c)));}
+int s1M16(void *c) {return word_get_M16(stack_s1(config_get_stack((config *) c)));}
+int s1M17(void *c) {return word_get_M17(stack_s1(config_get_stack((config *) c)));}
+int s1M18(void *c) {return word_get_M18(stack_s1(config_get_stack((config *) c)));}
+int s1M19(void *c) {return word_get_M19(stack_s1(config_get_stack((config *) c)));}
+int s1M20(void *c) {return word_get_M20(stack_s1(config_get_stack((config *) c)));}
+int s1M21(void *c) {return word_get_M21(stack_s1(config_get_stack((config *) c)));}
+int s1M22(void *c) {return word_get_M22(stack_s1(config_get_stack((config *) c)));}
+int s1M23(void *c) {return word_get_M23(stack_s1(config_get_stack((config *) c)));}
+int s1M24(void *c) {return word_get_M24(stack_s1(config_get_stack((config *) c)));}
+
+
+
 int s2g(void *c)  {return (word_get_gov(stack_s2(config_get_stack((config *) c))) == WORD_INVALID_GOV) ? 0 : 1;}
 int s2sf(void *c) {return word_get_label(stack_s2(config_get_stack((config *) c)));}
 
@@ -123,6 +177,31 @@ int s2X(void *c) {return word_get_X(stack_s2(config_get_stack((config *) c)));}
 int s2Y(void *c) {return word_get_Y(stack_s2(config_get_stack((config *) c)));}
 int s2Z(void *c) {return word_get_Z(stack_s2(config_get_stack((config *) c)));}
 
+int s2M1(void *c) {return word_get_M1(stack_s2(config_get_stack((config *) c)));}
+int s2M2(void *c) {return word_get_M2(stack_s2(config_get_stack((config *) c)));}
+int s2M3(void *c) {return word_get_M3(stack_s2(config_get_stack((config *) c)));}
+int s2M4(void *c) {return word_get_M4(stack_s2(config_get_stack((config *) c)));}
+int s2M5(void *c) {return word_get_M5(stack_s2(config_get_stack((config *) c)));}
+int s2M6(void *c) {return word_get_M6(stack_s2(config_get_stack((config *) c)));}
+int s2M7(void *c) {return word_get_M7(stack_s2(config_get_stack((config *) c)));}
+int s2M8(void *c) {return word_get_M8(stack_s2(config_get_stack((config *) c)));}
+int s2M9(void *c) {return word_get_M9(stack_s2(config_get_stack((config *) c)));}
+int s2M10(void *c) {return word_get_M10(stack_s2(config_get_stack((config *) c)));}
+int s2M11(void *c) {return word_get_M11(stack_s2(config_get_stack((config *) c)));}
+int s2M12(void *c) {return word_get_M12(stack_s2(config_get_stack((config *) c)));}
+int s2M13(void *c) {return word_get_M13(stack_s2(config_get_stack((config *) c)));}
+int s2M14(void *c) {return word_get_M14(stack_s2(config_get_stack((config *) c)));}
+int s2M15(void *c) {return word_get_M15(stack_s2(config_get_stack((config *) c)));}
+int s2M16(void *c) {return word_get_M16(stack_s2(config_get_stack((config *) c)));}
+int s2M17(void *c) {return word_get_M17(stack_s2(config_get_stack((config *) c)));}
+int s2M18(void *c) {return word_get_M18(stack_s2(config_get_stack((config *) c)));}
+int s2M19(void *c) {return word_get_M19(stack_s2(config_get_stack((config *) c)));}
+int s2M20(void *c) {return word_get_M20(stack_s2(config_get_stack((config *) c)));}
+int s2M21(void *c) {return word_get_M21(stack_s2(config_get_stack((config *) c)));}
+int s2M22(void *c) {return word_get_M22(stack_s2(config_get_stack((config *) c)));}
+int s2M23(void *c) {return word_get_M23(stack_s2(config_get_stack((config *) c)));}
+int s2M24(void *c) {return word_get_M24(stack_s2(config_get_stack((config *) c)));}
+
 int s3f(void *c) {return word_get_form(stack_s3(config_get_stack((config *) c)));}
 int s3l(void *c) {return word_get_lemma(stack_s3(config_get_stack((config *) c)));}
 int s3c(void *c) {return word_get_cpos(stack_s3(config_get_stack((config *) c)));}
@@ -156,6 +235,32 @@ int s3X(void *c) {return word_get_X(stack_s3(config_get_stack((config *) c)));}
 int s3Y(void *c) {return word_get_Y(stack_s3(config_get_stack((config *) c)));}
 int s3Z(void *c) {return word_get_Z(stack_s3(config_get_stack((config *) c)));}
 
+int s3M1(void *c) {return word_get_M1(stack_s3(config_get_stack((config *) c)));}
+int s3M2(void *c) {return word_get_M2(stack_s3(config_get_stack((config *) c)));}
+int s3M3(void *c) {return word_get_M3(stack_s3(config_get_stack((config *) c)));}
+int s3M4(void *c) {return word_get_M4(stack_s3(config_get_stack((config *) c)));}
+int s3M5(void *c) {return word_get_M5(stack_s3(config_get_stack((config *) c)));}
+int s3M6(void *c) {return word_get_M6(stack_s3(config_get_stack((config *) c)));}
+int s3M7(void *c) {return word_get_M7(stack_s3(config_get_stack((config *) c)));}
+int s3M8(void *c) {return word_get_M8(stack_s3(config_get_stack((config *) c)));}
+int s3M9(void *c) {return word_get_M9(stack_s3(config_get_stack((config *) c)));}
+int s3M10(void *c) {return word_get_M10(stack_s3(config_get_stack((config *) c)));}
+int s3M11(void *c) {return word_get_M11(stack_s3(config_get_stack((config *) c)));}
+int s3M12(void *c) {return word_get_M12(stack_s3(config_get_stack((config *) c)));}
+int s3M13(void *c) {return word_get_M13(stack_s3(config_get_stack((config *) c)));}
+int s3M14(void *c) {return word_get_M14(stack_s3(config_get_stack((config *) c)));}
+int s3M15(void *c) {return word_get_M15(stack_s3(config_get_stack((config *) c)));}
+int s3M16(void *c) {return word_get_M16(stack_s3(config_get_stack((config *) c)));}
+int s3M17(void *c) {return word_get_M17(stack_s3(config_get_stack((config *) c)));}
+int s3M18(void *c) {return word_get_M18(stack_s3(config_get_stack((config *) c)));}
+int s3M19(void *c) {return word_get_M19(stack_s3(config_get_stack((config *) c)));}
+int s3M20(void *c) {return word_get_M20(stack_s3(config_get_stack((config *) c)));}
+int s3M21(void *c) {return word_get_M21(stack_s3(config_get_stack((config *) c)));}
+int s3M22(void *c) {return word_get_M22(stack_s3(config_get_stack((config *) c)));}
+int s3M23(void *c) {return word_get_M23(stack_s3(config_get_stack((config *) c)));}
+int s3M24(void *c) {return word_get_M24(stack_s3(config_get_stack((config *) c)));}
+
+
 /* words in the buffer */
 
 int b0s1(void *c){return word_get_s1(word_buffer_b0(config_get_buffer((config *) c)));}
@@ -220,6 +325,31 @@ int b0Z(void *c) {return word_get_Z(word_buffer_b0(config_get_buffer((config *)
 int b0U1(void *c) {return word_get_U1(word_buffer_b0(config_get_buffer((config *) c)));}
 int b0sgn(void *c) {return word_get_signature(word_buffer_b0(config_get_buffer((config *) c)));}
 
+int b0M1(void *c) {return word_get_M1(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M2(void *c) {return word_get_M2(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M3(void *c) {return word_get_M3(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M4(void *c) {return word_get_M4(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M5(void *c) {return word_get_M5(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M6(void *c) {return word_get_M6(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M7(void *c) {return word_get_M7(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M8(void *c) {return word_get_M8(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M9(void *c) {return word_get_M9(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M10(void *c) {return word_get_M10(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M11(void *c) {return word_get_M11(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M12(void *c) {return word_get_M12(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M13(void *c) {return word_get_M13(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M14(void *c) {return word_get_M14(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M15(void *c) {return word_get_M15(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M16(void *c) {return word_get_M16(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M17(void *c) {return word_get_M17(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M18(void *c) {return word_get_M18(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M19(void *c) {return word_get_M19(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M20(void *c) {return word_get_M20(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M21(void *c) {return word_get_M21(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M22(void *c) {return word_get_M22(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M23(void *c) {return word_get_M23(word_buffer_b0(config_get_buffer((config *) c)));}
+int b0M24(void *c) {return word_get_M24(word_buffer_b0(config_get_buffer((config *) c)));}
+
 int b1f(void *c) {return word_get_form(word_buffer_b1(config_get_buffer((config *) c)));}
 int b1l(void *c) {return word_get_lemma(word_buffer_b1(config_get_buffer((config *) c)));}
 int b1c(void *c) {return word_get_cpos(word_buffer_b1(config_get_buffer((config *) c)));}
@@ -256,6 +386,31 @@ int b1Z(void *c) {return word_get_Z(word_buffer_b1(config_get_buffer((config *)
 int b1U1(void *c) {return word_get_U1(word_buffer_b1(config_get_buffer((config *) c)));}
 int b1sgn(void *c) {return word_get_signature(word_buffer_b1(config_get_buffer((config *) c)));}
 
+int b1M1(void *c) {return word_get_M1(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M2(void *c) {return word_get_M2(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M3(void *c) {return word_get_M3(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M4(void *c) {return word_get_M4(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M5(void *c) {return word_get_M5(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M6(void *c) {return word_get_M6(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M7(void *c) {return word_get_M7(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M8(void *c) {return word_get_M8(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M9(void *c) {return word_get_M9(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M10(void *c) {return word_get_M10(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M11(void *c) {return word_get_M11(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M12(void *c) {return word_get_M12(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M13(void *c) {return word_get_M13(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M14(void *c) {return word_get_M14(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M15(void *c) {return word_get_M15(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M16(void *c) {return word_get_M16(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M17(void *c) {return word_get_M17(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M18(void *c) {return word_get_M18(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M19(void *c) {return word_get_M19(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M20(void *c) {return word_get_M20(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M21(void *c) {return word_get_M21(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M22(void *c) {return word_get_M22(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M23(void *c) {return word_get_M23(word_buffer_b1(config_get_buffer((config *) c)));}
+int b1M24(void *c) {return word_get_M24(word_buffer_b1(config_get_buffer((config *) c)));}
+
 int b2f(void *c) {return word_get_form(word_buffer_b2(config_get_buffer((config *) c)));}
 int b2l(void *c) {return word_get_lemma(word_buffer_b2(config_get_buffer((config *) c)));}
 int b2c(void *c) {return word_get_cpos(word_buffer_b2(config_get_buffer((config *) c)));}
@@ -292,7 +447,30 @@ int b2Z(void *c) {return word_get_Z(word_buffer_b2(config_get_buffer((config *)
 int b2U1(void *c) {return word_get_U1(word_buffer_b2(config_get_buffer((config *) c)));}
 int b2sgn(void *c) {return word_get_signature(word_buffer_b2(config_get_buffer((config *) c)));}
 
-
+int b2M1(void *c) {return word_get_M1(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M2(void *c) {return word_get_M2(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M3(void *c) {return word_get_M3(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M4(void *c) {return word_get_M4(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M5(void *c) {return word_get_M5(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M6(void *c) {return word_get_M6(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M7(void *c) {return word_get_M7(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M8(void *c) {return word_get_M8(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M9(void *c) {return word_get_M9(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M10(void *c) {return word_get_M10(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M11(void *c) {return word_get_M11(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M12(void *c) {return word_get_M12(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M13(void *c) {return word_get_M13(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M14(void *c) {return word_get_M14(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M15(void *c) {return word_get_M15(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M16(void *c) {return word_get_M16(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M17(void *c) {return word_get_M17(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M18(void *c) {return word_get_M18(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M19(void *c) {return word_get_M19(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M20(void *c) {return word_get_M20(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M21(void *c) {return word_get_M21(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M22(void *c) {return word_get_M22(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M23(void *c) {return word_get_M23(word_buffer_b2(config_get_buffer((config *) c)));}
+int b2M24(void *c) {return word_get_M24(word_buffer_b2(config_get_buffer((config *) c)));}
 
 int b3f(void *c) {return word_get_form(word_buffer_b3(config_get_buffer((config *) c)));}
 int b3l(void *c) {return word_get_lemma(word_buffer_b3(config_get_buffer((config *) c)));}
@@ -327,6 +505,33 @@ int b3X(void *c) {return word_get_X(word_buffer_b3(config_get_buffer((config *)
 int b3Y(void *c) {return word_get_Y(word_buffer_b3(config_get_buffer((config *) c)));}
 int b3Z(void *c) {return word_get_Z(word_buffer_b3(config_get_buffer((config *) c)));}
 
+int b3M1(void *c) {return word_get_M1(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M2(void *c) {return word_get_M2(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M3(void *c) {return word_get_M3(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M4(void *c) {return word_get_M4(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M5(void *c) {return word_get_M5(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M6(void *c) {return word_get_M6(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M7(void *c) {return word_get_M7(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M8(void *c) {return word_get_M8(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M9(void *c) {return word_get_M9(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M10(void *c) {return word_get_M10(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M11(void *c) {return word_get_M11(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M12(void *c) {return word_get_M12(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M13(void *c) {return word_get_M13(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M14(void *c) {return word_get_M14(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M15(void *c) {return word_get_M15(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M16(void *c) {return word_get_M16(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M17(void *c) {return word_get_M17(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M18(void *c) {return word_get_M18(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M19(void *c) {return word_get_M19(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M20(void *c) {return word_get_M20(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M21(void *c) {return word_get_M21(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M22(void *c) {return word_get_M22(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M23(void *c) {return word_get_M23(word_buffer_b3(config_get_buffer((config *) c)));}
+int b3M24(void *c) {return word_get_M24(word_buffer_b3(config_get_buffer((config *) c)));}
+
+
+
 int bm1f(void *c) {return word_get_form(word_buffer_bm1(config_get_buffer((config *) c)));}
 int bm1l(void *c) {return word_get_lemma(word_buffer_bm1(config_get_buffer((config *) c)));}
 int bm1c(void *c) {return word_get_cpos(word_buffer_bm1(config_get_buffer((config *) c)));}
@@ -366,6 +571,31 @@ int bm1Z(void *c) {return word_get_Z(word_buffer_bm1(config_get_buffer((config *
 int bm1U1(void *c) {return word_get_U1(word_buffer_bm1(config_get_buffer((config *) c)));}
 int bm1sgn(void *c) {return word_get_signature(word_buffer_bm1(config_get_buffer((config *) c)));}
 
+int bm1M1(void *c) {return word_get_M1(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M2(void *c) {return word_get_M2(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M3(void *c) {return word_get_M3(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M4(void *c) {return word_get_M4(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M5(void *c) {return word_get_M5(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M6(void *c) {return word_get_M6(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M7(void *c) {return word_get_M7(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M8(void *c) {return word_get_M8(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M9(void *c) {return word_get_M9(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M10(void *c) {return word_get_M10(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M11(void *c) {return word_get_M11(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M12(void *c) {return word_get_M12(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M13(void *c) {return word_get_M13(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M14(void *c) {return word_get_M14(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M15(void *c) {return word_get_M15(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M16(void *c) {return word_get_M16(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M17(void *c) {return word_get_M17(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M18(void *c) {return word_get_M18(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M19(void *c) {return word_get_M19(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M20(void *c) {return word_get_M20(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M21(void *c) {return word_get_M21(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M22(void *c) {return word_get_M22(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M23(void *c) {return word_get_M23(word_buffer_bm1(config_get_buffer((config *) c)));}
+int bm1M24(void *c) {return word_get_M24(word_buffer_bm1(config_get_buffer((config *) c)));}
+
 int bm2f(void *c) {return word_get_form(word_buffer_bm2(config_get_buffer((config *) c)));}
 int bm2l(void *c) {return word_get_lemma(word_buffer_bm2(config_get_buffer((config *) c)));}
 int bm2c(void *c) {return word_get_cpos(word_buffer_bm2(config_get_buffer((config *) c)));}
@@ -399,6 +629,33 @@ int bm2X(void *c) {return word_get_X(word_buffer_bm2(config_get_buffer((config *
 int bm2Y(void *c) {return word_get_Y(word_buffer_bm2(config_get_buffer((config *) c)));}
 int bm2Z(void *c) {return word_get_Z(word_buffer_bm2(config_get_buffer((config *) c)));}
 
+int bm2M1(void *c) {return word_get_M1(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M2(void *c) {return word_get_M2(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M3(void *c) {return word_get_M3(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M4(void *c) {return word_get_M4(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M5(void *c) {return word_get_M5(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M6(void *c) {return word_get_M6(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M7(void *c) {return word_get_M7(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M8(void *c) {return word_get_M8(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M9(void *c) {return word_get_M9(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M10(void *c) {return word_get_M10(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M11(void *c) {return word_get_M11(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M12(void *c) {return word_get_M12(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M13(void *c) {return word_get_M13(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M14(void *c) {return word_get_M14(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M15(void *c) {return word_get_M15(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M16(void *c) {return word_get_M16(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M17(void *c) {return word_get_M17(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M18(void *c) {return word_get_M18(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M19(void *c) {return word_get_M19(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M20(void *c) {return word_get_M20(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M21(void *c) {return word_get_M21(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M22(void *c) {return word_get_M22(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M23(void *c) {return word_get_M23(word_buffer_bm2(config_get_buffer((config *) c)));}
+int bm2M24(void *c) {return word_get_M24(word_buffer_bm2(config_get_buffer((config *) c)));}
+
+
+
 int bm3f(void *c) {return word_get_form(word_buffer_bm3(config_get_buffer((config *) c)));}
 int bm3l(void *c) {return word_get_lemma(word_buffer_bm3(config_get_buffer((config *) c)));}
 int bm3c(void *c) {return word_get_cpos(word_buffer_bm3(config_get_buffer((config *) c)));}
@@ -432,6 +689,33 @@ int bm3X(void *c) {return word_get_X(word_buffer_bm3(config_get_buffer((config *
 int bm3Y(void *c) {return word_get_Y(word_buffer_bm3(config_get_buffer((config *) c)));}
 int bm3Z(void *c) {return word_get_Z(word_buffer_bm3(config_get_buffer((config *) c)));}
 
+int bm3M1(void *c) {return word_get_M1(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M2(void *c) {return word_get_M2(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M3(void *c) {return word_get_M3(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M4(void *c) {return word_get_M4(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M5(void *c) {return word_get_M5(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M6(void *c) {return word_get_M6(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M7(void *c) {return word_get_M7(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M8(void *c) {return word_get_M8(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M9(void *c) {return word_get_M9(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M10(void *c) {return word_get_M10(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M11(void *c) {return word_get_M11(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M12(void *c) {return word_get_M12(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M13(void *c) {return word_get_M13(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M14(void *c) {return word_get_M14(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M15(void *c) {return word_get_M15(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M16(void *c) {return word_get_M16(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M17(void *c) {return word_get_M17(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M18(void *c) {return word_get_M18(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M19(void *c) {return word_get_M19(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M20(void *c) {return word_get_M20(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M21(void *c) {return word_get_M21(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M22(void *c) {return word_get_M22(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M23(void *c) {return word_get_M23(word_buffer_bm3(config_get_buffer((config *) c)));}
+int bm3M24(void *c) {return word_get_M24(word_buffer_bm3(config_get_buffer((config *) c)));}
+
+
+
 /* structural features */
 
 int ldep_s0r(void *input){
@@ -918,7 +1202,34 @@ feat_lib *feat_lib_build(void)
   /* feat_lib_add(fl, FEAT_TYPE_INT_3, (char *)"s0U1", s0U1); */
   feat_lib_add(fl, FEAT_TYPE_INT, (char *)"s0U1", s0U1);
   feat_lib_add(fl, FEAT_TYPE_SGN,   (char *)"s0sgn", s0sgn);
-  
+
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"s0M1", s0M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"s0M2", s0M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"s0M3", s0M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"s0M4", s0M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"s0M5", s0M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"s0M6", s0M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"s0M7", s0M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"s0M8", s0M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"s0M9", s0M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"s0M10", s0M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"s0M11", s0M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"s0M12", s0M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"s0M13", s0M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"s0M14", s0M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"s0M15", s0M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"s0M16", s0M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"s0M17", s0M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"s0M18", s0M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"s0M19", s0M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"s0M20", s0M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"s0M21", s0M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"s0M22", s0M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s0M23", s0M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s0M24", s0M24);
+
+
+	
   feat_lib_add(fl, FEAT_TYPE_INT,  (char *)"s1g", s1g);
   feat_lib_add(fl, FEAT_TYPE_LABEL,  (char *)"s1sf", s1sf);
 
@@ -955,7 +1266,34 @@ feat_lib *feat_lib_build(void)
   feat_lib_add(fl, FEAT_TYPE_X,     (char *)"s1X", s1X);
   feat_lib_add(fl, FEAT_TYPE_Y,     (char *)"s1Y", s1Y);
   feat_lib_add(fl, FEAT_TYPE_Z,     (char *)"s1Z", s1Z);
-  
+
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"s1M1", s1M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"s1M2", s1M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"s1M3", s1M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"s1M4", s1M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"s1M5", s1M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"s1M6", s1M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"s1M7", s1M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"s1M8", s1M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"s1M9", s1M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"s1M10", s1M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"s1M11", s1M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"s1M12", s1M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"s1M13", s1M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"s1M14", s1M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"s1M15", s1M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"s1M16", s1M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"s1M17", s1M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"s1M18", s1M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"s1M19", s1M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"s1M20", s1M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"s1M21", s1M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"s1M22", s1M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s1M23", s1M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s1M24", s1M24);
+
+
+	
   feat_lib_add(fl, FEAT_TYPE_LABEL,  (char *)"s2sf", s2sf);
   feat_lib_add(fl, FEAT_TYPE_INT,    (char *)"s2g", s2g);
   
@@ -993,6 +1331,31 @@ feat_lib *feat_lib_build(void)
   feat_lib_add(fl, FEAT_TYPE_Y,     (char *)"s2Y", s2Y);
   feat_lib_add(fl, FEAT_TYPE_Y,     (char *)"s2Z", s2Z);
   
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"s2M1", s2M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"s2M2", s2M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"s2M3", s2M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"s2M4", s2M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"s2M5", s2M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"s2M6", s2M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"s2M7", s2M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"s2M8", s2M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"s2M9", s2M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"s2M10", s2M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"s2M11", s2M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"s2M12", s2M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"s2M13", s2M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"s2M14", s2M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"s2M15", s2M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"s2M16", s2M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"s2M17", s2M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"s2M18", s2M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"s2M19", s2M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"s2M20", s2M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"s2M21", s2M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"s2M22", s2M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s2M23", s2M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s2M24", s2M24);
+
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"s3f", s3f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"s3l", s3l);
   feat_lib_add(fl, FEAT_TYPE_CPOS,  (char *)"s3c", s3c);
@@ -1027,6 +1390,32 @@ feat_lib *feat_lib_build(void)
   feat_lib_add(fl, FEAT_TYPE_Y,     (char *)"s3Y", s3Y);
   feat_lib_add(fl, FEAT_TYPE_Y,     (char *)"s3Z", s3Z);
 
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"s3M1", s3M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"s3M2", s3M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"s3M3", s3M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"s3M4", s3M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"s3M5", s3M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"s3M6", s3M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"s3M7", s3M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"s3M8", s3M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"s3M9", s3M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"s3M10", s3M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"s3M11", s3M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"s3M12", s3M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"s3M13", s3M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"s3M14", s3M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"s3M15", s3M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"s3M16", s3M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"s3M17", s3M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"s3M18", s3M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"s3M19", s3M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"s3M20", s3M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"s3M21", s3M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"s3M22", s3M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s3M23", s3M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"s3M24", s3M24);
+
+	
   feat_lib_add(fl, FEAT_TYPE_INT,  (char *)"b0g", b0g);
   feat_lib_add(fl, FEAT_TYPE_LABEL,  (char *)"b0sf", b0sf);
 
@@ -1083,7 +1472,31 @@ feat_lib *feat_lib_build(void)
   feat_lib_add(fl, FEAT_TYPE_LETTER,   (char *)"b0p5", b0p5);
   feat_lib_add(fl, FEAT_TYPE_LETTER,   (char *)"b0p6", b0p6);
 
-  
+  	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"b0M1", b0M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"b0M2", b0M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"b0M3", b0M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"b0M4", b0M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"b0M5", b0M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"b0M6", b0M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"b0M7", b0M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"b0M8", b0M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"b0M9", b0M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"b0M10", b0M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"b0M11", b0M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"b0M12", b0M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"b0M13", b0M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"b0M14", b0M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"b0M15", b0M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"b0M16", b0M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"b0M17", b0M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"b0M18", b0M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"b0M19", b0M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"b0M20", b0M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"b0M21", b0M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"b0M22", b0M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b0M23", b0M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b0M24", b0M24);
+
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"bm1f", bm1f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"bm1l", bm1l);
   feat_lib_add(fl, FEAT_TYPE_CPOS,  (char *)"bm1c", bm1c);
@@ -1121,6 +1534,31 @@ feat_lib *feat_lib_build(void)
   feat_lib_add(fl, FEAT_TYPE_INT,     (char *)"bm1U1", bm1U1);
   feat_lib_add(fl, FEAT_TYPE_SGN,     (char *)"bm1sgn", bm1sgn);
 
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"bm1M1", bm1M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"bm1M2", bm1M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"bm1M3", bm1M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"bm1M4", bm1M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"bm1M5", bm1M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"bm1M6", bm1M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"bm1M7", bm1M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"bm1M8", bm1M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"bm1M9", bm1M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"bm1M10", bm1M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"bm1M11", bm1M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"bm1M12", bm1M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"bm1M13", bm1M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"bm1M14", bm1M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"bm1M15", bm1M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"bm1M16", bm1M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"bm1M17", bm1M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"bm1M18", bm1M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"bm1M19", bm1M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"bm1M20", bm1M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"bm1M21", bm1M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"bm1M22", bm1M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"bm1M23", bm1M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"bm1M24", bm1M24);
+
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"bm2f", bm2f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"bm2l", bm2l);
   feat_lib_add(fl, FEAT_TYPE_CPOS,  (char *)"bm2c", bm2c);
@@ -1157,6 +1595,32 @@ feat_lib *feat_lib_build(void)
   /* feat_lib_add(fl, FEAT_TYPE_INT_3,     (char *)"bm2U1", bm2U1); */
   /* feat_lib_add(fl, FEAT_TYPE_INT,     (char *)"bm2sgn", bm2sgn); */
 
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"bm2M1", bm2M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"bm2M2", bm2M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"bm2M3", bm2M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"bm2M4", bm2M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"bm2M5", bm2M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"bm2M6", bm2M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"bm2M7", bm2M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"bm2M8", bm2M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"bm2M9", bm2M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"bm2M10", bm2M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"bm2M11", bm2M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"bm2M12", bm2M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"bm2M13", bm2M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"bm2M14", bm2M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"bm2M15", bm2M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"bm2M16", bm2M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"bm2M17", bm2M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"bm2M18", bm2M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"bm2M19", bm2M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"bm2M20", bm2M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"bm2M21", bm2M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"bm2M22", bm2M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"bm2M23", bm2M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"bm2M24", bm2M24);
+
+	
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"bm3f", bm3f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"bm3l", bm3l);
   feat_lib_add(fl, FEAT_TYPE_CPOS,  (char *)"bm3c", bm3c);
@@ -1193,6 +1657,31 @@ feat_lib *feat_lib_build(void)
   /* feat_lib_add(fl, FEAT_TYPE_INT_3,     (char *)"bm3U1", bm3U1); */
   /* feat_lib_add(fl, FEAT_TYPE_INT,     (char *)"bm3sgn", bm3sgn); */
   
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"bm3M1", bm3M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"bm3M2", bm3M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"bm3M3", bm3M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"bm3M4", bm3M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"bm3M5", bm3M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"bm3M6", bm3M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"bm3M7", bm3M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"bm3M8", bm3M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"bm3M9", bm3M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"bm3M10", bm3M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"bm3M11", bm3M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"bm3M12", bm3M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"bm3M13", bm3M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"bm3M14", bm3M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"bm3M15", bm3M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"bm3M16", bm3M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"bm3M17", bm3M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"bm3M18", bm3M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"bm3M19", bm3M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"bm3M20", bm3M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"bm3M21", bm3M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"bm3M22", bm3M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"bm3M23", bm3M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"bm3M24", bm3M24);
+
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"b1f", b1f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"b1l", b1l);
   feat_lib_add(fl, FEAT_TYPE_CPOS,  (char *)"b1c", b1c);
@@ -1229,7 +1718,34 @@ feat_lib *feat_lib_build(void)
   /* feat_lib_add(fl, FEAT_TYPE_INT_3, (char *)"b1U1", b1U1); */
   feat_lib_add(fl, FEAT_TYPE_INT, (char *)"b1U1", b1U1);
   feat_lib_add(fl, FEAT_TYPE_SGN,   (char *)"b1sgn", b1sgn);
-  
+
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"b1M1", b1M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"b1M2", b1M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"b1M3", b1M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"b1M4", b1M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"b1M5", b1M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"b1M6", b1M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"b1M7", b1M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"b1M8", b1M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"b1M9", b1M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"b1M10", b1M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"b1M11", b1M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"b1M12", b1M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"b1M13", b1M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"b1M14", b1M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"b1M15", b1M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"b1M16", b1M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"b1M17", b1M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"b1M18", b1M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"b1M19", b1M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"b1M20", b1M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"b1M21", b1M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"b1M22", b1M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b1M23", b1M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b1M24", b1M24);
+
+
+	
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"b2f", b2f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"b2l", b2l);
   feat_lib_add(fl, FEAT_TYPE_CPOS,  (char *)"b2c", b2c);
@@ -1267,6 +1783,31 @@ feat_lib *feat_lib_build(void)
   feat_lib_add(fl, FEAT_TYPE_INT,   (char *)"b2U1", b2U1);
   feat_lib_add(fl, FEAT_TYPE_SGN,   (char *)"b2sgn", b2sgn);
 
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"b2M1", b2M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"b2M2", b2M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"b2M3", b2M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"b2M4", b2M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"b2M5", b2M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"b2M6", b2M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"b2M7", b2M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"b2M8", b2M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"b2M9", b2M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"b2M10", b2M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"b2M11", b2M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"b2M12", b2M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"b2M13", b2M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"b2M14", b2M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"b2M15", b2M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"b2M16", b2M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"b2M17", b2M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"b2M18", b2M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"b2M19", b2M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"b2M20", b2M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"b2M21", b2M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"b2M22", b2M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b2M23", b2M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b2M24", b2M24);
+
   feat_lib_add(fl, FEAT_TYPE_FORM,  (char *)"b3f", b3f);
   feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"b3l", b3l);
   feat_lib_add(fl, FEAT_TYPE_CPOS,  (char *)"b3c", b3c);
@@ -1301,7 +1842,33 @@ feat_lib *feat_lib_build(void)
   feat_lib_add(fl, FEAT_TYPE_Y,     (char *)"b3Y", b3Y);
   feat_lib_add(fl, FEAT_TYPE_Y,     (char *)"b3Z", b3Z);
 
-  /* feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"gs0l", gs0l); */
+	feat_lib_add(fl, FEAT_TYPE_M1,     (char *)"b3M1", b3M1);
+	feat_lib_add(fl, FEAT_TYPE_M2,     (char *)"b3M2", b3M2);
+	feat_lib_add(fl, FEAT_TYPE_M3,     (char *)"b3M3", b3M3);
+	feat_lib_add(fl, FEAT_TYPE_M4,     (char *)"b3M4", b3M4);
+	feat_lib_add(fl, FEAT_TYPE_M5,     (char *)"b3M5", b3M5);
+	feat_lib_add(fl, FEAT_TYPE_M6,     (char *)"b3M6", b3M6);
+	feat_lib_add(fl, FEAT_TYPE_M7,     (char *)"b3M7", b3M7);
+	feat_lib_add(fl, FEAT_TYPE_M8,     (char *)"b3M8", b3M8);
+	feat_lib_add(fl, FEAT_TYPE_M9,     (char *)"b3M9", b3M9);
+	feat_lib_add(fl, FEAT_TYPE_M10,     (char *)"b3M10", b3M10);
+	feat_lib_add(fl, FEAT_TYPE_M11,     (char *)"b3M11", b3M11);
+	feat_lib_add(fl, FEAT_TYPE_M12,     (char *)"b3M12", b3M12);
+	feat_lib_add(fl, FEAT_TYPE_M13,     (char *)"b3M13", b3M13);
+	feat_lib_add(fl, FEAT_TYPE_M14,     (char *)"b3M14", b3M14);
+	feat_lib_add(fl, FEAT_TYPE_M15,     (char *)"b3M15", b3M15);
+	feat_lib_add(fl, FEAT_TYPE_M16,     (char *)"b3M16", b3M16);
+	feat_lib_add(fl, FEAT_TYPE_M17,     (char *)"b3M17", b3M17);
+	feat_lib_add(fl, FEAT_TYPE_M18,     (char *)"b3M18", b3M18);
+	feat_lib_add(fl, FEAT_TYPE_M19,     (char *)"b3M19", b3M19);
+	feat_lib_add(fl, FEAT_TYPE_M20,     (char *)"b3M20", b3M20);
+	feat_lib_add(fl, FEAT_TYPE_M21,     (char *)"b3M21", b3M21);
+	feat_lib_add(fl, FEAT_TYPE_M22,     (char *)"b3M22", b3M22);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b3M23", b3M23);
+	feat_lib_add(fl, FEAT_TYPE_M23,     (char *)"b3M24", b3M24);
+
+
+	/* feat_lib_add(fl, FEAT_TYPE_LEMMA, (char *)"gs0l", gs0l); */
   /* feat_lib_add(fl, FEAT_TYPE_POS,   (char *)"gs0p", gs0p); */
   
   feat_lib_add(fl, FEAT_TYPE_LABEL, (char *)"ldep_s0r", ldep_s0r);
diff --git a/maca_trans_parser/src/maca_tm_train.c b/maca_trans_parser/src/maca_tm_train.c
index 0d487b5..4ee4a16 100644
--- a/maca_trans_parser/src/maca_tm_train.c
+++ b/maca_trans_parser/src/maca_tm_train.c
@@ -188,11 +188,18 @@ void train_nn(context * ctx)
       fprintf(stderr, "training classifier %d / %d : %s\n", classif_nb + 1,
               classif_vec->nb, classif->name);
 
-    strcpy(mlp_model_filename, classif->name);
-    strcat(mlp_model_filename, ".model");
+		if(ctx->dnn_model_filename){
+			strcpy(mlp_model_filename, ctx->dnn_model_filename);
+			strcpy(mlp_struct_filename, ctx->dnn_model_filename);
+		}
+		else{
+			strcpy(mlp_model_filename, classif->name);
+			strcpy(mlp_struct_filename, classif->name);
+		}
+		
+		strcat(mlp_model_filename, ".model");
     classifier_set_mlp_model_filename(classif, strdup(mlp_model_filename));
-
-    strcpy(mlp_struct_filename, classif->name);
+		
     strcat(mlp_struct_filename, ".struct");
     classifier_set_mlp_struct_filename(classif, strdup(mlp_struct_filename));
 
-- 
GitLab