argument_parser.py 3.68 KB
Newer Older
zhangwq5's avatar
all  
zhangwq5 committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import argparse
import os
import json

def argument_parser():
    # config_parser = argparse.ArgumentParser(description='Argument parser for the project')
    config_parser = argparse.ArgumentParser(
        prog='PowerFlowNet',
        description='parse json configs',
        add_help=False) # a must because otherwise the child will have two help options
    config_parser.add_argument('--cfg_json','--config','--configs', default='configs/standard.json',type=str)

    parser = argparse.ArgumentParser(parents=[config_parser])
    
    parser = argparse.ArgumentParser(
        prog='PowerFlowNet',
        description='train neural network for power flow approximation'
    )
    
    # Network Parameters
    parser.add_argument('--nfeature_dim', type=int, default=6, help='Number of node features')
    parser.add_argument('--efeature_dim', type=int, default=2, help='Number of edge features')
    parser.add_argument('--hidden_dim', type=int, default=128, help='Number of hidden features')
    parser.add_argument('--output_dim', type=int, default=6, help='Number of output features')
    parser.add_argument('--n_gnn_layers', type=int, default=4, help='Number of GNN layers')
    parser.add_argument('--K', type=int, default=3, help='Number of conv filter taps')
    parser.add_argument('--dropout_rate', type=float, default=0.2, help='Dropout rate')
    parser.add_argument('--model', type=str, default='MPN', help='Dropout rate')
    parser.add_argument('--regularize', type=bool, default=True, help='whether the loss function,\
                        during training, will make the masked parts of the output part of the loss function')
    parser.add_argument('--regularization_coeff', type=float, default=1.0, help='Dropout rate')
    
    # Training parameters
    parser.add_argument('--data-dir', type=str, default='data', help='Path to data directory')
    parser.add_argument('--disable_normalize', default=False, action=argparse.BooleanOptionalAction, help='Disable normalizing data')
    parser.add_argument('--train_loss_fn', 
                        type=str, default='masked_l2', 
                        choices=['masked_l2', 'power_imbalance', 'mse_loss', 'mixed_mse_power_imbalance'],
                        help='Training loss function')
    parser.add_argument('--num-epochs', type=int, default=100, help='Number of epochs to train for')
    parser.add_argument('--batch-size', type=int, default=128, help='Batch size')
    parser.add_argument('--lr', type=float, default=1e-3, help='Learning rate')
    parser.add_argument('--case', type=str, default='14', help='Grid case')
    parser.add_argument('--wandb', default=False, help='Enable wandb logging',action=argparse.BooleanOptionalAction)
    parser.add_argument('--wandb-entity', type=str, default='PowerFlowNet', help='wandb entity')
    parser.add_argument('--save', default=True, action=argparse.BooleanOptionalAction)
    
    # Step 0: Parse arguments in .json if specified 
    #   Step 0.1 Check if .json file is specified
    #   Step 0.2 Parse whatever is in .json file
    args, left_argv = config_parser.parse_known_args() # if passed args BESIDES defined in cfg_parser, store in left_argv
    if args.cfg_json is not None:
        with open(args.cfg_json) as f:
            json_dict = json.load(f)
        # args.__dict__.update(json_dict) # does not guarantee arg format is correct
        json_argv = []
        for key, value in json_dict.items():
            json_argv.append('--' + key)
            json_argv.append(str(value))
        parser.parse_known_args(json_argv, args)
    
    # Step 1: Parse arguments in command line and override .json values 
    parser.parse_args(left_argv, args) # override JSON values with command-line values

    
    return args