Conversão Infix → Prefix Dataset
Objetivo
Converter o dataset augustocsc/sintetico_natural de notação infix para prefix (Polish notation), mantendo as mesmas expressões matemáticas mas em formato prefixado.
Motivação
O dataset original contém:
i_prompt_n: Prompts com expressões em notação infix (e.g.,x_1 + x_2)p_prompt_n: Prompts com expressões em notação prefix (e.g.,+ x_1 x_2)
PROBLEMA: As expressões em i_prompt_n e p_prompt_n são DIFERENTES! Não são a mesma expressão convertida.
SOLUÇÃO: Converter automaticamente as expressões de i_prompt_n para notação prefix, criando p_prompt_n_converted.
Script de Conversão
Arquivo: scripts/data/convert_infix_to_prefix.py
Funcionalidade:
- Lê expressões infix do campo
i_prompt_n - Parseia usando SymPy
- Converte para notação prefix (Polish notation)
- Mantém as mesmas variáveis e operadores do prompt original
- Salva em nova coluna
p_prompt_n_converted
Exemplos de Conversão
Exemplo 1
INFIX:
vars: x_1, x_2, x_3, x_4, x_5
oper: *, +, -, /, abs, asin, cos, exp, log, sin, sqrt, tan
cons: C
expr: x_2 - (x_5 - C)*(x_4 + exp(C*x_2) + C)
PREFIX:
vars: x_1, x_2, x_3, x_4, x_5
oper: *, +, -, /, abs, asin, cos, exp, log, sin, sqrt, tan
cons: C
expr: - x_2 * - x_5 C + + x_4 exp * C x_2 C
Exemplo 2
INFIX:
vars: x_1, x_2, x_3
oper: +, -, /, abs, cos, exp
cons: C
expr: (x_1 - C)/(x_2 + C)
PREFIX:
vars: x_1, x_2, x_3
oper: +, -, /, abs, cos, exp
cons: C
expr: / - x_1 C + x_2 C
Exemplo 3
INFIX:
vars: x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10
oper: *, +, /, asin, sin, tan
cons: C
expr: (tan(x_7) + C)*(asin(x_5) + C)
PREFIX:
vars: x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10
oper: *, +, /, asin, sin, tan
cons: C
expr: * + tan x_7 C + asin x_5 C
Regras de Conversão
Operadores Binários
- Infix:
a + b→ Prefix:+ a b - Infix:
a - b→ Prefix:- a b - Infix:
a * b→ Prefix:* a b - Infix:
a / b→ Prefix:/ a b - Infix:
a ** b→ Prefix:** a b
Funções Unárias
- Infix:
sin(x)→ Prefix:sin x - Infix:
exp(x)→ Prefix:exp x - Infix:
log(x)→ Prefix:log x
Expressões Complexas
- Infix:
sin(x**2)→ Prefix:sin ** x 2 - Infix:
x*(y + z)→ Prefix:* x + y z - Infix:
(a + b)*(c + d)→ Prefix:* + a b + c d
Casos Especiais
- Negação:
-x→* -1 x - Múltiplas adições:
a + b + c→+ + a b c(aninhado à esquerda) - Divisão:
x/y→/ x y(SymPy representa comox * y**-1, conversão detecta e corrige)
Uso do Script
Teste (10 exemplos)
python scripts/data/convert_infix_to_prefix.py --test_only
Conversão Completa
python scripts/data/convert_infix_to_prefix.py \
--split test \
--output_path ./1_data/processed/700K_prefix_converted
Upload para HuggingFace
python scripts/data/convert_infix_to_prefix.py \
--split test \
--output_path ./1_data/processed/700K_prefix_converted \
--upload \
--repo_id augustocsc/sintetico_natural_prefix_converted
Output do Dataset
Colunas adicionadas:
p_prompt_n_converted: Prompt prefixado convertido do infixconversion_success: Boolean indicando se conversão foi bem-sucedida
Taxa de sucesso esperada: ~99%+
Vantagens
- Comparabilidade: Agora é possível treinar modelos prefix com as MESMAS expressões dos modelos infix
- Consistência: Mantém vars/operators/constants do prompt original
- Reprodutibilidade: Conversão automática e determinística
- Escalabilidade: Fácil aplicar a novos datasets
Treinamento com Dataset Convertido
Usando o dataset local
python 2_training/supervised/train.py \
--dataset_path ./1_data/processed/700K_prefix_converted \
--data_column p_prompt_n_converted \
--approach prefix \
--output_dir ./output/gpt2_prefix_converted
Comparação: Infix vs Prefix (mesma expressão)
Agora você pode treinar dois modelos com a MESMA expressão:
- Modelo A:
--data_column i_prompt_n --approach infix - Modelo B:
--data_column p_prompt_n_converted --approach prefix
E comparar diretamente qual notação o modelo aprende melhor!
Validação
Para verificar a correção da conversão:
- Parsear expressão prefix convertida
- Avaliar em pontos de teste
- Comparar com avaliação da expressão infix original
- R² score deve ser ~1.0 (mesma expressão, mesmos resultados)
from classes.expression import Expression
# Expressão infix original
expr_infix = Expression("x_1 + x_2", is_prefix=False)
# Expressão prefix convertida
expr_prefix = Expression("+ x_1 x_2", is_prefix=True)
# Testar
import numpy as np
x = np.array([[1.0, 2.0], [3.0, 4.0]])
result_infix = expr_infix.evaluate(x)
result_prefix = expr_prefix.evaluate(x)
# Devem ser idênticos
assert np.allclose(result_infix, result_prefix)
Limitações Conhecidas
- Expressões muito complexas: Pode haver casos edge com aninhamento profundo
- Operadores customizados: Se houver operadores não mapeados no SymPy
- Simplificação automática: SymPy pode simplificar algumas expressões, alterando forma mas não valor
Status
- Script de conversão implementado
- Testes em 10 exemplos (100% sucesso)
- Conversão dataset completo (~12k exemplos)
- Upload para HuggingFace Hub
- Treinamento de modelo teste
- Comparação infix vs prefix
Referências
- Polish Notation: https://en.wikipedia.org/wiki/Polish_notation
- SymPy Documentation: https://docs.sympy.org/
- Dataset Original: https://huggingface.co/datasets/augustocsc/sintetico_natural
Data de Criação: 2026-02-09 Autor: Claude Sonnet 4.5 (co-authored) Última Atualização: 2026-02-09