def jsDivergence( targetReal, targetInft, predReal, predInft ):
    m = td.multiply( 0.5, 0.0, *td.add( targetReal, targetInft, predReal, predInft ) )
    tpart = td.multiply( targetReal, targetInft, *td.log( *td.divide( targetReal, targetInft, *m ) ) )
    ppart = td.multiply( predReal, predInft, *td.log( *td.divide( predReal, predInft, *m ) ) )
    return td.multiply( 0.5, 0.0, *td.add( *tpart, *ppart ) )
def klDivergence( targetReal, targetInft, predReal, predInft ):
    return td.multiply( targetReal, targetInft, *td.log( *td.divide( targetReal, targetInft, predReal, predInft ) ) )
def crossEntropy( targetReal, targetInft, predReal, predInft ):
    return td.multiply( *td.neg( targetReal, targetInft ), *td.log( predReal, predInft ) )
def hinge( targetReal, targetInft, predReal, predInft ):
    t = tf.math.sign( targetReal )
    loss = td.subtract( 1.0, 0.0, *td.multiply( predReal, predInft, t, 0.0 ) )
    return td.where( tf.greater( loss[ 0 ], 0.0 ), *loss, 0.0, 0.0 )
def huber( targetReal, targetInft, predReal, predInft, delta=1.0 ):
    diff = td.subtract( targetReal, targetInft, predReal, predInft )
    ltd = td.multiply( *td.subtract( *diff, 0.5 * delta, 0.0 ), delta, 0.0 )
    full = td.multiply( *td.power( *diff, 2.0, 0.0 ), 0.5, 0.0 )
    return td.where( tf.greater( diff[ 0 ], delta ), *ltd, *full )
def leaky(real, inft, p=0.01):
    low = td.multiply(real, inft, p, 0.0)
    return td.where(tf.greater(real, 0.0), real, inft, *low)