private readonly double[,] W_i;
private readonly double[,] W_f;
private readonly double[,] W_c;
private readonly double[,] W_o;
private readonly double[] b_i;
private readonly double[] b_f;
private readonly double[] b_c;
private readonly double[] b_o;
private const int HiddenStateSize = 1;
private const int InputSize = 1;
W_i = InitializeMatrix(HiddenStateSize + InputSize, HiddenStateSize, 0.5);
W_f = InitializeMatrix(HiddenStateSize + InputSize, HiddenStateSize, 0.5);
W_c = InitializeMatrix(HiddenStateSize + InputSize, HiddenStateSize, HiddenStateSize, 0.5);
W_o = InitializeMatrix(HiddenStateSize + InputSize, HiddenStateSize, HiddenStateSize, 0.5);
b_i = InitializeArray(HiddenStateSize, 0.5);
b_f = InitializeArray(HiddenStateSize, 0.5);
b_c = InitializeArray(HiddenStateSize, 0.5);
b_o = InitializeArray(HiddenStateSize, 0.5);
private double[,] InitializeMatrix(int rows, int cols, double value)
double[,] matrix = new double[rows, cols];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
private double[,] InitializeMatrix(int rows, int colsOuter, int colsInner, double value)
double[,] matrix = new double[rows, colsInner];
for (int i = 0; i < rows; i++)
for (int j = 0; j < colsInner; j++)
private double[] InitializeArray(int size, double value)
double[] array = new double[size];
for (int i = 0; i < size; i++)
private double Sigmoid(double x)
return 1 / (1 + Math.Exp(-x));
private double Tanh(double x)
public double Process(double input, double previousHiddenState, double previousCellState)
double[] concat = new double[] { previousHiddenState, input };
double i_t = Sigmoid(MatrixVectorMultiply(W_i, concat)[0] + b_i[0]);
double f_t = Sigmoid(MatrixVectorMultiply(W_f, concat)[0] + b_f[0]);
double c_tilda = Tanh(MatrixVectorMultiply(W_c, concat)[0] + b_c[0]);
double c_t = f_t * previousCellState + i_t * c_tilda;
double o_t = Sigmoid(MatrixVectorMultiply(W_o, concat)[0] + b_o[0]);
double h_t = o_t * Tanh(c_t);
private double[] MatrixVectorMultiply(double[,] matrix, double[] vector)
int rows = matrix.GetLength(0);
int cols = matrix.GetLength(1);
if (vector.Length != rows)
throw new ArgumentException("Matrix and vector dimensions are incompatible.");
double[] result = new double[cols];
for (int j = 0; j < cols; j++)
for (int i = 0; i < rows; i++)
sum += matrix[i, j] * vector[i];
public static void Main(string[] args)
LSTMCell lstmCell = new LSTMCell();
double previousHiddenState = 0.2;
double previousCellState = 0.1;
double newHiddenState = lstmCell.Process(input, previousHiddenState, previousCellState);
Console.WriteLine($"Input: {input}");
Console.WriteLine($"Previous Hidden State: {previousHiddenState}");
Console.WriteLine($"Previous Cell State: {previousCellState}");
Console.WriteLine($"New Hidden State: {newHiddenState}");