constraint learning