{
  "_id": "6a4f60f421b18e154850157a",
  "Package": "grouper",
  "Type": "Package",
  "Title": "Optimal Group Assignment and Workload Allocation",
  "Version": "0.7.3",
  "Authors@R": "c(\nperson(\"Vik\", \"Gopal\", , \"vik.gopal@nus.edu.sg\", role = \"aut\"),\nperson(\"Kevin\", \"Lam\", , \"kevinlam@nus.edu.sg\", role = \"aut\"),\nperson(\"Ju\", \"Xue\", , \"rigi.jx@gmail.com\", role = \"ctb\"),\nperson(\"Mingyuan\", \"Zhang\", , \"e0970135@u.nus.edu\", role = c(\"aut\", \"cre\")),\nperson(\"National University of Singapore\", role = \"cph\")\n)",
  "Description": "Integer programming models to assign students to groups by\nmaximising diversity or topic preferences, and to allocate\nmulti-role teaching workloads while balancing role demand,\npreferences, fairness, and cohort protection.",
  "License": "MIT + file LICENSE",
  "URL": "https://Zimmy313.github.io/grouper/,\nhttps://github.com/Zimmy313/grouper",
  "BugReports": "https://github.com/Zimmy313/grouper/issues",
  "Encoding": "UTF-8",
  "LazyData": "true",
  "VignetteBuilder": "knitr",
  "Config/testthat/edition": "3",
  "Config/roxygen2/version": "8.0.0",
  "Config/roxygen2/markdown": "TRUE",
  "RoxygenNote": "7.3.3",
  "Repository": "https://zimmy313.r-universe.dev",
  "Date/Publication": "2026-07-08 05:09:44 UTC",
  "RemoteUrl": "https://github.com/zimmy313/grouper",
  "RemoteRef": "HEAD",
  "RemoteSha": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-07-09 08:42:14 UTC",
    "User": "root"
  },
  "Author": "Vik Gopal [aut],\nKevin Lam [aut],\nJu Xue [ctb],\nMingyuan Zhang [aut, cre],\nNational University of Singapore [cph]",
  "Maintainer": "Mingyuan Zhang <e0970135@u.nus.edu>",
  "_user": "zimmy313",
  "_type": "src",
  "_file": "grouper_0.7.3.tar.gz",
  "_fileid": "https://r2.ropensci.org/8299e1c4b68651852e718d7def01269a2c0aa07121f6a2ec4604d5da239f9bdb",
  "_filesize": 259315,
  "_sha256": "8299e1c4b68651852e718d7def01269a2c0aa07121f6a2ec4604d5da239f9bdb",
  "_expires": "2026-10-17T08:50:59.000Z",
  "_created": "2026-07-09T08:42:14.000Z",
  "_published": "2026-07-09T08:51:00.884Z",
  "_jobs": [
    {
      "job": 86076477498,
      "time": 482,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "8193555176"
    },
    {
      "job": 86076477456,
      "time": 144,
      "config": "linux-release-x86_64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8193428738"
    },
    {
      "job": 86076477525,
      "time": 184,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "8193430958"
    },
    {
      "job": 86076477578,
      "time": 217,
      "config": "macos-release-arm64",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8193437873"
    },
    {
      "job": 86075895163,
      "time": 184,
      "config": "source",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8193373635"
    },
    {
      "job": 86076477502,
      "time": 114,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "8193417885"
    },
    {
      "job": 86076477481,
      "time": 96,
      "config": "windows-devel",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "8193411229"
    },
    {
      "job": 86076477491,
      "time": 111,
      "config": "windows-oldrel",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "8193416428"
    },
    {
      "job": 86076477485,
      "time": 106,
      "config": "windows-release",
      "r": "4.6.1",
      "check": "OK",
      "artifact": "8193414417"
    }
  ],
  "_host": "GitHub-Actions",
  "_buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578",
  "_status": "success",
  "_upstream": "https://github.com/zimmy313/grouper",
  "_commit": {
    "id": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
    "author": "Mingyuan Zhang <e0970135@u.nus.edu>",
    "committer": "Mingyuan Zhang <e0970135@u.nus.edu>",
    "message": "updated NEWS for version 0.7.3\n",
    "time": 1783487384
  },
  "_maintainer": {
    "name": "Mingyuan Zhang",
    "email": "e0970135@u.nus.edu",
    "login": "zimmy313",
    "description": "",
    "uuid": 139688303
  },
  "_distro": "resolute",
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 3.5",
      "role": "Depends"
    },
    {
      "package": "cluster",
      "role": "Imports"
    },
    {
      "package": "dplyr",
      "role": "Imports"
    },
    {
      "package": "magrittr",
      "role": "Imports"
    },
    {
      "package": "ompr",
      "role": "Imports"
    },
    {
      "package": "rlang",
      "role": "Imports"
    },
    {
      "package": "yaml",
      "role": "Imports"
    },
    {
      "package": "knitr",
      "role": "Suggests"
    },
    {
      "package": "ompr.roi",
      "role": "Suggests"
    },
    {
      "package": "pkgdown",
      "role": "Suggests"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    },
    {
      "package": "ROI.plugin.glpk",
      "role": "Suggests"
    },
    {
      "package": "ROI.plugin.highs",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    }
  ],
  "_owner": "zimmy313",
  "_selfowned": true,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2025-34",
      "n": 3
    },
    {
      "week": "2025-39",
      "n": 5
    },
    {
      "week": "2025-40",
      "n": 7
    },
    {
      "week": "2025-41",
      "n": 5
    },
    {
      "week": "2025-42",
      "n": 12
    },
    {
      "week": "2025-43",
      "n": 4
    },
    {
      "week": "2025-44",
      "n": 4
    },
    {
      "week": "2026-18",
      "n": 2
    },
    {
      "week": "2026-20",
      "n": 5
    },
    {
      "week": "2026-21",
      "n": 5
    },
    {
      "week": "2026-24",
      "n": 2
    },
    {
      "week": "2026-25",
      "n": 13
    },
    {
      "week": "2026-27",
      "n": 5
    },
    {
      "week": "2026-28",
      "n": 7
    }
  ],
  "_tags": [],
  "_stars": 0,
  "_contributors": [
    {
      "user": "singator",
      "count": 120,
      "uuid": 1618120
    },
    {
      "user": "zimmy313",
      "count": 52,
      "uuid": 139688303
    },
    {
      "user": "lamfy",
      "count": 2,
      "uuid": 51726801
    }
  ],
  "_userbio": {
    "uuid": 139688303,
    "type": "user",
    "name": "ZhangMingyuan",
    "followers": 1
  },
  "_downloads": {
    "count": 251,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/grouper"
  },
  "_devurl": "https://github.com/zimmy313/grouper",
  "_pkgdown": "https://Zimmy313.github.io/grouper/",
  "_searchresults": 18,
  "_rbuild": "4.6.1",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/grouper.html",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "LICENSE",
    "manual.pdf"
  ],
  "_homeurl": "https://github.com/zimmy313/grouper",
  "_realowner": "zimmy313",
  "_cranurl": true,
  "_releases": [
    {
      "version": "0.3.1",
      "date": "2025-07-09"
    },
    {
      "version": "0.5.0",
      "date": "2025-10-16"
    },
    {
      "version": "0.7.3",
      "date": "2026-07-08"
    }
  ],
  "_exports": [
    "%>%",
    "assign_groups",
    "assign_job",
    "compute_diversity",
    "convert_pref_mat",
    "extract_info",
    "extract_multirole_info",
    "extract_params_yaml",
    "extract_phd_info",
    "extract_student_info",
    "get_group_pref_score",
    "prepare_diversity_model",
    "prepare_model",
    "prepare_multirole_model",
    "prepare_phd_model",
    "prepare_preference_model",
    "solve_assignment",
    "summary_dba",
    "summary_pba"
  ],
  "_datasets": [
    {
      "name": "dba_gc_ex001",
      "title": "DBA Group Composition Data Example 001",
      "object": "dba_gc_ex001",
      "class": [
        "data.frame"
      ],
      "fields": [
        "id",
        "major",
        "skill",
        "groups"
      ],
      "rows": 4,
      "table": true,
      "tojson": true
    },
    {
      "name": "dba_gc_ex003",
      "title": "DBA Group Composition Data Example 003",
      "object": "dba_gc_ex003",
      "class": [
        "data.frame"
      ],
      "fields": [
        "year",
        "major",
        "self_groups",
        "id"
      ],
      "rows": 4,
      "table": true,
      "tojson": true
    },
    {
      "name": "dba_gc_ex004",
      "title": "DBA Group Composition Data Example 004",
      "object": "dba_gc_ex004",
      "class": [
        "data.frame"
      ],
      "fields": [
        "id",
        "python",
        "self_groups"
      ],
      "rows": 5,
      "table": true,
      "tojson": true
    },
    {
      "name": "multirole_demand_ex001",
      "title": "Multi-role Demand Matrix Example 001",
      "object": "multirole_demand_ex001",
      "class": [
        "matrix",
        "array"
      ],
      "fields": [
        "TA",
        "GR"
      ],
      "rows": 4,
      "table": true,
      "tojson": true
    },
    {
      "name": "multirole_prefmat_ex001",
      "title": "Multi-role Preference Matrix Example 001",
      "object": "multirole_prefmat_ex001",
      "class": [
        "matrix",
        "array"
      ],
      "fields": [
        "C101",
        "C102",
        "C103",
        "C104"
      ],
      "rows": 4,
      "table": true,
      "tojson": true
    },
    {
      "name": "multirole_students_ex001",
      "title": "Multi-role Individual Data Example 001",
      "object": "multirole_students_ex001",
      "class": [
        "data.frame"
      ],
      "fields": [
        "student_id",
        "year",
        "past_ta",
        "past_gr",
        "Name"
      ],
      "rows": 4,
      "table": true,
      "tojson": true
    },
    {
      "name": "pba_gc_ex002",
      "title": "PBA Group Composition Data Example 002",
      "object": "pba_gc_ex002",
      "class": [
        "data.frame"
      ],
      "fields": [
        "id",
        "grouping"
      ],
      "rows": 8,
      "table": true,
      "tojson": true
    },
    {
      "name": "pba_prefmat_ex002",
      "title": "PBA Group Preference Data Example 002",
      "object": "pba_prefmat_ex002",
      "class": [
        "matrix",
        "array"
      ],
      "fields": [
        "col1",
        "col2",
        "col3",
        "col4"
      ],
      "rows": 4,
      "table": true,
      "tojson": true
    }
  ],
  "_help": [
    {
      "page": "assign_groups",
      "title": "Assigns model result to the original data frame.",
      "topics": [
        "assign_groups"
      ]
    },
    {
      "page": "assign_job",
      "title": "Convert workload allocation to a manual-style wide table",
      "topics": [
        "assign_job"
      ]
    },
    {
      "page": "compute_diversity",
      "title": "Compute total pairwise diversity for a set of students",
      "topics": [
        "compute_diversity"
      ]
    },
    {
      "page": "convert_pref_mat",
      "title": "Convert a preference matrix to rank-based scores",
      "topics": [
        "convert_pref_mat"
      ]
    },
    {
      "page": "dba_gc_ex001",
      "title": "DBA Group Composition Data Example 001",
      "topics": [
        "dba_gc_ex001"
      ]
    },
    {
      "page": "dba_gc_ex003",
      "title": "DBA Group Composition Data Example 003",
      "topics": [
        "dba_gc_ex003"
      ]
    },
    {
      "page": "dba_gc_ex004",
      "title": "DBA Group Composition Data Example 004",
      "topics": [
        "dba_gc_ex004"
      ]
    },
    {
      "page": "extract_info",
      "title": "Extract model inputs (wrapper)",
      "topics": [
        "extract_info"
      ]
    },
    {
      "page": "extract_multirole_info",
      "title": "Extract inputs for the multi-role workload allocation model",
      "topics": [
        "extract_multirole_info"
      ]
    },
    {
      "page": "extract_params_yaml",
      "title": "Extract parameters from a YAML file",
      "topics": [
        "extract_params_yaml"
      ]
    },
    {
      "page": "extract_student_info",
      "title": "Extract student information",
      "topics": [
        "extract_student_info"
      ]
    },
    {
      "page": "get_group_pref_score",
      "title": "Look up a group's preference score for a topic-subtopic combination",
      "topics": [
        "get_group_pref_score"
      ]
    },
    {
      "page": "multirole_demand_ex001",
      "title": "Multi-role Demand Matrix Example 001",
      "topics": [
        "multirole_demand_ex001"
      ]
    },
    {
      "page": "multirole_prefmat_ex001",
      "title": "Multi-role Preference Matrix Example 001",
      "topics": [
        "multirole_prefmat_ex001"
      ]
    },
    {
      "page": "multirole_students_ex001",
      "title": "Multi-role Individual Data Example 001",
      "topics": [
        "multirole_students_ex001"
      ]
    },
    {
      "page": "pba_gc_ex002",
      "title": "PBA Group Composition Data Example 002",
      "topics": [
        "pba_gc_ex002"
      ]
    },
    {
      "page": "pba_prefmat_ex002",
      "title": "PBA Group Preference Data Example 002",
      "topics": [
        "pba_prefmat_ex002"
      ]
    },
    {
      "page": "prepare_diversity_model",
      "title": "Prepare the diversity-based assignment model",
      "topics": [
        "prepare_diversity_model"
      ]
    },
    {
      "page": "prepare_model",
      "title": "Initialise optimisation model (wrapper)",
      "topics": [
        "prepare_model"
      ]
    },
    {
      "page": "prepare_multirole_model",
      "title": "Prepare the multi-role workload allocation model",
      "topics": [
        "prepare_multirole_model"
      ]
    },
    {
      "page": "prepare_preference_model",
      "title": "Prepare the preference-based assignment model",
      "topics": [
        "prepare_preference_model"
      ]
    },
    {
      "page": "solve_assignment",
      "title": "Solve a prepared model and post-process the assignment",
      "topics": [
        "solve_assignment"
      ]
    },
    {
      "page": "summary_dba",
      "title": "Summarise a DBA result by topic-repetition group",
      "topics": [
        "summary_dba"
      ]
    },
    {
      "page": "summary_pba",
      "title": "Summarise a PBA result by topic-subtopic-repetition group",
      "topics": [
        "summary_pba"
      ]
    }
  ],
  "_readme": "https://github.com/zimmy313/grouper/raw/HEAD/README.md",
  "_rundeps": [
    "cli",
    "cluster",
    "data.table",
    "dplyr",
    "fastmap",
    "generics",
    "glue",
    "lattice",
    "lazyeval",
    "lifecycle",
    "listcomp",
    "magrittr",
    "Matrix",
    "ompr",
    "pillar",
    "pkgconfig",
    "R6",
    "rlang",
    "tibble",
    "tidyselect",
    "utf8",
    "vctrs",
    "withr",
    "yaml"
  ],
  "_vignettes": [
    {
      "source": "d-sanity-checks.Rmd",
      "filename": "d-sanity-checks.html",
      "title": "Application to simple datasets",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Introduction",
        "Diversity-Based Assignment",
        "Dataset 001 (diversity only)",
        "Dataset 001 (skills only)",
        "Dataset 003",
        "Dataset 004",
        "Preference-Based Assignment",
        "Dataset 002",
        "Multi-role Workload Assignment",
        "Full TA and GR workflow",
        "Single-semester"
      ],
      "created": "2025-06-27 16:45:30",
      "modified": "2026-07-06 03:51:24",
      "commits": 9
    },
    {
      "source": "b-diversity-skill.Rmd",
      "filename": "b-diversity-skill.html",
      "title": "Maximising Diversity and Balancing Skill",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Model introduction",
        "Objective function",
        "Constraints",
        "Group to topic-repetition combination",
        "Defining $z_{ijtr}$",
        "Number of repetitions per topic",
        "Number of students per group",
        "Per-group skill levels",
        "Binary and non-negativity constraints"
      ],
      "created": "2025-06-27 16:45:30",
      "modified": "2026-07-06 12:14:28",
      "commits": 3
    },
    {
      "source": "c-subgroups-preference.Rmd",
      "filename": "c-subgroups-preference.html",
      "title": "Maximising Preference",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Model introduction",
        "Objective function",
        "Constraints",
        "Group to topic-repetition combination",
        "Number of repetitions per topic",
        "Balanced number of subgroups",
        "Number of students per subgroup",
        "Binary and non-negativity constraints"
      ],
      "created": "2025-06-27 16:45:30",
      "modified": "2026-07-06 03:51:24",
      "commits": 2
    },
    {
      "source": "e-phd-workload.Rmd",
      "filename": "e-phd-workload.html",
      "title": "Multi-role Workload Allocation",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Model introduction",
        "Model formulation",
        "Objective function",
        "Demand satisfaction",
        "Role-specific workload spread",
        "Annual workload equality",
        "Protected-cohort soft upper bounds",
        "Optional current-semester workload bounds",
        "Package interface",
        "Semester history and capacity",
        "E-allocation scoring",
        "Role-specific terms",
        "Keeping the model small"
      ],
      "created": "2026-04-28 12:19:50",
      "modified": "2026-06-18 02:02:15",
      "commits": 7
    },
    {
      "source": "a-related-work.Rmd",
      "filename": "a-related-work.html",
      "title": "Related work and grouper",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Introduction",
        "Balancing staff workload and student preferences",
        "OptAssign",
        "Students to elective courses",
        "Assigning students to groups based on traits",
        "Student-to-project supervisor assignment",
        "Automated group assignments in academic setting",
        "Introducing grouper package",
        "Diversity-Based Assignment",
        "Preference-Based Assignment",
        "Multi-role Workload Allocation",
        "Function organisation",
        "References"
      ],
      "created": "2025-06-27 16:45:30",
      "modified": "2026-06-18 02:10:11",
      "commits": 6
    }
  ],
  "_score": 6.1003705451175625,
  "_indexed": true,
  "_nocasepkg": "grouper",
  "_universes": [
    "zimmy313"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.7.3",
      "date": "2026-07-09T08:50:00.000Z",
      "distro": "resolute",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/d92cf4ef19f643cb9b1c13e0a4a81f5423ac065ab4e5257c2f06e45581dd0363",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    },
    {
      "r": "4.6.1",
      "os": "linux",
      "version": "0.7.3",
      "date": "2026-07-09T08:44:27.000Z",
      "distro": "resolute",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/348eadbc49701ebe4acbcebc7716805a6ec2f60c83eb70faa3088501dbc6d356",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.7.3",
      "date": "2026-07-09T08:44:35.000Z",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/f5e0a01509a401cf7dd1716de23b1928f8659ef99aa8cf024a1a8b021adb0099",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    },
    {
      "r": "4.6.1",
      "os": "mac",
      "version": "0.7.3",
      "date": "2026-07-09T08:44:48.000Z",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/c52a03c7327827c41726cf7f2052cf24ac66267dc71747b0261f2b7f58b1820c",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.7.3",
      "date": "2026-07-09T08:44:23.000Z",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/3ecbf820a1e2d373ab042d3199359c44ad5b775fef1bc9089851f959fcdcf4d4",
      "status": "success",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.7.3",
      "date": "2026-07-09T08:43:30.000Z",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/17406ebe80f436eb7d7262f030ae3c9c45c1530551411bee6297a58010b2170b",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.7.3",
      "date": "2026-07-09T08:43:45.000Z",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/4b207a2f40cc4492a39a9c0f56d9ccdec1b906fb72bc36e1c182360fb60f98e2",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    },
    {
      "r": "4.6.1",
      "os": "win",
      "version": "0.7.3",
      "date": "2026-07-09T08:43:42.000Z",
      "commit": "1f8eb7206050c05d54a8f7c7f9fd53c60c2f9a55",
      "fileid": "https://r2.ropensci.org/ca0ca1dcf32b32abbcffd49a9b097986877eba063a032bffae7c9409e2d7fc50",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/zimmy313/actions/runs/29005446578"
    }
  ]
}