device-check:
    python3 -c "import torch; print('CUDA available' if torch.cuda.is_available() else 'CPU only!')"


train-pens-a:
    python3 main.py alibi=true
train-pens-r:
    python3 main.py rope=true
train-pens-ar:
    python3 main.py alibi=true rope=true

tests:
    python3 -m pytest tests

generate-data:
    # Generate TSP-100 data.
    python3 -m data.generate --parallel --num_instances 1000000 --num_nodes 100 --output_filename data/tsp-train.npz --seed 123 --reorder
    python3 -m data.generate --parallel --num_instances 500 --num_nodes 100 --output_filename data/tsp-val.npz --seed 777
    python3 -m data.generate --parallel --num_instances 128 --num_nodes 100 --output_filename data/tsp-test.npz --seed 666

    # Generate bigger TSPs.
    # Generating in parallel can generate a lot of small files on disk, which
    # quickly takes a lot of space.
    python3 -m data.generate --parallel --num_instances 128 --num_nodes 200 --output_filename data/tsp-200.npz --seed 200
    python3 -m data.generate --parallel --num_instances 128 --num_nodes 250 --output_filename data/tsp-250.npz --seed 250
    python3 -m data.generate --parallel --num_instances 128 --num_nodes 500 --output_filename data/tsp-500.npz --seed 500
    python3 -m data.generate --parallel --num_instances 128 --num_nodes 1000 --output_filename data/tsp-1000.npz --seed 1000
    python3 -m data.generate --time_bound 21600 --num_instances 10 --num_nodes 10000 --output_filename data/tsp-10000.npz --seed 10000

    # For fast-pace experiments.
    python3 -m data.generate --parallel --num_instances 1000000 --num_nodes 20 --output_filename data/tsp-20-train.npz --seed 20 --reorder
    python3 -m data.generate --parallel --num_instances 256 --num_nodes 20 --output_filename data/tsp-20-val.npz --seed 21
    python3 -m data.generate --parallel --num_instances 256 --num_nodes 20 --output_filename data/tsp-20-test.npz --seed 22
    python3 -m data.generate --parallel --num_instances 256 --num_nodes 50 --output_filename data/tsp-50.npz --seed 23

    # TSPLIB instances.
    python3 -m data.convert_tsplib --instances ./data/tsplib/original/ --solutions ./data/tsplib/original/solutions.txt --output-dir ./data/tsplib/numpy/

    # Clean concorde logs.
    rm -f *.res *.sol *.pul *.sav

eval model:
    python3 evaluate.py --experiment-dir {{ model }} --n-estimates 5 ./data/tsp-test.npz ./data/tsp-200.npz ./data/tsp-250.npz ./data/tsp-500.npz ./data/tsp-1000.npz
    python3 evaluate.py --experiment-dir {{ model }} --n-estimates 5 --batch-size 2 ./data/tsp-10000.npz
    python3 evaluate.py --experiment-dir {{ model }} --n-estimates 5 --tsplib-max 100 ../generate/tsplib/numpy
    python3 evaluate.py --experiment-dir {{ model }} --n-estimates 5 --tsplib-min 101 --tsplib-max 1000 ../generate/tsplib/numpy
    python3 evaluate.py --experiment-dir {{ model }} --n-estimates 5 --tsplib-min 1001 --tsplib-max 10000 ../generate/tsplib/numpy
    python3 evaluate.py --experiment-dir {{ model }} --n-estimates 5 --tsplib-min 10001 --chunk-size 1024 ../generate/tsplib/numpy

    # Same with the scaling estimated factors.
    python3 evaluate.py --experiment-dir {{ model }} --scaling-factor --n-estimates 5 ./data/tsp-test.npz ./data/tsp-200.npz ./data/tsp-250.npz ./data/tsp-500.npz ./data/tsp-1000.npz
    python3 evaluate.py --experiment-dir {{ model }} --scaling-factor --n-estimates 5 --batch-size 2 ./data/tsp-10000.npz
    python3 evaluate.py --experiment-dir {{ model }} --scaling-factor --n-estimates 5 --tsplib-max 100 ../generate/tsplib/numpy
    python3 evaluate.py --experiment-dir {{ model }} --scaling-factor --n-estimates 5 --tsplib-min 101 --tsplib-max 1000 ../generate/tsplib/numpy
    python3 evaluate.py --experiment-dir {{ model }} --scaling-factor --n-estimates 5 --tsplib-min 1001 --tsplib-max 10000 ../generate/tsplib/numpy
    python3 evaluate.py --experiment-dir {{ model }} --scaling-factor --n-estimates 5 --tsplib-min 10001 --chunk-size 1024 ../generate/tsplib/numpy

figures:
    python3 -m analysis.scaling_factors -e outputs/PENS-A -fw 8 -fh 2 250 500 1000 10000
    python3 -m analysis.trend outputs/PENS-A outputs/PENS-R outputs/CoordNS -o outputs/trend.pdf
    python3 -m analysis.plot_ablations -o outputs/ablations/rope-ablation.pdf outputs/ablations/rope outputs/ablations/rope-random/ -n "Zero-init" "Gaussian-init"
    python3 -m analysis.attention_viz -d ./data/tsp-10000.npz -vmax -9 -o outputs/attention-viz.png outputs/CoordNS outputs/PENS-A outputs/PENS-R outputs/PENS-AR
    python3 -m analysis.sota_barplot -s 7.05 -fw 3 -fh 2 -o outputs/sota-barplot.pdf
