summaryrefslogtreecommitdiff
path: root/test/contrained.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/contrained.c')
-rw-r--r--test/contrained.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/test/contrained.c b/test/contrained.c
new file mode 100644
index 0000000..1af01a8
--- /dev/null
+++ b/test/contrained.c
@@ -0,0 +1,281 @@
+#include "leven.h"
+
+#include "log.h"
+
+DECL_MAT3(no_trace, uint32_t, 0, 0, 0);
+
+int main(int argc, char **argv) {
+ log("Constrained edit tests");
+
+ {
+ struct Tree a = {
+ .adj = { .data = &(nid){0},
+ .stride = 1,
+ },
+ .len = 1,
+ };
+
+ struct Tree b = {
+ .adj = {
+ .data = &(nid){0},
+ .stride = 1,
+ },
+ .len = 1,
+ };
+
+ DECL_MAT_DATA(cost, uint32_t, 2, 2,
+ 0, 2,
+ 2, 1,
+ );
+ DECL_MAT(cost_n, uint32_t, 2, 2);
+ DECL_MAT(cost_f, uint32_t, 2, 2);
+ DECL_MAT(cost_s, uint32_t, 1, 1);
+
+ constrained_tree_distance(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s
+ );
+
+ if(*imat_uint32_t(cost_n, 1, 1) != 1) {
+ log("Test Fail");
+ return 1;
+ }
+
+ DECL_MAT(alignment, uint32_t, 2, 2);
+ uint32_t adj_alignment[2] = {0, 0};
+ constrained_tree_alignment(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s,
+ adj_alignment,
+ alignment
+ );
+ }
+
+ {
+ struct Tree a = {
+ .adj = {
+ .data = (nid[]){2, 0},
+ .stride = 1,
+ },
+ .len = 2,
+ };
+
+ struct Tree b = {
+ .adj = {
+ .data = &(nid){0},
+ .stride = 1,
+ },
+ .len = 1,
+ };
+
+ DECL_MAT_DATA(cost, uint32_t, 3, 2,
+ 0, 1, 2,
+ 2, 1, 1,
+ );
+ DECL_MAT(cost_n, uint32_t, 3, 2);
+ DECL_MAT(cost_f, uint32_t, 3, 2);
+ DECL_MAT(cost_s, uint32_t, 2, 2);
+
+ constrained_tree_distance(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s
+ );
+
+ if(*imat_uint32_t(cost_n, 1, 1) != 2) {
+ log("Test Fail");
+ return 1;
+ }
+
+ DECL_MAT(alignment, uint32_t, 3, 2);
+ uint32_t adj_alignment[2] = {0, 0};
+ constrained_tree_alignment(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s,
+ adj_alignment,
+ alignment
+ );
+ }
+
+ {
+ struct Tree a = {
+ .adj = {
+ .data = (nid[]){2, 0},
+ .stride = 1,
+ },
+ .len = 2,
+ };
+
+ struct Tree b = {
+ .adj = {
+ .data = (nid[]){2, 0},
+ .stride = 1,
+ },
+ .len = 2,
+ };
+
+ DECL_MAT_DATA(cost, uint32_t, 3, 3,
+ 0, 2, 2,
+ 2, 0, 2,
+ 2, 2, 0,
+ );
+ DECL_MAT(cost_n, uint32_t, 3, 3);
+ DECL_MAT(cost_f, uint32_t, 3, 3);
+ DECL_MAT(cost_s, uint32_t, 2, 2);
+
+ constrained_tree_distance(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s
+ );
+
+ if(*imat_uint32_t(cost_n, 1, 1) != 0) {
+ log("Test Fail");
+ return 1;
+ }
+
+ DECL_MAT(alignment, uint32_t, 2, 2);
+ uint32_t adj_alignment[2] = {0, 0};
+ constrained_tree_alignment(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s,
+ adj_alignment,
+ alignment
+ );
+ }
+
+ {
+ struct Tree a = {
+ .adj = {
+ .data = (nid[]){2, 3, 0, 0, 0, 0},
+ .stride = 2,
+ },
+ .len = 3,
+ };
+
+ struct Tree b = {
+ .adj = {
+ .data = (nid[]){2, 0, 3, 4, 0, 0, 0, 0},
+ .stride = 2,
+ },
+ .len = 4,
+ };
+
+ DECL_MAT_DATA(cost, uint32_t, 4, 5,
+ 2, 2, 2, 2,
+ 2, 2, 2, 2,
+ 2, 0, 2, 2,
+ 2, 2, 0, 2,
+ 2, 2, 2, 0,
+ );
+ DECL_MAT(cost_n, uint32_t, 4, 5);
+ DECL_MAT(cost_f, uint32_t, 4, 5);
+ DECL_MAT(cost_s, uint32_t, 3, 3);
+
+ constrained_tree_distance(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s
+ );
+
+ if(*imat_uint32_t(cost_n, 1, 1) != 2) {
+ log("Test Fail\n");
+ return 1;
+ }
+
+ DECL_MAT(alignment, uint32_t, 2, 2);
+ uint32_t adj_alignment[2] = {0, 0};
+ constrained_tree_alignment(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s,
+ adj_alignment,
+ alignment
+ );
+ }
+
+ {
+ struct Tree a = {
+ .adj = {
+ .data = (nid[]){2, 3, 0, 0, 0, 0},
+ .stride = 2,
+ },
+ .len = 3,
+ };
+
+ struct Tree b = {
+ .adj = {
+ .data = (nid[]){2, 3, 0},
+ .stride = 1,
+ },
+ .len = 3,
+ };
+
+ DECL_MAT_DATA(cost, uint32_t, 4, 4,
+ 0, 2, 2, 2,
+ 2, 0, 2, 2,
+ 2, 2, 0, 2,
+ 2, 2, 2, 0,
+ );
+ DECL_MAT(cost_n, uint32_t, 4, 4);
+ DECL_MAT(cost_f, uint32_t, 4, 4);
+ DECL_MAT(cost_s, uint32_t, 3, 2);
+
+ constrained_tree_distance(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s
+ );
+
+ if(*imat_uint32_t(cost_n, 1, 1) != 4) {
+ log("Test Fail\n");
+ return 1;
+ }
+
+ DECL_MAT(alignment, uint32_t, 2, 2);
+ uint32_t adj_alignment[2] = {0, 0};
+ constrained_tree_alignment(
+ a,
+ b,
+ cost,
+ cost_n,
+ cost_f,
+ cost_s,
+ adj_alignment,
+ alignment
+ );
+ }
+
+ return 0;
+}