### Your coffee is a vector
Before touching buildings, consider something everyone understands: a cup of coffee described by four measurable attributes.
```
(espresso_ml, milk_ml, sugar_g, temperature_c)
flat_white = [60, 120, 0, 65]
cappuccino = [60, 60, 0, 65]
sweet_latte = [30, 200, 10, 70]
black_coffee = [240, 0, 0, 80]
```
Every vector operation maps to a real coffee question:
**Addition** — combine two drinks. `flat_white + cappuccino = [120, 180, 0, 130]`. Not a real drink, but mathematically: merging two programmes is the same operation.
**Scalar multiply** — scale a recipe. `2 × flat_white = [120, 240, 0, 130]`. Making coffee for two. Same proportions, double quantity.
**Magnitude** — overall intensity. `‖flat_white‖ = 146`, `‖black_coffee‖ = 253`. Black coffee has higher intensity — more extreme in its dimensions.
**Dot product** — similarity. `flat_white @ black_coffee = 19,600` scores higher than `flat_white @ cappuccino = 14,025` because temperature alone dominates at large values. This is exactly why **normalising matters**: raw dot product rewards scale. Angle (cosine similarity) is the fairer comparison.
**Angle** — use-profile alignment. `flat_white` vs `cappuccino` → small angle, same character. `flat_white` vs `black_coffee` → large angle, completely different profile.
**Subtraction** — gap analysis. `target - flat_white = [0, +30, 0, 0]` → you need 30ml more milk. That is it. In a planning brief: the gap is what the site is missing versus the target programme.
The pattern is always the same: define your object as an ordered list of measurable attributes, pick the right operation, read the answer. The math is identical whether you are comparing coffees, buildings, or load cases.
## A Concrete Example: Coffee Recipes as Vectors
Before we touch buildings, consider something everyone understands: a cup of coffee described by four measurable attributes.
```
(espresso_ml, milk_ml, sugar_g, temperature_c)
flat_white = [60, 120, 0, 65]
cappuccino = [60, 60, 0, 65]
sweet_latte = [30, 200, 10, 70]
black_coffee = [240, 0, 0, 80]
```
Now every vector operation answers a real question:
**Addition — Combining recipes**: `flat_white + cappuccino = [120, 180, 0, 130]`. Not a drink you would make, but mathematically: merging the space programmes of two buildings follows the same logic.
**Scalar multiplication — Scaling a recipe**: `2 × flat_white = [120, 240, 0, 130]`. Making coffee for two people. Same proportions, double quantities. In buildings: applying a density uplift.
**Magnitude — Overall intensity**: `‖flat_white‖ ≈ 146`, but `‖black_coffee‖ ≈ 253`. Black coffee has higher magnitude — it is more extreme across its dimensions (more espresso, higher temperature). A single number summarizing complexity and scale.
**Dot product — Raw overlap**: `flat_white @ black_coffee = 19,600`. Large number. `flat_white @ cappuccino = 14,025`. Smaller number. But raw dot product is misleading: it rewards scale. Black coffee's large temperature value dominates the calculation.
**Angle (cosine similarity) — Profile alignment**: This is the fair comparison. `flat_white` vs `cappuccino` have a small angle (both are milk-forward, modest-temperature drinks). `flat_white` vs `black_coffee` have a large angle (completely different recipes). **This is why building comparison tools use angle, not raw dot product**.
**Subtraction — Gap analysis**: `sweet_latte - cappuccino = [-30, +140, +10, +5]`. To turn a cappuccino into a sweet latte, you need 30ml *less* espresso, 140ml *more* milk, 10g sugar, and 5° more heat. In asset management: the gap is exactly what your portfolio is missing versus your target mix.
### The Key Insight
The pattern is always the same: express your object as an ordered list of measurable properties, pick the right operation, read the answer. The math does not change whether you are comparing coffee recipes, building programmes, tenant mixes, or energy profiles. Only the meaning of the numbers changes.
## Comparing Assets: A Straightforward Example
Consider a commercial asset defined by four measurable attributes: `(office_m2, retail_m2, residential_units, parking_bays)`.
Asset A: `(4500, 800, 120, 200)` — mixed-use office tower
Asset B: `(3800, 1200, 0, 150)` — retail-dominant commercial
Asset C: `(0, 0, 0, 80)` — parking/logistics only
Using vector operations:
- **Merger**: Asset A + Asset B = combined 8,300m² office, 2,000m² retail, 120 residential units. Portfolio impact instantly quantified.
- **Scaling**: 1.3 × Asset A applies a 30% uplift across all dimensions—the impact of approved density increases or renovations.
- **Intensity**: A single composite score (`‖asset‖`) benchmarks overall scale across all dimensions, supporting portfolio-wide comparison.
- **Similarity**: Two assets with high cosine similarity have aligned use profiles; low similarity means complementary programmes with limited overlap.
- **Gap Analysis**: Asset A - Asset B = +700m² office surplus, −400m² retail deficit. Strategy-relevant instantly.
The same operations work whether you compare assets, portfolios, or market segments.