Repository: IITH-Compilers/IR2Vec (language: python)

Issue:
Extending support for vocabularies of different dimensions



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/doxygen.yml b/.github/workflows/doxygen.yml
index c3db2c283..eeb62520f 100644
--- a/.github/workflows/doxygen.yml
+++ b/.github/workflows/doxygen.yml
@@ -33,7 +33,7 @@ jobs:
     - name: Deploy
       uses: peaceiris/actions-gh-pages@v3
       with:
-        github_token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
+        github_token: ${{ secrets.GITHUB_TOKEN }}
         # Default Doxyfile build documentation to html directory.
         # Change the directory if changes in Doxyfile
         publish_dir: ./html
diff --git a/Manylinux2014_Compliant_Source/pkg/build.sh b/Manylinux2014_Compliant_Source/pkg/build.sh
index a43ec9965..c252eb7b8 100644
--- a/Manylinux2014_Compliant_Source/pkg/build.sh
+++ b/Manylinux2014_Compliant_Source/pkg/build.sh
@@ -18,7 +18,7 @@ cd ..
 cmake -DCMAKE_BUILD_TYPE=Release .. && make -j"$(nproc)" && make install
 
 cd ..
-cp build/vocabulary.h Manylinux2014_Compliant_Source/pkg/ir2vec/
+cp build/include/Vocabulary*.h Manylinux2014_Compliant_Source/pkg/ir2vec/
 cp src/include/utils.h Manylinux2014_Compliant_Source/pkg/ir2vec/
 cp src/include/IR2Vec.h Manylinux2014_Compliant_Source/pkg/ir2vec/
 cp build/src/version.h Manylinux2014_Compliant_Source/pkg/ir2vec/
diff --git a/Manylinux2014_Compliant_Source/pkg/ir2vec/core.cpp b/Manylinux2014_Compliant_Source/pkg/ir2vec/core.cpp
index 360d9a375..565bd775f 100644
--- a/Manylinux2014_Compliant_Source/pkg/ir2vec/core.cpp
+++ b/Manylinux2014_Compliant_Source/pkg/ir2vec/core.cpp
@@ -20,7 +20,6 @@
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/SmallSet.h"
-#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/IR/CFG.h"
@@ -75,11 +74,13 @@ class IR2VecHandler {
   std::string outputFile;
   std::string mode;
   std::string level;
+  unsigned dim;
 
 public:
   IR2VecHandler(std::string fileName, std::string outputFile, std::string mode,
-                std::string level)
-      : fileName(fileName), outputFile(outputFile), mode(mode), level(level) {}
+                std::string level, unsigned dim)
+      : fileName(fileName), outputFile(outputFile), mode(mode), level(level),
+        dim(dim) {}
 
   std::string getFile() { return fileName; }
   std::string getOutputFile() { return outputFile; }
@@ -87,7 +88,7 @@ class IR2VecHandler {
   std::string getLevel() { return level; }
 
   // Function to get Program Vector List
-  PyObject *createProgramVectorList(llvm::SmallVector<double, DIM> llvmPgmVec) {
+  PyObject *createProgramVectorList(IR2Vec::Vector llvmPgmVec) {
     // for PgmVector
     PyObject *PgmList = PyList_New(0);
     for (auto &Pgm_it : llvmPgmVec)
@@ -138,7 +139,6 @@ class IR2VecHandler {
     PyObject *instructionVectorList = PyList_New(0);
     for (auto &Inst_it : llvmInstVecMap) {
       PyObject *instructionVector = PyList_New(0);
-      // copy this SmallVector into c++ Vector
       for (auto &Vec_it : Inst_it.second) {
         PyList_Append(instructionVector, PyFloat_FromDouble(Vec_it));
       }
@@ -166,10 +166,10 @@ class IR2VecHandler {
       ofstream output;
       output.open(outFile, ios_base::app);
       emb = std::move(new IR2Vec::Embeddings(
-          *Module, ir2vecMode, (this->level)[0], &output, funcName));
+          *Module, ir2vecMode, (this->level)[0], &output, this->dim, funcName));
     } else {
       emb = std::move(new IR2Vec::Embeddings(
-          *Module, ir2vecMode, (this->level)[0], nullptr, funcName));
+          *Module, ir2vecMode, (this->level)[0], nullptr, this->dim, funcName));
     }
 
     if (!emb) {
@@ -178,7 +178,7 @@ class IR2VecHandler {
     }
 
     if (type == OpType::Program) {
-      llvm::SmallVector<double, DIM> progVector = emb->getProgramVector();
+      IR2Vec::Vector progVector = emb->getProgramVector();
       return this->createProgramVectorList(progVector);
     } else if (type == OpType::Function) {
       llvm::SmallMapVector<const llvm::Function *, IR2Vec::Vector, 16>
@@ -293,9 +293,10 @@ PyObject *getFunctionVectors(PyObject *self, PyObject *args) {
 
 IR2VecHandlerObject *createIR2VECObject(const char *filename,
                                         const char *output_file,
-                                        const char *mode, const char *level) {
+                                        const char *mode, const char *level,
+                                        unsigned dim) {
   IR2VecHandler *ir2vecObj =
-      new IR2VecHandler(filename, output_file, mode, level);
+      new IR2VecHandler(filename, output_file, mode, level, dim);
   if (!ir2vecObj) {
     return nullptr;
   }
@@ -314,8 +315,9 @@ PyObject *initEmbedding(PyObject *self, PyObject *args) {
   const char *mode = "\0";
   const char *level = "\0";
   const char *output_file = "\0";
+  unsigned dim = 300;
 
-  if (!PyArg_ParseTuple(args, "sss|s", &filename, &mode, &level,
+  if (!PyArg_ParseTuple(args, "sss|Is", &filename, &mode, &level, &dim,
                         &output_file)) {
     // raise error here
     PyErr_SetString(PyExc_TypeError, "Invalid Arguments");
@@ -348,7 +350,7 @@ PyObject *initEmbedding(PyObject *self, PyObject *args) {
   }
 
   IR2VecHandlerObject *ir2vecObj =
-      createIR2VECObject(filename, output_file, mode, level);
+      createIR2VECObject(filename, output_file, mode, level, dim);
 
   if (!ir2vecObj) {
     PyErr_SetString(PyExc_TypeError, "Embedding Object not created");
diff --git a/README.md b/README.md
index 8aa42518d..865ac3d29 100644
--- a/README.md
+++ b/README.md
@@ -113,13 +113,16 @@ To ensure the correctness, run `make check`
 instructions.
 
 ### Using Binary
-> ir2vec -\<mode\> -o \<output-file\> -level \<p|f\> -class \<class-number\> -funcName=\<function-name\> \<input-ll-file\>
+> ir2vec -\<mode\> -dim \<dimensions\> -o \<output-file\> -level \<p|f\> -class \<class-number\> -funcName=\<function-name\> \<input-ll-file\>
 
 #### Command-Line options
 
 - `mode` - can be one of `sym`/`fa`
     - `sym` denotes Symbolic representation
     - `fa` denotes Flow-Aware representation
+- `dim` - Dimensions of embeddings
+    - This is an optional argument. Defaults to `300`.
+    - Other supported dimensions are `75` and `100`
 -  `o` - file in which the embeddings are to be appended;     (Note : If  file doesn’t exist, new file would be created, else embeddings would be appended)
 - `level` - can be one of chars `p`/`f`.
     - `p` denotes `program level` encoding
@@ -141,16 +144,16 @@ Please use `--help` for further details.
 
 #### Flow-Aware Embeddings
 For all functions
-* `` ir2vec -fa -o <output_file> -level <p|f>  -class <class-number> <input_ll_file>``
+* `` ir2vec -fa -dim <dimension> -o <output_file> -level <p|f>  -class <class-number> <input_ll_file>``
 
 For a specific function
-* `` ir2vec -fa -o <output_file> -level f  -class <class-number> -funcName=\<function-name\><input_ll_file>``
+* `` ir2vec -fa -dim <dimension> -o <output_file> -level f  -class <class-number> -funcName=\<function-name\><input_ll_file>``
 
 #### Symbolic Embeddings
 For all functions
- * `` ir2vec -sym -o <output_file> -level <p|f> -class <class-number> <input_ll_file>``
+ * `` ir2vec -sym -dim <dimension> -o <output_file> -level <p|f> -class <class-number> <input_ll_file>``
 For a specific function
- * `` ir2vec -sym -o <output_file> -level f -class <class-number> -funcName=\<function-name\> <input_ll_file>``
+ * `` ir2vec -sym -dim <dimension> -o <output_file> -level f -class <class-number> -funcName=\<function-name\> <input_ll_file>``
 
 ## Using Libraries
 The libraries can be installed by passing the installation location to the `CMAKE_INSTALL_PREFIX` flag during `cmake` followed by `make install`.
@@ -178,7 +181,7 @@ The following example snippet shows how to query the exposed vector representati
 
 // Creating object to generate FlowAware representation
 auto ir2vec =
-      IR2Vec::Embeddings(<LLVM Module>, IR2Vec::IR2VecMode::FlowAware);
+      IR2Vec::Embeddings(<LLVM Module>, IR2Vec::IR2VecMode::FlowAware, <DIM>);
 
 // Getting Instruction vectors corresponding to the instructions in <LLVM Module>
 auto instVecMap = ir2vec.getInstVecMap();
@@ -218,6 +221,8 @@ for (auto val : pgmVec)
 * `file_path`: str - Path to the `.ll` or `.bc` file.
 * `encoding_type`: str - Choose `fa` (Flow-Aware) or `sym` (Symbolic).
 * `level`: str - Choose `p` for program-level or `f` for function-level.
+* `dim`: uint - Choose from `[300, 100, 75]`. Default value is `300`
+* `output_file`: str - If provided, embeddings are saved to this file. Default is an empty string.
 
 **Returns:**
 
@@ -228,7 +233,14 @@ for (auto val : pgmVec)
 ```python
 import ir2vec
 
+# Approach 1
 initObj = ir2vec.initEmbedding("/path/to/file.ll", "fa", "p")
+
+# Approach 2
+initObj = ir2vec.initEmbedding("/path/to/file.ll", "fa", "p", 100)
+
+# Approach 3
+initObj = ir2vec.initEmbedding("/path/to/file.ll", "fa", "p", 100, "output.txt")
 ```
 
 ### getProgramVector
diff --git a/seed_embeddings/OpenKE/LICENSE b/seed_embeddings/OpenKE/LICENSE.txt
similarity index 100%
rename from seed_embeddings/OpenKE/LICENSE
rename to seed_embeddings/OpenKE/LICENSE.txt
diff --git a/seed_embeddings/OpenKE/README.md b/seed_embeddings/OpenKE/README.md
index 59558df33..4d0698319 100644
--- a/seed_embeddings/OpenKE/README.md
+++ b/seed_embeddings/OpenKE/README.md
@@ -18,33 +18,32 @@ If you use the code, please cite the following [paper](http://aclweb.org/antholo
 
 ## Overview
 
-This is an Efficient implementation based on TensorFlow for knowledge representation learning (KRL). We use C++ to implement some underlying operations such as data preprocessing and negative sampling. For each specific model, it is implemented by TensorFlow with Python interfaces so that there is a convenient platform to run models on GPUs. OpenKE composes 4 repositories:
+OpenKE is an efficient implementation based on PyTorch for knowledge embedding. We use C++ to implement some underlying operations such as data preprocessing and negative sampling. For each specific model, it is implemented by PyTorch with Python interfaces so that there is a convenient platform to run models on GPUs. OpenKE contains 4 repositories:
 
-OpenKE: the main project based on TensorFlow, which provides the optimized and stable framework for knowledge graph embedding models.
+[OpenKE-PyTorch](https://github.com/thunlp/OpenKE/tree/OpenKE-PyTorch): the repository based on PyTorch, which provides the optimized and stable framework for knowledge graph embedding models.
 
-<a href="https://github.com/thunlp/OpenKE/tree/OpenKE-PyTorch"> OpenKE-PyTorch</a>: OpenKE implemented with PyTorch, also providing the optimized and stable framework for knowledge graph embedding models.
+<a href="https://github.com/thunlp/OpenKE/tree/OpenKE-Tensorflow1.0"> OpenKE-Tensorflow1.0</a>: OpenKE implemented with TensorFlow, also providing the optimized and stable framework for knowledge graph embedding models.
 
 <a href="https://github.com/thunlp/TensorFlow-TransX"> TensorFlow-TransX</a>: light and simple version of OpenKE based on TensorFlow, including TransE, TransH, TransR and TransD.
 
 <a href="https://github.com/thunlp/Fast-TransX"> Fast-TransX</a>: efficient lightweight C++ inferences for TransE and its extended models utilizing the framework of OpenKE, including TransH, TransR, TransD, TranSparse and PTransE.
 
+
 ## Installation
 
-1. Install TensorFlow
 
-2. Clone the OpenKE repository:
+1. Install [PyTorch](https://pytorch.org/get-started/locally/)
 
+2. Clone the OpenKE-PyTorch branch:
 ```bash
-$ git clone https://github.com/thunlp/OpenKE
-$ cd OpenKE
+git clone -b OpenKE-PyTorch https://github.com/thunlp/OpenKE --depth 1
+cd OpenKE
+cd openke
 ```
-
 3. Compile C++ files
-
 ```bash
-$ bash make.sh
+bash make.sh
 ```
-
 ## Data
 
 * For training, datasets contain three files:
@@ -62,572 +61,4 @@ $ bash make.sh
 
   valid2id.txt: validating file, the first line is the number of triples for validating. Then the following lines are all in the format ***(e1, e2, rel)*** .
 
-  type_constrain.txt: type constraining file, the first line is the number of relations. Then the following lines are type constraints for each relation. For example, the relation with id 1200 has 4 types of head entities, which are 3123, 1034, 58 and 5733. The relation with id 1200 has 4 types of tail entities, which are 12123, 4388, 11087 and 11088. You can get this file through **n-n.py** in folder benchmarks/FB15K.
-
-## Quick Start
-
-### Training
-
-To compute a knowledge graph embedding, first import datasets and set configure parameters for training, then train models and export results. For instance, we write an example_train_transe.py to train TransE:
-
-```python
-import config
-import models
-import tensorflow as tf
-import numpy as np
-
-con = config.Config()
-#Input training files from benchmarks/FB15K/ folder.
-con.set_in_path("./benchmarks/FB15K/")
-
-con.set_work_threads(4)
-con.set_train_times(500)
-con.set_nbatches(100)
-con.set_alpha(0.001)
-con.set_margin(1.0)
-con.set_bern(0)
-con.set_dimension(50)
-con.set_ent_neg_rate(1)
-con.set_rel_neg_rate(0)
-con.set_opt_method("SGD")
-
-#Models will be exported via tf.Saver() automatically.
-con.set_export_files("./res/model.vec.tf", 0)
-#Model parameters will be exported to json files automatically.
-con.set_out_files("./res/embedding.vec.json")
-#Initialize experimental settings.
-con.init()
-#Set the knowledge embedding model
-con.set_model(models.TransE)
-#Train the model.
-con.run()
-```
-
-#### Step 1: Import datasets
-
-```python
-con.set_in_path("benchmarks/FB15K/")
-```
-
-We import knowledge graphs from benchmarks/FB15K/ folder. The data consists of three essential files mentioned before:
-
-*	train2id.txt
-*	entity2id.txt
-*	relation2id.txt
-
-Validation and test files are required and used to evaluate the training results, However, they are not indispensable for training.
-
-```python
-con.set_work_threads(8)
-```
-
-We can allocate several threads to sample positive and negative cases.
-
-
-#### Step 2: Set configure parameters for training.
-
-```python
-con.set_train_times(500)
-con.set_nbatches(100)
-con.set_alpha(0.5)
-con.set_dimension(200)
-con.set_margin(1)
-```
-
-We set essential parameters, including the data traversing rounds, learning rate, batch size, and dimensions of entity and relation embeddings.
-
-```python
-con.set_bern(0)
-con.set_ent_neg_rate(1)
-con.set_rel_neg_rate(0)
-```
-
-For negative sampling, we can corrupt entities and relations to construct negative triples. set\_bern(0) will use the traditional sampling method, and set\_bern(1) will use the method in (Wang et al. 2014) denoted as "bern".
-
-```python
-con.set_optimizer("SGD")
-```
-
-We can select a proper gradient descent optimization algorithm to train models.
-
-#### Step 3: Export results
-
-```python
-con.set_export_files("./res/model.vec.tf", 0)
-
-con.set_out_files("./res/embedding.vec.json")
-```
-
-Models will be exported via tf.Saver() automatically every few rounds. Also, model parameters will be exported to json files finally.
-
-#### Step 4: Train models
-
-```python
-con.init()
-con.set_model(models.TransE)
-con.run()
-```
-
-We set the knowledge graph embedding model and start the training process.
-
-### Testing
-
-#### Link Prediction
-
-Link prediction aims to predict the missing h or t for a relation fact triple (h, r, t). In this task, for each position of missing entity, the system is asked to rank a set of candidate entities from the knowledge graph, instead of only giving one best result. For each test triple (h, r, t), we replace the head/tail entity by all entities in the knowledge graph, and rank these entities in descending order of similarity scores calculated by score function fr. we use two measures as our evaluation metric:
-
-* ***MR*** : mean rank of correct entities;
-* ***MRR***: the average of the reciprocal ranks of correct entities;
-* ***Hit@N*** : proportion of correct entities in top-N ranked entities.
-
-#### Triple Classification
-
-Triple classification aims to judge whether a given triple (h, r, t) is correct or not. This is a binary classification
-task. For triple classification, we set a relationspecific threshold δr. For a triple (h, r, t), if the dissimilarity
-score obtained by fr is below δr, the triple will be classified as positive, otherwise negative. δr is optimized by maximizing classification accuracies on the validation set.
-
-#### Predict Head Entity
-
-Given tail entity and relation, predict the top k possible head entities. All the objects are represented by their id.
-
-```python
-def predict_head_entity(self, t, r, k):
-	r'''This mothod predicts the top k head entities given tail entity and relation.
-
-	Args:
-		t (int): tail entity id
-		r (int): relation id
-		k (int): top k head entities
-
-	Returns:
-		list: k possible head entity ids
-	'''
-	self.init_link_prediction()
-	if self.importName != None:
-		self.restore_tensorflow()
-	test_h = np.array(range(self.entTotal))
-	test_r = np.array([r] * self.entTotal)
-	test_t = np.array([t] * self.entTotal)
-	res = self.test_step(test_h, test_t, test_r).reshape(-1).argsort()[:k]
-	print(res)
-	return res
-```
-
-#### Predict Tail Entity
-
-This is similar to predicting the head entity.
-
-#### Predict Relation
-
-Given the head entity and tail entity, predict the top k possible relations. All the objects are represented by their id.
-
-```python
-def predict_relation(self, h, t, k):
-	r'''This methods predict the relation id given head entity and tail entity.
-
-	Args:
-		h (int): head entity id
-		t (int): tail entity id
-		k (int): top k relations
-
-	Returns:
-		list: k possible relation ids
-	'''
-	self.init_link_prediction()
-	if self.importName != None:
-		self.restore_tensorflow()
-	test_h = np.array([h] * self.relTotal)
-	test_r = np.array(range(self.relTotal))
-	test_t = np.array([t] * self.relTotal)
-	res = self.test_step(test_h, test_t, test_r).reshape(-1).argsort()[:k]
-	print(res)
-	return res
-```
-
-#### Predict triple
-
-Given a triple (h, r, t), this funtion tells us whether the triple is correct or not. If the threshold is not given, this function calculates the threshold for the relation from the valid dataset.
-
-```python
-def predict_triple(self, h, t, r, thresh = None):
-	r'''This method tells you whether the given triple (h, t, r) is correct of wrong
-
-	Args:
-		h (int): head entity id
-		t (int): tail entity id
-		r (int): relation id
-		thresh (fload): threshold for the triple
-	'''
-	self.init_triple_classification()
-	if self.importName != None:
-		self.restore_tensorflow()
-	res = self.test_step(np.array([h]), np.array([t]), np.array([r]))
-	if thresh != None:
-		if res < thresh:
-			print("triple (%d,%d,%d) is correct" % (h, t, r))
-		else:
-			print("triple (%d,%d,%d) is wrong" % (h, t, r))
-		return
-	self.lib.getValidBatch(self.valid_pos_h_addr, self.valid_pos_t_addr, self.valid_pos_r_addr, self.valid_neg_h_addr, self.valid_neg_t_addr, self.valid_neg_r_addr)
-	res_pos = self.test_step(self.valid_pos_h, self.valid_pos_t, self.valid_pos_r)
-	res_neg = self.test_step(self.valid_neg_h, self.valid_neg_t, self.valid_neg_r)
-	self.lib.getBestThreshold(self.relThresh_addr, res_pos.__array_interface__['data'][0], res_neg.__array_interface__['data'][0])
-	if res < self.relThresh[r]:
-		print("triple (%d,%d,%d) is correct" % (h, t, r))
-	else:
-		print("triple (%d,%d,%d) is wrong" % (h, t, r))
-```
-
-#### Implementation
-
-To evaluate the model, first import datasets and set essential configure paramters, then set model parameters and test the model. For instance, we write an example_test_transe.py to test TransE.
-
-There are four approaches to test models:
-
-(1) Test models right after training.
-
-```python
-import config
-import models
-import tensorflow as tf
-import numpy as np
-
-
-con = config.Config()
-con.set_in_path("./benchmarks/FB15K/")
-
-#True: Input test files from the same folder.
-con.set_test_triple_classification(True)
-con.set_test_link_prediction(True)
-
-con.set_work_threads(4)
-con.set_train_times(500)
-con.set_nbatches(100)
-con.set_alpha(0.001)
-con.set_margin(1.0)
-con.set_bern(0)
-con.set_dimension(50)
-con.set_ent_neg_rate(1)
-con.set_rel_neg_rate(0)
-con.set_opt_method("SGD")
-con.set_export_files("./res/model.vec.tf", 0)
-con.set_out_files("./res/embedding.vec.json")
-con.init()
-con.set_model(models.TransE)
-con.run()
-
-#To test link prediction after training needs "set_test_link_prediction True)".
-#To test triple classfication after training needs "set_test_triple_classification(True)"
-con.test()
-```
-
-(2) Set import files and OpenKE will automatically load models via tf.Saver().
-
-```python
-import config
-import models
-import tensorflow as tf
-import numpy as np
-import json
-
-con = config.Config()
-con.set_in_path("./benchmarks/FB15K/")
-con.set_test_link_prediction(True)
-con.set_test_triple_classification(True)
-con.set_work_threads(4)
-con.set_dimension(50)
-con.set_import_files("./res/model.vec.tf")
-con.init()
-con.set_model(models.TransE)
-con.test()
-```
-
-(3) Read model parameters from json files and manually load parameters.
-
-```python
-import config
-import models
-import tensorflow as tf
-import numpy as np
-import json
-
-con = config.Config()
-con.set_in_path("./benchmarks/FB15K/")
-con.set_test_link_prediction(True)
-con.set_test_triple_classification(True)
-con.set_work_threads(4)
-con.set_dimension(50)
-con.init()
-con.set_model(models.TransE)
-f = open("./res/embedding.vec.json", "r")
-content = json.loads(f.read())
-f.close()
-con.set_parameters(content)
-con.test()
-```
-
-(4) Manually load models via tf.Saver().
-
-```python
-import config
-import models
-import tensorflow as tf
-import numpy as np
-import json
-
-con = config.Config()
-con.set_in_path("./benchmarks/FB15K/")
-con.set_test_link_prediction(True)
-con.set_test_triple_classification(True)
-con.set_work_threads(4)
-con.set_dimension(50)
-con.init()
-con.set_model(models.TransE)
-con.import_variables("./res/model.vec.tf")
-con.test()
-```
-
-Note that you can only load model parameters when model configuration finished.
-
-### Getting the embedding matrix
-
-There are four approaches to get the embedding matrix.
-
-(1) Set import files and OpenKE will automatically load models via tf.Saver().
-
-```python
-con = config.Config()
-con.set_in_path("./benchmarks/FB15K/")
-con.set_test_link_prediction(True)
-con.set_test_triple_classification(True)
-con.set_work_threads(4)
-con.set_dimension(50)
-con.set_import_files("./res/model.vec.tf")
-con.init()
-con.set_model(models.TransE)
-# Get the embeddings (numpy.array)
-embeddings = con.get_parameters("numpy")
-# Get the embeddings (python list)
-embeddings = con.get_parameters()
-```
-
-(2) Read model parameters from json files and manually load parameters.
-
-```python
-con = config.Config()
-con.set_in_path("./benchmarks/FB15K/")
-con.set_test_link_prediction(True)
-con.set_test_triple_classification(True)
-con.set_work_threads(4)
-con.set_dimension(50)
-con.init()
-con.set_model(models.TransE)
-f = open("./res/embedding.vec.json", "r")
-embeddings = json.loads(f.read())
-f.close()
-```
-
-(3) Manually load models via tf.Saver().
-
-```python
-con = config.Config()
-con.set_in_path("./benchmarks/FB15K/")
-con.set_test_link_prediction(True)
-con.set_test_triple_classification(True)
-con.set_work_threads(4)
-con.set_dimension(50)
-con.init()
-con.set_model(models.TransE)
-con.import_variables("./res/model.vec.tf")
-# Get the embeddings (numpy.array)
-embeddings = con.get_parameters("numpy")
-# Get the embeddings (python list)
-embeddings = con.get_parameters()
-```
-
-(4) Immediately get the embeddings after training the model.
-
-```python
-...
-...
-...
-#Models will be exported via tf.Saver() automatically.
-con.set_export_files("./res/model.vec.tf", 0)
-#Model parameters will be exported to json files automatically.
-con.set_out_files("./res/embedding.vec.json")
-#Initialize experimental settings.
-con.init()
-#Set the knowledge embedding model
-con.set_model(models.TransE)
-#Train the model.
-con.run()
-#Get the embeddings (numpy.array)
-embeddings = con.get_parameters("numpy")
-#Get the embeddings (python list)
-embeddings = con.get_parameters()
-```
-
-## Interfaces
-
-### Config
-
-```python
-class Config(object):
-
-	#To set the learning rate
-	def set_alpha(alpha = 0.001)
-
-	#To set the degree of the regularization on the parameters
-	def set_lmbda(lmbda = 0.0)
-
-	#To set the gradient descent optimization algorithm (SGD, Adagrad, Adadelta, Adam)
-	def set_optimizer(optimizer = "SGD")
-
-	#To set the data traversing rounds
-	def set_train_times(self, times)
-
-	#To split the training triples into several batches, nbatches is the number of batches
-	def set_nbatches(nbatches = 100)
-
-	#To set the margin for the loss function
-	def set_margin(margin = 1.0)
-
-	#To set the dimensions of the entities and relations at the same time
-	def set_dimension(dim)
-
-	#To set the dimensions of the entities
-	def set_ent_dimension(self, dim)
-
-	#To set the dimensions of the relations
-	def set_rel_dimension(self, dim)
-
-	#To allocate threads for each batch sampling
-	def set_work_threads(threads = 1)
-
-	#To set negative sampling algorithms, unif (bern = 0) or bern (bern = 1)
-	def set_bern(bern = 1)
-
-	#For each positive triple, we construct rate negative triples by corrupt the entity
-	def set_ent_neg_rate(rate = 1)
-
-	#For each positive triple, we construct rate negative triples by corrupt the relation
-	def set_rel_neg_rate(rate = 0)
-
-	#To sample a batch of training triples, including positive and negative ones.
-	def sampling()
-
-	#To import dataset from the benchmark folder
-	def set_in_path(self, path)
-
-	#To export model parameters to json files when training completed
-	def set_out_files(self, path)
-
-	#To set the import files, all parameters can be restored from the import files
-	def set_import_files(self, path)
-
-	#To set the export file of model paramters, and export results every few rounds
-	def set_export_files(self, path, steps = 0)
-
-	#To export results every few rounds
-	def set_export_steps(self, steps)
-
-	#To save model via tf.saver
-	def save_tensorflow(self)
-
-	#To restore model via tf.saver
-	def restore_tensorflow(self)
-
-	#To export model paramters, when path is none, equivalent to save_tensorflow()
-	def export_variables(self, path = None)
-
-	#To import model paramters, when path is none, equivalent to restore_tensorflow()
-	def import_variables(self, path = None)
-
-	#To export model paramters to designated path
-	def save_parameters(self, path = None)
-
-	#To manually load parameters which are read from json files
-	def set_parameters(self, lists)
-
-	#To get model paramters, if using mode "numpy", you can get np.array , else you can get python lists
-	def get_parameters(self, mode = "numpy")
-
-	#To set the knowledge embedding model
-	def set_model(model)
-
-	#The framework will print loss values during training if flag = 1
-	def set_log_on(flag = 1)
-
-	#This is essential when testing
-	def set_test_link_prediction(True)
-def set_test_triple_classification(True)
-```
-
-
-### Model
-
-```python
-class Model(object)
-
-	# return config which saves the training parameters.
-	get_config(self)
-
-	# in_batch = True, return [positive_head, positive_tail, positive_relation]
-	# The shape of positive_head is [batch_size, 1]
-	# in_batch = False, return [positive_head, positive_tail, positive_relation]
-	# The shape of positive_head is [batch_size]
-	get_positive_instance(in_batch = True)
-
-	# in_batch = True, return [negative_head, negative_tail, negative_relation]
-	# The shape of positive_head is [batch_size, negative_ent_rate + negative_rel_rate]
-	# in_batch = False, return [negative_head, negative_tail, negative_relation]
-	# The shape of positive_head is [(negative_ent_rate + negative_rel_rate) * batch_size]
-	get_negative_instance(in_batch = True)
-
-	# in_batch = True, return all training instances with the shape [batch_size, (1 + negative_ent_rate + negative_rel_rate)]
-	# in_batch = False, return all training instances with the shape [(negative_ent_rate + negative_rel_rate + 1) * batch_size]
-	def get_all_instance(in_batch = False)
-
-	# in_batch = True, return all training labels with the shape [batch_size, (1 + negative_ent_rate + negative_rel_rate)]
-	# in_batch = False, return all training labels with the shape [(negative_ent_rate + negative_rel_rate + 1) * batch_size]
-	# The positive triples are labeled as 1, and the negative triples are labeled as -1
-	def get_all_labels(in_batch = False)
-
-	# To define containers for training triples
-	def input_def()
-
-	# To define embedding parameters for knowledge embedding models
-	def embedding_def()
-
-	# To define loss functions for knowledge embedding models
-	def loss_def()
-
-	# To define the prediction functions for knowledge embedding models
-	def predict_def(self)
-
-	def __init__(config)
-
-#The implementation for TransE
-class TransE(Model)
-
-#The implementation for TransH
-class TransH(Model)
-
-#The implementation for TransR
-class TransR(Model)
-
-#The implementation for TransD
-class TransD(Model)
-
-#The implementation for RESCAL
-class RESCAL(Model)
-
-#The implementation for DistMult
-class DistMult(Model)
-
-#The implementation for HolE
-class HolE(Model)
-
-#The implementation for ComplEx
-class ComplEx(Model)
-```
+  type_constrain.txt: type constraining file, the first line is the number of relations. Then the following lines are type constraints for each relation. For example, the relation with id 1200 has 4 types of head entities, which are 3123, 1034, 58 and 5733. The relation with id 1200 has 4 types of tail entities, which are 12123, 4388, 11087 and 11088. You can get this file through **n-n.py** in folder benchmarks/FB15K .
diff --git a/seed_embeddings/OpenKE/__init__.py b/seed_embeddings/OpenKE/__init__.py
new file mode 100755
index 000000000..878841c18
--- /dev/null
+++ b/seed_embeddings/OpenKE/__init__.py
@@ -0,0 +1,3 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
diff --git a/seed_embeddings/OpenKE/analogy.py b/seed_embeddings/OpenKE/analogy.py
index b8588b874..effa3cce3 100644
--- a/seed_embeddings/OpenKE/analogy.py
+++ b/seed_embeddings/OpenKE/analogy.py
@@ -3,96 +3,58 @@
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 
-import heapq
-import sys, re
 import numpy as np
-import pandas as pd
-from collections import OrderedDict
-from scipy import spatial
+from sklearn.metrics.pairwise import euclidean_distances
 
 
-def findVec(str1, src):
-    with open(src) as f:
-        content = f.read()
-        # print("searching for ", str1)
-        start = content.upper().find("\n" + str1.upper() + ":[") + len(str1) + 3
-        if start == -1:
-            print(str1, " not found")
-            return
-        else:
-            end = content.find("]", start)
-            vecstr = content[start:end].split(", ")
-            vec = [float(element) for element in vecstr]
-            # print(vec)
-            return vec
+class AnalogyScorer:
+    def __init__(self, analogy_file="analogies.txt"):
+        self.entity_dict = {}
+        self.analogies = self._load_analogies(analogy_file)
 
+    def _load_analogies(self, file_path):
+        with open(file_path, "r") as f:
+            return [tuple(line.strip().split()) for line in f if line.strip()]
 
-def genSimilarityTable(vec, src):
-    # opcVec = findVec(opc, src)
-    with open(src) as f:
-        lines = [line.strip("\n\t") for line in f]
-        cosineDict = {}
-        euclDict = {}
-        for line in lines:
-            opcode = line[0 : line.find(":[")].upper()
-            valueStr = line[line.find(":[") + 2 : -2].split(", ")
-            value = [float(element) for element in valueStr]
-            cosineDict[opcode] = spatial.distance.cosine(vec, value)
-            euclDict[opcode] = spatial.distance.euclidean(vec, value)
-        return cosineDict, euclDict
+    def find_vec(self, str1):
+        return np.array(self.entity_dict.get(str1.upper(), None))
 
+    def gen_similarity_table(self, vec):
+        keys = list(self.entity_dict.keys())
+        entity_matrix = np.array(list(self.entity_dict.values()))
+        vec = vec.reshape(1, -1)
 
-def findTopk(dict1, k, values):
-    # print(sorted(dict.items(), key=lambda x: x[1]))
-    # k_keys_sorted_by_values = heapq.nsmallest(k+1, dict1, key=dict1.get)
-    # topKDict = OrderedDict((keys, dict1[keys]) for keys in k_keys_sorted_by_values)
+        # Calculate distances using euclidean_distances
+        distances = euclidean_distances(vec, entity_matrix)[0]
 
-    sortedByVal = dict(sorted(dict1.items(), key=lambda x: x[1]))
-    # sortedByVal.pop('AND')
-    del sortedByVal[values[0].upper()]
-    del sortedByVal[values[1].upper()]
-    del sortedByVal[values[2].upper()]
-    return {k: sortedByVal[k] for k in list(sortedByVal)[:k]}
+        return dict(zip(keys, distances))
 
+    def findTopk(self, dict1, k, values):
+        sortedByVal = dict(sorted(dict1.items(), key=lambda x: x[1]))
+        del sortedByVal[values[0].upper()]
+        del sortedByVal[values[1].upper()]
+        del sortedByVal[values[2].upper()]
+        return {k: sortedByVal[k] for k in list(sortedByVal)[:k]}
 
-def getAnalogyScore(fileName):
-    refFile = "analogies.txt"
-    with open(refFile) as f:
-        analogies = [line.strip("\n") for line in f]
-        totalCnt = 0
-        fileCorrectCnt = {}
+    def get_analogy_score(self, entity_dict):
+        self.entity_dict = entity_dict
+        total_count = len(self.analogies)
+        correct_count = 0
 
-        avg = []
-        correctCnt = 0
-        for analogy in analogies:
-            totalCnt = totalCnt + 1
-            # values = [val for val in analogy.strip('\t')]
-            values = analogy.split(" ")
-            # print(values)
-            # fileName = argv[0]
+        for values in self.analogies:
+            vecA = self.find_vec(values[0])
+            vecB = self.find_vec(values[1])
+            vecC = self.find_vec(values[2])
 
-            vecA = findVec(values[0], fileName)
-            vecB = findVec(values[1], fileName)
-            vecC = findVec(values[2], fileName)
-            # vecD = np.asarray(vecA) - np.asarray(vecB) + np.asarray(vecC)
-            vecD = np.asarray(vecB) - np.asarray(vecA) + np.asarray(vecC)
+            if vecA is None or vecB is None or vecC is None:
+                print(f"Skipping analogy due to missing vector: {values}")
+                continue
 
-            del vecA
-            del vecB
-            del vecC
+            # Calculate vecD based on the analogy
+            vecD = vecB - vecA + vecC
+            similarity_dict = self.gen_similarity_table(vecD)
+            top_k_dict = self.findTopk(similarity_dict, 5, values)
 
-            # print(vecD)
-            cosineDict, euclDict = genSimilarityTable(vecD, fileName)
-            topKCosineDict = findTopk(cosineDict, 5, values)
-
-            if values[3].upper() in topKCosineDict:
-                correctCnt = correctCnt + 1
-                # print(values, ' : ', '\033[92m' + u'\u2713' + '\033[0m', topKCosineDict[values[3].upper()])
-                avg.append(topKCosineDict[values[3].upper()])
-            else:
-                # print(values, ' : ', '\033[91m' + u'\u00D7' + '\033[0m', topKCosineDict.keys())
-                pass
-            fileCorrectCnt[fileName] = correctCnt
-            # fileCorrectCnt['averagedist_'+fileName] = sum(avg)/len(avg)
-
-        return fileCorrectCnt[fileName]
+            if values[3].upper() in top_k_dict:
+                correct_count += 1
+        return correct_count
diff --git a/seed_embeddings/OpenKE/base/Base.cpp b/seed_embeddings/OpenKE/base/Base.cpp
index c3b0334bc..a1c6adad6 100644
--- a/seed_embeddings/OpenKE/base/Base.cpp
+++ b/seed_embeddings/OpenKE/base/Base.cpp
@@ -3,22 +3,27 @@
 #include "Reader.h"
 #include "Setting.h"
 #include "Test.h"
-#include "Valid.h"
 #include <cstdlib>
 #include <pthread.h>
 
 extern "C" void setInPath(char *path);
 
+extern "C" void setTrainPath(char *path);
+
+extern "C" void setValidPath(char *path);
+
+extern "C" void setTestPath(char *path);
+
+extern "C" void setEntPath(char *path);
+
+extern "C" void setRelPath(char *path);
+
 extern "C" void setOutPath(char *path);
 
 extern "C" void setWorkThreads(INT threads);
 
 extern "C" void setBern(INT con);
 
-extern "C" void setHeadTailCrossSampling(INT con);
-
-extern "C" bool judgeHeadBatch();
-
 extern "C" INT getWorkThreads();
 
 extern "C" INT getEntityTotal();
@@ -46,7 +51,10 @@ struct Parameter {
   INT batchSize;
   INT negRate;
   INT negRelRate;
-  INT headBatchFlag;
+  bool p;
+  bool val_loss;
+  INT mode;
+  bool filter_flag;
 };
 
 void *getBatch(void *con) {
@@ -59,7 +67,10 @@ void *getBatch(void *con) {
   INT batchSize = para->batchSize;
   INT negRate = para->negRate;
   INT negRelRate = para->negRelRate;
-  INT headBatchFlag = para->headBatchFlag;
+  bool p = para->p;
+  bool val_loss = para->val_loss;
+  INT mode = para->mode;
+  bool filter_flag = para->filter_flag;
   INT lef, rig;
   if (batchSize % workThreads == 0) {
     lef = id * (batchSize / workThreads);
@@ -71,54 +82,63 @@ void *getBatch(void *con) {
       rig = batchSize;
   }
   REAL prob = 500;
-  for (INT batch = lef; batch < rig; batch++) {
-    INT i = rand_max(id, trainTotal);
-    batch_h[batch] = trainList[i].h;
-    batch_t[batch] = trainList[i].t;
-    batch_r[batch] = trainList[i].r;
-    batch_y[batch] = 1;
-    INT last = batchSize;
-    for (INT times = 0; times < negRate; times++) {
-      if (!crossSamplingFlag) {
-        if (bernFlag)
-          prob = 1000 * right_mean[trainList[i].r] /
-                 (right_mean[trainList[i].r] + left_mean[trainList[i].r]);
-        if (randd(id) % 1000 < prob) {
-          batch_h[batch + last] = trainList[i].h;
-          batch_t[batch + last] =
-              corrupt_head(id, trainList[i].h, trainList[i].r);
-          batch_r[batch + last] = trainList[i].r;
+  if (val_loss == false) {
+    for (INT batch = lef; batch < rig; batch++) {
+      INT i = rand_max(id, trainTotal);
+      batch_h[batch] = trainList[i].h;
+      batch_t[batch] = trainList[i].t;
+      batch_r[batch] = trainList[i].r;
+      batch_y[batch] = 1;
+      INT last = batchSize;
+      for (INT times = 0; times < negRate; times++) {
+        if (mode == 0) {
+          if (bernFlag)
+            prob = 1000 * right_mean[trainList[i].r] /
+                   (right_mean[trainList[i].r] + left_mean[trainList[i].r]);
+          if (randd(id) % 1000 < prob) {
+            batch_h[batch + last] = trainList[i].h;
+            batch_t[batch + last] =
+                corrupt_head(id, trainList[i].h, trainList[i].r);
+            batch_r[batch + last] = trainList[i].r;
+          } else {
+            batch_h[batch + last] =
+                corrupt_tail(id, trainList[i].t, trainList[i].r);
+            batch_t[batch + last] = trainList[i].t;
+            batch_r[batch + last] = trainList[i].r;
+          }
+          batch_y[batch + last] = -1;
+          last += batchSize;
         } else {
-          batch_h[batch + last] =
-              corrupt_tail(id, trainList[i].t, trainList[i].r);
-          ;
-          batch_t[batch + last] = trainList[i].t;
-          batch_r[batch + last] = trainList[i].r;
-        }
-        batch_y[batch + last] = -1;
-        last += batchSize;
-      } else {
-        if (headBatchFlag) {
-          batch_h[batch + last] =
-              corrupt_tail(id, trainList[i].t, trainList[i].r);
-          batch_t[batch + last] = trainList[i].t;
-          batch_r[batch + last] = trainList[i].r;
-        } else {
-          batch_h[batch + last] = trainList[i].h;
-          batch_t[batch + last] =
-              corrupt_head(id, trainList[i].h, trainList[i].r);
-          batch_r[batch + last] = trainList[i].r;
+          if (mode == -1) {
+            batch_h[batch + last] =
+                corrupt_tail(id, trainList[i].t, trainList[i].r);
+            batch_t[batch + last] = trainList[i].t;
+            batch_r[batch + last] = trainList[i].r;
+          } else {
+            batch_h[batch + last] = trainList[i].h;
+            batch_t[batch + last] =
+                corrupt_head(id, trainList[i].h, trainList[i].r);
+            batch_r[batch + last] = trainList[i].r;
+          }
+          batch_y[batch + last] = -1;
+          last += batchSize;
         }
+      }
+      for (INT times = 0; times < negRelRate; times++) {
+        batch_h[batch + last] = trainList[i].h;
+        batch_t[batch + last] = trainList[i].t;
+        batch_r[batch + last] =
+            corrupt_rel(id, trainList[i].h, trainList[i].t, trainList[i].r, p);
         batch_y[batch + last] = -1;
         last += batchSize;
       }
     }
-    for (INT times = 0; times < negRelRate; times++) {
-      batch_h[batch + last] = trainList[i].h;
-      batch_t[batch + last] = trainList[i].t;
-      batch_r[batch + last] = corrupt_rel(id, trainList[i].h, trainList[i].t);
-      batch_y[batch + last] = -1;
-      last += batchSize;
+  } else {
+    for (INT batch = lef; batch < rig; batch++) {
+      batch_h[batch] = validList[batch].h;
+      batch_t[batch] = validList[batch].t;
+      batch_r[batch] = validList[batch].r;
+      batch_y[batch] = 1;
     }
   }
   pthread_exit(NULL);
@@ -126,7 +146,9 @@ void *getBatch(void *con) {
 
 extern "C" void sampling(INT *batch_h, INT *batch_t, INT *batch_r,
                          REAL *batch_y, INT batchSize, INT negRate = 1,
-                         INT negRelRate = 0, INT headBatchFlag = 0) {
+                         INT negRelRate = 0, INT mode = 0,
+                         bool filter_flag = true, bool p = false,
+                         bool val_loss = false) {
   pthread_t *pt = (pthread_t *)malloc(workThreads * sizeof(pthread_t));
   Parameter *para = (Parameter *)malloc(workThreads * sizeof(Parameter));
   for (INT threads = 0; threads < workThreads; threads++) {
@@ -138,11 +160,15 @@ extern "C" void sampling(INT *batch_h, INT *batch_t, INT *batch_r,
     para[threads].batchSize = batchSize;
     para[threads].negRate = negRate;
     para[threads].negRelRate = negRelRate;
-    para[threads].headBatchFlag = headBatchFlag;
+    para[threads].p = p;
+    para[threads].val_loss = val_loss;
+    para[threads].mode = mode;
+    para[threads].filter_flag = filter_flag;
     pthread_create(&pt[threads], NULL, getBatch, (void *)(para + threads));
   }
   for (INT threads = 0; threads < workThreads; threads++)
     pthread_join(pt[threads], NULL);
+
   free(pt);
   free(para);
 }
diff --git a/seed_embeddings/OpenKE/base/Corrupt.h b/seed_embeddings/OpenKE/base/Corrupt.h
index 586970d37..7482e1a3a 100644
--- a/seed_embeddings/OpenKE/base/Corrupt.h
+++ b/seed_embeddings/OpenKE/base/Corrupt.h
@@ -4,8 +4,15 @@
 #include "Reader.h"
 #include "Triple.h"
 
-INT corrupt_head(INT id, INT h, INT r) {
+INT corrupt_head(INT id, INT h, INT r, bool filter_flag = true) {
   INT lef, rig, mid, ll, rr;
+  if (not filter_flag) {
+    INT tmp = rand_max(id, entityTotal - 1);
+    if (tmp < h)
+      return tmp;
+    else
+      return tmp + 1;
+  }
   lef = lefHead[h] - 1;
   rig = rigHead[h];
   while (lef + 1 < rig) {
@@ -42,8 +49,15 @@ INT corrupt_head(INT id, INT h, INT r) {
   return tmp + lef - ll + 1;
 }
 
-INT corrupt_tail(INT id, INT t, INT r) {
+INT corrupt_tail(INT id, INT t, INT r, bool filter_flag = true) {
   INT lef, rig, mid, ll, rr;
+  if (not filter_flag) {
+    INT tmp = rand_max(id, entityTotal - 1);
+    if (tmp < t)
+      return tmp;
+    else
+      return tmp + 1;
+  }
   lef = lefTail[t] - 1;
   rig = rigTail[t];
   while (lef + 1 < rig) {
@@ -80,8 +94,16 @@ INT corrupt_tail(INT id, INT t, INT r) {
   return tmp + lef - ll + 1;
 }
 
-INT corrupt_rel(INT id, INT h, INT t) {
+INT corrupt_rel(INT id, INT h, INT t, INT r, bool p = false,
+                bool filter_flag = true) {
   INT lef, rig, mid, ll, rr;
+  if (not filter_flag) {
+    INT tmp = rand_max(id, relationTotal - 1);
+    if (tmp < r)
+      return tmp;
+    else
+      return tmp + 1;
+  }
   lef = lefRel[h] - 1;
   rig = rigRel[h];
   while (lef + 1 < rig) {
@@ -102,7 +124,46 @@ INT corrupt_rel(INT id, INT h, INT t) {
       rig = mid;
   }
   rr = lef;
-  INT tmp = rand_max(id, relationTotal - (rr - ll + 1));
+  INT tmp;
+  if (p == false) {
+    tmp = rand_max(id, relationTotal - (rr - ll + 1));
+  } else {
+    INT start = r * (relationTotal - 1);
+    REAL sum = 1;
+    bool *record = (bool *)calloc(relationTotal - 1, sizeof(bool));
+    for (INT i = ll; i <= rr; ++i) {
+      if (trainRel[i].r > r) {
+        sum -= prob[start + trainRel[i].r - 1];
+        record[trainRel[i].r - 1] = true;
+      } else if (trainRel[i].r < r) {
+        sum -= prob[start + trainRel[i].r];
+        record[trainRel[i].r] = true;
+      }
+    }
+    REAL *prob_tmp =
+        (REAL *)calloc(relationTotal - (rr - ll + 1), sizeof(REAL));
+    INT cnt = 0;
+    REAL rec = 0;
+    for (INT i = start; i < start + relationTotal - 1; ++i) {
+      if (record[i - start])
+        continue;
+      rec += prob[i] / sum;
+      prob_tmp[cnt++] = rec;
+    }
+    REAL m = rand_max(id, 10000) / 10000.0;
+    lef = 0;
+    rig = cnt - 1;
+    while (lef < rig) {
+      mid = (lef + rig) >> 1;
+      if (prob_tmp[mid] < m)
+        lef = mid + 1;
+      else
+        rig = mid;
+    }
+    tmp = rig;
+    free(prob_tmp);
+    free(record);
+  }
   if (tmp < trainRel[ll].r)
     return tmp;
   if (tmp > trainRel[rr].r - rr + ll - 1)
@@ -146,15 +207,13 @@ INT corrupt(INT h, INT r) {
   INT rr = tail_rig[r];
   INT loop = 0;
   INT t;
-  while (1) {
+  while (true) {
     t = tail_type[rand(ll, rr)];
     if (not _find(h, t, r)) {
-      //	printf("r:%ld\tt:%ld\n", r, t);
       return t;
     } else {
       loop++;
       if (loop >= 1000) {
-        //	printf("drop\n");
         return corrupt_head(0, h, r);
       }
     }
diff --git a/seed_embeddings/OpenKE/base/Random.h b/seed_embeddings/OpenKE/base/Random.h
index 78d63a8ef..61681dce6 100644
--- a/seed_embeddings/OpenKE/base/Random.h
+++ b/seed_embeddings/OpenKE/base/Random.h
@@ -3,8 +3,10 @@
 #include "Setting.h"
 #include <cstdlib>
 
+// the random seeds for all threads.
 unsigned long long *next_random;
 
+// reset the random seeds for all threads
 extern "C" void randReset() {
   next_random =
       (unsigned long long *)calloc(workThreads, sizeof(unsigned long long));
@@ -12,11 +14,14 @@ extern "C" void randReset() {
     next_random[i] = rand();
 }
 
+// get a random interger for the id-th thread with the corresponding random
+// seed.
 unsigned long long randd(INT id) {
-  next_random[id] = next_random[id] * (unsigned long long)25214903917 + 11;
+  next_random[id] = next_random[id] * (unsigned long long)(25214903917) + 11;
   return next_random[id];
 }
 
+// get a random interger from the range [0,x) for the id-th thread.
 INT rand_max(INT id, INT x) {
   INT res = randd(id) % x;
   while (res < 0)
@@ -24,6 +29,6 @@ INT rand_max(INT id, INT x) {
   return res;
 }
 
-//[a,b)
+// get a random interger from the range [a,b) for the id-th thread.
 INT rand(INT a, INT b) { return (rand() % (b - a)) + a; }
 #endif
diff --git a/seed_embeddings/OpenKE/base/Reader.h b/seed_embeddings/OpenKE/base/Reader.h
index 45bb797b9..58d1023c2 100644
--- a/seed_embeddings/OpenKE/base/Reader.h
+++ b/seed_embeddings/OpenKE/base/Reader.h
@@ -3,6 +3,7 @@
 #include "Setting.h"
 #include "Triple.h"
 #include <algorithm>
+#include <cmath>
 #include <cstdlib>
 #include <iostream>
 
@@ -11,6 +12,7 @@ INT *lefHead, *rigHead;
 INT *lefTail, *rigTail;
 INT *lefRel, *rigRel;
 REAL *left_mean, *right_mean;
+REAL *prob;
 
 Triple *trainList;
 Triple *trainHead;
@@ -20,44 +22,58 @@ Triple *trainRel;
 INT *testLef, *testRig;
 INT *validLef, *validRig;
 
+extern "C" void importProb(REAL temp) {
+  if (prob != NULL)
+    free(prob);
+  FILE *fin;
+  fin = fopen((inPath + "kl_prob.txt").c_str(), "r");
+  printf("Current temperature:%f\n", temp);
+  prob = (REAL *)calloc(relationTotal * (relationTotal - 1), sizeof(REAL));
+  INT tmp;
+  for (INT i = 0; i < relationTotal * (relationTotal - 1); ++i) {
+    tmp = fscanf(fin, "%f", &prob[i]);
+  }
+  REAL sum = 0.0;
+  for (INT i = 0; i < relationTotal; ++i) {
+    for (INT j = 0; j < relationTotal - 1; ++j) {
+      REAL tmp = exp(-prob[i * (relationTotal - 1) + j] / temp);
+      sum += tmp;
+      prob[i * (relationTotal - 1) + j] = tmp;
+    }
+    for (INT j = 0; j < relationTotal - 1; ++j) {
+      prob[i * (relationTotal - 1) + j] /= sum;
+    }
+    sum = 0;
+  }
+  fclose(fin);
+}
+
 extern "C" void importTrainFiles() {
 
   printf("The toolkit is importing datasets.\n");
   FILE *fin;
   int tmp;
 
-  fin = fopen((inPath + "relation2id.txt").c_str(), "r");
-
-  if (fin == nullptr) {
-    std::cout << '`' << inPath << "relation2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
+  if (rel_file == "")
+    fin = fopen((inPath + "relation2id.txt").c_str(), "r");
+  else
+    fin = fopen(rel_file.c_str(), "r");
   tmp = fscanf(fin, "%ld", &relationTotal);
   printf("The total of relations is %ld.\n", relationTotal);
   fclose(fin);
 
-  fin = fopen((inPath + "entity2id.txt").c_str(), "r");
-
-  if (fin == nullptr) {
-    std::cout << '`' << inPath << "entity2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
+  if (ent_file == "")
+    fin = fopen((inPath + "entity2id.txt").c_str(), "r");
+  else
+    fin = fopen(ent_file.c_str(), "r");
   tmp = fscanf(fin, "%ld", &entityTotal);
   printf("The total of entities is %ld.\n", entityTotal);
   fclose(fin);
 
-  fin = fopen((inPath + "train2id.txt").c_str(), "r");
-
-  if (fin == nullptr) {
-    std::cout << '`' << inPath << "train2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
+  if (train_file == "")
+    fin = fopen((inPath + "train2id.txt").c_str(), "r");
+  else
+    fin = fopen(train_file.c_str(), "r");
   tmp = fscanf(fin, "%ld", &trainTotal);
   trainList = (Triple *)calloc(trainTotal, sizeof(Triple));
   trainHead = (Triple *)calloc(trainTotal, sizeof(Triple));
@@ -153,48 +169,33 @@ extern "C" void importTestFiles() {
   FILE *fin;
   INT tmp;
 
-  fin = fopen((inPath + "relation2id.txt").c_str(), "r");
-  if (fin == nullptr) {
-    std::cout << '`' << inPath << "relation2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
+  if (rel_file == "")
+    fin = fopen((inPath + "relation2id.txt").c_str(), "r");
+  else
+    fin = fopen(rel_file.c_str(), "r");
   tmp = fscanf(fin, "%ld", &relationTotal);
   fclose(fin);
 
-  fin = fopen((inPath + "entity2id.txt").c_str(), "r");
-  if (fin == nullptr) {
-    std::cout << '`' << inPath << "entity2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
+  if (ent_file == "")
+    fin = fopen((inPath + "entity2id.txt").c_str(), "r");
+  else
+    fin = fopen(ent_file.c_str(), "r");
   tmp = fscanf(fin, "%ld", &entityTotal);
   fclose(fin);
 
-  FILE *f_kb1 = fopen((inPath + "test2id.txt").c_str(), "r");
-
-  if (f_kb1 == nullptr) {
-    std::cout << '`' << inPath << "test2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
-  FILE *f_kb2 = fopen((inPath + "train2id.txt").c_str(), "r");
-  if (f_kb2 == nullptr) {
-    std::cout << '`' << inPath << "train2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
-  FILE *f_kb3 = fopen((inPath + "valid2id.txt").c_str(), "r");
-  if (f_kb3 == nullptr) {
-    std::cout << '`' << inPath << "valid2id.txt" << '`' << " does not exist"
-              << std::endl;
-    return;
-  }
-
+  FILE *f_kb1, *f_kb2, *f_kb3;
+  if (train_file == "")
+    f_kb2 = fopen((inPath + "train2id.txt").c_str(), "r");
+  else
+    f_kb2 = fopen(train_file.c_str(), "r");
+  if (test_file == "")
+    f_kb1 = fopen((inPath + "test2id.txt").c_str(), "r");
+  else
+    f_kb1 = fopen(test_file.c_str(), "r");
+  if (valid_file == "")
+    f_kb3 = fopen((inPath + "valid2id.txt").c_str(), "r");
+  else
+    f_kb3 = fopen(valid_file.c_str(), "r");
   tmp = fscanf(f_kb1, "%ld", &testTotal);
   tmp = fscanf(f_kb2, "%ld", &trainTotal);
   tmp = fscanf(f_kb3, "%ld", &validTotal);
@@ -264,21 +265,14 @@ INT *head_type;
 INT *tail_type;
 
 extern "C" void importTypeFiles() {
+
   head_lef = (INT *)calloc(relationTotal, sizeof(INT));
   head_rig = (INT *)calloc(relationTotal, sizeof(INT));
   tail_lef = (INT *)calloc(relationTotal, sizeof(INT));
   tail_rig = (INT *)calloc(relationTotal, sizeof(INT));
-
   INT total_lef = 0;
   INT total_rig = 0;
   FILE *f_type = fopen((inPath + "type_constrain.txt").c_str(), "r");
-
-  if (f_type == nullptr) {
-    std::cout << '`' << inPath << "type_constrain.txt" << '`'
-              << " does not exist" << std::endl;
-    return;
-  }
-
   INT tmp;
   tmp = fscanf(f_type, "%ld", &tmp);
   for (INT i = 0; i < relationTotal; i++) {
@@ -295,19 +289,11 @@ extern "C" void importTypeFiles() {
     }
   }
   fclose(f_type);
-
   head_type = (INT *)calloc(total_lef, sizeof(INT));
   tail_type = (INT *)calloc(total_rig, sizeof(INT));
   total_lef = 0;
   total_rig = 0;
   f_type = fopen((inPath + "type_constrain.txt").c_str(), "r");
-
-  if (f_type == nullptr) {
-    std::cout << '`' << inPath << "type_constrain.txt" << '`'
-              << " does not exist" << std::endl;
-    return;
-  }
-
   tmp = fscanf(f_type, "%ld", &tmp);
   for (INT i = 0; i < relationTotal; i++) {
     INT rel, tot;
diff --git a/seed_embeddings/OpenKE/base/Setting.h b/seed_embeddings/OpenKE/base/Setting.h
index 59ee23ac5..5fe757400 100644
--- a/seed_embeddings/OpenKE/base/Setting.h
+++ b/seed_embeddings/OpenKE/base/Setting.h
@@ -8,6 +8,11 @@
 
 std::string inPath = "../data/FB15K/";
 std::string outPath = "../data/FB15K/";
+std::string ent_file = "";
+std::string rel_file = "";
+std::string train_file = "";
+std::string valid_file = "";
+std::string test_file = "";
 
 extern "C" void setInPath(char *path) {
   INT len = strlen(path);
@@ -25,6 +30,46 @@ extern "C" void setOutPath(char *path) {
   printf("Output Files Path : %s\n", outPath.c_str());
 }
 
+extern "C" void setTrainPath(char *path) {
+  INT len = strlen(path);
+  train_file = "";
+  for (INT i = 0; i < len; i++)
+    train_file = train_file + path[i];
+  printf("Training Files Path : %s\n", train_file.c_str());
+}
+
+extern "C" void setValidPath(char *path) {
+  INT len = strlen(path);
+  valid_file = "";
+  for (INT i = 0; i < len; i++)
+    valid_file = valid_file + path[i];
+  printf("Valid Files Path : %s\n", valid_file.c_str());
+}
+
+extern "C" void setTestPath(char *path) {
+  INT len = strlen(path);
+  test_file = "";
+  for (INT i = 0; i < len; i++)
+    test_file = test_file + path[i];
+  printf("Test Files Path : %s\n", test_file.c_str());
+}
+
+extern "C" void setEntPath(char *path) {
+  INT len = strlen(path);
+  ent_file = "";
+  for (INT i = 0; i < len; i++)
+    ent_file = ent_file + path[i];
+  printf("Entity Files Path : %s\n", ent_file.c_str());
+}
+
+extern "C" void setRelPath(char *path) {
+  INT len = strlen(path);
+  rel_file = "";
+  for (INT i = 0; i < len; i++)
+    rel_file = rel_file + path[i];
+  printf("Relation Files Path : %s\n", rel_file.c_str());
+}
+
 /*
 ============================================================
 */
@@ -62,10 +107,7 @@ extern "C" INT getValidTotal() { return validTotal; }
 */
 
 INT bernFlag = 0;
-INT crossSamplingFlag = 0;
 
 extern "C" void setBern(INT con) { bernFlag = con; }
 
-extern "C" void setHeadTailCrossSampling(INT con) { crossSamplingFlag = con; }
-
 #endif
diff --git a/seed_embeddings/OpenKE/base/Test.h b/seed_embeddings/OpenKE/base/Test.h
index 03ff08b38..04d903a0d 100644
--- a/seed_embeddings/OpenKE/base/Test.h
+++ b/seed_embeddings/OpenKE/base/Test.h
@@ -9,12 +9,16 @@ link prediction
 ======================================================================================*/
 INT lastHead = 0;
 INT lastTail = 0;
+INT lastRel = 0;
 REAL l1_filter_tot = 0, l1_tot = 0, r1_tot = 0, r1_filter_tot = 0, l_tot = 0,
      r_tot = 0, l_filter_rank = 0, l_rank = 0, l_filter_reci_rank = 0,
      l_reci_rank = 0;
 REAL l3_filter_tot = 0, l3_tot = 0, r3_tot = 0, r3_filter_tot = 0,
      l_filter_tot = 0, r_filter_tot = 0, r_filter_rank = 0, r_rank = 0,
      r_filter_reci_rank = 0, r_reci_rank = 0;
+REAL rel3_tot = 0, rel3_filter_tot = 0, rel_filter_tot = 0, rel_filter_rank = 0,
+     rel_rank = 0, rel_filter_reci_rank = 0, rel_reci_rank = 0, rel_tot = 0,
+     rel1_tot = 0, rel1_filter_tot = 0;
 
 REAL l1_filter_tot_constrain = 0, l1_tot_constrain = 0, r1_tot_constrain = 0,
      r1_filter_tot_constrain = 0, l_tot_constrain = 0, r_tot_constrain = 0,
@@ -25,16 +29,22 @@ REAL l3_filter_tot_constrain = 0, l3_tot_constrain = 0, r3_tot_constrain = 0,
      r_filter_tot_constrain = 0, r_filter_rank_constrain = 0,
      r_rank_constrain = 0, r_filter_reci_rank_constrain = 0,
      r_reci_rank_constrain = 0;
+REAL hit1, hit3, hit10, mr, mrr;
+REAL hit1TC, hit3TC, hit10TC, mrTC, mrrTC;
 
 extern "C" void initTest() {
   lastHead = 0;
   lastTail = 0;
+  lastRel = 0;
   l1_filter_tot = 0, l1_tot = 0, r1_tot = 0, r1_filter_tot = 0, l_tot = 0,
   r_tot = 0, l_filter_rank = 0, l_rank = 0, l_filter_reci_rank = 0,
   l_reci_rank = 0;
   l3_filter_tot = 0, l3_tot = 0, r3_tot = 0, r3_filter_tot = 0,
   l_filter_tot = 0, r_filter_tot = 0, r_filter_rank = 0, r_rank = 0,
   r_filter_reci_rank = 0, r_reci_rank = 0;
+  REAL rel3_tot = 0, rel3_filter_tot = 0, rel_filter_tot = 0,
+       rel_filter_rank = 0, rel_rank = 0, rel_filter_reci_rank = 0,
+       rel_reci_rank = 0, rel_tot = 0, rel1_tot = 0, rel1_filter_tot = 0;
 
   l1_filter_tot_constrain = 0, l1_tot_constrain = 0, r1_tot_constrain = 0,
   r1_filter_tot_constrain = 0, l_tot_constrain = 0, r_tot_constrain = 0,
@@ -52,6 +62,7 @@ extern "C" void getHeadBatch(INT *ph, INT *pt, INT *pr) {
     pt[i] = testList[lastHead].t;
     pr[i] = testList[lastHead].r;
   }
+  lastHead++;
 }
 
 extern "C" void getTailBatch(INT *ph, INT *pt, INT *pr) {
@@ -60,14 +71,26 @@ extern "C" void getTailBatch(INT *ph, INT *pt, INT *pr) {
     pt[i] = i;
     pr[i] = testList[lastTail].r;
   }
+  lastTail++;
+}
+
+extern "C" void getRelBatch(INT *ph, INT *pt, INT *pr) {
+  for (INT i = 0; i < relationTotal; i++) {
+    ph[i] = testList[lastRel].h;
+    pt[i] = testList[lastRel].t;
+    pr[i] = i;
+  }
 }
 
-extern "C" void testHead(REAL *con) {
+extern "C" void testHead(REAL *con, INT lastHead, bool type_constrain = false) {
   INT h = testList[lastHead].h;
   INT t = testList[lastHead].t;
   INT r = testList[lastHead].r;
-  INT lef = head_lef[r], rig = head_rig[r];
-
+  INT lef, rig;
+  if (type_constrain) {
+    lef = head_lef[r];
+    rig = head_rig[r];
+  }
   REAL minimal = con[h];
   INT l_s = 0;
   INT l_filter_s = 0;
@@ -82,13 +105,15 @@ extern "C" void testHead(REAL *con) {
         if (not _find(j, t, r))
           l_filter_s += 1;
       }
-      while (lef < rig && head_type[lef] < j)
-        lef++;
-      if (lef < rig && j == head_type[lef]) {
-        if (value < minimal) {
-          l_s_constrain += 1;
-          if (not _find(j, t, r)) {
-            l_filter_s_constrain += 1;
+      if (type_constrain) {
+        while (lef < rig && head_type[lef] < j)
+          lef++;
+        if (lef < rig && j == head_type[lef]) {
+          if (value < minimal) {
+            l_s_constrain += 1;
+            if (not _find(j, t, r)) {
+              l_filter_s_constrain += 1;
+            }
           }
         }
       }
@@ -108,37 +133,41 @@ extern "C" void testHead(REAL *con) {
   if (l_s < 1)
     l1_tot += 1;
 
-  if (l_filter_s_constrain < 10)
-    l_filter_tot_constrain += 1;
-  if (l_s_constrain < 10)
-    l_tot_constrain += 1;
-  if (l_filter_s_constrain < 3)
-    l3_filter_tot_constrain += 1;
-  if (l_s_constrain < 3)
-    l3_tot_constrain += 1;
-  if (l_filter_s_constrain < 1)
-    l1_filter_tot_constrain += 1;
-  if (l_s_constrain < 1)
-    l1_tot_constrain += 1;
-
   l_filter_rank += (l_filter_s + 1);
   l_rank += (1 + l_s);
   l_filter_reci_rank += 1.0 / (l_filter_s + 1);
   l_reci_rank += 1.0 / (l_s + 1);
 
-  l_filter_rank_constrain += (l_filter_s_constrain + 1);
-  l_rank_constrain += (1 + l_s_constrain);
-  l_filter_reci_rank_constrain += 1.0 / (l_filter_s_constrain + 1);
-  l_reci_rank_constrain += 1.0 / (l_s_constrain + 1);
-
-  lastHead++;
+  if (type_constrain) {
+    if (l_filter_s_constrain < 10)
+      l_filter_tot_constrain += 1;
+    if (l_s_constrain < 10)
+      l_tot_constrain += 1;
+    if (l_filter_s_constrain < 3)
+      l3_filter_tot_constrain += 1;
+    if (l_s_constrain < 3)
+      l3_tot_constrain += 1;
+    if (l_filter_s_constrain < 1)
+      l1_filter_tot_constrain += 1;
+    if (l_s_constrain < 1)
+      l1_tot_constrain += 1;
+
+    l_filter_rank_constrain += (l_filter_s_constrain + 1);
+    l_rank_constrain += (1 + l_s_constrain);
+    l_filter_reci_rank_constrain += 1.0 / (l_filter_s_constrain + 1);
+    l_reci_rank_constrain += 1.0 / (l_s_constrain + 1);
+  }
 }
 
-extern "C" void testTail(REAL *con) {
+extern "C" void testTail(REAL *con, INT lastTail, bool type_constrain = false) {
   INT h = testList[lastTail].h;
   INT t = testList[lastTail].t;
   INT r = testList[lastTail].r;
-  INT lef = tail_lef[r], rig = tail_rig[r];
+  INT lef, rig;
+  if (type_constrain) {
+    lef = tail_lef[r];
+    rig = tail_rig[r];
+  }
   REAL minimal = con[t];
   INT r_s = 0;
   INT r_filter_s = 0;
@@ -152,13 +181,15 @@ extern "C" void testTail(REAL *con) {
         if (not _find(h, j, r))
           r_filter_s += 1;
       }
-      while (lef < rig && tail_type[lef] < j)
-        lef++;
-      if (lef < rig && j == tail_type[lef]) {
-        if (value < minimal) {
-          r_s_constrain += 1;
-          if (not _find(h, j, r)) {
-            r_filter_s_constrain += 1;
+      if (type_constrain) {
+        while (lef < rig && tail_type[lef] < j)
+          lef++;
+        if (lef < rig && j == tail_type[lef]) {
+          if (value < minimal) {
+            r_s_constrain += 1;
+            if (not _find(h, j, r)) {
+              r_filter_s_constrain += 1;
+            }
           }
         }
       }
@@ -178,33 +209,74 @@ extern "C" void testTail(REAL *con) {
   if (r_s < 1)
     r1_tot += 1;
 
-  if (r_filter_s_constrain < 10)
-    r_filter_tot_constrain += 1;
-  if (r_s_constrain < 10)
-    r_tot_constrain += 1;
-  if (r_filter_s_constrain < 3)
-    r3_filter_tot_constrain += 1;
-  if (r_s_constrain < 3)
-    r3_tot_constrain += 1;
-  if (r_filter_s_constrain < 1)
-    r1_filter_tot_constrain += 1;
-  if (r_s_constrain < 1)
-    r1_tot_constrain += 1;
-
   r_filter_rank += (1 + r_filter_s);
   r_rank += (1 + r_s);
   r_filter_reci_rank += 1.0 / (1 + r_filter_s);
   r_reci_rank += 1.0 / (1 + r_s);
 
-  r_filter_rank_constrain += (1 + r_filter_s_constrain);
-  r_rank_constrain += (1 + r_s_constrain);
-  r_filter_reci_rank_constrain += 1.0 / (1 + r_filter_s_constrain);
-  r_reci_rank_constrain += 1.0 / (1 + r_s_constrain);
+  if (type_constrain) {
+    if (r_filter_s_constrain < 10)
+      r_filter_tot_constrain += 1;
+    if (r_s_constrain < 10)
+      r_tot_constrain += 1;
+    if (r_filter_s_constrain < 3)
+      r3_filter_tot_constrain += 1;
+    if (r_s_constrain < 3)
+      r3_tot_constrain += 1;
+    if (r_filter_s_constrain < 1)
+      r1_filter_tot_constrain += 1;
+    if (r_s_constrain < 1)
+      r1_tot_constrain += 1;
+
+    r_filter_rank_constrain += (1 + r_filter_s_constrain);
+    r_rank_constrain += (1 + r_s_constrain);
+    r_filter_reci_rank_constrain += 1.0 / (1 + r_filter_s_constrain);
+    r_reci_rank_constrain += 1.0 / (1 + r_s_constrain);
+  }
+}
 
-  lastTail++;
+extern "C" void testRel(REAL *con) {
+  INT h = testList[lastRel].h;
+  INT t = testList[lastRel].t;
+  INT r = testList[lastRel].r;
+
+  REAL minimal = con[r];
+  INT rel_s = 0;
+  INT rel_filter_s = 0;
+
+  for (INT j = 0; j < relationTotal; j++) {
+    if (j != r) {
+      REAL value = con[j];
+      if (value < minimal) {
+        rel_s += 1;
+        if (not _find(h, t, j))
+          rel_filter_s += 1;
+      }
+    }
+  }
+
+  if (rel_filter_s < 10)
+    rel_filter_tot += 1;
+  if (rel_s < 10)
+    rel_tot += 1;
+  if (rel_filter_s < 3)
+    rel3_filter_tot += 1;
+  if (rel_s < 3)
+    rel3_tot += 1;
+  if (rel_filter_s < 1)
+    rel1_filter_tot += 1;
+  if (rel_s < 1)
+    rel1_tot += 1;
+
+  rel_filter_rank += (rel_filter_s + 1);
+  rel_rank += (1 + rel_s);
+  rel_filter_reci_rank += 1.0 / (rel_filter_s + 1);
+  rel_reci_rank += 1.0 / (rel_s + 1);
+
+  lastRel++;
 }
 
-extern "C" void test_link_prediction() {
+extern "C" void test_link_prediction(bool type_constrain = false) {
   l_rank /= testTotal;
   r_rank /= testTotal;
   l_reci_rank /= testTotal;
@@ -253,82 +325,152 @@ extern "C" void test_link_prediction() {
          (l3_filter_tot + r3_filter_tot) / 2,
          (l1_filter_tot + r1_filter_tot) / 2);
 
-  // type constrain
-  l_rank_constrain /= testTotal;
-  r_rank_constrain /= testTotal;
-  l_reci_rank_constrain /= testTotal;
-  r_reci_rank_constrain /= testTotal;
+  mrr = (l_filter_reci_rank + r_filter_reci_rank) / 2;
+  mr = (l_filter_rank + r_filter_rank) / 2;
+  hit10 = (l_filter_tot + r_filter_tot) / 2;
+  hit3 = (l3_filter_tot + r3_filter_tot) / 2;
+  hit1 = (l1_filter_tot + r1_filter_tot) / 2;
+
+  if (type_constrain) {
+    // type constrain
+    l_rank_constrain /= testTotal;
+    r_rank_constrain /= testTotal;
+    l_reci_rank_constrain /= testTotal;
+    r_reci_rank_constrain /= testTotal;
+
+    l_tot_constrain /= testTotal;
+    l3_tot_constrain /= testTotal;
+    l1_tot_constrain /= testTotal;
+
+    r_tot_constrain /= testTotal;
+    r3_tot_constrain /= testTotal;
+    r1_tot_constrain /= testTotal;
+
+    // with filter
+    l_filter_rank_constrain /= testTotal;
+    r_filter_rank_constrain /= testTotal;
+    l_filter_reci_rank_constrain /= testTotal;
+    r_filter_reci_rank_constrain /= testTotal;
+
+    l_filter_tot_constrain /= testTotal;
+    l3_filter_tot_constrain /= testTotal;
+    l1_filter_tot_constrain /= testTotal;
+
+    r_filter_tot_constrain /= testTotal;
+    r3_filter_tot_constrain /= testTotal;
+    r1_filter_tot_constrain /= testTotal;
+
+    printf("type constraint results:\n");
+
+    printf("metric:\t\t\t MRR \t\t MR \t\t hit@10 \t hit@3  \t hit@1 \n");
+    printf("l(raw):\t\t\t %f \t %f \t %f \t %f \t %f \n", l_reci_rank_constrain,
+           l_rank_constrain, l_tot_constrain, l3_tot_constrain,
+           l1_tot_constrain);
+    printf("r(raw):\t\t\t %f \t %f \t %f \t %f \t %f \n", r_reci_rank_constrain,
+           r_rank_constrain, r_tot_constrain, r3_tot_constrain,
+           r1_tot_constrain);
+    printf("averaged(raw):\t\t %f \t %f \t %f \t %f \t %f \n",
+           (l_reci_rank_constrain + r_reci_rank_constrain) / 2,
+           (l_rank_constrain + r_rank_constrain) / 2,
+           (l_tot_constrain + r_tot_constrain) / 2,
+           (l3_tot_constrain + r3_tot_constrain) / 2,
+           (l1_tot_constrain + r1_tot_constrain) / 2);
+    printf("\n");
+    printf("l(filter):\t\t %f \t %f \t %f \t %f \t %f \n",
+           l_filter_reci_rank_constrain, l_filter_rank_constrain,
+           l_filter_tot_constrain, l3_filter_tot_constrain,
+           l1_filter_tot_constrain);
+    printf("r(filter):\t\t %f \t %f \t %f \t %f \t %f \n",
+           r_filter_reci_rank_constrain, r_filter_rank_constrain,
+           r_filter_tot_constrain, r3_filter_tot_constrain,
+           r1_filter_tot_constrain);
+    printf("averaged(filter):\t %f \t %f \t %f \t %f \t %f \n",
+           (l_filter_reci_rank_constrain + r_filter_reci_rank_constrain) / 2,
+           (l_filter_rank_constrain + r_filter_rank_constrain) / 2,
+           (l_filter_tot_constrain + r_filter_tot_constrain) / 2,
+           (l3_filter_tot_constrain + r3_filter_tot_constrain) / 2,
+           (l1_filter_tot_constrain + r1_filter_tot_constrain) / 2);
+
+    mrrTC = (l_filter_reci_rank_constrain + r_filter_reci_rank_constrain) / 2;
+    mrTC = (l_filter_rank_constrain + r_filter_rank_constrain) / 2;
+    hit10TC = (l_filter_tot_constrain + r_filter_tot_constrain) / 2;
+    hit3TC = (l3_filter_tot_constrain + r3_filter_tot_constrain) / 2;
+    hit1TC = (l1_filter_tot_constrain + r1_filter_tot_constrain) / 2;
+  }
+}
 
-  l_tot_constrain /= testTotal;
-  l3_tot_constrain /= testTotal;
-  l1_tot_constrain /= testTotal;
+extern "C" void test_relation_prediction() {
+  rel_rank /= testTotal;
+  rel_reci_rank /= testTotal;
 
-  r_tot_constrain /= testTotal;
-  r3_tot_constrain /= testTotal;
-  r1_tot_constrain /= testTotal;
+  rel_tot /= testTotal;
+  rel3_tot /= testTotal;
+  rel1_tot /= testTotal;
 
   // with filter
-  l_filter_rank_constrain /= testTotal;
-  r_filter_rank_constrain /= testTotal;
-  l_filter_reci_rank_constrain /= testTotal;
-  r_filter_reci_rank_constrain /= testTotal;
+  rel_filter_rank /= testTotal;
+  rel_filter_reci_rank /= testTotal;
 
-  l_filter_tot_constrain /= testTotal;
-  l3_filter_tot_constrain /= testTotal;
-  l1_filter_tot_constrain /= testTotal;
+  rel_filter_tot /= testTotal;
+  rel3_filter_tot /= testTotal;
+  rel1_filter_tot /= testTotal;
 
-  r_filter_tot_constrain /= testTotal;
-  r3_filter_tot_constrain /= testTotal;
-  r1_filter_tot_constrain /= testTotal;
-
-  printf("type constraint results:\n");
+  printf("no type constraint results:\n");
 
   printf("metric:\t\t\t MRR \t\t MR \t\t hit@10 \t hit@3  \t hit@1 \n");
-  printf("l(raw):\t\t\t %f \t %f \t %f \t %f \t %f \n", l_reci_rank_constrain,
-         l_rank_constrain, l_tot_constrain, l3_tot_constrain, l1_tot_constrain);
-  printf("r(raw):\t\t\t %f \t %f \t %f \t %f \t %f \n", r_reci_rank_constrain,
-         r_rank_constrain, r_tot_constrain, r3_tot_constrain, r1_tot_constrain);
-  printf("averaged(raw):\t\t %f \t %f \t %f \t %f \t %f \n",
-         (l_reci_rank_constrain + r_reci_rank_constrain) / 2,
-         (l_rank_constrain + r_rank_constrain) / 2,
-         (l_tot_constrain + r_tot_constrain) / 2,
-         (l3_tot_constrain + r3_tot_constrain) / 2,
-         (l1_tot_constrain + r1_tot_constrain) / 2);
+  printf("averaged(raw):\t\t %f \t %f \t %f \t %f \t %f \n", rel_reci_rank,
+         rel_rank, rel_tot, rel3_tot, rel1_tot);
   printf("\n");
-  printf("l(filter):\t\t %f \t %f \t %f \t %f \t %f \n",
-         l_filter_reci_rank_constrain, l_filter_rank_constrain,
-         l_filter_tot_constrain, l3_filter_tot_constrain,
-         l1_filter_tot_constrain);
-  printf("r(filter):\t\t %f \t %f \t %f \t %f \t %f \n",
-         r_filter_reci_rank_constrain, r_filter_rank_constrain,
-         r_filter_tot_constrain, r3_filter_tot_constrain,
-         r1_filter_tot_constrain);
   printf("averaged(filter):\t %f \t %f \t %f \t %f \t %f \n",
-         (l_filter_reci_rank_constrain + r_filter_reci_rank_constrain) / 2,
-         (l_filter_rank_constrain + r_filter_rank_constrain) / 2,
-         (l_filter_tot_constrain + r_filter_tot_constrain) / 2,
-         (l3_filter_tot_constrain + r3_filter_tot_constrain) / 2,
-         (l1_filter_tot_constrain + r1_filter_tot_constrain) / 2);
+         rel_filter_reci_rank, rel_filter_rank, rel_filter_tot, rel3_filter_tot,
+         rel1_filter_tot);
+}
+
+extern "C" REAL getTestLinkHit10(bool type_constrain = false) {
+  if (type_constrain)
+    return hit10TC;
+  printf("%f\n", hit10);
+  return hit10;
+}
+
+extern "C" REAL getTestLinkHit3(bool type_constrain = false) {
+  if (type_constrain)
+    return hit3TC;
+  return hit3;
+}
+
+extern "C" REAL getTestLinkHit1(bool type_constrain = false) {
+  if (type_constrain)
+    return hit1TC;
+  return hit1;
+}
+
+extern "C" REAL getTestLinkMR(bool type_constrain = false) {
+  if (type_constrain)
+    return mrTC;
+  return mr;
+}
+
+extern "C" REAL getTestLinkMRR(bool type_constrain = false) {
+  if (type_constrain)
+    return mrrTC;
+  return mrr;
 }
 
 /*=====================================================================================
 triple classification
 ======================================================================================*/
-Triple *negTestList;
+Triple *negTestList = NULL;
+
 extern "C" void getNegTest() {
-  negTestList = (Triple *)calloc(testTotal, sizeof(Triple));
+  if (negTestList == NULL)
+    negTestList = (Triple *)calloc(testTotal, sizeof(Triple));
   for (INT i = 0; i < testTotal; i++) {
     negTestList[i] = testList[i];
-    negTestList[i].t = corrupt(testList[i].h, testList[i].r);
-  }
-}
-
-Triple *negValidList;
-extern "C" void getNegValid() {
-  negValidList = (Triple *)calloc(validTotal, sizeof(Triple));
-  for (INT i = 0; i < validTotal; i++) {
-    negValidList[i] = validList[i];
-    negValidList[i].t = corrupt(validList[i].h, validList[i].r);
+    if (randd(0) % 1000 < 500)
+      negTestList[i].t = corrupt_head(0, testList[i].h, testList[i].r);
+    else
+      negTestList[i].h = corrupt_tail(0, testList[i].t, testList[i].r);
   }
 }
 
@@ -344,93 +486,4 @@ extern "C" void getTestBatch(INT *ph, INT *pt, INT *pr, INT *nh, INT *nt,
     nr[i] = negTestList[i].r;
   }
 }
-
-extern "C" void getValidBatch(INT *ph, INT *pt, INT *pr, INT *nh, INT *nt,
-                              INT *nr) {
-  getNegValid();
-  for (INT i = 0; i < validTotal; i++) {
-    ph[i] = validList[i].h;
-    pt[i] = validList[i].t;
-    pr[i] = validList[i].r;
-    nh[i] = negValidList[i].h;
-    nt[i] = negValidList[i].t;
-    nr[i] = negValidList[i].r;
-  }
-}
-
-REAL threshEntire;
-extern "C" void getBestThreshold(REAL *relThresh, REAL *score_pos,
-                                 REAL *score_neg) {
-  REAL interval = 0.01;
-  REAL min_score, max_score, bestThresh, tmpThresh, bestAcc, tmpAcc;
-  INT n_interval, correct, total;
-  for (INT r = 0; r < relationTotal; r++) {
-    if (validLef[r] == -1)
-      continue;
-    total = (validRig[r] - validLef[r] + 1) * 2;
-    min_score = score_pos[validLef[r]];
-    if (score_neg[validLef[r]] < min_score)
-      min_score = score_neg[validLef[r]];
-    max_score = score_pos[validLef[r]];
-    if (score_neg[validLef[r]] > max_score)
-      max_score = score_neg[validLef[r]];
-    for (INT i = validLef[r] + 1; i <= validRig[r]; i++) {
-      if (score_pos[i] < min_score)
-        min_score = score_pos[i];
-      if (score_pos[i] > max_score)
-        max_score = score_pos[i];
-      if (score_neg[i] < min_score)
-        min_score = score_neg[i];
-      if (score_neg[i] > max_score)
-        max_score = score_neg[i];
-    }
-    n_interval = INT((max_score - min_score) / interval);
-    for (INT i = 0; i <= n_interval; i++) {
-      tmpThresh = min_score + i * interval;
-      correct = 0;
-      for (INT j = validLef[r]; j <= validRig[r]; j++) {
-        if (score_pos[j] <= tmpThresh)
-          correct++;
-        if (score_neg[j] > tmpThresh)
-          correct++;
-      }
-      tmpAcc = 1.0 * correct / total;
-      if (i == 0) {
-        bestThresh = tmpThresh;
-        bestAcc = tmpAcc;
-      } else if (tmpAcc > bestAcc) {
-        bestAcc = tmpAcc;
-        bestThresh = tmpThresh;
-      }
-    }
-    relThresh[r] = bestThresh;
-  }
-}
-
-REAL *testAcc;
-REAL aveAcc;
-extern "C" void test_triple_classification(REAL *relThresh, REAL *score_pos,
-                                           REAL *score_neg) {
-  testAcc = (REAL *)calloc(relationTotal, sizeof(REAL));
-  INT aveCorrect = 0, aveTotal = 0;
-  REAL aveAcc;
-  for (INT r = 0; r < relationTotal; r++) {
-    if (validLef[r] == -1 || testLef[r] == -1)
-      continue;
-    INT correct = 0, total = 0;
-    for (INT i = testLef[r]; i <= testRig[r]; i++) {
-      if (score_pos[i] <= relThresh[r])
-        correct++;
-      if (score_neg[i] > relThresh[r])
-        correct++;
-      total += 2;
-    }
-    testAcc[r] = 1.0 * correct / total;
-    aveCorrect += correct;
-    aveTotal += total;
-  }
-  aveAcc = 1.0 * aveCorrect / aveTotal;
-  printf("triple classification accuracy is %lf\n", aveAcc);
-}
-
 #endif
diff --git a/seed_embeddings/OpenKE/base/Triple.h b/seed_embeddings/OpenKE/base/Triple.h
index 1e7b13852..05a6c1308 100644
--- a/seed_embeddings/OpenKE/base/Triple.h
+++ b/seed_embeddings/OpenKE/base/Triple.h
@@ -6,16 +6,6 @@ struct Triple {
 
   INT h, r, t;
 
-  static INT minimal(INT a, INT b) {
-    if (a > b)
-      return b;
-    return a;
-  }
-
-  static bool cmp_list(const Triple &a, const Triple &b) {
-    return (minimal(a.h, a.t) > minimal(b.h, b.t));
-  }
-
   static bool cmp_head(const Triple &a, const Triple &b) {
     return (a.h < b.h) || (a.h == b.h && a.r < b.r) ||
            (a.h == b.h && a.r == b.r && a.t < b.t);
diff --git a/seed_embeddings/OpenKE/base/Valid.h b/seed_embeddings/OpenKE/base/Valid.h
deleted file mode 100644
index b6daccd37..000000000
--- a/seed_embeddings/OpenKE/base/Valid.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef VALID_H
-#define VALID_H
-#include "Corrupt.h"
-#include "Reader.h"
-#include "Setting.h"
-
-INT lastValidHead = 0;
-INT lastValidTail = 0;
-
-REAL l_valid_filter_tot = 0;
-REAL r_valid_filter_tot = 0;
-
-extern "C" void validInit() {
-  lastValidHead = 0;
-  lastValidTail = 0;
-  l_valid_filter_tot = 0;
-  r_valid_filter_tot = 0;
-}
-
-extern "C" void getValidHeadBatch(INT *ph, INT *pt, INT *pr) {
-  for (INT i = 0; i < entityTotal; i++) {
-    ph[i] = i;
-    pt[i] = validList[lastValidHead].t;
-    pr[i] = validList[lastValidHead].r;
-  }
-}
-
-extern "C" void getValidTailBatch(INT *ph, INT *pt, INT *pr) {
-  for (INT i = 0; i < entityTotal; i++) {
-    ph[i] = validList[lastValidTail].h;
-    pt[i] = i;
-    pr[i] = validList[lastValidTail].r;
-  }
-}
-
-extern "C" void validHead(REAL *con) {
-  INT h = validList[lastValidHead].h;
-  INT t = validList[lastValidHead].t;
-  INT r = validList[lastValidHead].r;
-  REAL minimal = con[h];
-  INT l_filter_s = 0;
-  for (INT j = 0; j < entityTotal; j++) {
-    if (j != h) {
-      REAL value = con[j];
-      if (value < minimal && !_find(j, t, r))
-        l_filter_s += 1;
-    }
-  }
-  if (l_filter_s < 10)
-    l_valid_filter_tot += 1;
-  lastValidHead++;
-}
-
-extern "C" void validTail(REAL *con) {
-  INT h = validList[lastValidTail].h;
-  INT t = validList[lastValidTail].t;
-  INT r = validList[lastValidTail].r;
-  REAL minimal = con[t];
-  INT r_filter_s = 0;
-  for (INT j = 0; j < entityTotal; j++) {
-    if (j != t) {
-      REAL value = con[j];
-      if (value < minimal && !_find(h, j, r))
-        r_filter_s += 1;
-    }
-  }
-  if (r_filter_s < 10)
-    r_valid_filter_tot += 1;
-  lastValidTail++;
-}
-
-extern "C" REAL getValidHit10() {
-  return (l_valid_filter_tot / validTotal + r_valid_filter_tot / validTotal) /
-         2;
-  ;
-}
-
-#endif
diff --git a/seed_embeddings/OpenKE/config/Config.py b/seed_embeddings/OpenKE/config/Config.py
deleted file mode 100755
index bec5a48a3..000000000
--- a/seed_embeddings/OpenKE/config/Config.py
+++ /dev/null
@@ -1,618 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-import os
-import time
-import datetime
-import ctypes
-import json
-
-
-class Config(object):
-    """
-    use ctypes to call C functions from python and set essential parameters.
-    """
-
-    def __init__(self):
-        base_file = os.path.abspath(
-            os.path.join(os.path.dirname(__file__), "../release/Base.so")
-        )
-        self.lib = ctypes.cdll.LoadLibrary(base_file)
-        self.lib.sampling.argtypes = [
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_int64,
-            ctypes.c_int64,
-            ctypes.c_int64,
-        ]
-        self.lib.getHeadBatch.argtypes = [
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-        ]
-        self.lib.getTailBatch.argtypes = [
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-        ]
-        self.lib.testHead.argtypes = [ctypes.c_void_p]
-        self.lib.testTail.argtypes = [ctypes.c_void_p]
-        self.lib.getTestBatch.argtypes = [
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-        ]
-        self.lib.getValidBatch.argtypes = [
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-        ]
-        self.lib.getBestThreshold.argtypes = [
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-        ]
-        self.lib.test_triple_classification.argtypes = [
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-            ctypes.c_void_p,
-        ]
-        self.test_flag = False
-        self.in_path = None
-        self.out_path = None
-        self.bern = 0
-        self.hidden_size = 100
-        self.ent_size = self.hidden_size
-        self.rel_size = self.hidden_size
-        self.train_times = 0
-        self.margin = 1.0
-        self.nbatches = 100
-        self.negative_ent = 1
-        self.negative_rel = 0
-        self.workThreads = 1
-        self.alpha = 0.001
-        self.lmbda = 0.000
-        self.log_on = 1
-        self.exportName = None
-        self.importName = None
-        self.export_steps = 0
-        self.opt_method = "SGD"
-        self.optimizer = None
-        self.test_link_prediction = False
-        self.test_triple_classification = False
-        self.early_stopping = (
-            None  # It expects a tuple of the following: (patience, min_delta)
-        )
-
-    def init_link_prediction(self):
-        r"""
-        import essential files and set essential interfaces for link prediction
-        """
-        self.lib.importTestFiles()
-        self.lib.importTypeFiles()
-        self.test_h = np.zeros(self.lib.getEntityTotal(), dtype=np.int64)
-        self.test_t = np.zeros(self.lib.getEntityTotal(), dtype=np.int64)
-        self.test_r = np.zeros(self.lib.getEntityTotal(), dtype=np.int64)
-        self.test_h_addr = self.test_h.__array_interface__["data"][0]
-        self.test_t_addr = self.test_t.__array_interface__["data"][0]
-        self.test_r_addr = self.test_r.__array_interface__["data"][0]
-
-    def init_triple_classification(self):
-        r"""
-        import essential files and set essential interfaces for triple classification
-        """
-        self.lib.importTestFiles()
-        self.lib.importTypeFiles()
-
-        self.test_pos_h = np.zeros(self.lib.getTestTotal(), dtype=np.int64)
-        self.test_pos_t = np.zeros(self.lib.getTestTotal(), dtype=np.int64)
-        self.test_pos_r = np.zeros(self.lib.getTestTotal(), dtype=np.int64)
-        self.test_neg_h = np.zeros(self.lib.getTestTotal(), dtype=np.int64)
-        self.test_neg_t = np.zeros(self.lib.getTestTotal(), dtype=np.int64)
-        self.test_neg_r = np.zeros(self.lib.getTestTotal(), dtype=np.int64)
-        self.test_pos_h_addr = self.test_pos_h.__array_interface__["data"][0]
-        self.test_pos_t_addr = self.test_pos_t.__array_interface__["data"][0]
-        self.test_pos_r_addr = self.test_pos_r.__array_interface__["data"][0]
-        self.test_neg_h_addr = self.test_neg_h.__array_interface__["data"][0]
-        self.test_neg_t_addr = self.test_neg_t.__array_interface__["data"][0]
-        self.test_neg_r_addr = self.test_neg_r.__array_interface__["data"][0]
-
-        self.valid_pos_h = np.zeros(self.lib.getValidTotal(), dtype=np.int64)
-        self.valid_pos_t = np.zeros(self.lib.getValidTotal(), dtype=np.int64)
-        self.valid_pos_r = np.zeros(self.lib.getValidTotal(), dtype=np.int64)
-        self.valid_neg_h = np.zeros(self.lib.getValidTotal(), dtype=np.int64)
-        self.valid_neg_t = np.zeros(self.lib.getValidTotal(), dtype=np.int64)
-        self.valid_neg_r = np.zeros(self.lib.getValidTotal(), dtype=np.int64)
-        self.valid_pos_h_addr = self.valid_pos_h.__array_interface__["data"][0]
-        self.valid_pos_t_addr = self.valid_pos_t.__array_interface__["data"][0]
-        self.valid_pos_r_addr = self.valid_pos_r.__array_interface__["data"][0]
-        self.valid_neg_h_addr = self.valid_neg_h.__array_interface__["data"][0]
-        self.valid_neg_t_addr = self.valid_neg_t.__array_interface__["data"][0]
-        self.valid_neg_r_addr = self.valid_neg_r.__array_interface__["data"][0]
-        self.relThresh = np.zeros(self.lib.getRelationTotal(), dtype=np.float32)
-        self.relThresh_addr = self.relThresh.__array_interface__["data"][0]
-
-    # prepare for train and test
-    def init(self):
-        self.trainModel = None
-        if self.in_path != None:
-            self.lib.setInPath(
-                ctypes.create_string_buffer(
-                    self.in_path.encode(), len(self.in_path) * 2
-                )
-            )
-            self.lib.setBern(self.bern)
-            self.lib.setWorkThreads(self.workThreads)
-            self.lib.randReset()
-            self.lib.importTrainFiles()
-            self.relTotal = self.lib.getRelationTotal()
-            self.entTotal = self.lib.getEntityTotal()
-            self.trainTotal = self.lib.getTrainTotal()
-            self.testTotal = self.lib.getTestTotal()
-            self.validTotal = self.lib.getValidTotal()
-            self.batch_size = int(self.lib.getTrainTotal() / self.nbatches)
-            self.batch_seq_size = self.batch_size * (
-                1 + self.negative_ent + self.negative_rel
-            )
-            self.batch_h = np.zeros(
-                self.batch_size * (1 + self.negative_ent + self.negative_rel),
-                dtype=np.int64,
-            )
-            self.batch_t = np.zeros(
-                self.batch_size * (1 + self.negative_ent + self.negative_rel),
-                dtype=np.int64,
-            )
-            self.batch_r = np.zeros(
-                self.batch_size * (1 + self.negative_ent + self.negative_rel),
-                dtype=np.int64,
-            )
-            self.batch_y = np.zeros(
-                self.batch_size * (1 + self.negative_ent + self.negative_rel),
-                dtype=np.float32,
-            )
-            self.batch_h_addr = self.batch_h.__array_interface__["data"][0]
-            self.batch_t_addr = self.batch_t.__array_interface__["data"][0]
-            self.batch_r_addr = self.batch_r.__array_interface__["data"][0]
-            self.batch_y_addr = self.batch_y.__array_interface__["data"][0]
-        if self.test_link_prediction:
-            self.init_link_prediction()
-        if self.test_triple_classification:
-            self.init_triple_classification()
-
-    def get_ent_total(self):
-        return self.entTotal
-
-    def get_rel_total(self):
-        return self.relTotal
-
-    def set_lmbda(self, lmbda):
-        self.lmbda = lmbda
-
-    def set_optimizer(self, optimizer):
-        self.optimizer = optimizer
-
-    def set_opt_method(self, method):
-        self.opt_method = method
-
-    def set_test_link_prediction(self, flag):
-        self.test_link_prediction = flag
-
-    def set_test_triple_classification(self, flag):
-        self.test_triple_classification = flag
-
-    def set_log_on(self, flag):
-        self.log_on = flag
-
-    def set_alpha(self, alpha):
-        self.alpha = alpha
-
-    def set_in_path(self, path):
-        self.in_path = path
-
-    def set_out_files(self, path):
-        self.out_path = path
-
-    def set_bern(self, bern):
-        self.bern = bern
-
-    def set_dimension(self, dim):
-        self.hidden_size = dim
-        self.ent_size = dim
-        self.rel_size = dim
-
-    def set_ent_dimension(self, dim):
-        self.ent_size = dim
-
-    def set_rel_dimension(self, dim):
-        self.rel_size = dim
-
-    def set_train_times(self, times):
-        self.train_times = times
-
-    def set_nbatches(self, nbatches):
-        self.nbatches = nbatches
-
-    def set_margin(self, margin):
-        self.margin = margin
-
-    def set_work_threads(self, threads):
-        self.workThreads = threads
-
-    def set_ent_neg_rate(self, rate):
-        self.negative_ent = rate
-
-    def set_rel_neg_rate(self, rate):
-        self.negative_rel = rate
-
-    def set_import_files(self, path):
-        self.importName = path
-
-    def set_export_files(self, path, steps=0):
-        self.exportName = path
-        self.export_steps = steps
-
-    def set_export_steps(self, steps):
-        self.export_steps = steps
-
-    def set_early_stopping(self, early_stopping):
-        self.early_stopping = early_stopping
-
-    # call C function for sampling
-    def sampling(self):
-        self.lib.sampling(
-            self.batch_h_addr,
-            self.batch_t_addr,
-            self.batch_r_addr,
-            self.batch_y_addr,
-            self.batch_size,
-            self.negative_ent,
-            self.negative_rel,
-        )
-
-    # save model
-    def save_tensorflow(self):
-        with self.graph.as_default():
-            with self.sess.as_default():
-                self.saver.save(self.sess, self.exportName)
-
-    # restore model
-    def restore_tensorflow(self):
-        with self.graph.as_default():
-            with self.sess.as_default():
-                self.ckpt.restore(tf.train.latest_checkpoint("./res"))
-
-    def export_variables(self, path=None):
-        with self.graph.as_default():
-            with self.sess.as_default():
-                if path == None:
-                    self.saver.save(self.sess, self.exportName)
-                else:
-                    self.saver.save(self.sess, path)
-
-    def import_variables(self, path=None):
-        with self.graph.as_default():
-            with self.sess.as_default():
-                if path == None:
-                    self.saver.restore(self.sess, self.importName)
-                else:
-                    self.saver.restore(self.sess, path)
-
-    def get_parameter_lists(self):
-        return self.trainModel.parameter_lists
-
-    def get_parameters_by_name(self, var_name):
-        with self.graph.as_default():
-            with self.sess.as_default():
-                if var_name in self.trainModel.parameter_lists:
-                    return self.sess.run(self.trainModel.parameter_lists[var_name])
-                else:
-                    return None
-
-    def get_parameters(self, mode="numpy"):
-        res = {}
-        lists = self.get_parameter_lists()
-        for var_name in lists:
-            if mode == "numpy":
-                res[var_name] = self.get_parameters_by_name(var_name)
-            else:
-                res[var_name] = self.get_parameters_by_name(var_name).tolist()
-        return res
-
-    def save_parameters(self, path=None):
-        if path == None:
-            path = self.out_path
-        f = open(path, "w")
-        f.write(json.dumps(self.get_parameters("list")))
-        f.close()
-
-    def set_parameters_by_name(self, var_name, tensor):
-        with self.graph.as_default():
-            with self.sess.as_default():
-                if var_name in self.trainModel.parameter_lists:
-                    self.trainModel.parameter_lists[var_name] = tensor
-
-    def set_parameters(self, lists):
-        for i in lists:
-            self.set_parameters_by_name(i, lists[i])
-
-    def set_model(self, model):
-        self.model = model
-        self.graph = tf.Graph()
-        with self.graph.as_default():
-            self.sess = tf.compat.v1.Session()
-            with self.sess.as_default():
-                initializer = tf.compat.v1.keras.initializers.VarianceScaling(
-                    scale=1.0,
-                    mode="fan_avg",
-                    distribution=("uniform" if True else "truncated_normal"),
-                )
-                with tf.compat.v1.variable_scope(
-                    "model", reuse=None, initializer=initializer
-                ):
-                    self.trainModel = self.model(config=self)
-                    if self.optimizer != None:
-                        pass
-                    elif self.opt_method == "Adagrad" or self.opt_method == "adagrad":
-                        self.optimizer = tf.keras.optimizers.Adagrad(
-                            learning_rate=self.alpha, initial_accumulator_value=1e-20
-                        )
-                    elif self.opt_method == "Adadelta" or self.opt_method == "adadelta":
-                        self.optimizer = tf.keras.optimizers.Adadelta(self.alpha)
-                    elif self.opt_method == "Adam" or self.opt_method == "adam":
-                        self.optimizer = tf.keras.optimizers.Adam(self.alpha)
-                    else:
-                        self.optimizer = tf.keras.optimizers.SGD(self.alpha)
-                    grads_and_vars = self.optimizer.get_gradients(
-                        self.trainModel.loss, self.trainModel.trainable_variables
-                    )
-                    self.train_op = self.optimizer.apply_gradients(
-                        zip(grads_and_vars, self.trainModel.trainable_variables)
-                    )
-                self.saver = tf.compat.v1.train.Saver()
-                self.ckpt = tf.train.Checkpoint(
-                    optimizer=self.optimizer, model=self.trainModel
-                )
-                self.sess.run(tf.compat.v1.global_variables_initializer())
-
-    def train_step(self, batch_h, batch_t, batch_r, batch_y):
-        feed_dict = {
-            self.trainModel.batch_h: batch_h,
-            self.trainModel.batch_t: batch_t,
-            self.trainModel.batch_r: batch_r,
-            self.trainModel.batch_y: batch_y,
-        }
-        _, loss = self.sess.run([self.train_op, self.trainModel.loss], feed_dict)
-        return loss
-
-    def test_step(self, test_h, test_t, test_r):
-        feed_dict = {
-            self.trainModel.predict_h: test_h,
-            self.trainModel.predict_t: test_t,
-            self.trainModel.predict_r: test_r,
-        }
-        predict = self.sess.run(self.trainModel.predict, feed_dict)
-        return predict
-
-    def run(self):
-        with self.graph.as_default():
-            with self.sess.as_default():
-
-                if self.importName != None:
-                    self.restore_tensorflow()
-                if self.early_stopping is not None:
-                    patience, min_delta = self.early_stopping
-                    best_loss = np.finfo("float32").max
-                    wait_steps = 0
-                for times in range(self.train_times):
-                    loss = 0.0
-                    t_init = time.time()
-                    step = 0
-                    for batch in range(self.nbatches):
-                        step = step + 1
-                        self.sampling()
-                        loss += self.train_step(
-                            self.batch_h, self.batch_t, self.batch_r, self.batch_y
-                        )
-                    t_end = time.time()
-                    if self.log_on:
-                        print(
-                            "Epoch: {}, loss: {}, time: {}".format(
-                                times, loss, (t_end - t_init)
-                            )
-                        )
-                    if self.exportName != None and (
-                        self.export_steps != 0 and times % self.export_steps == 0
-                    ):
-                        self.save_tensorflow()
-                    if self.early_stopping is not None:
-                        if loss + min_delta < best_loss:
-                            best_loss = loss
-                            wait_steps = 0
-                        elif wait_steps < patience:
-                            wait_steps += 1
-                        else:
-                            print(
-                                "Early stopping. Losses have not been improved enough in {} times".format(
-                                    patience
-                                )
-                            )
-                            break
-                if self.exportName != None:
-                    self.save_tensorflow()
-                    self.ckpt.save(self.exportName + "ckpt")
-                if self.out_path != None:
-                    self.save_parameters(self.out_path)
-
-    def test(self):
-        with self.graph.as_default():
-            with self.sess.as_default():
-                if self.importName != None:
-                    self.restore_tensorflow()
-                if self.test_link_prediction:
-                    total = self.lib.getTestTotal()
-                    for times in range(total):
-                        self.lib.getHeadBatch(
-                            self.test_h_addr, self.test_t_addr, self.test_r_addr
-                        )
-                        res = self.test_step(self.test_h, self.test_t, self.test_r)
-                        self.lib.testHead(res.__array_interface__["data"][0])
-
-                        self.lib.getTailBatch(
-                            self.test_h_addr, self.test_t_addr, self.test_r_addr
-                        )
-                        res = self.test_step(self.test_h, self.test_t, self.test_r)
-                        self.lib.testTail(res.__array_interface__["data"][0])
-                        if self.log_on:
-                            print(times)
-                    self.lib.test_link_prediction()
-                if self.test_triple_classification:
-                    self.lib.getValidBatch(
-                        self.valid_pos_h_addr,
-                        self.valid_pos_t_addr,
-                        self.valid_pos_r_addr,
-                        self.valid_neg_h_addr,
-                        self.valid_neg_t_addr,
-                        self.valid_neg_r_addr,
-                    )
-                    res_pos = self.test_step(
-                        self.valid_pos_h, self.valid_pos_t, self.valid_pos_r
-                    )
-                    res_neg = self.test_step(
-                        self.valid_neg_h, self.valid_neg_t, self.valid_neg_r
-                    )
-                    self.lib.getBestThreshold(
-                        self.relThresh_addr,
-                        res_pos.__array_interface__["data"][0],
-                        res_neg.__array_interface__["data"][0],
-                    )
-
-                    self.lib.getTestBatch(
-                        self.test_pos_h_addr,
-                        self.test_pos_t_addr,
-                        self.test_pos_r_addr,
-                        self.test_neg_h_addr,
-                        self.test_neg_t_addr,
-                        self.test_neg_r_addr,
-                    )
-
-                    res_pos = self.test_step(
-                        self.test_pos_h, self.test_pos_t, self.test_pos_r
-                    )
-                    res_neg = self.test_step(
-                        self.test_neg_h, self.test_neg_t, self.test_neg_r
-                    )
-                    self.lib.test_triple_classification(
-                        self.relThresh_addr,
-                        res_pos.__array_interface__["data"][0],
-                        res_neg.__array_interface__["data"][0],
-                    )
-
-    def predict_head_entity(self, t, r, k):
-        r"""This mothod predicts the top k head entities given tail entity and relation.
-
-        Args:
-                t (int): tail entity id
-                r (int): relation id
-                k (int): top k head entities
-
-        Returns:
-                list: k possible head entity ids
-        """
-        self.init_link_prediction()
-        if self.importName != None:
-            self.restore_tensorflow()
-        test_h = np.array(range(self.entTotal))
-        test_r = np.array([r] * self.entTotal)
-        test_t = np.array([t] * self.entTotal)
-        res = self.test_step(test_h, test_t, test_r).reshape(-1).argsort()[:k]
-        print(res)
-        return res
-
-    def predict_tail_entity(self, h, r, k):
-        r"""This mothod predicts the top k tail entities given head entity and relation.
-
-        Args:
-                h (int): head entity id
-                r (int): relation id
-                k (int): top k tail entities
-
-        Returns:
-                list: k possible tail entity ids
-        """
-        self.init_link_prediction()
-        if self.importName != None:
-            self.restore_tensorflow()
-        test_h = np.array([h] * self.entTotal)
-        test_r = np.array([r] * self.entTotal)
-        test_t = np.array(range(self.entTotal))
-        res = self.test_step(test_h, test_t, test_r).reshape(-1).argsort()[:k]
-        print(res)
-        return res
-
-    def predict_relation(self, h, t, k):
-        r"""This methods predict the relation id given head entity and tail entity.
-
-        Args:
-                h (int): head entity id
-                t (int): tail entity id
-                k (int): top k relations
-
-        Returns:
-                list: k possible relation ids
-        """
-        self.init_link_prediction()
-        if self.importName != None:
-            self.restore_tensorflow()
-        test_h = np.array([h] * self.relTotal)
-        test_r = np.array(range(self.relTotal))
-        test_t = np.array([t] * self.relTotal)
-        res = self.test_step(test_h, test_t, test_r).reshape(-1).argsort()[:k]
-        print(res)
-        return res
-
-    def predict_triple(self, h, t, r, thresh=None):
-        r"""This method tells you whether the given triple (h, t, r) is correct of wrong
-
-        Args:
-                h (int): head entity id
-                t (int): tail entity id
-                r (int): relation id
-                thresh (fload): threshold for the triple
-        """
-        self.init_triple_classification()
-        if self.importName != None:
-            self.restore_tensorflow()
-        res = self.test_step(np.array([h]), np.array([t]), np.array([r]))
-        if thresh != None:
-            if res < thresh:
-                print("triple (%d,%d,%d) is correct" % (h, t, r))
-            else:
-                print("triple (%d,%d,%d) is wrong" % (h, t, r))
-            return
-        self.lib.getValidBatch(
-            self.valid_pos_h_addr,
-            self.valid_pos_t_addr,
-            self.valid_pos_r_addr,
-            self.valid_neg_h_addr,
-            self.valid_neg_t_addr,
-            self.valid_neg_r_addr,
-        )
-        res_pos = self.test_step(self.valid_pos_h, self.valid_pos_t, self.valid_pos_r)
-        res_neg = self.test_step(self.valid_neg_h, self.valid_neg_t, self.valid_neg_r)
-        self.lib.getBestThreshold(
-            self.relThresh_addr,
-            res_pos.__array_interface__["data"][0],
-            res_neg.__array_interface__["data"][0],
-        )
-        if res < self.relThresh[r]:
-            print("triple (%d,%d,%d) is correct" % (h, t, r))
-        else:
-            print("triple (%d,%d,%d) is wrong" % (h, t, r))
diff --git a/seed_embeddings/OpenKE/config/Config.pyc b/seed_embeddings/OpenKE/config/Config.pyc
deleted file mode 100644
index a4a1251c2..000000000
Binary files a/seed_embeddings/OpenKE/config/Config.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/config/Tester.py b/seed_embeddings/OpenKE/config/Tester.py
new file mode 100755
index 000000000..cd17e2d6b
--- /dev/null
+++ b/seed_embeddings/OpenKE/config/Tester.py
@@ -0,0 +1,184 @@
+# coding:utf-8
+import torch
+import torch.nn as nn
+from torch.autograd import Variable
+import torch.optim as optim
+import os
+import time
+import sys
+import datetime
+import ctypes
+import json
+import numpy as np
+from sklearn.metrics import roc_auc_score
+import copy
+from tqdm import tqdm
+import random
+
+
+class Tester(object):
+    def __init__(self, model=None, data_loader=None, use_gpu=True):
+        base_file = os.path.abspath(
+            os.path.join(os.path.dirname(__file__), "../release/Base.so")
+        )
+        self.lib = ctypes.cdll.LoadLibrary(base_file)
+        self.lib.testHead.argtypes = [ctypes.c_void_p, ctypes.c_int64, ctypes.c_int64]
+        self.lib.testTail.argtypes = [ctypes.c_void_p, ctypes.c_int64, ctypes.c_int64]
+        self.lib.test_link_prediction.argtypes = [ctypes.c_int64]
+
+        self.lib.getTestLinkMRR.argtypes = [ctypes.c_int64]
+        self.lib.getTestLinkMR.argtypes = [ctypes.c_int64]
+        self.lib.getTestLinkHit10.argtypes = [ctypes.c_int64]
+        self.lib.getTestLinkHit3.argtypes = [ctypes.c_int64]
+        self.lib.getTestLinkHit1.argtypes = [ctypes.c_int64]
+
+        self.lib.getTestLinkMRR.restype = ctypes.c_float
+        self.lib.getTestLinkMR.restype = ctypes.c_float
+        self.lib.getTestLinkHit10.restype = ctypes.c_float
+        self.lib.getTestLinkHit3.restype = ctypes.c_float
+        self.lib.getTestLinkHit1.restype = ctypes.c_float
+
+        self.model = model
+        self.data_loader = data_loader
+        self.use_gpu = use_gpu
+
+        if self.use_gpu:
+            self.model.cuda()
+
+    def set_model(self, model):
+        self.model = model
+
+    def set_data_loader(self, data_loader):
+        self.data_loader = data_loader
+
+    def set_use_gpu(self, use_gpu):
+        self.use_gpu = use_gpu
+        if self.use_gpu and self.model != None:
+            self.model.cuda()
+
+    def to_var(self, x, use_gpu):
+        if use_gpu:
+            return Variable(torch.from_numpy(x).cuda())
+        else:
+            return Variable(torch.from_numpy(x))
+
+    def test_one_step(self, data):
+        return self.model.predict(
+            {
+                "batch_h": self.to_var(data["batch_h"], self.use_gpu),
+                "batch_t": self.to_var(data["batch_t"], self.use_gpu),
+                "batch_r": self.to_var(data["batch_r"], self.use_gpu),
+                "mode": data["mode"],
+            }
+        )
+
+    def random_sample(self, data_loader, sample_size):
+
+        if sample_size:
+            reservoir = []
+            for i, batch in enumerate(data_loader):
+                if i < sample_size:
+                    reservoir.append(batch)
+                else:
+                    s = int(random.random() * (i + 1))
+                    if s < sample_size:
+                        reservoir[s] = batch
+            return iter(reservoir)
+
+    def run_link_prediction(
+        self, type_constrain=False, sample_size=None, sample_per=None
+    ):
+        self.lib.initTest()
+        self.data_loader.set_sampling_mode("link")
+        if type_constrain:
+            type_constrain = 1
+        else:
+            type_constrain = 0
+        print("Len of Test DataLoader : ", len(self.data_loader))
+
+        # Random sampling the data loader
+        if sample_size and sample_per:
+            sample_size = min(sample_size, (sample_per * len(self.data_loader)) // 100)
+
+        data_iterator = self.random_sample(self.data_loader, sample_size)
+
+        training_range = tqdm(data_iterator)
+
+        for index, [data_head, data_tail] in enumerate(training_range):
+            score = self.test_one_step(data_head)
+            self.lib.testHead(
+                score.__array_interface__["data"][0], index, type_constrain
+            )
+            score = self.test_one_step(data_tail)
+            self.lib.testTail(
+                score.__array_interface__["data"][0], index, type_constrain
+            )
+        self.lib.test_link_prediction(type_constrain)
+
+        mrr = self.lib.getTestLinkMRR(type_constrain)
+        mr = self.lib.getTestLinkMR(type_constrain)
+        hit10 = self.lib.getTestLinkHit10(type_constrain)
+        hit3 = self.lib.getTestLinkHit3(type_constrain)
+        hit1 = self.lib.getTestLinkHit1(type_constrain)
+
+        return mrr, mr, hit10, hit3, hit1
+
+    def get_best_threshlod(self, score, ans):
+        res = np.concatenate([ans.reshape(-1, 1), score.reshape(-1, 1)], axis=-1)
+        order = np.argsort(score)
+        res = res[order]
+
+        total_all = (float)(len(score))
+        total_current = 0.0
+        total_true = np.sum(ans)
+        total_false = total_all - total_true
+
+        res_mx = 0.0
+        threshlod = None
+        for index, [ans, score] in enumerate(res):
+            if ans == 1:
+                total_current += 1.0
+            res_current = (2 * total_current + total_false - index - 1) / total_all
+            if res_current > res_mx:
+                res_mx = res_current
+                threshlod = score
+        return threshlod, res_mx
+
+    def run_triple_classification(self, threshlod=None):
+        self.lib.initTest()
+        self.data_loader.set_sampling_mode("classification")
+        score = []
+        ans = []
+        training_range = tqdm(self.data_loader)
+        for index, [pos_ins, neg_ins] in enumerate(training_range):
+            res_pos = self.test_one_step(pos_ins)
+            ans = ans + [1 for i in range(len(res_pos))]
+            score.append(res_pos)
+
+            res_neg = self.test_one_step(neg_ins)
+            ans = ans + [0 for i in range(len(res_pos))]
+            score.append(res_neg)
+
+        score = np.concatenate(score, axis=-1)
+        ans = np.array(ans)
+
+        if threshlod == None:
+            threshlod, _ = self.get_best_threshlod(score, ans)
+
+        res = np.concatenate([ans.reshape(-1, 1), score.reshape(-1, 1)], axis=-1)
+        order = np.argsort(score)
+        res = res[order]
+
+        total_all = (float)(len(score))
+        total_current = 0.0
+        total_true = np.sum(ans)
+        total_false = total_all - total_true
+
+        for index, [ans, score] in enumerate(res):
+            if score > threshlod:
+                acc = (2 * total_current + total_false - index) / total_all
+                break
+            elif ans == 1:
+                total_current += 1.0
+
+        return acc, threshlod
diff --git a/seed_embeddings/OpenKE/config/Trainer.py b/seed_embeddings/OpenKE/config/Trainer.py
new file mode 100755
index 000000000..c1552688a
--- /dev/null
+++ b/seed_embeddings/OpenKE/config/Trainer.py
@@ -0,0 +1,265 @@
+# coding:utf-8
+import torch
+import torch.nn as nn
+from torch.autograd import Variable
+import torch.optim as optim
+import os
+import time
+import sys
+import datetime
+import ctypes
+import json
+import numpy as np
+import copy
+from tqdm import tqdm
+from ray import train
+import tempfile
+from ray.train import Checkpoint
+import ray
+from config.Tester import Tester
+from scipy import spatial
+from collections import OrderedDict
+import analogy
+
+
+class Trainer(object):
+    def __init__(
+        self,
+        model=None,
+        data_loader=None,
+        train_times=1000,
+        alpha=0.5,
+        use_gpu=False,
+        opt_method="sgd",
+        save_steps=None,
+        checkpoint_dir=None,
+        index_dir=None,
+        analogy_file="analogies.txt",
+    ):
+
+        self.work_threads = 8
+        self.train_times = train_times
+        self.index_dir = index_dir
+        self.opt_method = opt_method
+        self.optimizer = None
+        self.lr_decay = 0
+        self.weight_decay = 0
+        self.alpha = alpha
+
+        self.model = model
+        self.data_loader = data_loader
+        self.use_gpu = use_gpu
+        self.save_steps = save_steps
+        self.checkpoint_dir = checkpoint_dir
+        # self.out_path = out_path
+
+        self.entity_names = self.load_entity_names(index_dir)
+        self.analogies = analogy.AnalogyScorer(analogy_file=analogy_file)
+
+    def load_entity_names(self, index_dir):
+        with open(os.path.join(index_dir, "entity2id.txt")) as fEntity:
+            content = fEntity.read()
+
+        entities = content.split("\n")
+        entity_dict = {}
+
+        for i in range(1, int(entities[0])):
+            entity_name = entities[i].split("\t")[0].upper()
+            entity_dict[entity_name] = None  # Placeholder for embeddings
+
+        last_entity_name = entities[int(entities[0])].split("\t")[0].upper()
+        entity_dict[last_entity_name] = None
+
+        return entity_dict
+
+    def train_one_step(self, data):
+        self.optimizer.zero_grad()
+        loss = self.model(
+            {
+                "batch_h": self.to_var(data["batch_h"], self.use_gpu),
+                "batch_t": self.to_var(data["batch_t"], self.use_gpu),
+                "batch_r": self.to_var(data["batch_r"], self.use_gpu),
+                "batch_y": self.to_var(data["batch_y"], self.use_gpu),
+                "mode": data["mode"],
+            }
+        )
+        loss.backward()
+        self.optimizer.step()
+        return loss.item()
+
+    def getEntityDict(self, ent_embeddings):
+        """
+        Reads the entity embeddings and returns an dictionary
+        mapping entity names to their corresponding embeddings.
+        """
+        entity_dict = {}
+
+        for i, entity_name in enumerate(self.entity_names):
+            entity_dict[entity_name] = ent_embeddings[i].tolist()
+
+        return entity_dict
+
+    def run(
+        self,
+        link_prediction=False,
+        test_dataloader=None,
+        model=None,
+        is_analogy=False,
+        ray=True,
+        freq=10,
+    ):
+        if self.use_gpu:
+            self.model.cuda()
+
+        if self.optimizer != None:
+            pass
+        elif self.opt_method == "Adagrad" or self.opt_method == "adagrad":
+            self.optimizer = optim.Adagrad(
+                self.model.parameters(),
+                lr=self.alpha,
+                lr_decay=self.lr_decay,
+                weight_decay=self.weight_decay,
+            )
+        elif self.opt_method == "Adadelta" or self.opt_method == "adadelta":
+            self.optimizer = optim.Adadelta(
+                self.model.parameters(),
+                lr=self.alpha,
+                weight_decay=self.weight_decay,
+            )
+        elif self.opt_method == "Adam" or self.opt_method == "adam":
+            self.optimizer = optim.Adam(
+                self.model.parameters(),
+                lr=self.alpha,
+                weight_decay=self.weight_decay,
+            )
+        else:
+            self.optimizer = optim.SGD(
+                self.model.parameters(),
+                lr=self.alpha,
+                weight_decay=self.weight_decay,
+            )
+        print("Finish initializing...")
+        best_metric_val = 0.0
+        training_range = tqdm(range(self.train_times))
+        for epoch in training_range:
+            res = 0.0
+            for data in self.data_loader:
+                loss = self.train_one_step(data)
+                res += loss
+            training_range.set_description("Epoch %d | loss: %f" % (epoch, res))
+            checkpoint = None
+            save_ckpt = False
+            if ray and epoch % freq == 0:
+                metrics = {"loss": res}
+                # Link Prediction
+                if link_prediction:
+                    # model here is the orginal pytorch model
+                    tester = Tester(
+                        model=model, data_loader=test_dataloader, use_gpu=False
+                    )
+
+                    mrr, mr, hit10, hit3, hit1 = tester.run_link_prediction(
+                        type_constrain=False, sample_size=200, sample_per=30
+                    )
+
+                    metrics.update(
+                        {
+                            "mrr": mrr,
+                            "mr": mr,
+                            "hit10": hit10,
+                            "hit3": hit3,
+                            "hit1": hit1,
+                        }
+                    )
+                    if best_metric_val <= hit1:
+                        best_metric_val = hit1
+                        save_ckpt = True
+                    print("Link Prediction Scores Completed")
+
+                elif is_analogy:
+                    # self.model => Negative Sampling object
+                    # self.mode.model => Transe model
+
+                    ent_embeddings = (
+                        self.model.model.ent_embeddings.weight.data.cpu().numpy()
+                    )
+                    entity_dict = self.getEntityDict(ent_embeddings)
+                    analogy_score = self.analogies.get_analogy_score(entity_dict)
+                    metrics.update({"AnalogiesScore": analogy_score})
+                    print("Analogy Score completed")
+
+                    del entity_dict
+
+                    if best_metric_val <= analogy_score:
+                        best_metric_val = analogy_score
+                        save_ckpt = True
+
+                else:  # loss
+                    if best_metric_val >= res:
+                        best_metric_val = res
+                        save_ckpt = True
+
+                with tempfile.TemporaryDirectory() as temp_checkpoint_dir:
+                    # Save the checkpoint...
+                    checkpoint = None
+                    if save_ckpt:
+                        self.model.save_checkpoint(
+                            os.path.join(
+                                temp_checkpoint_dir,
+                                "checkpoint" + "-" + str(epoch) + ".ckpt",
+                            )
+                        )
+                        checkpoint = Checkpoint.from_directory(temp_checkpoint_dir)
+
+                    train.report(metrics, checkpoint=checkpoint)
+
+            elif (
+                self.save_steps
+                and self.checkpoint_dir
+                and (epoch + 1) % self.save_steps == 0
+            ):
+                print("Epoch %d has finished, saving..." % (epoch))
+                self.model.save_checkpoint(
+                    os.path.join(self.checkpoint_dir + "-" + str(epoch) + ".ckpt")
+                )
+
+        # print("out_path : ", self.out_path)
+        # if self.out_path:
+        #     print("Inside out_path")
+        #     print(self.out_path)
+        #     self.model.save_parameters(self.out_path)
+
+    def set_model(self, model):
+        self.model = model
+
+    def to_var(self, x, use_gpu):
+        if use_gpu:
+            return Variable(torch.from_numpy(x).cuda())
+        else:
+            return Variable(torch.from_numpy(x))
+
+    def set_use_gpu(self, use_gpu):
+        self.use_gpu = use_gpu
+
+    def set_alpha(self, alpha):
+        self.alpha = alpha
+
+    def set_lr_decay(self, lr_decay):
+        self.lr_decay = lr_decay
+
+    def set_weight_decay(self, weight_decay):
+        self.weight_decay = weight_decay
+
+    def set_opt_method(self, opt_method):
+        self.opt_method = opt_method
+
+    def set_train_times(self, train_times):
+        self.train_times = train_times
+
+    def set_save_steps(self, save_steps, checkpoint_dir=None):
+        self.save_steps = save_steps
+        if not self.checkpoint_dir:
+            self.set_checkpoint_dir(checkpoint_dir)
+
+    def set_checkpoint_dir(self, checkpoint_dir):
+        self.checkpoint_dir = checkpoint_dir
diff --git a/seed_embeddings/OpenKE/config/__init__.py b/seed_embeddings/OpenKE/config/__init__.py
index 385a32740..db42b39b7 100755
--- a/seed_embeddings/OpenKE/config/__init__.py
+++ b/seed_embeddings/OpenKE/config/__init__.py
@@ -1,1 +1,8 @@
-from .Config import Config
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from .Trainer import Trainer
+from .Tester import Tester
+
+__all__ = ["Trainer", "Tester"]
diff --git a/seed_embeddings/OpenKE/config/__init__.pyc b/seed_embeddings/OpenKE/config/__init__.pyc
deleted file mode 100644
index 9943b9a89..000000000
Binary files a/seed_embeddings/OpenKE/config/__init__.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/data/PyTorchTrainDataLoader.py b/seed_embeddings/OpenKE/data/PyTorchTrainDataLoader.py
new file mode 100644
index 000000000..cf8024b91
--- /dev/null
+++ b/seed_embeddings/OpenKE/data/PyTorchTrainDataLoader.py
@@ -0,0 +1,407 @@
+#!/usr/bin/python3
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import random
+import numpy as np
+import torch
+from torch.utils.data import Dataset, DataLoader
+
+
+class PyTorchTrainDataset(Dataset):
+    def __init__(
+        self,
+        head,
+        tail,
+        rel,
+        ent_total,
+        rel_total,
+        sampling_mode="normal",
+        bern_flag=False,
+        filter_flag=True,
+        neg_ent=1,
+        neg_rel=0,
+    ):
+        # triples
+        self.head = head
+        self.tail = tail
+        self.rel = rel
+        # total numbers of entities, relations, and triples
+        self.rel_total = rel_total
+        self.ent_total = ent_total
+        self.tri_total = len(head)
+        # the sampling mode
+        self.sampling_mode = sampling_mode
+        # the number of negative examples
+        self.neg_ent = neg_ent
+        self.neg_rel = neg_rel
+        self.bern_flag = bern_flag
+        self.filter_flag = filter_flag
+        if self.sampling_mode == "normal":
+            self.cross_sampling_flag = None
+        else:
+            self.cross_sampling_flag = 0
+        self.__count_htr()
+
+    def __len__(self):
+        return self.tri_total
+
+    def __getitem__(self, idx):
+        return (self.head[idx], self.tail[idx], self.rel[idx])
+
+    def collate_fn(self, data):
+        batch_data = {}
+        if self.sampling_mode == "normal":
+            batch_data["mode"] = "normal"
+            batch_h = np.array([item[0] for item in data]).reshape(-1, 1)
+            batch_t = np.array([item[1] for item in data]).reshape(-1, 1)
+            batch_r = np.array([item[2] for item in data]).reshape(-1, 1)
+            batch_h = np.repeat(batch_h, 1 + self.neg_ent + self.neg_rel, axis=-1)
+            batch_t = np.repeat(batch_t, 1 + self.neg_ent + self.neg_rel, axis=-1)
+            batch_r = np.repeat(batch_r, 1 + self.neg_ent + self.neg_rel, axis=-1)
+            for index, item in enumerate(data):
+                last = 1
+                if self.neg_ent > 0:
+                    neg_head, neg_tail = self.__normal_batch(
+                        item[0], item[1], item[2], self.neg_ent
+                    )
+                    if len(neg_head) > 0:
+                        batch_h[index][last : last + len(neg_head)] = neg_head
+                        last += len(neg_head)
+                    if len(neg_tail) > 0:
+                        batch_t[index][last : last + len(neg_tail)] = neg_tail
+                        last += len(neg_tail)
+                if self.neg_rel > 0:
+                    neg_rel = self.__rel_batch(item[0], item[1], item[2], self.neg_rel)
+                    batch_r[index][last : last + len(neg_rel)] = neg_rel
+            batch_h = batch_h.transpose()
+            batch_t = batch_t.transpose()
+            batch_r = batch_r.transpose()
+        else:
+            self.cross_sampling_flag = 1 - self.cross_sampling_flag
+            if self.cross_sampling_flag == 0:
+                batch_data["mode"] = "head_batch"
+                batch_h = np.array([[item[0]] for item in data])
+                batch_t = np.array([item[1] for item in data])
+                batch_r = np.array([item[2] for item in data])
+                batch_h = np.repeat(batch_h, 1 + self.neg_ent, axis=-1)
+                for index, item in enumerate(data):
+                    neg_head = self.__head_batch(
+                        item[0], item[1], item[2], self.neg_ent
+                    )
+                    batch_h[index][1:] = neg_head
+                batch_h = batch_h.transpose()
+            else:
+                batch_data["mode"] = "tail_batch"
+                batch_h = np.array([item[0] for item in data])
+                batch_t = np.array([[item[1]] for item in data])
+                batch_r = np.array([item[2] for item in data])
+                batch_t = np.repeat(batch_t, 1 + self.neg_ent, axis=-1)
+                for index, item in enumerate(data):
+                    neg_tail = self.__tail_batch(
+                        item[0], item[1], item[2], self.neg_ent
+                    )
+                    batch_t[index][1:] = neg_tail
+                batch_t = batch_t.transpose()
+
+        batch_y = np.concatenate(
+            [
+                np.ones((len(data), 1)),
+                np.zeros((len(data), self.neg_ent + self.neg_rel)),
+            ],
+            -1,
+        ).transpose()
+        batch_data["batch_h"] = batch_h.squeeze()
+        batch_data["batch_t"] = batch_t.squeeze()
+        batch_data["batch_r"] = batch_r.squeeze()
+        batch_data["batch_y"] = batch_y.squeeze()
+        return batch_data
+
+    def __count_htr(self):
+
+        self.h_of_tr = {}
+        self.t_of_hr = {}
+        self.r_of_ht = {}
+        self.h_of_r = {}
+        self.t_of_r = {}
+        self.freqRel = {}
+        self.lef_mean = {}
+        self.rig_mean = {}
+
+        triples = zip(self.head, self.tail, self.rel)
+        for h, t, r in triples:
+            if (h, r) not in self.t_of_hr:
+                self.t_of_hr[(h, r)] = []
+            self.t_of_hr[(h, r)].append(t)
+            if (t, r) not in self.h_of_tr:
+                self.h_of_tr[(t, r)] = []
+            self.h_of_tr[(t, r)].append(h)
+            if (h, t) not in self.r_of_ht:
+                self.r_of_ht[(h, t)] = []
+            self.r_of_ht[(h, t)].append(r)
+            if r not in self.freqRel:
+                self.freqRel[r] = 0
+                self.h_of_r[r] = {}
+                self.t_of_r[r] = {}
+            self.freqRel[r] += 1.0
+            self.h_of_r[r][h] = 1
+            self.t_of_r[r][t] = 1
+
+        for t, r in self.h_of_tr:
+            self.h_of_tr[(t, r)] = np.array(list(set(self.h_of_tr[(t, r)])))
+        for h, r in self.t_of_hr:
+            self.t_of_hr[(h, r)] = np.array(list(set(self.t_of_hr[(h, r)])))
+        for h, t in self.r_of_ht:
+            self.r_of_ht[(h, t)] = np.array(list(set(self.r_of_ht[(h, t)])))
+        for r in range(self.rel_total):
+            self.h_of_r[r] = np.array(list(self.h_of_r[r].keys()))
+            self.t_of_r[r] = np.array(list(self.t_of_r[r].keys()))
+            self.lef_mean[r] = self.freqRel[r] / len(self.h_of_r[r])
+            self.rig_mean[r] = self.freqRel[r] / len(self.t_of_r[r])
+
+    def __corrupt_head(self, t, r, num_max=1):
+        tmp = torch.randint(low=0, high=self.ent_total, size=(num_max,)).numpy()
+        if not self.filter_flag:
+            return tmp
+        mask = np.in1d(tmp, self.h_of_tr[(t, r)], assume_unique=True, invert=True)
+        neg = tmp[mask]
+        return neg
+
+    def __corrupt_tail(self, h, r, num_max=1):
+        tmp = torch.randint(low=0, high=self.ent_total, size=(num_max,)).numpy()
+        if not self.filter_flag:
+            return tmp
+        mask = np.in1d(tmp, self.t_of_hr[(h, r)], assume_unique=True, invert=True)
+        neg = tmp[mask]
+        return neg
+
+    def __corrupt_rel(self, h, t, num_max=1):
+        tmp = torch.randint(low=0, high=self.rel_total, size=(num_max,)).numpy()
+        if not self.filter_flag:
+            return tmp
+        mask = np.in1d(tmp, self.r_of_ht[(h, t)], assume_unique=True, invert=True)
+        neg = tmp[mask]
+        return neg
+
+    def __normal_batch(self, h, t, r, neg_size):
+        neg_size_h = 0
+        neg_size_t = 0
+        prob = (
+            self.rig_mean[r] / (self.rig_mean[r] + self.lef_mean[r])
+            if self.bern_flag
+            else 0.5
+        )
+        for i in range(neg_size):
+            if random.random() < prob:
+                neg_size_h += 1
+            else:
+                neg_size_t += 1
+
+        neg_list_h = []
+        neg_cur_size = 0
+        while neg_cur_size < neg_size_h:
+            neg_tmp_h = self.__corrupt_head(
+                t, r, num_max=(neg_size_h - neg_cur_size) * 2
+            )
+            neg_list_h.append(neg_tmp_h)
+            neg_cur_size += len(neg_tmp_h)
+        if neg_list_h != []:
+            neg_list_h = np.concatenate(neg_list_h)
+
+        neg_list_t = []
+        neg_cur_size = 0
+        while neg_cur_size < neg_size_t:
+            neg_tmp_t = self.__corrupt_tail(
+                h, r, num_max=(neg_size_t - neg_cur_size) * 2
+            )
+            neg_list_t.append(neg_tmp_t)
+            neg_cur_size += len(neg_tmp_t)
+        if neg_list_t != []:
+            neg_list_t = np.concatenate(neg_list_t)
+
+        return neg_list_h[:neg_size_h], neg_list_t[:neg_size_t]
+
+    def __head_batch(self, h, t, r, neg_size):
+        # return torch.randint(low = 0, high = self.ent_total, size = (neg_size, )).numpy()
+        neg_list = []
+        neg_cur_size = 0
+        while neg_cur_size < neg_size:
+            neg_tmp = self.__corrupt_head(t, r, num_max=(neg_size - neg_cur_size) * 2)
+            neg_list.append(neg_tmp)
+            neg_cur_size += len(neg_tmp)
+        return np.concatenate(neg_list)[:neg_size]
+
+    def __tail_batch(self, h, t, r, neg_size):
+        # return torch.randint(low = 0, high = self.ent_total, size = (neg_size, )).numpy()
+        neg_list = []
+        neg_cur_size = 0
+        while neg_cur_size < neg_size:
+            neg_tmp = self.__corrupt_tail(h, r, num_max=(neg_size - neg_cur_size) * 2)
+            neg_list.append(neg_tmp)
+            neg_cur_size += len(neg_tmp)
+        return np.concatenate(neg_list)[:neg_size]
+
+    def __rel_batch(self, h, t, r, neg_size):
+        neg_list = []
+        neg_cur_size = 0
+        while neg_cur_size < neg_size:
+            neg_tmp = self.__corrupt_rel(h, t, num_max=(neg_size - neg_cur_size) * 2)
+            neg_list.append(neg_tmp)
+            neg_cur_size += len(neg_tmp)
+        return np.concatenate(neg_list)[:neg_size]
+
+    def set_sampling_mode(self, sampling_mode):
+        self.sampling_mode = sampling_mode
+
+    def set_ent_neg_rate(self, rate):
+        self.neg_ent = rate
+
+    def set_rel_neg_rate(self, rate):
+        self.neg_rel = rate
+
+    def set_bern_flag(self, bern_flag):
+        self.bern_flag = bern_flag
+
+    def set_filter_flag(self, filter_flag):
+        self.filter_flag = filter_flag
+
+    def get_ent_tot(self):
+        return self.ent_total
+
+    def get_rel_tot(self):
+        return self.rel_total
+
+    def get_tri_tot(self):
+        return self.tri_total
+
+
+class PyTorchTrainDataLoader(DataLoader):
+    def __init__(
+        self,
+        in_path=None,
+        tri_file=None,
+        ent_file=None,
+        rel_file=None,
+        batch_size=None,
+        nbatches=None,
+        threads=8,
+        sampling_mode="normal",
+        bern_flag=False,
+        filter_flag=True,
+        neg_ent=1,
+        neg_rel=0,
+        shuffle=True,
+        drop_last=True,
+    ):
+
+        self.in_path = in_path
+        self.tri_file = tri_file
+        self.ent_file = ent_file
+        self.rel_file = rel_file
+        if in_path != None:
+            self.tri_file = in_path + "train2id.txt"
+            self.ent_file = in_path + "entity2id.txt"
+            self.rel_file = in_path + "relation2id.txt"
+
+        dataset = self.__construct_dataset(
+            sampling_mode, bern_flag, filter_flag, neg_ent, neg_rel
+        )
+
+        self.batch_size = batch_size
+        self.nbatches = nbatches
+        if batch_size == None:
+            self.batch_size = dataset.get_tri_tot() // nbatches
+        if nbatches == None:
+            self.nbatches = dataset.get_tri_tot() // batch_size
+
+        super(PyTorchTrainDataLoader, self).__init__(
+            dataset=dataset,
+            batch_size=self.batch_size,
+            shuffle=shuffle,
+            pin_memory=True,
+            num_workers=threads,
+            collate_fn=dataset.collate_fn,
+            drop_last=drop_last,
+        )
+
+    def __construct_dataset(
+        self, sampling_mode, bern_flag, filter_flag, neg_ent, neg_rel
+    ):
+        f = open(self.ent_file, "r")
+        ent_total = (int)(f.readline())
+        f.close()
+
+        f = open(self.rel_file, "r")
+        rel_total = (int)(f.readline())
+        f.close()
+
+        head = []
+        tail = []
+        rel = []
+
+        f = open(self.tri_file, "r")
+        triples_total = (int)(f.readline())
+        for index in range(triples_total):
+            h, t, r = f.readline().strip().split()
+            head.append((int)(h))
+            tail.append((int)(t))
+            rel.append((int)(r))
+        f.close()
+
+        dataset = PyTorchTrainDataset(
+            np.array(head),
+            np.array(tail),
+            np.array(rel),
+            ent_total,
+            rel_total,
+            sampling_mode,
+            bern_flag,
+            filter_flag,
+            neg_ent,
+            neg_rel,
+        )
+        return dataset
+
+    """interfaces to set essential parameters"""
+
+    def set_sampling_mode(self, sampling_mode):
+        self.dataset.set_sampling_mode(sampling_mode)
+
+    def set_work_threads(self, work_threads):
+        self.num_workers = work_threads
+
+    def set_nbatches(self, nbatches):
+        self.nbatches = nbatches
+        self.batch_size = self.tripleTotal // self.nbatches
+
+    def set_batch_size(self, batch_size):
+        self.batch_size = batch_size
+        self.nbatches = self.tripleTotal // self.batch_size
+
+    def set_ent_neg_rate(self, rate):
+        self.dataset.set_ent_neg_rate(rate)
+
+    def set_rel_neg_rate(self, rate):
+        self.dataset.set_rel_neg_rate(rate)
+
+    def set_bern_flag(self, bern_flag):
+        self.dataset.set_bern_flag(bern_flag)
+
+    def set_filter_flag(self, filter_flag):
+        self.dataset.set_filter_flag(filter_flag)
+
+    """interfaces to get essential parameters"""
+
+    def get_batch_size(self):
+        return self.batch_size
+
+    def get_ent_tot(self):
+        return self.dataset.get_ent_tot()
+
+    def get_rel_tot(self):
+        return self.dataset.get_rel_tot()
+
+    def get_triple_tot(self):
+        return self.dataset.get_tri_tot()
diff --git a/seed_embeddings/OpenKE/data/TestDataLoader.py b/seed_embeddings/OpenKE/data/TestDataLoader.py
new file mode 100755
index 000000000..95b600ae5
--- /dev/null
+++ b/seed_embeddings/OpenKE/data/TestDataLoader.py
@@ -0,0 +1,161 @@
+# coding:utf-8
+import os
+import ctypes
+import numpy as np
+
+
+class TestDataSampler(object):
+    def __init__(self, data_total, data_sampler):
+        self.data_total = data_total
+        self.data_sampler = data_sampler
+        self.total = 0
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        self.total += 1
+        if self.total > self.data_total:
+            raise StopIteration()
+        return self.data_sampler()
+
+    def __len__(self):
+        return self.data_total
+
+
+class TestDataLoader(object):
+    def __init__(self, in_path="./", sampling_mode="link", type_constrain=False):
+        base_file = os.path.abspath(
+            os.path.join(os.path.dirname(__file__), "../release/Base.so")
+        )
+        self.lib = ctypes.cdll.LoadLibrary(base_file)
+        """for link prediction"""
+        self.lib.getHeadBatch.argtypes = [
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+        ]
+        self.lib.getTailBatch.argtypes = [
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+        ]
+        """for triple classification"""
+        self.lib.getTestBatch.argtypes = [
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+        ]
+        """set essential parameters"""
+        self.in_path = in_path
+        self.sampling_mode = sampling_mode
+        self.type_constrain = type_constrain
+        self.read()
+
+    def read(self):
+        self.lib.setInPath(
+            ctypes.create_string_buffer(self.in_path.encode(), len(self.in_path) * 2)
+        )
+        self.lib.randReset()
+        self.lib.importTestFiles()
+
+        if self.type_constrain:
+            self.lib.importTypeFiles()
+
+        self.relTotal = self.lib.getRelationTotal()
+        self.entTotal = self.lib.getEntityTotal()
+        self.testTotal = self.lib.getTestTotal()
+
+        self.test_h = np.zeros(self.entTotal, dtype=np.int64)
+        self.test_t = np.zeros(self.entTotal, dtype=np.int64)
+        self.test_r = np.zeros(self.entTotal, dtype=np.int64)
+        self.test_h_addr = self.test_h.__array_interface__["data"][0]
+        self.test_t_addr = self.test_t.__array_interface__["data"][0]
+        self.test_r_addr = self.test_r.__array_interface__["data"][0]
+
+        self.test_pos_h = np.zeros(self.testTotal, dtype=np.int64)
+        self.test_pos_t = np.zeros(self.testTotal, dtype=np.int64)
+        self.test_pos_r = np.zeros(self.testTotal, dtype=np.int64)
+        self.test_pos_h_addr = self.test_pos_h.__array_interface__["data"][0]
+        self.test_pos_t_addr = self.test_pos_t.__array_interface__["data"][0]
+        self.test_pos_r_addr = self.test_pos_r.__array_interface__["data"][0]
+        self.test_neg_h = np.zeros(self.testTotal, dtype=np.int64)
+        self.test_neg_t = np.zeros(self.testTotal, dtype=np.int64)
+        self.test_neg_r = np.zeros(self.testTotal, dtype=np.int64)
+        self.test_neg_h_addr = self.test_neg_h.__array_interface__["data"][0]
+        self.test_neg_t_addr = self.test_neg_t.__array_interface__["data"][0]
+        self.test_neg_r_addr = self.test_neg_r.__array_interface__["data"][0]
+
+    def sampling_lp(self):
+        res = []
+        self.lib.getHeadBatch(self.test_h_addr, self.test_t_addr, self.test_r_addr)
+        res.append(
+            {
+                "batch_h": self.test_h.copy(),
+                "batch_t": self.test_t[:1].copy(),
+                "batch_r": self.test_r[:1].copy(),
+                "mode": "head_batch",
+            }
+        )
+        self.lib.getTailBatch(self.test_h_addr, self.test_t_addr, self.test_r_addr)
+        res.append(
+            {
+                "batch_h": self.test_h[:1],
+                "batch_t": self.test_t,
+                "batch_r": self.test_r[:1],
+                "mode": "tail_batch",
+            }
+        )
+        return res
+
+    def sampling_tc(self):
+        self.lib.getTestBatch(
+            self.test_pos_h_addr,
+            self.test_pos_t_addr,
+            self.test_pos_r_addr,
+            self.test_neg_h_addr,
+            self.test_neg_t_addr,
+            self.test_neg_r_addr,
+        )
+        return [
+            {
+                "batch_h": self.test_pos_h,
+                "batch_t": self.test_pos_t,
+                "batch_r": self.test_pos_r,
+                "mode": "normal",
+            },
+            {
+                "batch_h": self.test_neg_h,
+                "batch_t": self.test_neg_t,
+                "batch_r": self.test_neg_r,
+                "mode": "normal",
+            },
+        ]
+
+    """interfaces to get essential parameters"""
+
+    def get_ent_tot(self):
+        return self.entTotal
+
+    def get_rel_tot(self):
+        return self.relTotal
+
+    def get_triple_tot(self):
+        return self.testTotal
+
+    def set_sampling_mode(self, sampling_mode):
+        self.sampling_mode = sampling_mode
+
+    def __len__(self):
+        return self.testTotal
+
+    def __iter__(self):
+        if self.sampling_mode == "link":
+            self.lib.initTest()
+            return TestDataSampler(self.testTotal, self.sampling_lp)
+        else:
+            self.lib.initTest()
+            return TestDataSampler(1, self.sampling_tc)
diff --git a/seed_embeddings/OpenKE/data/TrainDataLoader.py b/seed_embeddings/OpenKE/data/TrainDataLoader.py
new file mode 100755
index 000000000..c437357e2
--- /dev/null
+++ b/seed_embeddings/OpenKE/data/TrainDataLoader.py
@@ -0,0 +1,252 @@
+# coding:utf-8
+import os
+import ctypes
+import numpy as np
+
+
+class TrainDataSampler(object):
+    def __init__(self, nbatches, datasampler):
+        self.nbatches = nbatches
+        self.datasampler = datasampler
+        self.batch = 0
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        self.batch += 1
+        if self.batch > self.nbatches:
+            raise StopIteration()
+        return self.datasampler()
+
+    def __len__(self):
+        return self.nbatches
+
+
+class TrainDataLoader(object):
+    def __init__(
+        self,
+        in_path="./",
+        tri_file=None,
+        ent_file=None,
+        rel_file=None,
+        batch_size=None,
+        nbatches=None,
+        threads=8,
+        sampling_mode="normal",
+        bern_flag=False,
+        filter_flag=True,
+        neg_ent=1,
+        neg_rel=0,
+    ):
+
+        base_file = os.path.abspath(
+            os.path.join(os.path.dirname(__file__), "../release/Base.so")
+        )
+        self.lib = ctypes.cdll.LoadLibrary(base_file)
+        """argtypes"""
+        self.lib.sampling.argtypes = [
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_void_p,
+            ctypes.c_int64,
+            ctypes.c_int64,
+            ctypes.c_int64,
+            ctypes.c_int64,
+            ctypes.c_int64,
+            ctypes.c_int64,
+            ctypes.c_int64,
+        ]
+        self.in_path = in_path
+        self.tri_file = tri_file
+        self.ent_file = ent_file
+        self.rel_file = rel_file
+        if in_path != None:
+            self.tri_file = in_path + "train2id.txt"
+            self.ent_file = in_path + "entity2id.txt"
+            self.rel_file = in_path + "relation2id.txt"
+        """set essential parameters"""
+        self.work_threads = threads
+        self.nbatches = nbatches
+        self.batch_size = batch_size
+        self.bern = bern_flag
+        self.filter = filter_flag
+        self.negative_ent = neg_ent
+        self.negative_rel = neg_rel
+        self.sampling_mode = sampling_mode
+        self.cross_sampling_flag = 0
+        self.read()
+
+    def read(self):
+        if self.in_path != None:
+            self.lib.setInPath(
+                ctypes.create_string_buffer(
+                    self.in_path.encode(), len(self.in_path) * 2
+                )
+            )
+        else:
+            self.lib.setTrainPath(
+                ctypes.create_string_buffer(
+                    self.tri_file.encode(), len(self.tri_file) * 2
+                )
+            )
+            self.lib.setEntPath(
+                ctypes.create_string_buffer(
+                    self.ent_file.encode(), len(self.ent_file) * 2
+                )
+            )
+            self.lib.setRelPath(
+                ctypes.create_string_buffer(
+                    self.rel_file.encode(), len(self.rel_file) * 2
+                )
+            )
+
+        self.lib.setBern(self.bern)
+        self.lib.setWorkThreads(self.work_threads)
+        self.lib.randReset()
+        self.lib.importTrainFiles()
+        self.relTotal = self.lib.getRelationTotal()
+        self.entTotal = self.lib.getEntityTotal()
+        self.tripleTotal = self.lib.getTrainTotal()
+        print("Triple Total : ", self.tripleTotal)
+        if self.batch_size == None:
+            self.batch_size = self.tripleTotal // self.nbatches
+        if self.nbatches == None:
+            self.nbatches = self.tripleTotal // self.batch_size
+        self.batch_seq_size = self.batch_size * (
+            1 + self.negative_ent + self.negative_rel
+        )
+        print("self.batch_size : ", self.batch_size)
+        print("self.batch_seq_size : ", self.batch_seq_size)
+        self.batch_h = np.zeros(self.batch_seq_size, dtype=np.int64)
+        self.batch_t = np.zeros(self.batch_seq_size, dtype=np.int64)
+        self.batch_r = np.zeros(self.batch_seq_size, dtype=np.int64)
+        self.batch_y = np.zeros(self.batch_seq_size, dtype=np.float32)
+        self.batch_h_addr = self.batch_h.__array_interface__["data"][0]
+        self.batch_t_addr = self.batch_t.__array_interface__["data"][0]
+        self.batch_r_addr = self.batch_r.__array_interface__["data"][0]
+        self.batch_y_addr = self.batch_y.__array_interface__["data"][0]
+
+    def sampling(self):
+        self.lib.sampling(
+            self.batch_h_addr,
+            self.batch_t_addr,
+            self.batch_r_addr,
+            self.batch_y_addr,
+            self.batch_size,
+            self.negative_ent,
+            self.negative_rel,
+            0,
+            self.filter,
+            0,
+            0,
+        )
+        return {
+            "batch_h": self.batch_h,
+            "batch_t": self.batch_t,
+            "batch_r": self.batch_r,
+            "batch_y": self.batch_y,
+            "mode": "normal",
+        }
+
+    def sampling_head(self):
+        self.lib.sampling(
+            self.batch_h_addr,
+            self.batch_t_addr,
+            self.batch_r_addr,
+            self.batch_y_addr,
+            self.batch_size,
+            self.negative_ent,
+            self.negative_rel,
+            -1,
+            self.filter,
+            0,
+            0,
+        )
+        return {
+            "batch_h": self.batch_h,
+            "batch_t": self.batch_t[: self.batch_size],
+            "batch_r": self.batch_r[: self.batch_size],
+            "batch_y": self.batch_y,
+            "mode": "head_batch",
+        }
+
+    def sampling_tail(self):
+        self.lib.sampling(
+            self.batch_h_addr,
+            self.batch_t_addr,
+            self.batch_r_addr,
+            self.batch_y_addr,
+            self.batch_size,
+            self.negative_ent,
+            self.negative_rel,
+            1,
+            self.filter,
+            0,
+            0,
+        )
+        return {
+            "batch_h": self.batch_h[: self.batch_size],
+            "batch_t": self.batch_t,
+            "batch_r": self.batch_r[: self.batch_size],
+            "batch_y": self.batch_y,
+            "mode": "tail_batch",
+        }
+
+    def cross_sampling(self):
+        self.cross_sampling_flag = 1 - self.cross_sampling_flag
+        if self.cross_sampling_flag == 0:
+            return self.sampling_head()
+        else:
+            return self.sampling_tail()
+
+    """interfaces to set essential parameters"""
+
+    def set_work_threads(self, work_threads):
+        self.work_threads = work_threads
+
+    def set_in_path(self, in_path):
+        self.in_path = in_path
+
+    def set_nbatches(self, nbatches):
+        self.nbatches = nbatches
+
+    def set_batch_size(self, batch_size):
+        self.batch_size = batch_size
+        self.nbatches = self.tripleTotal // self.batch_size
+
+    def set_ent_neg_rate(self, rate):
+        self.negative_ent = rate
+
+    def set_rel_neg_rate(self, rate):
+        self.negative_rel = rate
+
+    def set_bern_flag(self, bern):
+        self.bern = bern
+
+    def set_filter_flag(self, filter):
+        self.filter = filter
+
+    """interfaces to get essential parameters"""
+
+    def get_batch_size(self):
+        return self.batch_size
+
+    def get_ent_tot(self):
+        return self.entTotal
+
+    def get_rel_tot(self):
+        return self.relTotal
+
+    def get_triple_tot(self):
+        return self.tripleTotal
+
+    def __iter__(self):
+        if self.sampling_mode == "normal":
+            return TrainDataSampler(self.nbatches, self.sampling)
+        else:
+            return TrainDataSampler(self.nbatches, self.cross_sampling)
+
+    def __len__(self):
+        return self.nbatches
diff --git a/seed_embeddings/OpenKE/data/__init__.py b/seed_embeddings/OpenKE/data/__init__.py
new file mode 100755
index 000000000..714bec0f8
--- /dev/null
+++ b/seed_embeddings/OpenKE/data/__init__.py
@@ -0,0 +1,8 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from .TrainDataLoader import TrainDataLoader
+from .TestDataLoader import TestDataLoader
+
+__all__ = ["TrainDataLoader", "TestDataLoader"]
diff --git a/seed_embeddings/OpenKE/generate_embedding.py b/seed_embeddings/OpenKE/generate_embedding.py
index 3108fa895..f7fa43cfa 100644
--- a/seed_embeddings/OpenKE/generate_embedding.py
+++ b/seed_embeddings/OpenKE/generate_embedding.py
@@ -3,82 +3,153 @@
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 
-import config
-import models
-import tensorflow as tf
 import numpy as np
 import os
 import sys
 import json
 import argparse
 
+from config import Trainer, Tester
+from module.model import TransE
+from module.loss import MarginLoss
+from module.strategy import NegativeSampling
+from data import TrainDataLoader, TestDataLoader
+
+import analogy
+
 os.environ["CUDA_VISIBLE_DEVICES"] = "0"
 
 
+def test_files(index_dir):
+    entities = os.path.join(index_dir, "entity2id.txt")
+    relations = os.path.join(index_dir, "relation2id.txt")
+    train = os.path.join(index_dir, "train2id.txt")
+
+    print(entities, relations, train)
+
+    if not os.path.exists(entities):
+        raise Exception("entity2id.txt not found")
+    if not os.path.exists(relations):
+        raise Exception("relation2id.txt not found")
+    if not os.path.exists(train):
+        raise Exception("train2id.txt not found")
+
+
+# TODO :: alpha, lmda, bern, opt_method
 def train(arg_conf):
-    con = config.Config()
-    con.set_in_path(arg_conf.index_dir)
-    con.set_work_threads(4)
-    con.set_train_times(arg_conf.epoch)
-    con.set_nbatches(nbatches=arg_conf.nbatches)
-    con.set_alpha(0.001)
-    con.set_margin(arg_conf.margin)
-    con.set_bern(0)
-    con.set_dimension(arg_conf.dim)
-    con.set_ent_neg_rate(1)
-    con.set_rel_neg_rate(0)
-    con.set_opt_method("SGD")
-
-    outfile = os.path.join(
+
+    try:
+        test_files(arg_conf.index_dir)
+        print("Files are OK")
+    except:
+        print(arg_conf)
+        print("Error in files")
+        raise Exception("Error in files")
+
+    # dataloader for training
+
+    train_dataloader = TrainDataLoader(
+        in_path=arg_conf.index_dir,
+        nbatches=arg_conf.nbatches,
+        threads=4,
+        sampling_mode="normal",
+        bern_flag=0,
+        filter_flag=1,
+        neg_ent=22,
+        neg_rel=1,
+    )
+
+    # dataloader for test (link prediction)
+    test_dataloader = None
+    # test_dataloader = TestDataLoader(arg_conf.index_dir, "link")
+
+    transe = TransE(
+        ent_tot=train_dataloader.get_ent_tot(),
+        rel_tot=train_dataloader.get_rel_tot(),
+        dim=arg_conf.dim,
+        p_norm=1,
+        norm_flag=True,
+    )
+
+    # define the loss function
+    model = NegativeSampling(
+        model=transe,
+        loss=MarginLoss(margin=arg_conf.margin),
+        batch_size=train_dataloader.get_batch_size(),
+    )
+    checkpoint_dir = os.path.join(
         arg_conf.index_dir,
-        "seedEmbedding_{}E_{}D_{}batches{}margin.json".format(
+        "checkpoint_{}E_{}D_{}batches{}margin/".format(
             arg_conf.epoch,
             arg_conf.dim,
             arg_conf.nbatches,
             arg_conf.margin,
         ),
     )
-    con.set_out_files(outfile)
-    con.init()
-    # Set the knowledge embedding model
-    con.set_model(models.TransE)
-    # Train the model.
-    con.run()
-    return outfile
-
-
-def findRep(src, dest, ent):
-    f = open(src)
-    data = json.loads(f.read())
-    rep = data["ent_embeddings"]
-    f.close()
-    f = open(os.path.join(ent, "entity2id.txt"))
-    content = f.read()
-    f.close()
-
-    f = open(dest, "w")
-    entities = content.split("\n")
-    toTxt = ""
+
+    # train the model
+    trainer = Trainer(
+        model=model,
+        data_loader=train_dataloader,
+        train_times=arg_conf.epoch,
+        alpha=0.00729,
+        opt_method="Adam",
+        checkpoint_dir=checkpoint_dir,
+    )
+    trainer.run(
+        link_prediction=False,
+        test_dataloader=test_dataloader,
+        model=transe,
+        ray=False,
+        is_analogy=True,
+    )
+
+    return checkpoint_dir
+
+
+def findRep(src, dest, index_dir):
+    with open(src) as fSource:
+        data = json.load(fSource)
+        rep = data["ent_embeddings"]
+
+    with open(os.path.join(index_dir, "entity2id.txt")) as fEntity:
+        content = fEntity.read()
+
+    with open(dest, "w") as fDest:
+        entities = content.split("\n")
+        toTxt = ""
+    print("Training finished...")
 
     for i in range(1, int(entities[0])):
         toTxt += entities[i].split("\t")[0] + ":" + str(rep[i - 1]) + ",\n"
     toTxt += (
         entities[int(entities[0])].split("\t")[0] + ":" + str(rep[int(entities[0]) - 1])
     )
-    f.write(toTxt)
+    fDest.write(toTxt)
 
 
 if __name__ == "__main__":
+
     parser = argparse.ArgumentParser()
     parser.add_argument(
         "--index_dir",
         dest="index_dir",
         metavar="DIRECTORY",
-        help="Location of th directory entity2id.txt, train2id.txt and relation2id.txt",
-        required=True,
+        help="Location of the directory entity2id.txt, train2id.txt and relation2id.txt",
+        required=False,
+        default="../seed_embeddings/preprocessed/",
     )
     parser.add_argument(
-        "--epoch", dest="epoch", help="Epochs", required=False, type=int, default=1500
+        "--epoch", dest="epoch", help="Epochs", required=False, type=int, default=1000
+    )
+
+    parser.add_argument(
+        "--is_analogy",
+        dest="is_analogy",
+        help="Uses Analogies while training",
+        required=False,
+        type=bool,
+        default=False,
     )
     parser.add_argument(
         "--dim",
@@ -86,15 +157,16 @@ def findRep(src, dest, ent):
         help="Dimension of the embedding",
         required=False,
         type=int,
-        default=300,
+        default=500,
     )
+
     parser.add_argument(
         "--nbatches",
         dest="nbatches",
         help="Number of batches",
         required=False,
         type=int,
-        default=100,
+        default=256,
     )
     parser.add_argument(
         "--margin",
@@ -102,12 +174,12 @@ def findRep(src, dest, ent):
         help="Margin",
         required=False,
         type=float,
-        default=1.0,
+        default=4.0,
     )
 
     arg_conf = parser.parse_args()
 
-    outfilejson = train(arg_conf)
+    outfile = train(arg_conf)
 
     seedfile = os.path.join(
         arg_conf.index_dir,
diff --git a/seed_embeddings/OpenKE/generate_embedding_ray.py b/seed_embeddings/OpenKE/generate_embedding_ray.py
index 86c445af1..8eb70a73c 100644
--- a/seed_embeddings/OpenKE/generate_embedding_ray.py
+++ b/seed_embeddings/OpenKE/generate_embedding_ray.py
@@ -3,22 +3,30 @@
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 
-import config
-import models
-import tensorflow as tf
 import numpy as np
 import os
 import sys
 import json
 import argparse
-
+import shutil
+import re
+
+from config import Trainer, Tester
+from module.model import TransE
+from module.loss import MarginLoss
+from module.strategy import NegativeSampling
+from data import TrainDataLoader, TestDataLoader
+import torch
 import analogy
 
 import ray
 from ray import tune
 from ray.tune.tune_config import TuneConfig
+from ray.train import RunConfig, CheckpointConfig
+from ray.tune.schedulers import ASHAScheduler
+from ray.tune.search.optuna import OptunaSearch
 
-os.environ["CUDA_VISIBLE_DEVICES"] = "0"
+os.environ["CUDA_VISIBLE_DEVICES"] = "0,1"
 
 
 def test_files(index_dir):
@@ -27,7 +35,6 @@ def test_files(index_dir):
     train = os.path.join(index_dir, "train2id.txt")
 
     print(entities, relations, train)
-
     if not os.path.exists(entities):
         raise Exception("entity2id.txt not found")
     if not os.path.exists(relations):
@@ -36,88 +43,109 @@ def test_files(index_dir):
         raise Exception("train2id.txt not found")
 
 
-# TODO :: alpha, lmda, bern, opt_method
-def train(arg_conf):
-    con = config.Config()
-    con.set_in_path(arg_conf["index_dir"])
-    con.set_work_threads(4)
-    con.set_train_times(arg_conf["epoch"])
-    con.set_nbatches(nbatches=arg_conf["nbatches"])
-    con.set_alpha(0.001)
-    con.set_margin(arg_conf["margin"])
-    con.set_bern(0)  # either 0 or 1
-    con.set_dimension(arg_conf["dim"])
-    con.set_ent_neg_rate(1)
-    con.set_rel_neg_rate(0)
-    con.set_opt_method("SGD")
+def train(config, args=None):
+    # dataloader for training
+    train_dataloader = TrainDataLoader(
+        in_path=args.index_dir,
+        batch_size=config["batch_size"],
+        threads=4,
+        sampling_mode="normal",
+        # bern_flag=config["bern"],
+        filter_flag=1,
+        # neg_ent=config["neg_ent"],
+        # neg_rel=config["neg_rel"],
+    )
+    # dataloader for test (link prediction)
+    if args.link_pred:
+        test_dataloader = TestDataLoader(args.index_dir, "link")
+    else:
+        test_dataloader = None
+
+    transe = TransE(
+        ent_tot=train_dataloader.get_ent_tot(),
+        rel_tot=train_dataloader.get_rel_tot(),
+        dim=args.dim,
+        p_norm=1,
+        norm_flag=True,
+    )
+    # define the loss function
+    model = NegativeSampling(
+        model=transe,
+        loss=MarginLoss(margin=config["margin"]),
+        batch_size=train_dataloader.get_batch_size(),
+    )
+    # train the model
+    trainer = Trainer(
+        model=model,
+        data_loader=train_dataloader,
+        train_times=args.epoch,
+        alpha=config["alpha"],
+        index_dir=args.index_dir,
+        use_gpu=args.use_gpu,
+        analogy_file=args.analogy_file,
+    )
+    trainer.run(
+        link_prediction=args.link_pred,
+        test_dataloader=test_dataloader,
+        model=transe,
+        is_analogy=args.is_analogy,
+    )
 
-    try:
-        test_files(arg_conf["index_dir"])
-        print("Files are OK")
-    except:
-        print(arg_conf)
-        print("Error in files")
-        raise Exception("Error in files")
 
-    outfile = os.path.join(
-        arg_conf["index_dir"],
-        "seedEmbedding_{}E_{}D_{}batches{}margin.json".format(
-            arg_conf["epoch"],
-            arg_conf["dim"],
-            arg_conf["nbatches"],
-            arg_conf["margin"],
-        ),
-    )
-    con.set_out_files(outfile)
-    con.init()
-    # Set the knowledge embedding model
-    con.set_model(models.TransE)
-    # Train the model.
-    con.run()
-
-    seedfile = os.path.join(
-        arg_conf["index_dir"],
-        "embeddings/seedEmbedding_{}E_{}D_{}batches{}margin.txt".format(
-            arg_conf["epoch"], arg_conf["dim"], arg_conf["nbatches"], arg_conf["margin"]
-        ),
+def findRep(src, index_dir, src_type="json"):
+    rep = None
+    if src_type == "json":
+        with open(src) as fSource:
+            data = json.load(fSource)
+
+            rep = data["model.ent_embeddings.weight"]
+    elif src_type == "ckpt":
+        checkpoint = torch.load(src)
+        # Access the entity embeddings from the model state_dict
+        rep = checkpoint["model.ent_embeddings.weight"].cpu().detach().numpy()
+
+    with open(os.path.join(index_dir, "entity2id.txt")) as fEntity:
+        content = fEntity.read()
+
+    entities = content.split("\n")
+    toTxt = ""
+    for i in range(1, int(entities[0])):
+        toTxt += entities[i].split("\t")[0] + ":" + str(rep[i - 1]) + ",\n"
+    toTxt += (
+        entities[int(entities[0])].split("\t")[0] + ":" + str(rep[int(entities[0]) - 1])
     )
+    return toTxt
 
-    findRep(outfile, seedfile, arg_conf["index_dir"])
 
-    del con
+def reformat_embeddings(input_str):
+    # Split the string by '],' to isolate each object
+    entries = input_str.split("],")
 
-    return {
-        "seedFile": seedfile,
-        "AnalogiesScore": analogy.getAnalogyScore(seedfile),
-    }
+    formatted_entries = []
 
+    for entry in entries:
+        # Remove any newline characters
+        cleaned_entry = entry.replace("\n", " ")
 
-def findRep(src, dest, index_dir):
-    with open(src) as fSource:
-        data = json.load(fSource)
-        rep = data["ent_embeddings"]
+        # Split the object name from the values part
+        obj_name, values = cleaned_entry.split(":[")
 
-    with open(os.path.join(index_dir, "entity2id.txt")) as fEntity:
-        content = fEntity.read()
+        # Remove extra spaces and replace multiple spaces with a single one using regex
+        values = re.sub(r"\s+", " ", values.split("]")[0].strip())
 
-    with open(dest, "w") as fDest:
-        entities = content.split("\n")
-        toTxt = ""
+        # Replace spaces between numbers with commas and add the closing bracket
+        formatted_values = values.replace(" ", ", ") + "]"
 
-        for i in range(1, int(entities[0])):
-            toTxt += entities[i].split("\t")[0] + ":" + str(rep[i - 1]) + ",\n"
-        toTxt += (
-            entities[int(entities[0])].split("\t")[0]
-            + ":"
-            + str(rep[int(entities[0]) - 1])
-        )
-        fDest.write(toTxt)
+        # Recombine the object name with the formatted values
+        formatted_entry = f"{obj_name.strip()}:[{formatted_values}"
+        formatted_entries.append(formatted_entry)
 
+    # Join all entries back into one string, separated by newline
+    return "\n".join(formatted_entries)
 
-if __name__ == "__main__":
 
+if __name__ == "__main__":
     ray.init()
-
     parser = argparse.ArgumentParser()
     parser.add_argument(
         "--index_dir",
@@ -128,7 +156,23 @@ def findRep(src, dest, index_dir):
         default="../seed_embeddings/preprocessed/",
     )
     parser.add_argument(
-        "--epoch", dest="epoch", help="Epochs", required=False, type=int, default=1500
+        "--epoch", dest="epoch", help="Epochs", required=False, type=int, default=1000
+    )
+    parser.add_argument(
+        "--is_analogy",
+        dest="is_analogy",
+        help="Tests Analogies for every 10 epochs",
+        required=False,
+        type=bool,
+        default=False,
+    )
+    parser.add_argument(
+        "--link_pred",
+        dest="link_pred",
+        help="Does Link Prediction on Test Files",
+        required=False,
+        type=bool,
+        default=False,
     )
     parser.add_argument(
         "--dim",
@@ -138,58 +182,199 @@ def findRep(src, dest, index_dir):
         type=int,
         default=300,
     )
-    # parser.add_argument(
-    #     "--nbatches",
-    #     dest="nbatches",
-    #     help="Number of batches",
-    #     required=False,
-    #     type=int,
-    #     default=100,
-    # )
-    # parser.add_argument(
-    #     "--margin",
-    #     dest="margin",
-    #     help="Margin",
-    #     required=False,
-    #     type=float,
-    #     default=1.0,
-    # )
+    parser.add_argument(
+        "--batch_size",
+        dest="batch_size",
+        help="Number of batches",
+        required=False,
+        type=int,
+        default=100,
+    )
+    parser.add_argument(
+        "--margin",
+        dest="margin",
+        help="Margin",
+        required=False,
+        type=float,
+        default=1.0,
+    )
+    parser.add_argument(
+        "--use_gpu",
+        dest="use_gpu",
+        help="To use GPU for computation",
+        required=False,
+        type=bool,
+        default=False,
+    )
+    parser.add_argument(
+        "--storage_path",
+        dest="storage_path",
+        help="Path to store the ray results",
+        required=False,
+        type=str,
+        default=os.path.join(os.path.expanduser("~"), "ray_results"),
+    )
+    parser.add_argument(
+        "--analogy_file",
+        dest="analogy_file",
+        help="Path to the analogy file",
+        required=False,
+        type=str,
+        default="./analogies.txt",
+    )
 
     arg_conf = parser.parse_args()
+    arg_conf.index_dir = arg_conf.index_dir + "/"
+
+    try:
+        test_files(arg_conf.index_dir)
+        print("Files are OK")
+    except Exception as e:
+        print("Exception: ", e)
+        print("Error in files")
+        raise Exception("Error in files")
 
     search_space = {
-        "epoch": tune.grid_search([1500]),
-        "dim": arg_conf.dim,
-        "index_dir": arg_conf.index_dir,
-        "nbatches": tune.grid_search([300, 350]),
-        "margin": tune.grid_search([3.5, 4, 4.5]),
+        "batch_size": tune.sample_from(lambda spec: 2 ** np.random.randint(8, 12)),
+        "margin": tune.quniform(0.2, 6, 0.2),
+        "alpha": tune.loguniform(1e-4, 1e-1),
+        # "neg_ent": tune.randint(1, 30),
+        # "neg_rel": tune.randint(1, 30),
+        # "bern": tune.randint(0, 2),
+        "opt_method": "Adam",  # tune.choice(["SGD", "Adam"]),
     }
 
     try:
-        test_files(search_space["index_dir"])
+        test_files(arg_conf.index_dir)
         print("Files are OK")
     except:
         print("Error in files")
         raise Exception("Error in files")
 
+    if arg_conf.is_analogy:
+        metric = "AnalogiesScore"
+        mode = "max"
+    elif arg_conf.link_pred:
+        metric = "hit1"
+        mode = "max"
+    else:
+        metric = "loss"
+        mode = "min"
+
+    scheduler = ASHAScheduler(
+        time_attr="training_iteration",
+        max_t=arg_conf.epoch,
+        grace_period=10,
+        reduction_factor=3,
+        metric=metric,
+        mode=mode,
+    )
+    optuna = OptunaSearch(metric="loss", mode="min")
+
+    if arg_conf.use_gpu:
+        train_with_resources = tune.with_resources(
+            tune.with_parameters(train, args=arg_conf),
+            resources={"cpu": 8, "gpu": 0.15},
+        )
+    else:
+        train_with_resources = tune.with_resources(
+            tune.with_parameters(train, args=arg_conf), resources={"cpu": 10, "gpu": 0}
+        )
+
     tuner = tune.Tuner(
-        train,
+        train_with_resources,
         param_space=search_space,
-        tune_config=TuneConfig(max_concurrent_trials=4),
+        tune_config=TuneConfig(
+            search_alg=optuna,
+            max_concurrent_trials=12,
+            scheduler=scheduler,
+            num_samples=128,
+        ),
+        run_config=RunConfig(
+            storage_path=arg_conf.storage_path,
+            checkpoint_config=CheckpointConfig(
+                num_to_keep=1,
+                # *Best* checkpoints are determined by these params:
+                checkpoint_score_attribute=metric,
+                checkpoint_score_order=mode,
+            ),
+        ),
     )
-
     results = tuner.fit()
 
     # Write the best result to a file, best_result.txt
-    with open(os.path.join(search_space["index_dir"], "best_result.txt"), "a") as f:
-        f.write(
-            "\n" + str(results.get_best_result(metric="AnalogiesScore", mode="max"))
+    fin_res = results.get_best_result(metric=metric, mode=mode)
+    with open(os.path.join(arg_conf.index_dir, "best_result.txt"), "a") as f:
+        f.write("\n" + str(fin_res))
+
+    if arg_conf.is_analogy:
+        print(
+            "Best Config Based on Analogy Score : ",
+            fin_res,
+        )
+    elif arg_conf.link_pred:
+        print(
+            "Best Config Based on Hit1 : ",
+            fin_res,
+        )
+    else:
+        print(
+            "Best Config Based on Loss : ",
+            fin_res,
         )
 
-    print("Best config: ", results.get_best_result(metric="AnalogiesScore", mode="max"))
+    # Get the best configuration
+    best_config = fin_res.config
+    print("best_config: ", best_config)
+    # Extract the values for constructing the file name
+    dim = arg_conf.dim
+    batch_size = best_config["batch_size"]
+    margin = best_config["margin"]
+    alpha = best_config["alpha"]
+    index_dir = arg_conf.index_dir
+
+    # Construct the output file name using the best hyperparameters
+    outfile = os.path.join(
+        index_dir,
+        "seedEmbedding_{}_{}Dim_{}Alpha_{}batchsize_{}margin.ckpt".format(
+            metric,
+            dim,
+            alpha,
+            batch_size,
+            margin,
+        ),
+    )
+    best_checkpoint_path = fin_res.checkpoint.path
+    print("best_checkpoint_path is: ", best_checkpoint_path)
+    file_name = os.listdir(best_checkpoint_path)[0]
+    print("file_name is: ", file_name)
+    if file_name.endswith(".ckpt"):
+        # Construct full file path
+        source_file = os.path.join(best_checkpoint_path, file_name)
+        # Copy the .ckpt file to the outfile path
+        shutil.copy(source_file, outfile)
+        print(f"Copied: {file_name} to the path {outfile}")
+
+        embeddings_path = os.path.join(
+            index_dir,
+            "seedEmbedding_{}_{}Dim_{}Alpha_{}batchsize_{}margin.ckpt".format(
+                metric,
+                dim,
+                alpha,
+                batch_size,
+                margin,
+            ),
+        )
 
-    # for result in results:
-    #     print(result)
-    del results
+        data = findRep(outfile, index_dir, src_type="ckpt")
+        formatted_data = reformat_embeddings(data)
 
-    print("Training finished...")
+        # Write the embeddings to outfile
+        embeddings_path = embeddings_path.replace(".ckpt", ".txt")
+        print("embeddings_path: ", embeddings_path)
+        with open(embeddings_path, "w") as f:
+            f.write(formatted_data)
+    else:
+        print("No .ckpt file found in the source directory.")
+
+    del results
diff --git a/seed_embeddings/OpenKE/make.sh b/seed_embeddings/OpenKE/make.sh
new file mode 100755
index 000000000..6f7bfc69e
--- /dev/null
+++ b/seed_embeddings/OpenKE/make.sh
@@ -0,0 +1,2 @@
+mkdir release
+g++ ./base/Base.cpp -fPIC -shared -o ./release/Base.so -pthread -O3 -march=native
diff --git a/seed_embeddings/OpenKE/models/Analogy.py b/seed_embeddings/OpenKE/models/Analogy.py
deleted file mode 100644
index 9bd72fcc3..000000000
--- a/seed_embeddings/OpenKE/models/Analogy.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-class Analogy(model):
-    def embedding_def(self):
-        config = self.get_config()
-        self.ent1_embeddings = tf.compat.v1.get_variable(
-            name="ent1_embeddings",
-            shape=[config.entTotal, config.hidden_size / 2],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.rel1_embeddings = tf.compat.v1.get_variable(
-            name="rel1_embeddings",
-            shape=[config.relTotal, config.hidden_size / 2],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.ent2_embeddings = tf.compat.v1.get_variable(
-            name="ent2_embeddings",
-            shape=[config.entTotal, config.hidden_size / 2],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.rel2_embeddings = tf.compat.v1.get_variable(
-            name="rel2_embeddings",
-            shape=[config.relTotal, config.hidden_size / 2],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.rel_embeddings = tf.compat.v1.get_variable(
-            name="rel_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_re_embeddings": self.ent1_embeddings,
-            "ent_im_embeddings": self.ent2_embeddings,
-            "rel_re_embeddings": self.rel1_embeddings,
-            "rel_im_embeddings": self.rel2_embeddings,
-            "ent_embeddings": self.ent_embeddings,
-            "rel_embeddings": self.rel_embeddings,
-        }
-
-    # score function for ComplEx
-    def _calc_comp(self, e1_h, e2_h, e1_t, e2_t, r1, r2):
-        return e1_h * e1_t * r1 + e2_h * e2_t * r1 + e1_h * e2_t * r2 - e2_h * e1_t * r2
-
-    # score function for DistMult
-    def _calc_dist(self, e_h, e_t, rel):
-        return e_h * e_t * rel
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # To get labels for the triples, positive triples as 1 and negative triples as -1
-        # The shapes of h, t, r, y are (batch_size, 1 + negative_ent + negative_rel)
-        h, t, r = self.get_all_instance()
-        y = self.get_all_labels()
-        # Embedding entities and relations of triples
-        e1_h = tf.nn.embedding_lookup(params=self.ent1_embeddings, ids=h)
-        e2_h = tf.nn.embedding_lookup(params=self.ent2_embeddings, ids=h)
-        e_h = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=h)
-        e1_t = tf.nn.embedding_lookup(params=self.ent1_embeddings, ids=t)
-        e2_t = tf.nn.embedding_lookup(params=self.ent2_embeddings, ids=t)
-        e_t = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=t)
-        r1 = tf.nn.embedding_lookup(params=self.rel1_embeddings, ids=r)
-        r2 = tf.nn.embedding_lookup(params=self.rel2_embeddings, ids=r)
-        rel = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=r)
-        # Calculating score functions for all positive triples and negative triples
-        res_comp = tf.reduce_sum(
-            input_tensor=self._calc_comp(e1_h, e2_h, e1_t, e2_t, r1, r2),
-            axis=1,
-            keepdims=False,
-        )
-        res_dist = tf.reduce_sum(
-            input_tensor=self._calc_dist(e_h, e_t, rel), axis=1, keepdims=False
-        )
-        res = res_comp + res_dist
-        loss_func = tf.reduce_mean(
-            input_tensor=tf.nn.softplus(-y * res), axis=0, keepdims=False
-        )
-        regul_func = (
-            tf.reduce_mean(input_tensor=e1_h**2)
-            + tf.reduce_mean(input_tensor=e1_t**2)
-            + tf.reduce_mean(input_tensor=e2_h**2)
-            + tf.reduce_mean(input_tensor=e2_t**2)
-            + tf.reduce_mean(input_tensor=r1**2)
-            + tf.reduce_mean(input_tensor=r2**2)
-            + tf.reduce_mean(input_tensor=e_h**2)
-            + tf.reduce_mean(input_tensor=e_t**2)
-            + tf.reduce_mean(input_tensor=rel**2)
-        )
-        # Calculating loss to get what the framework will optimize
-        self.loss = loss_func + config.lmbda * regul_func
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e1 = tf.nn.embedding_lookup(
-            params=self.ent1_embeddings, ids=predict_h
-        )
-        predict_t_e1 = tf.nn.embedding_lookup(
-            params=self.ent1_embeddings, ids=predict_t
-        )
-        predict_r_e1 = tf.nn.embedding_lookup(
-            params=self.rel1_embeddings, ids=predict_r
-        )
-        predict_h_e2 = tf.nn.embedding_lookup(
-            params=self.ent2_embeddings, ids=predict_h
-        )
-        predict_t_e2 = tf.nn.embedding_lookup(
-            params=self.ent2_embeddings, ids=predict_t
-        )
-        predict_r_e2 = tf.nn.embedding_lookup(
-            params=self.rel2_embeddings, ids=predict_r
-        )
-        predict_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h)
-        predict_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t)
-        predict_rel = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=predict_r)
-        self.predict = -tf.reduce_sum(
-            input_tensor=self._calc_comp(
-                predict_h_e1,
-                predict_h_e2,
-                predict_t_e1,
-                predict_t_e2,
-                predict_r_e1,
-                predict_r_e2,
-            ),
-            axis=1,
-            keepdims=True,
-        ) - tf.reduce_sum(
-            input_tensor=self._calc_dist(predict_h_e, predict_t_e, predict_rel),
-            axis=1,
-            keepdims=True,
-        )
diff --git a/seed_embeddings/OpenKE/models/Analogy.pyc b/seed_embeddings/OpenKE/models/Analogy.pyc
deleted file mode 100644
index 5e506cdb1..000000000
Binary files a/seed_embeddings/OpenKE/models/Analogy.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/ComplEx.py b/seed_embeddings/OpenKE/models/ComplEx.py
deleted file mode 100755
index 7b534c413..000000000
--- a/seed_embeddings/OpenKE/models/ComplEx.py
+++ /dev/null
@@ -1,144 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-class ComplEx(model):
-    def embedding_def(self):
-        config = self.get_config()
-        self.ent1_embeddings = tf.compat.v1.get_variable(
-            name="ent1_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.rel1_embeddings = tf.compat.v1.get_variable(
-            name="rel1_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.ent2_embeddings = tf.compat.v1.get_variable(
-            name="ent2_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.rel2_embeddings = tf.compat.v1.get_variable(
-            name="rel2_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_re_embeddings": self.ent1_embeddings,
-            "ent_im_embeddings": self.ent2_embeddings,
-            "rel_re_embeddings": self.rel1_embeddings,
-            "rel_im_embeddings": self.rel2_embeddings,
-        }
-
-    r"""
-	ComplEx extends DistMult by introducing complex-valued embeddings so as to better model asymmetric relations.
-	It is proved that HolE is subsumed by ComplEx as a special case.
-	"""
-
-    def _calc(self, e1_h, e2_h, e1_t, e2_t, r1, r2):
-        return tf.reduce_sum(
-            input_tensor=e1_h * e1_t * r1
-            + e2_h * e2_t * r1
-            + e1_h * e2_t * r2
-            - e2_h * e1_t * r2,
-            axis=-1,
-            keepdims=False,
-        )
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # To get labels for the triples, positive triples as 1 and negative triples as -1
-        # The shapes of h, t, r, y are (batch_size, 1 + negative_ent + negative_rel)
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        pos_y = self.get_positive_labels(in_batch=True)
-        neg_y = self.get_negative_labels(in_batch=True)
-
-        p1_h = tf.nn.embedding_lookup(params=self.ent1_embeddings, ids=pos_h)
-        p2_h = tf.nn.embedding_lookup(params=self.ent2_embeddings, ids=pos_h)
-        p1_t = tf.nn.embedding_lookup(params=self.ent1_embeddings, ids=pos_t)
-        p2_t = tf.nn.embedding_lookup(params=self.ent2_embeddings, ids=pos_t)
-        p1_r = tf.nn.embedding_lookup(params=self.rel1_embeddings, ids=pos_r)
-        p2_r = tf.nn.embedding_lookup(params=self.rel2_embeddings, ids=pos_r)
-
-        n1_h = tf.nn.embedding_lookup(params=self.ent1_embeddings, ids=neg_h)
-        n2_h = tf.nn.embedding_lookup(params=self.ent2_embeddings, ids=neg_h)
-        n1_t = tf.nn.embedding_lookup(params=self.ent1_embeddings, ids=neg_t)
-        n2_t = tf.nn.embedding_lookup(params=self.ent2_embeddings, ids=neg_t)
-        n1_r = tf.nn.embedding_lookup(params=self.rel1_embeddings, ids=neg_r)
-        n2_r = tf.nn.embedding_lookup(params=self.rel2_embeddings, ids=neg_r)
-
-        _p_score = self._calc(p1_h, p2_h, p1_t, p2_t, p1_r, p2_r)
-        _n_score = self._calc(n1_h, n2_h, n1_t, n2_t, n1_r, n2_r)
-        print(_n_score.get_shape())
-        loss_func = tf.reduce_mean(
-            input_tensor=tf.nn.softplus(-pos_y * _p_score)
-            + tf.nn.softplus(-neg_y * _n_score)
-        )
-        regul_func = tf.reduce_mean(
-            input_tensor=p1_h**2
-            + p1_t**2
-            + p1_r**2
-            + n1_h**2
-            + n1_t**2
-            + n1_r**2
-            + p2_h**2
-            + p2_t**2
-            + p2_r**2
-            + n2_h**2
-            + n2_t**2
-            + n2_r**2
-        )
-        self.loss = loss_func + config.lmbda * regul_func
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e1 = tf.nn.embedding_lookup(
-            params=self.ent1_embeddings, ids=predict_h
-        )
-        predict_t_e1 = tf.nn.embedding_lookup(
-            params=self.ent1_embeddings, ids=predict_t
-        )
-        predict_r_e1 = tf.nn.embedding_lookup(
-            params=self.rel1_embeddings, ids=predict_r
-        )
-        predict_h_e2 = tf.nn.embedding_lookup(
-            params=self.ent2_embeddings, ids=predict_h
-        )
-        predict_t_e2 = tf.nn.embedding_lookup(
-            params=self.ent2_embeddings, ids=predict_t
-        )
-        predict_r_e2 = tf.nn.embedding_lookup(
-            params=self.rel2_embeddings, ids=predict_r
-        )
-        self.predict = -self._calc(
-            predict_h_e1,
-            predict_h_e2,
-            predict_t_e1,
-            predict_t_e2,
-            predict_r_e1,
-            predict_r_e2,
-        )
diff --git a/seed_embeddings/OpenKE/models/ComplEx.pyc b/seed_embeddings/OpenKE/models/ComplEx.pyc
deleted file mode 100644
index 9003a7248..000000000
Binary files a/seed_embeddings/OpenKE/models/ComplEx.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/DistMult.py b/seed_embeddings/OpenKE/models/DistMult.py
deleted file mode 100755
index b88da2358..000000000
--- a/seed_embeddings/OpenKE/models/DistMult.py
+++ /dev/null
@@ -1,72 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-class DistMult(model):
-    r"""
-    DistMult is based on the bilinear model where each relation is represented by a diagonal rather than a full matrix.
-    DistMult enjoys the same scalable property as TransE and it achieves superior performance over TransE.
-    """
-
-    def _calc(self, h, t, r):
-        return tf.reduce_sum(input_tensor=h * r * t, axis=-1, keepdims=False)
-
-    def embedding_def(self):
-        config = self.get_config()
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.rel_embeddings = tf.compat.v1.get_variable(
-            name="rel_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if True else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_embeddings": self.ent_embeddings,
-            "rel_embeddings": self.rel_embeddings,
-        }
-
-    def loss_def(self):
-        config = self.get_config()
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        pos_y = self.get_positive_labels(in_batch=True)
-        neg_y = self.get_negative_labels(in_batch=True)
-
-        p_h = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_h)
-        p_t = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_t)
-        p_r = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=pos_r)
-        n_h = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_h)
-        n_t = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_t)
-        n_r = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=neg_r)
-        _p_score = self._calc(p_h, p_t, p_r)
-        _n_score = self._calc(n_h, n_t, n_r)
-        print(_n_score.get_shape())
-        loss_func = tf.reduce_mean(
-            input_tensor=tf.nn.softplus(-pos_y * _p_score)
-            + tf.nn.softplus(-neg_y * _n_score)
-        )
-        regul_func = tf.reduce_mean(
-            input_tensor=p_h**2 + p_t**2 + p_r**2 + n_h**2 + n_t**2 + n_r**2
-        )
-        self.loss = loss_func + config.lmbda * regul_func
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h)
-        predict_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t)
-        predict_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=predict_r)
-        self.predict = -self._calc(predict_h_e, predict_t_e, predict_r_e)
diff --git a/seed_embeddings/OpenKE/models/DistMult.pyc b/seed_embeddings/OpenKE/models/DistMult.pyc
deleted file mode 100644
index 5eb1d79c1..000000000
Binary files a/seed_embeddings/OpenKE/models/DistMult.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/HolE.py b/seed_embeddings/OpenKE/models/HolE.py
deleted file mode 100755
index 0a1c2338f..000000000
--- a/seed_embeddings/OpenKE/models/HolE.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-class HolE(model):
-    def _cconv(self, a, b):
-        return tf.signal.ifft(tf.signal.fft(a) * tf.signal.fft(b)).real
-
-    def _ccorr(self, a, b):
-        a = tf.cast(a, tf.complex64)
-        b = tf.cast(b, tf.complex64)
-        return tf.math.real(
-            tf.signal.ifft(tf.math.conj(tf.signal.fft(a)) * tf.signal.fft(b))
-        )
-
-    r"""
-	HolE employs circular correlations to create compositional representations.
-	HolE can capture rich interactions but simultaneously remains efficient to compute.
-	"""
-
-    def _calc(self, head, tail, rel):
-        relation_mention = tf.nn.l2_normalize(rel, 1)
-        entity_mention = self._ccorr(head, tail)
-        return -tf.sigmoid(
-            tf.reduce_sum(
-                input_tensor=relation_mention * entity_mention, axis=1, keepdims=True
-            )
-        )
-
-    def embedding_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # Defining required parameters of the model, including embeddings of entities and relations
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.rel_embeddings = tf.compat.v1.get_variable(
-            name="rel_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_embeddings": self.ent_embeddings,
-            "rel_embeddings": self.rel_embeddings,
-        }
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # The shapes of pos_h, pos_t, pos_r are (batch_size, 1)
-        # The shapes of neg_h, neg_t, neg_r are (batch_size, negative_ent + negative_rel)
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        # Embedding entities and relations of triples, e.g. pos_h_e, pos_t_e and pos_r_e are embeddings for positive triples
-        pos_h_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_h),
-            [-1, config.hidden_size],
-        )
-        pos_t_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_t),
-            [-1, config.hidden_size],
-        )
-        pos_r_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.rel_embeddings, ids=pos_r),
-            [-1, config.hidden_size],
-        )
-        neg_h_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_h),
-            [-1, config.hidden_size],
-        )
-        neg_t_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_t),
-            [-1, config.hidden_size],
-        )
-        neg_r_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.rel_embeddings, ids=neg_r),
-            [-1, config.hidden_size],
-        )
-        # Calculating score functions for all positive triples and negative triples
-        # The shape of _p_score is (batch_size, 1, 1)
-        # The shape of _n_score is (batch_size, negative_ent + negative_rel, 1)
-        _p_score = tf.reshape(self._calc(pos_h_e, pos_t_e, pos_r_e), [-1, 1])
-        _n_score = tf.reshape(
-            self._calc(neg_h_e, neg_t_e, neg_r_e),
-            [-1, config.negative_rel + config.negative_ent],
-        )
-        # The shape of p_score is (batch_size, 1)
-        # The shape of n_score is (batch_size, 1)
-        p_score = _p_score
-        n_score = tf.reduce_mean(input_tensor=_n_score, axis=1, keepdims=True)
-        # Calculating loss to get what the framework will optimize
-        self.loss = tf.reduce_sum(
-            input_tensor=tf.maximum(p_score - n_score + config.margin, 0)
-        )
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h)
-        predict_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t)
-        predict_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=predict_r)
-        self.predict = tf.reduce_sum(
-            input_tensor=self._calc(predict_h_e, predict_t_e, predict_r_e),
-            axis=1,
-            keepdims=True,
-        )
diff --git a/seed_embeddings/OpenKE/models/HolE.pyc b/seed_embeddings/OpenKE/models/HolE.pyc
deleted file mode 100644
index 33a7df9d5..000000000
Binary files a/seed_embeddings/OpenKE/models/HolE.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/Model.py b/seed_embeddings/OpenKE/models/Model.py
deleted file mode 100755
index 1998c606f..000000000
--- a/seed_embeddings/OpenKE/models/Model.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-
-
-class model(tf.keras.Model):
-    def get_config(self):
-        return self.config
-
-    def get_positive_instance(self, in_batch=True):
-        if in_batch:
-            return [self.positive_h, self.positive_t, self.positive_r]
-        else:
-            return [
-                self.batch_h[0 : self.config.batch_size],
-                self.batch_t[0 : self.config.batch_size],
-                self.batch_r[0 : self.config.batch_size],
-            ]
-
-    def get_negative_instance(self, in_batch=True):
-        if in_batch:
-            return [self.negative_h, self.negative_t, self.negative_r]
-        else:
-            return [
-                self.batch_h[self.config.batch_size : self.config.batch_seq_size],
-                self.batch_t[self.config.batch_size : self.config.batch_seq_size],
-                self.batch_r[self.config.batch_size : self.config.batch_seq_size],
-            ]
-
-    def get_positive_labels(self, in_batch=True):
-        if in_batch:
-            return self.positive_y
-        else:
-            return self.batch_y[0 : self.config.batch_size]
-
-    def get_negative_labels(self, in_batch=True):
-        if in_batch:
-            return self.negative_y
-        else:
-            return self.batch_y[self.config.batch_size : self.config.batch_seq_size]
-
-    def get_all_instance(self, in_batch=False):
-        if in_batch:
-            return [
-                tf.transpose(
-                    a=tf.reshape(
-                        self.batch_h,
-                        [1 + self.config.negative_ent + self.config.negative_rel, -1],
-                    ),
-                    perm=[1, 0],
-                ),
-                tf.transpose(
-                    a=tf.reshape(
-                        self.batch_t,
-                        [1 + self.config.negative_ent + self.config.negative_rel, -1],
-                    ),
-                    perm=[1, 0],
-                ),
-                tf.transpose(
-                    a=tf.reshape(
-                        self.batch_r,
-                        [1 + self.config.negative_ent + self.config.negative_rel, -1],
-                    ),
-                    perm=[1, 0],
-                ),
-            ]
-        else:
-            return [self.batch_h, self.batch_t, self.batch_r]
-
-    def get_all_labels(self, in_batch=False):
-        if in_batch:
-            return tf.transpose(
-                a=tf.reshape(
-                    self.batch_y,
-                    [1 + self.config.negative_ent + self.config.negative_rel, -1],
-                ),
-                perm=[1, 0],
-            )
-        else:
-            return self.batch_y
-
-    def get_predict_instance(self):
-        return [self.predict_h, self.predict_t, self.predict_r]
-
-    def input_def(self):
-        config = self.config
-        self.batch_h = tf.compat.v1.placeholder(tf.int64, [config.batch_seq_size])
-        self.batch_t = tf.compat.v1.placeholder(tf.int64, [config.batch_seq_size])
-        self.batch_r = tf.compat.v1.placeholder(tf.int64, [config.batch_seq_size])
-        self.batch_y = tf.compat.v1.placeholder(tf.float32, [config.batch_seq_size])
-
-        self.positive_h = tf.transpose(
-            a=tf.reshape(self.batch_h[0 : config.batch_size], [1, -1]), perm=[1, 0]
-        )
-        self.positive_t = tf.transpose(
-            a=tf.reshape(self.batch_t[0 : config.batch_size], [1, -1]), perm=[1, 0]
-        )
-        self.positive_r = tf.transpose(
-            a=tf.reshape(self.batch_r[0 : config.batch_size], [1, -1]), perm=[1, 0]
-        )
-        self.positive_y = tf.transpose(
-            a=tf.reshape(self.batch_y[0 : config.batch_size], [1, -1]), perm=[1, 0]
-        )
-        self.negative_h = tf.transpose(
-            a=tf.reshape(
-                self.batch_h[config.batch_size : config.batch_seq_size],
-                [config.negative_ent + config.negative_rel, -1],
-            ),
-            perm=[1, 0],
-        )
-        self.negative_t = tf.transpose(
-            a=tf.reshape(
-                self.batch_t[config.batch_size : config.batch_seq_size],
-                [config.negative_ent + config.negative_rel, -1],
-            ),
-            perm=[1, 0],
-        )
-        self.negative_r = tf.transpose(
-            a=tf.reshape(
-                self.batch_r[config.batch_size : config.batch_seq_size],
-                [config.negative_ent + config.negative_rel, -1],
-            ),
-            perm=[1, 0],
-        )
-        self.negative_y = tf.transpose(
-            a=tf.reshape(
-                self.batch_y[config.batch_size : config.batch_seq_size],
-                [config.negative_ent + config.negative_rel, -1],
-            ),
-            perm=[1, 0],
-        )
-
-        self.predict_h = tf.compat.v1.placeholder(tf.int64, [None])
-        self.predict_t = tf.compat.v1.placeholder(tf.int64, [None])
-        self.predict_r = tf.compat.v1.placeholder(tf.int64, [None])
-        self.parameter_lists = []
-
-    def embedding_def(self):
-        pass
-
-    def loss_def(self):
-        pass
-
-    def predict_def(self):
-        pass
-
-    def __init__(self, config):
-
-        super(model, self).__init__()
-        self.config = config
-
-        with tf.compat.v1.name_scope("input"):
-            self.input_def()
-
-        with tf.compat.v1.name_scope("embedding"):
-            self.embedding_def()
-
-        with tf.compat.v1.name_scope("loss"):
-            self.loss_def()
-
-        with tf.compat.v1.name_scope("predict"):
-            self.predict_def()
diff --git a/seed_embeddings/OpenKE/models/Model.pyc b/seed_embeddings/OpenKE/models/Model.pyc
deleted file mode 100644
index 80ec85a19..000000000
Binary files a/seed_embeddings/OpenKE/models/Model.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/RESCAL.py b/seed_embeddings/OpenKE/models/RESCAL.py
deleted file mode 100755
index aca2c80ad..000000000
--- a/seed_embeddings/OpenKE/models/RESCAL.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-class RESCAL(model):
-    def _calc(self, h, t, r):
-        return h * tf.matmul(r, t)
-
-    def embedding_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # Defining required parameters of the model, including embeddings of entities and relations
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.rel_matrices = tf.compat.v1.get_variable(
-            name="rel_matrices",
-            shape=[config.relTotal, config.hidden_size * config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_embeddings": self.ent_embeddings,
-            "rel_matrices": self.rel_matrices,
-        }
-
-    r"""
-	RESCAL is a tensor factorization approach to knowledge representation learning,
-	which is able to perform collective learning via the latent components of the factorization.
-	"""
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # The shapes of pos_h, pos_t, pos_r are (batch_size, 1)
-        # The shapes of neg_h, neg_t, neg_r are (batch_size, negative_ent + negative_rel)
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        # Embedding entities and relations of triples, e.g. p_h, p_t and p_r are embeddings for positive triples
-        p_h = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_h),
-            [-1, config.hidden_size, 1],
-        )
-        p_t = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_t),
-            [-1, config.hidden_size, 1],
-        )
-        p_r = tf.reshape(
-            tf.nn.embedding_lookup(params=self.rel_matrices, ids=pos_r),
-            [-1, config.hidden_size, config.hidden_size],
-        )
-        n_h = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_h),
-            [-1, config.hidden_size, 1],
-        )
-        n_t = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_t),
-            [-1, config.hidden_size, 1],
-        )
-        n_r = tf.reshape(
-            tf.nn.embedding_lookup(params=self.rel_matrices, ids=neg_r),
-            [-1, config.hidden_size, config.hidden_size],
-        )
-        # The shape of _p_score is (batch_size, 1, hidden_size)
-        # The shape of _n_score is (batch_size, negative_ent + negative_rel, hidden_size)
-        _p_score = tf.reshape(self._calc(p_h, p_t, p_r), [-1, 1, config.hidden_size])
-        _n_score = tf.reshape(
-            self._calc(n_h, n_t, n_r),
-            [-1, config.negative_ent + config.negative_rel, config.hidden_size],
-        )
-        # The shape of p_score is (batch_size, 1)
-        # The shape of n_score is (batch_size, 1)
-        p_score = tf.reduce_sum(
-            input_tensor=tf.reduce_mean(input_tensor=_p_score, axis=1, keepdims=False),
-            axis=1,
-            keepdims=True,
-        )
-        n_score = tf.reduce_sum(
-            input_tensor=tf.reduce_mean(input_tensor=_n_score, axis=1, keepdims=False),
-            axis=1,
-            keepdims=True,
-        )
-        # Calculating loss to get what the framework will optimize
-        self.loss = tf.reduce_sum(
-            input_tensor=tf.maximum(n_score - p_score + config.margin, 0)
-        )
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h),
-            [-1, config.hidden_size, 1],
-        )
-        predict_t_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t),
-            [-1, config.hidden_size, 1],
-        )
-        predict_r_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.rel_matrices, ids=predict_r),
-            [-1, config.hidden_size, config.hidden_size],
-        )
-        self.predict = -tf.reduce_sum(
-            input_tensor=self._calc(predict_h_e, predict_t_e, predict_r_e),
-            axis=1,
-            keepdims=False,
-        )
diff --git a/seed_embeddings/OpenKE/models/RESCAL.pyc b/seed_embeddings/OpenKE/models/RESCAL.pyc
deleted file mode 100644
index d3e6c9676..000000000
Binary files a/seed_embeddings/OpenKE/models/RESCAL.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/TransD.py b/seed_embeddings/OpenKE/models/TransD.py
deleted file mode 100755
index 30c5cf936..000000000
--- a/seed_embeddings/OpenKE/models/TransD.py
+++ /dev/null
@@ -1,142 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-def tf_resize(tensor, axis, size):
-    shape = tensor.get_shape().as_list()
-    osize = shape[axis]
-    if osize == size:
-        return tensor
-    if osize > size:
-        shape[axis] = size
-        return tf.slice(tensor, begin=(0,) * len(shape), size=shape)
-    paddings = [[0, 0] for i in range(len(shape))]
-    paddings[axis][1] = size - osize
-    return tf.pad(tensor=tensor, paddings=paddings)
-
-
-class TransD(model):
-    r"""
-    TransD constructs a dynamic mapping matrix for each entity-relation pair by considering the diversity of entities and relations simultaneously.
-    Compared with TransR/CTransR, TransD has fewer parameters and has no matrix vector multiplication.
-    """
-
-    def _transfer(self, e, t, r):
-        # return e + tf.reduce_sum(e * t, -1, keep_dims = True) * r
-        return (
-            tf_resize(e, -1, r.get_shape()[-1])
-            + tf.reduce_sum(input_tensor=e * t, axis=-1, keepdims=True) * r
-        )
-
-    def _calc(self, h, t, r):
-        h = tf.nn.l2_normalize(h, -1)
-        t = tf.nn.l2_normalize(t, -1)
-        r = tf.nn.l2_normalize(r, -1)
-        return abs(h + r - t)
-
-    def embedding_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # Defining required parameters of the model, including embeddings of entities and relations, entity transfer vectors, and relation transfer vectors
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.rel_embeddings = tf.compat.v1.get_variable(
-            name="rel_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.ent_transfer = tf.compat.v1.get_variable(
-            name="ent_transfer",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.rel_transfer = tf.compat.v1.get_variable(
-            name="rel_transfer",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_embeddings": self.ent_embeddings,
-            "rel_embeddings": self.rel_embeddings,
-            "ent_transfer": self.ent_transfer,
-            "rel_transfer": self.rel_transfer,
-        }
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # The shapes of pos_h, pos_t, pos_r are (batch_size, 1)
-        # The shapes of neg_h, neg_t, neg_r are (batch_size, negative_ent + negative_rel)
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        # Embedding entities and relations of triples, e.g. pos_h_e, pos_t_e and pos_r_e are embeddings for positive triples
-        pos_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_h)
-        pos_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_t)
-        pos_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=pos_r)
-        neg_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_h)
-        neg_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_t)
-        neg_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=neg_r)
-        # Getting the required parameters to transfer entity embeddings, e.g. pos_h_t, pos_t_t and pos_r_t are transfer parameters for positive triples
-        pos_h_t = tf.nn.embedding_lookup(params=self.ent_transfer, ids=pos_h)
-        pos_t_t = tf.nn.embedding_lookup(params=self.ent_transfer, ids=pos_t)
-        pos_r_t = tf.nn.embedding_lookup(params=self.rel_transfer, ids=pos_r)
-        neg_h_t = tf.nn.embedding_lookup(params=self.ent_transfer, ids=neg_h)
-        neg_t_t = tf.nn.embedding_lookup(params=self.ent_transfer, ids=neg_t)
-        neg_r_t = tf.nn.embedding_lookup(params=self.rel_transfer, ids=neg_r)
-        # Calculating score functions for all positive triples and negative triples
-        p_h = self._transfer(pos_h_e, pos_h_t, pos_r_t)
-        p_t = self._transfer(pos_t_e, pos_t_t, pos_r_t)
-        p_r = pos_r_e
-        n_h = self._transfer(neg_h_e, neg_h_t, neg_r_t)
-        n_t = self._transfer(neg_t_e, neg_t_t, neg_r_t)
-        n_r = neg_r_e
-        # The shape of _p_score is (batch_size, 1, hidden_size)
-        # The shape of _n_score is (batch_size, negative_ent + negative_rel, hidden_size)
-        _p_score = self._calc(p_h, p_t, p_r)
-        _n_score = self._calc(n_h, n_t, n_r)
-        # The shape of p_score is (batch_size, 1, 1)
-        # The shape of n_score is (batch_size, negative_ent + negative_rel, 1)
-        p_score = tf.reduce_sum(input_tensor=_p_score, axis=-1, keepdims=True)
-        n_score = tf.reduce_sum(input_tensor=_n_score, axis=-1, keepdims=True)
-        # Calculating loss to get what the framework will optimize
-        self.loss = tf.reduce_mean(
-            input_tensor=tf.maximum(p_score - n_score + config.margin, 0)
-        )
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h)
-        predict_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t)
-        predict_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=predict_r)
-        predict_h_t = tf.nn.embedding_lookup(params=self.ent_transfer, ids=predict_h)
-        predict_t_t = tf.nn.embedding_lookup(params=self.ent_transfer, ids=predict_t)
-        predict_r_t = tf.nn.embedding_lookup(params=self.rel_transfer, ids=predict_r)
-        h_e = self._transfer(predict_h_e, predict_h_t, predict_r_t)
-        t_e = self._transfer(predict_t_e, predict_t_t, predict_r_t)
-        r_e = predict_r_e
-        self.predict = tf.reduce_sum(
-            input_tensor=self._calc(h_e, t_e, r_e), axis=-1, keepdims=True
-        )
diff --git a/seed_embeddings/OpenKE/models/TransD.pyc b/seed_embeddings/OpenKE/models/TransD.pyc
deleted file mode 100644
index 829d4dc86..000000000
Binary files a/seed_embeddings/OpenKE/models/TransD.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/TransE.py b/seed_embeddings/OpenKE/models/TransE.py
deleted file mode 100755
index deb1dea20..000000000
--- a/seed_embeddings/OpenKE/models/TransE.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-class TransE(model):
-    r"""
-    TransE is the first model to introduce translation-based embedding,
-    which interprets relations as the translations operating on entities.
-    """
-
-    def _calc(self, h, t, r):
-        h = tf.nn.l2_normalize(h, -1)
-        t = tf.nn.l2_normalize(t, -1)
-        r = tf.nn.l2_normalize(r, -1)
-        return abs(h + r - t)
-
-    def embedding_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # Defining required parameters of the model, including embeddings of entities and relations
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.rel_embeddings = tf.compat.v1.get_variable(
-            name="rel_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_embeddings": self.ent_embeddings,
-            "rel_embeddings": self.rel_embeddings,
-        }
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # The shapes of pos_h, pos_t, pos_r are (batch_size, 1)
-        # The shapes of neg_h, neg_t, neg_r are (batch_size, negative_ent + negative_rel)
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        # Embedding entities and relations of triples, e.g. p_h, p_t and p_r are embeddings for positive triples
-        p_h = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_h)
-        p_t = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_t)
-        p_r = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=pos_r)
-        n_h = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_h)
-        n_t = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_t)
-        n_r = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=neg_r)
-        # Calculating score functions for all positive triples and negative triples
-        # The shape of _p_score is (batch_size, 1, hidden_size)
-        # The shape of _n_score is (batch_size, negative_ent + negative_rel, hidden_size)
-        _p_score = self._calc(p_h, p_t, p_r)
-        _n_score = self._calc(n_h, n_t, n_r)
-        # The shape of p_score is (batch_size, 1, 1)
-        # The shape of n_score is (batch_size, negative_ent + negative_rel, 1)
-        p_score = tf.reduce_sum(input_tensor=_p_score, axis=-1, keepdims=True)
-        n_score = tf.reduce_sum(input_tensor=_n_score, axis=-1, keepdims=True)
-        # Calculating loss to get what the framework will optimize
-        self.loss = tf.reduce_mean(
-            input_tensor=tf.maximum(p_score - n_score + config.margin, 0)
-        )
-
-    def predict_def(self):
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h)
-        predict_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t)
-        predict_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=predict_r)
-        self.predict = tf.reduce_mean(
-            input_tensor=self._calc(predict_h_e, predict_t_e, predict_r_e),
-            axis=1,
-            keepdims=False,
-        )
diff --git a/seed_embeddings/OpenKE/models/TransE.pyc b/seed_embeddings/OpenKE/models/TransE.pyc
deleted file mode 100644
index fe534136f..000000000
Binary files a/seed_embeddings/OpenKE/models/TransE.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/TransH.py b/seed_embeddings/OpenKE/models/TransH.py
deleted file mode 100755
index 5e2e2f26d..000000000
--- a/seed_embeddings/OpenKE/models/TransH.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-
-class TransH(model):
-    r"""
-    To preserve the mapping propertities of 1-N/N-1/N-N relations,
-    TransH inperprets a relation as a translating operation on a hyperplane.
-    """
-
-    def _transfer(self, e, n):
-        n = tf.nn.l2_normalize(n, -1)
-        return e - tf.reduce_sum(input_tensor=e * n, axis=-1, keepdims=True) * n
-
-    def _calc(self, h, t, r, flag=True):
-        h = tf.nn.l2_normalize(h, -1)
-        t = tf.nn.l2_normalize(t, -1)
-        r = tf.nn.l2_normalize(r, -1)
-        return abs(h + r - t)
-
-    def embedding_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # Defining required parameters of the model, including embeddings of entities and relations, and normal vectors of planes
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.rel_embeddings = tf.compat.v1.get_variable(
-            name="rel_embeddings",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.normal_vectors = tf.compat.v1.get_variable(
-            name="normal_vectors",
-            shape=[config.relTotal, config.hidden_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_embeddings": self.ent_embeddings,
-            "rel_embeddings": self.rel_embeddings,
-            "normal_vectors": self.normal_vectors,
-        }
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # The shapes of pos_h, pos_t, pos_r are (batch_size, 1)
-        # The shapes of neg_h, neg_t, neg_r are (batch_size, negative_ent + negative_rel)
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        # Embedding entities and relations of triples, e.g. pos_h_e, pos_t_e and pos_r_e are embeddings for positive triples
-        pos_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_h)
-        pos_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_t)
-        pos_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=pos_r)
-        neg_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_h)
-        neg_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_t)
-        neg_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=neg_r)
-        # Getting the required normal vectors of planes to transfer entity embeddings
-        pos_norm = tf.nn.embedding_lookup(params=self.normal_vectors, ids=pos_r)
-        neg_norm = tf.nn.embedding_lookup(params=self.normal_vectors, ids=neg_r)
-
-        # Calculating score functions for all positive triples and negative triples
-        p_h = self._transfer(pos_h_e, pos_norm)
-        p_t = self._transfer(pos_t_e, pos_norm)
-        p_r = pos_r_e
-        n_h = self._transfer(neg_h_e, neg_norm)
-        n_t = self._transfer(neg_t_e, neg_norm)
-        n_r = neg_r_e
-        # Calculating score functions for all positive triples and negative triples
-        # The shape of _p_score is (batch_size, 1, hidden_size)
-        # The shape of _n_score is (batch_size, negative_ent + negative_rel, hidden_size)
-        _p_score = self._calc(p_h, p_t, p_r)
-        _n_score = self._calc(n_h, n_t, n_r)
-        # The shape of p_score is (batch_size, 1, 1)
-        # The shape of n_score is (batch_size, negative_ent + negative_rel, 1)
-        p_score = tf.reduce_sum(input_tensor=_p_score, axis=-1, keepdims=True)
-        n_score = tf.reduce_sum(input_tensor=_n_score, axis=-1, keepdims=True)
-        # Calculating loss to get what the framework will optimize
-        self.loss = tf.reduce_mean(
-            input_tensor=tf.maximum(p_score - n_score + config.margin, 0)
-        )
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h)
-        predict_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t)
-        predict_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=predict_r)
-        predict_norm = tf.nn.embedding_lookup(params=self.normal_vectors, ids=predict_r)
-        h_e = self._transfer(predict_h_e, predict_norm)
-        t_e = self._transfer(predict_t_e, predict_norm)
-        r_e = predict_r_e
-        self.predict = tf.reduce_sum(
-            input_tensor=self._calc(h_e, t_e, r_e), axis=-1, keepdims=True
-        )
diff --git a/seed_embeddings/OpenKE/models/TransH.pyc b/seed_embeddings/OpenKE/models/TransH.pyc
deleted file mode 100644
index 1a479cbf1..000000000
Binary files a/seed_embeddings/OpenKE/models/TransH.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/TransR.py b/seed_embeddings/OpenKE/models/TransR.py
deleted file mode 100755
index 42aecb560..000000000
--- a/seed_embeddings/OpenKE/models/TransR.py
+++ /dev/null
@@ -1,141 +0,0 @@
-# coding:utf-8
-import numpy as np
-import tensorflow as tf
-from .Model import model
-
-if tf.__version__ > "0.12.1":
-    matmul_func = tf.matmul
-else:
-    matmul_func = tf.batch_matmul
-
-
-class TransR(model):
-    r"""
-    TransR first projects entities from entity space to corresponding relation space
-    and then builds translations between projected entities.
-    """
-
-    def _transfer(self, transfer_matrix, embeddings):
-        return matmul_func(embeddings, transfer_matrix)
-
-    def _calc(self, h, t, r):
-        h = tf.nn.l2_normalize(h, -1)
-        t = tf.nn.l2_normalize(t, -1)
-        r = tf.nn.l2_normalize(r, -1)
-        return abs(h + r - t)
-
-    def embedding_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # Defining required parameters of the model, including embeddings of entities and relations, and mapping matrices
-        self.ent_embeddings = tf.compat.v1.get_variable(
-            name="ent_embeddings",
-            shape=[config.entTotal, config.ent_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.rel_embeddings = tf.compat.v1.get_variable(
-            name="rel_embeddings",
-            shape=[config.relTotal, config.rel_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.transfer_matrix = tf.compat.v1.get_variable(
-            name="transfer_matrix",
-            shape=[config.relTotal, config.ent_size * config.rel_size],
-            initializer=tf.compat.v1.keras.initializers.VarianceScaling(
-                scale=1.0,
-                mode="fan_avg",
-                distribution=("uniform" if False else "truncated_normal"),
-            ),
-        )
-        self.parameter_lists = {
-            "ent_embeddings": self.ent_embeddings,
-            "rel_embeddings": self.rel_embeddings,
-            "transfer_matrix": self.transfer_matrix,
-        }
-
-    def loss_def(self):
-        # Obtaining the initial configuration of the model
-        config = self.get_config()
-        # To get positive triples and negative triples for training
-        # The shapes of pos_h, pos_t, pos_r are (batch_size, 1)
-        # The shapes of neg_h, neg_t, neg_r are (batch_size, negative_ent + negative_rel)
-        pos_h, pos_t, pos_r = self.get_positive_instance(in_batch=True)
-        neg_h, neg_t, neg_r = self.get_negative_instance(in_batch=True)
-        # Embedding entities and relations of triples, e.g. pos_h_e, pos_t_e and pos_r_e are embeddings for positive triples
-        pos_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_h)
-        pos_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=pos_t)
-        pos_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=pos_r)
-        neg_h_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_h)
-        neg_t_e = tf.nn.embedding_lookup(params=self.ent_embeddings, ids=neg_t)
-        neg_r_e = tf.nn.embedding_lookup(params=self.rel_embeddings, ids=neg_r)
-        # Getting the required mapping matrices
-        pos_matrix = tf.reshape(
-            tf.nn.embedding_lookup(params=self.transfer_matrix, ids=pos_r),
-            [-1, config.ent_size, config.rel_size],
-        )
-        # Calculating score functions for all positive triples and negative triples
-        p_h = self._transfer(pos_matrix, pos_h_e)
-        p_t = self._transfer(pos_matrix, pos_t_e)
-        p_r = pos_r_e
-        if config.negative_rel == 0:
-            n_h = self._transfer(pos_matrix, neg_h_e)
-            n_t = self._transfer(pos_matrix, neg_t_e)
-            n_r = neg_r_e
-        else:
-            neg_matrix = tf.reshape(
-                tf.nn.embedding_lookup(params=self.transfer_matrix, ids=neg_r),
-                [-1, config.ent_size, config.rel_size],
-            )
-            n_h = self._transfer(neg_matrix, neg_h_e)
-            n_t = self._transfer(neg_matrix, neg_t_e)
-            n_r = neg_r_e
-        # The shape of _p_score is (batch_size, 1, hidden_size)
-        # The shape of _n_score is (batch_size, negative_ent + negative_rel, hidden_size)
-        _p_score = self._calc(p_h, p_t, p_r)
-        _n_score = self._calc(n_h, n_t, n_r)
-        # The shape of p_score is (batch_size, 1, 1)
-        # The shape of n_score is (batch_size, negative_ent + negative_rel, 1)
-        p_score = tf.reduce_sum(input_tensor=_p_score, axis=-1, keepdims=True)
-        n_score = tf.reduce_sum(input_tensor=_n_score, axis=-1, keepdims=True)
-        # Calculating loss to get what the framework will optimize
-        self.loss = tf.reduce_mean(
-            input_tensor=tf.maximum(p_score - n_score + config.margin, 0)
-        )
-
-    def predict_def(self):
-        config = self.get_config()
-        predict_h, predict_t, predict_r = self.get_predict_instance()
-        predict_h_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_h),
-            [1, -1, config.ent_size],
-        )
-        predict_t_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.ent_embeddings, ids=predict_t),
-            [1, -1, config.ent_size],
-        )
-        predict_r_e = tf.reshape(
-            tf.nn.embedding_lookup(params=self.rel_embeddings, ids=predict_r),
-            [1, -1, config.rel_size],
-        )
-        predict_matrix = tf.reshape(
-            tf.nn.embedding_lookup(params=self.transfer_matrix, ids=predict_r[0]),
-            [1, config.ent_size, config.rel_size],
-        )
-        h_e = tf.reshape(
-            self._transfer(predict_matrix, predict_h_e), [-1, config.rel_size]
-        )
-        t_e = tf.reshape(
-            self._transfer(predict_matrix, predict_t_e), [-1, config.rel_size]
-        )
-        r_e = predict_r_e
-        self.predict = tf.reduce_sum(
-            input_tensor=self._calc(h_e, t_e, r_e), axis=-1, keepdims=True
-        )
diff --git a/seed_embeddings/OpenKE/models/TransR.pyc b/seed_embeddings/OpenKE/models/TransR.pyc
deleted file mode 100644
index 3a5de788e..000000000
Binary files a/seed_embeddings/OpenKE/models/TransR.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/models/__init__.py b/seed_embeddings/OpenKE/models/__init__.py
deleted file mode 100755
index 082078a6a..000000000
--- a/seed_embeddings/OpenKE/models/__init__.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from .Model import model
-from .TransE import TransE
-from .TransH import TransH
-from .TransD import TransD
-from .TransD import TransD
-from .TransR import TransR
-from .RESCAL import RESCAL
-from .DistMult import DistMult
-from .HolE import HolE
-from .ComplEx import ComplEx
-from .Analogy import Analogy
diff --git a/seed_embeddings/OpenKE/models/__init__.pyc b/seed_embeddings/OpenKE/models/__init__.pyc
deleted file mode 100644
index 7c69496ee..000000000
Binary files a/seed_embeddings/OpenKE/models/__init__.pyc and /dev/null differ
diff --git a/seed_embeddings/OpenKE/module/BaseModule.py b/seed_embeddings/OpenKE/module/BaseModule.py
new file mode 100755
index 000000000..27efd9745
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/BaseModule.py
@@ -0,0 +1,59 @@
+import torch
+import torch.nn as nn
+import os
+import json
+import numpy as np
+
+
+class BaseModule(nn.Module):
+    def __init__(self):
+        super(BaseModule, self).__init__()
+        self.zero_const = nn.Parameter(torch.Tensor([0]))
+        self.zero_const.requires_grad = False
+        self.pi_const = nn.Parameter(torch.Tensor([3.14159265358979323846]))
+        self.pi_const.requires_grad = False
+
+    def load_checkpoint(self, path):
+        self.load_state_dict(torch.load(os.path.join(path)))
+        self.eval()
+
+    def save_checkpoint(self, path):
+        torch.save(self.state_dict(), path)
+
+    def load_parameters(self, path):
+        f = open(path, "r")
+        parameters = json.loads(f.read())
+        f.close()
+        for i in parameters:
+            parameters[i] = torch.Tensor(parameters[i])
+        self.load_state_dict(parameters, strict=False)
+        self.eval()
+
+    def save_parameters(self, path):
+        try:
+            os.makedirs(os.path.dirname(path), exist_ok=True)
+            with open(path, "w") as f:
+                f.write(json.dumps(self.get_parameters("list")))
+            print(f"Parameters saved successfully to {path}")
+        except Exception as e:
+            print(f"Error saving parameters: {e}")
+
+    def get_parameters(self, mode="numpy", param_dict=None):
+        all_param_dict = self.state_dict()
+        if param_dict == None:
+            param_dict = all_param_dict.keys()
+        res = {}
+        for param in param_dict:
+            if mode == "numpy":
+                res[param] = all_param_dict[param].cpu().numpy()
+            elif mode == "list":
+                res[param] = all_param_dict[param].cpu().numpy().tolist()
+            else:
+                res[param] = all_param_dict[param]
+        return res
+
+    def set_parameters(self, parameters):
+        for i in parameters:
+            parameters[i] = torch.Tensor(parameters[i])
+        self.load_state_dict(parameters, strict=False)
+        self.eval()
diff --git a/seed_embeddings/OpenKE/module/__init__.py b/seed_embeddings/OpenKE/module/__init__.py
new file mode 100755
index 000000000..bbe945f68
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/__init__.py
@@ -0,0 +1,7 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from .BaseModule import BaseModule
+
+__init__ = {"BaseModule"}
diff --git a/seed_embeddings/OpenKE/module/loss/Loss.py b/seed_embeddings/OpenKE/module/loss/Loss.py
new file mode 100755
index 000000000..8c55259e5
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/loss/Loss.py
@@ -0,0 +1,6 @@
+from ..BaseModule import BaseModule
+
+
+class Loss(BaseModule):
+    def __init__(self):
+        super(Loss, self).__init__()
diff --git a/seed_embeddings/OpenKE/module/loss/MarginLoss.py b/seed_embeddings/OpenKE/module/loss/MarginLoss.py
new file mode 100755
index 000000000..f150a463c
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/loss/MarginLoss.py
@@ -0,0 +1,34 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from torch.autograd import Variable
+import numpy as np
+from .Loss import Loss
+
+
+class MarginLoss(Loss):
+    def __init__(self, adv_temperature=None, margin=6.0):
+        super(MarginLoss, self).__init__()
+        self.margin = nn.Parameter(torch.Tensor([margin]))
+        self.margin.requires_grad = False
+        if adv_temperature != None:
+            self.adv_temperature = nn.Parameter(torch.Tensor([adv_temperature]))
+            self.adv_temperature.requires_grad = False
+            self.adv_flag = True
+        else:
+            self.adv_flag = False
+
+    def get_weights(self, n_score):
+        return F.softmax(-n_score * self.adv_temperature, dim=-1).detach()
+
+    def forward(self, p_score, n_score):
+        if self.adv_flag:
+            return (
+                self.get_weights(n_score) * torch.max(p_score - n_score, -self.margin)
+            ).sum(dim=-1).mean() + self.margin
+        else:
+            return (torch.max(p_score - n_score, -self.margin)).mean() + self.margin
+
+    def predict(self, p_score, n_score):
+        score = self.forward(p_score, n_score)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/loss/SigmoidLoss.py b/seed_embeddings/OpenKE/module/loss/SigmoidLoss.py
new file mode 100755
index 000000000..cc9cee220
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/loss/SigmoidLoss.py
@@ -0,0 +1,40 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import numpy as np
+from .Loss import Loss
+
+
+class SigmoidLoss(Loss):
+    def __init__(self, adv_temperature=None):
+        super(SigmoidLoss, self).__init__()
+        self.criterion = nn.LogSigmoid()
+        if adv_temperature != None:
+            self.adv_temperature = nn.Parameter(torch.Tensor([adv_temperature]))
+            self.adv_temperature.requires_grad = False
+            self.adv_flag = True
+        else:
+            self.adv_flag = False
+
+    def get_weights(self, n_score):
+        return F.softmax(n_score * self.adv_temperature, dim=-1).detach()
+
+    def forward(self, p_score, n_score):
+        if self.adv_flag:
+            return (
+                -(
+                    self.criterion(p_score).mean()
+                    + (self.get_weights(n_score) * self.criterion(-n_score))
+                    .sum(dim=-1)
+                    .mean()
+                )
+                / 2
+            )
+        else:
+            return (
+                -(self.criterion(p_score).mean() + self.criterion(-n_score).mean()) / 2
+            )
+
+    def predict(self, p_score, n_score):
+        score = self.forward(p_score, n_score)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/loss/SoftplusLoss.py b/seed_embeddings/OpenKE/module/loss/SoftplusLoss.py
new file mode 100755
index 000000000..a29d8a9de
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/loss/SoftplusLoss.py
@@ -0,0 +1,37 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+import numpy as np
+from .Loss import Loss
+
+
+class SoftplusLoss(Loss):
+    def __init__(self, adv_temperature=None):
+        super(SoftplusLoss, self).__init__()
+        self.criterion = nn.Softplus()
+        if adv_temperature != None:
+            self.adv_temperature = nn.Parameter(torch.Tensor([adv_temperature]))
+            self.adv_temperature.requires_grad = False
+            self.adv_flag = True
+        else:
+            self.adv_flag = False
+
+    def get_weights(self, n_score):
+        return F.softmax(n_score * self.adv_temperature, dim=-1).detach()
+
+    def forward(self, p_score, n_score):
+        if self.adv_flag:
+            return (
+                self.criterion(-p_score).mean()
+                + (self.get_weights(n_score) * self.criterion(n_score))
+                .sum(dim=-1)
+                .mean()
+            ) / 2
+        else:
+            return (
+                self.criterion(-p_score).mean() + self.criterion(n_score).mean()
+            ) / 2
+
+    def predict(self, p_score, n_score):
+        score = self.forward(p_score, n_score)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/loss/__init__.py b/seed_embeddings/OpenKE/module/loss/__init__.py
new file mode 100755
index 000000000..66abc9351
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/loss/__init__.py
@@ -0,0 +1,15 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from .Loss import Loss
+from .MarginLoss import MarginLoss
+from .SoftplusLoss import SoftplusLoss
+from .SigmoidLoss import SigmoidLoss
+
+__all__ = [
+    "Loss",
+    "MarginLoss",
+    "SoftplusLoss",
+    "SigmoidLoss",
+]
diff --git a/seed_embeddings/OpenKE/module/model/Analogy.py b/seed_embeddings/OpenKE/module/model/Analogy.py
new file mode 100755
index 000000000..244b595ab
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/Analogy.py
@@ -0,0 +1,79 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from .Model import Model
+
+
+class Analogy(Model):
+    def __init__(self, ent_tot, rel_tot, dim=100):
+        super(Analogy, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.ent_re_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.ent_im_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_re_embeddings = nn.Embedding(self.rel_tot, self.dim)
+        self.rel_im_embeddings = nn.Embedding(self.rel_tot, self.dim)
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim * 2)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim * 2)
+
+        nn.init.xavier_uniform_(self.ent_re_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.ent_im_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_re_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_im_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+
+    def _calc(self, h_re, h_im, h, t_re, t_im, t, r_re, r_im, r):
+        return -torch.sum(
+            r_re * h_re * t_re
+            + r_re * h_im * t_im
+            + r_im * h_re * t_im
+            - r_im * h_im * t_re,
+            -1,
+        ) - torch.sum(h * t * r, -1)
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h_re = self.ent_re_embeddings(batch_h)
+        h_im = self.ent_im_embeddings(batch_h)
+        h = self.ent_embeddings(batch_h)
+        t_re = self.ent_re_embeddings(batch_t)
+        t_im = self.ent_im_embeddings(batch_t)
+        t = self.ent_embeddings(batch_t)
+        r_re = self.rel_re_embeddings(batch_r)
+        r_im = self.rel_im_embeddings(batch_r)
+        r = self.rel_embeddings(batch_r)
+        score = self._calc(h_re, h_im, h, t_re, t_im, t, r_re, r_im, r)
+        return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h_re = self.ent_re_embeddings(batch_h)
+        h_im = self.ent_im_embeddings(batch_h)
+        h = self.ent_embeddings(batch_h)
+        t_re = self.ent_re_embeddings(batch_t)
+        t_im = self.ent_im_embeddings(batch_t)
+        t = self.ent_embeddings(batch_t)
+        r_re = self.rel_re_embeddings(batch_r)
+        r_im = self.rel_im_embeddings(batch_r)
+        r = self.rel_embeddings(batch_r)
+        regul = (
+            torch.mean(h_re**2)
+            + torch.mean(h_im**2)
+            + torch.mean(h**2)
+            + torch.mean(t_re**2)
+            + torch.mean(t_im**2)
+            + torch.mean(t**2)
+            + torch.mean(r_re**2)
+            + torch.mean(r_im**2)
+            + torch.mean(r**2)
+        ) / 9
+        return regul
+
+    def predict(self, data):
+        score = -self.forward(data)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/ComplEx.py b/seed_embeddings/OpenKE/module/model/ComplEx.py
new file mode 100755
index 000000000..5e589ee1f
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/ComplEx.py
@@ -0,0 +1,65 @@
+import torch
+import torch.nn as nn
+from .Model import Model
+
+
+class ComplEx(Model):
+    def __init__(self, ent_tot, rel_tot, dim=100):
+        super(ComplEx, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.ent_re_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.ent_im_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_re_embeddings = nn.Embedding(self.rel_tot, self.dim)
+        self.rel_im_embeddings = nn.Embedding(self.rel_tot, self.dim)
+
+        nn.init.xavier_uniform_(self.ent_re_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.ent_im_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_re_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_im_embeddings.weight.data)
+
+    def _calc(self, h_re, h_im, t_re, t_im, r_re, r_im):
+        return torch.sum(
+            h_re * t_re * r_re
+            + h_im * t_im * r_re
+            + h_re * t_im * r_im
+            - h_im * t_re * r_im,
+            -1,
+        )
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h_re = self.ent_re_embeddings(batch_h)
+        h_im = self.ent_im_embeddings(batch_h)
+        t_re = self.ent_re_embeddings(batch_t)
+        t_im = self.ent_im_embeddings(batch_t)
+        r_re = self.rel_re_embeddings(batch_r)
+        r_im = self.rel_im_embeddings(batch_r)
+        score = self._calc(h_re, h_im, t_re, t_im, r_re, r_im)
+        return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h_re = self.ent_re_embeddings(batch_h)
+        h_im = self.ent_im_embeddings(batch_h)
+        t_re = self.ent_re_embeddings(batch_t)
+        t_im = self.ent_im_embeddings(batch_t)
+        r_re = self.rel_re_embeddings(batch_r)
+        r_im = self.rel_im_embeddings(batch_r)
+        regul = (
+            torch.mean(h_re**2)
+            + torch.mean(h_im**2)
+            + torch.mean(t_re**2)
+            + torch.mean(t_im**2)
+            + torch.mean(r_re**2)
+            + torch.mean(r_im**2)
+        ) / 6
+        return regul
+
+    def predict(self, data):
+        score = -self.forward(data)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/DistMult.py b/seed_embeddings/OpenKE/module/model/DistMult.py
new file mode 100755
index 000000000..a893f439f
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/DistMult.py
@@ -0,0 +1,76 @@
+import torch
+import torch.nn as nn
+from .Model import Model
+
+
+class DistMult(Model):
+    def __init__(self, ent_tot, rel_tot, dim=100, margin=None, epsilon=None):
+        super(DistMult, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.margin = margin
+        self.epsilon = epsilon
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim)
+
+        if margin == None or epsilon == None:
+            nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+            nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+        else:
+            self.embedding_range = nn.Parameter(
+                torch.Tensor([(self.margin + self.epsilon) / self.dim]),
+                requires_grad=False,
+            )
+            nn.init.uniform_(
+                tensor=self.ent_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.rel_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+
+    def _calc(self, h, t, r, mode):
+        if mode != "normal":
+            h = h.view(-1, r.shape[0], h.shape[-1])
+            t = t.view(-1, r.shape[0], t.shape[-1])
+            r = r.view(-1, r.shape[0], r.shape[-1])
+        if mode == "head_batch":
+            score = h * (r * t)
+        else:
+            score = (h * r) * t
+        score = torch.sum(score, -1).flatten()
+        return score
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        mode = data["mode"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        score = self._calc(h, t, r, mode)
+        return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        regul = (torch.mean(h**2) + torch.mean(t**2) + torch.mean(r**2)) / 3
+        return regul
+
+    def l3_regularization(self):
+        return (
+            self.ent_embeddings.weight.norm(p=3) ** 3
+            + self.rel_embeddings.weight.norm(p=3) ** 3
+        )
+
+    def predict(self, data):
+        score = -self.forward(data)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/HolE.py b/seed_embeddings/OpenKE/module/model/HolE.py
new file mode 100755
index 000000000..56e2ee027
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/HolE.py
@@ -0,0 +1,106 @@
+import torch
+import torch.nn as nn
+from .Model import Model
+import numpy
+from numpy import fft
+
+
+class HolE(Model):
+    def __init__(self, ent_tot, rel_tot, dim=100, margin=None, epsilon=None):
+        super(HolE, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.margin = margin
+        self.epsilon = epsilon
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim)
+
+        if margin == None or epsilon == None:
+            nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+            nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+        else:
+            self.embedding_range = nn.Parameter(
+                torch.Tensor([(self.margin + self.epsilon) / self.dim]),
+                requires_grad=False,
+            )
+            nn.init.uniform_(
+                tensor=self.ent_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.rel_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+
+    def _conj(self, tensor):
+        zero_shape = (list)(tensor.shape)
+        one_shape = (list)(tensor.shape)
+        zero_shape[-1] = 1
+        one_shape[-1] -= 1
+        ze = torch.zeros(size=zero_shape, device=tensor.device)
+        on = torch.ones(size=one_shape, device=tensor.device)
+        matrix = torch.cat([ze, on], -1)
+        matrix = 2 * matrix
+        return tensor - matrix * tensor
+
+    def _real(self, tensor):
+        dimensions = len(tensor.shape)
+        return tensor.narrow(dimensions - 1, 0, 1)
+
+    def _imag(self, tensor):
+        dimensions = len(tensor.shape)
+        return tensor.narrow(dimensions - 1, 1, 1)
+
+    def _mul(self, real_1, imag_1, real_2, imag_2):
+        real = real_1 * real_2 - imag_1 * imag_2
+        imag = real_1 * imag_2 + imag_1 * real_2
+        return torch.cat([real, imag], -1)
+
+    def _ccorr(self, a, b):
+        a = self._conj(torch.rfft(a, signal_ndim=1, onesided=False))
+        b = torch.rfft(b, signal_ndim=1, onesided=False)
+        res = self._mul(self._real(a), self._imag(a), self._real(b), self._imag(b))
+        res = torch.ifft(res, signal_ndim=1)
+        return self._real(res).flatten(start_dim=-2)
+
+    def _calc(self, h, t, r, mode):
+        if mode != "normal":
+            h = h.view(-1, r.shape[0], h.shape[-1])
+            t = t.view(-1, r.shape[0], t.shape[-1])
+            r = r.view(-1, r.shape[0], r.shape[-1])
+        score = self._ccorr(h, t) * r
+        score = torch.sum(score, -1).flatten()
+        return score
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        mode = data["mode"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        score = self._calc(h, t, r, mode)
+        return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        regul = (torch.mean(h**2) + torch.mean(t**2) + torch.mean(r**2)) / 3
+        return regul
+
+    def l3_regularization(self):
+        return (
+            self.ent_embeddings.weight.norm(p=3) ** 3
+            + self.rel_embeddings.weight.norm(p=3) ** 3
+        )
+
+    def predict(self, data):
+        score = -self.forward(data)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/Model.py b/seed_embeddings/OpenKE/module/model/Model.py
new file mode 100755
index 000000000..7712a88be
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/Model.py
@@ -0,0 +1,16 @@
+import torch
+import torch.nn as nn
+from ..BaseModule import BaseModule
+
+
+class Model(BaseModule):
+    def __init__(self, ent_tot, rel_tot):
+        super(Model, self).__init__()
+        self.ent_tot = ent_tot
+        self.rel_tot = rel_tot
+
+    def forward(self):
+        raise NotImplementedError
+
+    def predict(self):
+        raise NotImplementedError
diff --git a/seed_embeddings/OpenKE/module/model/RESCAL.py b/seed_embeddings/OpenKE/module/model/RESCAL.py
new file mode 100755
index 000000000..1b7c4e7c6
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/RESCAL.py
@@ -0,0 +1,46 @@
+import torch
+import torch.nn as nn
+from .Model import Model
+
+
+class RESCAL(Model):
+    def __init__(self, ent_tot, rel_tot, dim=100):
+        super(RESCAL, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_matrices = nn.Embedding(self.rel_tot, self.dim * self.dim)
+
+        nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_matrices.weight.data)
+
+    def _calc(self, h, t, r):
+        t = t.view(-1, self.dim, 1)
+        r = r.view(-1, self.dim, self.dim)
+        tr = torch.matmul(r, t)
+        tr = tr.view(-1, self.dim)
+        return -torch.sum(h * tr, -1)
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_matrices(batch_r)
+        score = self._calc(h, t, r)
+        return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_matrices(batch_r)
+        regul = (torch.mean(h**2) + torch.mean(t**2) + torch.mean(r**2)) / 3
+        return regul
+
+    def predict(self, data):
+        score = -self.forward(data)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/RotatE.py b/seed_embeddings/OpenKE/module/model/RotatE.py
new file mode 100755
index 000000000..799f0cdcc
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/RotatE.py
@@ -0,0 +1,113 @@
+import torch
+import torch.autograd as autograd
+import torch.nn as nn
+from .Model import Model
+
+
+class RotatE(Model):
+    def __init__(self, ent_tot, rel_tot, dim=100, margin=6.0, epsilon=2.0):
+        super(RotatE, self).__init__(ent_tot, rel_tot)
+
+        self.margin = margin
+        self.epsilon = epsilon
+
+        self.dim_e = dim * 2
+        self.dim_r = dim
+
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim_e)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim_r)
+
+        self.ent_embedding_range = nn.Parameter(
+            torch.Tensor([(self.margin + self.epsilon) / self.dim_e]),
+            requires_grad=False,
+        )
+
+        nn.init.uniform_(
+            tensor=self.ent_embeddings.weight.data,
+            a=-self.ent_embedding_range.item(),
+            b=self.ent_embedding_range.item(),
+        )
+
+        self.rel_embedding_range = nn.Parameter(
+            torch.Tensor([(self.margin + self.epsilon) / self.dim_r]),
+            requires_grad=False,
+        )
+
+        nn.init.uniform_(
+            tensor=self.rel_embeddings.weight.data,
+            a=-self.rel_embedding_range.item(),
+            b=self.rel_embedding_range.item(),
+        )
+
+        self.margin = nn.Parameter(torch.Tensor([margin]))
+        self.margin.requires_grad = False
+
+    def _calc(self, h, t, r, mode):
+        pi = self.pi_const
+
+        re_head, im_head = torch.chunk(h, 2, dim=-1)
+        re_tail, im_tail = torch.chunk(t, 2, dim=-1)
+
+        phase_relation = r / (self.rel_embedding_range.item() / pi)
+
+        re_relation = torch.cos(phase_relation)
+        im_relation = torch.sin(phase_relation)
+
+        re_head = re_head.view(-1, re_relation.shape[0], re_head.shape[-1]).permute(
+            1, 0, 2
+        )
+        re_tail = re_tail.view(-1, re_relation.shape[0], re_tail.shape[-1]).permute(
+            1, 0, 2
+        )
+        im_head = im_head.view(-1, re_relation.shape[0], im_head.shape[-1]).permute(
+            1, 0, 2
+        )
+        im_tail = im_tail.view(-1, re_relation.shape[0], im_tail.shape[-1]).permute(
+            1, 0, 2
+        )
+        im_relation = im_relation.view(
+            -1, re_relation.shape[0], im_relation.shape[-1]
+        ).permute(1, 0, 2)
+        re_relation = re_relation.view(
+            -1, re_relation.shape[0], re_relation.shape[-1]
+        ).permute(1, 0, 2)
+
+        if mode == "head_batch":
+            re_score = re_relation * re_tail + im_relation * im_tail
+            im_score = re_relation * im_tail - im_relation * re_tail
+            re_score = re_score - re_head
+            im_score = im_score - im_head
+        else:
+            re_score = re_head * re_relation - im_head * im_relation
+            im_score = re_head * im_relation + im_head * re_relation
+            re_score = re_score - re_tail
+            im_score = im_score - im_tail
+
+        score = torch.stack([re_score, im_score], dim=0)
+        score = score.norm(dim=0).sum(dim=-1)
+        return score.permute(1, 0).flatten()
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        mode = data["mode"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        score = self.margin - self._calc(h, t, r, mode)
+        return score
+
+    def predict(self, data):
+        score = -self.forward(data)
+        return score.cpu().data.numpy()
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        regul = (torch.mean(h**2) + torch.mean(t**2) + torch.mean(r**2)) / 3
+        return regul
diff --git a/seed_embeddings/OpenKE/module/model/SimplE.py b/seed_embeddings/OpenKE/module/model/SimplE.py
new file mode 100755
index 000000000..e7974c040
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/SimplE.py
@@ -0,0 +1,60 @@
+import torch
+import torch.nn as nn
+from .Model import Model
+
+
+class SimplE(Model):
+    def __init__(self, ent_tot, rel_tot, dim=100):
+        super(SimplE, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim)
+        self.rel_inv_embeddings = nn.Embedding(self.rel_tot, self.dim)
+
+        nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_inv_embeddings.weight.data)
+
+    def _calc_avg(self, h, t, r, r_inv):
+        return (torch.sum(h * r * t, -1) + torch.sum(h * r_inv * t, -1)) / 2
+
+    def _calc_ingr(self, h, r, t):
+        return torch.sum(h * r * t, -1)
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        r_inv = self.rel_inv_embeddings(batch_r)
+        score = self._calc_avg(h, t, r, r_inv)
+        return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        r_inv = self.rel_inv_embeddings(batch_r)
+        regul = (
+            torch.mean(h**2)
+            + torch.mean(t**2)
+            + torch.mean(r**2)
+            + torch.mean(r_inv**2)
+        ) / 4
+        return regul
+
+    def predict(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        score = -self._calc_ingr(h, r, t)
+        return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/TransD.py b/seed_embeddings/OpenKE/module/model/TransD.py
new file mode 100755
index 000000000..c29c99bd8
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/TransD.py
@@ -0,0 +1,171 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from .Model import Model
+
+
+class TransD(Model):
+    def __init__(
+        self,
+        ent_tot,
+        rel_tot,
+        dim_e=100,
+        dim_r=100,
+        p_norm=1,
+        norm_flag=True,
+        margin=None,
+        epsilon=None,
+    ):
+        super(TransD, self).__init__(ent_tot, rel_tot)
+
+        self.dim_e = dim_e
+        self.dim_r = dim_r
+        self.margin = margin
+        self.epsilon = epsilon
+        self.norm_flag = norm_flag
+        self.p_norm = p_norm
+
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim_e)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim_r)
+        self.ent_transfer = nn.Embedding(self.ent_tot, self.dim_e)
+        self.rel_transfer = nn.Embedding(self.rel_tot, self.dim_r)
+
+        if margin == None or epsilon == None:
+            nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+            nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+            nn.init.xavier_uniform_(self.ent_transfer.weight.data)
+            nn.init.xavier_uniform_(self.rel_transfer.weight.data)
+        else:
+            self.ent_embedding_range = nn.Parameter(
+                torch.Tensor([(self.margin + self.epsilon) / self.dim_e]),
+                requires_grad=False,
+            )
+            self.rel_embedding_range = nn.Parameter(
+                torch.Tensor([(self.margin + self.epsilon) / self.dim_r]),
+                requires_grad=False,
+            )
+            nn.init.uniform_(
+                tensor=self.ent_embeddings.weight.data,
+                a=-self.ent_embedding_range.item(),
+                b=self.ent_embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.rel_embeddings.weight.data,
+                a=-self.rel_embedding_range.item(),
+                b=self.rel_embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.ent_transfer.weight.data,
+                a=-self.ent_embedding_range.item(),
+                b=self.ent_embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.rel_transfer.weight.data,
+                a=-self.rel_embedding_range.item(),
+                b=self.rel_embedding_range.item(),
+            )
+        if margin != None:
+            self.margin = nn.Parameter(torch.Tensor([margin]))
+            self.margin.requires_grad = False
+            self.margin_flag = True
+        else:
+            self.margin_flag = False
+
+    def _resize(self, tensor, axis, size):
+        shape = tensor.size()
+        osize = shape[axis]
+        if osize == size:
+            return tensor
+        if osize > size:
+            return torch.narrow(tensor, axis, 0, size)
+        paddings = []
+        for i in range(len(shape)):
+            if i == axis:
+                paddings = [0, size - osize] + paddings
+            else:
+                paddings = [0, 0] + paddings
+        print(paddings)
+        return F.pad(tensor, paddings=paddings, mode="constant", value=0)
+
+    def _calc(self, h, t, r, mode):
+        if self.norm_flag:
+            h = F.normalize(h, 2, -1)
+            r = F.normalize(r, 2, -1)
+            t = F.normalize(t, 2, -1)
+        if mode != "normal":
+            h = h.view(-1, r.shape[0], h.shape[-1])
+            t = t.view(-1, r.shape[0], t.shape[-1])
+            r = r.view(-1, r.shape[0], r.shape[-1])
+        if mode == "head_batch":
+            score = h + (r - t)
+        else:
+            score = (h + r) - t
+        score = torch.norm(score, self.p_norm, -1).flatten()
+        return score
+
+    def _transfer(self, e, e_transfer, r_transfer):
+        if e.shape[0] != r_transfer.shape[0]:
+            e = e.view(-1, r_transfer.shape[0], e.shape[-1])
+            e_transfer = e_transfer.view(-1, r_transfer.shape[0], e_transfer.shape[-1])
+            r_transfer = r_transfer.view(-1, r_transfer.shape[0], r_transfer.shape[-1])
+            e = F.normalize(
+                self._resize(e, -1, r_transfer.size()[-1])
+                + torch.sum(e * e_transfer, -1, True) * r_transfer,
+                p=2,
+                dim=-1,
+            )
+            return e.view(-1, e.shape[-1])
+        else:
+            return F.normalize(
+                self._resize(e, -1, r_transfer.size()[-1])
+                + torch.sum(e * e_transfer, -1, True) * r_transfer,
+                p=2,
+                dim=-1,
+            )
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        mode = data["mode"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        h_transfer = self.ent_transfer(batch_h)
+        t_transfer = self.ent_transfer(batch_t)
+        r_transfer = self.rel_transfer(batch_r)
+        h = self._transfer(h, h_transfer, r_transfer)
+        t = self._transfer(t, t_transfer, r_transfer)
+        score = self._calc(h, t, r, mode)
+        if self.margin_flag:
+            return self.margin - score
+        else:
+            return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        h_transfer = self.ent_transfer(batch_h)
+        t_transfer = self.ent_transfer(batch_t)
+        r_transfer = self.rel_transfer(batch_r)
+        regul = (
+            torch.mean(h**2)
+            + torch.mean(t**2)
+            + torch.mean(r**2)
+            + torch.mean(h_transfer**2)
+            + torch.mean(t_transfer**2)
+            + torch.mean(r_transfer**2)
+        ) / 6
+        return regul
+
+    def predict(self, data):
+        score = self.forward(data)
+        if self.margin_flag:
+            score = self.margin - score
+            return score.cpu().data.numpy()
+        else:
+            return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/TransE.py b/seed_embeddings/OpenKE/module/model/TransE.py
new file mode 100755
index 000000000..203daf0a5
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/TransE.py
@@ -0,0 +1,101 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from .Model import Model
+
+
+class TransE(Model):
+    def __init__(
+        self,
+        ent_tot,
+        rel_tot,
+        dim=100,
+        p_norm=1,
+        norm_flag=True,
+        margin=None,
+        epsilon=None,
+    ):
+        super(TransE, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.margin = margin
+        self.epsilon = epsilon
+        self.norm_flag = norm_flag
+        self.p_norm = p_norm
+
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim)
+
+        if margin == None or epsilon == None:
+            nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+            nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+        else:
+            self.embedding_range = nn.Parameter(
+                torch.Tensor([(self.margin + self.epsilon) / self.dim]),
+                requires_grad=False,
+            )
+            nn.init.uniform_(
+                tensor=self.ent_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.rel_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+
+        if margin != None:
+            self.margin = nn.Parameter(torch.Tensor([margin]))
+            self.margin.requires_grad = False
+            self.margin_flag = True
+        else:
+            self.margin_flag = False
+
+    def _calc(self, h, t, r, mode):
+        if self.norm_flag:
+            h = F.normalize(h, 2, -1)
+            r = F.normalize(r, 2, -1)
+            t = F.normalize(t, 2, -1)
+        if mode != "normal":
+            h = h.view(-1, r.shape[0], h.shape[-1])
+            t = t.view(-1, r.shape[0], t.shape[-1])
+            r = r.view(-1, r.shape[0], r.shape[-1])
+        if mode == "head_batch":
+            score = h + (r - t)
+        else:
+            score = (h + r) - t
+        score = torch.norm(score, self.p_norm, -1).flatten()
+        return score
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        mode = data["mode"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        score = self._calc(h, t, r, mode)
+        if self.margin_flag:
+            return self.margin - score
+        else:
+            return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        regul = (torch.mean(h**2) + torch.mean(t**2) + torch.mean(r**2)) / 3
+        return regul
+
+    def predict(self, data):
+        score = self.forward(data)
+        if self.margin_flag:
+            score = self.margin - score
+            return score.cpu().data.numpy()
+        else:
+            return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/TransH.py b/seed_embeddings/OpenKE/module/model/TransH.py
new file mode 100755
index 000000000..ed6eec777
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/TransH.py
@@ -0,0 +1,127 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from .Model import Model
+
+
+class TransH(Model):
+    def __init__(
+        self,
+        ent_tot,
+        rel_tot,
+        dim=100,
+        p_norm=1,
+        norm_flag=True,
+        margin=None,
+        epsilon=None,
+    ):
+        super(TransH, self).__init__(ent_tot, rel_tot)
+
+        self.dim = dim
+        self.margin = margin
+        self.epsilon = epsilon
+        self.norm_flag = norm_flag
+        self.p_norm = p_norm
+
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim)
+        self.norm_vector = nn.Embedding(self.rel_tot, self.dim)
+
+        if margin == None or epsilon == None:
+            nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+            nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+            nn.init.xavier_uniform_(self.norm_vector.weight.data)
+        else:
+            self.embedding_range = nn.Parameter(
+                torch.Tensor([(self.margin + self.epsilon) / self.dim]),
+                requires_grad=False,
+            )
+            nn.init.uniform_(
+                tensor=self.ent_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.rel_embeddings.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+            nn.init.uniform_(
+                tensor=self.norm_vector.weight.data,
+                a=-self.embedding_range.item(),
+                b=self.embedding_range.item(),
+            )
+
+        if margin != None:
+            self.margin = nn.Parameter(torch.Tensor([margin]))
+            self.margin.requires_grad = False
+            self.margin_flag = True
+        else:
+            self.margin_flag = False
+
+    def _calc(self, h, t, r, mode):
+        if self.norm_flag:
+            h = F.normalize(h, 2, -1)
+            r = F.normalize(r, 2, -1)
+            t = F.normalize(t, 2, -1)
+        if mode != "normal":
+            h = h.view(-1, r.shape[0], h.shape[-1])
+            t = t.view(-1, r.shape[0], t.shape[-1])
+            r = r.view(-1, r.shape[0], r.shape[-1])
+        if mode == "head_batch":
+            score = h + (r - t)
+        else:
+            score = (h + r) - t
+        score = torch.norm(score, self.p_norm, -1).flatten()
+        return score
+
+    def _transfer(self, e, norm):
+        norm = F.normalize(norm, p=2, dim=-1)
+        if e.shape[0] != norm.shape[0]:
+            e = e.view(-1, norm.shape[0], e.shape[-1])
+            norm = norm.view(-1, norm.shape[0], norm.shape[-1])
+            e = e - torch.sum(e * norm, -1, True) * norm
+            return e.view(-1, e.shape[-1])
+        else:
+            return e - torch.sum(e * norm, -1, True) * norm
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        mode = data["mode"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        r_norm = self.norm_vector(batch_r)
+        h = self._transfer(h, r_norm)
+        t = self._transfer(t, r_norm)
+        score = self._calc(h, t, r, mode)
+        if self.margin_flag:
+            return self.margin - score
+        else:
+            return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        r_norm = self.norm_vector(batch_r)
+        regul = (
+            torch.mean(h**2)
+            + torch.mean(t**2)
+            + torch.mean(r**2)
+            + torch.mean(r_norm**2)
+        ) / 4
+        return regul
+
+    def predict(self, data):
+        score = self.forward(data)
+        if self.margin_flag:
+            score = self.margin - score
+            return score.cpu().data.numpy()
+        else:
+            return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/TransR.py b/seed_embeddings/OpenKE/module/model/TransR.py
new file mode 100755
index 000000000..c28059175
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/TransR.py
@@ -0,0 +1,115 @@
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+from .Model import Model
+
+
+class TransR(Model):
+    def __init__(
+        self,
+        ent_tot,
+        rel_tot,
+        dim_e=100,
+        dim_r=100,
+        p_norm=1,
+        norm_flag=True,
+        rand_init=False,
+        margin=None,
+    ):
+        super(TransR, self).__init__(ent_tot, rel_tot)
+
+        self.dim_e = dim_e
+        self.dim_r = dim_r
+        self.norm_flag = norm_flag
+        self.p_norm = p_norm
+        self.rand_init = rand_init
+
+        self.ent_embeddings = nn.Embedding(self.ent_tot, self.dim_e)
+        self.rel_embeddings = nn.Embedding(self.rel_tot, self.dim_r)
+        nn.init.xavier_uniform_(self.ent_embeddings.weight.data)
+        nn.init.xavier_uniform_(self.rel_embeddings.weight.data)
+
+        self.transfer_matrix = nn.Embedding(self.rel_tot, self.dim_e * self.dim_r)
+        if not self.rand_init:
+            identity = torch.zeros(self.dim_e, self.dim_r)
+            for i in range(min(self.dim_e, self.dim_r)):
+                identity[i][i] = 1
+            identity = identity.view(self.dim_r * self.dim_e)
+            for i in range(self.rel_tot):
+                self.transfer_matrix.weight.data[i] = identity
+        else:
+            nn.init.xavier_uniform_(self.transfer_matrix.weight.data)
+
+        if margin != None:
+            self.margin = nn.Parameter(torch.Tensor([margin]))
+            self.margin.requires_grad = False
+            self.margin_flag = True
+        else:
+            self.margin_flag = False
+
+    def _calc(self, h, t, r, mode):
+        if self.norm_flag:
+            h = F.normalize(h, 2, -1)
+            r = F.normalize(r, 2, -1)
+            t = F.normalize(t, 2, -1)
+        if mode != "normal":
+            h = h.view(-1, r.shape[0], h.shape[-1])
+            t = t.view(-1, r.shape[0], t.shape[-1])
+            r = r.view(-1, r.shape[0], r.shape[-1])
+        if mode == "head_batch":
+            score = h + (r - t)
+        else:
+            score = (h + r) - t
+        score = torch.norm(score, self.p_norm, -1).flatten()
+        return score
+
+    def _transfer(self, e, r_transfer):
+        r_transfer = r_transfer.view(-1, self.dim_e, self.dim_r)
+        if e.shape[0] != r_transfer.shape[0]:
+            e = e.view(-1, r_transfer.shape[0], self.dim_e).permute(1, 0, 2)
+            e = torch.matmul(e, r_transfer).permute(1, 0, 2)
+        else:
+            e = e.view(-1, 1, self.dim_e)
+            e = torch.matmul(e, r_transfer)
+        return e.view(-1, self.dim_r)
+
+    def forward(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        mode = data["mode"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        r_transfer = self.transfer_matrix(batch_r)
+        h = self._transfer(h, r_transfer)
+        t = self._transfer(t, r_transfer)
+        score = self._calc(h, t, r, mode)
+        if self.margin_flag:
+            return self.margin - score
+        else:
+            return score
+
+    def regularization(self, data):
+        batch_h = data["batch_h"]
+        batch_t = data["batch_t"]
+        batch_r = data["batch_r"]
+        h = self.ent_embeddings(batch_h)
+        t = self.ent_embeddings(batch_t)
+        r = self.rel_embeddings(batch_r)
+        r_transfer = self.transfer_matrix(batch_r)
+        regul = (
+            torch.mean(h**2)
+            + torch.mean(t**2)
+            + torch.mean(r**2)
+            + torch.mean(r_transfer**2)
+        ) / 4
+        return regul * regul
+
+    def predict(self, data):
+        score = self.forward(data)
+        if self.margin_flag:
+            score = self.margin - score
+            return score.cpu().data.numpy()
+        else:
+            return score.cpu().data.numpy()
diff --git a/seed_embeddings/OpenKE/module/model/__init__.py b/seed_embeddings/OpenKE/module/model/__init__.py
new file mode 100755
index 000000000..942e7be36
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/model/__init__.py
@@ -0,0 +1,29 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from .Model import Model
+from .TransE import TransE
+from .TransD import TransD
+from .TransR import TransR
+from .TransH import TransH
+from .DistMult import DistMult
+from .ComplEx import ComplEx
+from .RESCAL import RESCAL
+from .Analogy import Analogy
+from .SimplE import SimplE
+from .RotatE import RotatE
+
+__all__ = [
+    "Model",
+    "TransE",
+    "TransD",
+    "TransR",
+    "TransH",
+    "DistMult",
+    "ComplEx",
+    "RESCAL",
+    "Analogy",
+    "SimplE",
+    "RotatE",
+]
diff --git a/seed_embeddings/OpenKE/module/strategy/NegativeSampling.py b/seed_embeddings/OpenKE/module/strategy/NegativeSampling.py
new file mode 100755
index 000000000..4a9d63a89
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/strategy/NegativeSampling.py
@@ -0,0 +1,34 @@
+from .Strategy import Strategy
+
+
+class NegativeSampling(Strategy):
+    def __init__(
+        self, model=None, loss=None, batch_size=256, regul_rate=0.0, l3_regul_rate=0.0
+    ):
+        super(NegativeSampling, self).__init__()
+        self.model = model
+        self.loss = loss
+        self.batch_size = batch_size
+        self.regul_rate = regul_rate
+        self.l3_regul_rate = l3_regul_rate
+
+    def _get_positive_score(self, score):
+        positive_score = score[: self.batch_size]
+        positive_score = positive_score.view(-1, self.batch_size).permute(1, 0)
+        return positive_score
+
+    def _get_negative_score(self, score):
+        negative_score = score[self.batch_size :]
+        negative_score = negative_score.view(-1, self.batch_size).permute(1, 0)
+        return negative_score
+
+    def forward(self, data):
+        score = self.model(data)
+        p_score = self._get_positive_score(score)
+        n_score = self._get_negative_score(score)
+        loss_res = self.loss(p_score, n_score)
+        if self.regul_rate != 0:
+            loss_res += self.regul_rate * self.model.regularization(data)
+        if self.l3_regul_rate != 0:
+            loss_res += self.l3_regul_rate * self.model.l3_regularization()
+        return loss_res
diff --git a/seed_embeddings/OpenKE/module/strategy/Strategy.py b/seed_embeddings/OpenKE/module/strategy/Strategy.py
new file mode 100755
index 000000000..e338877ae
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/strategy/Strategy.py
@@ -0,0 +1,6 @@
+from ..BaseModule import BaseModule
+
+
+class Strategy(BaseModule):
+    def __init__(self):
+        super(Strategy, self).__init__()
diff --git a/seed_embeddings/OpenKE/module/strategy/__init__.py b/seed_embeddings/OpenKE/module/strategy/__init__.py
new file mode 100755
index 000000000..bd9cb19b2
--- /dev/null
+++ b/seed_embeddings/OpenKE/module/strategy/__init__.py
@@ -0,0 +1,11 @@
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from .Strategy import Strategy
+from .NegativeSampling import NegativeSampling
+
+__all__ = [
+    "Strategy",
+    "NegativeSampling",
+]
diff --git a/seed_embeddings/OpenKE/openKE.yaml b/seed_embeddings/OpenKE/openKE.yaml
index c70cec8ed..7069e0da6 100644
--- a/seed_embeddings/OpenKE/openKE.yaml
+++ b/seed_embeddings/OpenKE/openKE.yaml
@@ -1,7 +1,75 @@
 name: openKE
 channels:
   - defaults
-  - conda-forge
 dependencies:
-  - python=3.7
-  - tensorflow-gpu==2.2.0
+  - _libgcc_mutex=0.1=main
+  - _openmp_mutex=5.1=1_gnu
+  - blas=1.0=mkl
+  - ca-certificates=2024.7.2=h06a4308_0
+  - certifi=2022.12.7=py37h06a4308_0
+  - cffi=1.15.1=py37h5eee18b_3
+  - future=0.18.3=py37h06a4308_0
+  - intel-openmp=2021.4.0=h06a4308_3561
+  - ld_impl_linux-64=2.38=h1181459_1
+  - libffi=3.4.4=h6a678d5_1
+  - libgcc-ng=11.2.0=h1234567_1
+  - libgomp=11.2.0=h1234567_1
+  - libprotobuf=3.20.3=he621ea3_0
+  - libstdcxx-ng=11.2.0=h1234567_1
+  - mkl=2021.4.0=h06a4308_640
+  - mkl-service=2.4.0=py37h7f8727e_0
+  - mkl_fft=1.3.1=py37hd3c417c_0
+  - mkl_random=1.2.2=py37h51133e4_0
+  - ncurses=6.4=h6a678d5_0
+  - ninja=1.10.2=h06a4308_5
+  - ninja-base=1.10.2=hd09550d_5
+  - numpy=1.21.5=py37h6c91a56_3
+  - numpy-base=1.21.5=py37ha15fc14_3
+  - openssl=1.1.1w=h7f8727e_0
+  - pip=22.3.1=py37h06a4308_0
+  - pycparser=2.21=pyhd3eb1b0_0
+  - python=3.7.16=h7a1cb2a_0
+  - pytorch=1.12.1=cpu_py37hb1f1ab4_1
+  - pyyaml=6.0=py37h5eee18b_1
+  - readline=8.2=h5eee18b_0
+  - setuptools=65.6.3=py37h06a4308_0
+  - six=1.16.0=pyhd3eb1b0_1
+  - sqlite=3.45.3=h5eee18b_0
+  - tk=8.6.14=h39e8969_0
+  - tqdm=4.64.1=py37h06a4308_0
+  - typing-extensions=4.3.0=py37h06a4308_0
+  - typing_extensions=4.3.0=py37h06a4308_0
+  - wheel=0.38.4=py37h06a4308_0
+  - xz=5.4.6=h5eee18b_1
+  - yaml=0.2.5=h7b6447c_0
+  - zlib=1.2.13=h5eee18b_1
+  - pip:
+      - aiosignal==1.3.1
+      - attrs==24.2.0
+      - charset-normalizer==3.3.2
+      - click==8.1.7
+      - filelock==3.12.2
+      - frozenlist==1.3.3
+      - fsspec==2023.1.0
+      - idna==3.8
+      - importlib-metadata==6.7.0
+      - importlib-resources==5.12.0
+      - joblib==1.3.2
+      - jsonschema==4.17.3
+      - msgpack==1.0.5
+      - packaging==24.0
+      - pandas==1.3.5
+      - pkgutil-resolve-name==1.3.10
+      - protobuf==4.24.4
+      - pyarrow==12.0.1
+      - pyrsistent==0.19.3
+      - python-dateutil==2.9.0.post0
+      - pytz==2024.1
+      - ray==2.7.2
+      - requests==2.31.0
+      - scikit-learn==1.0.2
+      - scipy==1.7.3
+      - tensorboardx==2.6.2.2
+      - threadpoolctl==3.1.0
+      - urllib3==2.0.7
+      - zipp==3.15.0
diff --git a/seed_embeddings/OpenKE/openKE_GPU.yaml b/seed_embeddings/OpenKE/openKE_GPU.yaml
new file mode 100644
index 000000000..f965e8158
--- /dev/null
+++ b/seed_embeddings/OpenKE/openKE_GPU.yaml
@@ -0,0 +1,161 @@
+name: openKE_GPU
+channels:
+  - pytorch
+  - nvidia
+  - defaults
+dependencies:
+  - _libgcc_mutex=0.1=main
+  - _openmp_mutex=5.1=1_gnu
+  - blas=1.0=mkl
+  - brotli-python=1.0.9=py310h6a678d5_8
+  - bzip2=1.0.8=h5eee18b_6
+  - ca-certificates=2024.7.2=h06a4308_0
+  - certifi=2024.8.30=py310h06a4308_0
+  - charset-normalizer=3.3.2=pyhd3eb1b0_0
+  - cuda-cudart=11.8.89=0
+  - cuda-cupti=11.8.87=0
+  - cuda-libraries=11.8.0=0
+  - cuda-nvrtc=11.8.89=0
+  - cuda-nvtx=11.8.86=0
+  - cuda-runtime=11.8.0=0
+  - ffmpeg=4.3=hf484d3e_0
+  - filelock=3.13.1=py310h06a4308_0
+  - freetype=2.12.1=h4a9f257_0
+  - gmp=6.2.1=h295c915_3
+  - gmpy2=2.1.2=py310heeb90bb_0
+  - gnutls=3.6.15=he1e5248_0
+  - idna=3.7=py310h06a4308_0
+  - intel-openmp=2023.1.0=hdb19cb5_46306
+  - jinja2=3.1.4=py310h06a4308_0
+  - jpeg=9e=h5eee18b_3
+  - lame=3.100=h7b6447c_0
+  - lcms2=2.12=h3be6417_0
+  - ld_impl_linux-64=2.38=h1181459_1
+  - lerc=3.0=h295c915_0
+  - libcublas=11.11.3.6=0
+  - libcufft=10.9.0.58=0
+  - libcufile=1.9.1.3=0
+  - libcurand=10.3.5.147=0
+  - libcusolver=11.4.1.48=0
+  - libcusparse=11.7.5.86=0
+  - libdeflate=1.17=h5eee18b_1
+  - libffi=3.4.4=h6a678d5_1
+  - libgcc-ng=11.2.0=h1234567_1
+  - libgomp=11.2.0=h1234567_1
+  - libiconv=1.16=h5eee18b_3
+  - libidn2=2.3.4=h5eee18b_0
+  - libjpeg-turbo=2.0.0=h9bf148f_0
+  - libnpp=11.8.0.86=0
+  - libnvjpeg=11.9.0.86=0
+  - libpng=1.6.39=h5eee18b_0
+  - libstdcxx-ng=11.2.0=h1234567_1
+  - libtasn1=4.19.0=h5eee18b_0
+  - libtiff=4.5.1=h6a678d5_0
+  - libunistring=0.9.10=h27cfd23_0
+  - libuuid=1.41.5=h5eee18b_0
+  - libwebp-base=1.3.2=h5eee18b_0
+  - llvm-openmp=14.0.6=h9e868ea_0
+  - lz4-c=1.9.4=h6a678d5_1
+  - markupsafe=2.1.3=py310h5eee18b_0
+  - mkl=2023.1.0=h213fc3f_46344
+  - mkl-service=2.4.0=py310h5eee18b_1
+  - mkl_fft=1.3.10=py310h5eee18b_0
+  - mkl_random=1.2.7=py310h1128e8f_0
+  - mpc=1.1.0=h10f8cd9_1
+  - mpfr=4.0.2=hb69a4c5_1
+  - mpmath=1.3.0=py310h06a4308_0
+  - ncurses=6.4=h6a678d5_0
+  - nettle=3.7.3=hbbd107a_1
+  - networkx=3.2.1=py310h06a4308_0
+  - openh264=2.1.1=h4ff587b_0
+  - openjpeg=2.5.2=he7f1fd0_0
+  - openssl=3.0.15=h5eee18b_0
+  - pillow=10.4.0=py310h5eee18b_0
+  - pip=24.2=py310h06a4308_0
+  - pysocks=1.7.1=py310h06a4308_0
+  - python=3.10.14=h955ad1f_1
+  - pytorch=2.4.1=py3.10_cuda11.8_cudnn9.1.0_0
+  - pytorch-cuda=11.8=h7e8668a_5
+  - pytorch-mutex=1.0=cuda
+  - pyyaml=6.0.1=py310h5eee18b_0
+  - readline=8.2=h5eee18b_0
+  - requests=2.32.3=py310h06a4308_0
+  - setuptools=75.1.0=py310h06a4308_0
+  - sqlite=3.45.3=h5eee18b_0
+  - sympy=1.13.2=py310h06a4308_0
+  - tbb=2021.8.0=hdb19cb5_0
+  - tk=8.6.14=h39e8969_0
+  - torchaudio=2.4.1=py310_cu118
+  - torchtriton=3.0.0=py310
+  - torchvision=0.19.1=py310_cu118
+  - typing_extensions=4.11.0=py310h06a4308_0
+  - urllib3=2.2.2=py310h06a4308_0
+  - wheel=0.44.0=py310h06a4308_0
+  - xz=5.4.6=h5eee18b_1
+  - yaml=0.2.5=h7b6447c_0
+  - zlib=1.2.13=h5eee18b_1
+  - zstd=1.5.5=hc292b87_2
+  - pip:
+      - absl-py==2.1.0
+      - aiosignal==1.3.1
+      - alembic==1.13.2
+      - astunparse==1.6.3
+      - attrs==24.2.0
+      - click==8.1.7
+      - colorlog==6.8.2
+      - contourpy==1.3.0
+      - cycler==0.12.1
+      - flatbuffers==24.3.25
+      - fonttools==4.53.1
+      - frozenlist==1.4.1
+      - fsspec==2024.9.0
+      - gast==0.6.0
+      - google-pasta==0.2.0
+      - greenlet==3.1.1
+      - grpcio==1.66.1
+      - h5py==3.11.0
+      - joblib==1.4.2
+      - jsonschema==4.23.0
+      - jsonschema-specifications==2023.12.1
+      - keras==3.5.0
+      - kiwisolver==1.4.7
+      - libclang==18.1.1
+      - mako==1.3.5
+      - markdown==3.7
+      - markdown-it-py==3.0.0
+      - matplotlib==3.9.2
+      - mdurl==0.1.2
+      - ml-dtypes==0.4.1
+      - msgpack==1.1.0
+      - namex==0.0.8
+      - numpy==1.26.4
+      - opt-einsum==3.3.0
+      - optree==0.12.1
+      - optuna==4.0.0
+      - packaging==24.1
+      - pandas==2.2.2
+      - protobuf==4.25.5
+      - pyarrow==17.0.0
+      - pygments==2.18.0
+      - pyparsing==3.1.4
+      - python-dateutil==2.9.0.post0
+      - pytz==2024.2
+      - ray==2.7.2
+      - referencing==0.35.1
+      - rich==13.8.1
+      - rpds-py==0.20.0
+      - scikit-learn==1.5.2
+      - scipy==1.14.1
+      - six==1.16.0
+      - sqlalchemy==2.0.35
+      - tensorboard==2.17.1
+      - tensorboard-data-server==0.7.2
+      - tensorboardx==2.6.2.2
+      - tensorflow==2.17.0
+      - tensorflow-io-gcs-filesystem==0.37.1
+      - termcolor==2.4.0
+      - threadpoolctl==3.5.0
+      - tqdm==4.66.5
+      - tzdata==2024.1
+      - werkzeug==3.0.4
+      - wrapt==1.16.0
diff --git a/seed_embeddings/OpenKE/release/Base.so b/seed_embeddings/OpenKE/release/Base.so
index 6fd155278..f83bf15e8 100755
Binary files a/seed_embeddings/OpenKE/release/Base.so and b/seed_embeddings/OpenKE/release/Base.so differ
diff --git a/seed_embeddings/README.md b/seed_embeddings/README.md
index 6a8091a21..419906dcd 100644
--- a/seed_embeddings/README.md
+++ b/seed_embeddings/README.md
@@ -1,6 +1,10 @@
 # Pretrained Embeddings
 If you do not want to train the model to generate seed embeddings, and want to use the pretrained vocabulary, please use the vocabulary given [here](../vocabulary) and skip the following.
 
+Currently we support three different embedding dimensions (`75`, `100`, `300`). If you want to use embeddings of different dimensions, you can follow the below steps and copy the resultant
+vocabulary to the [vocabulary](../vocabulary) directory with the following naming convention. `seedEmbeddingVocab<DIM>D.txt`. Such vocabularies would be automatically used during the build
+process of IR2Vec.
+
 # Generation of Seed Embedding Vocabulary
 This directory helps in generating seed embedding vocabulary in 3 steps.
 1. [Building ir2vec](#step-1-building-ir2vec)
@@ -37,12 +41,12 @@ Boost | https://www.boost.org/
 SPEC17 CPU | https://www.spec.org/cpu2017/
 
 ## Step 3: Training TransE to generate seed embedding vocabulary
-The [`OpenKE`](./OpenKE) directory is a modified version of OpenKE repository (https://github.com/thunlp/OpenKE/tree/OpenKE-Tensorflow1.0) with the necessary changes for training seed embedding vocabulary.
+The [`OpenKE`](./OpenKE) directory is a modified version of OpenKE repository (https://github.com/thunlp/OpenKE/tree/OpenKE-PyTorch) with the necessary changes for training seed embedding vocabulary.
 
 Please see [OpenKE/README.md](./OpenKE/README.md) for further information on OpenKE.
 
 #### Requirements
-Create `conda` environment and install the packages given in [openKE.yaml](./OpenKE/requirements.txt)
+Create `conda` environment and install the packages given in [openKE.yaml](./OpenKE/openKE.yaml)
 * `conda create -f ./OpenKE/openKE.yaml`
 * `conda activate openKE`
 
@@ -52,12 +56,41 @@ We preprocess the generated triplets from the [previous step](#step-2-generating
 * `python preprocess.py --tripletFile=<tripletsFilePath>`
     * `--tripletFile` points to the location of the `outputFileName` generated in the [previous step](#step-2-generating-triplets)
     * The processed files `entity2id.txt`, `train2id.txt` and `relation2id.txt` will be generated in the same directory as that of `tripletsFilePath`.
-
 #### Training TransE to generate embeddings
 Run  `python generate_embedding_ray.py`
-* Possible arguments to be given with the file. These args have default values that will be used unless provided
-    * `--index_dir` points to the directory containing the processed files generated on preprocessing the triplets.
-    * `--nbatches` Mentions the batch size. Default size is 100.
-    * `--margin` Mentions the margin size. Default margin is 1.0
+**Possible Arguments:**
+All the arguments have default values unless provided:
+-  `--index_dir`: Specifies the directory containing the processed files generated from preprocessing the triplets.
+-  `--epoch`: Sets the number of epochs. Default is `1000`.
+-  `--is_analogy`: Boolean flag to report analogy scores, calculated every 10 epochs using analogies.txt. Default is `False`.
+-  `--link_pred`: Boolean flag to report link prediction scores. Requires testing files (`test2id.txt`,` valid2id.txt`) in the ``--index_dir`. Link prediction scores include hit@1, hit@3, hit@10, mean rank (MR), and mean reciprocal rank (MRR). Default is `False`.
+-  `--nbatches`: Specifies the batch size. Default is `100`.
+-  `--margin`: Specifies the margin size for training. Default is `1.0`.
+##### Example Command
+To train a model with analogy scoring enabled and a batch size of 200, you can run:
+```
+python generate_embedding_ray.py --index_dir "../seed_embeddings/preprocessed/" --epoch 1500 --is_analogy True --use_gpu true
+```
+##### TensorBoard Tracking
+Once training begins, you can monitor the progress using TensorBoard by running the following command:
+```
+tensorboard --logdir=~/ray_results
+
+```
+##### ASHA Scheduler for Hyperparameter Optimization
+We employ the [ASHA Scheduler](https://docs.ray.io/en/latest/tune/api/doc/ray.tune.schedulers.AsyncHyperBandScheduler.html#ray.tune.schedulers.AsyncHyperBandScheduler) to efficiently optimize hyperparameters and terminate suboptimal trials. This scheduler tracks key metrics, which are determined by the following conditions:
+
+- If `--is_analogy` is set to `True`, the AnalogyScore will be the key metric.
+- If `--link_pred` is set to `True`, the hit@1 will be the key metric.
+- If neither flag is set, the default loss will be used as the key metric.
+#### Results
+Once the training completes, the best model will be saved in the specified `index_dir` with the filename format:
+```
+seedEmbedding_{}E_{}D_{}batches_{}margin.ckpt
+
+```
+In addition, the entity embeddings will be stored in the `index_dir/embeddings` subdirectory in the following format:
+```
+embeddings/seedEmbedding_{}E_{}D_{}batches_{}margin.txt
 
-The seed embedding vocabulary will be generated inside the same directory.
+```
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e4c7adaaf..c8f2b2374 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,16 +1,69 @@
-
 configure_file (./include/version.h.cmake version.h @ONLY)
 include_directories(./include ${CMAKE_CURRENT_BINARY_DIR})
 include_directories(${CMAKE_BINARY_DIR})
-set(commonsrc FlowAware.cpp Symbolic.cpp utils.cpp)
-set(libsrc libIR2Vec.cpp ${commonsrc})
-set(binsrc CollectIR.cpp IR2Vec.cpp)
+
 option(LLVM_IR2VEC "where to enable IR2Vec as subproject for LLVM" OFF)
+
+set(GENERATED_HEADERS_DIR "${CMAKE_BINARY_DIR}/include")
+file(MAKE_DIRECTORY ${GENERATED_HEADERS_DIR})
+
+file(GLOB VOCAB_FILES "../vocabulary/seedEmbeddingVocab*D.txt")
+
+# List to hold supported dimensions
+set(DIMENSIONS "")
+
+foreach(VOCAB_FILE IN LISTS VOCAB_FILES)
+    get_filename_component(VOCAB_NAME ${VOCAB_FILE} NAME_WE)  # Extract just the file name
+    string(REGEX MATCH "[0-9]+" DIM ${VOCAB_NAME})
+    execute_process(
+        COMMAND python3 generate_vocabulary.py vocab ${VOCAB_FILE} ${GENERATED_HEADERS_DIR}
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        RESULT_VARIABLE GENERATE_VOCABULARY_RESULT
+        OUTPUT_VARIABLE GENERATE_VOCABULARY_OUTPUT
+        ERROR_VARIABLE GENERATE_VOCABULARY_ERROR
+    )
+
+    if(NOT GENERATE_VOCABULARY_RESULT EQUAL 0)
+      message(FATAL_ERROR "Failed to generate vocabulary files: ${GENERATE_VOCABULARY_ERROR}")
+    else()
+      message(STATUS "Generated vocabulary file: Vocabulary${DIM}D.h")
+    endif()
+
+    list(APPEND DIMENSIONS ${DIM})
+endforeach()
+
+# Check if DIMENSIONS is not empty
+if(NOT DIMENSIONS)
+  message(FATAL_ERROR "No vocabulary files generated")
+endif()
+
+foreach(DIM ${DIMENSIONS})
+  list(APPEND GENERATED_VOCAB_HEADERS "${GENERATED_HEADERS_DIR}/Vocabulary${DIM}D.h")
+endforeach()
+
+string(REPLACE ";" "," DIMENSIONS "${DIMENSIONS}")
 execute_process(
-    COMMAND python3 generate_vocabulary.py -o ${CMAKE_BINARY_DIR}/vocabulary.h
+    COMMAND python3 generate_vocabulary.py base ${DIMENSIONS} ${GENERATED_HEADERS_DIR}
     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-    COMMAND echo "Vocabulary file generated."
+    RESULT_VARIABLE GENERATE_BASE_RESULT
+    OUTPUT_VARIABLE GENERATE_BASE_OUTPUT
+    ERROR_VARIABLE GENERATE_BASE_ERROR
 )
+
+if(NOT GENERATE_BASE_RESULT EQUAL 0)
+  message(FATAL_ERROR "Failed to generate base vocabulary file: ${GENERATE_BASE_ERROR}")
+else()
+  message(STATUS "Generated base vocabulary file")
+endif()
+
+list(APPEND GENERATED_VOCAB_HEADERS "${GENERATED_HEADERS_DIR}/Vocabulary.h")
+
+include_directories(${GENERATED_HEADERS_DIR})
+
+set(commonsrc FlowAware.cpp Symbolic.cpp utils.cpp ${GENERATED_HEADERS_DIR}/VocabularyFactory.cpp)
+set(libsrc libIR2Vec.cpp ${commonsrc})
+set(binsrc CollectIR.cpp IR2Vec.cpp)
+
 if(NOT LLVM_IR2VEC)
 
   set(LT_LLVM_INSTALL_DIR "" CACHE PATH "LLVM installation directory")
@@ -36,10 +89,12 @@ if(NOT LLVM_IR2VEC)
 
   add_library(${IR2VEC_LIB} SHARED $<TARGET_OBJECTS:objlib>)
   add_library(${IR2VEC_LIB_STATIC} STATIC $<TARGET_OBJECTS:objlib>)
+
   set_target_properties(${IR2VEC_LIB} ${IR2VEC_LIB_STATIC} PROPERTIES
       VERSION ${PROJECT_VERSION}
       SOVERSION 1
       PUBLIC_HEADER "./include/IR2Vec.h"
+      PUBLIC_HEADER "${GENERATED_VOCAB_HEADERS}"
       OUTPUT_NAME ${IR2VEC_LIB}
       LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
       ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
diff --git a/src/FlowAware.cpp b/src/FlowAware.cpp
index 8e1e539cd..c627dc377 100644
--- a/src/FlowAware.cpp
+++ b/src/FlowAware.cpp
@@ -97,11 +97,11 @@ void IR2Vec_FA::collectWriteDefsMap(Module &M) {
 
 Vector IR2Vec_FA::getValue(std::string key) {
   Vector vec(DIM, 0);
-  if (opcMap.find(key) == opcMap.end()) {
+  if (vocabulary.find(key) == vocabulary.end()) {
     IR2VEC_DEBUG(errs() << "cannot find key in map : " << key << "\n");
     dataMissCounter++;
   } else
-    vec = opcMap[key];
+    vec = vocabulary[key];
   return vec;
 }
 
@@ -493,7 +493,7 @@ Vector IR2Vec_FA::func2Vec(Function &F,
     outs() << sets << " ";
   } outs() << "\n";);
 
-  SmallVector<double, DIM> prevVec;
+  Vector prevVec;
   Instruction *argToKill = nullptr;
 
   while (stack.size() != 0) {
diff --git a/src/IR2Vec.cpp b/src/IR2Vec.cpp
index 3946b1b6d..6fe0b3a98 100644
--- a/src/IR2Vec.cpp
+++ b/src/IR2Vec.cpp
@@ -6,11 +6,12 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "IR2Vec.h"
 #include "CollectIR.h"
 #include "FlowAware.h"
 #include "Symbolic.h"
+#include "Vocabulary.h"
 #include "version.h"
+
 #include "llvm/Support/CommandLine.h"
 #include <stdio.h>
 #include <time.h>
@@ -36,7 +37,9 @@ cl::opt<bool> cl_collectIR(
     cl::init(false), cl::cat(category));
 cl::opt<std::string> cl_iname(cl::Positional, cl::desc("Input file path"),
                               cl::Required, cl::cat(category));
-
+cl::opt<unsigned> cl_dim("dim", cl::Optional, cl::init(300),
+                         cl::desc("Dimension of the embeddings"),
+                         cl::cat(category));
 cl::opt<std::string> cl_oname("o", cl::Required, cl::desc("Output file path"),
                               cl::cat(category));
 // for on demand generation of embeddings taking function name
@@ -80,7 +83,7 @@ int main(int argc, char **argv) {
   collectIR = cl_collectIR;
   iname = cl_iname;
   oname = cl_oname;
-  // newly added
+  DIM = cl_dim;
   funcName = cl_funcName;
   level = cl_level;
   cls = cl_cls;
@@ -113,9 +116,11 @@ int main(int argc, char **argv) {
     exit(1);
 
   auto M = getLLVMIR();
+  auto vocabulary = VocabularyFactory::createVocabulary(DIM)->getVocabulary();
+
   // newly added
   if (sym && !(funcName.empty())) {
-    IR2Vec_Symbolic SYM(*M);
+    IR2Vec_Symbolic SYM(*M, vocabulary);
     std::ofstream o;
     o.open(oname, std::ios_base::app);
     if (printTime) {
@@ -132,7 +137,7 @@ int main(int argc, char **argv) {
     }
     o.close();
   } else if (fa && !(funcName.empty())) {
-    IR2Vec_FA FA(*M);
+    IR2Vec_FA FA(*M, vocabulary);
     std::ofstream o, missCount, cyclicCount;
     o.open(oname, std::ios_base::app);
     missCount.open("missCount_" + oname, std::ios_base::app);
@@ -153,7 +158,7 @@ int main(int argc, char **argv) {
     }
     o.close();
   } else if (fa) {
-    IR2Vec_FA FA(*M);
+    IR2Vec_FA FA(*M, vocabulary);
     std::ofstream o, missCount, cyclicCount;
     o.open(oname, std::ios_base::app);
     missCount.open("missCount_" + oname, std::ios_base::app);
@@ -172,7 +177,7 @@ int main(int argc, char **argv) {
     }
     o.close();
   } else if (sym) {
-    IR2Vec_Symbolic SYM(*M);
+    IR2Vec_Symbolic SYM(*M, vocabulary);
     std::ofstream o;
     o.open(oname, std::ios_base::app);
     if (printTime) {
diff --git a/src/Symbolic.cpp b/src/Symbolic.cpp
index 68d9014b0..a8f75c9a2 100644
--- a/src/Symbolic.cpp
+++ b/src/Symbolic.cpp
@@ -28,11 +28,11 @@ using namespace IR2Vec;
 using abi::__cxa_demangle;
 
 Vector IR2Vec_Symbolic::getValue(std::string key) {
-  Vector vec;
-  if (opcMap.find(key) == opcMap.end())
+  Vector vec(DIM, 0);
+  if (vocabulary.find(key) == vocabulary.end())
     IR2VEC_DEBUG(errs() << "cannot find key in map : " << key << "\n");
   else
-    vec = opcMap[key];
+    vec = vocabulary[key];
   return vec;
 }
 
diff --git a/src/generate_vocabulary.py b/src/generate_vocabulary.py
index bca3aadb5..80068717e 100644
--- a/src/generate_vocabulary.py
+++ b/src/generate_vocabulary.py
@@ -7,73 +7,198 @@
 # ------------------------------------------------------------------------------
 
 import argparse
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-o", "--output", type=str, help="Output file name")
-args = parser.parse_args()
-
-if args.output is None:
-    print("Error: Output file path not provided.")
-    exit(1)
-
-output_file = args.output
-vocab_file = "../vocabulary/seedEmbeddingVocab.txt"
-
-# Define headers and opening/closing of map
-header = """\
-// Generated by IR2Vec. DO NOT EDIT!
-// This file contains the learned vocabulary used by IR2Vec.
-//
-// clang-format off
-
-#ifndef __VOCABULARY__
-#define __VOCABULARY__
-
-#include <map>
-#include <string>
-#include <vector>
-#include "IR2Vec.h"
-
-namespace IR2Vec {
-
-class Vocabulary {
-public:
-    static const std::map<std::string, IR2Vec::Vector>& getVocabulary() {
-        return vocabulary;
-    }
-private:
-    static const std::map<std::string, IR2Vec::Vector> vocabulary;
-};
-
-"""
-
-opening = "\nconst std::map<std::string, IR2Vec::Vector> Vocabulary::vocabulary = {\n"
-closing = """\
+import sys
+import os
+
+
+class VocabularyError(Exception):
+    """Custom exception for vocabulary errors."""
+
+    pass
+
+
+# Common header strings
+HEADER_GENERATED = "// Generated by IR2Vec. DO NOT EDIT!\n"
+HEADER_VOCABULARY_BASE = "// This file defines the base class for vocabulary and the factory \n// for creating vocabulary instances used by IR2Vec.\n"
+HEADER_VOCABULARY_CLASS = (
+    "// This file defines the {class_name} vocabulary class used by IR2Vec.\n"
+)
+HEADER_CLANG_FORMAT_OFF = "// clang-format off\n"
+
+
+def write_file(file_path, content):
+    try:
+        with open(file_path, "w") as fw:
+            fw.write(content)
+    except IOError as e:
+        raise VocabularyError(f"Failed to write to {file_path}: {e}")
+
+
+def generate_base_vocabulary_header():
+    return (
+        f"{HEADER_GENERATED}"
+        f"{HEADER_VOCABULARY_BASE}"
+        f"{HEADER_CLANG_FORMAT_OFF}\n"
+        "#ifndef __VOCABULARY_H__\n"
+        "#define __VOCABULARY_H__\n\n"
+        "#include <map>\n"
+        "#include <string>\n"
+        "#include <vector>\n"
+        "#include <memory>\n"
+        "#include <stdexcept> // For std::invalid_argument\n"
+        "namespace IR2Vec {\n\n"
+        "using Vector = std::vector<double>;\n\n"
+        "class VocabularyBase {\n"
+        "public:\n"
+        "    virtual ~VocabularyBase() {}\n"
+        "    virtual const std::map<std::string, IR2Vec::Vector>& getVocabulary() const = 0;\n"
+        "};\n\n"
+        "class VocabularyFactory {\n"
+        "public:\n"
+        "    static std::unique_ptr<VocabularyBase> createVocabulary(unsigned dim);\n"
+        "};\n\n"
+        "} // namespace IR2Vec\n\n"
+        "#endif // __VOCABULARY_H__\n"
+    )
+
+
+def generate_vocabulary_class(vocab_file, class_name):
+    class_header = (
+        f"{HEADER_GENERATED}"
+        f"{HEADER_VOCABULARY_CLASS.format(class_name=class_name)}"
+        f"{HEADER_CLANG_FORMAT_OFF}\n"
+        f"#ifndef __{class_name.upper()}__\n"
+        f"#define __{class_name.upper()}__\n\n"
+        f"#include <map>\n"
+        f"#include <string>\n"
+        f"#include <vector>\n"
+        f'#include "Vocabulary.h" // Include the base class\n\n'
+        f"namespace IR2Vec {{\n\n"
+        f"class {class_name} : public VocabularyBase {{\n"
+        f"public:\n"
+        f"    const std::map<std::string, IR2Vec::Vector>& getVocabulary() const override{{\n"
+        f"        return vocabulary;\n"
+        f"    }}\n"
+        f"private:\n"
+        f"    static const std::map<std::string, IR2Vec::Vector> vocabulary;\n"
+        f"}};\n"
+    )
+
+    opening = (
+        f"\nconst std::map<std::string, IR2Vec::Vector> {class_name}::vocabulary = {{\n"
+    )
+    closing = """\
 };
 } // namespace IR2Vec
 
-#endif // __VOCABULARY__
+#endif // __{class_name.upper()}__
 """
-
-try:
-    with open(output_file, "w") as fw:
-        fw.write(header)
-        with open(vocab_file, "r") as fr:
-            # Write vector declarations to the output file
-            for line in fr.readlines():
-                key, val = line.strip().split(":")
-                e = val.find("]")
-                fw.write(f"const IR2Vec::Vector {key}_vector = {{  {val[1:e]} }};\n")
-
-        fw.write(opening)
-        with open(vocab_file, "r") as fr:
-            # Write map entries to the output file
-            for line in fr.readlines():
-                key, _ = line.strip().split(":")
-                fw.write(f'    {{ "{key}", {key}_vector }},\n')
-        fw.write(closing)
-
-    print(f"Generated {output_file}")
-
-except FileNotFoundError:
-    print(f"Error: Vocabulary file '{vocab_file}' not found.")
+    dim = class_name.replace("Vocabulary", "")
+    vector_definitions = ""
+    with open(vocab_file, "r") as fr:
+        for line in fr.readlines():
+            key, val = line.strip().split(":")
+            e = val.find("]")
+            vector_definitions += (
+                f"const IR2Vec::Vector {key}_vector_{dim} = {{  {val[1:e]} }};\n"
+            )
+
+    vocabulary_entries = ""
+    with open(vocab_file, "r") as fr:
+        for line in fr.readlines():
+            key, _ = line.strip().split(":")
+            vocabulary_entries += f'    {{ "{key}", {key}_vector_{dim} }},\n'
+
+    return class_header + vector_definitions + opening + vocabulary_entries + closing
+
+
+def generate_vocabulary_factory(class_names):
+    factory_header = (
+        f"{HEADER_GENERATED}"
+        f"{HEADER_VOCABULARY_BASE}"
+        f"{HEADER_CLANG_FORMAT_OFF}\n"
+        "#include <memory>\n"  # For std::unique_ptr
+        '#include "Vocabulary.h"\n\n'
+    )
+
+    # Include headers for each vocabulary class
+    for class_name in class_names:
+        factory_header += f'#include "{class_name}.h"\n'
+
+    factory_header += "\nnamespace IR2Vec {\n\n"
+
+    factory_function = (
+        "std::unique_ptr<VocabularyBase> VocabularyFactory::createVocabulary(unsigned dim) {\n"
+        "    switch (dim) {\n"
+    )
+
+    factory_cases = ""
+    for class_name in class_names:
+        dim = class_name.replace("Vocabulary", "").replace("D", "")
+        factory_cases += f"        case {dim}:\n            return std::make_unique<{class_name}>();\n"
+
+    factory_footer = """\
+        default:
+            throw std::invalid_argument("Invalid dimension for vocabulary creation.");
+    }
+}
+} // namespace IR2Vec\n
+"""
+    return factory_header + factory_function + factory_cases + factory_footer
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description="Generate vocabulary and factory files."
+    )
+    parser.add_argument(
+        "type", choices=["vocab", "base"], help="Type of files to generate."
+    )
+    parser.add_argument(
+        "input",
+        help="Input vocabulary text file or dimensions as a comma-separated list.",
+    )
+    parser.add_argument("output", help="Output file path.")
+
+    args = parser.parse_args()
+    if args.type is None or args.input is None or args.output is None:
+        raise VocabularyError("Type, input, or output not provided.")
+
+    if args.type == "vocab":
+        # Generate vocabulary class based on input file
+        vocab_file = args.input
+
+        # Extract dimension from the file name
+        dim = (
+            os.path.splitext(os.path.basename(vocab_file))[0]
+            .split("D")[0]
+            .split("Vocab")[-1]
+        )
+        class_name = f"Vocabulary{dim}D"
+        vocab_class_code = generate_vocabulary_class(vocab_file, class_name)
+        output_file = os.path.join(args.output, f"{class_name}.h")
+        write_file(output_file, vocab_class_code)
+
+    elif args.type == "base":
+        # Generate base vocabulary header and factory implementation
+        base_header_code = generate_base_vocabulary_header()
+        output_file = os.path.join(args.output, "Vocabulary.h")
+        write_file(output_file, base_header_code)
+
+        # Parse the dimensions from the input and generate class names
+        dimensions = args.input.split(",")
+        class_names = [
+            f"Vocabulary{dim}D" for dim in dimensions
+        ]  # Create class names based on dimensions
+
+        factory_code = generate_vocabulary_factory(class_names)
+        output_file = os.path.join(args.output, "VocabularyFactory.cpp")
+        write_file(output_file, factory_code)
+
+
+if __name__ == "__main__":
+    try:
+        main()
+    except VocabularyError as e:
+        sys.stderr.write(f"Error: {e}\n")  # Write errors to stderr
+        sys.exit(1)
diff --git a/src/include/FlowAware.h b/src/include/FlowAware.h
index 1f1b4eb83..b27d27510 100644
--- a/src/include/FlowAware.h
+++ b/src/include/FlowAware.h
@@ -28,6 +28,7 @@ class IR2Vec_FA {
 private:
   llvm::Module &M;
   std::string res;
+  IR2Vec::VocabTy &vocabulary;
   IR2Vec::Vector pgmVector;
   unsigned dataMissCounter;
   unsigned cyclicCounter;
@@ -130,9 +131,9 @@ class IR2Vec_FA {
   void updateFuncVecMapWithCallee(const llvm::Function *function);
 
 public:
-  IR2Vec_FA(llvm::Module &M) : M{M} {
+  IR2Vec_FA(llvm::Module &M, IR2Vec::VocabTy &vocab) : M{M}, vocabulary{vocab} {
 
-    pgmVector = IR2Vec::Vector(DIM, 0);
+    pgmVector = IR2Vec::Vector(IR2Vec::DIM, 0);
     res = "";
 
     memWriteOps.try_emplace("store", 1);
diff --git a/src/include/IR2Vec.h b/src/include/IR2Vec.h
index 32a1aaa5c..b67d7a0c1 100644
--- a/src/include/IR2Vec.h
+++ b/src/include/IR2Vec.h
@@ -13,37 +13,39 @@
 #include "llvm/IR/Module.h"
 #include <string>
 
+#include "Vocabulary.h"
 namespace IR2Vec {
 
-#define DIM 300
-using Vector = llvm::SmallVector<double, DIM>;
-
 enum IR2VecMode { FlowAware, Symbolic };
 
 class Embeddings {
   int generateEncodings(llvm::Module &M, IR2VecMode mode, char level = '\0',
-                        std::string funcName = "", std::ostream *o = nullptr,
-                        int cls = -1, float WO = 1, float WA = 0.2,
-                        float WT = 0.5);
+                        std::string funcName = "", unsigned dim = 300,
+                        std::ostream *o = nullptr, int cls = -1, float WO = 1,
+                        float WA = 0.2, float WT = 0.5);
 
   llvm::SmallMapVector<const llvm::Instruction *, Vector, 128> instVecMap;
   llvm::SmallMapVector<const llvm::Function *, Vector, 16> funcVecMap;
   Vector pgmVector;
+  std::map<std::string, IR2Vec::Vector> vocabulary;
 
 public:
   Embeddings() = default;
-  Embeddings(llvm::Module &M, IR2VecMode mode, std::string funcName = "",
-             float WO = 1, float WA = 0.2, float WT = 0.5) {
-    generateEncodings(M, mode, '\0', funcName, nullptr, -1, WO, WA, WT);
+  Embeddings(llvm::Module &M, IR2VecMode mode, unsigned dim = 300,
+             std::string funcName = "", float WO = 1, float WA = 0.2,
+             float WT = 0.5) {
+    vocabulary = VocabularyFactory::createVocabulary(dim)->getVocabulary();
+    generateEncodings(M, mode, '\0', funcName, dim, nullptr, -1, WO, WA, WT);
   }
 
   // Use this constructor if the representations ought to be written to a
   // file. Analogous to the command line options that are being used in IR2Vec
   // binary.
   Embeddings(llvm::Module &M, IR2VecMode mode, char level, std::ostream *o,
-             std::string funcName = "", float WO = 1, float WA = 0.2,
-             float WT = 0.5) {
-    generateEncodings(M, mode, level, funcName, o, -1, WO, WA, WT);
+             unsigned dim = 300, std::string funcName = "", float WO = 1,
+             float WA = 0.2, float WT = 0.5) {
+    vocabulary = VocabularyFactory::createVocabulary(dim)->getVocabulary();
+    generateEncodings(M, mode, level, funcName, dim, o, -1, WO, WA, WT);
   }
 
   // Returns a map containing instructions and the corresponding vector
diff --git a/src/include/Symbolic.h b/src/include/Symbolic.h
index 618672b9f..efad7e0f7 100644
--- a/src/include/Symbolic.h
+++ b/src/include/Symbolic.h
@@ -24,6 +24,7 @@ class IR2Vec_Symbolic {
 
 private:
   llvm::Module &M;
+  IR2Vec::VocabTy &vocabulary;
   IR2Vec::Vector pgmVector;
 
   IR2Vec::Vector getValue(std::string key);
@@ -37,8 +38,9 @@ class IR2Vec_Symbolic {
       instVecMap;
 
 public:
-  IR2Vec_Symbolic(llvm::Module &M) : M{M} {
-    pgmVector = IR2Vec::Vector(DIM, 0);
+  IR2Vec_Symbolic(llvm::Module &M, IR2Vec::VocabTy &vocab)
+      : M{M}, vocabulary{vocab} {
+    pgmVector = IR2Vec::Vector(IR2Vec::DIM, 0);
     res = "";
   }
 
diff --git a/src/include/utils.h b/src/include/utils.h
index ab7921ddf..1541f1c64 100644
--- a/src/include/utils.h
+++ b/src/include/utils.h
@@ -29,8 +29,8 @@ namespace IR2Vec {
     }                                                                          \
   })
 
-#define DIM 300
-using Vector = llvm::SmallVector<double, DIM>;
+using Vector = std::vector<double>;
+using VocabTy = std::map<std::string, Vector>;
 using abi::__cxa_demangle;
 
 extern bool fa;
@@ -46,7 +46,7 @@ extern float WO;
 extern float WA;
 extern float WT;
 extern bool debug;
-extern std::map<std::string, Vector> opcMap;
+extern unsigned DIM;
 std::unique_ptr<llvm::Module> getLLVMIR();
 void scaleVector(Vector &vec, float factor);
 // newly added
diff --git a/src/libIR2Vec.cpp b/src/libIR2Vec.cpp
index 69fd45214..6cceb48ad 100644
--- a/src/libIR2Vec.cpp
+++ b/src/libIR2Vec.cpp
@@ -17,9 +17,9 @@
 
 int IR2Vec::Embeddings::generateEncodings(llvm::Module &M,
                                           IR2Vec::IR2VecMode mode, char level,
-                                          std::string funcName, std::ostream *o,
-                                          int cls, float WO, float WA,
-                                          float WT) {
+                                          std::string funcName, unsigned dim,
+                                          std::ostream *o, int cls, float WO,
+                                          float WA, float WT) {
 
   IR2Vec::level = level;
   IR2Vec::cls = cls;
@@ -27,25 +27,26 @@ int IR2Vec::Embeddings::generateEncodings(llvm::Module &M,
   IR2Vec::WA = WA;
   IR2Vec::WT = WT;
   IR2Vec::funcName = funcName;
+  IR2Vec::DIM = dim;
 
   if (mode == IR2Vec::IR2VecMode::FlowAware && !funcName.empty()) {
-    IR2Vec_FA FA(M);
+    IR2Vec_FA FA(M, vocabulary);
     FA.generateFlowAwareEncodingsForFunction(o, funcName);
     instVecMap = FA.getInstVecMap();
     funcVecMap = FA.getFuncVecMap();
   } else if (mode == IR2Vec::IR2VecMode::FlowAware) {
-    IR2Vec_FA FA(M);
+    IR2Vec_FA FA(M, vocabulary);
     FA.generateFlowAwareEncodings(o);
     instVecMap = FA.getInstVecMap();
     funcVecMap = FA.getFuncVecMap();
     pgmVector = FA.getProgramVector();
   } else if (mode == IR2Vec::IR2VecMode::Symbolic && !funcName.empty()) {
-    IR2Vec_Symbolic SYM(M);
+    IR2Vec_Symbolic SYM(M, vocabulary);
     SYM.generateSymbolicEncodingsForFunction(0, funcName);
     instVecMap = SYM.getInstVecMap();
     funcVecMap = SYM.getFuncVecMap();
   } else if (mode == IR2Vec::IR2VecMode::Symbolic) {
-    IR2Vec_Symbolic SYM(M);
+    IR2Vec_Symbolic SYM(M, vocabulary);
     SYM.generateSymbolicEncodings(o);
     instVecMap = SYM.getInstVecMap();
     funcVecMap = SYM.getFuncVecMap();
diff --git a/src/utils.cpp b/src/utils.cpp
index 515afeb38..b9fc0e580 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -8,7 +8,7 @@
 
 #include "utils.h"
 #include "IR2Vec.h"
-#include "vocabulary.h"
+#include "Vocabulary.h"
 #include <fstream>
 #include <string>
 using namespace llvm;
@@ -27,8 +27,8 @@ float IR2Vec::WO;
 float IR2Vec::WA;
 float IR2Vec::WT;
 bool IR2Vec::debug;
-std::map<std::string, Vector> IR2Vec::opcMap =
-    IR2Vec::Vocabulary::getVocabulary();
+unsigned IR2Vec::DIM;
+
 std::unique_ptr<Module> IR2Vec::getLLVMIR() {
   SMDiagnostic err;
   static LLVMContext context;
diff --git a/vocabulary/seedEmbeddingVocab100D.txt b/vocabulary/seedEmbeddingVocab100D.txt
new file mode 100644
index 000000000..f026c5764
--- /dev/null
+++ b/vocabulary/seedEmbeddingVocab100D.txt
@@ -0,0 +1,63 @@
+add:[-8.52362216e-02, -2.45945796e-01, -4.24607731e-02, 2.64923483e-01, -1.41214542e-02, -1.07707255e-01, 4.51593101e-02, 1.02487214e-01, -1.48341414e-02, 1.81787178e-01, 6.67016208e-02, 4.46189977e-02, -8.23750347e-02, 1.83093518e-01, 3.32678035e-02, -1.46622390e-01, -4.92643900e-02, -2.55224146e-02, 6.04326949e-02, 1.88715130e-01, -3.68193164e-02, 6.94231167e-02, 4.10126410e-02, -6.84764013e-02, 1.23058945e-01, -9.83736390e-05, -5.54158911e-03, 2.94519085e-02, 2.26749685e-02, 1.17240392e-01, 6.11324720e-02, -1.81771517e-01, -1.76415052e-02, -4.01592515e-02, 1.78097621e-01, 7.06670852e-03, -4.57172357e-02, -1.50619969e-01, -9.44827124e-02, -1.75480068e-01, -7.60255978e-02, 1.07171066e-01, 2.22498715e-01, 7.22258165e-02, 7.20588341e-02, -1.16421148e-01, -9.41838771e-02, 1.80813923e-01, -8.05889741e-02, 1.46086052e-01, -9.98349935e-02, 3.29788476e-02, -9.92206857e-02, 9.08804759e-02, 3.78689431e-02, 5.88943586e-02, -4.59491797e-02, -8.29120278e-02, 7.95054361e-02, 1.78439990e-02, -2.58509982e-02, 7.56616369e-02, 1.04568325e-01, -1.56202599e-01, -2.57734563e-02, 1.93596855e-02, 1.29040807e-01, -8.24761093e-02, -1.73545837e-01, 1.42969966e-01, -1.28778622e-01, -3.95107232e-02, 1.33133652e-02, -3.37289199e-02, -6.24400079e-02, -1.31070897e-01, -4.30826917e-02, -1.26567945e-01, -2.15651900e-01, -5.67506291e-02, -3.29258330e-02, 1.65608257e-01, -1.88492145e-02, 2.33287752e-01, 3.00378054e-02, -1.76738545e-01, -8.04325193e-02, 1.87702760e-01, -2.39736848e-02, -9.85645577e-02, 3.72615233e-02, -1.12956636e-01, -9.50063169e-02, 3.42431143e-02, 1.22220606e-01, -5.39523130e-03, 1.98720489e-03, 9.11523402e-03, -6.93807155e-02, 6.17282577e-02]
+alloca:[-0.09549255, -0.12557219, 0.03379089, 0.12109557, -0.03531531, -0.2551805, 0.10788739, 0.09700596, -0.01370677, 0.1135722, 0.07690978, 0.05116574, -0.09614895, 0.19678918, 0.14742346, -0.00976098, 0.24440478, -0.03487564, -0.05972337, -0.07113709, -0.04069309, -0.00905408, 0.09381753, -0.05227873, 0.0185564, 0.00785588, 0.10815099, 0.09986073, 0.0029005, 0.12109574, 0.08769628, -0.07261439, -0.04622762, -0.11434357, 0.31857088, 0.05211561, -0.0501864, -0.08464269, -0.05009941, -0.16629553, -0.10458375, 0.03947812, 0.08374927, 0.02248335, 0.07524205, 0.12703352, 0.02529348, 0.05168853, -0.05606319, -0.13958237, -0.0585564, -0.05144294, -0.11440989, 0.12794414, 0.01429109, -0.02604704, 0.04282403, -0.17824344, -0.00103301, -0.00441383, -0.1290221, 0.11616968, 0.17841731, -0.17370644, 0.01878525, -0.13822994, 0.29534182, -0.08290374, -0.26018453, -0.2423333, 0.06269401, 0.15722081, 0.05572377, 0.03796894, 0.0097774, -0.09503853, -0.03461437, -0.18860193, 0.05917948, -0.05421929, 0.1554059, 0.06737203, 0.12789263, 0.18676774, -0.03264643, -0.14613546, 0.10640658, 0.04788931, 0.05284823, -0.07678876, -0.15884072, -0.09681277, -0.20900938, 0.13614763, 0.11053005, -0.01231453, 0.0082564, 0.01286345, 0.05174101, -0.03757114]
+and:[-0.0881869, -0.1832501, -0.02236259, -0.08309272, -0.01707565, -0.09593864, 0.05584465, 0.11377291, 0.0052051, 0.33537892, -0.02086726, -0.04760219, -0.07862076, 0.17689508, 0.06404671, -0.24831565, -0.04806908, -0.01249005, 0.06386451, 0.17768936, -0.03290997, 0.07213664, 0.0320717, -0.06150476, 0.08116434, 0.00066787, -0.09663099, 0.09602754, 0.02356921, 0.12101333, 0.05900703, -0.16276178, -0.03739112, -0.03569444, 0.15475409, -0.07160591, -0.04432394, -0.09916383, -0.00070206, -0.13641287, -0.0825344, 0.09731495, 0.21391882, 0.05829814, 0.16758765, 0.17819895, -0.10077256, 0.01100022, -0.15785712, -0.10925666, -0.19227467, 0.02036687, 0.03744258, 0.0705176, 0.01200844, 0.06924565, 0.02984295, 0.00166557, 0.01469694, 0.01338413, 0.00133804, 0.0685681, 0.06490856, -0.13547117, 0.13122046, -0.04225351, 0.12522636, -0.07368809, -0.23429681, 0.07449005, 0.08751217, -0.01046039, 0.03592191, 0.02029108, -0.10386209, 0.05748203, -0.27302966, -0.12220228, 0.09895118, -0.04531586, -0.02545726, 0.03405684, -0.01663586, -0.09172897, -0.02909598, -0.1601327, 0.08839633, 0.0608284, -0.09534211, -0.07028268, 0.03571701, -0.10825088, -0.11168069, 0.02237209, 0.09868738, -0.0014685, -0.00517186, -0.01344037, -0.09333953, -0.03477098]
+ashr:[-0.17676029, 0.10313923, -0.00422224, 0.04140399, 0.07537024, -0.09347995, 0.03889775, 0.1937052, 0.03877834, 0.12433453, -0.05621453, -0.09342647, 0.06852726, 0.11960614, 0.2329826, -0.08239498, -0.24359159, -0.02925007, 0.06965269, 0.05229177, -0.07672995, 0.02271152, 0.06093349, -0.01333139, 0.08810728, -0.0650942, -0.02691983, 0.11387724, 0.12446124, 0.08896013, 0.10819702, -0.05356165, -0.16467887, -0.13486785, 0.18615717, 0.09554695, -0.08764168, -0.00645575, -0.06144961, -0.2157099, -0.00717567, 0.02715934, 0.19245613, -0.02020936, -0.2103456, 0.01254946, -0.09238755, -0.08276135, 0.19606642, -0.14044479, -0.16258587, -0.1610684, -0.10104254, 0.15536247, -0.21380995, 0.06143969, -0.00510657, 0.06693038, 0.12561001, 0.05790403, 0.11904424, 0.06015869, 0.13805872, -0.34340182, -0.07052808, -0.07914555, 0.2187202, -0.05404146, 0.01415937, 0.01479177, 0.18482208, 0.0223961, -0.01074133, 0.18871637, -0.03872506, 0.02291136, 0.05926037, -0.1554712, -0.04937316, 0.03572288, 0.13166799, 0.3216803, -0.0597387, -0.10533224, 0.04918348, -0.12194781, 0.09272628, 0.08853518, 0.03546468, 0.00948116, -0.01518097, -0.10260459, -0.17166473, 0.1567235, 0.10187692, -0.04260992, 0.05165593, 0.09330627, -0.01242476, -0.10910615]
+bitcast:[-2.07878817e-02, -8.23711231e-02, 1.00722564e-02, 1.34550288e-01, -4.26665656e-02, -1.56117603e-01, 3.60176153e-02, 1.64358735e-01, 7.73761645e-02, 1.26678392e-01, -8.82288069e-03, -8.71955529e-02, -1.34099036e-01, 2.37952948e-01, -1.03015065e-01, -3.16375331e-03, -2.05897301e-01, -2.51553040e-02, 1.34449201e-02, 1.17931567e-01, 1.30053461e-02, 7.81119913e-02, 5.57484552e-02, -1.52201191e-01, 5.92403876e-06, -3.54858898e-02, -4.84898388e-02, 4.37163413e-02, -1.17184460e-01, 1.56913966e-01, 9.40292403e-02, -4.74243090e-02, 9.07661915e-02, -1.45079255e-01, 1.06205590e-01, -2.15000622e-02, -7.28723779e-02, -1.37063980e-01, 7.85234869e-02, -3.06736454e-02, -8.54443237e-02, -3.38093308e-03, 2.71273911e-01, 2.16092374e-02, 2.23694965e-01, 3.12910303e-02, 3.58200893e-02, 1.54731227e-02, -1.15724750e-01, -1.67987525e-01, -1.97159931e-01, -8.45486671e-02, -6.90428391e-02, -1.85478870e-02, -1.13298140e-01, -6.34974837e-02, 8.66320208e-02, -7.73959830e-02, -7.51477014e-03, -4.42927331e-02, 1.62011728e-01, 6.54485524e-02, 1.05205335e-01, -3.28130648e-02, 7.44132102e-02, -2.36125980e-02, 2.33616680e-02, -4.82202284e-02, -1.56079859e-01, 6.80682734e-02, 2.08332837e-01, 9.13671404e-02, 2.21654788e-01, -1.72201872e-01, -1.04779126e-02, -4.54562865e-02, 2.02677418e-02, 1.64413229e-02, -5.17942458e-02, 1.12812768e-03, 2.52170950e-01, 1.47572741e-01, -4.16345848e-03, -8.78667831e-02, 8.03434253e-02, -3.77238467e-02, -2.80345604e-03, 1.32836118e-01, -5.94768003e-02, 1.26690671e-01, -5.75769730e-02, -6.82438612e-02, -1.56382814e-01, 1.02906309e-01, 7.42264315e-02, -4.65768129e-02, -4.51054312e-02, 2.40943264e-02, -2.39319339e-01, -6.20513149e-02]
+br:[-0.099177, 0.3150131, -0.04487686, -0.01492688, -0.04303256, -0.19340976, 0.01871662, 0.08351724, 0.0033876, 0.04619076, 0.07775693, 0.03258252, -0.09622495, 0.12494505, -0.02928186, 0.12002835, -0.1534576, -0.01619091, 0.03424224, 0.13413754, -0.02958547, 0.06926636, 0.01635612, 0.04095785, 0.010296, 0.00197415, 0.09132183, 0.05388586, -0.09623589, 0.13405299, 0.09094108, -0.09166401, -0.06718332, -0.0475782, -0.0073903, -0.02782297, -0.04918024, -0.09153914, -0.02933892, -0.14185783, -0.12603974, 0.12627149, 0.23379128, 0.0762573, 0.11509198, 0.1119738, -0.03334486, 0.14956051, -0.17248306, -0.04407349, -0.09998709, -0.12013067, -0.17310591, -0.02307913, 0.12889126, -0.01481523, -0.08285125, 0.04331553, 0.05079079, 0.0329731, 0.25788632, 0.09153011, 0.08102073, -0.16415507, 0.14843951, 0.06474738, 0.1360627, -0.08181168, -0.18541642, 0.1441945, 0.1329959, -0.08139568, 0.04567936, -0.02717791, -0.10730068, -0.21552096, -0.09304699, -0.27975485, -0.21394645, -0.05183838, 0.14562888, 0.21152635, -0.0828347, -0.22074844, 0.02477005, -0.08336065, 0.01033397, -0.09007299, -0.17637205, -0.1772377, -0.05019882, -0.10411737, -0.08792149, 0.19512525, 0.11445063, 0.00522814, 0.03092966, 0.04109679, 0.05382293, -0.03247872]
+call:[-1.04701392e-01, -6.70794174e-02, 4.89112502e-03, -1.47286300e-02, 2.04647966e-02, -1.97413385e-01, -3.58250663e-02, 1.59250021e-01, -1.05780900e-01, 1.55995816e-01, 5.03775179e-02, 8.49897489e-02, -9.04796049e-02, 2.17702419e-01, -2.23092780e-01, -5.64655662e-02, 6.14847466e-02, -3.92033309e-02, 7.84037113e-02, 9.65412706e-02, -3.16415839e-02, 6.42274767e-02, 2.68767532e-02, -2.76047647e-01, 7.42645115e-02, -1.03149582e-02, 5.46699017e-03, 4.80250157e-02, 1.09731639e-03, 1.77297935e-01, 7.34938905e-02, -2.02615678e-01, -4.62299883e-02, -1.33786008e-01, -8.89935810e-03, -1.12955518e-01, -8.67902562e-02, -1.19207859e-01, -1.41892117e-02, -1.07120745e-01, -5.56721240e-02, 1.47580907e-01, 2.27435231e-01, 8.31519589e-02, -1.50715411e-01, 2.31529847e-01, -1.11571252e-02, 2.63131887e-01, 6.14891164e-02, -1.42435431e-02, -2.70974010e-01, 5.35942391e-02, -1.48696870e-01, -3.24554816e-02, 4.26823422e-02, 3.30416746e-02, -8.73533264e-02, -2.07553096e-02, 7.73261711e-02, 1.87988579e-02, 1.71670690e-02, 3.21571231e-02, 8.45122114e-02, -2.24206865e-01, 2.67547332e-02, -2.14349806e-01, 1.82695374e-01, -1.00010969e-01, -8.99534896e-02, -1.20487973e-01, 7.94163868e-02, 3.91301289e-02, 1.59707248e-01, -5.97064719e-02, -1.63278416e-01, 9.43717882e-02, -9.63501409e-02, -1.49536476e-01, -3.67824845e-02, -1.04848124e-01, 1.14421330e-01, 2.97050446e-01, 9.69401076e-02, -6.76914304e-02, -2.94748805e-02, -1.53186977e-01, 9.19972137e-02, -5.97985834e-02, -2.77386606e-01, 3.22145596e-02, 4.07968536e-02, -1.31066158e-01, -2.48400986e-01, 3.02040756e-01, 1.45442486e-01, -5.20051904e-02, -9.17151477e-03, 1.16061055e-04, -1.23684011e-01, -1.22088194e-01]
+constant:[-0.08644564, 0.04720904, 0.3374407, -0.18976857, 0.0811578, -0.33932808, 0.4035224, -0.07799068, -0.04368839, 0.43955603, -0.22769684, 0.35501516, 0.20531619, -0.00515914, -0.22324213, 0.09688146, -0.05597144, -0.29780877, -0.1481954, 0.08998086, 0.28699994, -0.03343057, 0.36576456, 0.29125366, -0.07470614, 0.13325071, 0.05129022, 0.10100243, -0.23313886, -0.13193938, -0.2418513, -0.07044391, 0.04079618, -0.3372998, 0.09795056, 0.40038717, 0.05735227, -0.49383435, -0.35446408, -0.23330846, 0.06698798, -0.0407949, -0.00064809, 0.40583038, -0.19727792, 0.18831186, -0.37656286, 0.2940002, -0.22246473, -0.20054726, 0.24802186, 0.25552902, 0.12516917, 0.14362192, 0.18986972, -0.09164374, 0.00373898, 0.09180713, -0.19041973, 0.24212387, 0.12381089, 0.31448025, -0.21835794, -0.16620648, -0.18439929, -0.17649852, 0.06383282, -0.3840267, 0.16084366, -0.16367114, 0.27042413, 0.11560916, 0.02215447, 0.26064414, 0.04134811, -0.09941078, -0.09943497, -0.0342853, 0.01636235, -0.11231827, -0.04950193, 0.5263929, 0.42759675, 0.10256311, 0.10700524, 0.04988717, -0.09191196, 0.06891631, -0.09606853, -0.30359405, 0.00320533, 0.11609415, 0.10246228, 0.16086128, 0.41071257, 0.18106623, 0.22133847, 0.12628044, -0.33202705, 0.09903702]
+extractelement:[0.11015881, 0.1817078, -0.0108996, 0.0327295, -0.0338932, -0.15291688, 0.03729693, 0.02994337, 0.02760435, 0.2325014, 0.06247658, -0.11473273, -0.03262726, 0.21863921, -0.09958997, 0.19547632, 0.03035412, -0.05531217, -0.00231834, 0.14383015, 0.00248359, 0.07008117, 0.0485259, -0.12056551, -0.0664911, 0.02285596, 0.03037409, 0.00277384, -0.09285001, 0.08288768, 0.03289559, -0.16844527, -0.02132127, -0.14515994, -0.09100385, -0.0477846, -0.07270827, -0.12921655, -0.03342405, 0.02400822, 0.04773097, -0.10363717, 0.17770055, -0.04277344, -0.11009358, -0.04405073, -0.11866957, -0.03764169, -0.05859337, 0.04189719, -0.11980305, -0.0734432, -0.04584158, 0.14746214, 0.22073017, 0.22711752, -0.2523686, -0.10142963, 0.09167197, 0.23874976, 0.16649675, 0.01258223, 0.0985437, -0.22548202, 0.05445502, -0.04006629, 0.1540616, -0.05681247, -0.17387952, -0.15864551, -0.05983451, -0.12169134, 0.16300464, 0.19893873, -0.14403379, -0.11372939, 0.01181346, 0.03729149, 0.16335742, 0.09760231, -0.03500843, 0.14781824, 0.07057919, -0.05715268, -0.02241548, -0.16599551, 0.12072779, 0.1959893, 0.00652399, -0.0862033, 0.14193566, -0.15085481, -0.14382704, -0.03997584, 0.16362527, -0.09340642, 0.04757507, -0.08835962, -0.13892448, 0.02944472]
+extractvalue:[0.12543365, 0.17244136, -0.0085203, 0.0131818, 0.12192795, -0.03234904, -0.0318835, 0.06758608, -0.11469257, 0.08445198, 0.03277346, 0.17310363, 0.03665498, 0.19127783, 0.0546701, -0.02470871, 0.17831165, -0.04748409, 0.0170707, 0.16792035, 0.01747213, 0.06124788, -0.01036114, 0.21252973, -0.18293281, 0.02461197, 0.0584524, -0.1572164, -0.18066396, 0.05628143, 0.12265512, -0.07449167, -0.03768009, -0.22513647, 0.0433997, -0.08851199, -0.09708109, -0.08637014, 0.20144814, -0.03303384, 0.07125487, 0.22310762, 0.16541758, 0.02135657, -0.05870954, 0.06865649, -0.03434946, 0.1320928, 0.03848596, -0.06029726, -0.1514179, -0.11752907, -0.10805283, -0.00667613, -0.05696455, 0.23884058, 0.07880201, -0.00506071, 0.11066493, 0.19166665, -0.05263668, 0.04985057, -0.01267756, -0.06756993, 0.05341687, -0.02555228, 0.10682516, -0.12895356, -0.20898606, 0.00580245, 0.14753044, -0.10811523, 0.12658529, -0.14201358, -0.18486081, -0.03794788, -0.01547229, -0.06546687, 0.00367165, -0.08506455, 0.03959191, 0.12186965, -0.07355496, 0.00913287, 0.02975254, -0.10356234, -0.0088994, 0.25191072, -0.05293767, -0.05974568, 0.06370568, -0.09822353, -0.10034354, 0.0989753, -0.11060101, 0.03015978, -0.04115984, -0.10316055, -0.08556107, 0.05772397]
+fadd:[-3.25232595e-02, 5.97966239e-02, -2.50501605e-03, -2.41671860e-01, -1.52665913e-01, -1.24359682e-01, -8.03226829e-02, 1.29642203e-01, -1.59501564e-02, 1.40666664e-01, 8.39213580e-02, 4.61006351e-02, -9.25673097e-02, 1.98170781e-01, -1.09630287e-01, 4.72728461e-02, -6.46649897e-02, -2.74648517e-02, 2.02192622e-03, 1.81441516e-01, 1.00758284e-01, 6.08332902e-02, 8.94991308e-02, 2.63617411e-02, 1.40940383e-01, -4.16390822e-06, 1.08313389e-01, 2.59378236e-02, -1.33188190e-02, 1.23170756e-01, 7.33651593e-02, -1.85697570e-01, 1.11621693e-01, -1.12001859e-01, 3.31167787e-01, 2.48832069e-02, -4.89485338e-02, -1.66560456e-01, 2.34583430e-02, -5.56070581e-02, -9.01997834e-02, 1.03788309e-01, 2.46821225e-01, 1.28473260e-03, 1.50571883e-01, -1.87562052e-02, -6.71022683e-02, -1.91006325e-02, -1.74950168e-01, 9.15326923e-02, -9.61406156e-02, 1.26645520e-01, 7.83024654e-02, 2.19781641e-02, 1.57443378e-02, 2.66764034e-02, -1.28983065e-01, -6.55469820e-02, 8.46516714e-02, -4.30844575e-02, 2.67171681e-01, 6.13842383e-02, -1.07230216e-01, -8.59633535e-02, 1.72657594e-01, -3.23978215e-02, 3.25019495e-03, -8.00509006e-02, -1.33644626e-01, 9.82369576e-03, 1.31264478e-02, -8.20175856e-02, 9.46557242e-03, -6.53434452e-03, -4.88522872e-02, 1.28366530e-01, -1.38745621e-01, -1.28405333e-01, -2.83333976e-02, -5.56827076e-02, -1.03522474e-02, 5.20775020e-02, -9.03711002e-03, -1.90814480e-01, 2.99296528e-02, -1.22030959e-01, 9.06203166e-02, 1.90227166e-01, -8.11614543e-02, -1.64504915e-01, 5.31688742e-02, -1.14277504e-01, 6.30267933e-02, 1.96864188e-01, 1.05707690e-01, -4.49874587e-02, -5.31426445e-03, -2.54788101e-02, -1.61672890e-01, -4.85686846e-02]
+fcmp:[-0.07419012, 0.11684816, -0.03898409, -0.22943959, -0.1401029, -0.10245115, 0.07488028, 0.10676046, 0.10444923, 0.17854697, 0.06504504, 0.03869213, -0.08444435, 0.19932303, -0.16914082, -0.0881528, -0.12249286, 0.10173966, -0.03760519, 0.17254528, -0.01906643, 0.08693043, -0.04417108, -0.02678977, 0.24512264, -0.00213834, 0.10567795, 0.02001777, -0.07972224, 0.09328899, 0.05786212, -0.17564139, 0.0139377, 0.06468958, -0.09446138, -0.04214328, -0.04553512, -0.06388254, -0.00670787, -0.02420081, 0.06109492, 0.09476268, 0.20108542, 0.06812051, 0.14059882, 0.02038882, -0.00827774, 0.04590783, -0.0684548, -0.11071896, -0.09700356, 0.01976173, -0.04335584, -0.06076335, 0.01395286, 0.06785708, -0.02151516, -0.00742891, 0.00734934, 0.01795086, -0.05580859, 0.06759918, 0.02109922, -0.12775181, 0.15562968, -0.07587544, 0.10828868, -0.06900802, -0.21700971, 0.21987149, 0.04424175, -0.02283643, 0.03176983, -0.039738, 0.03648339, -0.0978855, -0.13666598, -0.03817528, 0.03170637, -0.03291135, -0.03295244, 0.02152793, 0.14705418, 0.16685458, -0.02645591, -0.15356724, 0.12431041, 0.1495376, -0.07357807, -0.14828467, 0.03658584, -0.10417088, -0.12795211, 0.11975849, 0.09669127, -0.0147695, 0.07744023, 0.02918604, -0.11017347, -0.00259428]
+fdiv:[-0.02851935, -0.02977753, 0.04797881, -0.16002922, -0.2739994, -0.05571995, 0.0347727, 0.07976963, 0.0122891, 0.07545689, 0.10755033, -0.07777403, -0.01965169, 0.16306162, 0.06462174, -0.06871983, 0.13782021, -0.01812159, 0.03680438, 0.17279354, -0.08469507, 0.06009267, 0.05078811, 0.05675481, 0.21506754, 0.07695015, 0.15413374, 0.06144127, -0.13497467, 0.08842142, -0.03839129, -0.20846984, 0.03480081, -0.08377707, 0.10487233, 0.07327569, -0.02101763, -0.13965248, 0.08109489, 0.1307609, -0.00660455, 0.10593361, 0.18417752, -0.02969596, -0.10129374, -0.00834186, -0.11685359, 0.24274711, -0.12930447, -0.06328312, -0.07138425, -0.14048494, -0.047382, 0.12680247, -0.06136982, 0.04713649, -0.24366245, -0.04119052, 0.0915467, -0.03433002, 0.23467347, -0.02806181, -0.08923019, -0.14692703, 0.11747012, -0.05399193, 0.01171021, -0.07405037, -0.09436411, -0.00142008, -0.11841816, -0.03983841, -0.10584622, 0.08862869, -0.15353557, -0.11465039, -0.04347554, -0.05438951, 0.0359162, 0.00674325, -0.00864024, 0.05938205, 0.11206808, 0.07246841, -0.01052807, -0.12588255, 0.08821127, 0.0906138, -0.07537003, -0.11216818, 0.08904202, -0.12487537, 0.04114659, 0.20806828, 0.14672591, -0.06176198, 0.03967106, 0.06796943, 0.02784103, -0.06661242]
+floatTy:[-0.03554066, -0.07219202, 0.03032841, 0.08395071, 0.16654263, 0.02469288, 0.10792953, -0.15616006, -0.13037354, -0.05308032, 0.24445558, -0.03207595, -0.08020614, 0.09474771, -0.2580746, 0.07353462, -0.03670619, -0.08898182, 0.07204551, -0.00443542, 0.20582072, -0.15966927, -0.00936408, 0.09222627, -0.10127913, 0.20440692, -0.05475397, -0.09951981, 0.04184861, 0.01689406, 0.03628857, 0.12894958, -0.01189231, -0.04669143, -0.02333387, -0.20174949, 0.08055072, 0.00758745, 0.15534282, 0.22473206, 0.1762469, 0.00782499, -0.15731563, -0.12556803, 0.00441859, 0.00623101, -0.01149804, -0.00973536, -0.00287221, 0.18064079, 0.1013004, 0.05668283, -0.09545495, -0.08564378, -0.18737721, 0.15224598, 0.02284791, -0.02866246, -0.03221876, -0.14118108, -0.02214616, -0.0591343, -0.19087502, -0.04007247, 0.02534897, 0.04076721, -0.20957634, 0.11054103, -0.03581158, -0.07319796, -0.1329344, -0.17861629, 0.00208901, -0.24149635, -0.01556128, -0.11251435, 0.05853895, 0.1283922, -0.08415353, -0.10733026, 0.05733407, -0.09854538, -0.03878151, -0.08442533, -0.08745051, 0.06319115, -0.01616211, -0.14556316, -0.06591965, 0.16206527, -0.00886989, 0.19155751, -0.05300944, -0.05398215, 0.05403015, -0.08226205, 0.14091259, 0.1119808, 0.0555094, -0.11667454]
+fmul:[-0.1185753, -0.13615306, 0.00484938, 0.04165395, -0.03317599, -0.13718367, 0.04906572, 0.00778528, 0.0764716, 0.16935678, 0.04816304, -0.0859753, -0.02958203, 0.21470581, 0.08905386, -0.11209283, 0.22241114, -0.03412962, 0.09455141, 0.1751519, 0.12894607, 0.03504061, 0.03827254, 0.13363554, -0.02161996, -0.03856876, 0.1392877, 0.00325197, -0.08855918, -0.00143537, 0.00789888, -0.21859562, 0.00343166, 0.06750929, -0.00813178, -0.06970946, -0.08563176, -0.11500722, 0.07916944, -0.00276161, 0.01209736, 0.18866448, 0.16641852, 0.01604792, 0.07490443, 0.15995884, -0.17711124, -0.05433702, -0.1643166, -0.1351143, -0.13869353, -0.12550355, -0.07411662, 0.10539798, 0.14160272, 0.14297834, -0.2371137, -0.05379802, -0.02138153, -0.00532857, 0.2032415, -0.05146542, 0.06547051, -0.11811713, 0.04982863, -0.09374387, -0.07902364, -0.06969839, -0.03203138, 0.04430814, 0.18096791, -0.00415012, -0.06312709, 0.12429202, -0.07620568, -0.11050078, -0.25231045, -0.13165767, 0.02669261, 0.00831437, -0.04078189, 0.12697074, 0.09287174, 0.10948132, 0.00567487, -0.18004748, 0.11385567, -0.01855352, -0.05886371, 0.00981937, 0.093337, -0.14039992, -0.02097351, 0.12466957, 0.16667524, -0.08684891, 0.03179542, 0.06828923, 0.01812844, -0.01773021]
+fneg:[-0.07967768, 0.0257382, -0.09740639, 0.06787898, -0.12553738, -0.1588254, 0.0404582, 0.05235421, -0.13278304, -0.03190799, 0.01627852, -0.01708365, -0.16922686, 0.24339387, 0.04991701, 0.00759817, 0.06988426, -0.03634616, 0.05133811, 0.19829163, 0.00449598, 0.00958101, 0.02064109, -0.01307286, -0.143177, -0.01431423, 0.06909844, -0.06664465, -0.23599209, 0.0659041, 0.1429004, -0.22357555, 0.0963949, 0.19576049, 0.09289518, 0.01604964, -0.08336593, -0.11384837, 0.20007004, 0.12722318, -0.01336442, 0.03537125, 0.17940804, -0.04175236, 0.09377784, -0.03606307, -0.14674656, 0.03877357, -0.0593932, 0.03363463, -0.08947524, -0.10942028, -0.11241627, 0.05974098, -0.07781969, 0.1762602, -0.31520557, -0.04519112, 0.12528142, 0.07177059, 0.14049791, 0.02143748, -0.06559046, -0.13712324, 0.26525593, -0.08017721, 0.01999342, -0.13411684, -0.17971659, -0.06095642, 0.10666642, 0.03721513, 0.01934452, 0.12616944, -0.1326853, 0.16727997, -0.01583993, -0.18841387, -0.14675601, -0.15292367, 0.13459764, 0.13021947, 0.07058944, -0.13849314, -0.05655656, -0.12005194, 0.20023838, -0.05602298, 0.11965046, -0.07377418, 0.10417405, -0.02669079, -0.15781054, -0.04316432, 0.15543202, -0.0684517, 0.03773818, 0.11693568, -0.1733359, -0.0564064]
+fpext:[-0.18426687, -0.15026188, 0.03890847, 0.03927221, -0.15648182, -0.16027395, 0.07988105, 0.1047267, 0.05574889, 0.2746149, 0.01715003, -0.07346141, -0.01752456, 0.2899341, -0.05475452, 0.00680553, 0.03047421, -0.03468033, 0.10530987, 0.22326142, -0.07591507, 0.080363, 0.07436662, -0.11116834, -0.07970588, -0.03727131, 0.1713403, 0.06791274, -0.08743562, 0.10569161, 0.03404247, -0.22793487, -0.05725041, -0.25389344, -0.05132939, -0.00793995, -0.04231216, -0.11769468, 0.13232592, -0.02173601, -0.03989946, -0.06245739, 0.23180124, -0.02189647, 0.14222233, -0.03469254, -0.06834032, 0.07855535, 0.00904491, -0.08018422, -0.04319506, -0.15872872, -0.04009562, 0.00186763, -0.04621039, 0.15363674, 0.00346706, -0.17390577, 0.01670262, 0.01854105, 0.18079011, -0.01880468, 0.0012762, -0.16248964, 0.17998855, -0.09201614, 0.03061481, -0.04298611, -0.26406047, 0.15737927, -0.03901811, 0.09908602, 0.19651212, -0.03613302, -0.1296272, 0.02149157, -0.2209785, 0.01423955, 0.09273185, -0.10507593, 0.13089411, 0.02410568, 0.09846523, 0.1331036, 0.01303839, 0.10926238, -0.02651915, -0.05778711, -0.16960011, 0.00833431, 0.04065713, -0.05367739, 0.03795866, 0.08211508, 0.12076677, -0.12073553, -0.00664333, 0.11101033, -0.15964875, -0.0666934]
+fptosi:[-0.0554697, 0.11791588, -0.0013198, 0.12632935, 0.00447158, -0.14492078, 0.03891406, 0.09680992, 0.08548377, 0.09063601, 0.09051156, 0.05034095, -0.09754931, 0.1269517, -0.03805733, 0.04344397, 0.03175728, -0.04808291, 0.10078087, 0.1149365, -0.03799108, 0.07591638, -0.05638763, -0.0359469, 0.19751169, 0.0053115, 0.11815924, 0.0793542, 0.07977456, 0.15707728, 0.03038415, -0.18727718, -0.1367524, 0.07888949, 0.26762837, -0.03323869, 0.0277237, -0.07629527, 0.00876829, -0.07013759, -0.08821512, -0.04512594, 0.153249, 0.12013132, -0.07932937, 0.18108295, -0.1225926, 0.18256319, -0.18706508, 0.16552396, -0.25803035, 0.17260392, 0.08509452, 0.10007568, 0.09217111, 0.06008356, -0.00172302, -0.04164677, 0.03119178, 0.0876347, -0.13216065, 0.03179015, 0.18608956, -0.23122469, 0.14319035, -0.08295162, -0.06081326, -0.08201712, -0.03556689, 0.10634129, 0.06310246, -0.08388993, -0.14447589, 0.05015244, -0.18503955, -0.11269514, -0.31860548, -0.03589016, -0.12194233, 0.01626188, -0.08501407, 0.22369611, 0.18216018, -0.02301488, -0.11480652, -0.18599588, 0.07168116, 0.04052822, -0.05108454, -0.18706018, 0.14226672, -0.11834884, 0.03589581, 0.08744145, 0.15074429, 0.0439859, -0.02189867, -0.00480578, 0.05460484, -0.0682525]
+fptoui:[0.01534599, 0.11102642, -0.06433313, 0.12988476, -0.1834939, -0.16949226, 0.01729213, 0.08380955, 0.11952619, -0.01518821, 0.07657523, -0.04023485, -0.07571229, 0.22758603, 0.08751385, 0.01347839, 0.02241973, 0.1481322, 0.04303844, 0.10267215, -0.08324239, 0.0142575, 0.00936347, -0.22054647, 0.25634748, -0.0381539, -0.05048601, -0.07610298, 0.1577609, 0.08765596, 0.02920991, -0.17836185, -0.15339334, 0.04885783, 0.08072589, -0.03573016, -0.18523148, -0.17444612, -0.09178676, 0.01785605, 0.07531517, 0.04415886, 0.22509561, 0.02334466, 0.06014464, 0.08462746, -0.10575932, 0.1549868, -0.25414446, -0.08759841, -0.24022678, -0.16427213, 0.10241618, -0.11295955, 0.12617837, -0.1453438, -0.21389423, -0.11913949, 0.09377643, -0.04626127, 0.09307901, 0.04208783, -0.01726591, -0.26377267, -0.02864962, -0.1088893, 0.07309006, -0.0451626, 0.01381598, -0.11376946, -0.0318372, -0.03117885, -0.00751992, 0.04759032, -0.17189564, -0.0671782, -0.04055243, 0.01991023, 0.16895834, 0.05444985, -0.15930498, 0.0692432, 0.08038696, -0.21758558, -0.058544, -0.13402379, 0.04276042, -0.05320217, 0.01905229, -0.07822247, -0.06815692, -0.08865747, 0.05312298, 0.16342764, 0.16332811, -0.08524821, 0.11748832, -0.00836508, 0.16828352, -0.06611577]
+fptrunc:[0.03908361, -0.29163882, -0.01192833, 0.05700167, -0.15311228, 0.00592163, 0.11606749, 0.10364928, 0.00504514, 0.06242209, 0.02461933, -0.10485581, -0.05805987, 0.11109967, -0.21236938, -0.02764414, 0.00115695, -0.05327054, -0.04722964, 0.22064194, 0.05563463, 0.09927423, 0.00172509, 0.05695758, 0.15492564, -0.00116055, 0.10587673, -0.08940331, -0.26303604, 0.11133532, 0.06438829, -0.24923158, 0.00585104, 0.01792561, -0.05203447, -0.01861908, -0.04413635, -0.09662925, -0.06113444, -0.01912897, -0.1339004, 0.11452908, 0.21368553, -0.06880628, 0.08122889, 0.15311414, -0.0491191, 0.15580809, -0.13225053, 0.05510123, -0.03497581, -0.13011466, -0.2066264, 0.04036298, 0.00753686, -0.2602519, 0.09403002, -0.02894866, 0.12125255, 0.0565765, 0.03297821, -0.0520851, -0.01591829, -0.252252, 0.1965733, -0.07920001, -0.0565741, -0.11322758, -0.19400476, -0.0226372, -0.20854528, 0.00065207, 0.01669456, 0.00958129, -0.08440962, -0.22263911, -0.00767746, 0.01174589, 0.08269951, -0.05927481, -0.05633973, 0.34439847, 0.01708565, -0.0765264, 0.12886453, -0.04893937, 0.09297176, -0.00561692, 0.06084311, -0.04330954, 0.0815511, -0.17323127, -0.08324848, 0.14596382, 0.11188202, -0.1324599, -0.02025824, 0.14508359, -0.2174703, -0.03305363]
+freeze:[-0.03251171, 0.00200092, -0.00259526, -0.01144693, 0.07541022, -0.1820837, 0.12136643, 0.1275448, -0.10030386, 0.08644852, 0.11850318, -0.11065793, -0.07471482, -0.01706886, 0.09554464, 0.14733784, 0.10404979, -0.02832513, -0.13587056, 0.20593883, -0.00259992, 0.13303153, -0.09656724, -0.16390903, 0.14290923, -0.01338019, -0.11247908, 0.09822869, -0.09266857, 0.14600083, 0.05307323, -0.06290563, -0.03556649, -0.00089339, -0.0603128, -0.14519496, -0.04811841, 0.0243117, 0.14283736, -0.09143746, 0.14046432, 0.03761658, 0.270574, 0.09178411, 0.18168195, 0.03010811, 0.0491721, 0.12065563, -0.05847578, 0.14248377, -0.19588259, -0.1006986, -0.09188465, 0.02975856, -0.128777, -0.01447822, 0.28755158, -0.10445415, 0.03533902, 0.0133198, 0.17674685, 0.04009562, -0.06872095, -0.04660055, -0.18056145, 0.02824324, -0.03542567, -0.05443713, -0.2357103, -0.02251058, -0.08036178, -0.11523858, 0.02935672, -0.06835491, 0.04550186, 0.11108991, -0.00739168, -0.19805464, -0.00315341, -0.13912842, 0.13789308, 0.37640804, -0.08988409, 0.1139189, -0.16979344, -0.19737336, 0.10531333, 0.06503565, -0.0589365, -0.09045003, 0.03648575, -0.13460322, -0.06677186, 0.35769236, 0.12746431, -0.02420334, 0.0050938, 0.03342573, -0.09689596, -0.0226867]
+fsub:[1.43653125e-01, -1.32412300e-03, -2.78409017e-04, 3.85341011e-02, -7.74858668e-02, -2.86142975e-01, 2.65613496e-02, 4.87666428e-02, 1.96019560e-02, 8.04715976e-02, 5.02928011e-02, -2.45421771e-02, -2.72418857e-02, 1.48695216e-01, 7.34043792e-02, -1.14439778e-01, 1.73707098e-01, -2.42753271e-02, 5.16186655e-02, 1.55931130e-01, 1.39758410e-03, 3.22200656e-02, 1.47411730e-02, -8.05310160e-02, 1.25812709e-01, 9.25191790e-02, 1.01895370e-01, -3.19709070e-02, 9.84350592e-02, 9.15013626e-02, 1.97458472e-02, -2.15762556e-01, 4.14769538e-02, 9.13535580e-02, -6.18570857e-02, -1.36080399e-01, -9.37981233e-02, -3.23160216e-02, -1.91936027e-02, -5.41068427e-02, -8.75522662e-03, 1.37950674e-01, 1.92662671e-01, -2.14268696e-02, 3.69801782e-02, 1.98664218e-02, -1.52097628e-01, 1.65109828e-01, -1.51487887e-01, -2.57162377e-02, -1.80553540e-03, -4.98860478e-02, -7.46885687e-02, 1.18120104e-01, -3.23340250e-03, 1.65429220e-01, -1.59004137e-01, 2.62180399e-02, 3.60113941e-02, 8.32907185e-02, 1.85581386e-01, 2.19932068e-02, -1.61428750e-01, -1.06943697e-01, 1.90668121e-01, -1.47477672e-01, 1.93990812e-01, -1.04250342e-01, -1.74714252e-01, -2.20855102e-02, -7.85333589e-02, -5.84845208e-02, -1.56639423e-02, -2.07822010e-01, -4.88376580e-02, 9.55688953e-02, -9.25077945e-02, 2.45069694e-02, 6.11928031e-02, 4.78151478e-02, 1.24568343e-01, 8.31008181e-02, 9.43040401e-02, -5.49194887e-02, -2.14593876e-02, -1.22968636e-01, 1.65695976e-02, 3.39214057e-02, -1.87710542e-02, -1.11297153e-01, 1.18105434e-01, -1.11936070e-01, 1.29384607e-01, 3.65060598e-01, -8.66429787e-03, -5.79670519e-02, 4.63246480e-02, 5.36915325e-02, -1.44565403e-01, -7.03546405e-02]
+function:[0.08432946, -0.13718535, 0.1798166, -0.1317964, 0.13148142, -0.11775618, 0.1532426, 0.18923613, 0.04347765, 0.13219926, -0.11602738, 0.23845321, 0.02091871, -0.03063676, -0.16969669, 0.11777938, 0.19847079, 0.01223313, -0.07809777, -0.08243314, 0.15152037, 0.05477112, -0.07050785, -0.05643432, 0.04624449, -0.11095016, -0.07817923, 0.08268431, -0.02165354, 0.05313284, -0.12874702, -0.03404368, 0.01434378, -0.04114128, 0.0605352, 0.0066458, -0.09188776, 0.03761177, -0.07798971, -0.08548588, -0.14254396, -0.00512754, -0.01704746, -0.07529174, -0.13692239, 0.14159389, 0.15625082, 0.20394756, -0.0534406, 0.03429073, -0.02854794, 0.19133213, -0.02054479, -0.14938825, 0.11266603, -0.24727456, -0.00051534, -0.01815787, -0.0888954, 0.1394308, 0.00088329, -0.09114514, 0.09761741, -0.0581107, 0.19087307, -0.17679083, 0.04638965, 0.07256806, 0.05799894, -0.07198817, 0.1536461, 0.18315509, 0.10839155, -0.15990162, -0.11709656, 0.05125028, -0.00596116, -0.00216505, -0.03288814, -0.3046133, -0.0321634, 0.24676047, 0.28927127, 0.05216954, 0.10431253, 0.02697779, -0.06505916, 0.0316359, 0.01370945, 0.12880163, -0.07995255, 0.04474904, -0.0030496, 0.08067484, 0.0821052, 0.09749625, -0.13063934, -0.08858643, -0.11060869, 0.00953265]
+getelementptr:[-1.06063023e-01, -3.73198390e-02, -4.35395092e-02, 2.23260254e-01, -6.56511635e-02, -1.12049676e-01, 2.09393892e-02, 1.08264036e-01, -3.80514655e-03, -4.82548214e-02, 4.80085798e-02, 4.37810719e-02, 5.59795983e-02, 1.87313676e-01, 1.69590369e-01, 5.86156063e-02, -1.63686767e-01, 9.93320812e-03, -3.54090147e-02, 1.85476243e-01, -7.30280653e-02, 8.45279768e-02, -1.85825787e-02, -4.68590409e-02, -3.82779650e-02, -2.77343031e-04, 1.07430711e-01, 1.32057229e-02, -9.22889262e-02, 1.20579638e-01, 5.57196438e-02, -1.71571791e-01, -4.00907397e-02, -6.10451177e-02, 1.77448660e-01, -1.19765736e-01, -4.47260737e-02, -1.21931084e-01, -1.10676425e-04, -9.90907848e-02, -8.42135549e-02, 1.23196997e-01, 2.26401359e-01, 7.57011846e-02, 6.35488937e-03, 1.76852107e-01, -5.39443344e-02, 5.57306334e-02, -1.00927455e-02, 8.12712982e-02, -1.61576957e-01, 1.19383097e-01, -2.54868358e-01, 8.95112082e-02, 1.16598725e-01, -8.07882994e-02, -3.55551615e-02, -6.64514080e-02, 6.55135065e-02, -4.63855825e-02, 1.01226091e-01, 8.05892572e-02, -8.05058926e-02, -1.58557713e-01, 3.48293222e-02, 9.56726372e-02, -8.94681644e-03, -7.94050619e-02, -2.45119065e-01, -2.18818024e-01, 5.90824187e-02, 6.73788413e-02, -6.61129355e-02, -6.89433515e-02, -1.37265250e-01, 5.55576272e-02, -1.61160603e-01, -1.30748779e-01, 1.03025667e-01, -7.80676752e-02, -1.22718692e-01, 1.77025512e-01, 5.24887145e-02, -6.01164363e-02, 3.06629483e-02, -1.69721559e-01, 8.81848484e-02, 1.90549016e-01, -4.78637516e-02, -3.66856195e-02, -3.49488966e-02, -1.18229009e-01, -7.41251931e-02, 2.66166240e-01, 1.05340198e-01, 1.62121616e-02, 1.24955140e-02, -4.24992926e-02, -9.22343284e-02, -2.28578113e-02]
+icmp:[-0.06381294, 0.17676495, 0.03431569, 0.20172207, 0.01039904, -0.07059901, 0.02721906, 0.04343188, -0.05227307, 0.3820558, 0.04348163, 0.04519399, -0.09151839, 0.14891335, 0.07235284, -0.21488905, -0.15366304, -0.04785908, 0.01448306, 0.15884778, -0.03996848, 0.06258953, 0.0198002, -0.01623865, 0.12808238, 0.00181316, 0.11205131, 0.01188926, -0.1492972, 0.15078227, 0.07120264, -0.10641106, -0.04608565, -0.10990186, -0.03944146, -0.01226474, -0.14484644, -0.06961066, 0.10706522, -0.10274337, -0.06439282, 0.1032786, 0.14661732, 0.07571676, 0.20919369, -0.07374114, -0.00736302, 0.07144766, 0.0203959, 0.00857562, -0.13852982, 0.01643888, 0.00455366, -0.02292045, 0.01382956, 0.00304465, -0.03656371, -0.09607888, 0.0485608, -0.03699828, 0.09713589, 0.06836824, 0.06869507, -0.16546951, -0.01076122, -0.20761381, 0.21833621, -0.07615891, -0.08275858, -0.23349804, -0.05592128, -0.06199257, -0.0009406, 0.04526978, -0.17834783, -0.03665482, 0.04198478, -0.13261084, -0.20342422, -0.03949397, 0.12425423, 0.17155804, 0.14695781, -0.00783983, 0.06012346, -0.08558455, -0.03083419, 0.19244738, -0.04821138, -0.0541654, 0.0336761, -0.09066571, -0.22810067, 0.2664105, 0.10780556, -0.09649264, -0.00929247, -0.00973827, -0.03242486, -0.02767201]
+insertelement:[-0.02431526, -0.02821, -0.01474751, -0.17383182, -0.04851017, -0.2700136, 0.08769315, 0.05476001, 0.02850896, 0.11856344, 0.06085393, 0.10512923, -0.05208284, 0.25029323, 0.05559354, -0.0580108, 0.23263837, -0.02934784, -0.0694061, 0.1963453, 0.00657156, 0.04153831, -0.08736489, -0.12128452, 0.12344394, 0.10098697, 0.15986909, -0.06027528, -0.04436634, 0.1878123, 0.02212722, -0.1504686, -0.12829633, 0.1546098, -0.03594831, 0.06790844, 0.00327528, -0.05437412, -0.01389498, 0.00368347, 0.00607913, 0.07390202, 0.19065033, 0.02645727, 0.02672505, -0.02598314, -0.08120181, -0.0265095, -0.06253106, 0.1939478, -0.04663992, -0.21352085, -0.08769952, 0.13863963, -0.11080265, 0.25416508, -0.0131342, 0.00183094, 0.02272455, 0.02956321, 0.20915665, -0.05938819, -0.10566232, -0.0629337, 0.11202663, -0.03480664, 0.18482532, -0.02690433, -0.12158963, 0.03663435, -0.03684264, -0.02014683, -0.06030929, 0.12397692, -0.11643027, 0.0042477, -0.04494726, 0.05814534, -0.134404, 0.00339086, -0.00920388, 0.13428815, -0.04384674, -0.0559525, 0.08342902, -0.1993053, 0.13596928, 0.17117605, -0.03624995, -0.08287863, 0.10867614, -0.15158707, -0.15137242, 0.28727648, 0.14804833, -0.07017738, 0.04017374, -0.08594246, -0.030195, 0.04387292]
+insertvalue:[0.07368766, -0.00283476, -0.01816029, -0.11995207, -0.21627477, -0.01762845, -0.09710025, -0.02184452, -0.20390469, 0.04978354, 0.02931972, -0.14109294, -0.06739342, 0.23479871, 0.08888885, -0.05747516, -0.0989153, -0.02506555, 0.12050808, 0.04612122, 0.03092545, -0.06623711, -0.01588413, -0.1149561, 0.08029485, -0.0460401, -0.00333219, 0.18208396, -0.05332236, 0.03006606, 0.09879952, -0.04365422, -0.08676033, -0.22901876, 0.0205539, 0.04544334, -0.10519175, -0.1354922, 0.12296194, -0.03680303, 0.04336058, 0.02475899, 0.16830578, -0.05031221, -0.04950489, 0.03949175, -0.12919392, -0.1605957, 0.13743988, -0.09456762, -0.09413066, -0.12290588, -0.1466488, 0.14567874, 0.30013502, 0.05705202, 0.04200117, 0.0429358, 0.02423933, -0.0431275, 0.16857034, -0.01996093, 0.04447777, -0.05015944, 0.17100777, -0.00709437, -0.15477978, -0.13746703, -0.01251285, -0.10154182, 0.07498093, -0.0593773, 0.2556743, 0.00541996, -0.03270694, -0.06651331, -0.08112945, 0.0176359, 0.07080435, 0.00481467, 0.04019531, -0.02826775, 0.17624968, -0.01392782, -0.02132884, -0.16857536, 0.08259024, -0.05456975, -0.00464022, -0.20664166, 0.02688083, -0.14457764, -0.08772081, 0.20396093, 0.03472181, 0.13362682, 0.08030541, -0.15711668, -0.24761479, -0.1486473]
+integerTy:[-0.10629843, -0.00597095, -0.12177496, 0.1545618, 0.14840475, 0.06774051, -0.12312454, -0.12284395, 0.02727928, 0.0359809, 0.19541341, -0.01525921, 0.18040752, 0.02355622, -0.06778756, 0.01603565, -0.0863459, -0.09968174, -0.01177541, -0.00609532, 0.11691112, -0.09820568, -0.07312083, -0.19818097, 0.11165791, 0.10403782, -0.22467583, 0.03056726, 0.07944582, -0.10823306, 0.06485552, -0.02894754, -0.02030974, -0.0019227, -0.03297564, -0.10668563, 0.00631827, 0.12775739, 0.02394694, 0.0293906, 0.21928571, -0.11737766, -0.0596211, 0.12431481, -0.14021948, -0.05282145, 0.17827511, -0.04721097, 0.13661501, 0.13597642, 0.01365755, 0.07686953, 0.0735675, -0.12689653, -0.18581943, 0.10276816, 0.04013465, -0.00806608, 0.07205179, -0.01148596, -0.11219286, -0.01606004, -0.05517735, 0.02957282, -0.29044998, 0.1299732, 0.00213369, 0.08809072, -0.02110472, 0.03379825, -0.01002172, -0.13881044, 0.01505973, 0.0976615, 0.17016318, -0.13266183, 0.06827291, 0.17080092, -0.04742929, -0.02185343, 0.0362877, -0.12015845, -0.03688737, -0.08537249, 0.05818703, 0.06007848, -0.03808945, 0.01828563, -0.10889288, 0.26494345, 0.01937892, 0.03399719, -0.03819984, -0.04401752, 0.02702594, 0.03797123, -0.03524927, 0.06443124, 0.21449444, -0.12850355]
+inttoptr:[-0.01377591, 0.11043059, -0.12844634, 0.04353043, -0.09467062, -0.14404644, -0.01046757, 0.12228243, -0.18531837, 0.08554913, -0.00769823, -0.14514306, -0.02804073, 0.00957848, 0.15271579, 0.07906365, -0.00299774, -0.02052507, 0.070458, 0.07646779, -0.15715204, 0.10599221, 0.06006987, -0.10529212, 0.13816859, -0.03392814, 0.05659771, -0.03801761, 0.16695325, 0.10533743, -0.04591336, -0.04449729, -0.165113, -0.17164642, 0.0058237, -0.19227007, 0.07325864, -0.17449997, 0.0790717, -0.15608312, 0.03779037, 0.0389495, 0.23571262, 0.12078992, -0.0966442, -0.05015961, -0.07673406, 0.16770934, -0.06837253, -0.07309788, -0.02819289, -0.12167789, -0.07492067, 0.03690268, 0.16422145, -0.07981167, 0.06598003, -0.17091176, 0.08058067, -0.03974774, 0.20942432, 0.02230899, 0.15619184, -0.04446582, 0.00584774, -0.0412904, 0.24438885, -0.12220972, 0.02975016, -0.02025965, 0.21291876, -0.06597722, -0.14096822, -0.0567697, -0.2023169, 0.18390949, 0.07024521, 0.09573201, -0.04381654, -0.0026591, 0.07957175, 0.03931009, -0.07002385, 0.0650707, 0.04962049, -0.05005969, 0.00140608, 0.12766571, -0.07744935, -0.0404495, -0.12856758, -0.10054623, -0.12929992, 0.07929495, 0.11946376, -0.0527789, 0.02238193, -0.04582688, 0.06286612, 0.11933255]
+invoke:[-4.79477495e-02, -4.37538512e-02, 2.14098502e-04, -4.48970944e-02, 3.93624008e-02, -3.53455395e-02, -3.93055342e-02, 8.94530714e-02, -4.76442911e-02, 1.95293367e-01, 2.90794615e-02, 1.16118886e-01, 7.63157429e-03, 1.09598488e-01, 1.80335090e-01, -7.19198957e-02, -1.18466035e-01, -1.26239937e-02, 8.44175518e-02, 2.56773353e-01, -1.10275019e-02, -3.79480273e-02, -5.22314198e-03, 1.89141721e-01, 2.22434700e-02, 2.36968929e-03, 1.05277963e-01, -1.42625034e-01, -2.14529112e-02, 7.15086460e-02, 1.02414824e-01, -1.61834821e-01, -9.12191644e-02, -1.29776180e-01, -8.13744683e-03, -6.20572530e-02, -6.64934888e-02, -6.74760565e-02, 5.00219800e-02, -1.72701478e-01, -6.64113984e-02, 2.20640570e-01, 1.41921878e-01, -1.23179682e-01, -1.33829715e-03, 4.74685021e-02, -5.11074737e-02, 1.04639478e-01, -7.91229308e-02, 7.83334449e-02, -9.03665498e-02, 2.01174840e-01, -1.10384256e-01, -1.36460945e-01, 5.60139418e-02, -2.03792192e-02, -1.24865063e-01, 1.18873730e-01, 6.16551116e-02, -6.33603660e-03, 1.76620677e-01, 6.10028878e-02, -5.66619821e-02, -2.39012301e-01, 1.24191947e-01, 1.17043518e-02, 1.33204579e-01, -1.27141446e-01, -1.51802033e-01, -1.24671578e-01, 1.82786155e-02, -2.41206009e-02, 1.76642433e-01, -9.23082158e-02, -8.42260718e-02, -1.35295659e-01, -4.52754535e-02, -6.49391115e-02, 2.67771166e-03, -2.10763380e-01, 1.03556879e-01, 2.02133834e-01, 1.33662194e-01, 3.59767093e-03, -4.68906909e-02, -7.64989257e-02, 6.52824938e-02, -1.44288331e-01, -1.43271446e-01, -2.54415404e-02, -3.18020880e-02, -1.12537131e-01, -2.95660812e-02, 1.84705362e-01, 1.44985750e-01, -1.96307544e-02, -3.30789275e-02, 9.76456702e-02, 6.22483827e-02, -1.04234315e-01]
+label:[-1.70278847e-01, -6.33158609e-02, 1.24444053e-01, -2.18309432e-01, 5.44853173e-02, -3.97669286e-01, 6.85409158e-02, -1.19578831e-01, 7.21278563e-02, 4.26745564e-01, -1.02086589e-01, 1.75334319e-01, -6.91433176e-02, -8.58651251e-02, 2.81250719e-02, 1.50861368e-01, -4.02623601e-02, -1.47487119e-01, -1.20059647e-01, 3.13228071e-01, -6.68118075e-02, -9.21474118e-03, 2.11344790e-02, 1.81965947e-01, -8.79407823e-02, -5.65940142e-02, 8.48237239e-03, -1.70364410e-01, -1.11142345e-01, -2.10978240e-02, -8.14931765e-02, 1.01985738e-01, -1.64452754e-02, -5.21999374e-02, 1.38780072e-01, 1.68702289e-01, 6.57888204e-02, -5.25406040e-02, -2.19774336e-01, -2.08418921e-01, -1.27118319e-01, -1.95882116e-02, 3.43626179e-02, -1.85499974e-02, -5.96486665e-02, -3.09314132e-02, -6.75856620e-02, 1.52055249e-01, -1.99610636e-01, -1.83554426e-01, 1.17220864e-01, 2.84789782e-02, 3.30042019e-02, 2.81458229e-01, 1.77426532e-01, -1.40411645e-01, -1.71568587e-01, 2.13158056e-02, -5.03321812e-02, 3.07152927e-01, 1.57800421e-01, 2.82562282e-02, -3.50744165e-02, -1.39990926e-01, 1.19268596e-01, -1.61711872e-01, -1.28153533e-01, -6.35592565e-02, 4.43754531e-02, -1.07930057e-01, 2.02961117e-01, 3.86973447e-03, -2.29454637e-02, 2.38456234e-01, 2.96319332e-02, -1.66371241e-01, -5.22215664e-02, -3.24533470e-02, -2.75302101e-02, 2.17241734e-01, -3.86376661e-04, 1.69234484e-01, 7.67232180e-02, 2.38987938e-01, -4.74099703e-02, 1.06001139e-01, -1.68087721e-01, -1.53467521e-01, -5.14220679e-03, -3.37484926e-01, 1.43990397e-01, 1.47677278e-02, 2.19082430e-01, 2.37994827e-02, 9.57245380e-02, 1.44380063e-01, 3.73819843e-02, 1.96425766e-01, -3.29046510e-02, 8.88913274e-02]
+landingpad:[1.03113145e-01, 9.92903709e-02, 7.30866194e-02, -1.75897896e-01, -8.10509026e-02, 2.28176415e-02, 3.82100306e-02, -9.86565091e-03, -1.56279594e-01, 2.01696455e-01, 1.76040102e-02, 1.45413533e-01, -7.88529888e-02, 9.69541073e-02, 4.20627482e-02, -7.90351927e-02, -4.97990027e-02, -7.52556697e-02, 1.18502200e-01, 2.28400379e-01, -8.72700568e-03, 4.26628999e-02, -4.23901454e-02, 7.60810077e-02, -4.67239916e-02, -1.15774823e-02, 1.81137115e-01, -6.14955500e-02, -3.24456543e-02, 1.71597108e-01, 7.02524185e-02, -5.27166240e-02, -1.83869183e-01, -1.23276018e-01, -2.13556290e-01, 6.64191768e-02, -2.13614121e-01, -6.04937747e-02, 2.09989864e-02, -1.82051703e-01, 1.12142891e-01, 8.80258083e-02, 9.86292213e-02, 1.35060728e-01, 1.27289683e-01, -9.20894593e-02, -2.69087479e-02, -3.60022224e-02, 1.51578128e-01, 5.02313375e-02, 5.27352206e-02, 1.23943724e-01, -2.80857307e-06, -1.13758855e-01, 3.94643582e-02, 8.59412178e-02, 1.37303501e-01, 3.32194865e-01, 3.29371658e-03, 1.59598719e-02, -6.89905556e-03, 7.70471245e-02, 6.43394738e-02, -1.84268802e-01, 8.37943703e-02, -1.04791783e-01, 8.62041414e-02, -7.47103170e-02, -6.71094358e-02, -8.64955410e-02, 6.29674569e-02, -1.63089916e-01, 1.01876799e-02, -7.62798786e-02, -1.38638705e-01, 6.63735867e-02, 2.06998393e-01, -2.36072764e-01, -4.41362709e-02, 1.74887478e-03, -7.31557757e-02, 1.43993706e-01, 1.84361383e-01, -1.88085318e-01, 7.56450966e-02, -3.31846662e-02, 6.64059296e-02, -1.07206956e-01, -2.43195742e-01, -7.10479915e-02, -2.36829296e-01, -6.18142672e-02, -1.79122090e-01, 1.04567848e-01, 1.18763432e-01, -9.03276280e-02, -7.98200723e-03, -9.93477255e-02, 1.04339510e-01, -1.28647834e-01]
+load:[-8.08405653e-02, 3.21540207e-01, -4.41686623e-02, -1.38807818e-01, -1.36429612e-02, -8.61457735e-02, 6.45549223e-02, 3.65951918e-02, -9.66648012e-02, -6.22380450e-02, 5.16491756e-02, 4.55973707e-02, -9.19684246e-02, 1.86596215e-01, 1.24360658e-01, 1.10692337e-01, 5.80766462e-02, -4.19665016e-02, 1.19262181e-01, 1.91956967e-01, -1.09953679e-01, -3.33718173e-02, 4.26402315e-02, -1.01771131e-01, 1.40093312e-01, -1.88881182e-04, 1.38682956e-02, 1.53894704e-02, 1.63484756e-02, 1.45328984e-01, 7.50646293e-02, -6.25177696e-02, 5.94270937e-02, -1.11528225e-01, 1.41719311e-01, -3.56543139e-02, -4.60029729e-02, -7.06327930e-02, -6.36029169e-02, -7.85711631e-02, -7.72892162e-02, 5.27529009e-02, 2.26394936e-01, 2.57920306e-02, -3.16273458e-02, 1.89298347e-01, -2.18151715e-02, 1.10672116e-01, -7.69285765e-03, 7.50245377e-02, -8.78641233e-02, 6.61391392e-02, 3.76431160e-02, 6.12791106e-02, -3.90478261e-02, -7.74604501e-03, -9.73058939e-02, -9.57482904e-02, 6.36115000e-02, 1.73895638e-02, 8.30394253e-02, 3.37328650e-02, -1.90865807e-02, -1.61292270e-01, 1.64209291e-01, -1.99395478e-01, -5.18193915e-02, -7.73451254e-02, -1.83285370e-01, -1.91420510e-01, 8.99169371e-02, -1.24672418e-02, 2.15710238e-01, -3.50636914e-02, -2.88546402e-02, 4.91228588e-02, -1.47718966e-01, -1.31714255e-01, -8.54195580e-02, -7.65539752e-03, -1.14223316e-01, 1.62718430e-01, 1.02798954e-01, 1.50881439e-01, 2.90946644e-02, -1.13107860e-01, 3.88892367e-02, 3.23341131e-01, 5.45694344e-02, -1.06797464e-01, 2.85433093e-03, -1.44431114e-01, -5.13872616e-02, 2.37454563e-01, 1.10516891e-01, 1.83880609e-02, 1.52829103e-03, 3.45684886e-02, 4.21399949e-03, -2.06756424e-02]
+lshr:[-0.17024136, 0.10411678, -0.01164339, -0.04548335, 0.06530891, -0.2476887, 0.04210737, 0.03576789, 0.05321054, 0.10022357, 0.01811663, -0.13488461, -0.01012874, 0.26806793, 0.12345009, 0.02101261, -0.36041, 0.00430008, 0.06184491, 0.04118454, -0.02647545, 0.06767637, 0.01817472, 0.04315426, -0.1396919, -0.07239037, 0.00338489, -0.04044889, -0.15009062, 0.19606966, 0.03030269, -0.10555451, -0.12165167, -0.23948427, -0.13581164, -0.03006317, -0.08285325, -0.10617706, -0.0251316, -0.20707203, -0.03274789, 0.17637314, 0.30769143, -0.01968428, 0.09311135, 0.02482017, -0.10504574, -0.080327, 0.05108082, -0.01413484, -0.12056525, -0.13353467, 0.0683218, 0.05876585, -0.09094415, -0.1748214, 0.02682031, -0.01165269, 0.03736719, -0.0213234, 0.01267042, 0.07795929, 0.12224922, -0.06505424, -0.07419367, -0.08209741, 0.05395749, -0.01820676, -0.1347826, 0.0721442, 0.09135621, 0.03716783, 0.08097795, 0.08469485, -0.03400942, -0.10221346, -0.03802686, 0.10227831, -0.01060096, -0.07785649, 0.09980448, 0.09005487, 0.01325962, 0.01302627, -0.02368998, -0.11400393, 0.0525293, 0.14680986, -0.12547235, 0.02981818, 0.13511257, -0.09932868, 0.02514753, 0.18365589, 0.13210618, -0.0734877, 0.06043402, 0.09709161, 0.11041317, -0.0586015]
+mul:[-0.11237971, 0.09876346, 0.02213491, 0.11142606, -0.01174554, -0.16785102, 0.02978942, 0.05660425, 0.07075646, 0.2599436, 0.06130151, -0.09510598, -0.00583686, -0.0388632, 0.30894345, -0.09855073, 0.09255391, -0.0444544, -0.1248768, 0.15977794, 0.1115512, 0.03567113, 0.10514766, -0.05674868, -0.04637711, 0.01645471, 0.04411943, 0.06863309, 0.09456915, 0.08464792, 0.06866521, -0.0745531, -0.19630428, -0.08132032, 0.1939253, 0.01699383, -0.0897494, -0.12735982, -0.09194063, -0.10075612, -0.00765091, 0.14485908, 0.26726627, -0.07071482, -0.07459436, 0.01122808, -0.07534542, 0.06342559, -0.01228105, 0.18302599, -0.15118791, -0.09792738, -0.09028663, 0.09337652, -0.03390493, 0.11660402, 0.00530379, 0.03476534, 0.1440348, 0.02737059, 0.00474342, 0.01751024, 0.05410315, -0.1316264, -0.1157103, -0.13902988, 0.26180732, -0.11643749, -0.13360056, 0.00479044, 0.16341007, -0.07186162, -0.09074775, 0.08933206, -0.05835011, -0.02483859, -0.2136433, 0.02075386, 0.05302465, 0.03297775, -0.18019801, 0.3633132, -0.11566965, 0.05641138, -0.0513707, -0.13744444, 0.01660597, 0.20761298, -0.06349137, 0.06110584, 0.10134917, -0.25336102, 0.02036187, 0.18552497, 0.15949447, -0.08701061, 0.03962825, -0.11503438, 0.13071242, -0.06818113]
+or:[-9.66177657e-02, 2.73407191e-01, 2.23864059e-04, 2.21475124e-01, 4.85003875e-05, -1.21752143e-01, 4.06023823e-02, 1.31916046e-01, -1.30323472e-03, 3.19763809e-01, 9.23378617e-02, -4.98630889e-02, -6.11980185e-02, 2.02523589e-01, 1.36792380e-02, -1.34879962e-01, -1.00449808e-01, -1.82202570e-02, 7.11992010e-02, 1.37599483e-01, -4.95731533e-02, 1.15927979e-01, 3.43097560e-02, 8.73788670e-02, -1.03718899e-02, -7.54302251e-04, 9.91427973e-02, 5.75670004e-02, 2.77765971e-02, 1.28866941e-01, 6.80045113e-02, -1.74135745e-01, -4.34492528e-02, -4.51992936e-02, -5.44166118e-02, -1.11696772e-01, -5.18105961e-02, -7.39658251e-02, -5.64278029e-02, -1.20261356e-01, -1.17269024e-01, 1.74760714e-01, 2.49259204e-01, 9.36944038e-03, -1.36214495e-01, -1.44637778e-01, -4.15022671e-02, 5.31984307e-02, -1.79767981e-01, -7.36928359e-02, -9.24887359e-02, -1.71222940e-01, -1.82373285e-01, -9.29906964e-03, 1.49193369e-02, 7.58160204e-02, 2.72949874e-01, 8.26728195e-02, -9.04894620e-02, 1.86199173e-02, 1.07824698e-01, 8.06925595e-02, 5.78055568e-02, -1.40640184e-01, 2.23236736e-02, 3.62232737e-02, 1.33105025e-01, -8.56523365e-02, -1.93667024e-01, -2.09574699e-01, -7.98006132e-02, -5.55140786e-02, 3.89415137e-02, -1.53407948e-02, 1.76626369e-02, -1.60120890e-01, -2.01325700e-01, -6.93651214e-02, 2.11447969e-01, -7.97722116e-02, 5.25307208e-02, 1.58972085e-01, 8.88074338e-02, -8.32337886e-02, 2.15425249e-02, -1.94346011e-01, 7.49894232e-02, 2.53302604e-01, 5.90096228e-02, -1.01898521e-01, 6.36430010e-02, -1.37841716e-01, -5.60350940e-02, 3.39098088e-02, 1.11781985e-01, 8.19382295e-02, -1.64115953e-03, -5.64004667e-02, -1.19225003e-01, -3.21681350e-02]
+phi:[0.04839491, -0.20099284, 0.01979376, -0.01842108, 0.36310238, -0.07578178, 0.20427679, 0.22432512, -0.3303758, 0.20915964, 0.07410439, 0.20407872, -0.05170761, 0.31521922, 0.14302452, 0.01577972, 0.22127253, 0.0049014, 0.11990388, -0.24549572, 0.02600457, 0.19602174, 0.099799, -0.07527959, 0.19014588, -0.01878966, 0.23209581, 0.24376227, 0.00832841, 0.24540855, 0.11293066, -0.35005382, -0.13304071, -0.1701065, -0.01642525, 0.09480687, -0.14326383, -0.19253689, -0.09680003, 0.04834467, 0.2307326, 0.25476447, 0.28438395, 0.15284978, 0.03590335, 0.27942657, -0.15493111, 0.11949239, -0.15559277, -0.04595242, -0.06647666, 0.08835454, -0.07909634, -0.11078117, 0.08273389, -0.34512964, 0.20871283, 0.4367814, 0.12072836, 0.04885447, 0.22460175, 0.09247412, -0.06169285, -0.45554423, -0.4579251, -0.5464737, 0.24149336, -0.19274741, -0.15641093, -0.03430081, 0.13937093, -0.18699448, 0.29745594, 0.09679671, -0.27231187, 0.08873921, -0.16079836, -0.26986456, 0.02304242, -0.35488036, 0.18229765, 0.32506648, 0.14826493, -0.115235, 0.4611771, -0.25885084, 0.16411892, 0.17685726, -0.47176343, 0.06344601, -0.24334872, -0.22168933, -0.22600527, 0.51431865, 0.27122545, -0.07349799, 0.0106428, -0.22662045, -0.10846464, -0.20229137]
+pointer:[0.08265064, -0.11325785, 0.24138945, 0.04391604, 0.04041342, -0.16897543, 0.05155872, 0.05668448, -0.20431803, 0.03787981, -0.14154755, 0.19083153, -0.15171741, 0.03613846, -0.16867009, 0.05045661, 0.1885965, -0.16348945, -0.06652614, 0.05224623, 0.00306114, -0.01822854, 0.00746212, -0.09053768, 0.01182512, -0.12679613, 0.02318091, -0.03448309, -0.14373, 0.11279057, -0.16327009, -0.01706993, -0.05909263, -0.05614747, 0.08785715, 0.03881708, -0.20423181, -0.25661093, -0.20674756, -0.0282055, 0.03397173, -0.05737212, 0.04555275, 0.29361734, -0.13415915, 0.22118185, -0.00615504, 0.22260945, 0.04279921, 0.07884003, -0.11532544, 0.18356562, -0.00895991, -0.20645134, 0.02267926, -0.02170515, 0.0055044, 0.08456168, -0.13216546, 0.1462568, 0.05603937, -0.10927387, 0.03516431, -0.10315878, -0.09545423, -0.1033304, 0.0631221, -0.02092238, 0.09208758, -0.15736684, 0.16018824, 0.01738762, 0.2023443, -0.0589956, 0.01683514, 0.03994492, 0.06800775, -0.00613363, -0.00847713, -0.21867423, -0.05061867, 0.3211215, 0.33026937, 0.05790993, 0.06120717, 0.02437131, -0.07114349, -0.03603282, -0.04117692, 0.1735056, -0.0605395, 0.06951058, -0.0519618, 0.08257511, 0.2369263, -0.09280536, -0.17680594, 0.07420892, -0.12455291, -0.21443702]
+pointerTy:[0.02051745, 0.03930061, -0.13780822, 0.08145397, 0.16789572, 0.13065016, -0.10542524, -0.05467955, -0.01762146, -0.04604477, 0.1701438, -0.09423845, 0.1351082, 0.05933728, 0.05937228, 0.14169995, -0.01656263, 0.04579956, -0.2092349, -0.21342191, -0.09793468, -0.13235041, -0.08375326, -0.16085519, -0.14973304, -0.08252603, -0.073769, -0.09369481, 0.11209913, -0.13380662, -0.07154229, -0.02884781, -0.1415144, -0.07497177, 0.08765043, -0.0837753, 0.18112853, 0.1547869, 0.15566485, 0.17924021, 0.24602093, -0.17226125, -0.13778397, -0.07413437, -0.16374694, 0.00985143, 0.02035384, -0.03247173, -0.14573525, -0.0355336, 0.01563889, 0.12733588, -0.01560288, -0.05402131, -0.05402966, 0.08729934, -0.07325768, -0.12084138, -0.03669873, -0.12557755, -0.00469869, -0.08747385, -0.15456621, 0.08866332, -0.07173667, 0.03690774, 0.005266, -0.14193033, -0.0655769, -0.13864315, -0.03037775, 0.10747161, 0.0863423, -0.1658659, 0.12764077, -0.10386666, 0.01972863, 0.10985653, -0.08763743, -0.22322369, 0.15891893, 0.07639797, -0.2104053, -0.06249189, -0.08361356, 0.02993679, -0.01047027, -0.01381014, -0.08932375, 0.03384283, -0.13624993, 0.034237, -0.07883053, 0.05878386, 0.02540432, -0.09568438, 0.136876, -0.1094427, 0.06140319, 0.0642976]
+ptrtoint:[-0.17909163, 0.05978185, -0.01525458, 0.0827358, 0.13590105, -0.00665695, -0.04676352, -0.00894423, -0.07710728, 0.11890139, 0.06090152, -0.01691178, -0.04377104, 0.02271768, 0.19308871, -0.012085, 0.10865739, -0.02500987, -0.03387405, 0.19162256, -0.08741821, 0.03657227, 0.05859031, -0.15887739, -0.15453449, -0.03917694, -0.06103262, 0.04360914, -0.18288018, 0.10369539, 0.04278736, -0.12600316, -0.09115013, 0.07365742, 0.16715185, -0.16013275, -0.23858479, -0.03704453, -0.23288286, -0.0922052, -0.01609032, 0.04052043, 0.22064878, 0.04991644, -0.1820522, -0.01293597, -0.00953268, 0.13542275, 0.01086673, -0.2169931, -0.15197296, 0.01038968, -0.21295832, 0.19325565, -0.09963831, -0.12892094, 0.10379626, -0.22154826, 0.02759095, 0.09798551, 0.18511324, 0.03457121, 0.08533998, -0.04737198, -0.08656166, -0.1869868, 0.27729437, -0.05151283, -0.06691294, -0.1555337, 0.21875164, -0.06813416, 0.20546202, 0.09334102, -0.10061535, -0.11441533, 0.07134652, 0.01644493, -0.10885452, 0.04148402, -0.07033747, -0.06814387, 0.15373418, -0.11924837, -0.04265603, -0.13439938, 0.01207381, -0.14372517, -0.09025616, 0.01423502, -0.06217819, -0.19378968, -0.12694734, 0.11674285, 0.15144986, -0.07297731, 0.04569479, 0.10466555, 0.08926938, -0.05153132]
+resume:[-0.14044924, 0.13945372, -0.01082298, -0.19382872, -0.11130358, -0.02215173, -0.05655283, 0.08988692, -0.1190704, 0.20340037, 0.06236982, 0.19533406, -0.05180738, 0.14083834, -0.10933527, -0.14059012, 0.00656026, -0.00822601, 0.1234389, 0.00893286, 0.00326151, 0.0169771, -0.0119205, 0.11337265, 0.17034674, 0.04142839, 0.06340145, 0.1201084, 0.16027287, 0.11548477, 0.05444419, -0.12784617, 0.0525673, 0.00539962, 0.16270362, -0.00174221, -0.0178054, -0.11105342, -0.12358405, -0.2160014, -0.14875932, 0.06881518, 0.09870582, 0.1350006, 0.05648372, 0.04053469, -0.06300869, 0.1591176, -0.06035259, -0.07586763, -0.03946432, 0.31034648, -0.15541229, -0.1152818, 0.17862293, -0.08012754, 0.03985415, 0.1402749, 0.01862949, -0.04081793, 0.02993261, 0.12385358, 0.13163991, -0.07725973, 0.1205721, -0.08683041, -0.00937064, -0.11749905, -0.1842058, -0.06215821, 0.20710115, -0.02624678, 0.1972167, 0.07452993, -0.13405319, -0.10536271, 0.00454211, -0.2972961, -0.0765842, -0.14508174, 0.03510478, 0.08485702, 0.185041, 0.04909214, 0.0072951, -0.13805138, -0.01179254, -0.15308988, -0.13167015, -0.0758693, -0.06825787, -0.08959401, -0.1522153, 0.20414852, 0.14502315, 0.07940947, 0.03748347, -0.07821426, 0.08629225, -0.08160039]
+ret:[-0.09591126, -0.06698878, -0.03484356, 0.03359839, -0.01953151, -0.14768888, 0.00169076, 0.11464456, -0.02040822, 0.29314098, 0.0322926, 0.05045974, -0.09632246, 0.20435813, 0.01510998, -0.06225896, -0.16097747, -0.02402823, 0.10502088, 0.08989464, -0.03644531, 0.05034522, 0.03310894, 0.03022649, 0.020305, -0.00037919, 0.11813119, 0.09633532, 0.16158018, 0.12410717, 0.0630583, -0.14561032, -0.04435882, -0.00969109, 0.28998947, -0.08378932, -0.0456118, -0.14619417, -0.11908974, -0.11212875, -0.06872475, 0.02186882, 0.20860147, -0.00373741, 0.10754969, -0.1405023, -0.02596954, 0.08065356, -0.06896528, -0.24354708, -0.07617456, -0.25127682, -0.02488107, -0.02338922, 0.13320561, 0.08216611, -0.1348822, 0.09407592, 0.07763086, -0.06171962, 0.27832767, 0.0730993, 0.21437015, -0.00580073, 0.14338787, -0.2915523, -0.03126568, -0.08379723, -0.09040349, -0.16897635, 0.22608498, -0.0841593, 0.0633683, -0.07214461, -0.098145, 0.05474947, 0.07365204, -0.1379932, 0.09760639, -0.021544, 0.0542211, 0.07298078, 0.10069043, 0.12332905, 0.04861702, -0.1589684, 0.08266922, 0.02660372, -0.07247025, -0.07887976, 0.00344193, -0.12289905, -0.07873826, 0.23539269, 0.1225518, 0.00063645, 0.03656369, 0.01130281, 0.00417222, -0.0634011]
+sdiv:[-0.21786626, 0.08368805, 0.02523644, 0.15505943, 0.04937742, -0.19698098, 0.05124503, -0.00454276, -0.06964485, 0.13353895, 0.03093543, -0.09835736, 0.07396861, -0.11897255, 0.16297477, -0.08445384, 0.01988987, -0.03023463, 0.07879532, 0.16067667, -0.07140077, 0.04213231, 0.04984304, -0.06411847, -0.02984477, -0.04093272, -0.04141847, 0.10641379, -0.1234076, 0.09908671, 0.02930241, -0.11639126, -0.2237201, -0.19327661, 0.16800296, 0.01549266, -0.02554015, -0.11475941, 0.13814816, -0.23606667, 0.00867831, 0.0420926, 0.19727513, 0.10908867, 0.10721561, -0.01662414, 0.04444286, 0.08103663, 0.0498569, -0.13047789, -0.21924527, -0.02877468, 0.01931869, 0.19235621, 0.20711644, 0.16483085, -0.27013958, 0.05634264, 0.11370754, 0.03794764, 0.24522354, 0.0236808, -0.07601246, -0.11071627, -0.21469952, -0.09200267, 0.09001629, -0.01701629, -0.17437169, 0.00666977, -0.05814692, -0.00812137, -0.15886936, 0.11760328, 0.06952538, -0.11701947, -0.19086948, -0.14732936, -0.24429274, 0.07078501, 0.0308146, 0.19630802, -0.03280472, 0.11603728, 0.10086931, -0.2136954, 0.08022172, 0.12991406, -0.14901562, 0.0271614, 0.06873772, -0.14489694, 0.05543732, 0.21427938, 0.09796366, -0.1065928, 0.04398327, 0.10854617, -0.00096756, -0.05962537]
+select:[-9.50134471e-02, -1.81051895e-01, -2.49584159e-03, 2.06005573e-01, 3.87188233e-03, -1.02071553e-01, 4.03500497e-02, 1.25096247e-01, -1.35589018e-02, 3.02730352e-01, 2.95376461e-02, -6.66695908e-02, -3.76394615e-02, 1.99065477e-01, 2.83013750e-02, 1.17864102e-01, -5.47199585e-02, 6.69770613e-02, -3.66627239e-02, 2.08492041e-01, 5.59119396e-02, -1.11540100e-02, -5.02365036e-03, 6.90225605e-03, 1.25727892e-01, -1.21016550e-04, 6.91460492e-03, -8.30985531e-02, 6.24425057e-03, 1.55410066e-01, 6.49769157e-02, -2.18299925e-01, -4.55501676e-02, -1.14341050e-01, -5.95368631e-02, -1.13080099e-01, -5.00881523e-02, -7.27860481e-02, 3.17764059e-02, -1.33516818e-01, -4.71564196e-02, -4.15671133e-02, 2.11481512e-01, 7.19150007e-02, 7.73513317e-03, 1.11841835e-01, -6.97231591e-02, 8.89234245e-02, -2.50370186e-02, 9.39650685e-02, -2.12882280e-01, -2.99310505e-01, -1.83380902e-01, 1.07417241e-01, 2.17194930e-02, 1.61608718e-02, -7.34627917e-02, -1.71469748e-01, 7.98335299e-02, 1.59424692e-02, 3.37545455e-01, 1.84868295e-02, -2.91223228e-02, -1.67574465e-01, 5.93522526e-02, -2.08054334e-01, 1.48989826e-01, -8.43031704e-02, -9.71870571e-02, 2.56486505e-01, 2.11358629e-02, -8.17182139e-02, 2.41568349e-02, -6.28159940e-02, -9.22651365e-02, -2.41694115e-02, -1.14235111e-01, -1.72530651e-01, -1.59775898e-01, -5.80063798e-02, -9.64967534e-02, 1.07060954e-01, -3.90472487e-02, -1.22986868e-01, 5.26772700e-02, -1.80290952e-01, 9.65849012e-02, 5.04266145e-03, 5.80190867e-02, -1.08608462e-01, 4.15756367e-02, -1.26518860e-01, -8.35017189e-02, 4.17848825e-02, 1.40247181e-01, 1.42870415e-02, -1.79483055e-03, -7.96105489e-02, -9.60754678e-02, -4.56741937e-02]
+sext:[-0.07915203, 0.02337764, -0.04503435, 0.213887, -0.00143184, -0.11183432, 0.04058618, 0.09663754, -0.12072034, 0.31149092, 0.08229417, -0.00182086, -0.0146011, 0.05989743, 0.16572538, 0.08462363, 0.0856493, -0.01208739, 0.03464735, 0.10251749, -0.00102504, 0.05261565, 0.03609066, 0.00269462, 0.01770539, 0.00345622, 0.04991233, 0.02834656, 0.01322936, 0.14382009, 0.01479668, -0.11096551, 0.10334315, -0.02321594, 0.242531, -0.07715522, -0.04484247, -0.0674979, 0.03657033, -0.16198948, -0.06864597, 0.05611972, 0.13942951, 0.06161565, -0.11131204, -0.02070504, -0.0788872, 0.02407323, -0.07656127, 0.03685286, -0.1083665, 0.11735029, 0.00863886, 0.0346837, -0.02823177, 0.12775385, -0.14619708, -0.06150686, 0.08291237, 0.00359558, -0.11871292, 0.0622145, 0.09834988, -0.14839011, -0.01461649, 0.09345926, 0.10875803, -0.10974131, -0.16425444, 0.08423738, 0.05787477, -0.07691549, 0.03620376, 0.22917216, -0.16867368, 0.05798502, -0.1051218, 0.10280024, -0.08469443, -0.04944262, -0.11994802, 0.20037128, -0.01213568, 0.067391, 0.0562983, -0.17249264, 0.10868816, -0.14391118, -0.01356548, -0.1046884, 0.12414721, -0.11088501, -0.12615547, 0.3728955, 0.10177331, 0.01704302, 0.01351611, 0.02030047, 0.08752514, -0.00876324]
+shl:[-0.12600072, 0.17178538, -0.03773915, 0.14813186, 0.00309077, -0.13955322, 0.05872687, 0.03276375, 0.02957859, 0.17835826, 0.08971131, -0.05579292, -0.04961911, 0.1815136, 0.09675147, 0.06544447, -0.14549394, 0.01551801, 0.09785426, 0.13227257, 0.03021108, -0.03527103, -0.05179261, -0.00069295, 0.12745653, 0.01555206, 0.1171091, 0.04403834, -0.01998673, 0.14246745, 0.05627544, -0.21146798, 0.10623506, 0.03367621, 0.00273195, -0.06247865, -0.04869508, -0.08475212, -0.01894706, -0.2047682, -0.05738413, -0.03540916, 0.19342604, 0.09591562, -0.20742916, -0.06518107, -0.01141268, 0.06972227, 0.05889241, 0.19539835, -0.13152787, 0.0682364, -0.180224, 0.15051568, 0.06961914, -0.13385108, -0.1357468, 0.05068575, 0.04032204, -0.03327969, 0.00927468, 0.02808907, 0.059018, 0.03717202, -0.11838709, -0.10677551, 0.13554044, -0.0833236, -0.13367759, 0.03559484, 0.06238643, -0.0550037, -0.02533245, 0.08430438, -0.13447718, -0.2928003, -0.1579481, -0.04840491, 0.13009158, 0.05975904, 0.09551195, 0.21695271, -0.17272583, -0.00905969, -0.08620144, -0.18974042, 0.11295145, 0.2636354, -0.04623472, -0.05595813, -0.10295886, -0.1647606, -0.13313656, 0.23717678, 0.15271664, 0.03382812, 0.06191398, 0.10725134, 0.10339383, -0.10190611]
+shufflevector:[-0.12675951, 0.07116304, 0.03145237, -0.02959634, -0.14729258, -0.25020698, 0.09980144, 0.05685308, -0.02052229, 0.17280927, 0.03558732, -0.05384561, -0.0932344, 0.21078916, -0.01024115, -0.03498147, -0.1286038, -0.04855656, 0.08253616, 0.20051228, -0.06828303, 0.09313139, 0.01540118, -0.07935187, 0.12513041, -0.04718774, 0.14047313, 0.10678864, -0.08427954, 0.12429833, 0.05720695, -0.2406934, -0.06556378, 0.04065274, 0.1121303, 0.03494449, -0.06822991, -0.07945977, 0.0892394, -0.03733722, -0.02634199, 0.10507209, 0.23455438, 0.03617063, 0.05571855, 0.08927187, -0.17278652, -0.04249284, 0.06806889, -0.02000428, -0.23261675, 0.08372654, -0.0760068, 0.1494188, -0.00984663, 0.073271, 0.02258225, 0.01148031, 0.11313377, 0.08052549, 0.01787192, 0.00494977, -0.03842711, -0.12378804, 0.17483531, 0.10490901, -0.1468796, -0.06224236, 0.06879725, 0.13993496, -0.07951561, -0.03976065, -0.15681376, 0.14130895, -0.20199397, -0.10297415, 0.03871452, 0.00952505, 0.04013392, 0.11179458, 0.25468507, 0.1068259, -0.10656156, -0.06676379, 0.12514235, -0.10953134, -0.0117294, 0.20780165, 0.05814133, -0.06696714, 0.11812696, -0.14363088, -0.10548032, 0.22875504, 0.10285584, -0.06827703, 0.03286001, 0.07818206, -0.18199266, -0.03743109]
+sitofp:[-0.16832569, 0.23925985, -0.00210293, 0.0260516, 0.0768915, -0.16625571, 0.01602546, 0.05691445, 0.0020508, 0.09750295, 0.09087811, -0.0918676, -0.05640079, 0.17099148, -0.04565329, -0.14001136, -0.12121563, 0.01558873, -0.05211416, 0.16390374, -0.08164325, 0.08846082, 0.03409471, 0.04052002, 0.01627373, 0.00273625, 0.11751746, 0.02235544, -0.14852236, 0.15716347, 0.02690658, -0.19089751, 0.19776972, -0.01890383, -0.13309455, 0.01240283, -0.03736231, -0.08947572, 0.01762024, -0.17666656, -0.09012351, -0.04400975, 0.15709351, -0.05091354, -0.09312229, 0.11150968, -0.10950895, 0.08943179, -0.11963892, 0.09311008, -0.03931192, -0.08971342, -0.17940226, 0.1470238, 0.15129781, 0.1499645, -0.13999733, 0.23929577, 0.07231774, -0.04797386, 0.05212139, 0.05784668, -0.05731493, -0.24668387, 0.02754352, -0.18680055, -0.18779813, -0.09527654, -0.18769468, 0.16302873, 0.06074742, 0.00057653, 0.03739297, -0.06293976, -0.18558402, -0.04867147, -0.05908046, -0.15911801, -0.2472413, -0.0538899, 0.13486893, 0.15029062, 0.11845496, -0.09839643, -0.0091461, -0.195536, 0.17987216, -0.03399772, 0.08332697, -0.04513272, 0.16539429, -0.21738891, 0.12998375, 0.03440292, 0.13030784, -0.06806927, 0.02397371, 0.01202742, 0.00508961, -0.08404852]
+srem:[-0.16409014, 0.07838917, 0.04023368, 0.135974, 0.13258739, -0.20247568, 0.06609736, 0.06568857, 0.13063675, 0.08692516, 0.0468335, -0.08981047, -0.08223876, 0.11367928, 0.18566288, -0.02603544, -0.08908951, -0.06548493, 0.11438271, 0.05413428, -0.03280425, 0.10066335, 0.01393046, 0.10595598, -0.08646865, -0.03190904, 0.01491745, 0.09313801, 0.09510665, 0.09619691, 0.06647727, 0.07209901, 0.08554738, -0.17115699, 0.02923004, 0.0284648, -0.03427012, -0.09555427, 0.07497569, -0.2038236, -0.07748044, 0.02802165, 0.13125126, 0.09248228, -0.09714492, 0.0296668, -0.22244203, -0.03194808, -0.10548791, -0.03108296, -0.20327716, -0.14501232, -0.08364192, 0.05909463, 0.1119902, 0.07354888, 0.07534458, -0.00334564, 0.04218324, 0.17105794, 0.10801592, 0.11984114, -0.11550033, -0.09049397, -0.20929213, -0.0292238, -0.00317313, -0.1102082, 0.01091479, 0.04538691, -0.04774939, 0.02503583, -0.04589644, -0.01060015, -0.03629277, 0.05280647, -0.1808559, -0.03119106, -0.04400877, 0.04077768, -0.08126456, 0.34399286, 0.01753456, -0.0561929, -0.01463763, -0.22189938, 0.15643677, 0.14467643, -0.10089339, 0.05035524, 0.07491127, -0.10075136, -0.05029656, 0.2892032, 0.14348505, -0.03291985, -0.15324704, 0.06894287, 0.14173703, -0.02064659]
+store:[-0.03529134, 0.35634306, -0.02657891, -0.15801963, -0.00995737, -0.1218138, 0.0547715, 0.07967321, -0.01875694, -0.08180754, 0.06171454, 0.04990928, -0.10551745, 0.15094171, 0.10358493, 0.01375086, 0.00473249, -0.04866789, -0.03576321, 0.21203005, -0.03796157, 0.01240036, 0.0209163, -0.03091038, 0.1556912, 0.0007899, 0.0926505, 0.02426496, 0.00207357, 0.18937631, 0.08164503, -0.18094489, -0.09841919, -0.12268734, 0.18499546, -0.09187015, -0.0532405, -0.09094289, 0.07979473, -0.12503283, -0.07934996, 0.00833557, 0.20649771, 0.08081701, 0.06973518, -0.11531749, -0.04117833, 0.00828501, -0.02515841, 0.01397896, -0.30589247, -0.16457945, -0.22830844, -0.0239192, -0.02423633, -0.00200097, 0.10478237, 0.02534999, 0.02604761, -0.05149158, 0.2298505, 0.07937331, 0.18878005, -0.17463441, 0.14331897, -0.21256244, 0.17723332, -0.08604205, -0.08755677, -0.2355141, 0.07047425, -0.0761537, 0.10440067, -0.05469456, -0.05299526, -0.20872477, 0.04603479, -0.1143622, -0.21950087, -0.05393213, 0.2659531, 0.2283763, -0.00599449, -0.00557509, 0.05747205, -0.06636461, 0.18512394, -0.0472403, 0.0172425, -0.0248229, 0.03873602, -0.12216681, -0.04614364, 0.16042566, 0.11340576, -0.0886034, -0.00598549, 0.0008022, -0.04278593, -0.03525953]
+structTy:[-3.96835431e-02, -8.90822113e-02, -1.42606497e-01, 3.81423131e-04, 2.19758577e-03, 7.48676881e-02, -2.73228675e-01, -1.16859656e-02, -1.65130183e-01, 5.11487089e-02, -1.69553101e-01, -9.22437832e-02, 1.31498396e-01, -1.37286678e-01, -4.27515320e-02, 4.96642515e-02, -5.52252568e-02, -7.46036172e-02, 9.02014505e-03, -2.35408291e-01, 1.69647247e-01, -1.96743369e-01, 6.45923838e-02, -2.51895841e-02, 6.68621659e-02, 1.36592939e-01, -2.00175524e-01, -1.11361094e-01, 1.27412558e-01, -1.62157789e-01, 9.96021554e-02, 1.41737461e-01, -6.41149059e-02, -7.38510862e-02, 8.01272225e-03, 8.53910372e-02, -1.33319601e-01, 6.27119839e-02, -3.33814435e-02, 2.12902755e-01, 2.27526739e-01, 4.87530306e-02, -1.07006870e-01, 1.33274287e-01, -9.23822448e-02, 1.46636186e-04, 2.46850885e-02, -8.27874169e-02, 2.46693432e-01, 1.76962674e-01, 7.22446889e-02, -4.17378284e-02, -1.11036569e-01, -2.21908048e-01, 9.17931423e-02, 7.30379373e-02, -7.76696280e-02, 1.57592788e-01, 4.10596803e-02, -1.17816523e-01, -1.32886797e-01, 1.60035461e-01, 3.47574726e-02, -2.21677311e-02, -4.64741886e-02, -7.44400769e-02, -4.25543822e-02, 1.13670794e-04, 5.09140380e-02, -1.32655710e-01, -6.25796542e-02, -4.66372781e-02, -1.11898392e-01, -2.02518195e-01, 1.28159031e-01, -5.34876473e-02, 1.09686367e-02, -6.88823611e-02, -7.58955181e-02, 6.08547069e-02, 3.31644602e-02, -1.13912836e-01, -2.02005599e-02, -1.82737440e-01, 3.51766162e-02, 2.10016206e-01, -4.25526053e-02, -1.94335639e-01, 1.49324343e-01, 2.16009989e-02, 1.20429546e-01, -1.30154220e-02, 2.46248320e-02, 8.41082633e-02, 1.70826092e-02, 9.59830508e-02, 1.38070285e-01, 7.90656060e-02, 6.93965480e-02, -1.37265459e-01]
+sub:[-0.0953552, -0.26459047, 0.03308668, 0.13249162, -0.02339133, -0.16340615, 0.09955963, 0.08736164, -0.00749704, 0.258473, 0.02375738, -0.01721415, -0.04011932, 0.1698383, 0.18286662, 0.13691881, -0.06041747, -0.05069342, 0.06985351, 0.18605933, 0.0013146, 0.05105596, 0.09000639, -0.0791879, 0.09990679, -0.03802681, 0.01394006, 0.13074785, 0.02572679, 0.1152823, 0.0602135, -0.0645524, -0.0432878, -0.03946076, -0.01189882, -0.17136051, -0.08446245, -0.14384373, -0.04641701, -0.16400127, -0.00788906, 0.11455883, 0.23541838, 0.01119818, -0.11292889, 0.01591954, -0.17279945, 0.0085732, -0.00049456, 0.23344193, -0.09339388, -0.21455054, -0.14614382, 0.13186802, -0.02922259, 0.08590978, -0.22631744, -0.1641037, 0.11476243, 0.01831239, 0.06058609, 0.01612271, 0.04078725, -0.11939868, -0.08799169, -0.0831557, 0.11597776, -0.10387602, -0.15562047, 0.10277298, 0.0884128, -0.00211773, -0.07519984, 0.02181713, 0.00940274, -0.03150436, -0.19841634, 0.08125176, -0.0336112, 0.01718792, 0.29995593, 0.08398062, 0.01523209, -0.0875889, -0.00292724, -0.10402364, 0.09417068, 0.02840151, -0.08037011, -0.08590419, 0.04044127, -0.1441415, -0.03858523, -0.07990282, 0.11721177, -0.05477691, -0.02124342, -0.05910411, -0.13885908, -0.01996337]
+switch:[-0.13785669, -0.15107918, -0.04796785, -0.22113088, 0.28105316, -0.3084381, 0.14055881, 0.08442263, -0.15649459, 0.39468428, 0.07498952, 0.20437865, -0.09887247, 0.15037191, 0.2262322, 0.06684801, 0.16424559, -0.00524498, 0.07166345, 0.10317154, -0.05140467, 0.06270579, 0.06683356, -0.04247428, 0.12293091, -0.01778657, 0.16808052, 0.03365473, 0.00600127, 0.2287539, 0.128691, -0.1871249, -0.09569948, -0.11760508, 0.08693129, 0.04876805, -0.0746339, -0.09217174, -0.09919852, -0.02021358, -0.03543155, 0.19938102, 0.23665167, 0.02790471, 0.05676728, 0.07625703, -0.09384394, 0.08068095, -0.25725934, -0.15707405, -0.05104439, 0.01520061, -0.10366441, 0.19825514, 0.11738565, -0.3328328, -0.01096464, 0.29800093, 0.13454375, 0.25953025, 0.1962808, 0.06187899, -0.02792281, -0.3613596, -0.09878037, -0.41259867, -0.00243621, -0.11636285, -0.11828742, -0.10344818, 0.15280734, -0.1635701, 0.18818699, 0.24468671, -0.19148564, -0.02964402, -0.14278461, -0.22543798, 0.00378041, 0.04667636, 0.1615017, 0.23346579, 0.02192483, 0.16351697, 0.2541493, -0.10605781, 0.01159541, -0.00798608, -0.33115175, -0.11546707, -0.06785078, -0.17802702, -0.03452291, 0.3095149, 0.17876463, -0.03307298, 0.01204066, -0.04922518, 0.0026099, -0.0974003]
+trunc:[-1.48943663e-01, 1.61985293e-01, -1.70696221e-04, 6.21735305e-02, 4.97375801e-03, -1.19473130e-01, 1.54040540e-02, 1.30973652e-01, -1.51608521e-02, 7.85511658e-02, 2.28337310e-02, 4.50596847e-02, -9.06022266e-02, 3.59564871e-02, 1.11074835e-01, -2.65582591e-01, -9.11209360e-02, -4.00285376e-03, 2.34756917e-02, 1.96700767e-01, 2.90081520e-02, 9.75821391e-02, 2.68728212e-02, -6.27916083e-02, 5.49675226e-02, 2.38057997e-04, 9.13996622e-02, 6.64755180e-02, 3.03930193e-02, 1.37060389e-01, 6.22018278e-02, -1.20737016e-01, 7.61812404e-02, -3.84349562e-02, -7.73440162e-03, -7.51224235e-02, -4.63770628e-02, -7.12292418e-02, 1.56213537e-01, -1.45664543e-01, -8.24993625e-02, -2.50289496e-02, 2.52266616e-01, 7.49891028e-02, 1.55611202e-01, -1.38314575e-01, -5.34070050e-03, 5.22824563e-02, 4.10956843e-03, -4.68976535e-02, 4.39298861e-02, -2.37143904e-01, -1.92298517e-02, 9.85554699e-03, -6.91667199e-02, -5.23221008e-02, -7.32209012e-02, -3.67665179e-02, -7.13495398e-03, 1.47750219e-02, -7.81539232e-02, 7.38604516e-02, 4.12273046e-04, -1.57081068e-01, -6.99810013e-02, 1.42727736e-02, 4.92842011e-02, -7.66704008e-02, -8.69129151e-02, -1.92414001e-01, 1.11921877e-01, -5.43075018e-02, 1.54368639e-01, -6.88038170e-02, -1.88596337e-03, -1.95109889e-01, 7.79059902e-02, -2.12698374e-02, -2.11827502e-01, 9.64161754e-03, -8.94803405e-02, 1.98755145e-01, 4.62119319e-02, -2.24393412e-01, 5.96956238e-02, -6.89180791e-02, 9.04319510e-02, 3.39895546e-01, -7.37581700e-02, -3.13321911e-02, 4.22456339e-02, -1.09583467e-01, -7.39743263e-02, 2.99576640e-01, 1.02384903e-01, 5.89961139e-03, -4.28431435e-03, -1.99617445e-02, -4.58279587e-02, -7.89601505e-02]
+udiv:[-0.17671652, 0.10229447, 0.00519551, 0.06101571, 0.0763792, -0.18405536, 0.05893987, -0.1103385, 0.00791495, 0.10986267, 0.0409479, -0.13180354, -0.03860949, -0.10525192, 0.04892656, -0.03093025, -0.13232875, 0.03807586, 0.07314262, 0.14658159, 0.01306364, 0.06231265, 0.05561756, -0.09672142, -0.01892682, -0.02354536, -0.03152575, 0.06246295, -0.15601172, 0.20085357, 0.03181548, -0.21236748, -0.06882647, -0.24529071, 0.02932597, -0.10867778, -0.08602572, -0.08900763, -0.23639227, -0.19431576, -0.0653095, 0.0828959, 0.30785608, 0.0346611, -0.00477405, 0.01868396, -0.19289365, 0.18062605, 0.00199238, 0.20700113, -0.08788174, 0.00964048, -0.04658434, 0.10516021, 0.12596835, -0.09676334, 0.03474849, -0.00646015, -0.00825688, -0.04109121, 0.19287434, 0.14219823, -0.11141567, -0.03986474, -0.26237622, -0.05288768, 0.2660759, -0.11791226, -0.11103091, 0.00146731, -0.07791728, -0.05956455, -0.05791739, -0.06013145, 0.03733175, 0.1666778, 0.01909983, -0.23549642, -0.04566164, 0.03196376, 0.07809507, -0.04718444, -0.03702124, -0.05550085, -0.05524414, -0.1061673, 0.11534564, 0.13780159, -0.25695655, 0.06229999, 0.10211676, -0.13834105, -0.12139603, 0.16129494, -0.07103133, -0.02762147, -0.12578516, -0.08813025, 0.05242309, -0.02097058]
+uitofp:[-0.17258997, 0.08317631, 0.00159047, 0.04677379, 0.07849041, -0.15901978, 0.06930523, 0.06149773, 0.08035871, 0.05945555, 0.01625332, 0.1350944, -0.05387528, 0.23348717, 0.03979181, -0.03672469, 0.09965295, -0.01449795, -0.0907179, 0.20327848, 0.00445275, 0.08724411, 0.06808846, -0.03389622, 0.09875238, -0.03714811, 0.16171202, -0.11124533, 0.07414763, 0.03462869, 0.02677613, -0.22866257, 0.00079032, 0.00697522, 0.07336772, -0.19353878, -0.07927518, -0.11507886, 0.0542306, -0.06708235, -0.0307213, 0.2249962, 0.24164096, -0.10949063, 0.08361538, 0.02692904, -0.10580832, 0.15280604, -0.05279434, -0.04642436, -0.03333915, -0.14721957, 0.06987269, 0.11268786, -0.08782774, 0.28179362, -0.15912975, -0.05727448, 0.03074066, 0.00575958, -0.00639842, 0.00565872, -0.05683737, -0.26414344, -0.1134745, -0.08173503, 0.00603494, -0.04802901, 0.01352828, 0.01817799, -0.09797031, -0.10834252, 0.06738434, -0.11513596, -0.05307522, -0.10233205, 0.03159448, -0.21574691, -0.01804472, 0.14095852, 0.12034682, 0.05839874, 0.12210672, 0.05701111, -0.00840698, -0.04980013, 0.03922625, 0.01724898, -0.28122628, -0.00621354, 0.09819426, -0.22018862, -0.07949243, -0.0317892, 0.1301879, -0.06706842, 0.04421813, 0.07087731, -0.01899929, -0.06589555]
+unreachable:[-0.06088371, 0.13193683, -0.03018444, 0.15896593, 0.0033598, 0.09663431, 0.11163876, 0.13079004, -0.01468084, 0.08175608, -0.00999199, 0.06351876, 0.02726974, -0.02018832, -0.0473082, -0.04504514, -0.10741987, 0.01347713, 0.16606618, 0.01929044, -0.03611498, -0.05202329, 0.10554367, 0.05255725, -0.0704831, 0.00160814, 0.10875788, 0.13734357, 0.14045468, 0.1380403, 0.02612598, -0.05882959, -0.21091446, -0.1128555, 0.08345397, 0.02365994, -0.04746438, -0.06829461, -0.13361861, -0.16740192, -0.08128867, 0.17816901, 0.1409021, 0.10420833, 0.13494818, -0.02437912, 0.03129028, 0.14431876, 0.13494477, 0.06452074, -0.09379561, 0.15755762, -0.21547836, -0.022196, 0.0536056, -0.19761625, -0.23442549, -0.05972091, -0.02123259, 0.07578047, -0.12083326, 0.02023016, -0.06540227, -0.23720072, -0.02123379, -0.2525388, 0.10508891, 0.01480465, -0.02081848, -0.00219039, 0.09978196, -0.04866889, 0.11588323, 0.06049645, -0.10539561, -0.0511655, -0.05829581, -0.13105415, 0.08427662, 0.05557, 0.05298607, 0.06963351, 0.08255908, 0.07347525, 0.01335096, -0.10886843, -0.04396117, -0.2236974, -0.23813556, -0.16491577, 0.06201493, -0.0737339, -0.12657407, 0.0404583, 0.10359443, 0.02877598, 0.03536025, 0.08561716, 0.0703247, -0.11086893]
+urem:[-0.08549029, 0.09160238, -0.00241183, 0.05067972, 0.15899393, -0.01931739, 0.05753855, -0.11290436, 0.0076089, 0.09345544, 0.07004112, 0.14931405, -0.05836166, 0.23132688, 0.24841079, -0.06698868, -0.10419554, -0.01532327, 0.09040123, 0.13180336, -0.07404146, 0.1092893, 0.06295769, -0.15995945, 0.11533199, -0.04144646, -0.00576534, -0.02924641, -0.14578289, 0.20344952, 0.03532381, -0.03117668, -0.05160449, 0.03500823, -0.11252508, -0.17664222, -0.07940985, -0.12040678, -0.12449349, -0.21122253, -0.01698987, 0.04146675, 0.28569615, 0.02374074, 0.02850478, 0.02949483, 0.03958799, -0.04166255, -0.06555806, 0.00569926, -0.09925889, -0.15188931, -0.10791452, 0.08082949, 0.12191993, -0.00624607, 0.04424485, 0.05079485, 0.14598109, -0.02051969, 0.15129603, -0.00130547, 0.08836077, -0.04359945, -0.10000737, -0.08823593, 0.19829819, -0.11860672, -0.04696933, -0.06921311, -0.0385624, -0.14454114, -0.06662096, 0.02774117, -0.10033001, -0.09850532, -0.01309359, -0.3019796, -0.01657072, -0.07764618, -0.01968917, -0.00321299, -0.07419216, 0.05854518, -0.16480607, 0.05657026, 0.0020229, 0.16678901, -0.22832742, 0.16309422, 0.1353033, -0.1562748, 0.0068607, 0.15853357, 0.14734711, 0.07763742, 0.2270559, -0.16909193, -0.04115343, -0.05565834]
+variable:[-0.04745717, -0.08637991, 0.1639285, 0.05114051, 0.03557682, -0.12990922, 0.07336151, 0.18193728, -0.02263653, 0.0647072, -0.13118894, 0.0706948, 0.12427193, 0.06009571, -0.1661605, 0.06285623, 0.12019422, 0.0589813, -0.09464766, -0.18064742, 0.18370065, 0.14896196, 0.05205907, -0.05699009, -0.0927754, -0.12338018, 0.01031358, 0.11119294, -0.14166753, -0.08204582, -0.17005804, -0.01536623, -0.10464924, -0.01305452, 0.08885329, 0.06114819, 0.03674849, -0.34666064, -0.1727605, -0.10190743, 0.03277443, -0.05261128, 0.08590446, 0.29270428, -0.09474073, 0.22252011, -0.16998203, 0.17469582, -0.01632195, 0.06632435, 0.06541058, 0.11040371, 0.0802538, -0.12276898, 0.11019022, -0.0230128, -0.01787852, 0.0922657, -0.10588636, 0.14600633, 0.06586216, -0.13569869, -0.12737776, -0.10237563, -0.10666361, -0.1718707, 0.07690907, -0.23457758, 0.09286352, -0.09383877, 0.16538797, 0.02497552, 0.03209268, 0.03432005, -0.05913163, -0.04922373, 0.05927496, -0.00142324, -0.02437539, -0.27331042, -0.04195979, 0.3012319, 0.28423536, 0.05868969, 0.05781042, -0.21984018, -0.0756731, -0.02196042, -0.05227526, 0.12267761, -0.00093613, 0.06875217, -0.06592193, 0.0894247, 0.14242776, 0.10645651, -0.16283514, -0.05019224, -0.2615151, -0.17419891]
+vectorTy:[0.09214257, -0.04254282, -0.2082744, 0.1489835, 0.16765025, 0.12442486, -0.06085881, -0.02866303, 0.18554689, -0.08484387, 0.16206563, -0.01242073, 0.17323564, 0.06107936, -0.09174694, -0.0495562, -0.01831215, 0.04182582, -0.03232431, 0.08220705, 0.01549849, -0.1049181, -0.14759736, -0.03965862, 0.0188947, -0.10498622, -0.1803732, 0.16405664, 0.14511505, -0.10143329, -0.06956764, 0.05751402, 0.02792842, 0.14136231, 0.03651895, -0.11449363, 0.07786072, 0.12971582, 0.20839804, 0.20588775, 0.12468194, 0.00039439, 0.01450426, 0.15445328, 0.01187558, -0.07902222, -0.06411007, -0.05476548, 0.20955466, 0.15925792, 0.14728937, -0.00367325, -0.12067425, -0.11644303, -0.21257977, 0.21884163, -0.01551571, 0.06547339, -0.03973668, -0.09633668, -0.24208052, 0.11933044, -0.16694735, 0.04643975, -0.09887692, 0.05033477, -0.12200441, 0.1662296, -0.01365205, 0.01528752, -0.10588146, -0.08806136, -0.20088676, 0.05208419, -0.03125093, -0.06816924, -0.08123421, 0.0129625, -0.08165248, -0.14954782, -0.08383283, -0.0757656, -0.05523998, -0.13218589, 0.15462421, 0.02526899, -0.02197613, 0.06456108, -0.08720388, 0.10372602, -0.01931399, -0.13187875, 0.08807088, 0.02672064, 0.00975798, -0.11998563, 0.10483557, 0.08746739, 0.13014027, -0.13334289]
+voidTy:[1.39123395e-01, -6.82682246e-02, -1.56617016e-01, -7.60084465e-02, 1.00919925e-01, 1.74035922e-01, -1.56080678e-01, -5.35190031e-02, 1.09261021e-01, -1.35638222e-01, 1.68325156e-01, 1.35690197e-01, -9.90925804e-02, -1.13364339e-01, -1.50621478e-02, 3.74432206e-02, -5.21973036e-02, 2.96468586e-02, 6.75825961e-03, -4.00914066e-02, 6.65328428e-02, 1.53036490e-01, 9.56951156e-02, 9.35865939e-02, 2.17673816e-02, 1.03012696e-01, -1.14968633e-02, -8.92200693e-02, 2.22642094e-01, -1.38613293e-02, -5.15563693e-03, 9.23900530e-02, -1.27655804e-01, 3.78469527e-02, 3.11730765e-02, -1.27757015e-02, 1.26724884e-01, 2.15029139e-02, 1.60096169e-01, 3.17343101e-02, -1.03545554e-01, -1.24611840e-01, -4.03355211e-02, -7.08277300e-02, 8.45108777e-02, -1.04451224e-01, 1.16720572e-01, 1.48278670e-02, 1.84134856e-01, -1.62828434e-02, -1.64145931e-05, -6.86618909e-02, -1.37460783e-01, 7.12566301e-02, 6.22349456e-02, -1.15113214e-01, -1.57700866e-01, 1.28431082e-01, -1.25484526e-01, -2.16529414e-01, -9.91288945e-02, -7.96836540e-02, 7.39990473e-02, -5.88596649e-02, -2.84298491e-02, -5.15003502e-02, 2.06307825e-02, -1.38278484e-01, 3.76871638e-02, -6.28824681e-02, 5.19816801e-02, -1.90032780e-01, -4.50734906e-02, -1.09323092e-01, 5.38111515e-02, 8.90467837e-02, 8.49439353e-02, -2.58022826e-02, -5.37883528e-02, -1.73901737e-01, 1.35274500e-01, -9.15873423e-02, -6.80732578e-02, -9.18437913e-02, 7.81169087e-02, 1.10999197e-01, -8.34695622e-02, -1.86496139e-01, -1.59131661e-01, -5.79612404e-02, -3.66159305e-02, 8.42922255e-02, 1.44578693e-02, 3.29559147e-02, 6.82946946e-03, -5.06191142e-02, 1.35032460e-01, 1.89761311e-01, -1.47584870e-01, -4.90086749e-02]
+xor:[-0.16921039, 0.12408639, -0.034145, 0.13137488, -0.04762559, -0.03108282, 0.11359347, 0.04723426, 0.08214669, -0.08919795, 0.08350056, 0.02434964, -0.0256896, 0.18628141, 0.09431785, 0.02161829, -0.17557403, 0.01662976, 0.15725583, 0.13712473, -0.00457354, 0.03745704, -0.03570157, 0.06576116, 0.06272607, 0.01721253, -0.01528889, 0.06864108, -0.03288332, 0.09796044, 0.09011626, -0.23149484, 0.08231667, 0.04841082, -0.13498706, -0.05696484, -0.05362453, -0.11720514, 0.00099914, -0.23637904, -0.06771386, 0.13900891, 0.19573559, 0.01353323, 0.09763495, 0.16432948, -0.08079959, 0.0538074, 0.07155547, 0.02535601, -0.16881762, -0.02021813, -0.12348865, 0.01615006, -0.05484886, 0.27608117, -0.17019226, -0.05588771, 0.14863412, -0.01168946, 0.22599666, -0.0703093, 0.15534535, -0.12977424, -0.25004354, -0.17313497, 0.13966106, -0.09113417, -0.01070651, -0.19820745, 0.09653766, -0.0886725, 0.04275795, 0.05763382, 0.08995168, -0.0497935, -0.14781837, 0.03620582, -0.16778147, 0.01618672, -0.23161617, 0.20526892, -0.03256932, 0.1128776, 0.05835852, -0.17659847, 0.19213665, 0.1507903, -0.23795094, -0.00641877, 0.10532196, -0.17336258, -0.18323651, 0.01772483, 0.14239813, 0.03483916, 0.12513739, -0.1615746, 0.01592221, 0.06976533]
+zext:[-1.33044437e-01, -2.52875745e-01, 3.50738093e-02, -2.03829944e-01, -5.82297966e-02, -1.05092958e-01, 4.42118868e-02, 1.12847589e-01, -1.57210976e-02, 9.47973505e-02, 8.15101340e-02, 4.34930958e-02, -7.35153481e-02, 1.79205835e-01, 4.31320854e-02, 6.20642006e-02, 1.99731160e-02, -1.93929952e-03, -4.71815653e-02, 1.87836722e-01, -6.38541579e-02, 5.80772832e-02, 5.34959137e-02, -6.36336505e-02, -9.44561362e-02, -3.94840681e-05, 1.80340484e-02, 6.65806234e-02, 1.84422173e-02, 1.28611282e-01, 6.59179240e-02, -1.37597591e-01, 1.75117403e-01, -4.69908975e-02, 6.37586415e-02, -6.76920712e-02, -4.30216230e-02, -6.56124204e-02, -4.91032265e-02, -1.42709956e-01, -1.11875355e-01, -8.30171350e-03, 2.17935696e-01, 6.31718040e-02, 1.23638242e-01, 1.87138334e-01, -1.01252785e-02, 6.76815137e-02, -7.43541047e-02, -7.46816248e-02, -1.13281965e-01, 1.19622834e-01, 1.11896917e-02, 8.83216560e-02, 3.06905359e-02, 1.12930745e-01, -1.71396554e-01, -1.75105166e-02, -4.67790440e-02, 1.85718816e-02, -1.56841706e-02, 7.76569992e-02, 1.44308535e-02, -1.63253114e-01, 1.79000050e-02, 1.80133302e-02, 3.17333966e-01, -7.50223324e-02, -8.86120647e-02, 1.56262398e-01, 7.72838667e-02, -6.56765550e-02, -1.00097515e-01, -3.52685601e-02, -1.37866139e-01, 3.65538932e-02, 1.63608536e-01, -5.79393171e-02, 2.18970180e-02, -5.66484667e-02, -6.28089085e-02, 1.92560479e-01, 4.35242988e-02, 3.29817012e-02, 2.57029757e-02, -1.71366796e-01, 4.26483452e-02, 3.12984526e-01, -5.45212887e-02, -2.74304971e-02, 2.81224921e-02, -1.13750860e-01, -7.34276101e-02, 1.34958059e-01, 1.25591040e-01, 1.68564655e-02, -1.45978597e-03, 1.05855344e-02, -2.16981005e-02, -6.22510351e-02]
diff --git a/vocabulary/seedEmbeddingVocab.txt b/vocabulary/seedEmbeddingVocab300D.txt
similarity index 100%
rename from vocabulary/seedEmbeddingVocab.txt
rename to vocabulary/seedEmbeddingVocab300D.txt
diff --git a/vocabulary/seedEmbeddingVocab75D.txt b/vocabulary/seedEmbeddingVocab75D.txt
new file mode 100644
index 000000000..1db19858f
--- /dev/null
+++ b/vocabulary/seedEmbeddingVocab75D.txt
@@ -0,0 +1,63 @@
+add:[-0.10706678, 0.13097984, -0.11605535, 0.17951646, 0.10842272, 0.18399747, -0.19379032, -0.2647733, -0.12766051, -0.00485199, 0.15614752, 0.03155349, 0.03493667, 0.12071995, -0.12817192, 0.01423827, 0.28815243, -0.13548505, -0.01277111, 0.06369204, -0.0081173, -0.10599774, -0.06833462, -0.03803566, -0.0472391, -0.13475174, -0.44472298, -0.19732524, -0.14006428, -0.12402665, -0.08527854, -0.21508977, 0.04458212, -0.11118651, -0.03227397, -0.15087713, 0.08002315, -0.15108559, 0.17325413, -0.1550306, -0.03043029, -0.14906237, 0.00364336, -0.02208263, 0.15527144, 0.08057675, -0.01540586, 0.0479391, -0.1746707, 0.0312925, -0.14524665, 0.1009572, 0.00929103, 0.13883665, -0.18489668, -0.10525297, 0.16679022, 0.1297575, -0.0057894, -0.02373602, 0.14198376, 0.07001822, -0.04425224, -0.15120569, -0.19380043, 0.16383831, 0.01327805, -0.07002157, 0.11953219, 0.00253665, -0.20047452, 0.18101144, -0.05616577, 0.05226176, 0.00271469]
+alloca:[0.17945297, 0.12782614, 0.21235164, 0.12550819, 0.11093373, 0.15053092, -0.1985414, -0.19275506, -0.1463461, -0.02888313, 0.16476473, 0.03344321, 0.03544059, -0.12281881, 0.20685922, 0.05335882, -0.24483645, 0.12437144, -0.13738704, 0.06926467, -0.01236823, -0.14164591, -0.06462298, 0.02696911, -0.08085018, -0.1587167, 0.06712169, -0.20152582, -0.15852675, 0.22358498, 0.05526809, -0.00264076, 0.04593778, -0.1184096, 0.21148157, -0.17092028, -0.11420453, -0.1554349, 0.17760003, -0.17140207, -0.09149083, -0.14809465, 0.11227789, -0.14545228, 0.15926957, -0.05340089, 0.11267719, 0.04943088, -0.13083653, -0.16758578, -0.20546715, -0.01046424, 0.10473233, 0.14263427, -0.19120769, -0.14945947, 0.1383381, 0.03608947, 0.04094962, -0.02461379, 0.14626645, 0.09119257, -0.0416082, -0.14475973, 0.23820469, 0.18458243, 0.01332372, -0.13989814, 0.12224149, -0.00257317, -0.15992273, 0.18817104, -0.05721908, 0.00615159, 0.24600025]
+and:[-0.11178716, 0.13483258, -0.15002933, 0.15391214, 0.11146516, 0.15175094, -0.19856161, -0.27618977, -0.13286063, -0.00655276, 0.16306019, 0.03391848, 0.03587318, 0.12616551, -0.13362664, 0.01764604, 0.29947793, -0.14044237, 0.1129781, 0.06706466, -0.00831874, -0.10934035, -0.07040038, -0.04142912, -0.05216355, -0.13893102, -0.30102658, -0.20554256, -0.1438112, -0.1314689, -0.0867063, -0.49475932, 0.04639493, -0.11538583, -0.04123582, -0.1564892, 0.0834691, -0.15724008, 0.18090673, -0.16223198, -0.03251988, -0.1544349, 0.00185687, -0.09721139, 0.16244216, 0.08392943, -0.01618329, 0.05011995, -0.18062851, 0.03049534, -0.13162978, 0.10417423, 0.01204258, 0.15839572, -0.19408533, -0.10810632, 0.17155176, 0.13542517, -0.00432706, -0.02385384, 0.14791825, 0.07252786, -0.04344646, -0.14658219, -0.15141281, 0.16878209, 0.01392884, -0.07210843, 0.1252286, 0.00241671, -0.19492956, -0.05302701, -0.05951639, 0.05534134, 0.00249913]
+ashr:[-0.10929906, 0.17612839, -0.11600731, -0.23503795, 0.09720282, 0.14072503, -0.18027568, -0.2803111, -0.21011733, 0.1064183, 0.17594221, 0.03080301, 0.07072744, 0.05714689, -0.11605146, 0.04875292, 0.0241426, 0.16152227, -0.01514135, 0.07370667, 0.00061038, -0.08699173, -0.05054572, -0.09078233, -0.08152417, -0.20319045, -0.07695799, -0.2061721, -0.20922238, 0.22261831, -0.28820044, -0.05467343, 0.06598304, -0.10182495, 0.21412489, -0.19759132, 0.07957324, -0.20146614, 0.09765558, -0.17162085, -0.09122259, -0.15034494, -0.12574612, 0.06703107, 0.16114126, 0.08407308, 0.1678488, 0.0505508, -0.13599212, 0.03040495, -0.20570397, 0.10100126, 0.09384924, 0.0983595, -0.21832477, -0.057018, 0.14105481, 0.03707432, -0.00569969, -0.06819412, 0.11119773, 0.04818765, -0.0939882, 0.14159662, 0.23880427, 0.19243136, 0.07138436, -0.16928138, -0.21220447, -0.00465763, 0.00957019, -0.05063453, -0.0598246, -0.14699112, 0.13301979]
+bitcast:[-0.10315816, 0.0816453, -0.21884088, 0.06798919, 0.22739294, 0.0640339, 0.11784311, 0.09506627, 0.19640507, -0.1061683, 0.14800216, -0.15943746, 0.05496758, 0.12763985, 0.21045704, 0.04627991, 0.11577551, 0.12563764, 0.10995742, 0.13987751, 0.10902822, -0.08610999, -0.05738439, -0.14674646, -0.14567736, 0.1975445, -0.15007484, -0.1799645, 0.02444018, -0.03901434, 0.04009971, -0.14321053, 0.07627886, 0.20762299, -0.20748158, 0.17948043, 0.10235873, 0.00023856, 0.18213229, -0.12178227, -0.19155867, -0.07504618, -0.04669186, 0.11121777, -0.13352537, -0.05498422, -0.20033237, 0.22666101, 0.02394146, 0.06419373, -0.0086145, 0.11629897, 0.10842079, 0.21837686, -0.09290663, 0.23453136, -0.05618316, 0.07314663, 0.04041479, -0.03686116, -0.06541585, 0.16816922, 0.10113157, -0.11516596, 0.12729663, 0.18704572, 0.21209802, 0.05036264, -0.20056765, -0.08030804, -0.18798172, -0.05386178, 0.21649109, 0.12457379, -0.23290847]
+br:[-0.13466758, 0.13462044, -0.11900182, 0.14940342, 0.10728918, 0.1602117, -0.18300878, -0.11410869, -0.15767391, -0.08192963, 0.16048539, 0.03106693, 0.0062218, 0.32384592, -0.13333374, 0.01737556, -0.35089645, -0.13951534, 0.32495296, 0.01929854, -0.00861498, -0.11707225, -0.06431757, -0.05223176, -0.04886034, -0.1565396, -0.24797156, -0.18374826, -0.14625117, -0.08047657, -0.04435138, 0.06476029, 0.04438542, -0.11804207, -0.02682809, -0.13218015, 0.31462273, -0.15577368, 0.18048187, -0.16110891, -0.03371485, -0.15339556, 0.03271793, 0.00630022, 0.16150798, 0.08510585, -0.01574472, 0.05013437, -0.1801857, -0.17099534, -0.1501832, 0.12065745, 0.01174447, 0.14283277, -0.14324749, -0.11230699, 0.17124574, 0.13318825, -0.00403612, -0.02349767, 0.1477884, 0.07065933, -0.03957716, -0.14633095, -0.15106276, 0.16803761, 0.01083914, -0.07434659, 0.12422366, -0.00674346, -0.19807695, 0.19070752, -0.05874697, 0.05328529, 0.00263743]
+call:[0.14482532, 0.14326757, -0.15085314, -0.04092033, 0.0209726, 0.17022459, -0.20072381, 0.08939568, -0.15637758, -0.13988748, -0.26898825, 0.03325888, 0.04572382, -0.31501377, -0.1450185, 0.0261996, -0.17067844, 0.09898938, -0.2944188, -0.00886531, -0.00514833, -0.07931045, 0.00602785, -0.01886678, 0.20276964, -0.12007877, 0.22482176, -0.2681193, -0.08419776, 0.21180737, 0.05318057, 0.2844758, 0.06083709, -0.12837744, -0.06748573, -0.14210708, -0.3420069, -0.1958193, 0.2321262, -0.20586585, -0.04130536, -0.19348837, 0.08342399, 0.36395246, 0.17684563, 0.10515745, -0.04181844, 0.02709665, -0.22896197, 0.30263722, -0.09295031, -0.31957364, -0.00433618, 0.12611122, -0.18056175, 0.3066922, 0.21866941, 0.1626749, -0.00615647, -0.28773254, 0.18925248, 0.09600297, -0.08468354, -0.20638923, -0.19032606, 0.12741329, -0.20380476, -0.09236535, 0.15666015, 0.027502, 0.28376308, -0.3791352, -0.07245122, 0.06987173, -0.13707748]
+constant:[-0.05511775, -0.08224074, 0.08653096, 0.4863616, 0.2476299, -0.07138691, 0.44700274, 0.04436373, 0.09296414, 0.0686087, -0.11327551, -0.11816442, 0.2512074, -0.12631956, 0.10144527, -0.40181464, -0.03053996, -0.02082835, -0.13831106, -0.253976, 0.27632302, 0.1657126, 0.13695326, 0.20861977, 0.03519448, 0.12430684, 0.05921895, 0.26770428, 0.13858305, 0.07001018, -0.315329, 0.11938018, 0.32305434, 0.12312049, 0.13810511, 0.08054793, -0.10096874, 0.03923778, -0.39813322, 0.11467672, 0.39932993, 0.02084116, -0.0068024, -0.38385683, 0.04948922, -0.16758485, 0.09372494, -0.10735551, 0.10021734, -0.4156233, 0.12506564, -0.08016244, -0.26558447, -0.13219741, 0.17242356, 0.13817824, -0.01288403, -0.31951007, -0.1818523, -0.17777084, -0.35218972, -0.16993074, -0.31980267, 0.35484686, 0.03130734, -0.04649718, -0.0845923, 0.14208128, 0.03328462, 0.21987958, 0.16688436, 0.4204589, 0.18413895, -0.10522495, -0.06958065]
+extractelement:[-0.13334301, 0.13824242, -0.1777799, 0.19641759, 0.1192126, 0.2089696, -0.21124807, -0.04611871, -0.12823536, -0.16428901, -0.00694824, 0.07086436, -0.20107614, 0.13457699, -0.13841413, -0.20406596, 0.12342261, -0.1551251, 0.11633983, 0.00781696, -0.01117946, -0.09194981, -0.26064873, -0.04221923, 0.06729442, -0.11331707, -0.1575914, 0.03098936, -0.08996629, -0.1677314, -0.11706422, -0.15807948, 0.04784825, -0.12363577, -0.04299357, -0.09287591, 0.08699572, -0.16162103, 0.18954541, 0.18733715, 0.18527527, -0.16211925, 0.01841691, -0.24795406, -0.06417608, 0.08705449, -0.34089014, 0.04867454, -0.19771865, 0.03108035, -0.1314961, 0.10390847, 0.00210152, 0.16652024, -0.1476344, -0.11725239, 0.18920864, 0.13918674, -0.00471087, -0.01769734, 0.15430662, 0.12118539, 0.24754849, -0.16714816, -0.21405493, 0.08530156, 0.22711486, -0.07599557, 0.12583134, 0.01627942, -0.22304477, -0.05357931, -0.06064295, 0.06179977, 0.24206032]
+extractvalue:[0.14426622, 0.0586798, -0.09706913, 0.14877641, -0.25502053, 0.15195489, -0.1566787, 0.24299988, 0.23574317, -0.07162391, -0.22991037, 0.03165187, -0.22608593, 0.01468999, -0.11515595, 0.01825508, -0.06865417, -0.1404803, -0.01040856, -0.03346428, -0.22164406, -0.14025804, 0.23578045, -0.23462011, -0.045315, -0.02686119, -0.0206653, 0.01651808, 0.02044199, -0.18469973, 0.19499204, -0.05297833, 0.02682888, -0.12157851, -0.02729162, -0.09813424, 0.02225483, 0.23500983, 0.21803817, -0.16138217, -0.03408895, -0.15375352, 0.06347576, -0.06099097, -0.1794837, 0.23301016, 0.17049761, 0.02065851, -0.18001623, 0.01151185, 0.04512748, -0.00573916, -0.03807861, 0.13767283, -0.12640858, -0.12627049, -0.1995161, -0.17798784, 0.00845151, 0.02543758, -0.20610349, 0.04735759, -0.04220745, -0.1452903, -0.12603642, 0.04538869, -0.19606718, -0.03102922, 0.04413663, 0.24769837, -0.20390615, 0.07117273, -0.11142858, 0.05541492, 0.24263766]
+fadd:[-0.10873123, 0.13037448, -0.18534161, 0.18515441, 0.11261778, 0.19606866, -0.19855583, -0.04479901, -0.12877528, -0.15118788, -0.01939856, 0.07455989, -0.18490526, 0.05251479, -0.13063222, -0.19204916, 0.02582661, -0.14519615, -0.01473167, -0.00184892, -0.00860755, -0.112672, -0.25621638, -0.03804077, 0.15780579, -0.11617256, -0.07628617, 0.10131412, -0.08613286, -0.1489821, -0.06002842, -0.04803097, 0.04578746, -0.11480423, -0.04673449, -0.08242401, 0.07866412, -0.152193, 0.17761528, 0.17768967, 0.17454574, -0.18040213, 0.06017968, 0.0645328, 0.15748358, 0.08116906, -0.4018228, 0.04057113, -0.1863352, 0.03174699, -0.12215038, 0.10104799, 0.00263386, 0.1581356, -0.14009237, -0.10980193, 0.17721009, 0.13239942, -0.00362236, -0.01748145, 0.14479299, 0.12227024, 0.23331605, -0.15699492, -0.20088439, 0.09237133, 0.01604627, -0.07126047, 0.1216723, 0.00635546, -0.20864682, 0.17545675, -0.05706025, 0.06430314, 0.23661163]
+fcmp:[-0.09831024, 0.1177328, -0.15053168, 0.1668956, 0.10194673, 0.17747606, -0.17944369, -0.01656551, -0.1081959, -0.13423076, -0.0083208, 0.06832938, -0.16663359, 0.11133014, -0.11787042, -0.17280787, 0.10577738, -0.13183661, 0.09999792, 0.01005413, -0.00800985, -0.11900718, -0.23241626, -0.03194214, 0.14458095, -0.08857993, -0.13901676, -0.12804943, -0.03810829, -0.13830633, -0.02034832, -0.15582977, 0.03966385, -0.21123466, -0.04061278, -0.0737746, 0.07400599, -0.13606748, 0.16037306, 0.16100772, 0.15734638, -0.16412482, 0.08469577, -0.22943822, -0.0703051, 0.03550187, -0.17478071, 0.03853272, -0.16823666, 0.02888121, -0.10854868, 0.09304217, 0.00087926, 0.14260164, -0.12434422, -0.10082047, 0.16072698, 0.11885008, -0.00344257, -0.01215652, 0.13043456, 0.08610432, 0.21218961, -0.14265156, -0.18132636, 0.0748597, 0.01380804, -0.06413551, 0.10812144, 0.01471414, -0.18892944, -0.04726761, -0.05034782, 0.05965589, 0.20503323]
+fdiv:[-0.1083142, 0.13170409, -0.18761444, 0.19075245, 0.11425695, 0.19935226, -0.20120272, -0.04145905, -0.12772538, -0.16055192, -0.02654456, 0.07551043, -0.1863077, 0.04952206, -0.13158378, -0.19505195, 0.01627452, -0.14791232, -0.01763806, 0.0014818, -0.00974015, -0.08713593, -0.26082575, -0.0348734, 0.16258475, -0.11312099, -0.06462681, 0.2554564, -0.08579222, -0.14956969, -0.06205287, -0.04617219, 0.04640255, -0.11571387, -0.04207394, -0.07177421, 0.07482164, -0.15266077, 0.1793157, 0.18114524, 0.17665583, -0.18152018, 0.06277426, -0.08340688, 0.15903024, 0.08205476, -0.3324572, -0.15855703, -0.18905288, 0.02863684, -0.12305809, 0.09608548, -0.00266558, 0.16051604, -0.13511042, -0.11073927, 0.18117134, 0.13207485, -0.0035845, -0.01663129, 0.14735432, 0.13560806, 0.2390274, -0.15975215, -0.20400149, 0.08512522, 0.04421749, -0.07282987, 0.12241568, 0.00965695, -0.2123333, 0.08572439, -0.05605263, 0.06658893, 0.24007745]
+floatTy:[0.04900556, -0.10384431, 0.10619805, -0.08045595, -0.10991948, -0.10077553, 0.07339532, 0.14942664, 0.12023108, 0.08361579, -0.09868611, 0.19891165, -0.23421414, 0.01352532, 0.10448531, 0.13516873, 0.04104601, 0.02958678, 0.02299329, 0.1514195, -0.15553081, 0.13952388, -0.13896915, -0.14777902, -0.10149621, 0.14660524, -0.03156482, 0.18424718, 0.1407891, -0.2237127, 0.16614203, -0.00163921, -0.12673005, 0.12534565, 0.05904828, 0.12794818, 0.00817295, 0.11660493, 0.02156415, 0.24247064, -0.13803738, 0.07462812, -0.10431179, -0.055183, -0.1808114, -0.13278495, -0.09894497, -0.08459757, 0.11150088, -0.04819359, 0.13634738, 0.02157767, 0.14846906, -0.12682004, 0.09123623, 0.05239185, -0.05507969, 0.18156756, 0.11898128, 0.12904477, -0.15837269, -0.12526217, 0.17645235, -0.01030331, 0.08386946, -0.1083485, 0.11908209, 0.1599665, -0.12037949, -0.12735032, -0.0725907, 0.01908005, -0.15298285, 0.16727036, 0.14050354]
+fmul:[-0.11000263, 0.13313764, -0.16819902, 0.1866679, 0.11289538, 0.19923902, -0.20158935, -0.10965466, -0.13151023, -0.15339647, 0.00137716, 0.07292396, -0.1705247, 0.05061687, -0.13322882, -0.19424087, 0.01911283, -0.14698511, -0.01600348, 0.01016757, -0.00949535, -0.08578771, -0.25654045, -0.04006492, 0.16177996, -0.13001451, -0.06598155, 0.10235288, -0.12216382, -0.14728908, -0.19769233, -0.04453951, 0.04660948, -0.11446673, -0.04299885, -0.11318354, 0.07576509, -0.15535352, 0.17898083, 0.18015653, 0.17673412, -0.1542999, 0.05283326, 0.06858768, 0.16159816, 0.08381413, -0.34344092, 0.04670792, -0.18845932, 0.03031277, -0.12988667, 0.09807498, 0.00718184, 0.15824817, -0.16129062, -0.10814532, 0.17967564, 0.13519818, -0.00363093, -0.02139519, 0.14737067, 0.1092656, 0.2355478, -0.159828, -0.20372307, 0.10592715, 0.2155067, -0.07222086, 0.12408899, 0.00687299, -0.21276967, 0.0916472, -0.05917447, 0.06157613, 0.24216153]
+fneg:[0.1272929, 0.11098243, -0.19493657, 0.18704055, 0.12977211, 0.19760184, -0.2011749, 0.10378501, -0.11935267, -0.15768325, -0.20259221, 0.07731552, -0.20338854, 0.11889816, -0.13052368, -0.19354439, 0.07626642, -0.14857754, 0.10825964, -0.01353588, -0.01104351, -0.08277993, -0.25518838, -0.03899327, 0.1612618, -0.01545228, -0.10768183, 0.2534764, -0.06081063, -0.16674054, 0.01763026, -0.09180292, 0.04378516, -0.11615089, -0.04529132, 0.18327025, 0.06614358, -0.05828108, 0.18041882, 0.17760223, 0.17644961, -0.15371816, 0.0641077, 0.06343781, -0.11340044, -0.03372987, -0.23527198, 0.01273888, -0.18882784, 0.03041904, -0.04068949, 0.07045509, -0.0026318, 0.19458877, -0.13573602, -0.11694964, 0.17905717, 0.130643, 0.00541951, -0.01507348, 0.14619434, 0.15836413, 0.23706934, -0.15997343, -0.20333211, 0.08333846, 0.16580339, -0.07277556, 0.07136942, 0.01852913, -0.21162856, -0.04937368, -0.05561843, 0.08875916, 0.23905317]
+fpext:[2.3889039e-02, 1.1029585e-01, -2.1694064e-01, 1.8653962e-01, 2.2691385e-01, 1.9574586e-01, -2.0049310e-01, 9.4666131e-02, -1.2724364e-01, -1.4684629e-01, -2.6979610e-02, 7.6569587e-02, -1.6401602e-01, 1.1953403e-01, -1.3126844e-01, -1.9337073e-01, 9.7773880e-02, -1.4722602e-01, 1.0870947e-01, -4.7738426e-03, -9.9636763e-03, -1.3130748e-01, -2.5393358e-01, -3.9765608e-02, 1.5942533e-01, -1.0315144e-01, -1.2541974e-01, 2.5341213e-01, -7.9163589e-02, -1.4747337e-01, 2.4794929e-02, -1.1882598e-01, 4.6331774e-02, -1.1652424e-01, -2.0294240e-01, -4.0969416e-02, 7.2171763e-02, -6.0102597e-02, 1.7984131e-01, 1.7708856e-01, 1.7548151e-01, -1.5351015e-01, 6.6925168e-02, 6.1265044e-02, -8.2261592e-02, 2.5082914e-02, -2.1478510e-01, 4.1686200e-02, -1.8823083e-01, 3.0637426e-02, -4.6937604e-02, 8.6195819e-02, 2.1627222e-04, 2.1729887e-01, -1.3694453e-01, -1.1408991e-01, 1.7551251e-01, 1.3138162e-01, 7.8319147e-04, -1.6518131e-02, 1.4514638e-01, 1.4490409e-01, 1.7909285e-01, -1.5800813e-01, -2.0310356e-01, 9.7424991e-02, 2.0606364e-01, -7.2445914e-02, 1.2246952e-01, 5.2800714e-03, -2.0693912e-01, -4.9303558e-02, 1.9984254e-01, 1.1296164e-01, 1.2244859e-01]
+fptosi:[0.1373729, 0.12883618, -0.16352044, 0.18331416, 0.11165845, 0.19683856, -0.19772632, -0.11136317, -0.12968811, -0.1480879, 0.0067587, 0.07343934, -0.16673195, 0.1234552, -0.13161102, -0.19265643, 0.107696, -0.14450003, 0.00037484, 0.01189654, -0.0088324, -0.13086006, -0.24928111, -0.03620821, 0.1151085, -0.12670605, -0.13663803, -0.15294494, -0.1224799, -0.14602166, -0.04644055, -0.16333403, 0.04555976, -0.24189918, -0.02742246, -0.09617416, 0.06832792, -0.15242375, 0.17582151, 0.17896035, 0.1734453, -0.18223304, 0.05435333, -0.02137768, 0.15711978, 0.08181176, 0.11010902, 0.04648223, -0.18499935, 0.03126073, -0.12697712, 0.0994917, 0.00950376, 0.15537114, -0.14221182, -0.11015689, 0.1767709, 0.13201703, -0.00371583, 0.20973718, 0.1448866, 0.10775527, 0.2309068, -0.15708631, -0.20018397, -0.17917103, 0.02361767, -0.07141636, 0.12183826, 0.00374293, -0.20800817, -0.05120487, -0.05720833, 0.05778734, 0.23726696]
+fptoui:[1.34434968e-01, 1.27162203e-01, -1.26332492e-01, 1.43472478e-01, 1.67107824e-02, 1.90460622e-01, -1.67077854e-01, -4.31036428e-02, -5.84473461e-03, 1.94610119e-01, -1.18339737e-03, -1.18181668e-01, -1.63993463e-01, -4.22932627e-03, -5.70860989e-02, -3.70724685e-02, -6.66463077e-02, -1.40057087e-01, -1.40196038e-02, 1.11302454e-02, -1.12090126e-01, -1.26267821e-01, -1.78080454e-01, -3.28613520e-02, 6.55227527e-02, -9.51863378e-02, 2.86316429e-03, -1.40513226e-01, 2.11926088e-01, -1.40184373e-01, -6.01268075e-02, -4.18982767e-02, -2.44321357e-02, -2.34633580e-01, -4.49065231e-02, -7.49414414e-02, -1.03680985e-02, -1.45848736e-01, 1.70776814e-01, 1.73121408e-01, 1.79659743e-02, -1.75821245e-01, 4.84935082e-02, -5.29969335e-02, 1.81584924e-01, 1.85759827e-01, -1.93469658e-01, -1.93183571e-01, -1.72479257e-01, -6.10608933e-03, -1.17593743e-01, -9.10734851e-03, -1.02117851e-01, 1.51014999e-01, 2.12572739e-01, -1.02930807e-01, 1.78619102e-01, 1.26010776e-01, -1.86922371e-01, 2.07345694e-01, 1.66270494e-01, 4.59922589e-02, 2.25611597e-01, -1.52390793e-01, -1.93683058e-01, -2.10861161e-01, -1.80179209e-01, -6.79619983e-02, 1.01475030e-01, 5.67920804e-02, -2.03148112e-01, 9.35386488e-05, 1.77665465e-02, 5.59489168e-02, 1.62640288e-01]
+fptrunc:[0.13507551, 0.08662265, -0.20684563, 0.1779264, 0.19366996, 0.19928405, -0.19115536, 0.09741689, -0.1157898, -0.14627774, -0.04321446, 0.13611025, -0.16534406, -0.02706414, -0.12561758, -0.1846078, -0.10099479, -0.16950977, -0.01332796, -0.00468324, -0.00924775, -0.12539107, -0.2476966, -0.03697419, 0.15332113, 0.02717782, 0.06184624, 0.24026999, -0.02332935, -0.15212959, 0.00301866, -0.04206852, 0.04305651, -0.1102203, -0.02822751, 0.16004287, -0.08910867, -0.05537027, 0.17084935, 0.17041169, 0.16798739, -0.19032383, 0.06548668, -0.08427053, -0.07714352, 0.01484849, -0.22265097, 0.17633918, -0.18077783, 0.01184065, -0.04223398, -0.00799209, -0.00124257, 0.20681325, -0.12639467, -0.10767608, 0.17034629, 0.1247315, -0.00063698, -0.01105678, 0.13903384, 0.04814726, 0.22382991, -0.15209682, -0.19993167, 0.07498992, 0.04061472, 0.00894266, 0.11516804, 0.01132974, -0.20081756, 0.06491906, -0.05320828, 0.11706732, 0.22729383]
+freeze:[0.19257964, 0.19922924, 0.22845781, -0.20918986, 0.09615742, 0.08813676, -0.13007207, -0.28252187, -0.20277372, -0.00285527, 0.20707846, 0.03269857, 0.05792099, 0.09884403, -0.21888764, 0.0199495, 0.03486069, -0.13990091, 0.01667993, 0.07614928, 0.08568508, -0.08850384, -0.05862335, 0.24327727, -0.05080977, -0.08769658, -0.07556956, -0.21303618, -0.02403472, -0.11753988, -0.06449939, -0.06754956, 0.09903342, 0.05907881, 0.18789217, -0.22513159, 0.07989435, -0.22023727, 0.16526549, -0.16563816, -0.03285323, -0.19686759, -0.05526138, -0.08269978, -0.08173671, 0.01490044, 0.17477824, 0.23617344, -0.04094684, -0.14997905, -0.1934059, 0.08517106, 0.01273688, 0.05140221, -0.21445394, 0.2334229, 0.17481774, 0.17307074, -0.01497588, -0.22724962, -0.04395574, -0.22981015, -0.10490765, 0.14049004, -0.15349036, 0.19155516, 0.22017959, 0.00709452, 0.14702573, -0.04498778, -0.16169429, -0.04348697, -0.06332687, 0.05611038, 0.01098999]
+fsub:[-0.10476302, 0.12542433, -0.17647877, 0.1786793, 0.10913915, 0.18946025, -0.191358, -0.04164409, -0.12347393, -0.1504743, -0.02479569, 0.07111109, -0.18156642, 0.05054973, -0.12513603, -0.18577117, 0.02628745, -0.1401456, -0.01518289, -0.00354086, -0.00885875, -0.08602829, -0.24641128, -0.03600265, 0.15528652, -0.10402499, -0.07289824, 0.24243075, -0.08007814, -0.14872944, -0.02782464, -0.04947096, 0.0445951, -0.11104182, -0.04380236, -0.08080605, 0.07588449, -0.14606269, 0.17145774, 0.17244749, 0.16844998, -0.17483109, 0.05860758, -0.28901112, -0.07676851, 0.17479438, -0.21654579, 0.01940797, -0.17933942, 0.02937181, -0.1172727, 0.09601063, -0.00263024, 0.15110013, -0.1318215, -0.10504271, 0.17152634, 0.12668324, -0.00336666, -0.01625384, 0.13985498, 0.11553686, 0.2260049, -0.15182681, -0.19351181, 0.07778634, 0.01684441, -0.06904304, 0.11642942, 0.00772887, -0.20214222, -0.049887, -0.05513437, 0.06182734, 0.23033473]
+function:[0.07087264, -0.07715042, 0.05874059, -0.13924591, -0.12748645, -0.08829046, 0.23358145, 0.20105776, 0.11009008, 0.07405281, -0.08094433, -0.0829369, 0.16543509, -0.08498039, 0.09908375, 0.13518533, -0.0194154, -0.01221862, -0.10831806, -0.20102835, -0.15210986, 0.15468667, 0.13170041, 0.14903253, 0.24928756, 0.12419113, 0.05789361, -0.00129296, 0.11380319, 0.05218219, 0.14241683, 0.08289858, -0.15494025, 0.13394447, -0.16814493, 0.05700672, -0.06969604, 0.08131509, -0.00970547, -0.18973432, -0.15343298, 0.05649161, 0.20527421, 0.17734532, 0.01022343, 0.15239944, 0.04542852, -0.10245346, 0.13777171, 0.16834758, 0.13177899, -0.07684261, -0.2092511, -0.13731961, 0.11852706, 0.10172775, -0.22111587, -0.2148933, 0.15957674, 0.12867072, 0.22943936, -0.164847, -0.2101238, -0.21214265, 0.02781455, -0.06813682, -0.08800039, 0.13484041, -0.18195598, 0.16143988, 0.11279666, -0.20649853, -0.15624169, 0.21497591, -0.06755896]
+getelementptr:[-0.14634334, 0.12948418, -0.11503786, 0.14507276, 0.09063736, 0.14393866, -0.1757465, -0.1906176, -0.12738505, -0.07622356, 0.15730369, 0.03061217, 0.03747678, 0.2232822, -0.12837602, -0.04787541, -0.3024429, -0.1356514, -0.20493838, 0.01333389, -0.00760518, -0.10626648, -0.03553912, -0.03813244, -0.04541107, -0.12106249, 0.1444827, -0.15215373, -0.10700025, -0.13056989, -0.08320381, -0.47304174, 0.0449689, -0.10947487, -0.0278797, -0.1219172, 0.08132998, -0.15041, 0.17378081, -0.1559312, 0.15688911, -0.14836746, 0.0092639, -0.13855964, 0.15648755, 0.0813685, -0.01539182, 0.04580735, -0.17473969, 0.21075436, -0.12747958, 0.12778966, 0.00290254, 0.12006913, -0.2047303, -0.10826406, 0.16493101, 0.12908581, -0.00380957, -0.02293618, 0.14278038, 0.0713244, -0.04576431, 0.13764144, -0.14565526, 0.12818377, 0.01346012, -0.07020358, 0.12030254, 0.0058628, -0.20072266, -0.05157725, -0.05726963, 0.05315081, 0.00254139]
+icmp:[-0.10969561, 0.13326222, -0.11806951, 0.18324454, 0.11058358, 0.15053809, -0.19195011, -0.11332984, -0.13068, -0.0111747, 0.15630968, 0.03160869, 0.03557754, 0.05428812, -0.131786, 0.01763578, 0.29399103, -0.13815893, -0.01582003, 0.01917153, -0.00759274, -0.10897626, -0.05990775, -0.04164411, -0.04822834, -0.12635493, -0.12839127, -0.20213506, -0.10822182, -0.12239946, -0.06652816, -0.4940955, 0.04586652, -0.11307177, -0.03890553, -0.12857974, 0.4113753, -0.15491834, 0.17824028, -0.159824, -0.03192518, -0.15189394, 0.01119939, 0.03291865, 0.15997088, 0.08326948, -0.01603109, 0.04912903, -0.17884566, 0.03234044, -0.13174565, 0.10036604, 0.0089768, 0.14046605, -0.1716929, -0.10553217, 0.1691209, 0.1336029, -0.00505475, -0.02715854, 0.14558148, 0.07285865, -0.04641947, -0.14444941, -0.14956313, 0.1675603, 0.01070396, -0.07178568, 0.12346014, 0.00264034, -0.20218931, 0.18754801, -0.05911333, 0.05441646, 0.00300689]
+insertelement:[-0.1104931, 0.13435946, -0.16740434, 0.1909089, 0.11453833, 0.19913752, -0.201145, -0.17181988, -0.12990634, -0.15733488, 0.01103377, 0.07403385, -0.19067755, 0.05659281, -0.1327349, -0.19538072, 0.02343484, -0.14819813, -0.01554454, 0.00921893, -0.00647542, -0.08540612, -0.26100376, -0.03634705, 0.16765112, -0.10861496, -0.07738972, 0.06890561, -0.08808507, -0.15872478, -0.06591291, -0.05361471, 0.04665549, -0.11406729, -0.04147775, -0.11218558, 0.08107399, -0.1542376, 0.17992978, 0.18099019, 0.17721385, -0.18993302, 0.03905813, -0.30657682, -0.07932588, 0.08231516, -0.20271443, 0.04749179, -0.18884075, 0.01523502, -0.13022666, 0.10111987, 0.00102864, 0.15882038, -0.1688363, -0.10956942, 0.18005282, 0.13484526, -0.0063764, -0.0242506, 0.14692612, 0.11777592, 0.23874299, -0.15973455, -0.2039948, 0.11537186, 0.21692751, -0.07190187, 0.1233889, 0.01425269, -0.21240549, -0.0528725, -0.05624196, 0.05907395, 0.24069618]
+insertvalue:[-0.09875207, -0.1714084, -0.17448501, -0.05500454, -0.03368652, -0.19084807, 0.15094712, -0.03978536, 0.1313515, -0.19683114, -0.03120292, -0.16458064, -0.15630096, 0.05070753, 0.16386797, 0.11045002, 0.11953997, 0.1334012, 0.07337415, -0.08667754, -0.04855481, 0.04043591, -0.21467037, 0.04876019, -0.0904218, 0.00143209, -0.06295151, 0.09086672, -0.04096752, -0.11947396, -0.12021854, -0.04494649, 0.09700233, 0.14941849, -0.05310388, 0.18482774, 0.07009561, 0.17008236, 0.08557777, 0.06514586, -0.10545991, 0.17381305, 0.01084712, 0.10524479, -0.1008845, -0.183286, -0.20012572, -0.14668721, 0.08051436, 0.21215467, 0.18288761, 0.0772287, 0.08486479, -0.11070843, 0.14811186, 0.14061394, -0.11395239, -0.06261241, 0.15542322, -0.01529685, -0.11505058, 0.16915536, 0.21295418, -0.01675938, 0.15865982, 0.09708425, 0.17962472, -0.13718157, -0.19584663, -0.16169825, -0.19526207, -0.11267254, -0.12390247, -0.1037976, 0.00466637]
+integerTy:[-0.05895382, -0.08773074, 0.06992726, -0.31011233, -0.13048527, -0.10587289, 0.05197246, 0.11830473, 0.11592712, 0.17741975, 0.07661638, 0.17850745, -0.08980408, 0.08872516, 0.10607537, 0.17136358, 0.13644408, 0.01311096, 0.02419001, 0.23305452, -0.17139797, 0.13690701, 0.11479, -0.21357676, -0.1899478, 0.10415972, -0.11652931, -0.09769165, 0.15676561, -0.23224157, 0.10116645, -0.12614302, -0.15886351, -0.16665749, -0.13050455, 0.08655596, 0.01707506, 0.08300704, -0.0263752, -0.04439607, -0.17297547, 0.06548287, -0.23450397, -0.00410204, -0.13871993, -0.01783468, 0.20883788, 0.1585069, 0.075288, -0.05117706, 0.11569144, 0.03889959, 0.17440279, -0.14135467, 0.09397258, 0.07870792, -0.02154971, 0.10194483, -0.14623329, 0.16707808, -0.19285178, -0.18017578, 0.07884493, 0.2594352, 0.05723228, -0.13506767, 0.10019378, 0.15450986, -0.11666895, -0.18157922, 0.08850383, 0.0062976, 0.17424847, 0.17297816, 0.05142448]
+inttoptr:[-0.13630244, 0.1394812, 0.09082608, 0.15104489, 0.01774232, -0.13840991, 0.01065149, -0.11621346, -0.00252811, 0.21313493, 0.15903583, -0.1296972, 0.10214894, 0.11171967, -0.03819407, 0.01599813, 0.10556564, 0.1661376, 0.11314746, 0.15266941, -0.11538962, -0.08747453, 0.18267399, 0.20305595, -0.2017417, 0.21432902, -0.10308855, -0.18534417, -0.13134196, 0.09993339, -0.10776421, -0.09298802, -0.03029798, 0.19584055, -0.02545767, -0.14516763, 0.08564661, -0.15706332, 0.18191946, -0.16316868, -0.10425402, 0.11010062, -0.0479327, 0.11809943, 0.19715278, 0.13697258, 0.12513216, -0.196676, 0.05488879, 0.19722784, -0.15231481, 0.08681407, -0.10788315, -0.21445514, 0.22154817, -0.10709018, -0.09173875, 0.13078192, -0.19902122, -0.02503786, 0.17685084, 0.09781817, -0.04346599, 0.16277169, 0.10102073, 0.19040433, 0.21730414, -0.17189498, -0.14639756, -0.06024209, -0.20907345, -0.05495603, 0.01513247, -0.16496265, -0.23925038]
+invoke:[-0.17037813, 0.12447809, -0.13254088, 0.16741143, -0.29689348, 0.17245242, -0.1753155, 0.27199855, -0.1479448, -0.08975344, -0.2388202, 0.03697256, 0.02300099, -0.27569947, -0.14945273, 0.02014936, -0.14911516, -0.16015211, -0.23843327, -0.01150125, -0.01184224, -0.10053053, -0.01891209, -0.04529067, 0.1769977, -0.14764817, 0.1858467, 0.29046112, -0.10172998, 0.18476044, 0.04675948, 0.18468481, 0.05041242, -0.13219522, -0.03313631, -0.12524456, 0.09232612, -0.06788205, -0.33390293, -0.18106446, -0.06505071, -0.1723444, 0.12838279, 0.3172158, 0.1821126, 0.0955131, -0.03461147, 0.02496569, -0.20339684, 0.26446992, -0.07812006, 0.11357581, -0.00242351, 0.15685299, -0.1453846, -0.12997872, 0.1138543, -0.13915779, 0.00910551, 0.02702536, 0.16584009, 0.08293587, -0.05373611, -0.1639482, -0.16794938, 0.07561965, -0.18069787, -0.08345903, 0.13999896, 0.00712107, 0.24829929, -0.33074573, -0.06754953, 0.06254003, -0.11928315]
+label:[-0.08421724, -0.10250711, 0.11215679, 0.03593931, -0.12462043, -0.02116062, -0.02468752, 0.14892796, 0.03624122, 0.2573024, 0.26621008, 0.1473021, 0.16479708, 0.11161798, 0.03291009, -0.09228926, 0.20894618, -0.25664115, 0.20051186, -0.13776602, 0.13812794, 0.08599985, 0.11859813, 0.12606345, -0.1787899, 0.04831297, 0.12180986, 0.2105218, 0.0406118, 0.14002106, -0.24280258, 0.14901407, -0.0706777, 0.02931729, 0.32707393, 0.07797667, 0.17175199, 0.08435421, -0.21704178, 0.23822264, 0.06267213, 0.24012461, -0.24429479, -0.00610719, 0.23788038, -0.06578419, -0.09999645, 0.16555783, 0.23481676, -0.15229315, 0.03339487, -0.02717743, -0.14654148, -0.05192868, 0.14201662, -0.27716735, -0.11879828, -0.2512509, 0.17667766, 0.14006434, -0.00560042, -0.14142503, 0.02450437, -0.04081944, 0.05965927, -0.21140096, -0.06488664, 0.08721694, 0.2432311, 0.14565244, -0.10602848, 0.10125864, 0.08721873, -0.1536091, -0.17011659]
+landingpad:[-0.14584796, -0.16767813, -0.01705973, 0.00093497, -0.2436182, -0.18231551, 0.06912599, 0.232326, 0.17945138, -0.2238229, -0.20365967, -0.16778396, -0.01338567, 0.06786925, -0.0089755, 0.22903025, -0.10159695, 0.05511137, 0.08055997, -0.04842087, 0.02367443, -0.16437764, 0.18895102, -0.14594522, -0.11077365, -0.03415364, -0.0526613, 0.03391879, 0.16745631, 0.15810244, 0.18886559, -0.06867921, -0.0954337, 0.15118866, 0.00546555, 0.17617542, 0.06660912, 0.18861406, -0.09817892, -0.11471829, -0.06352893, 0.17084128, 0.10971251, 0.03079901, -0.12283082, 0.11941736, 0.14988025, 0.12327142, 0.15214007, 0.03017107, 0.16773368, 0.06079161, 0.14422408, 0.01841416, 0.15053785, -0.01172967, -0.14936632, -0.14004451, 0.05743803, 0.17034504, -0.15224192, 0.04629263, 0.01544103, 0.02796921, 0.15804203, -0.16536269, 0.02765706, -0.2177597, -0.0776866, -0.22482842, 0.21214648, -0.04934264, 0.14992182, -0.18284532, 0.12743513]
+load:[0.14515816, 0.12730086, -0.11675689, 0.13731101, 0.0856357, 0.14036776, -0.1680394, -0.10500994, -0.12388522, -0.00997473, 0.15036497, 0.02959538, -0.14294048, 0.11579642, -0.12299019, 0.01710502, 0.2744816, -0.12820424, -0.17692348, 0.06387755, -0.00997787, -0.10073593, -0.221399, -0.03850655, -0.04604952, -0.12999706, -0.23317862, -0.18918784, -0.136777, -0.1259924, -0.08401669, -0.44748387, 0.04140297, -0.10600363, -0.02825268, -0.14835529, 0.0767852, -0.14656888, 0.16522723, -0.14833589, -0.03145197, -0.14087194, 0.00418875, -0.08156209, 0.14937344, 0.07756609, -0.01715839, 0.04561085, -0.16615209, 0.02954168, -0.16565895, 0.07675724, 0.01007609, 0.12687837, -0.13445675, -0.10035386, 0.15792593, 0.1236473, -0.00307636, -0.01651428, 0.1361811, 0.0755292, -0.03676795, -0.13428877, -0.13931923, 0.1571369, 0.01346655, -0.06821621, 0.11397477, -0.00336121, -0.19289134, -0.04844571, -0.05658585, 0.05074035, 0.00364443]
+lshr:[-1.07618235e-01, 1.72638521e-01, -1.15980022e-01, -2.29095370e-01, 9.65579972e-02, 1.38108417e-01, -1.76737547e-01, -2.71451771e-01, -2.03912869e-01, -1.02555100e-03, 1.69754341e-01, 3.08463741e-02, 5.36250919e-02, 1.21660687e-01, -1.74549952e-01, 1.69236306e-02, 1.34103879e-01, -1.34251148e-01, -1.09291431e-02, 7.34013617e-02, 4.81260680e-02, -8.32869262e-02, -4.93266359e-02, -8.71899873e-02, -4.87988330e-02, -1.87684625e-01, -1.73489943e-01, -2.01266050e-01, -1.87993333e-01, -9.25938040e-02, -2.67284721e-01, -1.70980498e-01, 5.49704246e-02, -9.92908999e-02, -2.04201669e-01, -1.88772425e-01, 8.08538347e-02, -1.96026564e-01, -1.59017637e-01, -1.56015217e-01, -3.07364762e-02, -1.47628203e-01, -1.18779279e-01, 1.12054415e-01, 1.56248108e-01, 8.06738585e-02, 1.59131959e-01, 4.82034311e-02, -1.74115866e-01, 3.33038792e-02, -1.82583794e-01, 1.01199277e-01, 1.13783469e-02, 9.69657749e-02, -2.11351588e-01, -5.26013300e-02, 1.65175989e-01, 1.31593123e-01, -5.34626422e-03, -6.75430447e-02, 1.04004987e-01, 4.81479615e-02, -9.91894677e-02, 1.36073366e-01, -1.45649791e-01, 1.97602749e-01, 4.21781391e-02, -7.01575503e-02, 1.53188914e-01, 1.35687616e-04, 9.17893182e-03, -5.32824658e-02, -5.76535352e-02, 5.21502644e-02, -2.27659225e-01]
+mul:[-1.10740639e-01, 1.79489031e-01, -1.16963282e-01, -2.33437970e-01, 9.87611338e-02, 1.49095193e-01, -1.82653472e-01, -2.79600203e-01, -1.97915658e-01, 1.39354763e-03, 1.74758449e-01, 3.16131786e-02, 5.40922359e-02, 1.24427542e-01, -1.77638933e-01, 1.73734594e-02, 2.94302821e-01, -1.37859747e-01, 1.13455996e-01, 7.11286962e-02, 2.80722103e-04, -8.68532956e-02, -5.32661788e-02, -6.27722964e-02, -5.23782670e-02, -1.87031299e-01, -2.50176728e-01, -2.06857830e-01, -1.81378320e-01, -9.91749838e-02, -1.99474856e-01, -2.10756496e-01, 4.60124500e-02, -1.09496146e-01, 2.05390289e-01, -1.93141758e-01, 8.26756209e-02, -2.02435717e-01, 1.57658204e-01, -1.61479577e-01, -3.25814299e-02, -1.51643500e-01, -5.50450161e-02, 1.16838366e-01, 1.61545411e-01, 8.40181708e-02, -2.01780185e-01, 5.08336052e-02, -1.77847996e-01, 3.34045105e-02, -1.89214364e-01, 1.03171140e-01, 1.11006750e-02, 9.96930301e-02, -2.13933602e-01, -8.31998661e-02, 1.69776157e-01, 1.36905089e-01, -7.23596616e-03, -7.03386515e-02, 1.47096902e-01, 4.73428033e-02, -9.53844786e-02, 1.40168130e-01, -1.49634287e-01, 1.76833391e-01, 1.42325740e-02, -7.01029822e-02, 1.48151264e-01, 1.46238506e-03, 9.14167427e-03, -5.46112247e-02, -6.03365153e-02, 5.26305772e-02, 1.81084534e-03]
+or:[-0.10545847, 0.128841, -0.14629026, 0.17671728, 0.10541161, 0.1452954, -0.19208096, -0.26102364, -0.12768617, -0.07223696, 0.15802775, 0.03196834, 0.01273388, 0.11991186, -0.1273087, 0.01605262, 0.28355837, -0.1339228, -0.01369879, 0.02059641, -0.00814792, -0.10595141, -0.06777362, -0.03963358, -0.04625091, -0.13565284, -0.2567866, -0.19570036, -0.14286374, -0.12997858, -0.08209349, -0.46220544, 0.04389297, -0.11056517, -0.03333032, -0.15437946, 0.07864793, -0.15014647, 0.17209147, -0.15338379, -0.03033057, -0.14717023, 0.01365776, -0.02373198, 0.15401708, 0.07996901, -0.01564746, 0.04807418, -0.17326052, 0.03048565, -0.12832771, 0.09849346, 0.01073802, 0.13247147, -0.18602005, -0.10404839, 0.16417612, 0.12832864, -0.00375266, -0.02193816, 0.1411213, 0.06878087, -0.0414301, -0.14032999, -0.1449, 0.14572303, 0.01162843, -0.06873709, 0.11880528, 0.00282644, -0.19748962, 0.17471638, -0.0566086, 0.05271496, 0.00232344]
+phi:[0.16505243, 0.16049314, -0.17289443, 0.21912654, 0.4185169, 0.13733086, 0.17491576, -0.28879407, -0.11458892, -0.11623015, -0.30420232, -0.26313967, 0.02635299, -0.3593261, -0.12667379, -0.2878424, -0.19345047, 0.14500995, -0.33731002, -0.05418503, 0.07374757, -0.03973716, -0.10962506, -0.0216001, 0.16983663, -0.08537833, 0.2804635, 0.03990281, -0.098049, 0.24968961, -0.09870985, 0.32718843, 0.14398097, -0.07338686, -0.03432579, -0.16179925, -0.390389, -0.152486, -0.1530621, 0.00060386, 0.25888667, -0.15926011, 0.15051255, -0.21384007, -0.15373367, 0.04145497, -0.07132615, -0.25352055, 0.02538978, -0.2478801, -0.11097675, -0.33755103, -0.04691213, 0.07508368, -0.05963779, 0.35231087, -0.25979388, -0.12548721, -0.42427787, -0.38969982, -0.11973464, 0.03433835, -0.12401191, 0.08178731, -0.212353, 0.09710696, -0.27779645, -0.04685023, -0.11876755, 0.00199457, 0.323862, 0.27804938, -0.01935326, -0.3441187, -0.18507953]
+pointer:[-0.04260793, -0.06655251, 0.0683827, -0.16628, -0.1327496, -0.1192655, 0.03336288, 0.25193292, 0.12020645, -0.21788007, -0.0926288, -0.33410597, 0.19710302, -0.09973855, 0.11243664, 0.15928231, -0.0234532, 0.26252532, -0.10966486, -0.24944538, 0.28036997, 0.17110308, 0.20078544, 0.16493188, 0.290333, 0.13994451, 0.04575525, -0.06554279, 0.10987123, 0.05426969, 0.16664775, 0.02802411, 0.31233883, 0.15636835, -0.19513567, 0.06443949, -0.08091348, 0.09128414, 0.01986683, -0.07266335, 0.06737777, 0.06538786, 0.2529973, 0.20844017, -0.24561793, -0.19505124, 0.0734731, -0.31207955, -0.06948306, 0.19679287, 0.10214823, -0.08847999, -0.23900308, -0.16090985, 0.03401919, 0.11077866, -0.00749398, -0.00366133, -0.20090736, -0.18661766, 0.01663766, 0.21449998, -0.27308217, -0.05783403, 0.02704501, -0.07756831, -0.10079198, -0.18371654, -0.21206969, -0.17070684, 0.13148035, -0.24232186, 0.19117421, -0.08119162, -0.05410983]
+pointerTy:[0.06106736, -0.12349674, 0.17019917, -0.08414872, -0.12162091, -0.11493171, 0.09028275, 0.12890002, 0.14708637, 0.15056878, 0.02994711, 0.16398947, -0.09669119, 0.06416745, 0.14228098, 0.1596261, -0.09310527, 0.18277259, 0.04528873, 0.18208562, -0.16108184, 0.15556088, 0.14967172, 0.14207251, -0.1702539, 0.14975922, 0.00762874, 0.11305032, 0.15105066, -0.00398245, 0.17565133, -0.02440955, -0.14144371, 0.13705797, 0.07325926, 0.10544213, 0.01701942, 0.11734937, 0.00385431, 0.03158404, -0.18258087, 0.12936145, -0.14789775, -0.06379373, -0.15407959, -0.13860792, 0.02199786, 0.14426517, 0.15864013, -0.05444241, 0.14669472, 0.01814392, 0.15084662, -0.14623053, 0.14005995, 0.02525642, -0.07524002, 0.17881763, 0.12757415, 0.1521277, -0.1638457, -0.14205529, 0.0757456, 0.16856319, 0.12415951, -0.12737201, 0.12555027, 0.15302233, -0.13898452, 0.15318881, -0.07542091, 0.0076905, -0.15670809, 0.15843765, 0.05349815]
+ptrtoint:[-0.00816662, 0.19040845, 0.20297833, -0.01445115, 0.01286274, 0.1388536, -0.12834401, -0.25448227, -0.18602331, 0.11218877, 0.16607688, 0.02404105, 0.08811599, 0.11005177, -0.04818001, 0.05179739, -0.05825163, 0.15343176, 0.10150934, 0.09455664, -0.0843754, -0.1285684, 0.01307766, -0.05897991, -0.07532796, -0.18418753, -0.1115199, -0.19556019, -0.18551438, 0.2176016, -0.10437213, -0.10136399, -0.03294409, -0.10394157, 0.18672661, -0.18701841, 0.03547023, -0.19007061, 0.1333624, -0.16449562, -0.08741398, -0.0972076, -0.06125146, 0.05744944, 0.15746726, 0.07936066, 0.16241315, 0.05675254, -0.10836843, 0.01312472, -0.19523665, 0.0164252, 0.0918045, 0.09326963, -0.19768307, -0.09408253, 0.128529, 0.1384969, -0.17873324, -0.17067038, 0.16512468, -0.04128785, -0.05075456, 0.12075716, 0.22557029, 0.18317577, 0.03894774, -0.17253353, 0.11979695, -0.03928764, -0.02036279, 0.07949624, -0.05820873, -0.14405596, -0.22275722]
+resume:[0.13037221, -0.16173543, 0.13458313, 0.13334186, -0.1978227, -0.1913591, -0.08266275, -0.10539632, -0.03537533, -0.07999261, -0.1888888, 0.09123345, -0.01312841, -0.04382619, 0.17804968, 0.0711588, -0.11729724, 0.0934309, -0.01422059, -0.0741116, -0.03279833, -0.19914162, -0.07376206, 0.03569537, 0.07874546, -0.13707635, 0.06425411, -0.12457802, -0.16188276, 0.14148334, 0.08412136, -0.03689551, -0.07043207, -0.20703934, -0.02252792, 0.19750863, -0.033062, 0.17924878, -0.07769594, -0.14863983, -0.05841683, 0.16428049, 0.15180947, -0.21731207, 0.14294364, -0.07557691, 0.15722235, 0.02009239, 0.09232536, 0.01271097, -0.06394573, -0.01228985, 0.18844755, 0.1295341, 0.14470226, -0.15141319, -0.14120032, -0.12438326, 0.05964512, 0.18555959, 0.13490148, 0.04603386, -0.00602201, -0.13373813, 0.15960513, -0.17103422, -0.1792076, -0.13181998, 0.08289735, -0.1511489, 0.20325269, 0.11857883, -0.11881144, -0.10513151, 0.22182767]
+ret:[-0.15868923, 0.1349383, -0.17091866, 0.15446638, 0.11590775, 0.15517706, -0.2041222, -0.11587869, -0.13392796, -0.10321935, 0.15008125, 0.03055824, -0.00416798, -0.18004377, -0.13517867, 0.01493629, 0.30301064, -0.08629195, 0.33057842, 0.01448719, -0.00978797, -0.11399369, -0.08553061, -0.04123082, -0.06511337, -0.17489514, -0.37978184, -0.18547371, -0.17780186, -0.07696914, -0.13219626, -0.05637591, 0.04734724, -0.11862542, -0.03535185, -0.13939175, 0.08252498, -0.15738043, 0.18223797, -0.1627762, -0.06201587, -0.1529406, 0.0504948, -0.09689271, 0.1644328, 0.08499561, -0.01689226, 0.04760371, -0.18340605, 0.22181557, -0.13375576, 0.12520806, 0.0112763, 0.1603191, -0.1456238, -0.11290328, 0.17398314, 0.13095538, -0.00311895, -0.02351524, 0.14960586, 0.12061052, 0.18068948, -0.14880593, -0.15416823, 0.16443218, 0.01066161, -0.14379273, 0.126047, -0.00124509, -0.21231118, 0.19050261, -0.05867328, 0.00696932, 0.0025822]
+sdiv:[-0.1080407, 0.1901844, -0.11603287, -0.24059227, 0.09864137, 0.13577417, -0.17973639, -0.27967322, -0.20948485, 0.00114907, 0.19843854, 0.03040717, 0.05632383, 0.12221054, -0.2112495, 0.01894132, 0.03244886, -0.13253069, -0.01357965, 0.07498644, 0.05119408, -0.06709869, -0.05151782, -0.09100531, -0.05264058, -0.20247222, -0.12862803, -0.20636694, -0.21299663, -0.10185096, -0.29176903, -0.16390459, 0.09336192, -0.09844302, 0.20892984, -0.21211214, 0.08028145, -0.2122692, -0.162864, -0.15979283, -0.03135847, -0.1484897, -0.07831246, 0.06954102, 0.15943323, 0.08275507, -0.13675603, 0.05052621, -0.17471251, 0.03110945, -0.18684193, 0.10069941, 0.01219233, 0.06511583, -0.21929686, -0.05095504, 0.16737965, 0.16719955, -0.00743731, -0.07113376, 0.1047412, 0.0452371, -0.1040564, 0.1407309, -0.14787188, 0.18525307, 0.21821006, -0.06789627, 0.15881357, -0.00230124, 0.01077223, -0.05214523, -0.05975898, 0.05244323, 0.02462071]
+select:[0.17570536, 0.13175449, -0.11720598, 0.14844438, 0.09280295, 0.14566837, -0.1768578, -0.11089199, -0.12885936, -0.00730331, 0.15556662, 0.03110983, 0.03409553, 0.12267582, -0.12987325, 0.01591347, -0.28995955, -0.13713442, 0.31774223, 0.01413707, -0.0089218, -0.10580166, -0.05917821, -0.03972784, -0.04355109, -0.1133311, -0.07766423, -0.158014, -0.10279176, -0.13709833, -0.08557661, -0.47814846, 0.04511175, -0.11089844, -0.03224563, -0.11226902, 0.08064924, -0.15144405, 0.15985128, -0.15788692, -0.0312807, -0.15031807, 0.01041373, -0.09034625, 0.15847835, 0.08195098, -0.01600686, 0.04578463, -0.17644133, 0.21165982, -0.12680317, 0.33608407, 0.00331462, 0.09868409, -0.14361018, -0.10572648, 0.16693854, 0.13131157, -0.00395222, -0.01618505, 0.14390245, 0.07120807, -0.04470149, -0.14178777, -0.14743042, 0.10959363, 0.01382386, -0.07081821, 0.12153695, 0.00529651, -0.20341483, -0.05135162, -0.05888305, 0.05382327, 0.00301529]
+sext:[0.14193074, 0.13331981, -0.11316784, 0.14529039, 0.10394517, 0.14700282, -0.19387709, -0.1918389, -0.12983558, -0.01084572, 0.16912027, 0.03287292, 0.0138519, 0.21869631, -0.12947397, 0.01767851, 0.28681394, -0.13507745, 0.19557841, 0.06553879, -0.00864815, -0.10663193, -0.06740876, -0.04023706, -0.04694913, -0.13625306, -0.2858375, -0.19928427, -0.1687486, -0.12430062, -0.08675309, -0.2216403, 0.0451508, -0.11176624, -0.02937848, -0.18189447, 0.2055244, -0.15293373, 0.17383349, -0.15753525, -0.03242385, -0.14866887, -0.00659716, 0.03523885, 0.15639767, 0.08121428, -0.2088679, 0.04757152, -0.17467941, 0.03303692, -0.14673805, 0.12393042, 0.01084362, 0.13507022, -0.18777242, -0.10503101, 0.16581522, 0.13111342, -0.00434989, -0.02247462, 0.14306474, 0.09170811, -0.04379092, -0.14178753, -0.14546809, 0.16244873, 0.21214104, -0.07103316, 0.12081423, 0.00103163, -0.1985043, -0.05231175, -0.05821783, 0.05281277, 0.00271138]
+shl:[-0.10962299, 0.17157932, -0.11628958, -0.22798763, 0.10675383, 0.1465067, -0.19432092, -0.27347434, -0.19272803, -0.00467924, 0.16813307, 0.03174194, 0.03681118, 0.12207404, -0.16365911, 0.01676101, 0.28884143, -0.1362595, -0.01413362, 0.0640187, -0.00290764, -0.08968821, -0.06562076, -0.03855459, -0.04742669, -0.17907973, -0.24505056, -0.20147194, -0.17322421, -0.09907816, -0.1774844, -0.17232426, 0.04600691, -0.11030911, 0.19882818, -0.18334828, 0.08060682, -0.19751978, 0.15444238, -0.1564924, -0.02938661, -0.14876589, -0.02421146, -0.02221021, 0.15663463, 0.08073836, 0.28887117, 0.04870383, -0.17562103, 0.03241557, -0.18358599, 0.10095274, 0.01097513, 0.09756496, -0.20801228, -0.09545287, 0.16648073, 0.13132367, -0.00595507, -0.06696107, 0.14315507, 0.04893938, -0.09288485, 0.13636243, -0.14691542, 0.16434048, 0.01410966, -0.06945652, 0.14393893, 0.00253077, 0.01031348, -0.05477588, -0.05727636, 0.05201687, 0.00194674]
+shufflevector:[0.17483364, 0.13115706, -0.18338135, 0.18253379, 0.11080077, 0.19348918, -0.196079, -0.0836405, -0.12688895, -0.15084423, 0.01821721, 0.07461558, -0.16502301, 0.05466224, -0.12936248, -0.18893263, -0.04437944, -0.14436224, -0.014762, 0.01898859, -0.0070331, -0.08453238, -0.24593197, -0.03968965, 0.157458, -0.11371791, -0.0753779, -0.16818443, -0.08551001, -0.13767277, -0.10484876, -0.0528789, 0.06492164, -0.10932673, -0.04854098, -0.02566783, 0.07854476, -0.15017813, 0.17526467, 0.17481187, 0.1716613, -0.17334035, -0.00167675, -0.09324684, -0.04767295, 0.08061834, -0.28809136, 0.04798317, -0.18400045, -0.09304745, -0.1272209, 0.09948572, 0.00988194, 0.16462424, -0.1655161, -0.10226988, 0.17478825, 0.13012879, -0.00379962, -0.02175537, 0.14237158, 0.13957314, 0.2262166, -0.15584967, -0.1981501, 0.12978207, 0.2082821, -0.06961904, 0.1198678, 0.00652868, -0.20552067, 0.11192889, -0.05652459, 0.07463548, 0.2336592]
+sitofp:[-0.29108527, 0.12790772, -0.16100681, 0.17973714, 0.10925914, 0.17328022, -0.19328831, -0.1674593, -0.12717909, -0.1363776, -0.01498309, 0.074142, -0.12664206, 0.12203554, -0.12813628, -0.18627314, 0.04338283, -0.13617095, 0.12641974, 0.01076815, -0.00785737, -0.08199393, -0.24595861, -0.03890288, 0.1529076, -0.15737917, -0.17345259, 0.10036492, -0.14979506, -0.14150459, -0.1664958, -0.16057086, 0.04458313, -0.11036573, -0.0341856, -0.1373805, 0.10106766, -0.15014675, 0.17110193, 0.15770996, 0.16870552, -0.14717673, 0.05119879, 0.0494065, 0.15398785, 0.07942107, -0.13957359, 0.04591445, -0.1819675, 0.22181766, -0.14331876, 0.1173426, 0.00971132, 0.14909846, -0.17786597, -0.10786527, 0.16595513, 0.1297594, -0.00244543, -0.02122716, 0.1410589, 0.09302963, 0.05819383, -0.14059974, -0.17445703, 0.14401363, 0.20743331, -0.07091213, 0.11902855, 0.00150675, -0.00067626, -0.05047701, -0.05693055, 0.06381766, 0.13242699]
+srem:[-0.09511058, -0.22333251, -0.11283466, -0.23229806, 0.09467302, 0.13198733, -0.1751315, -0.27097037, -0.20391029, 0.00244621, 0.1871059, 0.03038308, 0.05424803, 0.05416562, -0.2058974, 0.01789558, 0.03147008, -0.12857653, -0.01066092, 0.07116364, 0.04932972, -0.08006483, -0.05024991, -0.08859668, -0.0507385, -0.18871959, -0.07438382, -0.20066781, -0.19065556, -0.08647687, -0.27900684, -0.05229042, 0.09278244, -0.08365447, 0.20336972, -0.19690502, 0.07637599, -0.20699988, -0.15928416, -0.15538216, -0.03102072, -0.14554623, -0.1659274, 0.06833176, 0.15557079, 0.08088901, 0.16355434, 0.04926935, -0.17034793, 0.03091393, -0.18174136, 0.09605742, 0.01217947, 0.0618361, -0.2140307, -0.03938679, 0.16354196, 0.03456322, 0.20199138, -0.06795325, -0.09788004, 0.04382343, -0.10173707, 0.13628949, -0.14404215, 0.18634076, 0.20419657, -0.06317975, 0.15327744, -0.00050698, 0.01127682, -0.0499315, -0.05773271, 0.05096628, 0.12725323]
+store:[-1.05590612e-01, 1.32598594e-01, -1.54261157e-01, 1.43107131e-01, 9.94813591e-02, 1.45947382e-01, -1.75568134e-01, -1.10561438e-01, -1.27192587e-01, -1.07404411e-01, 1.42010316e-01, 3.02091036e-02, 3.47717851e-02, 4.64678481e-02, -1.27567261e-01, 1.81444604e-02, 2.84991175e-01, -1.33111238e-01, 3.12230974e-01, 1.76632777e-02, -8.96568131e-03, -1.05656721e-01, -6.32665157e-02, -3.84085365e-02, -4.80909348e-02, -1.30426526e-01, -5.79183884e-02, -1.76741526e-01, -1.35157168e-01, -9.92313698e-02, -8.17455873e-02, -4.71966952e-01, 4.39312644e-02, -1.09371774e-01, -3.69049385e-02, -1.49084643e-01, 7.36290291e-02, -1.51506767e-01, 1.73248649e-01, -1.54650167e-01, -3.33715342e-02, -1.48017153e-01, 4.69589196e-02, -9.19863284e-02, 1.55287489e-01, 8.08470696e-02, -1.55509487e-02, 4.79109213e-02, -1.73930481e-01, 2.08546072e-01, -1.45561188e-01, 7.78940469e-02, 1.06241200e-02, 1.51971519e-01, -1.69575423e-01, -1.03343032e-01, 1.64520115e-01, 1.28797293e-01, -5.33816125e-03, -2.58404966e-02, 1.41839057e-01, 9.36184302e-02, -4.41807508e-02, -1.40177250e-01, -1.45344943e-01, 1.64973468e-01, 9.71000548e-03, -7.01929554e-02, 1.18878320e-01, 4.20484517e-04, -1.98174134e-01, 1.80982545e-01, -5.69966733e-02, 5.29081859e-02, 2.81189382e-03]
+structTy:[0.0590105, -0.14963323, 0.14306381, -0.11648162, -0.13216892, -0.14146574, 0.17197067, 0.13388273, 0.14939635, 0.15379034, -0.03590541, 0.16693301, -0.11791866, 0.02428223, 0.14764172, 0.16304608, -0.07464151, 0.16513915, 0.04626357, 0.14785753, -0.16151825, 0.16201071, 0.14255643, -0.15511888, -0.16765755, 0.14808613, -0.01178089, 0.12766574, 0.15551333, -0.00747758, 0.17664994, -0.0148455, -0.13892668, 0.16061294, -0.07150439, 0.14115639, 0.01462318, 0.1346958, -0.03193542, 0.08099027, -0.16465132, 0.15260778, -0.14707021, -0.04599617, -0.14564432, -0.16116522, 0.0183207, 0.1341545, 0.17055003, -0.04925883, 0.16229935, 0.01456681, 0.15151751, -0.16201456, 0.16061835, 0.05757306, -0.07170651, -0.02158798, 0.1654083, 0.15771464, -0.17080092, 0.15839715, 0.11564606, 0.09963245, 0.12658949, -0.14364205, 0.10520593, 0.14662296, -0.1512836, 0.15457897, 0.02865676, 0.00943352, -0.16204782, 0.15784879, -0.05171135]
+sub:[-0.09881721, 0.12537305, -0.13016401, 0.16653623, 0.09798183, 0.13586399, -0.17919166, -0.2497389, -0.1760078, -0.00528205, 0.15304293, 0.02892013, 0.032878, 0.11096786, -0.11947061, 0.01469286, 0.02765922, -0.12512055, -0.01445937, 0.0622199, -0.00616534, -0.09564053, -0.05882335, -0.0359677, -0.04547442, -0.15401107, -0.2463363, -0.18419084, -0.13159917, -0.11247505, -0.11382478, -0.44430435, 0.04172413, -0.10021146, -0.03118592, -0.16559172, 0.07285816, -0.18117833, 0.15983723, -0.14396775, -0.02818411, -0.13687925, -0.01262031, -0.08688642, 0.14433752, 0.0745844, -0.01509091, 0.04397901, -0.16103318, 0.02782912, -0.16809069, 0.09165896, 0.00879955, 0.08927512, -0.18684989, -0.09087317, 0.15303099, 0.12054114, -0.00405373, -0.02580445, 0.13136064, 0.08690883, -0.04755613, -0.12459586, -0.13489048, 0.15286513, 0.01279789, -0.06502793, 0.1124654, 0.00174818, -0.1845721, -0.04667281, -0.05306401, 0.04806401, 0.00305727]
+switch:[0.09548028, 0.09851293, -0.09791192, 0.24275608, 0.14937389, 0.1929901, -0.26087144, -0.14658403, -0.16949812, 0.14262015, 0.14538579, 0.04097397, 0.01518083, -0.07441656, -0.17127606, -0.25440085, 0.10602551, -0.1802303, 0.06275352, 0.01162103, -0.0089239, -0.08309367, -0.08049762, -0.05111814, -0.08784451, -0.15479162, 0.3384307, 0.04873493, -0.15969352, 0.32349157, -0.40701175, 0.36144748, 0.05984428, -0.14377564, 0.26766047, -0.12602505, -0.0529832, -0.20031077, -0.13762884, 0.17910193, 0.22995204, 0.12229605, -0.1505076, -0.1946372, 0.20805524, 0.10786962, -0.26100898, 0.06331249, 0.20925248, -0.22252071, -0.16811611, -0.28236368, 0.01342723, 0.12919533, -0.03879561, -0.13644172, -0.35402858, -0.1292579, -0.00827596, -0.03130217, 0.19059454, 0.01429174, -0.0611405, -0.18895972, -0.15734144, -0.11891826, -0.24520122, -0.06282789, 0.1599826, 0.00474087, 0.01431001, 0.24733992, -0.07526454, -0.39185977, -0.3058426]
+trunc:[-1.36811793e-01, 1.67938128e-01, -1.12058200e-01, 6.62409887e-02, 9.16510969e-02, 1.42627805e-01, -1.72531992e-01, -2.63230264e-01, -1.89903647e-01, -7.43066799e-03, 1.61957592e-01, 3.00346557e-02, 3.52388211e-02, 1.99403167e-01, -1.29218757e-01, 1.84870679e-02, 2.83326745e-01, -1.31465584e-01, 1.91873118e-01, 7.08255842e-02, -5.70347626e-03, -1.06859475e-01, -5.71674518e-02, -8.79198536e-02, -4.90500145e-02, -1.76253095e-01, -2.41765901e-01, -1.98071256e-01, -1.65196046e-01, -9.84440148e-02, -8.40751976e-02, -2.14823738e-01, 4.22967784e-02, -1.08100109e-01, -2.89799571e-02, -1.76890388e-01, 1.99554786e-01, -1.94301888e-01, 1.54805914e-01, -1.54455468e-01, -3.22737806e-02, -1.45465598e-01, -2.85377522e-04, 1.12740539e-01, 1.54975608e-01, 8.14621672e-02, -9.96743236e-03, 5.00754155e-02, -1.70285389e-01, 4.13373224e-02, -1.81011677e-01, 3.25282156e-01, 1.26180872e-02, 1.21963099e-01, -1.98182613e-01, -9.64406803e-02, 1.62552461e-01, 1.30482644e-01, -4.22334485e-03, -3.61689553e-02, 1.39273763e-01, 6.64202794e-02, -4.54185046e-02, 8.14628601e-02, -1.43102348e-01, 1.70172676e-01, 1.54201342e-02, -6.93341419e-02, 1.19819410e-01, -1.10864714e-02, 7.98286218e-03, -5.97647242e-02, -5.83026856e-02, 5.12241088e-02, 2.02081446e-03]
+udiv:[-0.09094892, 0.19416736, -0.11578448, -0.23698431, 0.08992871, 0.00551312, 0.14702776, -0.27541465, -0.20772141, 0.00320542, 0.19159731, -0.01936948, 0.0711722, 0.04869929, -0.20913154, 0.01940354, 0.02099044, -0.10997307, -0.01390613, 0.08852389, 0.09030807, -0.08401795, 0.01092258, -0.09438308, -0.05078439, -0.2005092, -0.0585936, -0.20389175, -0.21060936, -0.09819287, -0.11091644, -0.04329691, -0.17772639, 0.09820999, -0.21181932, -0.20419192, 0.07226628, -0.21055269, -0.16154705, -0.15796861, -0.03205026, -0.11930269, -0.12319315, 0.05126907, 0.15790679, 0.08218154, 0.16767572, 0.09756813, -0.16911054, 0.01490148, -0.18465523, 0.08949899, 0.01290585, -0.01491118, -0.2165934, 0.00616188, 0.165687, 0.16949247, -0.02802533, -0.19512807, -0.10086588, -0.19205898, -0.11844035, 0.13903886, -0.14648019, 0.184539, -0.19000791, -0.06534467, 0.1752777, -0.03921586, 0.01097237, 0.0895052, -0.06099788, 0.05226254, -0.2311955]
+uitofp:[-0.28474295, 0.13217203, -0.16568871, 0.18379283, 0.11226938, 0.19207269, -0.19832176, -0.08162867, -0.12924019, -0.13496576, -0.00762922, 0.07567707, -0.15030566, 0.12156913, -0.1307342, -0.19167385, 0.11801702, -0.14493088, 0.10906817, 0.01311873, -0.01061422, -0.09030879, -0.251764, -0.03967099, 0.1586867, -0.14576115, -0.12991518, 0.10370931, -0.1244427, -0.14580499, -0.06180171, -0.14415021, 0.04207605, -0.11499359, -0.03921367, -0.12659079, 0.07339595, -0.15185502, 0.1766244, 0.17538792, 0.17453255, -0.1522221, 0.05713944, 0.0651423, 0.15804505, 0.08223064, -0.19757104, 0.04586276, -0.18602233, 0.03112394, -0.12740982, 0.10457055, 0.00761122, 0.1563707, -0.14385206, -0.10981123, 0.17529841, 0.1344809, -0.0042707, -0.01513807, 0.14462957, 0.09708796, 0.1768233, -0.15789527, -0.19911379, 0.08259769, 0.04403876, -0.07122029, 0.12193058, 0.00843644, -0.20593181, -0.04928745, -0.05748281, 0.06752896, -0.33122623]
+unreachable:[0.13830788, -0.1384795, 0.12985048, -0.01590925, -0.17242672, -0.16921625, -0.08732756, 0.06238424, -0.19026113, -0.0158169, 0.16435188, 0.02325607, -0.00133849, -0.12819748, -0.15801033, 0.06894314, -0.11699118, -0.03206338, -0.04867816, 0.08262745, -0.02899568, -0.17304559, 0.00456284, -0.1043093, -0.06316522, -0.19096501, 0.10812564, -0.17962073, -0.20548488, 0.1455722, 0.06589094, 0.03311252, -0.07200453, -0.18936579, 0.12057041, -0.19025533, -0.12212797, 0.1456004, -0.14757317, -0.15557618, -0.05640632, 0.14078732, 0.14334233, -0.16418514, 0.14397267, 0.0625571, 0.15891595, 0.07323151, -0.10111858, -0.14292835, 0.01567381, -0.10903962, 0.17538103, 0.08803182, -0.00309126, -0.14454287, 0.0691599, -0.11123948, 0.05696773, 0.09039135, 0.09839866, -0.05023813, -0.03404732, 0.02872319, 0.17865536, 0.13223949, -0.17297149, -0.16898467, 0.14986424, -0.10918473, 0.1600209, 0.15127546, 0.16981383, -0.1279901, 0.14220221]
+urem:[-0.11265117, 0.20686236, -0.12146873, -0.23542368, 0.09378337, 0.02999638, 0.14878128, -0.28188494, -0.20065261, 0.00433275, 0.16977304, -0.01879602, 0.22663146, 0.0617098, -0.1831158, 0.01779491, 0.03017136, -0.08971473, 0.07763614, 0.08042387, 0.09445225, -0.08793671, 0.0159521, -0.07481197, -0.05264295, -0.18723217, -0.08170687, -0.21142115, -0.1702957, -0.0912115, -0.15084253, -0.06110323, -0.1994154, 0.10485501, 0.02635208, -0.17529666, 0.08368196, -0.20547396, -0.13216047, -0.1626017, -0.03278501, -0.12043266, -0.13597806, 0.11791392, 0.16410512, 0.085006, 0.17119788, 0.20151798, 0.22284089, 0.03112911, -0.19075638, 0.10404129, 0.01210428, -0.01493562, -0.21803944, -0.00028815, 0.17211886, 0.1743311, -0.02144206, -0.18241248, 0.09792571, -0.04942631, -0.12507392, 0.14260796, -0.1524944, 0.19653419, -0.20759608, 0.22784927, 0.18324168, -0.03458956, 0.00935992, -0.05326611, -0.07238707, 0.04781368, -0.2394482]
+variable:[-0.04416586, -0.06529783, 0.06804077, -0.17281267, 0.21564505, -0.10317826, -0.04053801, -0.28083235, 0.11455013, -0.25391814, -0.09901162, -0.32934445, 0.22513658, -0.10261232, 0.10434292, -0.19085433, -0.02302103, 0.27024737, -0.11197262, -0.2376181, 0.28228357, 0.15263258, 0.12693042, 0.16975136, 0.29924616, 0.13014257, 0.02674635, -0.10427801, 0.1129915, 0.02840486, 0.17082089, 0.02872703, 0.3129407, 0.14322756, -0.20241754, 0.06491784, -0.08436896, 0.03400991, 0.07390775, -0.07466827, 0.3478845, 0.01303683, 0.26052088, 0.21157041, -0.25165147, -0.18953912, 0.07487449, -0.32147086, -0.072584, 0.20075838, 0.10203002, -0.06976248, -0.22996348, -0.15062493, -0.08361167, 0.1157522, 0.02569508, 0.0058547, -0.1650832, -0.1911111, 0.01633538, -0.13533501, -0.27804825, -0.05999075, 0.02358659, -0.07764025, -0.07134418, 0.14262564, -0.20307393, 0.17827222, 0.13546483, -0.24436948, 0.16881269, -0.08427223, -0.05620972]
+vectorTy:[0.06019246, -0.08325528, 0.06796158, -0.1322501, -0.05250492, -0.05546387, 0.00084803, -0.13031249, 0.10292219, 0.16610621, -0.10459585, 0.21548297, -0.26862848, 0.08505963, 0.07657417, 0.16639674, 0.06083921, -0.00245328, 0.01956977, 0.21975385, -0.16639455, 0.14512713, -0.15006405, -0.2066719, -0.18236274, 0.12637317, -0.09601986, 0.17929196, 0.15004157, -0.2437613, 0.11610509, -0.12576523, -0.13349846, 0.00924278, 0.05477205, 0.11079396, 0.0149577, 0.08251344, 0.02648669, 0.28141958, -0.16844293, 0.02850299, -0.1849258, -0.00724132, -0.19553263, 0.16303328, -0.09641571, -0.08541372, -0.01167152, -0.0498387, 0.13118263, 0.03702982, 0.16826656, -0.12130306, 0.05498985, 0.07180171, 0.01047648, 0.19805974, 0.1132893, 0.12827364, -0.15292895, -0.0969883, 0.15015276, 0.25131726, 0.03910673, -0.12237693, 0.12764196, 0.14949943, -0.11722989, -0.142063, 0.07540323, 0.00866951, -0.16423495, 0.1803801, 0.08819818]
+voidTy:[0.02707169, -0.1911424, 0.18000233, -0.10855684, -0.15720911, -0.16028677, 0.08442728, 0.14063193, 0.14310814, 0.15267418, 0.03571516, 0.17472863, -0.1096759, -0.04809512, 0.15041178, 0.1852203, -0.08891776, 0.06437854, 0.07771051, 0.17514206, -0.18457355, 0.17228611, 0.14382029, 0.17567936, -0.19985509, 0.14512071, 0.00597054, -0.0005212, 0.16043086, 0.01015274, 0.1932167, 0.10049, -0.18615878, -0.14139535, -0.07989334, 0.13810824, 0.00811669, 0.16482183, -0.0484471, 0.05603446, -0.19822212, 0.21622814, -0.13391475, -0.07386104, -0.01220543, -0.17700416, 0.02550385, -0.04609942, 0.19161303, -0.08407282, 0.17597687, 0.01678882, 0.17494556, -0.15565564, 0.18086468, 0.01991182, -0.07939529, -0.04929006, 0.17783763, 0.18024826, -0.14163949, 0.18041377, 0.11955009, 0.00620418, 0.1386835, -0.18642457, 0.09366929, 0.16274834, -0.12151442, -0.19673795, 0.0550727, 0.10491449, 0.14478931, -0.02286906, 0.05187593]
+xor:[-0.14333177, 0.17120288, -0.11569388, -0.22889645, 0.0944928, 0.13705893, -0.1748709, -0.27198055, -0.20403583, -0.00204914, 0.16587155, 0.03005969, 0.03635887, 0.12084309, -0.17170708, 0.01672503, 0.2855867, -0.13425359, 0.2921407, 0.0620962, 0.00266978, -0.0903588, -0.06116274, -0.08814006, -0.04630399, -0.18787035, -0.1754261, -0.20075771, -0.18573092, -0.11999942, -0.14531347, -0.171928, 0.04110451, -0.10397294, -0.03485578, -0.17938605, 0.08046042, -0.19675075, -0.14346175, -0.15566549, -0.0307311, -0.14872791, -0.03878547, -0.00254308, 0.1565295, 0.08097854, 0.16432391, 0.04949491, -0.17471117, 0.2079512, -0.17290911, 0.10197662, 0.01110592, 0.09702181, -0.21049088, -0.05485036, 0.16571115, 0.13224575, -0.00631514, -0.0666507, 0.10324501, 0.04556064, -0.0946413, 0.1366175, -0.14613271, 0.1439316, 0.01403525, -0.06756077, 0.15449193, 0.01570368, 0.00935933, -0.07182793, -0.05895546, 0.05251422, 0.00088228]
+zext:[0.14294301, 0.16004492, -0.133936, 0.17041178, 0.10354671, 0.14033805, -0.18445012, -0.25389433, -0.18157399, -0.06085023, 0.15627292, 0.05945444, 0.0152561, 0.11567469, -0.12275951, 0.01612445, 0.2721165, -0.12822908, 0.29646817, 0.06210494, -0.00723742, -0.1003171, -0.06575806, -0.05716129, -0.04435528, -0.16020222, -0.23530036, -0.18981609, -0.14945146, -0.11926567, -0.08064298, -0.2043876, 0.04202923, -0.10597136, -0.03096929, -0.17040831, 0.0771085, -0.18618186, 0.16527407, -0.14749476, -0.02966438, -0.14139591, 0.0018809, -0.02142575, 0.14795087, 0.07683742, -0.01349613, 0.04579562, -0.17163049, 0.02995836, -0.17292565, 0.11137506, 0.01039091, 0.13139422, -0.19006667, -0.09951284, 0.15722732, 0.12452687, -0.00450555, -0.02189622, 0.13461596, 0.06696767, -0.04037055, -0.13414587, -0.1399019, 0.1544194, 0.01091198, -0.0665535, 0.11422376, 0.00154535, -0.13661395, -0.04903502, -0.05472786, 0.05032588, 0.00220357]


Test patch:
diff --git a/Manylinux2014_Compliant_Source/pkg/tests/test_ir2vec.py b/Manylinux2014_Compliant_Source/pkg/tests/test_ir2vec.py
index 5399eab3f..118bc99ac 100644
--- a/Manylinux2014_Compliant_Source/pkg/tests/test_ir2vec.py
+++ b/Manylinux2014_Compliant_Source/pkg/tests/test_ir2vec.py
@@ -160,7 +160,7 @@ def test_fa_f():
         path = (TEST_SUITE_DIR / file).resolve()
         full_path = str(path).strip()
 
-        initObj = ir2vec.initEmbedding(full_path, "fa", "f")
+        initObj = ir2vec.initEmbedding(full_path, "fa", "f", 300)
         assert initObj is not None
 
         functionVectorMap = ir2vec.getFunctionVectors(initObj)
diff --git a/src/test-suite/CMakeLists.txt b/src/test-suite/CMakeLists.txt
index 335ac7f12..c1e5d114a 100644
--- a/src/test-suite/CMakeLists.txt
+++ b/src/test-suite/CMakeLists.txt
@@ -1,7 +1,7 @@
 option(ENABLE_SQLITE "Enables SQLite Amalgamation Benchmark." ON)
 
 set(SQLITE_LLVM_IR
-    ${CMAKE_CURRENT_SOURCE_DIR}/PE-benchmarks-llfiles-llvm17/sqlite3.ll
+    ${CMAKE_CURRENT_SOURCE_DIR}/sqlite3.ll
 )
 
 # SQLite IR file is added along side other PE-benchmarks for this version
@@ -69,6 +69,7 @@ endif()
 # sanity checks and lit configs
 configure_file(sanity_check.sh.cmake sanity_check.sh @ONLY)
 file(COPY PE-benchmarks-llfiles-llvm17 DESTINATION ./)
+file(COPY sqlite3.ll DESTINATION ./)
 file(COPY oracle DESTINATION ./)
 file(COPY ../../vocabulary DESTINATION ./)
 file(COPY index-llvm17.files DESTINATION ./)
diff --git a/src/test-suite/generateOracle.sh b/src/test-suite/generateOracle.sh
index 61feedc0f..53facd095 100644
--- a/src/test-suite/generateOracle.sh
+++ b/src/test-suite/generateOracle.sh
@@ -4,7 +4,7 @@
 #
 
 SEED_VERSION="llvm17"
-# SRC_WD="PE-benchmarks-llfiles-llvm17
+SQLITE_INPUT=./sqlite3.ll
 DEST_FOLDER_SYM_P="oracle/SYM_${SEED_VERSION}_p"
 DEST_FOLDER_FA_P="oracle/FA_${SEED_VERSION}_p"
 
@@ -52,6 +52,10 @@ while IFS= read -r d; do
 done <index-${SEED_VERSION}.files
 wait
 
+echo "Generating SQL level files"
+${IR2VEC_PATH} -sym -level p -o ${DEST_FOLDER_SYM_P}/sqlite3.txt ${SQLITE_INPUT} &>/dev/null
+${IR2VEC_PATH} -fa -level p -o ${DEST_FOLDER_FA_P}/sqlite3.txt ${SQLITE_INPUT} &>/dev/null
+
 echo "generating F level files"
 while IFS= read -r d; do
 	${IR2VEC_PATH} -sym -level f -o ${DEST_FOLDER_SYM}/ir2vec.txt ${d} &>/dev/null
diff --git a/src/test-suite/oracle/SYM_llvm17_p/sqlite3.txt b/src/test-suite/oracle/SYM_llvm17_p/sqlite3.txt
index 7e5ab73b1..80aeff055 100644
--- a/src/test-suite/oracle/SYM_llvm17_p/sqlite3.txt
+++ b/src/test-suite/oracle/SYM_llvm17_p/sqlite3.txt
@@ -1,1 +1,1 @@
-16914.214172	1840.963612	-8056.768579	21579.305453	-906.262205	-14727.750711	4137.897728	12411.245494	-6586.577729	-37492.964734	-23503.579107	24019.665282	3178.140591	-4723.500753	5407.842244	7912.921167	-3458.007608	3013.286848	-43144.929418	15115.546246	13531.053632	4908.258806	-5820.302126	-7871.660645	3889.551273	-10608.906240	1448.299046	10127.834420	1014.800933	22875.036123	-11217.396606	7132.652507	18359.679961	-541.432431	9754.327113	19447.189792	-5458.297947	1001.803515	1260.266054	429.515246	30198.629348	18262.393044	-3520.028532	10885.129589	9038.867032	23509.461660	-2190.924487	20668.772705	-4464.237518	-15003.251139	10138.776080	7383.103845	-17749.750384	-2971.023222	-14480.273423	9624.178060	19172.138324	8872.303230	-11147.777716	11520.362299	-11789.698651	-2464.035909	7416.324752	381.487262	27537.998172	14634.787225	15946.290784	14708.178722	30142.986762	-11951.156505	-2847.544498	13036.279684	11946.873288	-2281.002892	14178.835480	-9445.563955	-21959.072204	-11427.626110	14.950048	-38164.969681	-15326.407916	-604.005724	40969.720254	-22921.026771	1021.245459	6482.292367	8335.949495	22709.037213	-15671.772052	-634.916992	-16388.880672	-88.372465	-10411.435811	38141.528995	1444.237535	7092.407774	-3015.810814	9673.987822	10480.803898	17367.615576	-5099.230566	-15713.135321	-16277.581293	-37081.163429	-8470.125739	-8772.651484	3261.668365	7589.841179	-31083.117699	-6787.744450	7673.834177	27727.294920	-34264.453388	-1024.019126	18412.358452	9384.182441	16855.866440	7579.575966	-20625.224866	4570.472021	1587.196202	1714.091642	13996.430750	-8729.059297	-1445.531903	-5345.869665	6737.841282	747.071812	5712.435997	1316.571824	-37393.893115	-11137.285625	3457.923217	-7597.644020	934.439596	4310.015852	8189.372290	-13761.423625	12699.496546	-14782.421306	18183.527744	-33691.703352	-517.262789	-11239.399834	-19974.966452	-3504.060581	16885.975472	25761.155805	14053.165475	-6681.317758	-6153.418469	-7325.079859	-30356.658229	-34656.871696	6283.765911	-1758.163001	8988.464773	-1522.551626	-1673.995728	5009.828211	-9656.368676	1426.665633	9335.348034	-11649.556808	-1566.318860	-6295.734684	31544.197891	661.649733	-4830.674434	-14478.650575	-8427.805505	-545.973874	2502.690463	15002.196104	-6300.676337	-33845.085246	-34194.679896	-18256.095681	19120.451916	-4796.204741	-1357.198324	-13606.642437	-3021.046722	-18445.044067	3332.247063	-17445.313795	6821.379552	-1561.129509	-13353.268278	-23115.474322	472.936692	-1898.996769	-9484.504976	-5017.053747	-15333.591479	-5749.949470	18458.335412	4047.862621	8084.542286	3028.814311	1129.188741	-21428.210033	-19353.038396	5786.410664	-7532.951615	21430.806942	19577.147353	459.479687	-18445.971763	-4433.705096	-27620.540913	19828.835893	-17033.978568	4474.063320	-6138.081727	-9289.859715	29276.565507	-13631.410108	-7187.016573	-18083.697502	8781.137185	3854.077762	-34757.682776	32445.021522	20843.803376	-11541.272980	-4382.951260	-1828.406638	2398.068724	18359.047156	21539.259133	-15484.985073	-13341.607581	3250.685126	-6791.923469	-1860.182208	-395.840937	16642.290996	-16803.371117	11532.507834	-15286.484050	-9243.681272	12537.733834	16148.825960	493.864148	8958.987453	-833.191497	-2730.725876	8574.123858	17163.311834	13874.951473	-6250.890749	-19190.295017	-44012.399335	13558.447731	-8566.129714	-6785.466744	-403.105960	-9429.032390	-19264.410796	3993.546581	-5802.231716	24354.598056	802.353023	-11928.318532	16617.764262	-27415.844372	-24580.951602	-13247.186538	2753.917039	-291.838695	-5530.368520	7072.636033	-7053.490037	6451.836519	9084.519734	856.179694	1720.038980	-17071.204665	-10241.571031	-236.670560	18695.744940	8736.999602	-4602.100388	24403.244235	5754.482284	-10343.410231	-6480.548159	858.463332	31.853096	-2285.052285	-20497.891846	-9698.522648	-9221.781745	8000.340915	-9367.694417	14972.296732	1337.978384	1709.723559	9941.290745	
+16914.239737	1840.981802	-8056.817911	21579.296520	-906.316497	-14727.797115	4137.876401	12411.280953	-6586.562078	-37492.964788	-23503.569943	24019.669262	3178.205893	-4723.530913	5407.877824	7912.934175	-3458.056365	3013.332508	-43144.954157	15115.587790	13531.105645	4908.255795	-5820.292873	-7871.662108	3889.509265	-10608.904523	1448.248686	10127.800801	1014.830101	22875.078128	-11217.396718	7132.679162	18359.717864	-541.438802	9754.257737	19447.217860	-5458.309037	1001.817028	1260.314788	429.579484	30198.570108	18262.427973	-3520.038288	10885.075944	9038.812628	23509.483794	-2190.944232	20668.774651	-4464.250265	-15003.294026	10138.764168	7383.131005	-17749.769020	-2971.040689	-14480.221331	9624.128167	19172.139926	8872.318439	-11147.725663	11520.408401	-11789.705205	-2464.030694	7416.382130	381.455867	27538.019036	14634.785688	15946.268038	14708.151110	30142.996306	-11951.106543	-2847.509524	13036.231473	11946.824998	-2281.054380	14178.859285	-9445.563182	-21959.103018	-11427.606841	14.912112	-38164.977695	-15326.420244	-603.970317	40969.728375	-22921.064083	1021.286277	6482.304357	8335.991977	22709.055046	-15671.783603	-634.899949	-16388.840622	-88.332475	-10411.444594	38141.554630	1444.259569	7092.443766	-3015.865027	9673.946988	10480.841084	17367.560567	-5099.253692	-15713.142826	-16277.614827	-37081.121866	-8470.087895	-8772.695145	3261.617294	7589.888150	-31083.167349	-6787.786026	7673.836229	27727.297982	-34264.481233	-1024.028217	18412.394089	9384.169209	16855.899739	7579.575724	-20625.235935	4570.505635	1587.160090	1714.117516	13996.453395	-8729.095252	-1445.557029	-5345.863490	6737.833569	747.055197	5712.422391	1316.527676	-37393.900410	-11137.265844	3457.965800	-7597.648260	934.481986	4310.048412	8189.398913	-13761.396469	12699.444894	-14782.420681	18183.541891	-33691.705523	-517.295608	-11239.351844	-19974.972755	-3504.103564	16885.970313	25761.163018	14053.129381	-6681.360009	-6153.439637	-7325.041675	-30356.665962	-34656.875345	6283.795943	-1758.203649	8988.503016	-1522.547334	-1674.032901	5009.783444	-9656.320812	1426.717636	9335.323929	-11649.579409	-1566.264106	-6295.697504	31544.229203	661.708670	-4830.708982	-14478.667480	-8427.860576	-546.023168	2502.741735	15002.197463	-6300.629787	-33845.061481	-34194.710072	-18256.110279	19120.491248	-4796.227638	-1357.236390	-13606.687977	-3021.077596	-18445.043532	3332.226701	-17445.271984	6821.364180	-1561.079711	-13353.216394	-23115.517049	472.908057	-1899.034310	-9484.498702	-5017.093886	-15333.627221	-5750.003736	18458.345214	4047.839714	8084.505585	3028.808299	1129.165422	-21428.166980	-19353.033854	5786.461144	-7532.987514	21430.789465	19577.137261	459.527968	-18446.000678	-4433.673779	-27620.511413	19828.856589	-17033.992846	4474.089827	-6138.113014	-9289.834124	29276.613087	-13631.383000	-7187.036561	-18083.712847	8781.180054	3854.047879	-34757.666827	32445.019073	20843.795104	-11541.262047	-4382.903431	-1828.347616	2398.051750	18359.092437	21539.233307	-15484.982620	-13341.666013	3250.718549	-6791.955915	-1860.230467	-395.803710	16642.242498	-16803.428262	11532.492267	-15286.435404	-9243.626667	12537.684768	16148.850751	493.906823	8958.963143	-833.235873	-2730.757479	8574.134740	17163.255209	13874.967743	-6250.944147	-19190.288741	-44012.376401	13558.481189	-8566.152492	-6785.430969	-403.129459	-9429.027801	-19264.395602	3993.598922	-5802.239763	24354.552599	802.349434	-11928.311191	16617.765536	-27415.878160	-24581.004090	-13247.229632	2753.975665	-291.792378	-5530.310934	7072.628982	-7053.494335	6451.878346	9084.561345	856.200951	1720.079651	-17071.271865	-10241.539163	-236.615965	18695.779908	8736.988008	-4602.147639	24403.284676	5754.462882	-10343.425092	-6480.598526	858.419776	31.810921	-2285.101590	-20497.857665	-9698.512085	-9221.734122	8000.390882	-9367.662544	14972.344512	1337.949051	1709.686658	9941.308840	
diff --git a/src/test-suite/sanity_check.sh.cmake b/src/test-suite/sanity_check.sh.cmake
index aea01c6f3..db6e9b525 100644
--- a/src/test-suite/sanity_check.sh.cmake
+++ b/src/test-suite/sanity_check.sh.cmake
@@ -48,7 +48,7 @@ perform_vector_comparison() {
     # SQLite specific variables.
     if [[ "$ENABLE_SQLITE" == "ON" ]]; then
         SQLITE_VIR=sqlite3_${FILE_PREFIX}.txt
-        SQLITE_INPUT=./PE-benchmarks-llfiles-${SEED_VERSION}/sqlite3.ll
+        SQLITE_INPUT=./sqlite3.ll
         SQLITE_ORIG=oracle/${EncodingType}_${SEED_VERSION}_${FILE_PREFIX}/sqlite3.txt
     fi