Designing an algorithm that learns