@classmethod
def build_arg_parser(cls, parser):
    parser.add_argument('-i', '--input_data', default='-', type=str, metavar='FILE', help='input data file (default: stdin)')
    label_or_pair = parser.add_mutually_exclusive_group(required=True)
    label_or_pair.add_argument('-l', '--input_labels', default=None, type=str, metavar='FILE', help='input labels file')
    label_or_pair.add_argument('-p', '--input_pairs', default=None, type=str, metavar='FILE', help='input pairs file')
    parser.add_argument('-o', '--output_data', default=None, type=str, metavar='FILE', help='output data file')
    parser.add_argument('-m', '--output_metric', default=None, type=str, metavar='FILE', help='output metric file')
    parser.add_argument('-w', '--output_weights', default=None, type=str, metavar='FILE', help='output weights file')
    parser.add_argument('-d', '--delimiter', default='\t', type=str, metavar='DELIM', help='delimiter (default: "\\t")')
    parser.add_argument('-s', '--sparse', action='store_true', help='sparse format (not implemented yet)')
    parser.add_argument('--header', action='store_true', help='has header')
    parser.add_argument('-U', '--u_param', default=1.0, type=float, metavar='DISTANCE', help='U parameter (max distance for same labels, default: 1.0)')
    parser.add_argument('-L', '--l_param', default=1.0, type=float, metavar='DISTANCE', help='L parameter (min distance for different labels, default: 1.0)')
    parser.add_argument('-S', '--slack', default=1.0, type=float, metavar='SLACK', help='slack variable (default: 1.0)')
    parser.add_argument('-N', '--max_iteration_number', default=1000, type=int, metavar='MAX', help='max iteration (default: 1000)')
@classmethod
def build_arg_parser(cls, parser):
    parser.add_argument('-i', '--input_data', default='-', type=str, metavar='FILE', help='input data file (default: stdin)')
    label_or_pair = parser.add_mutually_exclusive_group(required=True)
    label_or_pair.add_argument('-l', '--input_labels', default=None, type=str, metavar='FILE', help='input labels file')
    label_or_pair.add_argument('-p', '--input_pairs', default=None, type=str, metavar='FILE', help='input pairs file')
    parser.add_argument('-o', '--output_data', default=None, type=str, metavar='FILE', help='output data file')
    parser.add_argument('-m', '--output_metric', default=None, type=str, metavar='FILE', help='output metric file')
    parser.add_argument('-w', '--output_weights', default=None, type=str, metavar='FILE', help='output weights file')
    parser.add_argument('-d', '--delimiter', default='\t', type=str, metavar='DELIM', help='delimiter (default: "\\t")')
    parser.add_argument('-s', '--sparse', action='store_true', help='sparse format (not implemented yet)')
    parser.add_argument('--header', action='store_true', help='has header')
    parser.add_argument('-U', '--u_param', default=1.0, type=float, metavar='DISTANCE', help='U parameter (max distance for same labels, default: 1.0)')
    parser.add_argument('-L', '--l_param', default=1.0, type=float, metavar='DISTANCE', help='L parameter (min distance for different labels, default: 1.0)')
    parser.add_argument('-S', '--slack', default=1.0, type=float, metavar='SLACK', help='slack variable (default: 1.0)')
    parser.add_argument('-N', '--max_iteration_number', default=1000, type=int, metavar='MAX', help='max iteration (default: 1000)')