{ "cells": [ { "cell_type": "raw", "metadata": { "vscode": { "languageId": "raw" } }, "source": [ "\n", " \"Open\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# State Variables" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:11:23.226134Z", "start_time": "2025-04-27T17:11:21.482265Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-- nnodely_v1.5.0 --<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n" ] } ], "source": [ "# uncomment the command below to install the nnodely package\n", "#!pip install nnodely\n", "\n", "from nnodely import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## State Definition\n", "\n", "Use the keyword 'State' to define a state variable (like you will do for an Input). You can specify the dimension of the variable." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:11:24.014202Z", "start_time": "2025-04-27T17:11:24.010047Z" } }, "outputs": [], "source": [ "clearNames('x_state')\n", "x_state = Input('x_state', dimensions=1)\n", "x_out = Fir(x_state.tw(0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Closed Loop\n", "\n", "Every relation inside NNodely can update a state variable. closing a state in a loop means that at the end of each forward pass the result of the selected relation will update the selected state variable." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:11:26.299743Z", "start_time": "2025-04-27T17:11:26.296438Z" } }, "outputs": [], "source": [ "clearNames('out')\n", "x_out.closedLoop(x_state)\n", "out = Output('out',x_out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or you can use the ClosedLoop block" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:11:29.183102Z", "start_time": "2025-04-27T17:11:29.179045Z" } }, "outputs": [], "source": [ "clearNames('out')\n", "x_out = ClosedLoop(x_out, x_state)\n", "out = Output('out',x_out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Connect\n", "\n", "Every relation inside NNodely can update a state variable. connecting a relation to a state means that at each forward pass the result of the selected relation will immediately update the selected state variable.\n", "\n", "(Note: you must re-define the relation in order to change the update of the state variable)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:11:33.153743Z", "start_time": "2025-04-27T17:11:33.148619Z" } }, "outputs": [], "source": [ "clearNames()\n", "x_out = Fir(x_state.tw(0.5))\n", "x_out.connect(x_state)\n", "out = Output('out',x_out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or you can use the Connect block" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:11:35.643119Z", "start_time": "2025-04-27T17:11:35.640337Z" } }, "outputs": [], "source": [ "clearNames('out')\n", "x_out = Connect(x_out, x_state)\n", "out = Output('out',x_out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Connect two models together" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:19:32.339489Z", "start_time": "2025-04-27T17:19:32.267511Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {},\n", " 'Functions': {},\n", " 'Info': {'SampleTime': 0.1,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'num_parameters': 7},\n", " 'Inputs': {'a': {'dim': 1,\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'sw': [-1, 0],\n", " 'tw': [-0.5, 0]},\n", " 'b_t': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]}},\n", " 'Minimizers': {'b_min': {'A': 'Add47', 'B': 'SamplePart49', 'loss': 'mse'}},\n", " 'Models': 'b_model',\n", " 'Outputs': {'b': 'Add47'},\n", " 'Parameters': {'A': {'dim': [1, 1], 'values': [[0.600895345211029]]},\n", " 'B': {'dim': 1,\n", " 'tw': 0.5,\n", " 'values': [[0.8822692632675171],\n", " [0.9150039553642273],\n", " [0.38286375999450684],\n", " [0.9593056440353394],\n", " [0.3904482126235962]]},\n", " 'shared': {'dim': [1, 1], 'values': [[0.2565724849700928]]}},\n", " 'Relations': {'Add47': ['Add', ['Linear42', 'Linear46']],\n", " 'Fir45': ['Fir', ['TimePart44'], 'B', None, 0],\n", " 'Linear42': ['Linear', ['SamplePart41'], 'shared', None, 0],\n", " 'Linear46': ['Linear', ['Fir45'], 'A', None, 0],\n", " 'SamplePart41': ['SamplePart', ['a'], -1, [-1, 0]],\n", " 'SamplePart49': ['SamplePart', ['b_t'], -1, [-1, 0]],\n", " 'TimePart44': ['TimePart', ['a'], -1, [-0.5, 0]]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {},\n", " 'Functions': {},\n", " 'Info': {'SampleTime': 0.1,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'num_parameters': 15},\n", " 'Inputs': {'a': {'dim': 1,\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'sw': [-1, 0],\n", " 'tw': [-0.5, 0]},\n", " 'b_in': {'dim': 1, 'ns': [3, 0], 'ntot': 3, 'tw': [-0.3, 0]},\n", " 'b_t': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]},\n", " 'c': {'dim': 1,\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'sw': [-1, 0],\n", " 'tw': [-0.5, 0]},\n", " 'd_t': {'dim': 1, 'ns': [1, 0], 'ntot': 1, 'sw': [-1, 0]}},\n", " 'Minimizers': {'b_min': {'A': 'Add47', 'B': 'SamplePart49', 'loss': 'mse'},\n", " 'd_min': {'A': 'Add60', 'B': 'SamplePart62', 'loss': 'mse'}},\n", " 'Models': {'b_model': {'Constants': [],\n", " 'Functions': [],\n", " 'Inputs': ['b_t', 'a'],\n", " 'Outputs': ['b'],\n", " 'Parameters': ['B', 'A', 'shared'],\n", " 'Relations': ['SamplePart49',\n", " 'TimePart44',\n", " 'Fir45',\n", " 'Linear46',\n", " 'SamplePart41',\n", " 'Linear42',\n", " 'Add47']},\n", " 'd_model': {'Constants': [],\n", " 'Functions': [],\n", " 'Inputs': ['b_in', 'c', 'a'],\n", " 'Outputs': ['d', 'b'],\n", " 'Parameters': ['D', 'C', 'shared', 'B', 'A'],\n", " 'Relations': ['TimePart58',\n", " 'Fir59',\n", " 'TimePart54',\n", " 'Fir55',\n", " 'SamplePart51',\n", " 'Linear52',\n", " 'Add56',\n", " 'Add60',\n", " 'TimePart44',\n", " 'Fir45',\n", " 'Linear46',\n", " 'SamplePart41',\n", " 'Linear42',\n", " 'Add47']}},\n", " 'Outputs': {'b': 'Add47', 'd': 'Add60'},\n", " 'Parameters': {'A': {'dim': [1, 1], 'values': [[0.600895345211029]]},\n", " 'B': {'dim': 1,\n", " 'tw': 0.5,\n", " 'values': [[0.8822692632675171],\n", " [0.9150039553642273],\n", " [0.38286375999450684],\n", " [0.9593056440353394],\n", " [0.3904482126235962]]},\n", " 'C': {'dim': 1,\n", " 'tw': 0.5,\n", " 'values': [[0.9345980882644653],\n", " [0.5935796499252319],\n", " [0.8694044351577759],\n", " [0.5677152872085571],\n", " [0.7410940527915955]]},\n", " 'D': {'dim': 1,\n", " 'tw': 0.3,\n", " 'values': [[0.7936413288116455],\n", " [0.9407714605331421],\n", " [0.13318592309951782]]},\n", " 'shared': {'dim': [1, 1], 'values': [[0.2565724849700928]]}},\n", " 'Relations': {'Add47': ['Add', ['Linear42', 'Linear46']],\n", " 'Add56': ['Add', ['Linear52', 'Fir55']],\n", " 'Add60': ['Add', ['Add56', 'Fir59']],\n", " 'Fir45': ['Fir', ['TimePart44'], 'B', None, 0],\n", " 'Fir55': ['Fir', ['TimePart54'], 'C', None, 0],\n", " 'Fir59': ['Fir', ['TimePart58'], 'D', None, 0],\n", " 'Linear42': ['Linear', ['SamplePart41'], 'shared', None, 0],\n", " 'Linear46': ['Linear', ['Fir45'], 'A', None, 0],\n", " 'Linear52': ['Linear', ['SamplePart51'], 'shared', None, 0],\n", " 'SamplePart41': ['SamplePart', ['a'], -1, [-1, 0]],\n", " 'SamplePart49': ['SamplePart', ['b_t'], -1, [-1, 0]],\n", " 'SamplePart51': ['SamplePart', ['c'], -1, [-1, 0]],\n", " 'SamplePart62': ['SamplePart', ['d_t'], -1, [-1, 0]],\n", " 'TimePart44': ['TimePart', ['a'], -1, [-0.5, 0]],\n", " 'TimePart54': ['TimePart', ['c'], -1, [-0.5, 0]],\n", " 'TimePart58': ['TimePart', ['b_in'], -1, [-0.3, 0]]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m============================ nnodely Model Dataset =============================\u001b[0m\n", "\u001b[32mDataset Name: dataset\u001b[0m\n", "\u001b[32mNumber of files: 1\u001b[0m\n", "\u001b[32mTotal number of samples: 96\u001b[0m\n", "\u001b[32mShape of d_t: (96, 1, 1)\u001b[0m\n", "\u001b[32mShape of b_in: (96, 3, 1)\u001b[0m\n", "\u001b[32mShape of c: (96, 5, 1)\u001b[0m\n", "\u001b[32mShape of a: (96, 5, 1)\u001b[0m\n", "\u001b[32mShape of b_t: (96, 1, 1)\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m======================== nnodely Model Train Parameters ========================\u001b[0m\n", "\u001b[32mmodels: ['b_model', 'd_model']\u001b[0m\n", "\u001b[32mnum of epochs: 1\u001b[0m\n", "\u001b[32mupdate per epochs: 12\u001b[0m\n", "\u001b[34m└>(n_samples-batch_size)/batch_size+1\u001b[0m\n", "\u001b[32mshuffle _data: True\u001b[0m\n", "\u001b[32mtrain dataset: dataset_train\u001b[0m\n", "\u001b[32m\t- num of samples: 96\u001b[0m\n", "\u001b[32m\t- batch size: 8\u001b[0m\n", "\u001b[32m\t- unused samples: 0\u001b[0m\n", "\u001b[34m\t └>n_samples-update_per_epochs*batch_size\u001b[0m\n", "\u001b[32mminimizers: {'b_min': {'A': 'Add47',\n", " 'B': 'SamplePart49',\n", " 'loss': 'mse'},\n", " 'd_min': {'A': 'Add60',\n", " 'B': 'SamplePart62',\n", " 'loss': 'mse'}}\u001b[0m\n", "\u001b[32moptimizer: Adam\u001b[0m\n", "\u001b[32moptimizer defaults: {'lr': 0.1}\u001b[0m\n", "\u001b[32moptimizer params: [{'params': 'A'},\n", " {'params': 'B'},\n", " {'params': 'C'},\n", " {'params': 'D'},\n", " {'params': 'shared'}]\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m=========================== nnodely Training ===========================\u001b[0m\n", "\u001b[32m| Epoch |\u001b[0m\u001b[32m b_min |\u001b[0m\u001b[32m d_min |\u001b[0m\u001b[32m Total |\u001b[0m\n", "\u001b[32m| |\u001b[0m\u001b[32m Loss |\u001b[0m\u001b[32m Loss |\u001b[0m\u001b[32m Loss |\u001b[0m\n", "\u001b[32m| |\u001b[0m\u001b[32m train |\u001b[0m\u001b[32m train |\u001b[0m\u001b[32m train |\u001b[0m\n", "\u001b[32m|----------------------------------------------------------------------|\u001b[0m\n", "\u001b[32m| 1/1 |\u001b[0m\u001b[32m 2.324e+02 |\u001b[0m\u001b[32m 3.749e+02 |\u001b[0m\u001b[32m 3.036e+02 |\u001b[0m\n", "\u001b[32m|----------------------------------------------------------------------|\u001b[0m\n", "\u001b[1;32m============================ nnodely Training Time =============================\u001b[0m\n", "\u001b[32mTotal time of Training: 0.014888763427734375\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n" ] } ], "source": [ "clearNames(['a','b_t','c','d_t','b_in','shared','b','A','B','C','D','d'])\n", "import numpy as np\n", "\n", "def linear_function(x, k1, k2):\n", " return x*k1 + k2\n", "\n", "data_a = np.arange(1,101, dtype=np.float32)\n", "data_b_t = linear_function(data_a, 2, 3)\n", "\n", "data_c = np.arange(1,101, dtype=np.float32)\n", "data_b_in = np.arange(5,105, dtype=np.float32)\n", "data_d_t = linear_function(data_c, 5, 1)\n", "\n", "dataset = {'a': data_a, 'b_t': data_b_t, 'c':data_c, 'b_in': data_b_in, 'd_t':data_d_t }\n", "## Model a\n", "a = Input('a')\n", "b_t = Input('b_t')\n", "shared = Parameter('shared',dimensions=(1,1))\n", "output_relation = Linear(W=shared)(a.last())+Linear(W='A')(Fir(W='B')(a.tw(0.5)))\n", "b = Output('b',output_relation)\n", "\n", "model = Modely(seed=42)\n", "model.addModel('b_model', b)\n", "model.addMinimize('b_min', b, b_t.last())\n", "model.neuralizeModel(0.1)\n", "\n", "# Model d\n", "c = Input('c')\n", "d_t = Input('d_t')\n", "b_in = Input('b_in')\n", "output_relation.connect(b_in)\n", "d = Output('d',Linear(W=shared)(c.last())+Fir(W='C')(c.tw(0.5))+Fir(W='D')(b_in.tw(0.3)))\n", "\n", "model.addModel('d_model', [b,d])\n", "model.addMinimize('d_min', d, d_t.last())\n", "model.neuralizeModel(0.1)\n", "model.loadData('dataset', dataset)\n", "\n", "params = {'num_of_epochs': 1,\n", " 'train_batch_size': 8,\n", " 'val_batch_size': 8,\n", " 'test_batch_size':1,\n", " 'lr':0.1}\n", "\n", "## training dei parametri di tutti i modelli\n", "_ = model.trainModel(splits=[100,0,0], training_params=params, prediction_samples=4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Recurrent Train\n", "\n", "In order to do a recurrent training of the network using the State variables is mandatory to specify the window of prediction (prediction_samples)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:26:10.300420Z", "start_time": "2025-04-27T17:26:10.250812Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {},\n", " 'Functions': {},\n", " 'Info': {'SampleTime': 0.1,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'num_parameters': 18},\n", " 'Inputs': {'x': {'dim': 3, 'ns': [5, 0], 'ntot': 5, 'tw': [-0.5, 0]},\n", " 'x_state': {'closedLoop': 'Linear92',\n", " 'dim': 3,\n", " 'local': 1,\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'tw': [-0.5, 0]},\n", " 'y_state': {'closedLoop': 'Linear95',\n", " 'dim': 3,\n", " 'local': 1,\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'tw': [-0.5, 0]}},\n", " 'Minimizers': {'error': {'A': 'Add96', 'B': 'TimePart98', 'loss': 'mse'}},\n", " 'Models': 'model',\n", " 'Outputs': {'out': 'Add96'},\n", " 'Parameters': {'PLinear75W': {'dim': [3, 3],\n", " 'values': [[0.13318592309951782,\n", " 0.9345980882644653,\n", " 0.5935796499252319],\n", " [0.8694044351577759,\n", " 0.5677152872085571,\n", " 0.7410940527915955],\n", " [0.42940449714660645,\n", " 0.8854429125785828,\n", " 0.5739044547080994]]},\n", " 'PLinear77W': {'dim': [3, 3],\n", " 'values': [[0.8822692632675171,\n", " 0.9150039553642273,\n", " 0.38286375999450684],\n", " [0.9593056440353394,\n", " 0.3904482126235962,\n", " 0.600895345211029],\n", " [0.2565724849700928,\n", " 0.7936413288116455,\n", " 0.9407714605331421]]}},\n", " 'Relations': {'Add96': ['Add', ['Linear92', 'Linear95']],\n", " 'Linear92': ['Linear', ['TimePart91'], 'PLinear75W', None, 0],\n", " 'Linear95': ['Linear', ['TimePart94'], 'PLinear77W', None, 0],\n", " 'TimePart91': ['TimePart', ['x_state'], -1, [-0.5, 0]],\n", " 'TimePart94': ['TimePart', ['y_state'], -1, [-0.5, 0]],\n", " 'TimePart98': ['TimePart', ['x'], -1, [-0.5, 0]]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m============================ nnodely Model Dataset =============================\u001b[0m\n", "\u001b[32mDataset Name: dataset\u001b[0m\n", "\u001b[32mNumber of files: 1\u001b[0m\n", "\u001b[32mTotal number of samples: 96\u001b[0m\n", "\u001b[32mShape of x: (96, 5, 3)\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m======================== nnodely Model Train Parameters ========================\u001b[0m\n", "\u001b[32mmodels: ['model']\u001b[0m\n", "\u001b[32mnum of epochs: 10\u001b[0m\n", "\u001b[32mupdate per epochs: 62\u001b[0m\n", "\u001b[34m└>(n_samples-batch_size-prediction_samples+1)/(batch_size+step-1)+1\u001b[0m\n", "\u001b[32mprediction samples: 5\u001b[0m\n", "\u001b[32mstep: 0\u001b[0m\n", "\u001b[32mclosed loop: {}\u001b[0m\n", "\u001b[32mconnect: {}\u001b[0m\n", "\u001b[32mtrain dataset: dataset_train\u001b[0m\n", "\u001b[32m\t- num of samples: 67\u001b[0m\n", "\u001b[32m\t- batch size: 1\u001b[0m\n", "\u001b[32m\t- unused samples: 0\u001b[0m\n", "\u001b[34m\t └>n_samples-prediction_samples-update_per_epochs*(batch_size+step-1)\u001b[0m\n", "\u001b[32mval dataset: None\u001b[0m\n", "\u001b[32mval {batch size, samples}: {1, 19}\u001b[0m\n", "\u001b[32mminimizers: {'error': {'A': 'Add96',\n", " 'B': 'TimePart98',\n", " 'loss': 'mse'}}\u001b[0m\n", "\u001b[32moptimizer: Adam\u001b[0m\n", "\u001b[32moptimizer defaults: {'lr': 0.01}\u001b[0m\n", "\u001b[32moptimizer params: [{'params': 'PLinear75W'},\n", " {'params': 'PLinear77W'}]\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m================= nnodely Training =================\u001b[0m\n", "\u001b[32m| Epoch |\u001b[0m\u001b[32m error |\u001b[0m\u001b[32m Total |\u001b[0m\n", "\u001b[32m| |\u001b[0m\u001b[32m Loss |\u001b[0m\u001b[32m Loss |\u001b[0m\n", "\u001b[32m| |\u001b[0m\u001b[32m train |\u001b[0m\u001b[32m val |\u001b[0m\u001b[32m train |\u001b[0m\u001b[32m val |\u001b[0m\n", "\u001b[32m|--------------------------------------------------|\u001b[0m\n", "\u001b[32m| 1/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 2/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 3/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 4/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 5/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 6/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 7/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 8/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 9/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m| 10/10 |\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\u001b[32m6.723e+00|\u001b[0m\u001b[32m7.729e+00|\u001b[0m\n", "\u001b[32m|--------------------------------------------------|\u001b[0m\n", "\u001b[1;32m============================ nnodely Training Time =============================\u001b[0m\n", "\u001b[32mTotal time of Training: 2.2795727252960205\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "finale state: {'y_state': tensor([[[0., 0., 0.],\n", " [0., 0., 0.],\n", " [0., 0., 0.],\n", " [0., 0., 0.],\n", " [0., 0., 0.]]]), 'x_state': tensor([[[0., 0., 0.],\n", " [0., 0., 0.],\n", " [0., 0., 0.],\n", " [0., 0., 0.],\n", " [0., 0., 0.]]])}\n" ] } ], "source": [ "import numpy as np\n", "clearNames(['x','x_state','y_state','out'])\n", "x = Input('x', dimensions=3)\n", "x_state = Input('x_state', dimensions=3)\n", "y_state = Input('y_state', dimensions=3)\n", "x_out = Linear(output_dimension=3)(x_state.tw(0.5))\n", "y_out = Linear(output_dimension=3)(y_state.tw(0.5))\n", "x_out.closedLoop(x_state)\n", "y_out.closedLoop(y_state)\n", "out = Output('out',x_out+y_out)\n", "\n", "test = Modely(seed=42)\n", "test.addModel('model', out)\n", "test.addMinimize('error', out, x.tw(0.5))\n", "\n", "test.neuralizeModel(0.1)\n", "\n", "dataset = {'x':np.array([np.random.uniform(1,4,300)]).reshape(100,3).tolist()}\n", "test.loadData(name='dataset', source=dataset)\n", "\n", "# Training non ricorrente\n", "params = {'num_of_epochs': 10, 'train_batch_size': 1, 'val_batch_size':1, 'lr':0.01}\n", "tp = test.trainModel(splits=[70,20,10], prediction_samples=5, shuffle_data=False, training_params=params)\n", "print('finale state: ', test._states)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Clear State\n", "\n", "use the specific function to manually clear the state of a state variable" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:26:41.723854Z", "start_time": "2025-04-27T17:26:41.720362Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "finale state: {'y_state': [[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]], 'x_state': [[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]]}\n" ] } ], "source": [ "test.resetStates()\n", "print('finale state: ', test.states)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## State update at training time\n", "\n", "States variables can also be created at training time. These variables will exist only during the training process.\n", "\n", "To create the you have to define a dictionary containing {input:output}. In that case, the 'input' will become a state during the training process and the 'output' will be the relation updating it." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2025-04-27T17:27:30.138943Z", "start_time": "2025-04-27T17:27:29.900314Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1;32m================================ nnodely Model =================================\u001b[0m\n", "\u001b[32m{'Constants': {},\n", " 'Functions': {},\n", " 'Info': {'SampleTime': 0.1,\n", " 'nnodely_version': '1.5.0',\n", " 'ns': [5, 0],\n", " 'ntot': 5,\n", " 'num_parameters': 18},\n", " 'Inputs': {'x': {'dim': 3, 'ns': [5, 0], 'ntot': 5, 'tw': [-0.5, 0]},\n", " 'x_s': {'dim': 3, 'ns': [5, 0], 'ntot': 5, 'tw': [-0.5, 0]},\n", " 'y_s': {'dim': 3, 'ns': [5, 0], 'ntot': 5, 'tw': [-0.5, 0]}},\n", " 'Minimizers': {'error': {'A': 'Add105', 'B': 'TimePart107', 'loss': 'mse'}},\n", " 'Models': 'model',\n", " 'Outputs': {'out': 'Add105', 'out_x': 'Linear101', 'out_y': 'Linear104'},\n", " 'Parameters': {'PLinear3W': {'dim': [3, 3],\n", " 'values': [[0.13318592309951782,\n", " 0.9345980882644653,\n", " 0.5935796499252319],\n", " [0.8694044351577759,\n", " 0.5677152872085571,\n", " 0.7410940527915955],\n", " [0.42940449714660645,\n", " 0.8854429125785828,\n", " 0.5739044547080994]]},\n", " 'PLinear5W': {'dim': [3, 3],\n", " 'values': [[0.8822692632675171,\n", " 0.9150039553642273,\n", " 0.38286375999450684],\n", " [0.9593056440353394,\n", " 0.3904482126235962,\n", " 0.600895345211029],\n", " [0.2565724849700928,\n", " 0.7936413288116455,\n", " 0.9407714605331421]]}},\n", " 'Relations': {'Add105': ['Add', ['Linear101', 'Linear104']],\n", " 'Linear101': ['Linear', ['TimePart100'], 'PLinear3W', None, 0],\n", " 'Linear104': ['Linear', ['TimePart103'], 'PLinear5W', None, 0],\n", " 'TimePart100': ['TimePart', ['x_s'], -1, [-0.5, 0]],\n", " 'TimePart103': ['TimePart', ['y_s'], -1, [-0.5, 0]],\n", " 'TimePart107': ['TimePart', ['x'], -1, [-0.5, 0]]}}\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m============================ nnodely Model Dataset =============================\u001b[0m\n", "\u001b[32mDataset Name: dataset\u001b[0m\n", "\u001b[32mNumber of files: 1\u001b[0m\n", "\u001b[32mTotal number of samples: 96\u001b[0m\n", "\u001b[32mShape of x: (96, 5, 3)\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m======================== nnodely Model Train Parameters ========================\u001b[0m\n", "\u001b[32mmodels: ['model']\u001b[0m\n", "\u001b[32mnum of epochs: 10\u001b[0m\n", "\u001b[32mupdate per epochs: 16\u001b[0m\n", "\u001b[34m└>(n_samples-batch_size-prediction_samples+1)/(batch_size+step-1)+1\u001b[0m\n", "\u001b[32mprediction samples: 3\u001b[0m\n", "\u001b[32mstep: 0\u001b[0m\n", "\u001b[32mclosed loop: {'x_s': 'out_x', 'y_s': 'out_y'}\u001b[0m\n", "\u001b[32mconnect: {}\u001b[0m\n", "\u001b[32mtrain dataset: dataset_train\u001b[0m\n", "\u001b[32m\t- num of samples: 67\u001b[0m\n", "\u001b[32m\t- batch size: 4\u001b[0m\n", "\u001b[32m\t- unused samples: 0\u001b[0m\n", "\u001b[34m\t └>n_samples-prediction_samples-update_per_epochs*(batch_size+step-1)\u001b[0m\n", "\u001b[32mval dataset: None\u001b[0m\n", "\u001b[32mval {batch size, samples}: {4, 19}\u001b[0m\n", "\u001b[32mminimizers: {'error': {'A': 'Add105',\n", " 'B': 'TimePart107',\n", " 'loss': 'mse'}}\u001b[0m\n", "\u001b[32moptimizer: Adam\u001b[0m\n", "\u001b[32moptimizer defaults: {'lr': 0.01}\u001b[0m\n", "\u001b[32moptimizer params: [{'params': 'PLinear3W'}, {'params': 'PLinear5W'}]\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "\u001b[1;32m================= nnodely Training =================\u001b[0m\n", "\u001b[32m| Epoch |\u001b[0m\u001b[32m error |\u001b[0m\u001b[32m Total |\u001b[0m\n", "\u001b[32m| |\u001b[0m\u001b[32m Loss |\u001b[0m\u001b[32m Loss |\u001b[0m\n", "\u001b[32m| |\u001b[0m\u001b[32m train |\u001b[0m\u001b[32m val |\u001b[0m\u001b[32m train |\u001b[0m\u001b[32m val |\u001b[0m\n", "\u001b[32m|--------------------------------------------------|\u001b[0m\n", "\u001b[32m| 1/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 2/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 3/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 4/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 5/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 6/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 7/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 8/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 9/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m| 10/10 |\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\u001b[32m6.726e+00|\u001b[0m\u001b[32m7.676e+00|\u001b[0m\n", "\u001b[32m|--------------------------------------------------|\u001b[0m\n", "\u001b[1;32m============================ nnodely Training Time =============================\u001b[0m\n", "\u001b[32mTotal time of Training: 0.4841020107269287\u001b[0m\n", "\u001b[32m================================================================================\u001b[0m\n", "finale state: {}\n" ] } ], "source": [ "import numpy as np\n", "clearNames()\n", "x = Input('x', dimensions=3)\n", "x_s = Input('x_s', dimensions=3)\n", "y_s = Input('y_s', dimensions=3)\n", "x_out = Linear(output_dimension=3)(x_s.tw(0.5))\n", "y_out = Linear(output_dimension=3)(y_s.tw(0.5))\n", "out = Output('out',x_out+y_out)\n", "out_x = Output('out_x',x_out)\n", "out_y = Output('out_y',y_out)\n", "\n", "test = Modely(seed=42)\n", "test.addModel('model', [out,out_x,out_y])\n", "test.addMinimize('error', out, x.tw(0.5))\n", "\n", "test.neuralizeModel(0.1)\n", "\n", "dataset = {'x':np.array([np.random.uniform(1,4,300)]).reshape(100,3).tolist()}\n", "test.loadData(name='dataset', source=dataset)\n", "\n", "# Training non ricorrente\n", "params = {'num_of_epochs': 10, 'train_batch_size': 4, 'val_batch_size':4, 'test_batch_size':1, 'lr':0.01}\n", "test.trainModel(splits=[70,20,10], prediction_samples=3, shuffle_data=False, closed_loop={'x_s':'out_x','y_s':'out_y'}, training_params=params)\n", "print('finale state: ', test.states)" ] } ], "metadata": { "kernelspec": { "display_name": "myenv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }