# ✅ Dataset Prefix Pronto para Uso! **Data**: 2026-02-09 **Status**: ✅ COMPLETO E PUBLICADO --- ## 🎯 O Que Foi Feito ### 1. Conversão Completa ✅ - **12,221 expressões** convertidas de infix para prefix - **Taxa de sucesso**: 100% - **Tempo**: ~8 segundos - **Nova coluna**: `p_prompt_n_converted` ### 2. Upload para HuggingFace ✅ - **Repositório**: `augustocsc/sintetico_natural_prefix` - **URL**: https://huggingface.co/datasets/augustocsc/sintetico_natural_prefix - **Tamanho**: 2.30 MB (comprimido) - **Tempo de upload**: ~3 segundos --- ## 🚀 Como Usar o Dataset ### Carregar do HuggingFace Hub ```python from datasets import load_dataset # Carregar dataset convertido ds = load_dataset('augustocsc/sintetico_natural_prefix', split='train') print(f"Total de exemplos: {len(ds)}") print(f"Colunas: {ds.column_names}") # Ver exemplo print("\nExemplo:") print("INFIX:", ds[0]['i_prompt_n']) print("PREFIX:", ds[0]['p_prompt_n_converted']) ``` ### Carregar Localmente (se preferir) ```python from datasets import load_from_disk ds = load_from_disk('./1_data/processed/700K_prefix_converted') ``` --- ## 🏋️ Treinar Modelo com Formato Prefix ### Opção 1: Usando Script Existente (Adaptar) O script `2_training/supervised/train.py` precisa ser adaptado para usar a nova coluna. **Comando sugerido** (após adaptação): ```bash python 2_training/supervised/train.py \ --model_name_or_path gpt2 \ --dataset_repo_id augustocsc/sintetico_natural_prefix \ --data_dir . \ --data_column p_prompt_n_converted \ --approach prefix \ --output_dir ./output/gpt2_prefix_converted \ --num_train_epochs 3 \ --per_device_train_batch_size 8 \ --learning_rate 5e-5 \ --fp16 \ --wandb_project seriguela \ --wandb_run_name gpt2-prefix-converted ``` ### Opção 2: Script Customizado ```python #!/usr/bin/env python """Train GPT-2 with prefix notation dataset.""" from datasets import load_dataset from transformers import ( AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForLanguageModeling ) from peft import LoraConfig, get_peft_model, TaskType # Load dataset print("Loading prefix dataset...") dataset = load_dataset('augustocsc/sintetico_natural_prefix', split='train') # Use p_prompt_n_converted column dataset = dataset.rename_column('p_prompt_n_converted', 'text') # Load tokenizer and model tokenizer = AutoTokenizer.from_pretrained('gpt2') tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained('gpt2') # LoRA configuration lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["c_attn"], lora_dropout=0.05, bias="none", task_type=TaskType.CAUSAL_LM ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() # Tokenize def tokenize_function(examples): return tokenizer(examples["text"], truncation=True, max_length=128) tokenized_dataset = dataset.map(tokenize_function, batched=True, remove_columns=dataset.column_names) # Data collator data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False) # Training arguments training_args = TrainingArguments( output_dir="./output/gpt2_prefix_converted", num_train_epochs=3, per_device_train_batch_size=8, learning_rate=5e-5, gradient_accumulation_steps=4, warmup_steps=500, weight_decay=0.01, logging_steps=100, save_strategy="epoch", save_total_limit=2, fp16=True, report_to="wandb", run_name="gpt2-prefix-converted" ) # Trainer trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_dataset, data_collator=data_collator, ) # Train print("Starting training...") trainer.train() # Save trainer.save_model() print("Model saved to ./output/gpt2_prefix_converted") ``` --- ## 📊 Comparação: Infix vs Prefix Agora você pode treinar dois modelos com a **MESMA expressão** em notações diferentes: ### Modelo A: Infix (Baseline) ```bash python 2_training/supervised/train.py \ --dataset_repo_id augustocsc/sintetico_natural \ --data_column i_prompt_n \ --approach infix \ --output_dir ./output/gpt2_infix_baseline ``` ### Modelo B: Prefix (Novo) ```bash python 2_training/supervised/train.py \ --dataset_repo_id augustocsc/sintetico_natural_prefix \ --data_column p_prompt_n_converted \ --approach prefix \ --output_dir ./output/gpt2_prefix_converted ``` ### Comparar Resultados ```bash python 3_evaluation/comparison/compare_trained_models.py \ --model_base ./output/gpt2_infix_baseline \ --model_medium ./output/gpt2_prefix_converted \ --dataset 1_data/benchmarks/nguyen/nguyen_5.csv \ --epochs 10 ``` **Pergunta de Pesquisa**: Qual notação o modelo aprende melhor? --- ## 🔍 Validar Conversão ### Script de Validação ```python #!/usr/bin/env python """Validate that prefix conversion is correct.""" from datasets import load_dataset from classes.expression import Expression import numpy as np # Load dataset ds = load_dataset('augustocsc/sintetico_natural_prefix', split='train') print("Validating prefix conversions...") errors = 0 for i in range(min(100, len(ds))): # Test first 100 try: # Parse infix infix_text = ds[i]['i_prompt_n'].split('expr:')[1].strip() expr_infix = Expression(infix_text, is_prefix=False) # Parse prefix converted prefix_text = ds[i]['p_prompt_n_converted'].split('expr:')[1].strip() expr_prefix = Expression(prefix_text, is_prefix=True) # Test on random data x = np.random.rand(10, 5) # 10 samples, 5 variables result_infix = expr_infix.evaluate(x) result_prefix = expr_prefix.evaluate(x) # Compare if not np.allclose(result_infix, result_prefix, rtol=1e-5): print(f"[ERROR] Example {i}: Results don't match!") print(f" Infix: {infix_text}") print(f" Prefix: {prefix_text}") errors += 1 except Exception as e: print(f"[ERROR] Example {i}: {e}") errors += 1 if errors == 0: print(f"\n✅ All 100 conversions validated successfully!") else: print(f"\n❌ {errors}/100 conversions had errors") ``` --- ## 📝 Exemplos do Dataset ### Exemplo 1: Expressão Complexa **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 CONVERTIDO**: ``` 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: Expressão com Funções Aninhadas **INFIX**: ``` vars: x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10 oper: **, +, -, /, cos, exp, sin, sqrt cons: C expr: x_2 - x_1 + sin(exp(x_9)) ``` **PREFIX CONVERTIDO**: ``` vars: x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_8, x_9, x_10 oper: **, +, -, /, cos, exp, sin, sqrt cons: C expr: + + x_2 * -1 x_1 sin exp x_9 ``` ### Exemplo 3: Expressão Simples **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 CONVERTIDO**: ``` 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 ``` --- ## 🎓 Vantagens do Formato Prefix ### 1. Estrutura Mais Clara - Operador sempre vem primeiro - Não precisa de parênteses - Ordem de avaliação explícita ### 2. Parsing Mais Simples - Algoritmo stack-based - Sem ambiguidade de precedência - Mais eficiente ### 3. Comparabilidade - Agora pode comparar infix vs prefix com mesmas expressões - Isola efeito da notação do efeito da expressão --- ## 📚 Arquivos Criados 1. ✅ `scripts/data/convert_infix_to_prefix.py` - Script de conversão 2. ✅ `1_data/processed/700K_prefix_converted/` - Dataset local 3. ✅ `1_data/processed/PREFIX_CONVERSION_README.md` - Guia técnico 4. ✅ `DATASET_PREFIX_CONVERTED_STATUS.md` - Status da conversão 5. ✅ `DATASET_PREFIX_READY.md` - Este arquivo (instruções de uso) 6. ✅ **HuggingFace Hub**: `augustocsc/sintetico_natural_prefix` --- ## 🚀 Próximos Passos Recomendados ### 1. Testar Treinamento ```bash # Teste rápido (1 época) python train_prefix.py --num_train_epochs 1 --save_strategy no ``` ### 2. Comparar com Infix Treinar ambos os modelos e comparar: - Valid expression rate - R² scores em Nguyen benchmarks - Diversidade de expressões - Complexidade das expressões geradas ### 3. Publicar Resultados - Documentar diferenças de performance - Criar model cards para ambos - Adicionar ao relatório de pesquisa --- ## ✅ Checklist Completo - [x] Dataset convertido (12,221 exemplos) - [x] Taxa de sucesso 100% - [x] Dataset salvo localmente - [x] Upload para HuggingFace Hub - [x] Documentação completa criada - [ ] Treinamento de modelo teste - [ ] Comparação infix vs prefix - [ ] Publicação de resultados --- ## 🔗 Links Importantes - **Dataset no HuggingFace**: https://huggingface.co/datasets/augustocsc/sintetico_natural_prefix - **Dataset Original**: https://huggingface.co/datasets/augustocsc/sintetico_natural - **Script de Conversão**: `scripts/data/convert_infix_to_prefix.py` - **Documentação Técnica**: `1_data/processed/PREFIX_CONVERSION_README.md` --- ## 🤝 Contribuindo Se encontrar algum problema: 1. Verificar se a conversão está correta (validação script) 2. Reportar issue no GitHub 3. Sugerir melhorias no algoritmo de conversão --- **Pronto para treinar! 🚀** ```bash # Comando exemplo para começar python 2_training/supervised/train.py \ --dataset_repo_id augustocsc/sintetico_natural_prefix \ --data_column p_prompt_n_converted \ --approach prefix \ --output_dir ./output/gpt2_prefix_converted \ --num_train_epochs 3 ``` --- **Data de Criação**: 2026-02-09 **Status**: ✅ PRONTO PARA USO **Autor**: Claude Sonnet 4.5 (co-authored)