# Objective:
This work aims to use a library for computing with tensors (multi-dimensional arrays) in both C++ and Python. It will help to easily write new Python code in C++ and to perform convolution operations in C++. Functions implemented include adding, subtracting, multiplying tensors, applying ReLU, smoothing, and changing tensor shapes. This work will also work on calculations involving tensors and linear operations, combining elements to find the maximum, and a two-dimensional operation. In the future, we'll use this for training data with MLP and CNN models.

## Software architecture:
This work will be divided into two parts. First, we will use Python to do tensor operations and then do the same using C++. In the second part, we will use Python to use the files created by compiling C++, to see if the C++ part was done correctly.

## Details:

### Project 1:
This project will use Python to practice some basic features of NumPy and EasyNN. EasyNN helps us set up and use a data-flow graph in Python, which shows complex processes like machine learning algorithms. We will also learn how to test this graph with specific inputs.

### Project 2:
This project will implement scalar operations for EasyNN in C++, and the ctypes library is utilized to bridge Python and C++ code.

### Project 3:
This project will implement tensor operations for EasyNN in C++. It will be implemented using the prototype pattern. We will reuse code with a base class for each evaluation operation. Evaluation operations will utilize the tensor classes operator overloads that we will define and implement for each operation required.

### Project 4:
This project will implement the tensor operations to support inference with multilayer perceptron (MLP) and with convolutional neural network (CNN) for EasyNN in C++.

### Project 5:
This project will implement the backprop algorithm together with SGD to train the MLP model

### Project 6:
This project will implement the backprop algorithm together with SGD to train the CNN model.
