Files
emba-course-solver/SPECIALIZATION_EVALUATION.md
Bill Ballou e62afa631b Initial commit
Add project files including OpenSpec configuration, Claude skills/commands, and specialization evaluation document.
2026-02-28 19:22:10 -05:00

395 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Specialization Evaluation: Problem, Constraints & Approach
## 1. Problem Overview
The J27 EMBA program offers **46 elective courses** organized into **12 elective sets** across three terms (Spring, Summer, Fall). Students select **one course per set** — 12 electives total, 30 credits. Each course is worth **2.5 credits**.
The program defines **14 specializations**. A specialization is earned by accumulating **9 or more credits** (i.e., at least 4 qualifying courses) in that specialization. Courses qualify for zero or more specializations, as indicated in a mapping matrix.
The evaluation problem: given a student's course selections (partial or complete), determine which specializations are achieved, which remain achievable, and how to optimally allocate credits.
### Why This Is an Optimization Problem
Credits **do not duplicate** across specializations. When a course qualifies for multiple specializations, its 2.5 credits must be **allocated** (potentially split) among them. This transforms the evaluation from a simple counting exercise into a **credit allocation optimization problem**: given selected courses, find the allocation of credits to specializations that maximizes the number of specializations achieved (reaching the 9-credit threshold).
---
## 2. Data Model
### 2.1 Elective Sets
| # | Set Name | Term | Courses |
|---|----------|------|---------|
| 1 | Spring Elective Set 1 | Spring | 3 |
| 2 | Spring Elective Set 2 | Spring | 4 |
| 3 | Spring Elective Set 3 | Spring | 4 |
| 4 | Spring Elective Set 4 | Spring | 4 |
| 5 | Spring Elective Set 5 | Spring | 4 |
| 6 | Summer Elective Set 1 | Summer | 3 |
| 7 | Summer Elective Set 2 | Summer | 4 |
| 8 | Summer Elective Set 3 | Summer | 4 |
| 9 | Fall Elective Set 1 | Fall | 4 |
| 10 | Fall Elective Set 2 | Fall | 4 |
| 11 | Fall Elective Set 3 | Fall | 4 |
| 12 | Fall Elective Set 4 | Fall | 4 |
Students select exactly one course from each set. Spring Set 1 and Summer Set 1 offer the same three courses (different term, same choices).
### 2.2 Specializations
1. Banking
2. Brand Management
3. Corporate Finance
4. Entertainment, Media, and Technology
5. Entrepreneurship and Innovation
6. Finance
7. Financial Instruments and Markets
8. Global Business
9. Leadership and Change Management
10. Management
11. Marketing
12. Management of Technology and Operations
13. Sustainable Business and Innovation
14. Strategy
### 2.3 Course-Specialization Matrix
Each cell contains the marker type: **`■`** (standard qualifying), **`S1`** (Strategy tier 1), **`S2`** (Strategy tier 2), or blank (does not qualify).
Abbreviations for column headers:
**BNK** = Banking, **BRM** = Brand Management, **CRF** = Corporate Finance, **EMT** = Entertainment/Media/Technology, **ENT** = Entrepreneurship/Innovation, **FIN** = Finance, **FIM** = Financial Instruments/Markets, **GLB** = Global Business, **LCM** = Leadership/Change Management, **MGT** = Management, **MKT** = Marketing, **MTO** = Management of Technology/Operations, **SBI** = Sustainable Business/Innovation, **STR** = Strategy
#### Spring Elective Set 1
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Global Immersion Experience II | | | | | | | | ■ | | | | | | |
| Collaboration, Conflict and Negotiation | | | | | | | | | ■ | ■ | | | | |
| Conquering High Stakes Communication | | | | | | | | | ■ | | | | | |
#### Spring Elective Set 2
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Consumer Behavior | | ■ | | | | | | | | | ■ | | | |
| The Business of Health & Medical Care | | | | | | | | | | | | | | S2 |
| Human Rights and Business | | | | | | | | ■ | | | | | ■ | |
| The Financial Services Industry | ■ | | ■ | | | ■ | ■ | | | | | | | |
#### Spring Elective Set 3
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Mergers & Acquisitions | | | ■ | | | ■ | | | ■ | | | | | S1 |
| Digital Strategy | | | | ■ | | | | | | | | ■ | | S2 |
| Managing a High Tech Company: The CEO Perspective | | | | ■ | | | | | | ■ | | ■ | | S2 |
| Analytics & Machine Learning for Managers | | | | | | | | | | | | ■ | | |
#### Spring Elective Set 4
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Foundations of Fintech | | | | | | ■ | | | | | | | | |
| Sustainability for Competitive Advantage* | | | | | | | | | ■ | | | | ■ | S1 |
| Pricing | | ■ | | | | | | | | | ■ | ■ | | |
| Foundations of Entrepreneurship* | | | | | ■ | | | | | ■ | | | | S1 |
#### Spring Elective Set 5
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Corporate Finance | | | ■ | | | ■ | | | | | | | | |
| Consulting Practice: Process and Problem Solving | | | | | | | | | | ■ | | | | S1 |
| Global Strategy | | | | | | | | ■ | | ■ | | | | S1 |
| Customer Insights | | ■ | | | | | | | | | ■ | | | |
#### Summer Elective Set 1
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Global Immersion Experience II | | | | | | | | ■ | | | | | | |
| Collaboration, Conflict and Negotiation | | | | | | | | | ■ | ■ | | | | |
| Conquering High Stakes Communication | | | | | | | | | ■ | | | | | |
#### Summer Elective Set 2
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Managing Growing Companies | | | | | ■ | | | | ■ | ■ | | | | S1 |
| Social Media and Mobile Technology | | ■ | | ■ | | | | | | | ■ | | | |
| Leading in the Age of AI | | | | | | | | | ■ | ■ | | ■ | | |
| Business Drivers | | | | | | | | | | | | | | S1 |
#### Summer Elective Set 3
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Valuation | ■ | | ■ | | | ■ | ■ | | | | | | | |
| Entertainment and Media Industries* | | | | ■ | | | | | | | ■ | | | S2 |
| Advanced Corporate Strategy | | | | | | | | | | ■ | | | | S1 |
| Power and Professional Influence | | | | | | | | | ■ | ■ | | | | |
#### Fall Elective Set 1
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Operations Strategy | | | | | | | | | | | | ■ | | |
| Private Equity | ■ | | ■ | | | ■ | ■ | | | | | | | S2 |
| Managing Change | | | | | | | | | ■ | ■ | | | | S2 |
| Social Entrepreneurship | | | | | ■ | | | | | ■ | | | ■ | |
#### Fall Elective Set 2
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Real Estate Investment Strategy | | | | | | ■ | ■ | | | | | | | |
| Decision Models and Analytics | | | | | | | | | | ■ | | ■ | | |
| Behavioral Finance and Market Psychology | ■ | | ■ | | | ■ | ■ | | | | | | | |
| Crisis Management | | | | | | | | | ■ | ■ | | | | |
#### Fall Elective Set 3
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Corporate Governance | | | | | | | | | ■ | ■ | | | ■ | S1 |
| Climate Finance | ■ | | ■ | | | ■ | ■ | ■ | | | | | ■ | |
| Emerging Tech and Business Innovation | | ■ | | ■ | ■ | | | | | | | ■ | | S2 |
| Technology, Innovation, and Disruption in Media | | ■ | | ■ | | | | | | | ■ | ■ | | |
#### Fall Elective Set 4
| Course | BNK | BRM | CRF | EMT | ENT | FIN | FIM | GLB | LCM | MGT | MKT | MTO | SBI | STR |
|--------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Turnaround, Restructuring and Distressed Investments | ■ | | ■ | | | ■ | ■ | | | | | | | |
| The Financial Services Industry | ■ | | ■ | | | ■ | ■ | | | | | | | |
| Game Theory | | | | | | | | | | ■ | | | | S1 |
| Brand Strategy* | | ■ | | | | | | | | | ■ | | | |
### 2.4 Specialization Reachability Summary
Maximum credits available per specialization (counting only one course per set):
| Specialization | Qualifying Courses | Across Sets | Max Credits |
|---|---|---|---|
| Management | 16 | 11 | 27.5 |
| Strategy | 17 | 9 | 22.5 |
| Leadership and Change Management | 12 | 9 | 22.5 |
| Finance | 11 | 9 | 22.5 |
| Corporate Finance | 9 | 8 | 20.0 |
| Marketing | 7 | 7 | 17.5 |
| Banking | 7 | 6 | 15.0 |
| Brand Management | 7 | 6 | 15.0 |
| Financial Instruments and Markets | 8 | 6 | 15.0 |
| Management of Technology and Operations | 9 | 6 | 15.0 |
| Global Business | 5 | 5 | 12.5 |
| Entertainment, Media, and Technology | 6 | 4 | 10.0 |
| Entrepreneurship and Innovation | 4 | 4 | 10.0 |
| Sustainable Business and Innovation | 5 | 4 | 10.0 |
The "Across Sets" column is the binding constraint because a student can take at most one course per set. The three most constrained specializations (EMT, E&I, SBI) have qualifying courses in only 4 sets, giving exactly 10.0 credits of headroom above the 9.0 threshold — any course taken for a different purpose leaves no room for error.
---
## 3. Constraints
### 3.1 Credit Non-Duplication
Each course contributes exactly **2.5 credits total**. These credits must be **allocated** among the specializations the course qualifies for. Credits may be split fractionally (e.g., 1.5 to Banking + 1.0 to Corporate Finance), but the sum allocated from any single course must not exceed 2.5.
This is the core constraint that makes the problem non-trivial. Without it, a course qualifying for 4 specializations would contribute 2.5 credits to each — but that would mean a single course generates 10 credits of value, which the program does not allow.
**Implication:** A student with 12 courses has exactly **30 credits** to distribute. Achieving `n` specializations requires at least `9n` credits allocated, so the theoretical maximum is **3 specializations** (27 credits), with 3 credits remaining. Achieving 4 would require 36 credits — more than the 30 available.
### 3.2 Required Courses
Four courses are marked with `*`, indicating they are **required for a particular specialization**. A specialization cannot be earned unless its required course is among the student's selections, regardless of credit totals.
| Required Course | Set | Required For |
|---|---|---|
| Sustainability for Competitive Advantage* | Spring Set 4 | Sustainable Business and Innovation |
| Foundations of Entrepreneurship* | Spring Set 4 | Entrepreneurship and Innovation |
| Entertainment and Media Industries* | Summer Set 3 | Entertainment, Media, and Technology |
| Brand Strategy* | Fall Set 4 | Brand Management |
Note that Sustainability for Competitive Advantage* and Foundations of Entrepreneurship* are in the **same set** (Spring Set 4). A student can take at most one, making it **impossible to earn both** Sustainable Business and Innovation **and** Entrepreneurship and Innovation.
Similarly, these required courses qualify for other specializations too (listed in the matrix), but the required-course constraint only applies to the primary specialization listed above.
### 3.3 Strategy S1/S2 System
The Strategy specialization uses a two-tier marker system instead of `■`:
- **S1** (10 courses): Count toward Strategy without restriction.
- **S2** (7 courses): At most **one** S2-marked course may contribute credits toward Strategy.
This means if a student selects 3 S2-qualifying courses, only the one that produces the best overall allocation result should count. The remaining S2 courses' credits cannot be allocated to Strategy (though they may still contribute to other specializations they qualify for via `■`).
**S1 courses:** Mergers & Acquisitions, Sustainability for Competitive Advantage*, Foundations of Entrepreneurship*, Consulting Practice, Global Strategy, Managing Growing Companies, Business Drivers, Advanced Corporate Strategy, Corporate Governance, Game Theory
**S2 courses:** The Business of Health & Medical Care, Digital Strategy, Managing a High Tech Company, Entertainment and Media Industries*, Private Equity, Managing Change, Emerging Tech and Business Innovation
### 3.4 Mutual Exclusions (Same-Set Conflicts)
Since only one course per set can be selected, some specialization combinations are structurally difficult or impossible:
- **Spring Set 4** forces a choice between Sustainability for Competitive Advantage* (required for SBI) and Foundations of Entrepreneurship* (required for E&I). Cannot earn both.
- **Fall Set 4** contains Brand Strategy* (required for Brand Management). Taking Game Theory (the only Strategy S1 in that set) means forgoing Brand Management.
- **Spring Set 1 / Summer Set 1** offer identical courses. If a student picks different courses from each, they get 2 selections from this pool. If they pick the same course in both terms, they still get credit (it appears in both sets independently).
---
## 4. Analysis Approach
### 4.1 Problem Formulation
**Given:** A set of selected courses (0 to 12, one per set)
**Find:** An allocation of credits from each selected course to its qualifying specializations
**Maximize:** The number of specializations reaching the 9-credit threshold
**Subject to:**
- Each course's total allocation ≤ 2.5
- Allocations are non-negative
- Only qualifying specializations receive credits from a course
- Required course constraint per specialization
- At most 1 S2 course contributes to Strategy
### 4.2 Greedy Allocation Algorithm
The optimizer uses a greedy heuristic that processes specializations in order of "tightness" — those with the least slack above the 9-credit threshold are processed first, since they have the least flexibility in which courses can supply their credits.
```
function optimizeAllocation(selectedCourses):
// Track remaining credit capacity per course (starts at 2.5 each)
capacity = { course: 2.5 for each selected course }
// Compute upper bound per specialization (sum of 2.5 × qualifying courses)
// For Strategy: count S1 courses + min(1, S2 count)
upperBound = computeUpperBounds(selectedCourses)
// Filter to candidate specializations:
// - upperBound >= 9
// - all required courses present in selections
candidates = filter(specializations, canAchieve)
// Sort candidates by tightness (ascending upper bound)
sort(candidates, by: upperBound ascending)
achieved = []
for spec in candidates:
// Get qualifying courses with remaining capacity
qualifyingCourses = getQualifying(spec, selectedCourses)
.filter(course => capacity[course] > 0)
.sort(by: number of eligible specializations, ascending)
// ↑ "exclusivity sort" — use specialized courses first,
// preserving multi-eligible courses for other specs
// Check feasibility before committing
availableCredits = sum(capacity[c] for c in qualifyingCourses)
if availableCredits < 9:
continue // Skip — would waste credits on a failed spec
// Allocate credits greedily
needed = 9
for course in qualifyingCourses:
if needed <= 0: break
alloc = min(capacity[course], needed)
capacity[course] -= alloc
allocation[course][spec] += alloc
needed -= alloc
if needed <= 0:
achieved.append(spec)
return achieved, allocation
```
**Key design decisions:**
1. **Tightness-first ordering** ensures the most constrained specializations get first pick of course credits. A specialization with upper bound = 10 (just barely achievable) should be processed before one with upper bound = 20.
2. **Exclusivity sort** within each specialization prefers courses that qualify for fewer other specializations. This preserves "versatile" courses for later specializations that may need them.
3. **Feasibility check** before allocating prevents wasting credits on a specialization that can't reach 9 with remaining capacity. Without this, failed allocations consume course capacity that could help other specializations.
### 4.3 Strategy S2 Enumeration
Because the S2 constraint (at most 1 S2 course counts toward Strategy) interacts with the allocation, the optimizer must consider multiple scenarios:
```
s2Courses = selectedCourses.filter(c => c.strategyMarker == 'S2')
options = [null, ...s2Courses] // null = no S2 course counts
bestResult = null
for s2Choice in options:
// When computing Strategy's qualifying courses:
// - All S1 courses qualify
// - Only s2Choice (if non-null) qualifies among S2 courses
result = runGreedyAllocation(selectedCourses, s2Choice)
if result.achievedCount > bestResult.achievedCount:
bestResult = result
```
With at most 7 S2 courses and typically 0-3 selected, this adds negligible computational cost.
### 4.4 Targeted Optimization
When the user specifies target specializations, the algorithm prioritizes them in the greedy ordering:
1. Place target specializations first (still sorted by tightness among themselves)
2. Then remaining candidate specializations (sorted by tightness)
This ensures the optimizer allocates credits to user-preferred specializations before considering others, at the potential cost of achieving fewer total specializations.
### 4.5 Status Determination
After optimization, each specialization receives a status:
| Status | Condition |
|--------|-----------|
| `achieved` | Allocated credits ≥ 9 **and** all required courses are in the selections |
| `achievable` | Not achieved, but earned credits + potential from open (unselected) sets ≥ 9, and any missing required courses are available in open sets |
| `missing_required` | Enough credits are theoretically possible, but a required course is not selected and is not available in any open set |
| `unreachable` | Maximum possible credits (from all selected + all open sets) < 9, or optimizer allocated credits elsewhere with insufficient remaining potential |
**Key nuance:** When all 12 sets are selected (no open sets), every non-achieved specialization is `unreachable` — there are no future course picks to change the outcome.
**Remaining opportunities:** For each `achievable` specialization, the system lists which courses in open sets could contribute credits. This helps users make informed future selections.
### 4.6 Per-Specialization Metrics
For each specialization, the evaluation produces:
- **earnedCredits**: Credits allocated by the optimizer (respects sharing constraints)
- **maxPotentialCredits**: Theoretical upper bound = (qualifying selected courses × 2.5) + (open sets with qualifying courses × 2.5). Ignores sharing — used for reachability determination, not for allocation.
- **qualifyingCourses**: Selected courses that qualify for this specialization
- **allocation**: How the optimizer distributed credits from each qualifying course to this specialization
- **requiredCoursesStatus**: Which required courses are met vs. missing
- **remainingOpportunities**: Courses in open sets that qualify, organized by set
---
## 5. Web Application Design Considerations
### 5.1 User Interaction Model
The application presents all 12 elective sets. For each set, the user selects one course (or leaves it open). The evaluation runs after each change, providing immediate feedback.
**Primary view:** A dashboard showing all 14 specializations with their current status, earned credits, and progress toward the 9-credit threshold.
**Key information the user needs:**
- Which specializations are currently achieved
- Which are still achievable and what courses would help
- How credits are allocated across specializations (to understand trade-offs)
- The impact of changing a selection on specialization outcomes
### 5.2 Data Embedding
The complete course-specialization matrix (46 courses, 14 specializations, ~100 non-empty markers) is small enough to embed directly in the application as static data. No backend or xlsx parsing is required at runtime.
### 5.3 Performance
The greedy algorithm with S2 enumeration processes at most 14 specializations × 12 courses × 8 S2 options = ~1,344 operations per evaluation. This is instantaneous and can run on every user interaction without debouncing.
### 5.4 Reference Implementation
A working Node.js implementation exists at `evaluate_specializations.mjs` in this directory. It reads from the xlsx file and provides `list`, `matrix`, and `evaluate` CLI commands. The web application should replicate its allocation logic with embedded static data.