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

21 KiB
Raw Blame History

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.