tahamajs's picture
download
raw
10.7 kB
#!/usr/bin/env python3
import argparse
import torch
import numpy as np
import json
import os
import sys
from typing import Dict, List, Tuple
from pathlib import Path
from neural_program_synthesis import (
Seq2SeqProgramSynthesizer,
TransformerProgramSynthesizer,
CodeGraphEncoder,
MultiModalCodeEncoder,
TemplateSynthesizer,
Seq2SeqTrainer,
ProgramEvaluator,
PythonExecutor,
JavaScriptExecutor,
SimpleTokenizer,
SimpleTemplate,
compare_programs,
)
from train import train_model, save_checkpoint, load_checkpoint
from eval import evaluate_model, generate_programs
from data_generator import generate_synthetic_data, create_dataset
def setup_args() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
description="Neural Program Synthesis Pipeline",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument(
"--model_type",
type=str,
default="seq2seq",
choices=["seq2seq", "transformer", "graph"],
help="Type of neural architecture to use",
)
parser.add_argument(
"--vocab_size", type=int, default=1000, help="Vocabulary size for tokenization"
)
parser.add_argument(
"--embedding_dim", type=int, default=256, help="Embedding dimension"
)
parser.add_argument(
"--hidden_dim", type=int, default=512, help="Hidden dimension for RNN/LSTM"
)
parser.add_argument(
"--num_layers", type=int, default=2, help="Number of layers in model"
)
parser.add_argument(
"--nhead",
type=int,
default=8,
help="Number of attention heads (for transformer)",
)
parser.add_argument(
"--batch_size", type=int, default=32, help="Batch size for training"
)
parser.add_argument(
"--learning_rate", type=float, default=0.001, help="Learning rate"
)
parser.add_argument(
"--num_epochs", type=int, default=100, help="Number of training epochs"
)
parser.add_argument(
"--max_length", type=int, default=100, help="Maximum sequence length"
)
parser.add_argument(
"--train_size", type=int, default=1000, help="Number of training samples"
)
parser.add_argument(
"--val_size", type=int, default=200, help="Number of validation samples"
)
parser.add_argument(
"--test_size", type=int, default=300, help="Number of test samples"
)
parser.add_argument(
"--mode",
type=str,
default="full",
choices=["train", "eval", "generate", "full"],
help="Execution mode",
)
parser.add_argument(
"--checkpoint", type=str, default=None, help="Path to model checkpoint"
)
parser.add_argument(
"--output_dir", type=str, default="./results", help="Directory to save results"
)
parser.add_argument(
"--device", type=str, default="auto", help="Device to use (auto/cpu/cuda)"
)
parser.add_argument(
"--task",
type=str,
default="arithmetic",
choices=["arithmetic", "string", "list_ops", "custom"],
help="Type of program synthesis task",
)
parser.add_argument(
"--specification",
type=str,
default=None,
help="Natural language specification for generation",
)
return parser
def setup_device(device_str: str) -> torch.device:
if device_str == "auto":
if torch.cuda.is_available():
device = torch.device("cuda")
print("Using CUDA device")
else:
device = torch.device("cpu")
print("Using CPU device")
else:
device = torch.device(device_str)
print(f"Using device: {device}")
return device
def setup_model(args) -> Tuple[torch.nn.Module, torch.optim.Optimizer, torch.device]:
device = setup_device(args.device)
tokenizer = SimpleTokenizer(args.vocab_size)
if args.model_type == "seq2seq":
model = Seq2SeqProgramSynthesizer(
vocab_size=args.vocab_size,
embedding_dim=args.embedding_dim,
hidden_dim=args.hidden_dim,
num_layers=args.num_layers,
)
elif args.model_type == "transformer":
model = TransformerProgramSynthesizer(
vocab_size=args.vocab_size,
d_model=args.embedding_dim,
nhead=args.nhead,
num_layers=args.num_layers,
)
elif args.model_type == "graph":
model = CodeGraphEncoder(
vocab_size=args.vocab_size,
embedding_dim=args.embedding_dim,
hidden_dim=args.hidden_dim,
)
else:
raise ValueError(f"Unsupported model type: {args.model_type}")
model = model.to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=args.learning_rate)
if args.checkpoint and os.path.exists(args.checkpoint):
checkpoint = load_checkpoint(args.checkpoint)
model.load_state_dict(checkpoint["model_state_dict"])
optimizer.load_state_dict(checkpoint["optimizer_state_dict"])
print(f"Loaded checkpoint from {args.checkpoint}")
return model, optimizer, device, tokenizer
def create_arithmetic_templates() -> List[SimpleTemplate]:
templates = [
SimpleTemplate("result = {a} + {b}", ["a", "b"]),
SimpleTemplate("result = {a} - {b}", ["a", "b"]),
SimpleTemplate("result = {a} * {b}", ["a", "b"]),
SimpleTemplate("result = {a} / {b}", ["a", "b"]),
SimpleTemplate("result = pow({a} * {b}, 2)", ["a", "b"]),
SimpleTemplate("result = abs({a} - {b})", ["a", "b"]),
]
return templates
def setup_arithmetic_task(args) -> Dict:
print("Setting up arithmetic program synthesis task...")
templates = create_arithmetic_templates()
train_data = generate_synthetic_data(
task="arithmetic",
num_samples=args.train_size,
templates=templates,
tokenizer_vocab_size=args.vocab_size,
)
val_data = generate_synthetic_data(
task="arithmetic",
num_samples=args.val_size,
templates=templates,
tokenizer_vocab_size=args.vocab_size,
)
test_data = generate_synthetic_data(
task="arithmetic",
num_samples=args.test_size,
templates=templates,
tokenizer_vocab_size=args.vocab_size,
)
train_dataset = create_dataset(train_data, args.max_length)
val_dataset = create_dataset(val_data, args.max_length)
test_dataset = create_dataset(test_data, args.max_length)
return {
"train_dataset": train_dataset,
"val_dataset": val_dataset,
"test_dataset": test_dataset,
"templates": templates,
}
def run_training_pipeline(args, model, optimizer, device, tokenizer, task_data):
print("Starting training pipeline...")
if args.model_type in ["seq2seq", "transformer"]:
trainer = Seq2SeqTrainer(model, optimizer, device)
else:
trainer = None
print(f"Warning: No specific trainer for {args.model_type}, using generic")
train_history = train_model(
model=model,
trainer=trainer,
train_dataset=task_data["train_dataset"],
val_dataset=task_data["val_dataset"],
epochs=args.num_epochs,
batch_size=args.batch_size,
device=device,
save_dir=args.output_dir,
)
print("Training completed!")
return train_history
def run_evaluation_pipeline(args, model, device, tokenizer, task_data):
print("Starting evaluation pipeline...")
evaluator = ProgramEvaluator()
eval_results = evaluate_model(
model=model,
test_dataset=task_data["test_dataset"],
evaluator=evaluator,
device=device,
batch_size=args.batch_size,
)
print("Evaluation completed!")
return eval_results
def run_generation_pipeline(args, model, device, tokenizer):
print("Starting program generation pipeline...")
if args.specification:
print(f"Generating program for: {args.specification}")
spec_tokens = tokenizer.tokenize(args.specification)
spec_tensor = torch.tensor([spec_tokens], dtype=torch.long).to(device)
spec_lengths = torch.tensor([len(spec_tokens)], dtype=torch.long)
generated_programs = generate_programs(
model=model,
input_specifications=spec_tensor,
input_lengths=spec_lengths,
tokenizer=tokenizer,
device=device,
max_length=args.max_length,
)
print("Generated programs:")
for i, program in enumerate(generated_programs):
print(f"Program {i+1}: {program}")
return generated_programs
else:
print("No specification provided. Please provide --specification")
return []
def save_results(args, results: Dict):
os.makedirs(args.output_dir, exist_ok=True)
results_file = os.path.join(args.output_dir, "results.json")
with open(results_file, "w") as f:
json.dump(results, f, indent=2)
config = vars(args)
config_file = os.path.join(args.output_dir, "config.json")
with open(config_file, "w") as f:
json.dump(config, f, indent=2)
print(f"Results saved to {args.output_dir}")
def main():
parser = setup_args()
args = parser.parse_args()
print("=" * 60)
print("NEURAL PROGRAM SYNTHESIS PIPELINE")
print("=" * 60)
print(f"Task: {args.task}")
print(f"Model: {args.model_type}")
print(f"Mode: {args.mode}")
print("=" * 60)
try:
model, optimizer, device, tokenizer = setup_model(args)
task_data = setup_arithmetic_task(args)
results = {}
if args.mode in ["train", "full"]:
train_history = run_training_pipeline(
args, model, optimizer, device, tokenizer, task_data
)
results["training"] = train_history
if args.mode in ["eval", "full"]:
eval_results = run_evaluation_pipeline(
args, model, device, tokenizer, task_data
)
results["evaluation"] = eval_results
if args.mode in ["generate", "full"]:
generated_programs = run_generation_pipeline(args, model, device, tokenizer)
results["generation"] = generated_programs
save_results(args, results)
print("\n" + "=" * 60)
print("PIPELINE COMPLETED SUCCESSFULLY!")
print("=" * 60)
except Exception as e:
print(f"\nError during execution: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()

Xet Storage Details

Size:
10.7 kB
·
Xet hash:
0199bd686d48b56c828e869569330eb3dcd5c6c3883303479313f37a3239d967

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.