variational algorithms