Computational Methods for Self-Adapting User Interfaces