main.py

← Back to submission · View raw on GitHub

import argparse
import random
import simpy
from pathlib import Path
from src.config import load_scenario, load_csv_data
from src.topology import build_graph
from src.simulation import MineSimulation
from src.truck import truck_process
from src.output import generate_summary

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--scenario', type=str, required=True, help="Path to scenario yaml")
    parser.add_argument('--data-dir', type=str, default='data', help="Path to data dir")
    parser.add_argument('--out-dir', type=str, default='.', help="Output directory")
    args = parser.parse_args()
    
    config = load_scenario(Path(args.scenario))
    
    nodes = load_csv_data(Path(args.data_dir) / 'nodes.csv')
    edges = load_csv_data(Path(args.data_dir) / 'edges.csv')
    trucks_df = load_csv_data(Path(args.data_dir) / 'trucks.csv')
    
    if config.truck_count > len(trucks_df):
        raise ValueError(f"Configured truck_count ({config.truck_count}) exceeds available trucks in trucks.csv ({len(trucks_df)})")
        
    G = build_graph(nodes, edges)
    
    all_metrics = []
    
    for rep in range(config.replications):
        random.seed(config.base_random_seed + rep)
        env = simpy.Environment()
        sim = MineSimulation(env, config, G, rep)
        
        # Spawn trucks based on config (up to fleet limit in csv)
        truck_configs = trucks_df.head(config.truck_count).to_dict('records')
        for tc in truck_configs:
            env.process(truck_process(
                env, sim, tc['truck_id'], tc['start_node'], 
                tc['payload_tonnes'], tc['empty_speed_factor'], tc['loaded_speed_factor']
            ))
            
        env.run(until=config.shift_length_hours * 60)
        all_metrics.append(sim.metrics)
        print(f"Replication {rep+1}/{config.replications} finished. Tonnes: {sim.metrics.total_tonnes}")
        
    generate_summary(all_metrics, config, Path(args.out_dir) / 'summary.json')
    print("Done!")

if __name__ == '__main__':
    main()