OSDN Git Service

ver1.1
[nysol/mining.git] / zdd / lib / SAPPOROBDD / src / BDDXc / train.c
diff --git a/zdd/lib/SAPPOROBDD/src/BDDXc/train.c b/zdd/lib/SAPPOROBDD/src/BDDXc/train.c
new file mode 100755 (executable)
index 0000000..d9a0f0e
--- /dev/null
@@ -0,0 +1,139 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "train.h"
+#include "defs.h"
+
+
+void   TrainReset( root, size )
+     train     *root;
+     int       size;
+{
+  container    *p;
+  
+  root->size = size;
+  p = ( container *)malloc( sizeof( container ) );
+  root->head = p;
+  root->tail = p;
+  root->bound = 0;
+  p->rest = N;
+  p->next = NULL;
+  p->nodes = ( dummy *)malloc( N * root->size );
+  p->tail = p->nodes;
+}
+
+
+void   TrainFree( root )
+     train      *root;
+{
+  container     *t, *tv;
+
+  t = root->head;
+  do{
+    tv = t;
+    t = t->next;
+    free( tv->nodes );
+    free( tv );
+  }while( t != NULL );
+  root->head = NULL;
+  root->tail = NULL;
+  root->size = 0;
+}
+
+
+static void    AllocContainer( root )
+     train     *root;
+{
+  container    *p;
+
+  p = ( container *)malloc( sizeof( container ) );
+  root->tail->next = p;
+  root->tail = p;
+  p->rest = N;
+  p->next = NULL;
+  p->nodes = ( dummy * )malloc( N * root->size );
+  p->tail = p->nodes;
+}
+
+
+void   TrainLoad( root, node )
+     train     *root;
+     dummy     *node;
+{
+  if( root->tail->rest == 0 ) AllocContainer( root );
+  bcopy( node, root->tail->tail, root->size );
+  root->tail->tail += root->size;
+  root->tail->rest --;
+  root->bound ++;
+}
+
+
+int    TrainCheck( root, node )
+     train     *root;
+     dummy     *node;
+{
+  container    *t;
+  int          i, x;
+
+  t = root->head;
+  x = 0;
+  do{
+    for( i = 0; i < N - ( t->rest ); i++ ){
+      if( bcmp( t->nodes + i * root->size , node, root->size ) == 0 )
+       return( x + i );
+    }
+    t = t->next;
+    x += N;
+  }while( t != NULL );
+  return( EMPTY );
+}
+
+
+int    TrainComp( root, node, func )
+     train     *root;
+     dummy     *node;
+     int       (*func)();
+{
+  container    *t;
+  int          i, x;
+
+  t = root->head;
+  x = 0;
+  do{
+    for( i = 0; i < N - ( t->rest ); i++ ){
+      if( (*func)( t->nodes + i * root->size , node ) )
+       return( x + i );
+    }
+    t = t->next;
+    x += N;
+  }while( t != NULL );
+  return( EMPTY );
+}
+
+
+dummy  *TrainIndex( root, x )
+     train     *root;
+     int       x;
+{
+  container    *t;
+
+  if( root->bound <= x ){
+    fprintf( stderr, "ChuDoon\n" );
+    exit( 1 );
+  }
+  t = root->head;
+  do{
+    if( N - ( t->rest ) > x ) return( t->nodes + x * root->size );
+    t = t->next;
+    x -= N;
+  }while( t != NULL );
+  return( NULL );
+}
+
+
+int    TrainBound( root )
+     train     *root;
+{
+  return( root->bound );
+}
+