generator and discriminator algorithms