diff --git a/csrc/hasktorch_finalizer.cpp b/csrc/hasktorch_finalizer.cpp
new file mode 100644
--- /dev/null
+++ b/csrc/hasktorch_finalizer.cpp
@@ -0,0 +1,374 @@
+#include "hasktorch_profile.h"
+#include "hasktorch_finalizer.h"
+#include <map>
+
+void delete_tensor(at::Tensor* tensor){
+  delete tensor;
+}
+
+void delete_tensorlist(std::vector<at::Tensor>* tensors){
+  delete tensors;
+}
+
+void delete_tensorindex(at::indexing::TensorIndex* idx){
+  delete idx;
+}
+
+void delete_tensorindexlist(std::vector<at::indexing::TensorIndex>* idxs){
+  delete idxs;
+}
+
+void delete_c10dict(c10::Dict<at::IValue,at::IValue>* object){
+  delete object;
+}
+
+void delete_c10listivalue(c10::List<at::IValue>* object){
+  delete object;
+}
+
+void delete_c10listtensor(c10::List<at::Tensor>* object){
+  delete object;
+}
+
+void delete_c10listoptionaltensor(c10::List<c10::optional<at::Tensor>>* object){
+  delete object;
+}
+
+void delete_c10listdouble(c10::List<double>* object){
+  delete object;
+}
+
+void delete_c10listint(c10::List<int64_t>* object){
+  delete object;
+}
+
+void delete_c10listbool(c10::List<bool>* object){
+  delete object;
+}
+
+void delete_stdvectordouble(std::vector<double>* object){
+  delete object;
+}
+
+void delete_stdvectorint(std::vector<int64_t>* object){
+  delete object;
+}
+
+void delete_stdvectorbool(std::vector<bool>* object){
+  delete object;
+}
+
+void delete_c10tuple(c10::intrusive_ptr<at::ivalue::Tuple>* object){
+  delete object;
+}
+
+void delete_context(at::Context* object){
+  delete object;
+}
+
+void delete_dimname(at::Dimname* object){
+  delete object;
+}
+
+void delete_dimnamelist(std::vector<at::Dimname>* object){
+  delete object;
+}
+
+void delete_generator(at::Generator* object){
+  delete object;
+}
+
+void delete_ivalue(at::IValue* object){
+  delete object;
+}
+
+void delete_ivaluelist(std::vector<at::IValue>* object){
+  delete object;
+}
+
+void delete_intarray(std::vector<int64_t>* object){
+  delete object;
+}
+
+void delete_module(torch::jit::script::Module* object){
+  delete object;
+}
+
+void delete_jitgraph(std::shared_ptr<torch::jit::Graph>* object){
+  delete object;
+}
+
+void delete_jitnode(torch::jit::Node* object){
+  delete object;
+}
+
+void delete_jitvalue(torch::jit::Value* object){
+  delete object;
+}
+
+void delete_scalar(at::Scalar* object){
+  delete object;
+}
+
+void delete_stdarraybool2(std::array<bool,2>* object){
+  delete object;
+}
+
+void delete_stdarraybool3(std::array<bool,3>* object){
+  delete object;
+}
+
+void delete_stdarraybool4(std::array<bool,4>* object){
+  delete object;
+}
+
+void delete_stdstring(std::string* object){
+  delete object;
+}
+
+void delete_storage(at::Storage* object){
+  delete object;
+}
+
+void delete_symbol(at::Symbol* object){
+  delete object;
+}
+
+void delete_tensoroptions(at::TensorOptions* object){
+  delete object;
+}
+
+void delete_tensortensor(std::tuple<at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensortensortensorint64int64int64int64tensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t,int64_t,int64_t,int64_t,at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensortensortensorlist(std::tuple<at::Tensor,at::Tensor,at::Tensor,std::vector<at::Tensor>>* object){
+  delete object;
+}
+
+void delete_tensortensortensortensorint64(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t>* object){
+  delete object;
+}
+
+void delete_tensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensorcdoubleint64(std::tuple<at::Tensor,at::Tensor,double,int64_t>* object){
+  delete object;
+}
+
+void delete_tensortensorint64int64tensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensorint64int64tensortensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensorlisttensor(std::tuple<std::vector<at::Tensor>,at::Tensor>* object){
+  delete object;
+}
+
+void delete_tensortensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>>* object){
+  delete object;
+}
+
+void delete_tensortensorlisttensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>,std::vector<at::Tensor>>* object){
+  delete object;
+}
+
+void delete_tensorlisttensorlisttensorlisttensorlisttensorlist(std::tuple<std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>>* object){
+  delete object;
+}
+
+void delete_cdoubleint64(std::tuple<double,int64_t>* object){
+  delete object;
+}
+
+void delete_cdoublecdouble(std::tuple<double,double>* object){
+  delete object;
+}
+
+void delete_tensorgenerator(std::tuple<at::Tensor,at::Generator>* object){
+  delete object;
+}
+
+void delete_optimizer(torch::optim::Optimizer* object){
+  delete object;
+}
+
+void delete_stream(c10::Stream* object){
+  delete object;
+}
+
+void delete_arrayrefscalar(at::ArrayRef<at::Scalar>* object){
+  delete object;
+}
+
+void delete_vectorscalar(std::vector<at::Scalar>* object){
+  delete object;
+}
+
+std::map<void*,int> objectAge;
+std::map<void*,int> prevObjectAge;
+
+void
+shiftObjectMap(){
+  prevObjectAge = objectAge;
+  objectAge = std::map<void*,int>();
+}
+
+void
+showObject(int flag, void* ptr, void* fptr){
+  auto it = prevObjectAge.find(ptr);
+  int age = 0;
+  if (it != prevObjectAge.end()) {
+    objectAge[ptr] = it->second + 1;
+    age = it->second + 1;
+  } else {
+    objectAge[ptr] = 1;
+    age = 1;
+  }
+  if(flag == 0)
+    return;
+  if(age < flag)
+    return;
+  if(fptr == (void*)delete_tensor){
+    at::Tensor* t = (at::Tensor*) ptr;
+    std::cout << age << ":" << "Tensor " << t->scalar_type() << " " << t->sizes() << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensorlist){
+    std::cout << age << ":" << "[Tensor]" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensorindex){
+    std::cout << age << ":" << "tensorindex" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensorindexlist){
+    std::cout << age << ":" << "[tensorindex]" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10dict){
+    std::cout << age << ":" << "c10dict" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10listivalue){
+    std::cout << age << ":" << "c10listivalue" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10listtensor){
+    std::cout << age << ":" << "c10listtensor" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10listoptionaltensor){
+    std::cout << age << ":" << "c10listoptionaltensor" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10listdouble){
+    std::cout << age << ":" << "c10listdouble" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10listint){
+    std::cout << age << ":" << "c10listint" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10listbool){
+    std::cout << age << ":" << "c10listbool" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stdvectordouble){
+    std::cout << age << ":" << "std::vector<double>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stdvectorint){
+    std::cout << age << ":" << "std::vector<int>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stdvectorbool){
+    std::cout << age << ":" << "std::vector<bool>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_c10tuple){
+    std::cout << age << ":" << "c10tuple" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_context){
+    std::cout << age << ":" << "context" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_dimname){
+    std::cout << age << ":" << "dimname" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_dimnamelist){
+    std::cout << age << ":" << "[dimname]" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_generator){
+    std::cout << age << ":" << "generator" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_ivalue){
+    std::cout << age << ":" << "ivalue" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_ivaluelist){
+    std::cout << age << ":" << "[ivalue]" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_intarray){
+    std::cout << age << ":" << "intarray" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_module){
+    std::cout << age << ":" << "module" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_jitgraph){
+    std::cout << age << ":" << "jitgraph" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_jitnode){
+    std::cout << age << ":" << "jitnode" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_jitvalue){
+    std::cout << age << ":" << "jitvalue" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_scalar){
+    std::cout << age << ":" << "scalar" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stdarraybool2){
+    std::cout << age << ":" << "std::array<bool,2>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stdarraybool3){
+    std::cout << age << ":" << "std::array<bool,3>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stdarraybool4){
+    std::cout << age << ":" << "std::array<bool,4>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stdstring){
+    std::cout << age << ":" << "std::string" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_storage){
+    std::cout << age << ":" << "storage" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_symbol){
+    std::cout << age << ":" << "symbol" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensoroptions){
+    std::cout << age << ":" << "tensoroptions" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensor){
+    std::cout << age << ":" << "(tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensortensortensor){
+    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensortensortensortensor){
+    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensortensortensortensortensor){
+    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensortensorint64int64int64int64tensor){
+    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,int,int,int,int,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensortensorlist){
+    std::cout << age << ":" << "(tensor,tensor,tensor,[tensor])" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensortensorint64){
+    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,int)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensor){
+    std::cout << age << ":" << "(tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensortensortensor){
+    std::cout << age << ":" << "(tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensorcdoubleint64){
+    std::cout << age << ":" << "(tensor,tensor,double,int)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensorint64int64tensor){
+    std::cout << age << ":" << "(tensor,tensor,int,int,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensorint64int64tensortensor){
+    std::cout << age << ":" << "(tensor,tensor,int,int,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensorlisttensor){
+    std::cout << age << ":" << "(tensorlist,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensorlist){
+    std::cout << age << ":" << "(tensor,tensorlist)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensortensorlisttensorlist){
+    std::cout << age << ":" << "(tensor,tensorlist,tensorlist)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensorlisttensorlisttensorlisttensorlisttensorlist){
+    std::cout << age << ":" << "(tensorlist,tensorlist,tensorlist,tensorlist,tensorlist)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_cdoubleint64){
+    std::cout << age << ":" << "(double,int)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_cdoublecdouble){
+    std::cout << age << ":" << "(double,double)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_tensorgenerator){
+    std::cout << age << ":" << "(tensor,generator)" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_optimizer){
+    std::cout << age << ":" << "optimizer" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_stream){
+    std::cout << age << ":" << "stream" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_arrayrefscalar){
+    std::cout << age << ":" << "at::ArrayRef<at::Scalar>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }else if(fptr == (void*)delete_vectorscalar){
+    std::cout << age << ":" << "std::vector<at::Scalar>" << ":" << std::hex << (ptr) << std::dec << std::endl;
+  }
+}
+
diff --git a/csrc/hasktorch_finalizer.h b/csrc/hasktorch_finalizer.h
new file mode 100644
--- /dev/null
+++ b/csrc/hasktorch_finalizer.h
@@ -0,0 +1,132 @@
+#include <ATen/Tensor.h>
+#include <ATen/core/Dict.h>
+#include <ATen/core/List.h>
+#include <ATen/core/ivalue.h>
+#include <ATen/core/Dimname.h>
+#include <ATen/Storage.h>
+#include <ATen/TensorIndexing.h>
+#include <torch/csrc/jit/api/module.h>
+#include <torch/optim.h>
+
+#include <array>
+#include <string>
+#include <tuple>
+#include <vector>
+
+extern "C" {
+  void delete_tensor(at::Tensor* tensor);
+
+  void delete_tensorlist(std::vector<at::Tensor>* tensors);
+
+  void delete_tensorindex(at::indexing::TensorIndex* idx);
+
+  void delete_tensorindexlist(std::vector<at::indexing::TensorIndex>* idxs);
+
+  void delete_c10dict(c10::Dict<at::IValue,at::IValue>* object);
+
+  void delete_c10listivalue(c10::List<at::IValue>* object);
+
+  void delete_c10listtensor(c10::List<at::Tensor>* object);
+
+  void delete_c10listoptionaltensor(c10::List<c10::optional<at::Tensor>>* object);
+
+  void delete_c10listdouble(c10::List<double>* object);
+
+  void delete_c10listint(c10::List<int64_t>* object);
+
+  void delete_c10listbool(c10::List<bool>* object);
+
+  void delete_stdvectordouble(std::vector<double>* object);
+
+  void delete_stdvectorint(std::vector<int64_t>* object);
+
+  void delete_stdvectorbool(std::vector<bool>* object);
+
+  void delete_c10tuple(c10::intrusive_ptr<at::ivalue::Tuple>* object);
+
+  void delete_context(at::Context* object);
+
+  void delete_dimname(at::Dimname* object);
+
+  void delete_dimnamelist(std::vector<at::Dimname>* object);
+
+  void delete_generator(at::Generator* object);
+
+  void delete_ivalue(at::IValue* object);
+
+  void delete_ivaluelist(std::vector<at::IValue>* object);
+
+  void delete_intarray(std::vector<int64_t>* object);
+
+  void delete_module(torch::jit::script::Module* object);
+
+  void delete_jitgraph(std::shared_ptr<torch::jit::Graph>* object);
+
+  void delete_jitnode(torch::jit::Node* object);
+
+  void delete_jitvalue(torch::jit::Value* object);
+
+  void delete_scalar(at::Scalar* object);
+
+  void delete_stdarraybool2(std::array<bool,2>* object);
+
+  void delete_stdarraybool3(std::array<bool,3>* object);
+
+  void delete_stdarraybool4(std::array<bool,4>* object);
+
+  void delete_stdstring(std::string* object);
+
+  void delete_storage(at::Storage* object);
+
+  void delete_symbol(at::Symbol* object);
+
+  void delete_tensoroptions(at::TensorOptions* object);
+
+  void delete_tensortensor(std::tuple<at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensortensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensortensortensortensorint64int64int64int64tensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t,int64_t,int64_t,int64_t,at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensortensortensortensorlist(std::tuple<at::Tensor,at::Tensor,at::Tensor,std::vector<at::Tensor>>* ptr);
+
+  void delete_tensortensortensortensorint64(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t>* ptr);
+
+  void delete_tensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensortensorcdoubleint64(std::tuple<at::Tensor,at::Tensor,double,int64_t>* ptr);
+
+  void delete_tensortensorint64int64tensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor>* ptr);
+
+  void delete_tensortensorint64int64tensortensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor,at::Tensor>* ptr);
+
+  void delete_tensorlisttensor(std::tuple<std::vector<at::Tensor>,at::Tensor>* ptr);
+
+  void delete_tensortensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>>* ptr);
+
+  void delete_tensortensorlisttensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>,std::vector<at::Tensor>>* ptr);
+
+  void delete_tensorlisttensorlisttensorlisttensorlisttensorlist(std::tuple<std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>>* ptr);
+
+  void delete_cdoubleint64(std::tuple<double,int64_t>* ptr);
+
+  void delete_cdoublecdouble(std::tuple<double,double>* ptr);
+
+  void delete_tensorgenerator(std::tuple<at::Tensor,at::Generator>* ptr);
+
+  void delete_optimizer(torch::optim::Optimizer* ptr);
+
+  void delete_stream(c10::Stream* ptr);
+
+  void delete_arrayrefscalar(at::ArrayRef<at::Scalar>* ptr);
+
+  void delete_vectorscalar(std::vector<at::Scalar>* ptr);
+
+#include "hasktorch_dump.h"
+};
diff --git a/csrc/hasktorch_finializer.cpp b/csrc/hasktorch_finializer.cpp
deleted file mode 100644
--- a/csrc/hasktorch_finializer.cpp
+++ /dev/null
@@ -1,374 +0,0 @@
-#include "hasktorch_profile.h"
-#include "hasktorch_finializer.h"
-#include <map>
-
-void delete_tensor(at::Tensor* tensor){
-  delete tensor;
-}
-
-void delete_tensorlist(std::vector<at::Tensor>* tensors){
-  delete tensors;
-}
-
-void delete_tensorindex(at::indexing::TensorIndex* idx){
-  delete idx;
-}
-
-void delete_tensorindexlist(std::vector<at::indexing::TensorIndex>* idxs){
-  delete idxs;
-}
-
-void delete_c10dict(c10::Dict<at::IValue,at::IValue>* object){
-  delete object;
-}
-
-void delete_c10listivalue(c10::List<at::IValue>* object){
-  delete object;
-}
-
-void delete_c10listtensor(c10::List<at::Tensor>* object){
-  delete object;
-}
-
-void delete_c10listoptionaltensor(c10::List<c10::optional<at::Tensor>>* object){
-  delete object;
-}
-
-void delete_c10listdouble(c10::List<double>* object){
-  delete object;
-}
-
-void delete_c10listint(c10::List<int64_t>* object){
-  delete object;
-}
-
-void delete_c10listbool(c10::List<bool>* object){
-  delete object;
-}
-
-void delete_stdvectordouble(std::vector<double>* object){
-  delete object;
-}
-
-void delete_stdvectorint(std::vector<int64_t>* object){
-  delete object;
-}
-
-void delete_stdvectorbool(std::vector<bool>* object){
-  delete object;
-}
-
-void delete_c10tuple(c10::intrusive_ptr<at::ivalue::Tuple>* object){
-  delete object;
-}
-
-void delete_context(at::Context* object){
-  delete object;
-}
-
-void delete_dimname(at::Dimname* object){
-  delete object;
-}
-
-void delete_dimnamelist(std::vector<at::Dimname>* object){
-  delete object;
-}
-
-void delete_generator(at::Generator* object){
-  delete object;
-}
-
-void delete_ivalue(at::IValue* object){
-  delete object;
-}
-
-void delete_ivaluelist(std::vector<at::IValue>* object){
-  delete object;
-}
-
-void delete_intarray(std::vector<int64_t>* object){
-  delete object;
-}
-
-void delete_module(torch::jit::script::Module* object){
-  delete object;
-}
-
-void delete_jitgraph(std::shared_ptr<torch::jit::Graph>* object){
-  delete object;
-}
-
-void delete_jitnode(torch::jit::Node* object){
-  delete object;
-}
-
-void delete_jitvalue(torch::jit::Value* object){
-  delete object;
-}
-
-void delete_scalar(at::Scalar* object){
-  delete object;
-}
-
-void delete_stdarraybool2(std::array<bool,2>* object){
-  delete object;
-}
-
-void delete_stdarraybool3(std::array<bool,3>* object){
-  delete object;
-}
-
-void delete_stdarraybool4(std::array<bool,4>* object){
-  delete object;
-}
-
-void delete_stdstring(std::string* object){
-  delete object;
-}
-
-void delete_storage(at::Storage* object){
-  delete object;
-}
-
-void delete_symbol(at::Symbol* object){
-  delete object;
-}
-
-void delete_tensoroptions(at::TensorOptions* object){
-  delete object;
-}
-
-void delete_tensortensor(std::tuple<at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensortensortensorint64int64int64int64tensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t,int64_t,int64_t,int64_t,at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensortensortensorlist(std::tuple<at::Tensor,at::Tensor,at::Tensor,std::vector<at::Tensor>>* object){
-  delete object;
-}
-
-void delete_tensortensortensortensorint64(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t>* object){
-  delete object;
-}
-
-void delete_tensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensorcdoubleint64(std::tuple<at::Tensor,at::Tensor,double,int64_t>* object){
-  delete object;
-}
-
-void delete_tensortensorint64int64tensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensorint64int64tensortensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensorlisttensor(std::tuple<std::vector<at::Tensor>,at::Tensor>* object){
-  delete object;
-}
-
-void delete_tensortensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>>* object){
-  delete object;
-}
-
-void delete_tensortensorlisttensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>,std::vector<at::Tensor>>* object){
-  delete object;
-}
-
-void delete_tensorlisttensorlisttensorlisttensorlisttensorlist(std::tuple<std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>>* object){
-  delete object;
-}
-
-void delete_cdoubleint64(std::tuple<double,int64_t>* object){
-  delete object;
-}
-
-void delete_cdoublecdouble(std::tuple<double,double>* object){
-  delete object;
-}
-
-void delete_tensorgenerator(std::tuple<at::Tensor,at::Generator>* object){
-  delete object;
-}
-
-void delete_optimizer(torch::optim::Optimizer* object){
-  delete object;
-}
-
-void delete_stream(c10::Stream* object){
-  delete object;
-}
-
-void delete_arrayrefscalar(at::ArrayRef<at::Scalar>* object){
-  delete object;
-}
-
-void delete_vectorscalar(std::vector<at::Scalar>* object){
-  delete object;
-}
-
-std::map<void*,int> objectAge;
-std::map<void*,int> prevObjectAge;
-
-void
-shiftObjectMap(){
-  prevObjectAge = objectAge;
-  objectAge = std::map<void*,int>();
-}
-
-void
-showObject(int flag, void* ptr, void* fptr){
-  auto it = prevObjectAge.find(ptr);
-  int age = 0;
-  if (it != prevObjectAge.end()) {
-    objectAge[ptr] = it->second + 1;
-    age = it->second + 1;
-  } else {
-    objectAge[ptr] = 1;
-    age = 1;
-  }
-  if(flag == 0)
-    return;
-  if(age < flag)
-    return;
-  if(fptr == (void*)delete_tensor){
-    at::Tensor* t = (at::Tensor*) ptr;
-    std::cout << age << ":" << "Tensor " << t->scalar_type() << " " << t->sizes() << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensorlist){
-    std::cout << age << ":" << "[Tensor]" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensorindex){
-    std::cout << age << ":" << "tensorindex" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensorindexlist){
-    std::cout << age << ":" << "[tensorindex]" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10dict){
-    std::cout << age << ":" << "c10dict" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10listivalue){
-    std::cout << age << ":" << "c10listivalue" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10listtensor){
-    std::cout << age << ":" << "c10listtensor" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10listoptionaltensor){
-    std::cout << age << ":" << "c10listoptionaltensor" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10listdouble){
-    std::cout << age << ":" << "c10listdouble" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10listint){
-    std::cout << age << ":" << "c10listint" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10listbool){
-    std::cout << age << ":" << "c10listbool" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stdvectordouble){
-    std::cout << age << ":" << "std::vector<double>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stdvectorint){
-    std::cout << age << ":" << "std::vector<int>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stdvectorbool){
-    std::cout << age << ":" << "std::vector<bool>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_c10tuple){
-    std::cout << age << ":" << "c10tuple" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_context){
-    std::cout << age << ":" << "context" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_dimname){
-    std::cout << age << ":" << "dimname" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_dimnamelist){
-    std::cout << age << ":" << "[dimname]" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_generator){
-    std::cout << age << ":" << "generator" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_ivalue){
-    std::cout << age << ":" << "ivalue" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_ivaluelist){
-    std::cout << age << ":" << "[ivalue]" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_intarray){
-    std::cout << age << ":" << "intarray" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_module){
-    std::cout << age << ":" << "module" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_jitgraph){
-    std::cout << age << ":" << "jitgraph" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_jitnode){
-    std::cout << age << ":" << "jitnode" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_jitvalue){
-    std::cout << age << ":" << "jitvalue" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_scalar){
-    std::cout << age << ":" << "scalar" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stdarraybool2){
-    std::cout << age << ":" << "std::array<bool,2>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stdarraybool3){
-    std::cout << age << ":" << "std::array<bool,3>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stdarraybool4){
-    std::cout << age << ":" << "std::array<bool,4>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stdstring){
-    std::cout << age << ":" << "std::string" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_storage){
-    std::cout << age << ":" << "storage" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_symbol){
-    std::cout << age << ":" << "symbol" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensoroptions){
-    std::cout << age << ":" << "tensoroptions" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensor){
-    std::cout << age << ":" << "(tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensortensortensor){
-    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensortensortensortensor){
-    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensortensortensortensortensor){
-    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensortensorint64int64int64int64tensor){
-    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,int,int,int,int,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensortensorlist){
-    std::cout << age << ":" << "(tensor,tensor,tensor,[tensor])" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensortensorint64){
-    std::cout << age << ":" << "(tensor,tensor,tensor,tensor,int)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensor){
-    std::cout << age << ":" << "(tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensortensortensor){
-    std::cout << age << ":" << "(tensor,tensor,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensorcdoubleint64){
-    std::cout << age << ":" << "(tensor,tensor,double,int)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensorint64int64tensor){
-    std::cout << age << ":" << "(tensor,tensor,int,int,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensorint64int64tensortensor){
-    std::cout << age << ":" << "(tensor,tensor,int,int,tensor,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensorlisttensor){
-    std::cout << age << ":" << "(tensorlist,tensor)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensorlist){
-    std::cout << age << ":" << "(tensor,tensorlist)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensortensorlisttensorlist){
-    std::cout << age << ":" << "(tensor,tensorlist,tensorlist)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensorlisttensorlisttensorlisttensorlisttensorlist){
-    std::cout << age << ":" << "(tensorlist,tensorlist,tensorlist,tensorlist,tensorlist)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_cdoubleint64){
-    std::cout << age << ":" << "(double,int)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_cdoublecdouble){
-    std::cout << age << ":" << "(double,double)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_tensorgenerator){
-    std::cout << age << ":" << "(tensor,generator)" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_optimizer){
-    std::cout << age << ":" << "optimizer" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_stream){
-    std::cout << age << ":" << "stream" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_arrayrefscalar){
-    std::cout << age << ":" << "at::ArrayRef<at::Scalar>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }else if(fptr == (void*)delete_vectorscalar){
-    std::cout << age << ":" << "std::vector<at::Scalar>" << ":" << std::hex << (ptr) << std::dec << std::endl;
-  }
-}
-
diff --git a/csrc/hasktorch_finializer.h b/csrc/hasktorch_finializer.h
deleted file mode 100644
--- a/csrc/hasktorch_finializer.h
+++ /dev/null
@@ -1,132 +0,0 @@
-#include <ATen/Tensor.h>
-#include <ATen/core/Dict.h>
-#include <ATen/core/List.h>
-#include <ATen/core/ivalue.h>
-#include <ATen/core/Dimname.h>
-#include <ATen/Storage.h>
-#include <ATen/TensorIndexing.h>
-#include <torch/csrc/jit/api/module.h>
-#include <torch/optim.h>
-
-#include <array>
-#include <string>
-#include <tuple>
-#include <vector>
-
-extern "C" {
-  void delete_tensor(at::Tensor* tensor);
-
-  void delete_tensorlist(std::vector<at::Tensor>* tensors);
-
-  void delete_tensorindex(at::indexing::TensorIndex* idx);
-
-  void delete_tensorindexlist(std::vector<at::indexing::TensorIndex>* idxs);
-
-  void delete_c10dict(c10::Dict<at::IValue,at::IValue>* object);
-
-  void delete_c10listivalue(c10::List<at::IValue>* object);
-
-  void delete_c10listtensor(c10::List<at::Tensor>* object);
-
-  void delete_c10listoptionaltensor(c10::List<c10::optional<at::Tensor>>* object);
-
-  void delete_c10listdouble(c10::List<double>* object);
-
-  void delete_c10listint(c10::List<int64_t>* object);
-
-  void delete_c10listbool(c10::List<bool>* object);
-
-  void delete_stdvectordouble(std::vector<double>* object);
-
-  void delete_stdvectorint(std::vector<int64_t>* object);
-
-  void delete_stdvectorbool(std::vector<bool>* object);
-
-  void delete_c10tuple(c10::intrusive_ptr<at::ivalue::Tuple>* object);
-
-  void delete_context(at::Context* object);
-
-  void delete_dimname(at::Dimname* object);
-
-  void delete_dimnamelist(std::vector<at::Dimname>* object);
-
-  void delete_generator(at::Generator* object);
-
-  void delete_ivalue(at::IValue* object);
-
-  void delete_ivaluelist(std::vector<at::IValue>* object);
-
-  void delete_intarray(std::vector<int64_t>* object);
-
-  void delete_module(torch::jit::script::Module* object);
-
-  void delete_jitgraph(std::shared_ptr<torch::jit::Graph>* object);
-
-  void delete_jitnode(torch::jit::Node* object);
-
-  void delete_jitvalue(torch::jit::Value* object);
-
-  void delete_scalar(at::Scalar* object);
-
-  void delete_stdarraybool2(std::array<bool,2>* object);
-
-  void delete_stdarraybool3(std::array<bool,3>* object);
-
-  void delete_stdarraybool4(std::array<bool,4>* object);
-
-  void delete_stdstring(std::string* object);
-
-  void delete_storage(at::Storage* object);
-
-  void delete_symbol(at::Symbol* object);
-
-  void delete_tensoroptions(at::TensorOptions* object);
-
-  void delete_tensortensor(std::tuple<at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensortensortensortensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensortensortensortensorint64int64int64int64tensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t,int64_t,int64_t,int64_t,at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensortensortensortensorlist(std::tuple<at::Tensor,at::Tensor,at::Tensor,std::vector<at::Tensor>>* ptr);
-
-  void delete_tensortensortensortensorint64(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor,int64_t>* ptr);
-
-  void delete_tensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensortensortensortensor(std::tuple<at::Tensor,at::Tensor,at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensortensorcdoubleint64(std::tuple<at::Tensor,at::Tensor,double,int64_t>* ptr);
-
-  void delete_tensortensorint64int64tensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor>* ptr);
-
-  void delete_tensortensorint64int64tensortensor(std::tuple<at::Tensor,at::Tensor,int64_t,int64_t,at::Tensor,at::Tensor>* ptr);
-
-  void delete_tensorlisttensor(std::tuple<std::vector<at::Tensor>,at::Tensor>* ptr);
-
-  void delete_tensortensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>>* ptr);
-
-  void delete_tensortensorlisttensorlist(std::tuple<at::Tensor,std::vector<at::Tensor>,std::vector<at::Tensor>>* ptr);
-
-  void delete_tensorlisttensorlisttensorlisttensorlisttensorlist(std::tuple<std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>,std::vector<at::Tensor>>* ptr);
-
-  void delete_cdoubleint64(std::tuple<double,int64_t>* ptr);
-
-  void delete_cdoublecdouble(std::tuple<double,double>* ptr);
-
-  void delete_tensorgenerator(std::tuple<at::Tensor,at::Generator>* ptr);
-
-  void delete_optimizer(torch::optim::Optimizer* ptr);
-
-  void delete_stream(c10::Stream* ptr);
-
-  void delete_arrayrefscalar(at::ArrayRef<at::Scalar>* ptr);
-
-  void delete_vectorscalar(std::vector<at::Scalar>* ptr);
-
-#include "hasktorch_dump.h"
-};
diff --git a/libtorch-ffi.cabal b/libtorch-ffi.cabal
--- a/libtorch-ffi.cabal
+++ b/libtorch-ffi.cabal
@@ -1,6 +1,6 @@
 cabal-version:       3.0
 name:                libtorch-ffi
-version:             2.0.1.3
+version:             2.0.1.5
 -- The prefix(2.0) of this version("2.0.0.0") is the same as libtorch's one.
 synopsis:            Haskell bindings for PyTorch
 description:         This package provides Haskell bindings to libtorch, the C++ library underlying PyTorch, specifically designed for the Hasktorch ecosystem.
@@ -180,9 +180,9 @@
     ghc-options:       -optcxx-std=c++17
  default-extensions:          Strict
                             , StrictData
- cxx-sources:          csrc/hasktorch_finializer.cpp
+ cxx-sources:          csrc/hasktorch_finalizer.cpp
  c-sources:            csrc/hasktorch_dump.c
- install-includes:     csrc/hasktorch_finializer.h
+ install-includes:     csrc/hasktorch_finalizer.h
                       ,csrc/hasktorch_dump.h
                       ,csrc/hasktorch_profile.h
  include-dirs:         csrc
diff --git a/src/Torch/Internal/Managed/Native/Native10.hs b/src/Torch/Internal/Managed/Native/Native10.hs
--- a/src/Torch/Internal/Managed/Native/Native10.hs
+++ b/src/Torch/Internal/Managed/Native/Native10.hs
@@ -426,13 +426,13 @@
   -> IO (ForeignPtr Tensor)
 upsample_nearest2d_out_ttldd = _cast5 Unmanaged.upsample_nearest2d_out_ttldd
 
-upsample_nearest2d_out_ttld
-  :: ForeignPtr Tensor
-  -> ForeignPtr Tensor
-  -> ForeignPtr IntArray
-  -> CDouble
-  -> IO (ForeignPtr Tensor)
-upsample_nearest2d_out_ttld = _cast4 Unmanaged.upsample_nearest2d_out_ttld
+-- upsample_nearest2d_out_ttld
+--   :: ForeignPtr Tensor
+--   -> ForeignPtr Tensor
+--   -> ForeignPtr IntArray
+--   -> CDouble
+--   -> IO (ForeignPtr Tensor)
+-- upsample_nearest2d_out_ttld = _cast4 Unmanaged.upsample_nearest2d_out_ttld
 
 upsample_nearest2d_out_ttl
   :: ForeignPtr Tensor
diff --git a/src/Torch/Internal/Managed/Native/Native9.hs b/src/Torch/Internal/Managed/Native/Native9.hs
--- a/src/Torch/Internal/Managed/Native/Native9.hs
+++ b/src/Torch/Internal/Managed/Native/Native9.hs
@@ -2079,14 +2079,14 @@
   -> IO (ForeignPtr Tensor)
 upsample_bilinear2d_out_ttlbdd = _cast6 Unmanaged.upsample_bilinear2d_out_ttlbdd
 
-upsample_bilinear2d_out_ttlbd
-  :: ForeignPtr Tensor
-  -> ForeignPtr Tensor
-  -> ForeignPtr IntArray
-  -> CBool
-  -> CDouble
-  -> IO (ForeignPtr Tensor)
-upsample_bilinear2d_out_ttlbd = _cast5 Unmanaged.upsample_bilinear2d_out_ttlbd
+-- upsample_bilinear2d_out_ttlbd
+--   :: ForeignPtr Tensor
+--   -> ForeignPtr Tensor
+--   -> ForeignPtr IntArray
+--   -> CBool
+--   -> CDouble
+--   -> IO (ForeignPtr Tensor)
+-- upsample_bilinear2d_out_ttlbd = _cast5 Unmanaged.upsample_bilinear2d_out_ttlbd
 
 upsample_bilinear2d_out_ttlb
   :: ForeignPtr Tensor
diff --git a/src/Torch/Internal/Unmanaged/Native/Native10.hs b/src/Torch/Internal/Unmanaged/Native/Native10.hs
--- a/src/Torch/Internal/Unmanaged/Native/Native10.hs
+++ b/src/Torch/Internal/Unmanaged/Native/Native10.hs
@@ -746,19 +746,19 @@
   , $(double _scales_w)));
   }|]
 
-upsample_nearest2d_out_ttld
-  :: Ptr Tensor
-  -> Ptr Tensor
-  -> Ptr IntArray
-  -> CDouble
-  -> IO (Ptr Tensor)
-upsample_nearest2d_out_ttld _out _self _output_size _scales_h =
-  [C.throwBlock| at::Tensor* { return new at::Tensor(at::upsample_nearest2d_out(
-    *$(at::Tensor* _out)
-  , *$(at::Tensor* _self)
-  , *$(std::vector<int64_t>* _output_size)
-  , $(double _scales_h)));
-  }|]
+-- upsample_nearest2d_out_ttld
+--   :: Ptr Tensor
+--   -> Ptr Tensor
+--   -> Ptr IntArray
+--   -> CDouble
+--   -> IO (Ptr Tensor)
+-- upsample_nearest2d_out_ttld _out _self _output_size _scales_h =
+--   [C.throwBlock| at::Tensor* { return new at::Tensor(at::upsample_nearest2d_out(
+--     *$(at::Tensor* _out)
+--   , *$(at::Tensor* _self)
+--   , *$(std::vector<int64_t>* _output_size)
+--   , $(double _scales_h)));
+--   }|]
 
 upsample_nearest2d_out_ttl
   :: Ptr Tensor
diff --git a/src/Torch/Internal/Unmanaged/Native/Native9.hs b/src/Torch/Internal/Unmanaged/Native/Native9.hs
--- a/src/Torch/Internal/Unmanaged/Native/Native9.hs
+++ b/src/Torch/Internal/Unmanaged/Native/Native9.hs
@@ -3622,21 +3622,21 @@
   , $(double _scales_w)));
   }|]
 
-upsample_bilinear2d_out_ttlbd
-  :: Ptr Tensor
-  -> Ptr Tensor
-  -> Ptr IntArray
-  -> CBool
-  -> CDouble
-  -> IO (Ptr Tensor)
-upsample_bilinear2d_out_ttlbd _out _self _output_size _align_corners _scales_h =
-  [C.throwBlock| at::Tensor* { return new at::Tensor(at::upsample_bilinear2d_out(
-    *$(at::Tensor* _out)
-  , *$(at::Tensor* _self)
-  , *$(std::vector<int64_t>* _output_size)
-  , $(bool _align_corners)
-  , $(double _scales_h)));
-  }|]
+-- upsample_bilinear2d_out_ttlbd
+--   :: Ptr Tensor
+--   -> Ptr Tensor
+--   -> Ptr IntArray
+--   -> CBool
+--   -> CDouble
+--   -> IO (Ptr Tensor)
+-- upsample_bilinear2d_out_ttlbd _out _self _output_size _align_corners _scales_h =
+--   [C.throwBlock| at::Tensor* { return new at::Tensor(at::upsample_bilinear2d_out(
+--     *$(at::Tensor* _out)
+--   , *$(at::Tensor* _self)
+--   , *$(std::vector<int64_t>* _output_size)
+--   , $(bool _align_corners)
+--   , $(double _scales_h)));
+--   }|]
 
 upsample_bilinear2d_out_ttlb
   :: Ptr Tensor
diff --git a/src/Torch/Internal/Unmanaged/Type/Generator.hs b/src/Torch/Internal/Unmanaged/Type/Generator.hs
--- a/src/Torch/Internal/Unmanaged/Type/Generator.hs
+++ b/src/Torch/Internal/Unmanaged/Type/Generator.hs
@@ -28,6 +28,7 @@
 C.include "<ATen/detail/MPSHooksInterface.h>"
 C.include "<ATen/CPUGeneratorImpl.h>"
 C.include "<ATen/core/Generator.h>"
+C.include "<torch/version.h>"
 
 C.include "<vector>"
 
@@ -116,14 +117,23 @@
   :: Word16
   -> IO (Ptr Generator)
 getDefaultCUDAGenerator _device_index =
-  [C.throwBlock| at::Generator* { return new at::Generator(at::detail::getCUDAHooks().getDefaultCUDAGenerator(
-    $(uint16_t _device_index)));
+  [C.throwBlock| at::Generator* {
+#if TORCH_VERSION_MAJOR == 2 && TORCH_VERSION_MINOR < 7
+return new at::Generator(at::detail::getCUDAHooks().getDefaultCUDAGenerator($(uint16_t _device_index)));
+#else
+return new at::Generator(at::detail::getCUDAHooks().getDefaultGenerator($(uint16_t _device_index)));
+#endif
   }|]
 
 getDefaultMPSGenerator
   :: IO (Ptr Generator)
 getDefaultMPSGenerator =
-  [C.throwBlock| at::Generator* { return new at::Generator(at::detail::getMPSHooks().getDefaultMPSGenerator());
+  [C.throwBlock| at::Generator* {
+#if TORCH_VERSION_MAJOR == 2 && TORCH_VERSION_MINOR < 7
+return new at::Generator(at::detail::getMPSHooks().getDefaultMPSGenerator());
+#else
+return new at::Generator(at::detail::getMPSHooks().getDefaultGenerator());
+#endif
   }|]
 
 getDefaultCPUGenerator
