--- a
+++ b/ROMNet.py
@@ -0,0 +1,113 @@
+"""
+
+Stefania Fresca, MOX Laboratory, Politecnico di Milano
+April 2019
+
+"""
+
+import tensorflow as tf
+import numpy as np
+
+from Net import Net
+
+class ROMNet(Net):
+    def __init__(self, config):
+        Net.__init__(self, config)
+
+        self.n = config['n']
+        self.n_params = config['n_params']
+
+        self.size = 5
+        self.n_layers = 10
+        self.n_neurons = 50
+        self.n_h = config['n_h']
+
+    def inference(self):
+        # encoder function providing the low-dimensional representation of the FOM solution
+        conv1 = tf.layers.conv2d(inputs = self.input,
+                                 filters = 8,
+                                 kernel_size = [self.size, self.size],
+                                 padding = 'SAME',
+                                 strides = 1,
+                                 kernel_initializer = tf.keras.initializers.he_uniform(),
+                                 activation = tf.nn.elu,
+                                 name = 'conv1')
+        conv2 = tf.layers.conv2d(inputs = conv1,
+                                 filters = 16,
+                                 kernel_size = [self.size, self.size],
+                                 padding = 'SAME',
+                                 strides = 2,
+                                 kernel_initializer = tf.keras.initializers.he_uniform(),
+                                 activation = tf.nn.elu,
+                                 name = 'conv2')
+        conv3 = tf.layers.conv2d(inputs = conv2,
+                                 filters = 32,
+                                 kernel_size = [self.size, self.size],
+                                 padding = 'SAME',
+                                 strides = 2,
+                                 kernel_initializer = tf.keras.initializers.he_uniform(),
+                                 activation = tf.nn.elu,
+                                 name = 'conv3')
+        conv4 = tf.layers.conv2d(inputs = conv3,
+                                 filters = 64,
+                                 kernel_size = [self.size, self.size],
+                                 padding = 'SAME',
+                                 strides = 2,
+                                 kernel_initializer = tf.keras.initializers.he_uniform(),
+                                 activation = tf.nn.elu,
+                                 name = 'conv4')
+        feature_dim_enc = conv4.shape[1] * conv4.shape[2] * conv4.shape[3]
+        conv4 = tf.reshape(conv4, [-1, feature_dim_enc])
+        fc1 = tf.layers.dense(conv4, 256, activation = tf.nn.elu, kernel_initializer = tf.keras.initializers.he_uniform(), name = 'fc1')
+        self.enc = tf.layers.dense(fc1, self.n, activation = tf.nn.elu, kernel_initializer = tf.keras.initializers.he_uniform(), name = 'fc2')
+        # feed-forward neural network for reduced dynamics learning
+        fc_n = tf.layers.dense(self.params,
+                               self.n_neurons,
+                               activation = tf.nn.elu,
+                               kernel_initializer = tf.keras.initializers.he_uniform())
+        for i in range(self.n_layers):
+            fc_n = tf.layers.dense(fc_n,
+                                   self.n_neurons,
+                                   activation = tf.nn.elu,
+                                   kernel_initializer = tf.keras.initializers.he_uniform())
+        self.u_n = tf.layers.dense(fc_n,
+                                   self.n,
+                                   activation = tf.nn.elu,
+                                   kernel_initializer = tf.keras.initializers.he_uniform())
+        # decoder function for reduced nonlinear trial manifold learning
+        fc1_t = tf.layers.dense(self.u_n, 256, activation = tf.nn.elu, kernel_initializer = tf.keras.initializers.he_uniform(), name = 'fc1_t')
+        fc2_t = tf.layers.dense(fc1_t, self.N_h, activation = tf.nn.elu, kernel_initializer = tf.keras.initializers.he_uniform(), name = 'fc2_t')
+        fc2_t = tf.reshape(fc2_t, [-1, self.n_h, self.n_h, 64])
+        conv1_t = tf.layers.conv2d_transpose(inputs = fc2_t,
+                                             filters = 64,
+                                             kernel_size = [self.size, self.size],
+                                             padding = 'SAME',
+                                             strides = 2,
+                                             kernel_initializer = tf.keras.initializers.he_uniform(),
+                                             activation = tf.nn.elu,
+                                             name = 'conv1_t')
+        conv2_t = tf.layers.conv2d_transpose(inputs = conv1_t,
+                                             filters = 32,
+                                             kernel_size = [self.size, self.size],
+                                             padding = 'SAME',
+                                             strides = 2,
+                                             kernel_initializer = tf.keras.initializers.he_uniform(),
+                                             activation = tf.nn.elu,
+                                             name = 'conv2_t')
+        conv3_t = tf.layers.conv2d_transpose(inputs = conv2_t,
+                                             filters = 16,
+                                             kernel_size = [self.size, self.size],
+                                             padding = 'SAME',
+                                             strides = 2,
+                                             kernel_initializer = tf.keras.initializers.he_uniform(),
+                                             activation = tf.nn.elu,
+                                             name = 'conv3_t')
+        conv4_t = tf.layers.conv2d_transpose(inputs = conv3_t,
+                                             filters = 1,
+                                             kernel_size = [self.size, self.size],
+                                             padding = 'SAME',
+                                             strides = 1,
+                                             kernel_initializer = tf.keras.initializers.he_uniform(),
+                                             name = 'conv4_t')
+        feature_dim_dec = conv4_t.shape[1] * conv4_t.shape[2] * conv4_t.shape[3]
+        self.u_h = tf.reshape(conv4_t, [-1, feature_dim_dec])