How do OpenAI’s o1 and o3 models perform complex reasoning?