CasmiRun(
        loop=CasmiTrainLoop(
        │   study_name='casmi2026-training',
        │   experiment_name='train_exp001',
        │   base_dir='/opt/scratch',
        │   working_dir=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001'),
        │   doc='',
        │   step=FingerprintFineTune.Config(
        │   │   model=FPNet.Config(
        │   │   │   channels_out=10_226,
        │   │   │   channels_hidden=128,
        │   │   │   num_layers=2,
        │   │   │   block=Block.Config(
        │   │   │   │   channels_in=128,
        │   │   │   │   channels_out=128,
        │   │   │   │   attn=PeakAttention.Config(
        │   │   │   │   │   channels_in=128,
        │   │   │   │   │   channels_out=128,
        │   │   │   │   │   attention=Attention.Config(
        │   │   │   │   │       channels_in=128,
        │   │   │   │   │       channels_out=128,
        │   │   │   │   │       num_heads=8,
        │   │   │   │   │       channels_head=16,
        │   │   │   │   │       num_heads_kv=8,
        │   │   │   │   │       bias=False,
        │   │   │   │   │       dropout=0.0,
        │   │   │   │   │       causal=False,
        │   │   │   │   │       rope=None,
        │   │   │   │   │       rotate=None,
        │   │   │   │   │       norm_qk=None,
        │   │   │   │   │       share_qk_norm=True,
        │   │   │   │   │       norm_out=None,
        │   │   │   │   │       split_qkv_projection=False,
        │   │   │   │   │       proj_qkv=Linear.Config(
        │   │   │   │   │           channels_in=128,
        │   │   │   │   │           channels_out=384,
        │   │   │   │   │           bias=True,
        │   │   │   │   │           depth_index=(),
        │   │   │   │   │           device=None,
        │   │   │   │   │           dtype=None,
        │   │   │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │   │   │           init_bias=None,
        │   │   │   │   │           linear_fn=<built-in function linear>,
        │   │   │   │   │           shard=None
        │   │   │   │   │       ),
        │   │   │   │   │       proj_out=Linear.Config(
        │   │   │   │   │           channels_in=128,
        │   │   │   │   │           channels_out=128,
        │   │   │   │   │           bias=True,
        │   │   │   │   │           depth_index=(),
        │   │   │   │   │           device=None,
        │   │   │   │   │           dtype=None,
        │   │   │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │   │   │           init_bias=None,
        │   │   │   │   │           linear_fn=<built-in function linear>,
        │   │   │   │   │           shard=None
        │   │   │   │   │       ),
        │   │   │   │   │       init_weight=priml.model.init.kaiming_uniform,
        │   │   │   │   │       depth_index=(),
        │   │   │   │   │       attn_kernel=SdpaFused.Config()
        │   │   │   │   │   ),
        │   │   │   │   │   drop=Dropout.Config(
        │   │   │   │   │       channels_in=128,
        │   │   │   │   │       channels_out=128,
        │   │   │   │   │       p=0.1,
        │   │   │   │   │       inplace=False
        │   │   │   │   │   )
        │   │   │   │   ),
        │   │   │   │   ffn=Sequential.Config(
        │   │   │   │   │   channels_in=128,
        │   │   │   │   │   channels_out=128,
        │   │   │   │   │   elements=[
        │   │   │   │   │   │   SwiGLU.Config(
        │   │   │   │   │   │       channels_in=128,
        │   │   │   │   │   │       channels_out=128,
        │   │   │   │   │   │       channels_hidden=512,
        │   │   │   │   │   │       expansion=4.0,
        │   │   │   │   │   │       round_to=1,
        │   │   │   │   │   │       gate=False,
        │   │   │   │   │   │       bias=False,
        │   │   │   │   │   │       split_gate_projection=False,
        │   │   │   │   │   │       norm=None,
        │   │   │   │   │   │       act=priml.model.swiglu.gelu,
        │   │   │   │   │   │       depth_index=(),
        │   │   │   │   │   │       init_weight=priml.model.init.unit_fan_in_uniform,
        │   │   │   │   │   │       init_weight_out=torch.nn.init.zeros_,
        │   │   │   │   │   │       up_proj=Linear.Config(
        │   │   │   │   │   │           channels_in=128,
        │   │   │   │   │   │           channels_out=512,
        │   │   │   │   │   │           bias=True,
        │   │   │   │   │   │           depth_index=(),
        │   │   │   │   │   │           device=None,
        │   │   │   │   │   │           dtype=None,
        │   │   │   │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │   │   │   │           init_bias=None,
        │   │   │   │   │   │           linear_fn=<built-in function linear>,
        │   │   │   │   │   │           shard=None
        │   │   │   │   │   │       ),
        │   │   │   │   │   │       middle=Dropout.Config(
        │   │   │   │   │   │           channels_in=512,
        │   │   │   │   │   │           channels_out=512,
        │   │   │   │   │   │           p=0.1,
        │   │   │   │   │   │           inplace=False
        │   │   │   │   │   │       ),
        │   │   │   │   │   │       down_proj=Linear.Config(
        │   │   │   │   │   │           channels_in=512,
        │   │   │   │   │   │           channels_out=128,
        │   │   │   │   │   │           bias=True,
        │   │   │   │   │   │           depth_index=(),
        │   │   │   │   │   │           device=None,
        │   │   │   │   │   │           dtype=None,
        │   │   │   │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │   │   │   │           init_bias=None,
        │   │   │   │   │   │           linear_fn=<built-in function linear>,
        │   │   │   │   │   │           shard=None
        │   │   │   │   │   │       ),
        │   │   │   │   │   │       shard=None
        │   │   │   │   │   │   ),
        │   │   │   │   │   │   Dropout.Config(
        │   │   │   │   │   │       channels_in=128,
        │   │   │   │   │   │       channels_out=128,
        │   │   │   │   │   │       p=0.1,
        │   │   │   │   │   │       inplace=False
        │   │   │   │   │   │   )
        │   │   │   │   │   ],
        │   │   │   │   │   repeat=1,
        │   │   │   │   │   depth_index=()
        │   │   │   │   ),
        │   │   │   │   norm1=LayerNorm.Config(
        │   │   │   │       channels_in=128,
        │   │   │   │       channels_out=128,
        │   │   │   │       eps=1e-05,
        │   │   │   │       elementwise_affine=True,
        │   │   │   │       device=None,
        │   │   │   │       dtype=None
        │   │   │   │   ),
        │   │   │   │   norm2=LayerNorm.Config(
        │   │   │   │       channels_in=128,
        │   │   │   │       channels_out=128,
        │   │   │   │       eps=1e-05,
        │   │   │   │       elementwise_affine=True,
        │   │   │   │       device=None,
        │   │   │   │       dtype=None
        │   │   │   │   ),
        │   │   │   │   prenorm=True,
        │   │   │   │   checkpoint=False,
        │   │   │   │   depth_index=()
        │   │   │   ),
        │   │   │   mz_emb=SinEmb.Config(channels_out=128, lo=-2.0, hi=3.3, power=1.0),
        │   │   │   nl_emb=SinEmb.Config(channels_out=128, lo=-2.0, hi=3.3, power=1.0),
        │   │   │   prec_emb=SinEmb.Config(channels_out=128, lo=-2.0, hi=3.3, power=1.0),
        │   │   │   ce_emb=SinEmb.Config(channels_out=32, lo=0.0, hi=2.2, power=1.0),
        │   │   │   int_emb=Linear.Config(
        │   │   │       channels_in=2,
        │   │   │       channels_out=128,
        │   │   │       bias=True,
        │   │   │       depth_index=(),
        │   │   │       device=None,
        │   │   │       dtype=None,
        │   │   │       init_weight=priml.model.init.kaiming_uniform,
        │   │   │       init_bias=None,
        │   │   │       linear_fn=<built-in function linear>,
        │   │   │       shard=None
        │   │   │   ),
        │   │   │   pk=Linear.Config(
        │   │   │       channels_in=384,
        │   │   │       channels_out=128,
        │   │   │       bias=True,
        │   │   │       depth_index=(),
        │   │   │       device=None,
        │   │   │       dtype=None,
        │   │   │       init_weight=priml.model.init.kaiming_uniform,
        │   │   │       init_bias=None,
        │   │   │       linear_fn=<built-in function linear>,
        │   │   │       shard=None
        │   │   │   ),
        │   │   │   adduct=Embedding.Config(
        │   │   │       channels_in=60,
        │   │   │       channels_out=128,
        │   │   │       padding_idx=None,
        │   │   │       device=None,
        │   │   │       dtype=None,
        │   │   │       lookup_dtype=None,
        │   │   │       shard=None,
        │   │   │       depth_index=(),
        │   │   │       init_weight=torch.nn.init.normal_
        │   │   │   ),
        │   │   │   gl=Linear.Config(
        │   │   │       channels_in=164,
        │   │   │       channels_out=128,
        │   │   │       bias=True,
        │   │   │       depth_index=(),
        │   │   │       device=None,
        │   │   │       dtype=None,
        │   │   │       init_weight=priml.model.init.kaiming_uniform,
        │   │   │       init_bias=None,
        │   │   │       linear_fn=<built-in function linear>,
        │   │   │       shard=None
        │   │   │   ),
        │   │   │   norm=LayerNorm.Config(
        │   │   │       channels_in=128,
        │   │   │       channels_out=128,
        │   │   │       eps=1e-05,
        │   │   │       elementwise_affine=True,
        │   │   │       device=None,
        │   │   │       dtype=None
        │   │   │   ),
        │   │   │   head=SwiGLU.Config(
        │   │   │       channels_in=256,
        │   │   │       channels_out=10_226,
        │   │   │       channels_hidden=2_048,
        │   │   │       expansion=4.0,
        │   │   │       round_to=256,
        │   │   │       gate=False,
        │   │   │       bias=False,
        │   │   │       split_gate_projection=False,
        │   │   │       norm=None,
        │   │   │       act=priml.model.swiglu.gelu,
        │   │   │       depth_index=(),
        │   │   │       init_weight=priml.model.init.unit_fan_in_uniform,
        │   │   │       init_weight_out=torch.nn.init.zeros_,
        │   │   │       up_proj=Linear.Config(
        │   │   │           channels_in=256,
        │   │   │           channels_out=2_048,
        │   │   │           bias=True,
        │   │   │           depth_index=(),
        │   │   │           device=None,
        │   │   │           dtype=None,
        │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │           init_bias=None,
        │   │   │           linear_fn=<built-in function linear>,
        │   │   │           shard=None
        │   │   │       ),
        │   │   │       middle=Dropout.Config(
        │   │   │           channels_in=2_048,
        │   │   │           channels_out=2_048,
        │   │   │           p=0.1,
        │   │   │           inplace=False
        │   │   │       ),
        │   │   │       down_proj=Linear.Config(
        │   │   │           channels_in=2_048,
        │   │   │           channels_out=10_226,
        │   │   │           bias=True,
        │   │   │           depth_index=(),
        │   │   │           device=None,
        │   │   │           dtype=None,
        │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │           init_bias=None,
        │   │   │           linear_fn=<built-in function linear>,
        │   │   │           shard=None
        │   │   │       ),
        │   │   │       shard=None
        │   │   │   ),
        │   │   │   head_elements=SwiGLU.Config(
        │   │   │       channels_in=256,
        │   │   │       channels_out=10,
        │   │   │       channels_hidden=256,
        │   │   │       expansion=4.0,
        │   │   │       round_to=256,
        │   │   │       gate=False,
        │   │   │       bias=False,
        │   │   │       split_gate_projection=False,
        │   │   │       norm=None,
        │   │   │       act=priml.model.swiglu.gelu,
        │   │   │       depth_index=(),
        │   │   │       init_weight=priml.model.init.unit_fan_in_uniform,
        │   │   │       init_weight_out=torch.nn.init.zeros_,
        │   │   │       up_proj=Linear.Config(
        │   │   │           channels_in=256,
        │   │   │           channels_out=256,
        │   │   │           bias=True,
        │   │   │           depth_index=(),
        │   │   │           device=None,
        │   │   │           dtype=None,
        │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │           init_bias=None,
        │   │   │           linear_fn=<built-in function linear>,
        │   │   │           shard=None
        │   │   │       ),
        │   │   │       middle=None,
        │   │   │       down_proj=Linear.Config(
        │   │   │           channels_in=256,
        │   │   │           channels_out=10,
        │   │   │           bias=True,
        │   │   │           depth_index=(),
        │   │   │           device=None,
        │   │   │           dtype=None,
        │   │   │           init_weight=priml.model.init.kaiming_uniform,
        │   │   │           init_bias=None,
        │   │   │           linear_fn=<built-in function linear>,
        │   │   │           shard=None
        │   │   │       ),
        │   │   │       shard=None
        │   │   │   )
        │   │   ),
        │   │   optimizer=PartialConfig(
        │   │       <class 'torch.optim.adamw.AdamW'>,
        │   │       lr=1e-05,
        │   │       betas=(0.9, 0.999),
        │   │       eps=1e-08,
        │   │       weight_decay=0.01
        │   │   ),
        │   │   loss=FingerprintLoss.Config(
        │   │       loss=SimpleLoss.Config(
        │   │           loss_fn=priml.loss.simple_loss.bce_with_logits,
        │   │           target_key='label',
        │   │           kwargs={'reduction': 'none'},
        │   │           channels_out=-1
        │   │       )
        │   │   ),
        │   │   accumulate_grad_batches=1,
        │   │   drop_partial_accumulation_on_epoch_end=True,
        │   │   train_budget_steps=inf,
        │   │   train_budget_sec=240.0,
        │   │   train_budget_epochs=inf,
        │   │   lr_schedule=PartialConfig(priml.math.schedules.constant),
        │   │   parallelism=NoParallel.Config(device=None),
        │   │   model_quantization=NoModelQuantization.Config(),
        │   │   activation_memoization=DefaultActivationStorage.Config(),
        │   │   compile=None,
        │   │   ema=NoEMA.Config(),
        │   │   gradient_clip_norm=inf,
        │   │   skip_step_on_nonfinite_grad=False,
        │   │   device_init='eager',
        │   │   dtype_autocast=None,
        │   │   autocast_cache_enabled=False,
        │   │   pretrained=None
        │   ),
        │   dataset=SpectrumData.Config(
        │       base_dir='/opt/scratch',
        │       working_dir=PosixPath('/opt/scratch/datasets/casmi2026/training/work'),
        │       batch_size=64,
        │       validation_modulus=10,
        │       validation_bucket=0,
        │       max_peaks=128,
        │       intensity_floor=0.001
        │   ),
        │   metrics_train={},
        │   metrics_eval={   'retrieval': MoleculeMRR.Config(
        │           base_dir='/opt/scratch',
        │           working_dir=PosixPath('/opt/scratch/datasets/casmi2026/training/work'),
        │           ppm=10.0,
        │           limit=25,
        │           identity=OfficialIdentity.Config(
        │               base_dir='/opt/scratch',
        │               working_dir=PosixPath('/opt/scratch/datasets/casmi2026/native-chemistry/main')
        │           )
        │       )},
        │   checkpointer=Checkpointer.Config(
        │       base_dir=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001'),
        │       working_dir=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001/checkpoints'),
        │       filename='step_{step:08d}.pt',
        │       save_every=1_000,
        │       keep_last_n=-1,
        │       keep_every=0,
        │       storer=SyncLocalStateDictStorer.Config(),
        │       resume=False,
        │       resume_step=-1,
        │       allow_checkpoint_overwrite=False,
        │       best_metric='',
        │       best_mode='max'
        │   ),
        │   profiler=None,
        │   phase_timer=PhaseTimer.Config(
        │       enabled=False,
        │       torch_profile=False,
        │       base_dir=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001'),
        │       working_dir=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001/profiling'),
        │       heartbeat_interval_sec=20.0,
        │       fault_dump_interval_sec=40.0,
        │       cuda_events=False
        │   ),
        │   tracker=FileTracker.Config(
        │       base_dir=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001'),
        │       working_dir=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001/metrics.json'),
        │       capture_prefix='eval/'
        │   ),
        │   max_steps=inf,
        │   max_epochs=inf,
        │   max_time=240.0,
        │   max_time_kind='wall',
        │   max_eval_time=45.0,
        │   eval_stop_on_time_limit=False,
        │   num_steps_eval=-1,
        │   num_steps_log=10,
        │   early_train_log_steps=100,
        │   eval_every_epoch=False,
        │   eval_extras_every_eval=False,
        │   eval_warmup_batches=0,
        │   eval_only=False,
        │   restore_rng_state=True,
        │   seed=None,
        │   model_torch_seed=None,
        │   num_steps_garbage_collect=inf,
        │   mesh_dim_model_seed='pp',
        │   mesh_dim_data_seed='dp',
        │   runtime=SingleProcess.Config(
        │       device='cuda',
        │       deterministic=False,
        │       float32_matmul_precision=None
        │   )
        ),
        budget=WallBudget.Config(
            seconds=300.0,
            reserve_evaluation_sec=0,
            clock=<built-in function perf_counter>,
            receipt_path=PosixPath('/opt/scratch/runs/casmi2026-training/train_exp001/budget.json')
        ),
        preparation=None,
        export=FpnetExport.Config(),
        protected=[]
    )
