<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="style.css">
     <script src="//cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"></script>
  </head>
  <body>
    <h1>Hello Plunker!</h1>
    <script src="script.js"></script>
  </body>
</html>






tf.setBackend('cpu');
let index2alphabet = [];
let alphabet2vector = {};
let trainXArray = [], 
  trainYArray = [];
for (let i = 0; i < 26; i++) 
{
  index2alphabet[i] = String.fromCharCode('a'.charCodeAt(0) + i);
}
for (let i = 0; i < 26; i++) 
{
  alphabet2vector[index2alphabet[i]] = Array(26).fill(0);
  alphabet2vector[index2alphabet[i]][i] = 1.0;
}
trainXArray.push([alphabet2vector['y'], alphabet2vector['z']]);
trainYArray.push(alphabet2vector['a']);
trainXArray.push([alphabet2vector['z'], alphabet2vector['a']]);
trainYArray.push(alphabet2vector['b']);
for (let i = 0; i < 26 - 2; i++)
{
  trainXArray.push([alphabet2vector[index2alphabet[i]], alphabet2vector[index2alphabet[i + 1]]]);
  trainYArray.push(alphabet2vector[index2alphabet[i + 2]]);
}
const trainX = tf.tensor3d(trainXArray);
const trainY = tf.tensor2d(trainYArray);

const model = tf.sequential();
model.add(tf.layers.lstm({ 
  units: 64,
  returnSequences: false,
  inputShape: [2, 26]
}));
model.add(tf.layers.dense({
  units: 64, 
  activation: "relu"
}));
model.add(tf.layers.dense({
  units: 26, 
  activation: "softmax"
}));
model.compile({
  optimizer: 'adam',
  loss: 'categoricalCrossentropy'
});
model.fit(trainX, trainY, {
  epochs: 260,
  verbose: 0,
  validationData: [trainX, trainY],
}).then((d) => {
  var str = "loss = ";
	str += d.history.loss[0];
	alert(str);
  let i = 0;
  let p0 = 'y';
  let p1 = 'z';
  for (i = 0; i < 26; i++)
  {
    const testX = tf.tensor3d([[alphabet2vector[p0], alphabet2vector[p1]]], [1, 2, 26]);
    const predicts = model.predict(testX);
    const predictsArray = predicts.argMax().arraySync();
    //alert(predictsArray);
    const predictAlphabet = String.fromCharCode('a'.charCodeAt(0) + predictsArray[0]);
    document.write(predictAlphabet);
    p0 = p1;
    p1 = predictAlphabet;
    //alert(p0 + ' ' + p1)
  }
});




/* Styles go here */