def METHOD_NAME(n_weeks, n_groups, group_size, **kwargs):
    n_golfers = n_groups * group_size
    print("n_golfers:", n_golfers, "n_weeks:", n_weeks, "group_size:", group_size, "groups:", n_groups)
    golfers = np.arange(n_golfers)
    weeks = np.arange(n_weeks)
    groups = np.arange(n_groups)
    #Possible configurations
    assign = intvar(0, n_groups - 1, shape=(n_golfers, n_weeks), name="assign")
    model = Model()
    # C1: Each group has exactly groupSize players
    for gr in groups:
        # can be written cleaner, see issue #117
        # model += sum(assign == gr, axis=1) == groupSize
        for w in weeks:
            model += sum(assign[:,w] == gr) == group_size
    # C2: Each pair of players only meets at most once
    for g1, g2 in all_pairs(golfers):
        model += sum(assign[g1] == assign[g2]) <= 1
    # SBSA: Symmetry-breaking by selective assignment
    # On the first week, the first groupSize golfers play in group 1, the
    # second groupSize golfers play in group 2, etc. On the second week,
    # golfer 1 plays in group 1, golfer 2 plays in group 2, etc.
    model += [assign[:,0] == (golfers // group_size)]
    for g in golfers:
        if g < group_size:
            model += [assign[g, 1] == g]
    # First golfer always in group 0
    model += [assign[0, :] == 0]
    return model, (assign,)