In [4]:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import numpy as np
import tensorflow as tf

In [11]:
class OptimizadorN(list):#tf.Operation): Eddy Yaneth Mesa Delgado tesis doctorado y maestria  sinab
    '''
    Eddy Yaneth Mesa Delgado tesis doctorado y maestria  sinab
    1. hacerle benchmark, proveer a los investigadores una herramienta para hacer validacion del rendimiento de la libreria
    2. Incluir variaciones a la definicion del problema, restricciones y penalizaciones
    3. Ejemplos y casos de prueba reales
    '''
    def set_objetive(self,obj):
        self.obj= obj
    
    def __init__(self, T = 100):
        self.variables = tf.global_variables()
        self.T = T
        #self._graph = tf.get_default_graph()
        #self._c_op = None
    def method(self):
        f_old = self.obj.eval()
        var = []
        dependencies = []
        for variable in self.variables:
            var.append (variable.assign(variable.eval()))
            dependencies.append (variable.assign(variable.eval() - np.random.uniform()))
        with tf.control_dependencies(dependencies):
        #print(sess.run([ y_update, x_update]))
            nodes = dependencies
            delta = f.eval() - f_old
            if delta > 0 :
                next
            elif pow(np.e, -delta/ self.T) >= np.random.uniform():
                #print("probablidad" + str(pow(np.e, -delta/ self.T)))
                next
            else:
                nodes = var
        self.operaciones = nodes
        super().extend(self.operaciones)
        
    def eval(self):
        self.method()
        return(self.operaciones)

In [12]:
x = tf.Variable(-20, np.float32)
y = tf.Variable(-30, np.float32)
f = tf.pow(tf.add(x,y), 2)

In [13]:
opt =OptimizadorN()
opt.set_objetive(f)
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op);
    #la funcion solo returna los nodos del grafo que deben ser ejecutados, a la final yo los encadeno en evaluar el assign del 
    #valor en el que deben terminar las variables  
    print(sess.run(opt.eval()))
    #Vea que si se necesita que sea un tensor para mandarlo directo
    print(sess.run(opt))


[-20, -30, -20, -30, -20, -30]
[-20, -30, -20, -30, -20, -30]