File size: 5,929 Bytes
a1190da |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# 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**:
1. Lê expressões infix do campo `i_prompt_n`
2. Parseia usando SymPy
3. Converte para notação prefix (Polish notation)
4. Mantém as mesmas variáveis e operadores do prompt original
5. 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 como `x * y**-1`, conversão detecta e corrige)
## Uso do Script
### Teste (10 exemplos)
```bash
python scripts/data/convert_infix_to_prefix.py --test_only
```
### Conversão Completa
```bash
python scripts/data/convert_infix_to_prefix.py \
--split test \
--output_path ./1_data/processed/700K_prefix_converted
```
### Upload para HuggingFace
```bash
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 infix
- `conversion_success`: Boolean indicando se conversão foi bem-sucedida
**Taxa de sucesso esperada**: ~99%+
## Vantagens
1. **Comparabilidade**: Agora é possível treinar modelos prefix com as MESMAS expressões dos modelos infix
2. **Consistência**: Mantém vars/operators/constants do prompt original
3. **Reprodutibilidade**: Conversão automática e determinística
4. **Escalabilidade**: Fácil aplicar a novos datasets
## Treinamento com Dataset Convertido
### Usando o dataset local
```bash
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:
1. Parsear expressão prefix convertida
2. Avaliar em pontos de teste
3. Comparar com avaliação da expressão infix original
4. R² score deve ser ~1.0 (mesma expressão, mesmos resultados)
```python
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
1. **Expressões muito complexas**: Pode haver casos edge com aninhamento profundo
2. **Operadores customizados**: Se houver operadores não mapeados no SymPy
3. **Simplificação automática**: SymPy pode simplificar algumas expressões, alterando forma mas não valor
## Status
- [x] Script de conversão implementado
- [x] 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
|