Business Finance

GARP

Capital Allocation & Portfolio TheoryDifficulty: ★★★☆☆

Revealed preference theory (Afriat, GARP) applied to AI alignment.

Prerequisites (1)

You deployed an AI allocator to distribute $293K in monthly Marketing Spend across two ad programs. Costs fluctuate monthly based on auction dynamics. After pulling two months of Allocation logs, you discover the AI consistently buys more of whichever program is expensive that month. An arithmetic test on the Allocation data proves that no Utility Function over ad slots purchased produces this pattern. The AI is not just misaligned with your objective - it is not optimizing any coherent objective at all. GARP is that test.

TL;DR:

GARP (Generalized Axiom of Revealed Preference) tests whether an agent's observed Allocation decisions are consistent with any Utility Function. The core idea: when an agent chooses one Allocation over another that was within Budget, their action demonstrates a preference - no stated intention required. If choices pass GARP, you can recover the Utility Function the agent is implicitly using and compare it to your stated objective. If they fail, the agent - human or AI - is not maximizing anything coherent, and you have proof.

What It Is

GARP stands for the Generalized Axiom of Revealed Preference. It is a consistency test you apply to observed Allocation decisions - from your VP's Budget requests, from an AI system's Marketing Spend patterns, from your own Capital Allocation choices.

The core mechanism is simple. When an agent chooses Allocation X and Allocation Y was also within their Budget, they have demonstrated a preference through their marginal dollar allocation: X over Y. Not stated it - proved it.

GARP says: these demonstrated preferences must not contradict each other. If the data shows X preferred to Y and Y preferred to X, no Utility Function - not even a bizarre one - can explain both choices. A Utility Function imposes a ranking. It cannot rank X above Y and Y above X simultaneously.

A foundational result in economics makes this constructive, not just diagnostic. It does not only tell you 'some Utility Function exists.' Given a set of observed choices that satisfy GARP, the construction produces concrete utility values for each observed bundle and a measure of how binding the Budget was in each period. If any contradiction exists in the preference ordering, the construction fails - which is itself the proof that no Utility Function can explain the data.

The test needs only observable data: what was chosen, what was available but not chosen, and the Budget constraint for each decision. You do not need the agent's source code, internal weights, or stated intentions.

Why Operators Care

Three use cases make GARP a P&L-level tool.

1. Auditing organizational coherence. When your leadership team makes quarterly Capital Allocation decisions, GARP tells you whether those decisions are consistent with any stable set of priorities. If the same Budget and the same options produce different Allocation patterns quarter to quarter, you do not have a strategic plan. You have a reaction pattern. GARP catches this with arithmetic, not intuition.

2. Verifying AI system alignment. When you deploy an AI to allocate Marketing Spend, Inventory Control, or resource allocation, GARP is a formal audit. Are its outputs consistent with some Utility Function? If yes, proceed to recovery: extract the implicit priorities the system places on each Budget category, then compare those priorities to your stated objective. If the priorities diverge, you have a precise misalignment to correct. If no Utility Function exists at all, the system is incoherent - and you need to fix it before it burns another month of Budget.

3. Reverse-engineering hidden objectives. When choices satisfy GARP, recovery tells you the implicit tradeoff ratios the agent is using. If a vendor claims to optimize your Lifetime Value but recovery shows their Allocation priorities map to their own Revenue, you have a data-driven case for renegotiation - not an accusation, a proof.

How It Works

GARP is a four-step process. The first three steps test coherence. The fourth step recovers what the agent is actually optimizing. You need at least two periods of observed choices.

Step 1: Record what was chosen and what was available.

For each period, note:

  • The Allocation chosen (quantities of each option)
  • The Cost Per Unit of each option
  • The total Budget

Step 2: Build the preference ordering from observed actions.

For every pair of periods (i, j), check: was period j's bundle affordable at period i's costs and Budget?

If cost_at_period_i_prices(bundle_j) <= Budget_i, then the agent could have chosen bundle_j in period i but didn't. Period i's choice is preferred to period j's choice - demonstrated by action, not by survey.

Critical: this check is not necessarily symmetric. When costs change between periods, bundle_j might be affordable under period i's costs while bundle_i is too expensive under period j's costs. Always check both directions for every pair.

Step 3: Check for contradictions.

If bundle A is preferred to bundle B and bundle B is preferred to bundle A, you have a contradiction - a GARP violation. With more periods, check for longer chains: A preferred to B, B preferred to C, C preferred to A.

Interpreting results:

  • No contradiction: Choices are consistent with some Utility Function. Proceed to Step 4. Consistency alone does not mean correctness - the agent could be coherently optimizing the wrong thing.
  • Contradiction found: No Utility Function explains the pattern. Three possible diagnoses: (a) the agent's objective changed between periods - fine, but document the trigger and justify the shift; (b) there are constraints you have not observed, like an external mandate that forced a specific choice; (c) the agent is not optimizing anything - decisions are ad hoc.

Step 4: Recover the implicit Utility Function.

This is the payoff of a passing GARP test. Recovery takes the same data you already collected - bundles, Cost Per Unit, Budgets - and solves an optimization problem to find a Utility Function consistent with every observed choice.

The optimization has two moving parts. First, it finds a utility value for each observed bundle. Second, it finds a multiplier for each period that captures how tightly the Budget constrained the agent - a quantity closely related to Shadow Price. The constraints say: whenever the agent chose bundle i over an affordable alternative bundle j, the utility of bundle i must be at least as high as bundle j's utility, adjusted by how much Budget slack existed. Both pieces - utility values and Budget-tightness multipliers - must be solved together, which makes this a genuine optimization problem, not simple arithmetic.

What does the output look like? The raw output is a set of utility values and multipliers - one per observed period. To turn these into something an Operator can act on, you typically make a simplifying assumption: that the Utility Function is a weighted sum of quantities across your Allocation categories (for example, 'this agent implicitly values Acquisition at 0.72 per unit and Retention at 0.28 per unit'). This weighted-sum assumption lets you extract clean category priorities from the optimization output.

Be explicit about what that assumption costs you. A weighted sum means each additional unit of a category contributes the same marginal value regardless of how much you already have - no diminishing returns. Real preferences usually exhibit diminishing returns: the 50th unit of Acquisition spending is worth less than the 5th. If diminishing returns matter in your context, the recovery still works but produces a curve rather than a single weight per category, and the optimization is harder to interpret. For a first-pass audit, the weighted-sum version is usually enough to surface large misalignments.

These recovered priorities are what you compare to your stated objective. If your strategy says Retention is the priority but the recovered values show the agent treats Acquisition as three times more valuable per marginal dollar allocation, you have a precise, quantitative misalignment to correct.

Implementation. Python libraries exist for both the consistency test and the recovery step - search 'GARP test Python' or 'revealed preference solver.' The scipy.optimize library can also solve the recovery optimization directly if you set up the constraints. You do not need to build this from scratch.

A note on scaling. With two programs and two periods, Steps 1-3 are arithmetic you can do on paper. In practice, Operators face 12+ months of data across dozens of Budget line items. Every pair of periods must be checked for whether each bundle was affordable under the other period's costs - manageable computationally, but the real Bottleneck is data preparation. You need clean Cost Per Unit figures for every line item in every period. Raw financial system exports require reconciling cost categories, normalizing units, and handling mid-period Budget adjustments before the test runs.

When to Use It

Use GARP when you need to move from narrative ('we are focused on Churn reduction') to proof ('your Allocations are consistent with a Churn-minimizing objective - or they are not').

Triggers:

  • Quarterly Capital Allocation review: After 2+ quarters of Budget decisions, run the GARP test on your leadership team's choices. If they violate it, your strategic plan is not driving Allocation.
  • AI system deployment audit: Any time an AI makes recurring Allocation decisions (Marketing Spend, Inventory Control, resource allocation), test its outputs for GARP compliance. Do this before you start tuning the model - if the outputs are incoherent, tuning is wasted effort.
  • Vendor accountability: When a partner claims to optimize your outcomes, collect their allocation data and test. A GARP violation or a recovered Utility Function that diverges from the contract gives you objective leverage.
  • Self-audit: Test your own budgeting process. GARP is more honest than asking yourself whether you are being strategic.

Do not use when:

  • You have fewer than two periods of comparable decisions
  • The available options genuinely changed between periods (a new product launch or market exit means the choice set shifted - that is new information, not a violation)
  • The agent should have changed objectives (e.g., a strategic pivot) - GARP tests consistency, not correctness
  • Budget constraints were externally overridden mid-period (the CFO cut the Budget) - the test requires accurate Budget data

Worked Examples (2)

Auditing a VP's Quarterly Budget Coherence

Your VP of Growth allocates a $200K quarterly Budget between two programs: Acquisition (A) and Retention (R). Both cost $25K per block.

  • Q1: VP chose 6A + 2R = $150K + $50K = $200K.
  • Q2: VP chose 2A + 6R = $50K + $150K = $200K.

Same costs. Same Budget.

Note: Identical costs across periods is a simplified case that makes every bundle affordable in both periods. Real data almost always has cost variation - see Exercise 2 for a more realistic example.

  1. Check whether each bundle was affordable under the other period's costs. Was Q2's bundle affordable in Q1? 2($25K) + 6($25K) = $50K + $150K = $200K <= $200K Budget. Yes. Was Q1's bundle affordable in Q2? 6($25K) + 2($25K) = $150K + $50K = $200K <= $200K Budget. Yes. Identical costs and Budget means every $200K bundle was affordable in both periods. Both directions are testable here because costs did not change.

  2. Build preference ordering. Q1 reveals: {6A, 2R} is preferred to {2A, 6R} (could have chosen Q2's bundle, didn't). Q2 reveals: {2A, 6R} is preferred to {6A, 2R} (could have chosen Q1's bundle, didn't).

  3. Check for contradictions. {6A, 2R} preferred to {2A, 6R} AND {2A, 6R} preferred to {6A, 2R}. Direct contradiction. GARP violation.

  4. Diagnose. No Utility Function produces opposite rankings from an identical choice set. You bring this to the VP with the data. Two acceptable explanations: (a) priorities genuinely shifted between Q1 and Q2 - maybe Churn Rate spiked and changed the calculus, in which case the objective update should be documented and the shift justified; (b) the VP never had a stable objective and allocated based on whoever lobbied hardest or whatever felt urgent. Explanation (a) is fine - objectives can change. Explanation (b) means Allocation is not strategic.

Insight: GARP violations in human teams are not automatically bad - they are a diagnostic. The violation forces a specific, arithmetic-grounded conversation: 'Did your priorities change, and if so, what data drove the shift?' That conversation is more productive than 'Are you being strategic?' because it starts from proof, not opinion.

Auditing an AI Marketing Spend Allocator for Alignment

You deployed an AI system to allocate $293K in monthly Marketing Spend between Program A and Program B (measured in blocks of ad slots). Costs fluctuate monthly based on auction dynamics.

  • Month 1: A costs $4.80K/block, B costs $12.20K/block. AI chose: 15A + 18B = $72K + $219.6K = $291.6K.
  • Month 2: A costs $12.20K/block, B costs $4.80K/block. AI chose: 18A + 15B = $219.6K + $72K = $291.6K.

The AI consistently buys more of whichever program is expensive.

  1. Check whether each bundle was affordable under the other period's costs. Month 2's bundle at Month 1 costs: 18($4.80K) + 15($12.20K) = $86.4K + $183K = $269.4K <= $293K. Affordable. Month 1's bundle at Month 2 costs: 15($12.20K) + 18($4.80K) = $183K + $86.4K = $269.4K <= $293K. Affordable. Both bundles cost only $269.4K under the other month's costs - well within the $293K Budget.

  2. Build preference ordering. Month 1 reveals: {15A, 18B} is preferred to {18A, 15B}. The AI rejected a bundle that would have cost just $269.4K. Month 2 reveals: {18A, 15B} is preferred to {15A, 18B}. Same story, reversed.

  3. Check for contradictions. {15A, 18B} preferred to {18A, 15B} AND {18A, 15B} preferred to {15A, 18B}. Direct contradiction. GARP violation.

  4. Diagnose root cause. The AI buys more of whichever program costs more per block. Each month, the cheaper Allocation ($269.4K) was available but rejected in favor of spending more on the pricier program. No Utility Function over ad slots purchased produces this pattern. Likely cause: the model learned to treat Cost Per Unit as a stand-in for quality - higher auction costs correlated with better ad slots in the historical data the model was built on. When costs shift for Supply-Side reasons unrelated to ad slot value, that correlation breaks but the model keeps following it. This is a Feedback Loop where the signal the model relies on diverged from operating reality.

  5. Take action. The AI is not misaligned (coherently optimizing the wrong thing) - it is incoherent (not optimizing any Utility Function). Rebuild the allocator with an objective that explicitly separates Cost Per Unit from ad slot value. Add GARP as a recurring Quality Gate: run the test monthly and flag any violation before the next Budget cycle.

Insight: GARP catches a failure mode that individual-period auditing misses. Each month's Allocation looks reasonable in isolation - the AI spent its Budget and bought ad slots. The incoherence only appears when you compare decisions across periods. This is why GARP is a consistency test across time, not a single-period performance metric.

Key Takeaways

  • GARP is a two-phase audit: Phase 1 (Steps 1-3) tests whether the agent is coherent - whether any Utility Function fits. Phase 2 (Step 4) recovers which Utility Function the agent is implicitly using so you can compare it to your stated objective. Coherence without alignment is Goodhart's Law in action.

  • The affordability check across periods is where the real information lives. When costs change, most bundles become unaffordable under the other period's costs, which means most period-pairs produce no testable preference. Do the arithmetic for every pair in both directions - do not assume symmetry.

  • Recovery under the weighted-sum assumption gives you interpretable category priorities, but that assumption rules out diminishing returns. For a first-pass audit this is usually sufficient. If your Allocation categories have sharply different marginal value curves, note the simplification and interpret the weights as directional, not precise.

Common Mistakes

  • Confusing GARP satisfaction with alignment. An AI system can pass GARP perfectly while optimizing something completely different from your stated objective - coherently maximizing Revenue when you wanted Profit. GARP tells you the agent is coherent. Recovery tells you what it is coherent about. You need both.

  • Treating every GARP violation as evidence of incompetence. In human decision-making, violations often mean priorities legitimately changed between periods. In AI systems, violations can mean the model encountered operating conditions unlike the historical data it was built on - costs shifted for Supply-Side reasons, Demand patterns changed, or the competitive landscape moved. The diagnostic value is pinpointing where to look and forcing explicit documentation of what changed.

Practice

easy

A department manager allocates a $200K quarterly Budget between Program Alpha (A) and Program Beta (B).

  • Period 1: Alpha costs $5K/unit, Beta costs $15K/unit. She chose 10A + 10B = $50K + $150K = $200K.
  • Period 2: Alpha costs $15K/unit, Beta costs $5K/unit. She chose 4A + 28B = $60K + $140K = $200K.

Does this satisfy GARP? What does the result tell you about her priorities?

Hint: Check whether each bundle was affordable under the other period's costs in both directions. When costs change between periods, do not assume both bundles are affordable in both periods - one direction may fail.

Show solution

Period 2's bundle at Period 1's costs: 4($5K) + 28($15K) = $20K + $420K = $440K > $200K Budget. Not affordable - Period 1 could not have bought Period 2's Beta-heavy bundle because Beta cost $15K/unit in Period 1. Period 1's bundle at Period 2's costs: 10($15K) + 10($5K) = $150K + $50K = $200K <= $200K Budget. Affordable - Period 2 could have chosen Period 1's balanced bundle but didn't. Only one preference relationship exists: Period 2 reveals {4A, 28B} is preferred to {10A, 10B}. No reverse relationship is testable because Period 2's bundle was too expensive at Period 1's high Beta cost. One-directional preference means no contradiction is possible. GARP is satisfied. The manager shows a consistent lean toward Beta: when Beta was expensive (Period 1), she bought as much as she could afford alongside a balanced mix. When Beta became cheap (Period 2), she loaded up. This is coherent behavior - a stable preference for Beta that she acts on more aggressively when costs allow.

medium

An AI allocator distributes Budget between Program X and Program Y over three months:

  • Month 1: X = $4.50K/unit, Y = $9.50K/unit. Budget = $285K. Chose: 38X + 12Y.
  • Month 2: X = $9.50K/unit, Y = $4.50K/unit. Budget = $285K. Chose: 12X + 38Y.
  • Month 3: X = $7K/unit, Y = $7K/unit. Budget = $350K. Chose: 30X + 20Y.

Check all pairs for GARP compliance. Is the AI coherent?

Hint: You must check whether each bundle was affordable under the other period's costs in both directions for each of the three pairs (six directional checks). When costs differ significantly between periods, most bundles become unaffordable under the other period's costs. Do the arithmetic for each direction - do not assume symmetry.

Show solution

M1 vs M2: M2 bundle at M1 costs: 12($4.50K) + 38($9.50K) = $54K + $361K = $415K > $285K. Not affordable. M1 bundle at M2 costs: 38($9.50K) + 12($4.50K) = $361K + $54K = $415K > $285K. Not affordable. Untestable pair - each period's bundle leans into whichever program was cheap, making it expensive under the other period's costs.

M1 vs M3: M1 bundle at M3 costs: 38($7K) + 12($7K) = $266K + $84K = $350K <= $350K. Affordable. M3 reveals {30X, 20Y} is preferred to {38X, 12Y}. M3 bundle at M1 costs: 30($4.50K) + 20($9.50K) = $135K + $190K = $325K > $285K. Not affordable. One direction only.

M2 vs M3: M2 bundle at M3 costs: 12($7K) + 38($7K) = $84K + $266K = $350K <= $350K. Affordable. M3 reveals {30X, 20Y} is preferred to {12X, 38Y}. M3 bundle at M2 costs: 30($9.50K) + 20($4.50K) = $285K + $90K = $375K > $285K. Not affordable. One direction only.

Result: M3 is preferred to M1 and M3 is preferred to M2. No contradictions. GARP satisfied. The AI is coherent. Given a larger Budget and equal costs in Month 3, it chose more X than Y (30 vs 20), revealing a stable underlying preference for X. In Months 1 and 2 with tighter Budgets, it bought more of whichever was cheap - consistent with stretching a constrained Budget toward its preferred mix. The non-round costs ($4.50K, $9.50K) and the close-but-not-affordable checks ($325K and $375K vs $285K Budgets) are typical of real data: clean affordability relationships are the exception, not the rule.

hard

Your AI Inventory Control system satisfies GARP over six months. You run recovery (Step 4) under the weighted-sum assumption and find it assigns implicit values of 60% to electronics, 30% to apparel, 10% to home goods. But your stated objective values Allocation by Profit per category: electronics 15%, apparel 40%, home goods 45%. The AI is coherent but misaligned. Diagnose the most likely cause and describe a correction plan.

Hint: Think about what signal the AI was built to optimize versus what you actually want. Revenue and Profit weight product categories very differently when material cost varies across categories.

Show solution

The AI most likely was built to optimize (or uses a signal derived from) Revenue rather than Profit. Electronics typically have high Revenue per unit but low Profit per unit due to high material cost and Competitive Pricing pressure. Revenue-weighted and Profit-weighted objectives produce very different category rankings.

Correction plan: (1) Redefine the objective in terms of Profit per category, not Revenue. (2) Rebuild the allocator with the corrected signal. (3) Re-run GARP on the rebuilt system to confirm coherence is maintained. (4) Run recovery again and compare the new implicit values to your target Profit allocation. (5) Add a monthly Quality Gate: GARP test for coherence plus recovery for alignment. If either test fails, freeze the system and revert to manual Allocation until the root cause is found.

Connections

GARP builds directly on Utility Maximization. Where Utility Maximization teaches you how to allocate - ranking marginal value per marginal dollar allocation and funding in order until the Budget runs out - GARP answers the harder question: is someone actually doing Utility Maximization at all? It is the audit layer on top of the Allocation layer.

Downstream, GARP connects to several concepts. It feeds into Goodhart's Law: when recovery shows an agent is coherently optimizing the wrong metric, that is Goodhart's Law in action - the measure became the target and diverged from the goal. It strengthens Quality Systems by providing a formal, repeatable Quality Gate for any recurring Allocation process - human or AI. And it deepens Sensitivity Analysis: once GARP confirms coherence, you can perturb the recovered Utility Function values to understand how sensitive Allocation outcomes are to small shifts in priorities, giving you a quantitative grip on which assumptions matter most to your P&L.

Disclaimer: This content is for educational and informational purposes only and does not constitute financial, investment, tax, or legal advice. It is not a recommendation to buy, sell, or hold any security or financial product. You should consult a qualified financial advisor, tax professional, or attorney before making financial decisions. Past performance is not indicative of future results. The author is not a registered investment advisor, broker-dealer, or financial planner.