def test_addInner(self):
        """
    Test adding basic Deterministic InnerNode. 
    
    NOTE: The DeterministicNode belongs to the class of nodes that starts with a
    known final number of outputs.
    """
        print("\nTest 1: Adding InnerNode")
        try:
            builder = StaticBuilder()
            builder.addInput(10, name="In")
            enc_name = builder.addInner(3, name="In")
        except AttributeError:
            print("\nCAUGHT! Trying to assign the same name to two nodes! "
                  "AttributeError exception\n")
            builder = StaticBuilder()
            builder.addInput(10, name="In")
            enc_name = builder.addInner(3, name="Det")

        enc1 = builder.nodes[enc_name]
        print('\nNode keys in builder:', list(builder.nodes.keys()))
        print("This node's key:", enc_name)
        self.assertEqual(enc1.label, 1,
                         "The label has not been assigned correctly")
        self.assertEqual(
            builder.num_nodes, 2, "The number of nodes has not been "
            "assigned correctly")
        self.assertEqual(
            enc1.num_declared_outputs, 0, "The number of outputs of the "
            "DeterministicNode has not been assigned correctly")
        self.assertEqual(
            enc1.num_declared_inputs, 0, "The number of inputs of the "
            "DeterministicNode has not been assigned correctly")
    def test_add_encoder0(self):
        """
    Test commit
    """
        tf.reset_default_graph()
        builder = StaticBuilder("MyModel")

        builder.addInput(10)
        cust = builder.createCustomNode(1, 1, name="Custom")
        cust_in1 = cust.addInner(3)
        cust_in2 = cust.addInner(4)
        cust.addDirectedLink(cust_in1, cust_in2)
        cust.commit()
        builder.addOutput()
Beispiel #3
0
    def test_CallCustom(self):
        """
    Test, calling a CustomNode
    """
        print("\nTest 1: Build")
        builder = StaticBuilder("MyModel")

        cust = builder.createCustomNode(num_inputs=1,
                                        num_outputs=1,
                                        name="Custom")
        cust_in1 = cust.addInner(3)
        cust_in2 = cust.addInner(4)
        cust.addDirectedLink(cust_in1, cust_in2, islot=0)

        cust.declareIslot(islot=0, innernode_name=cust_in1, inode_islot=0)
        cust.declareOslot(oslot='main',
                          innernode_name=cust_in2,
                          inode_oslot='main')

        in1 = builder.addInput(10)
        builder.addDirectedLink(in1, cust, islot=0)
        builder.build()

        X = tf.placeholder(tf.float32, [1, 10], 'X')
        Y = cust(X)  # pylint: disable=unpacking-non-sequence
        print('Y', Y)
        self.assertEqual(Y[0].shape[-1], 4, "")
    def test_addDirectedLinks(self):
        """
    Test adding DirectedLinks
    """
        print("\nTest 3: Adding DirectedLinks")
        builder = StaticBuilder()
        in1 = builder.addInput(10, name="In")
        enc1 = builder.addInner(3, name="Det")
        out1 = builder.addOutput(name="Out")

        builder.addDirectedLink(in1, enc1)
        builder.addDirectedLink(enc1, out1)

        enc1 = builder.nodes[enc1]
        print('\nNode keys in builder:', list(builder.nodes.keys()))
        self.assertEqual(
            builder.num_nodes, 3, "The number of nodes has not been "
            "assigned correctly")
        self.assertEqual(
            enc1.num_declared_outputs, 1, "The number of outputs of the "
            "DeterministicNode has not been assigned correctly")
        self.assertEqual(
            enc1.num_declared_inputs, 1, "The number of inputs of the "
            "DeterministicNode has not been assigned correctly")
        self.assertIn(
            1, builder.adj_list[0], "Node 1 has not been added to the "
            "adjacency list of Node 0")
        self.assertIn(
            2, builder.adj_list[1], "Node 2 has not been added to the "
            "adjacency list of Node 1")
    def test_BuildModel0(self):
        """
    Test building the simplest model possible.
    """
        print("\nTest 4: Building a Basic Model")
        builder = StaticBuilder(scope="Basic")
        in_name = builder.addInput(10)
        enc_name = builder.addInner(3)
        out_name = builder.addOutput()
        builder.addDirectedLink(in_name, enc_name)
        builder.addDirectedLink(enc_name, out_name)

        self.assertEqual(
            builder.num_nodes, 3, "The number of nodes has not been "
            "assigned correctly")

        builder.build()
        inn, enc, out = (builder.nodes[in_name], builder.nodes[enc_name],
                         builder.nodes[out_name])
        self.assertEqual(inn._oslot_to_otensor[0].shape.as_list()[-1],
                         enc._islot_to_itensor[0].shape.as_list()[-1],
                         "The input tensors have not been assigned correctly")
        self.assertEqual(enc._oslot_to_otensor[0].shape.as_list()[-1],
                         out._islot_to_itensor[0].shape.as_list()[-1],
                         "The input tensors have not been assigned correctly")
    def test_train_custom_builder2(self):
        """
    Build a custom Regression model whose Model graph has the rhombic design
    """
        print("Test 1: Rhombic Design\n")

        # Define the builder
        builder = StaticBuilder('CustBuild')
        enc_dirs = {
            'numlayers': 2,
            'numnodes': 128,
            'activations': 'leaky_relu',
            'netgrowrate': 1.0
        }
        input_dim = 2
        in0 = builder.addInput(input_dim, name="Features")
        enc1 = builder.addTransformInner(10,
                                         main_inputs=in0,
                                         directives=enc_dirs)
        enc2 = builder.addTransformInner(10,
                                         main_inputs=in0,
                                         directives=enc_dirs)
        builder.addTransformInner(1,
                                  main_inputs=[enc1, enc2],
                                  numlayers=1,
                                  activations='linear',
                                  name='Prediction')

        reg = Regression(input_dim=2, output_dim=1, builder=builder)
        #                      save_on_valid_improvement=True)  # OK!
        reg.train(dataset, num_epochs=10)
    def test_train_custom_builder(self):
        """
    """
        print("Test 0: Chain of Encoders\n")

        # Define a builder. Get more control on the directives of each node
        enc_dirs = {
            'numlayers': 2,
            'numnodes': 128,
            'activations': 'leaky_relu',
            'netgrowrate': 1.0
        }
        input_dim, output_dim = 2, 1

        builder = StaticBuilder('CustBuild')
        in0 = builder.addInput(input_dim, name="Features")
        enc1 = builder.addTransformInner(5, main_inputs=in0, **enc_dirs)
        builder.addTransformInner(state_size=1,
                                  main_inputs=enc1,
                                  directives=enc_dirs,
                                  name='Prediction')

        # Pass the builder object to the Regression Model
        reg = Regression(builder=builder, output_dim=output_dim)
        #                      save_on_valid_improvement=True) # ok!

        reg.train(dataset, num_epochs=10)
    def test_train_custom_node2(self):
        """
    Test a custom Regression model with a CustomNode
    """
        print("Test 2: with CustomNode\n")

        builder = StaticBuilder("MyModel")
        enc_dirs = {
            'numlayers': 2,
            'numnodes': 128,
            'activations': 'leaky_relu',
            'netgrowrate': 1.0
        }

        input_dim = 2
        in0 = builder.addInput(input_dim, name='Features')

        cust = builder.createCustomNode(inputs=[in0],
                                        num_outputs=1,
                                        name="Prediction")
        cust_in1 = cust.addTransformInner(3,
                                          main_inputs=[0],
                                          directives=enc_dirs)
        cust_in2 = cust.addTransformInner(1,
                                          main_inputs=cust_in1,
                                          directives=enc_dirs)
        cust.declareOslot(oslot=0,
                          innernode_name=cust_in2,
                          inode_oslot_name='main')

        reg = Regression(builder=builder, input_dim=2, output_dim=1)
        #                      save_on_valid_improvement=True) # ok!
        reg.train(dataset, num_epochs=10)
  def test_add_encoder2(self):
    """
    Test commit
    """
    print("Test 3: Declaring multiple inputs to the Custom Node")
    builder = StaticBuilder("MyModel")

    i1 = builder.addInput(10)
    i2 = builder.addInput(5)
    cust = builder.createCustomNode(inputs=[i1,i2],
                                     num_outputs=1,
                                     name="Custom")
    ctin1 = cust.addTransformInner(3, [0])
    cust.addTransformInner(3, [1, ctin1])
    print("cust.in_builder._inode_to_innernode", cust.in_builder.islot_to_innernode_names)
    print("cust.in_builder.input_nodes", cust.in_builder.input_nodes)
Beispiel #10
0
    def test_train_custom_builder(self):
        """
    """
        print("Running Test 0\n")
        x = 10.0 * np.random.randn(100, 2)
        y = x[:,
              0:1] + 1.5 * x[:,
                             1:]  # + 3*x[:,1:]**2 + 0.5*np.random.randn(100,1)
        dataset = {'train_features': x, 'train_input_response': y}

        # Define a builder.
        # More control on the directives of each node
        builder = StaticBuilder()
        enc_dirs = {
            'num_layers': 2,
            'num_nodes': 128,
            'activation': 'leaky_relu',
            'net_grow_rate': 1.0
        }
        input_dim, output_dim = 2, 1
        in0 = builder.addInput(input_dim, name="features")
        enc1 = builder.addInner(1, 10, directives=enc_dirs)
        enc2 = builder.addInner(1, output_dim, directives=enc_dirs)
        out0 = builder.addOutput(name="prediction")

        builder.addDirectedLink(in0, enc1)
        builder.addDirectedLink(enc1, enc2)
        builder.addDirectedLink(enc2, out0)

        # Pass the builder object to the Regression Model
        reg = Regression(builder=builder)
        reg.build()
        reg.visualize_model_graph("two_encoders.png")
        reg.train(dataset, num_epochs=50)
  def test_build3(self):
    """
    Test build
    """
    print("Test 7: Slightly more complicated Custom build")
    builder = StaticBuilder("MyModel")

    i1 = builder.addInput(10)
    i2 = builder.addInput(5)
    cust = builder.createCustomNode(inputs=[i1,i2],
                                     num_outputs=1,
                                     name="Custom")
    ctin1 = cust.addTransformInner(3, [0])
    ctin2 = cust.addTransformInner(3, [1, ctin1])
    cust.declareOslot(oslot=0, innernode_name=ctin2, inode_oslot_name='main')
    
    builder.build()
 def test_init(self):
   """
   Create a CustomNode
   """
   print("Test 0: Initialization")
   builder = StaticBuilder(scope='BuildCust')
   i1 = builder.addInput([[3]], name='In1')
   cust = builder.createCustomNode(i1, 3, name="Custom")
   
   print("cust.name", cust.name)
   print("cust.num_expected_inputs", cust.num_expected_inputs)
   print("cust.num_expected_outputs", cust.num_expected_outputs)
  def test_build_outputs1(self):
    """
    Test build
    """
    print("Test 9: Building outputs")
    builder = StaticBuilder("MyModel")

    i1 = builder.addInput(10)
    i2 = builder.addInput(5)
    cust = builder.createCustomNode(inputs=[i1,i2],
                                     num_outputs=1,
                                     name="Custom")
    ctin1 = cust.addTransformInner(3, [0])
    ctin2 = cust.addTransformInner(3, [0, ctin1, 1])
    cust.declareOslot(oslot=0, innernode_name=ctin2, inode_oslot_name='main')
    
    builder.build()
    
    X = tf.placeholder(tf.float64, [None, 10]) 
    Y = tf.placeholder(tf.float64, [None, 5]) 
    cust.build_outputs(imain0=X, imain1=Y)
  def test_add_encoder0(self):
    """
    Test commit
    """
    print("Test 1: Adding nodes to Custom")
    builder = StaticBuilder("MyModel")

    i1 = builder.addInput(10)
    cust = builder.createCustomNode(inputs=i1,
                                     num_outputs=1,
                                     name="Custom")
    cust.addTransformInner(3, main_inputs=[0])
    print("cust.in_builder.inode_to_innernode", cust.in_builder.islot_to_innernode_names)
  def test_add_encoder1(self):
    """
    Test commit
    """
    print("Test 2: Adding more nodes to Custom")
    builder = StaticBuilder("MyModel")

    i1 = builder.addInput(10)
    cust = builder.createCustomNode(inputs=i1,
                                     num_outputs=1,
                                     name="Custom")
    ctin1 = cust.addTransformInner(3, [0])
    cust.addTransformInner(4, [ctin1])
    print("cust.in_builder._inode_to_innernode", cust.in_builder.islot_to_innernode_names)
    print("cust.in_builder.input_nodes", cust.in_builder.input_nodes)
    def test_addOutput(self):
        """
    Test adding basic OutputNode
    """
        print("\nTest 2: Adding OutputNode")
        builder = StaticBuilder()
        builder.addInput(10, name="In")
        builder.addInner(3, name="Det")
        o_name = builder.addOutput(name="Out")

        o1 = builder.nodes[o_name]
        print("\nNode keys in builder:", list(builder.nodes.keys()))
        print("This node's key:", o_name)
        self.assertEqual(o1.label, 2,
                         "The label has not been assigned correctly")
        self.assertEqual(
            builder.num_nodes, 3, "The number of nodes has not been "
            "assigned correctly")
        self.assertEqual(
            o1.num_declared_outputs, 0, "The number of outputs of the "
            "OutputNode has not been assigned correctly")
        self.assertEqual(
            o1.num_declared_inputs, 0, "The number of inputs of the "
            "OutputNode has not been assigned correctly")
  def test_build0(self):
    """
    Test commit
    """
    print("Test 4: Basic Custom build")
    builder = StaticBuilder("MyModel")

    i1 = builder.addInput(10)
    cust = builder.createCustomNode(inputs=i1,
                                     num_outputs=1,
                                     name="Custom")
    ctin = cust.addTransformInner(3, main_inputs=[0])
    cust.declareOslot(0, ctin, 'main')
    
    builder.build()
Beispiel #18
0
    def test_addInner(self):
        """
    Test adding basic Deterministic InnerNode. 
    
    NOTE: The DeterministicNode belongs to the class of nodes that starts with a
    known final number of outputs.
    """
        print("Test 2: Adding InnerNode")
        try:
            builder = StaticBuilder(scope='Build0')
            i1 = builder.addInput(state_size=10, name="In")
            enc_name = builder.addTransformInner(state_sizes=3,
                                                 main_inputs=i1,
                                                 name="In")
        except AttributeError:
            print("\nCAUGHT! (AttributeError exception) \n"
                  "Trying to assign the same name to two nodes!")
            builder = StaticBuilder(scope='Build0')
            i1 = builder.addInput(state_size=10, name="In")
            enc_name = builder.addTransformInner(state_size=3, main_inputs=i1)

        enc1 = builder.nodes[enc_name]
        print('\nNode keys in builder:', list(builder.nodes.keys()))
        print("This node's key:", enc_name)
        print("Builder adjacency matrix", builder.adj_matrix)
        self.assertEqual(enc1.label, 1,
                         "The label has not been assigned correctly")
        self.assertEqual(
            builder.num_nodes, 2, "The number of nodes has not been "
            "assigned correctly")
        self.assertEqual(
            enc1.num_declared_outputs, 0, "The number of outputs of the "
            "DeterministicNode has not been assigned correctly")
        self.assertEqual(
            enc1.num_declared_inputs, 0, "The number of inputs of the "
            "DeterministicNode has not been assigned correctly")
Beispiel #19
0
    def test_BuildModel2(self):
        """
    Builds a model with 2 inputs. Test concatenation
    """
        print("Test 4: Building a Model with concat")
        builder = StaticBuilder("Concat")
        in1 = builder.addInput(10)
        in2 = builder.addInput(20)
        enc1 = builder.addTransformInner(3, main_inputs=[in1, in2])

        in1, in2, enc1 = builder.nodes[in1], builder.nodes[in2], builder.nodes[
            enc1]
        builder.build()
        print("enc1._islot_to_itensor", enc1._islot_to_itensor)
        print("enc1._oslot_to_otensor", enc1._oslot_to_otensor)
Beispiel #20
0
    def test_BuildModel0(self):
        """
    Test building the simplest model possible.
    """
        print("Test 3: Building a Basic Model")
        builder = StaticBuilder(scope="Basic")
        in_name = builder.addInput(10)
        enc_name = builder.addTransformInner(3, main_inputs=in_name)

        inn, enc = builder.nodes[in_name], builder.nodes[enc_name]
        builder.build()
        print("enc._islot_to_itensor", enc._islot_to_itensor)
        self.assertEqual(inn._oslot_to_otensor['main'].shape.as_list()[-1],
                         enc._islot_to_itensor[0]['main'].shape.as_list()[-1],
                         "The input tensors have not been assigned correctly")
    def test_BuildModel2(self):
        """
    Builds a model with 2 inputs. Test ConcatNode
    """
        print("\nTest 6: Building a Model with Concat")
        builder = StaticBuilder("Concat")
        in1 = builder.addInput(10)
        in2 = builder.addInput(20)
        enc1 = builder.addInner(3, num_islots=2)
        out1 = builder.addOutput()

        builder.addDirectedLink(in1, enc1, islot=0)
        builder.addDirectedLink(in2, enc1, islot=1)
        builder.addDirectedLink(enc1, out1)

        builder.build()
    def test_BuildModel1(self):
        """
    Test building a model with 2 outputs. Test Cloning an output
    """
        print("\nTest 5: Building a Model with cloning")
        builder = StaticBuilder("Clone")
        in1 = builder.addInput(10)
        enc1 = builder.addInner(3)
        out1 = builder.addOutput(name="Out1")
        out2 = builder.addOutput(name="Out2")

        builder.addDirectedLink(in1, enc1)
        builder.addDirectedLink(enc1, out1)
        builder.addDirectedLink(enc1, out2)

        builder.build()
    def addInputSequence(self,
                         state_size,
                         name=None,
                         node_class=PlaceholderInputNode,
                         **dirs):
        """
    Add an InputSequence
    """
        node_name = StaticBuilder.addInput(self,
                                           state_size=state_size,
                                           iclass=node_class,
                                           name=name,
                                           is_sequence=True,
                                           **dirs)
        self.input_sequences[node_name] = self.input_nodes[node_name]

        return node_name
Beispiel #24
0
 def test_merge_build1(self):
   """
   Test Merge Node build
   """
   builder = StaticBuilder(scope='Main')
   i1 = builder.addInput([[1]])
   in1 = builder.addInner([[3]], node_class=NormalTriLNode)
   in2 = builder.addInner([[3]], node_class=NormalTriLNode)
   builder.addDirectedLink(i1, in1, islot=0)
   builder.addDirectedLink(i1, in2, islot=0)
   m1 = builder.addMergeNode([in1, in2],
                             merge_class=MergeNormals)
   builder.build()
   m1 = builder.nodes[m1]
   self.assertIn('loc', m1._oslot_to_otensor)
   self.assertIn('main', m1._oslot_to_otensor)
   self.assertIn('cov', m1._oslot_to_otensor)
Beispiel #25
0
    def test_BuildModel3(self):
        """
    Try to break it, the algorithm... !! Guess not mdrfkr.
    """
        print("Test 7: Building a more complicated Model")
        builder = StaticBuilder("BreakIt")
        in1 = builder.addInput(10)
        in2 = builder.addInput(20)
        enc1 = builder.addTransformInner(3, main_inputs=in1)
        enc2 = builder.addTransformInner(5, main_inputs=[in2, enc1])

        builder.build()
        enc1, enc2 = builder.nodes[enc1], builder.nodes[enc2]
        print("enc1._islot_to_itensor", enc1._islot_to_itensor)
        print("enc1._islot_to_itensor", enc2._islot_to_itensor)
        print("enc1._oslot_to_otensor", enc1._oslot_to_otensor)
        print("enc1._oslot_to_otensor", enc2._oslot_to_otensor)
Beispiel #26
0
    def test_train_custom_node2(self):
        """
    Test commit
    """
        print("Test 1: with CustomNode\n")

        builder = StaticBuilder("MyModel")
        enc_dirs = {
            'loc_numlayers': 2,
            'loc_numnodes': 64,
            'loc_activations': 'softplus',
            'loc_netgrowrate': 1.0
        }

        input_dim = 10
        in0 = builder.addInput(input_dim, name='Observation')

        # Define Custom Recognition Model
        cust_rec = builder.createCustomNode(inputs=[in0],
                                            num_outputs=1,
                                            name="Recognition")
        cust_in2 = cust_rec.addTransformInner(3,
                                              main_inputs=[0],
                                              node_class=NormalTriLNode,
                                              **enc_dirs)
        cust_rec.declareOslot(oslot=0,
                              innernode_name=cust_in2,
                              inode_oslot_name='main')

        # Define Custom Generative Model
        cust_gen = builder.createCustomNode(inputs=cust_rec.name,
                                            num_outputs=1,
                                            name="Generative")
        cust_ginn1 = cust_gen.addTransformInner(16, main_inputs=[0])
        cust_ginn2 = cust_gen.addTransformInner(10,
                                                main_inputs=cust_ginn1,
                                                node_class=NormalTriLNode,
                                                **enc_dirs)
        cust_gen.declareOslot(oslot=0,
                              innernode_name=cust_ginn2,
                              inode_oslot_name='main')

        # Define VAE and train
        vae = VariationalAutoEncoder(builder=builder)

        vae.train(dataset, num_epochs=10)
  def test_build_outputs(self):
    """
    Test commit
    """
    print("Test 8: Building outputs")
    builder = StaticBuilder("MyModel")

    i1 = builder.addInput(10)
    cust = builder.createCustomNode(inputs=i1,
                                     num_outputs=1,
                                     name="Custom")
    ctin = cust.addTransformInner(3, main_inputs=[0])
    cust.declareOslot(0, ctin, 'main')
    
    builder.build()
    
    X = tf.placeholder(tf.float64, [None, 10]) 
    cust.build_outputs(imain0=X)
Beispiel #28
0
    def test_BuildModel1(self):
        """
    Test building the simplest stochastic model possible.
    """
        print("\nTest 1: Building a Model with a Stochastic Node")
        builder = StaticBuilder(scope="BasicNormal")
        i1 = builder.addInput(10)
        in1 = builder.addTransformInner(3,
                                        main_inputs=i1,
                                        node_class=NormalTriLNode)

        builder.build()
        inn, enc = builder.nodes[i1], builder.nodes[in1]
        self.assertEqual(inn._oslot_to_otensor['main'].shape.as_list()[-1],
                         enc._islot_to_itensor[0]['main'].shape.as_list()[-1],
                         "The input tensors have not been assigned correctly")
        print("enc._oslot_to_otensor", enc._oslot_to_otensor)
        print("enc._islot_to_itensor", enc._islot_to_itensor)
Beispiel #29
0
 def addInputSequence(self,
                      num_features,
                      name=None,
                      node_class=PlaceholderInputNode,
                      **dirs):
   """
   Add an InputSequence
   """
   node_name = StaticBuilder.addInput(self,
                                      num_features=num_features,
                                      name=name,
                                      iclass=node_class,
                                      max_steps=self.max_steps,
                                      is_sequence=True,
                                      **dirs)
   self.input_sequences[node_name] = self.input_nodes[node_name]
   
   return node_name
Beispiel #30
0
 def test_merge_build2(self):
   """
   Test Merge Node build
   """
   builder = StaticBuilder(scope='Main')
   i1 = builder.addInput([[3]], iclass=NormalInputNode, name='N1')
   i2 = builder.addInput([[3]], iclass=NormalInputNode, name='N2')
   m1 = builder.addMergeNode(node_list=[i1, i2],
                             merge_class=MergeNormals)
   builder.build()
   
   sess = tf.Session(graph=tf.get_default_graph())
   sess.run(tf.global_variables_initializer())
   
   s3 = builder.eval_node_oslot(sess, m1,
                                oslot='cov')
   print("merge output", s3)
   print("merge output shape", s3.shape)