From 9c89a0e680cde1c9235af3e36dbea16e9c9a627f Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Mon, 22 Jun 2026 14:38:00 +0000 Subject: [PATCH] neighbouring properties added --- .../uprn_100020665611/elmhurst_summary.pdf | Bin 0 -> 67833 bytes .../uprn_100020665611/elmhurst_worksheet.pdf | Bin 0 -> 45345 bytes .../uprn_10090944225/elmhurst_summary.pdf | Bin 0 -> 62611 bytes .../uprn_10090944225/elmhurst_worksheet.pdf | Bin 0 -> 22965 bytes domain/property/property.py | 40 ++- infrastructure/epc_client/_retry.py | 19 +- scripts/run_modelling_e2e.py | 264 +++++++++++++++--- .../test_property_landlord_overlay.py | 27 ++ 8 files changed, 288 insertions(+), 62 deletions(-) create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_100020665611/elmhurst_summary.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_100020665611/elmhurst_worksheet.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/SAP-Schema-17.0/uprn_10090944225/elmhurst_summary.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/SAP-Schema-17.0/uprn_10090944225/elmhurst_worksheet.pdf diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_100020665611/elmhurst_summary.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_100020665611/elmhurst_summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9a8b300bc84a6fdee934972b2f9e4db6dea30856 GIT binary patch literal 67833 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

%1-st%nR_oV?hj|CeGMro}CBR|(J3Cv~ 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 literal 0 HcmV?d00001 diff --git a/backend/epc_api/json_samples/real_life_examples/SAP-Schema-17.0/uprn_10090944225/elmhurst_summary.pdf b/backend/epc_api/json_samples/real_life_examples/SAP-Schema-17.0/uprn_10090944225/elmhurst_summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19b0640a4bd02c3f12c8faddecf1c70556162d41 GIT binary patch literal 62611 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 a>gx3F9!NKjKTlr)BBKPQ7ZHK$YyT4`REWy} literal 0 HcmV?d00001 diff --git a/backend/epc_api/json_samples/real_life_examples/SAP-Schema-17.0/uprn_10090944225/elmhurst_worksheet.pdf b/backend/epc_api/json_samples/real_life_examples/SAP-Schema-17.0/uprn_10090944225/elmhurst_worksheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc155a2de5305445aa9ced8c8c366d06c17a24d2 GIT binary patch literal 22965 zcmeFYRd6IrkS!=?W@hFRGcz+YGc&W)Qj67M<`y$EGc#k0nR)NMGd44CW^HHI-ZR^u zt+L9js5s^kS#jJlkGluCqNq4MfPobTK*U7kU~J9H%c$z*XvQdFNn7>>90s0SwQN+Q`-j#@*QO3&DMThNgJQ2q~N3MU4fWPf469HKM z<@66g@82x`{p)|QDDGhIDr)9p;%w#U>fp@ycT?WT?ypHXxH(&yIm?@QFpAq6S-23f zF#ppjEbQQ^Ll0nPCZcEOWF}%~W+CEY1N^&r*8ggrQN_*J_3sN+b#^oR=ZgOsK^(v+ zY~*70_lW;-G%IQV|Hk6KN&O#K{I_5H3v$6M*P%GXLd^f4~0KAOA-G%edlJwytJ>IgG85tC^_TUz{~#lr^)raJ3|2 zVPfXw=XY^+HZ!t=(F~i?)^Rvs$MDZJ=t~7J37kNtP9%9x$z)mk1F?~mC#a8=8M~A~ zE|Qp3($jscSnoTiZB{2u7;!;>%UBZTMTn-)= zMDa#{2i!n3s&%9N%apEq$GqGqQ+BIf4lh!i(r>MhmdS<(EA^zk$t#ENxdvK#Bu44_ z$)4jOnLKkRDJ>E-dB-E$Cb}&=wB0~e2fg%Ze7Z77AB|pCiQ)#n`3sQOvv}>*WZ4B# za_gfSEwvV^o{Pv)#e5%8ENc`dVw|&XEZ%aGxPWy2LUqz5Q0{(kw(v=>I9VZ3rQ-nN zJj1!3{y#s+*qER0f0|ckZT!?-)AI;Cpo6SSm|LRvYF=ZOUHAo1g=vcLkAT{!5F9u1 z*GNyRU-g`A5C~L7D0|)of0i`pXt(!x>7+AMntC_5GzMn0NMA`L;G(`OXGqm|=W{s8 zLyp;g7AgRzn&6me&Fxn;!fPs!noRoT?aFJwJ42h|c@~S7lDI{XLUMRdTJGYX@+h_j;a352?a@ z&rk*_o*HT)DDngF&0CL{7|9?BWoXDmitm<{-t70l3quzYfvZv6qIGk>+>tXZzmMRj zheGXMD?#N`b0p|XfgkovI$51GaIh7iLtgopqFoNegnYLxAb&$)$>5C!Dpi@x>@KPu zFzYQwpaOD}5u?qx+$)xHEuIt{*S2t-?J@b{w^4x}009}EOHI29GMO4kKcz>H))_gj zdBzet96fMlXi%1MH6mkCEE0%&$+)6FmwgfRMN-NNnzF#(XHBtG1+z0c8a*qWux{0%1>w+#s#x4(I z_j$j+!JgY-POSWXfPl{BCxsO=n^&~lhO7sgp-;02@*ns$gR%JT77$S#%`3ZBEMbjRpalZa8j4ZM~=OriGVYD6q85Nmle9jZfDN`$1 ze*16BTOI-{hdQS2AkWNjAtJg$k~5H5hY0$JJkTYhKxudB@04S_EMq4g2ItY23f9`- zWMvhrc7ic-v_i1p!yL))uE|X6Z*sA0yRU8-*=?nk@3u5X!K%4i-S!XY+^#C++S{?~ ziSYnlN5g8iZuxwuaZp%ZYA&<(3V4#YaM2bx_={KuI zW4f4@-*&7A8;mzG4MJE_#8&fE@AT|Iy^Ki-pg*o+m9Vk=O>Hf+9Gelnj?T2|_U?#c z{DASraxo((e=8+6^>O-*_XQDbja$aiwWbS_AMJML(TI%}o_VI5KN<}_3yLQTS+{L* zI4-5M1e8i@$>w)j$eHovtnuQ9bZ-WQ7pkZwANL&q3ps`n*kP0oAymq8+*uoXsT zaB3es66cX>Os1SG%RzvrH z7K0+{6{XXP2w}^S+(VSjNI;h?_Ids&B9e(aw&4T9A>7OrOj3devsi)(%GH;-cEomgi6k`J6vUD%-={iKqgly#v6_0$9|o7n zs;(+BzZlluptApN-oYY*4|NLP3=9VmTB`ztETKBujCxLlCwvyI*Frt%0$otk!RCD- zIOifnI_GMfkA=5l7F7`rrCzddN^xvtcMpwLWmHR-Ps2{IjOlMF-&*AZE>46O0uvwo zosk!sFBWXgz|#nCWFI$+#>$=nQ_}Hq`gGWc_*l%x_U6227K1fT4!HDt;* z*+o5BtIZIy(qKzb}Gh6 zXo&sl?QTFUW%+zYZvXre8(}3rGlT_#>2wpBR}2Ud=Jn^$S@s8XHL8lo z2SR|kfLFA#}VdLzc z-1f=teP~HLnTxv(wOBk&h+*D*@mjX7_Q{XAtFdWltSDZj1f`oDy(#xjI+u9Ej<`&A zJ=xkVpf6^)RH<>#`8{Jve$P8MTNYS#j6eMck_(|Vw6ddoqsWH{{D3QmEHJQZkI-YP z+jhOq(9i9uI*kA#Bo_1O7Tt2O6J&gj#0*I{mY3!-37++*OWxo^@I^QuZlfl+m2eo7 z=KL97{pPAFP#!6zumRJ4H(6rjrSmFU{k#`Vol9%hW6nJbPF^Kdt5^1$GbYN};(M^O zMbUG36F*svgu?CFCbf)NUgYp9<8svIkk73)@O1P?2ye%y5i?=p-*Y~vkUL9F9)iNR z44LCToQ&Na)Ak+;FWp@SaLKSjzkaSGZ1{Fh0$#Q2J^=-FCAx#~N{|SI?gs(krm7?3 zBHM*yc%cKx5F_O1o32w+AzttZo9*r;wf7p+aADlGTkK&>UXE#z3I1A>W1G#f5E?44 z8KjOBu^d?KvV@ft36m|>v~h57?7Yg2c3j@1+(_o?ogp`A08cF=JEgUvqZRl0^|>*k zNj(7SL3Wt^LDafAnZYz6FxFYTgw9N@mOO?XA$cXQnfBgP*mP6y6o;;Yem+{3D+0Tw zL3*s^1{uzDZLQCF$*?$n9XHrrEQ&8#C;rP#gC&hf?GxTOsV$?s!`SENN*~itWs;kE z&~x|Idy+YQzEC$VqQV28TVc!OdI^*r9^1D_Bb9P6MxI)=UstrQge?%e7&*7>iaMqd zuk6Q7e1V|C-APww{rwx408P}fF*X>J8oNGo;$$$Y!*1OucS9Sh% zCW$Gqk#pGXf}6pxpD9Ns8HBxXrPwl^cD__=hWZ*XO_SXg!jKB)89KcxZ8Ve_q98x6;qcd%s z7bq=OEJE&gMuGTS`4K@_pb3rwDrrk8`UgJahNNJ5JHIuvP+}t9b5IKpA!?3;JWdBCx4a29@LKJGVxY?Yfh-5#GQ4pZ+|=47Qb9J4W#!N)xIC{%{z5h(jZlSNONUK3J4dVE4Y|`ovo2tt5#q@i@DMvC2mLm7j zx~hPlE%%-P5Mubz@7-qPZ zgPK!2Cr#OBtyRlZfoAo(yUM24LJ;_f7k~%FqCvv*SmYzjRC?Ag{VE{(8yYJ`eG`60 z09+XO_T=H&At&4aek<2xKS&A_YQbtFwF0bUQ`OAr?E{P-cq^qrBF^Oc#e^V$Za>cY zDG~r7iaNpye8{kVA!#9!ILRXw-yL93rS9gU-)W<<;pRq3+6G`kUn?Z>Q8kT=x=;f3 zL90K0^G%nPWY8?BB9>IR&NoAdVzK9im#*L6QCnE4sIS>5Sxxr)wGyE*iIY!=!E~Iq zsC|9-ao*fS!%!jTG-uC|esDZV`)oMevvN1=zy<>q^PPJ623OlMQP5SHVeGF|lX+I& zk=l2+A0U`6njc0x%tdXW^GCYs_NNS6m`U5Z`ZFlWUOXzNvt1}lu$EEH9#-i-XFm0N zcb0)_bb&+kYx!lM_HriAVq2t$>~7le{%p7u!6b2PX2|ur8obGldc}TamBtc&#uM_$ zqA#7Z6V*)bs2_^NhC$wXnIQHKTPSh_Gl!Gv8fR}l^dFqq1~r~HC=d4#?}{*davEjYItKOysqn8U<6um>ef>h$`Od6U?s3CHo6jf*plj+_Ah_RWApc& z@(Ivge3o?r5Kb|mn)0s#z0LRD9-XFZBQHP1Jqrq;zEBvjT{X4+7tE39@`{ucsAmsxX(L8gj*+>q+ z_kc?sR$kc4=sFE%k3$DPceERefgR=&lS%+S;HNTDd21*X!ro?nLf`0vE&&dH+U~j> z_F(R~IZ>{L1?X!z9&whgy}L)v@JjPktZvMV{S4%toEuks&$PtRm(068QBTbuF>^zk zCR27!obL^sN<9y)7!o5O?eSmfmW8!e816;e3D!jDp&%+n8+;R#`U{g6l9>3Y)Go(D zT4_925_s>?Voaxrci{6k3CRar$Ys4@1X2jg$qES_D=&jKvupZ2o|sOD-ks_Yf4WGB zD5H0TpcF;#7Btj@+dY;Q=p_~NrptpGgW`&6L8*=CDN#1#M5SjQ!A=)vL4QoetRyEI z6S2WTzs8>fboQ`Xf*g5u7%IHt2m-hiKCvNPvL$QVNv*>But~Qh?~Fvn!=#+?>gUGg zJIyDrP<4soH+g@fXKB%XhDcLtR|_G?_6kv}cLsWPYBuSm@@_}(;gD3xwN(qgn!DKq zo9Msaps1;*xX$Bhb?zWJje&(Iy@A5 zyFb`&9zC;#ZcLpYJYjwZA&QCt5~2CItN3pLALipnJW{ zi(!3ep!v=aTyO*SA+D;Ov0UL;?xiT(Dh9%aJ5#X* zLE~SM4}JnUHrcuMegb|_RjH18KC)i&LxTzhE36y&lb+HcbF%a%g5{Iizi)b?FaY(+ zw1^fe2kSI0QMy0F0dSZGJ0|S;zykYqJ|ogQJ^5vCr}F4jgF&PUnnz>3jqtJhcyV$F zeUgpq)3B0(M37b9)2ab0=&a{e$c36?{Cs@0R+4jlv5Pt%x`W}+Y;%%;_FgJ3065cySxUGd}*w<-?LqT5>>jvgEh)~y~@>c_dwia%* zWc?)#WQ;8svDen}ZjRoFivs+J?iEU{lRPsq)Suq5Oh)K??)1|$euvbLw%pNDJt!KmNO4+fME-eN>{P(ZAVP=sTQNEU`8 z$vA*U{UE8$b*qil;6vlNSjoMjv8)|}jzJo`ri6{Tn4Ph^(K4FP3pEaawf-rMJwXe% zKL+vB?^4WbUSUh^1H;4NQJVq?n7f~^vR{mz?LK88kCk>?*$-}A$91)$WIf9OJ@ZUp z!#kME+~CEGe9Qasii*&OE~a%BT2|_L+air8IL}Prc*6PQQtG6@>agUPiLEj z72TTzK-()kI@$faZ!(L8SwO-VvI91qF-srvZ>%zlRLRIFTavchIr>D|3tu`YMTn8{ zw=``~ln;nZNsC{yGr_6-5d@~~u%FshsHfWd0aBVF=GqY2uD~D#hLW{) ztdi2+7-&I4hdQ=_eDLNV)Qh&KbuE-1^JF1XSnj^-wOGYytu$Ghjd z?6I|Fu5f2)H~qwmBzXPt6_KPEC??1#0>JB_sxW*LeSRoHDA46gFsh8gf=Gi>3b5s9 zWa$G0mHWZ`#8_qe-pj#${Z&%E3Ah@x;1jFkxSYLqpqPzT%|~a^i8>;+(_vH_+JgD~4W{ zijl~g1aL2^f-bRYNMyBoJBc*p1XHoS-JLJD9PJr=ZxZ^scpz5jw7UDeSI_Bd;FVUV z6w#(n%$){dS@`L?SHa~VxLD6w{<;|V6>3{_RHX9{W?Qa91=@=)<56yx<#_42Yg{Sv zWf9|ro14U~g>;VR#?TgB3>+FAAIG4*37HQ;OEBg%NU;IU=MCPB(X@81Pq2wfIg=Qh zOT1n=u4My%-DnLGa@^!2Ts7XwZp>ZhcY}!N6|$X>W6}qm+sY(w26RmbX8zb)OGQwy zrsRsA7Sq{Bkz*b@bqhqYKRb84Oq6FC43ar)KUYGOuFED9{s?qqRn;SNL|l$PrVpIS zQOS=1>JjO%6la5|K+vK)5rwD&xy)ZkK0z~_&5Cr_+Y4v7Rl_o*5M_UW&Js`_0?7i4 z6r43&-wc$;@f>;8lz(~}>e=R{b84jF_zG?s;dP8UyxkcpfLQV7^|?n1JPemZDNwLu z1NIVGZ?b1-`5XXF#61x-gm<#qO!NC10M*robp&TgkbDq@9;?|PurO(}S{Zsjkktcz zleI=CD61ZYMv=Of9p&`ee7tE|Ill21i@(O*LI;HuYJl(24b-opJiXw zAUTL|Ey|O6(ZH}o z)sx*(_^6N+ECc&i<_F}mWv;F<#bg3;JRV#S0X{t`m9x0mhzWH>;E9qLUmQ&k?Yg

%W- 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 A>;M1& literal 0 HcmV?d00001 diff --git a/domain/property/property.py b/domain/property/property.py index d4652d99..f3cce2eb 100644 --- a/domain/property/property.py +++ b/domain/property/property.py @@ -46,9 +46,10 @@ class Property: # neither a lodged EPC nor Site Notes; a real source always wins. predicted_epc: Optional[EpcPropertyData] = None # Resolved Landlord Overrides as Simulation Overlays, folded onto the lodged - # EPC to form the Effective EPC (ADR-0032). Empty when the Property has no - # overrides — the EPC is then returned unchanged. Only applied on the - # `epc_with_overlay` path; never when Site Notes are the source. + # OR neighbour-synthesised EPC to form the Effective EPC (ADR-0032). Empty + # when the Property has no overrides — the EPC is then returned unchanged. + # Applied on the `epc_with_overlay` and `predicted` paths; never when Site + # Notes are the source. landlord_overrides: Sequence[EpcSimulation] = field(default_factory=tuple) # The current open-market value (a Property Valuation) — externally sourced # and mostly absent; feeds the Plan's Valuation Uplift £ forms (ADR-0018). @@ -59,11 +60,13 @@ class Property: @property def source_path(self) -> SourcePath: - """Which of the two disjoint source paths models this Property (ADR-0001). + """Which of the three disjoint source paths models this Property (ADR-0001). - Site Notes alone, or the public EPC (with Landlord Overrides, once that - slice lands). When both exist the newer wins (Recency Tie-Break); on an - equal date the survey wins, as it reflects on-site observation. + Site Notes, or the public EPC (with Landlord Overrides folded on), or — + as a last resort when neither real source exists — a neighbour-synthesised + EPC (EPC Prediction, ADR-0031). When both Site Notes and an EPC exist the + newer wins (Recency Tie-Break); on an equal date the survey wins, as it + reflects on-site observation. A real source always beats the prediction. """ if self.site_notes is not None and self.epc is not None: epc_date = self.epc.registration_date or self.epc.inspection_date @@ -85,19 +88,26 @@ class Property: def effective_epc(self) -> EpcPropertyData: """The EpcPropertyData the modelling pipeline scores against. - Path 1: the Site Notes' surveyed data. Path 2: the public EPC with any - Landlord Overrides folded on as Simulation Overlays (ADR-0032) — returned - as-is when there are none. Path 3: a neighbour-synthesised EPC (EPC - Prediction gap-fill, ADR-0031), used only when neither real source is - present. + Path 1: the Site Notes' surveyed data. + Path 2: the public EPC with any Landlord Overrides folded on as Simulation Overlays (ADR-0032) — returned + as-is when there are none. + Path 3: a neighbour-synthesised EPC (EPC Prediction gap-fill, ADR-0031), likewise with any Landlord Overrides + folded on: the cohort fills the unknown fields, the landlord's known + facts (wall/roof/glazing/heating/age) correct them. Used only when + neither real source is present. """ if self.source_path == "site_notes": assert self.site_notes is not None return self.site_notes.to_epc_property_data() if self.source_path == "predicted": assert self.predicted_epc is not None - return self.predicted_epc + return self._with_overrides(self.predicted_epc) assert self.epc is not None + return self._with_overrides(self.epc) + + def _with_overrides(self, epc: EpcPropertyData) -> EpcPropertyData: + """``epc`` with any Landlord Overrides folded on as Simulation Overlays, + or unchanged when there are none (ADR-0032).""" if self.landlord_overrides: - return apply_simulations(self.epc, self.landlord_overrides) - return self.epc + return apply_simulations(epc, self.landlord_overrides) + return epc diff --git a/infrastructure/epc_client/_retry.py b/infrastructure/epc_client/_retry.py index d37f5e9c..e9f18dcb 100644 --- a/infrastructure/epc_client/_retry.py +++ b/infrastructure/epc_client/_retry.py @@ -1,5 +1,7 @@ import time -from typing import Callable, TypeVar +from typing import Callable, Optional, TypeVar + +import httpx from infrastructure.epc_client.exceptions import EpcRateLimitError @@ -13,16 +15,21 @@ def call_with_retry( backoff_multiplier: float = 2.0, max_backoff: float = 60.0, ) -> T: - last_exc: EpcRateLimitError | None = None + """Retry `fn` on transient EPC-API failures: HTTP 429 rate limits and + transport errors (read/connect timeouts, connection resets). A 429 honours + the server's `Retry-After`; transport errors back off exponentially. Non- + transient failures (other 4xx/5xx, mapping errors) propagate immediately.""" + last_exc: Optional[Exception] = None for attempt in range(max_retries + 1): try: return fn() - except EpcRateLimitError as exc: + except (EpcRateLimitError, httpx.TransportError) as exc: last_exc = exc if attempt < max_retries: - if exc.retry_after is not None: + if isinstance(exc, EpcRateLimitError) and exc.retry_after is not None: delay = exc.retry_after else: - delay = backoff_base * (backoff_multiplier ** attempt) + delay = backoff_base * (backoff_multiplier**attempt) time.sleep(min(delay, max_backoff)) - raise last_exc # type: ignore[misc] + assert last_exc is not None + raise last_exc diff --git a/scripts/run_modelling_e2e.py b/scripts/run_modelling_e2e.py index 644be17f..35a26272 100644 --- a/scripts/run_modelling_e2e.py +++ b/scripts/run_modelling_e2e.py @@ -55,8 +55,9 @@ from __future__ import annotations import argparse import os import sys +import time from pathlib import Path -from typing import Any, Optional +from typing import Any, Callable, Optional _REPO_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(_REPO_ROOT)) # worktree root first — avoid the import trap @@ -72,6 +73,15 @@ from repositories.property.landlord_override_overlays import ( # noqa: E402 from repositories.property.property_overrides_postgres_reader import ( # noqa: E402 PropertyOverridesPostgresReader, ) +from domain.epc_prediction.comparable_properties import ( # noqa: E402 + ComparableProperty, + select_comparables, +) +from domain.epc_prediction.epc_prediction import EpcPrediction # noqa: E402 +from domain.epc_prediction.prediction_target import ( # noqa: E402 + build_prediction_target, +) +from domain.geospatial.coordinates import Coordinates # noqa: E402 from domain.geospatial.planning_restrictions import PlanningRestrictions # noqa: E402 from domain.geospatial.spatial_reference import SpatialReference # noqa: E402 from domain.modelling.considered_measures import ( # noqa: E402 @@ -88,9 +98,15 @@ from infrastructure.solar.google_solar_api_client import ( # noqa: E402 BuildingInsightsNotFoundError, GoogleSolarApiClient, ) +from repositories.comparable_properties.epc_comparable_properties_repository import ( # noqa: E402 + EpcComparablePropertiesRepository, +) from repositories.geospatial.geospatial_s3_repository import ( # noqa: E402 GeospatialS3Repository, ) +from repositories.property.override_backed_prediction_attributes_reader import ( # noqa: E402 + OverrideBackedPredictionAttributesReader, +) from repositories.product.product_postgres_repository import ( # noqa: E402 ProductPostgresRepository, ) @@ -138,6 +154,10 @@ def _solar_insights_for( ) except BuildingInsightsNotFoundError: return None # no Google solar coverage at this point — model without it + # A transient Solar failure (timeout/reset) is NOT swallowed: it propagates so + # the property is marked ERROR and the wrapper's retry sweep re-runs it later + # when Solar recovers. We must not silently model a coverage-having property + # without its solar leg. def _uprns_for(engine: Engine, property_ids: list[int]) -> dict[int, Optional[int]]: @@ -150,6 +170,18 @@ def _uprns_for(engine: Engine, property_ids: list[int]) -> dict[int, Optional[in return {int(pid): (int(uprn) if uprn is not None else None) for pid, uprn in rows} +def _postcodes_for(engine: Engine, property_ids: list[int]) -> dict[int, str]: + """Read each Property's postcode from the DB (read-only). Needed to find the + EPC-Prediction cohort (the postcode's other lodged certs) and to seed the + PredictionTarget when a Property has no EPC.""" + with engine.connect() as conn: + rows = conn.execute( + text("SELECT id, postcode FROM property WHERE id = ANY(:ids)"), + {"ids": property_ids}, + ).fetchall() + return {int(pid): (postcode or "") for pid, postcode in rows} + + def _dump_overrides(engine: Engine, property_ids: list[int]) -> None: """Print each target Property's ``property_overrides`` rows (read-only), so the Landlord Overrides folded into the Effective EPC are visible before modelling.""" @@ -304,16 +336,19 @@ def _persist( uprn: int, portfolio_id: int, scenario: Scenario, - epc: EpcPropertyData, + epc: Optional[EpcPropertyData], spatial: Optional[SpatialReference], solar_insights: Optional[dict[str, Any]], plan: Plan, ) -> None: """Write the run's inputs (EPC + spatial + solar) and the computed Plan to the DB in one Unit of Work, then commit. ``PlanPostgresRepository`` replaces - any existing Plan for ``(property_id, scenario.id)`` (idempotent re-run).""" + any existing Plan for ``(property_id, scenario.id)`` (idempotent re-run). A + predicted Property has no lodged EPC to store (``epc is None``), so only the + spatial/solar inputs and the Plan are persisted for it.""" with PostgresUnitOfWork(lambda: Session(engine)) as uow: - uow.epc.save(epc, property_id=property_id, portfolio_id=portfolio_id) + if epc is not None: + uow.epc.save(epc, property_id=property_id, portfolio_id=portfolio_id) if spatial is not None: uow.spatial.save(uprn, spatial) # The live `solar` table is keyed by UPRN and needs the fetch's @@ -343,6 +378,46 @@ def _persist( uow.commit() +def _predict_epc( + *, + property_id: int, + uprn: int, + postcode: str, + portfolio_id: int, + attributes_reader: OverrideBackedPredictionAttributesReader, + coordinates: Optional[Coordinates], + cohort_for: Callable[[str], list[ComparableProperty]], + predictor: EpcPrediction, +) -> Optional[EpcPropertyData]: + """Synthesise an EpcPropertyData for an EPC-less Property from its postcode + cohort (EPC Prediction Path 3, ADR-0031), or None when the Property is + ineligible (``property_type`` unresolvable) or no comparable neighbours exist. + + The cohort is found by POSTCODE, so a wrong postcode on the property row + yields the wrong neighbours — a prediction is only as good as the postcode it + is given.""" + attributes = attributes_reader.attributes_for(property_id) + identity = PropertyIdentity( + portfolio_id=portfolio_id, postcode=postcode, address="", uprn=uprn + ) + target = build_prediction_target(identity, coordinates, attributes) + if target is None: + return None # property_type unresolvable — gated out of prediction + comparables = select_comparables(target, cohort_for(target.postcode)) + if not comparables.members: + return None # no comparable neighbours in the postcode + predicted = predictor.predict(target, comparables) + # The calculator needs a MAIN building part; a cohort whose template carries + # none (e.g. a malformed flat record) yields an unscoreable picture, so reject + # it as not-predictable rather than letting the calculator StopIteration. + if not any( + part.identifier is BuildingPartIdentifier.MAIN + for part in predicted.sap_building_parts + ): + return None + return predicted + + def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( @@ -384,11 +459,31 @@ def main() -> None: action="store_true", help="skip the live Google Solar fetch (no Solar PV Options)", ) + parser.add_argument( + "--out-prefix", + default=None, + help="write outputs to .md / .csv / _candidates.csv " + "(parent dirs created) instead of ./modelling_e2e.*; lets batched runs " + "keep separate, durable output files", + ) args = parser.parse_args() if args.persist and (args.scenario_id is None or args.portfolio_id is None): parser.error("--persist requires --scenario-id and --portfolio-id") + if args.out_prefix: + _base = Path(args.out_prefix) + _base.parent.mkdir(parents=True, exist_ok=True) + md_path = _base.with_suffix(".md") + csv_path = _base.with_suffix(".csv") + candidates_path = _base.parent / f"{_base.name}_candidates.csv" + else: + md_path, csv_path, candidates_path = ( + _MARKDOWN_PATH, + _CSV_PATH, + _CANDIDATES_CSV_PATH, + ) + load_env(ENV_PATH) # The new gov EPC API (Bearer) authenticates with OPEN_EPC_API_TOKEN — the # name is misleading; EPC_AUTH_TOKEN is dead (403). Verified against the @@ -401,10 +496,26 @@ def main() -> None: _parse_measures(args.measures), _parse_measures(args.exclude_measures) ) uprns = _uprns_for(engine, args.property_ids) + postcodes = _postcodes_for(engine, args.property_ids) # Landlord Overrides are read from property_overrides and folded onto the lodged # EPC to form the Effective EPC the calculator scores (ADR-0032). overrides_reader = PropertyOverridesPostgresReader(lambda: Session(engine)) _dump_overrides(engine, args.property_ids) + # EPC Prediction (Path 3, ADR-0031): when a Property has no lodged EPC, an + # EpcPropertyData is synthesised from its postcode cohort. The cohort comes + # from the live EPC API (search-by-postcode + per-cert fetch), memoised per + # postcode so co-located missing Properties don't refetch the same cohort. + prediction_attributes = OverrideBackedPredictionAttributesReader(overrides_reader) + comparables_repo = EpcComparablePropertiesRepository(epc_client, geospatial) + predictor = EpcPrediction() + _cohort_cache: dict[str, list[ComparableProperty]] = {} + + def cohort_for(postcode: str) -> list[ComparableProperty]: + if postcode not in _cohort_cache: + _cohort_cache[postcode] = ( + comparables_repo.candidates_for(postcode) if postcode else [] + ) + return _cohort_cache[postcode] # One read-only session for the live `material` catalogue, reused across the # batch so both store and no-store runs price against the same DB rows. catalogue_session = Session(engine) @@ -442,42 +553,107 @@ def main() -> None: "selected,description" ] - for property_id in args.property_ids: + total = len(args.property_ids) + run_start = time.monotonic() + errors = 0 + for index, property_id in enumerate(args.property_ids, start=1): + elapsed = time.monotonic() - run_start + rate = elapsed / (index - 1) if index > 1 else 0.0 + eta = rate * (total - index + 1) + bar_done = int(28 * (index - 1) / total) + bar = "#" * bar_done + "-" * (28 - bar_done) + print( + f"[{bar}] {index}/{total} ({100 * (index - 1) / total:.1f}%) " + f"· {errors} err · elapsed {elapsed / 60:.1f}m · ETA {eta / 60:.1f}m " + f"· property {property_id}", + flush=True, + ) uprn = uprns.get(property_id) try: if uprn is None: raise ValueError("no UPRN on the property row") - epc: Optional[EpcPropertyData] = epc_client.get_by_uprn(uprn) - if epc is None: - raise ValueError(f"no EPC found for UPRN {uprn}") - # Fold any Landlord Overrides onto the lodged EPC; with none, the - # Effective EPC is the lodged EPC unchanged (ADR-0032). - overlaid_property = Property( - identity=PropertyIdentity( - portfolio_id=args.portfolio_id or 0, - postcode="", - address="", - uprn=uprn, - ), - epc=epc, - landlord_overrides=overlays_from( - overrides_reader.overrides_for(property_id) - ), - ) - effective_epc: EpcPropertyData = overlaid_property.effective_epc - lodged_wall = _main_wall_summary(epc) - effective_wall = _main_wall_summary(effective_epc) - if lodged_wall != effective_wall: - print( - f" overlay moved the main wall: lodged [{lodged_wall}] " - f"-> effective [{effective_wall}]" - ) - else: - print(f" overlay no-op on main wall: [{lodged_wall}]") + postcode = postcodes.get(property_id, "") + # Resolve the spatial reference once: its planning protections gate + # measures, and its coordinates both drive solar AND distance-weight + # the EPC-Prediction cohort, so resolve before the EPC branch. spatial: Optional[SpatialReference] = _spatial_for(geospatial, uprn) restrictions: PlanningRestrictions = ( spatial.restrictions if spatial is not None else PlanningRestrictions() ) + coordinates: Optional[Coordinates] = ( + spatial.coordinates if spatial is not None else None + ) + overrides = overlays_from(overrides_reader.overrides_for(property_id)) + epc: Optional[EpcPropertyData] = epc_client.get_by_uprn(uprn) + predicted = False + if epc is not None: + # Lodged EPC: fold any Landlord Overrides onto it; with none, the + # Effective EPC is the lodged EPC unchanged (ADR-0032). + overlaid_property = Property( + identity=PropertyIdentity( + portfolio_id=args.portfolio_id or 0, + postcode=postcode, + address="", + uprn=uprn, + ), + epc=epc, + landlord_overrides=overrides, + ) + effective_epc: EpcPropertyData = overlaid_property.effective_epc + lodged_wall = _main_wall_summary(epc) + effective_wall = _main_wall_summary(effective_epc) + if lodged_wall != effective_wall: + print( + f" overlay moved the main wall: lodged [{lodged_wall}] " + f"-> effective [{effective_wall}]" + ) + else: + print(f" overlay no-op on main wall: [{lodged_wall}]") + else: + # No lodged EPC: synthesise one from the postcode cohort + # (EPC Prediction Path 3, ADR-0031). + predicted_epc = _predict_epc( + property_id=property_id, + uprn=uprn, + postcode=postcode, + portfolio_id=args.portfolio_id or 0, + attributes_reader=prediction_attributes, + coordinates=coordinates, + cohort_for=cohort_for, + predictor=predictor, + ) + if predicted_epc is None: + raise ValueError( + f"no EPC for UPRN {uprn} and not predictable " + f"(unresolved property_type or empty '{postcode}' cohort)" + ) + # Property.effective_epc folds any Landlord Overrides onto the + # synthesised EPC (cohort fills the unknown fields, the landlord's + # known facts correct them) — same overlay the lodged path applies. + effective_epc = Property( + identity=PropertyIdentity( + portfolio_id=args.portfolio_id or 0, + postcode=postcode, + address="", + uprn=uprn, + ), + epc=None, + predicted_epc=predicted_epc, + landlord_overrides=overrides, + ).effective_epc + predicted = True + synth_wall = _main_wall_summary(predicted_epc) + effective_wall = _main_wall_summary(effective_epc) + if synth_wall != effective_wall: + print( + f" no lodged EPC -> synthesised from '{postcode}' cohort; " + f"overlay moved wall [{synth_wall}] -> [{effective_wall}]" + ) + else: + print( + f" no lodged EPC -> synthesised from '{postcode}' cohort " + f"(overlay no-op on wall) [{synth_wall}]" + ) solar_insights: Optional[dict[str, Any]] = ( None if args.no_solar else _solar_insights_for(solar_client, spatial) ) @@ -492,9 +668,10 @@ def main() -> None: print_table=False, ) # The full candidate menu (every Generator Option + its cost), so - # measures the Optimiser did not select are still visible. + # measures the Optimiser did not select are still visible. A predicted + # Property has no lodged cert, so the synthesised Effective EPC is used. candidates: list[Recommendation] = candidate_recommendations( - epc, + epc if epc is not None else effective_epc, planning_restrictions=restrictions, solar_insights=solar_insights, considered_measures=considered, @@ -521,6 +698,7 @@ def main() -> None: # subsequent property reports `InFailedSqlTransaction` and masks its # own real error. Reset so each property surfaces what's wrong. catalogue_session.rollback() + errors += 1 line = f"property {property_id} (uprn {uprn}): ERROR — {type(error).__name__}: {error}" print(line + "\n") md_lines.append(f"## Property {property_id}\n\n`{line}`\n") @@ -530,11 +708,15 @@ def main() -> None: measure_types = [m.measure_type for m in plan.measures] selected: set[MeasureType] = {m.measure_type for m in plan.measures} context = _context_summary(spatial, solar_insights) + # Flag EPC-Prediction properties so a synthesised SAP is never mistaken + # for one scored off a lodged cert. + source_tag = " · ⚠ PREDICTED (no lodged EPC)" if predicted else "" candidate_lines = _candidate_lines(candidates, selected) header = ( f"=== Property {property_id} (uprn {uprn}) === " f"SAP {plan.baseline.sap_continuous:.1f} -> {plan.post_sap_continuous:.1f} " f"· {len(plan.measures)} measure(s) · £{plan.cost_of_works:,.0f} · {context}" + f"{source_tag}" ) print(header) print(format_plan_table(plan)) @@ -543,7 +725,7 @@ def main() -> None: print(candidate_line) print() - md_lines.append(f"## Property {property_id} (uprn {uprn})\n") + md_lines.append(f"## Property {property_id} (uprn {uprn}){source_tag}\n") md_lines.append( f"SAP {plan.baseline.sap_continuous:.1f} → {plan.post_sap_continuous:.1f} " f"· {len(plan.measures)} measure(s) · cost £{plan.cost_of_works:,.0f} " @@ -565,14 +747,14 @@ def main() -> None: ) catalogue_session.close() - _MARKDOWN_PATH.write_text("\n".join(md_lines) + "\n", encoding="utf-8") - _CSV_PATH.write_text("\n".join(csv_rows) + "\n", encoding="utf-8") - _CANDIDATES_CSV_PATH.write_text( + md_path.write_text("\n".join(md_lines) + "\n", encoding="utf-8") + csv_path.write_text("\n".join(csv_rows) + "\n", encoding="utf-8") + candidates_path.write_text( "\n".join(candidate_csv_rows) + "\n", encoding="utf-8" ) - print(f"wrote {_MARKDOWN_PATH.resolve()}") - print(f"wrote {_CSV_PATH.resolve()}") - print(f"wrote {_CANDIDATES_CSV_PATH.resolve()}") + print(f"wrote {md_path.resolve()}") + print(f"wrote {csv_path.resolve()}") + print(f"wrote {candidates_path.resolve()}") if __name__ == "__main__": diff --git a/tests/domain/property/test_property_landlord_overlay.py b/tests/domain/property/test_property_landlord_overlay.py index 47e9c02a..69e71b49 100644 --- a/tests/domain/property/test_property_landlord_overlay.py +++ b/tests/domain/property/test_property_landlord_overlay.py @@ -91,3 +91,30 @@ def test_baseline_wall_is_unchanged_when_no_override_applies() -> None: # Assert assert main.wall_construction == 4 + + +def test_effective_epc_folds_overrides_onto_a_predicted_epc() -> None: + # Arrange — an EPC-less Property whose EPC was neighbour-synthesised, plus a + # solid-brick/internal-insulation wall override the landlord knows. + overlay = wall_overlay_for("Solid brick, with internal insulation", 0) + assert overlay is not None + prop = Property( + identity=_identity(), predicted_epc=_epc(), landlord_overrides=[overlay] + ) + + # Act + main = _main_wall(prop.effective_epc) + + # Assert — the override's codes correct the synthesised main wall, exactly as + # they do on the lodged path (the cohort fills the rest). + assert main.wall_construction == 3 + assert main.wall_insulation_type == 3 + + +def test_effective_epc_predicted_is_returned_as_is_when_no_overrides() -> None: + # Arrange — a predicted Property with no Landlord Overrides. + predicted = _epc() + prop = Property(identity=_identity(), predicted_epc=predicted) + + # Act / Assert — the synthesised EPC is returned untouched (same object). + assert prop.effective_epc is predicted