Skip to content

Commit 0473381

Browse files
committed
Correct UYAP outcome taxonomy, remove invalid uyap_sale_prob, pivot to PARTIAL IDENTIFICATION + identification-aware prediction
e-Satis exposes four top-level states (Satildi / Birinci Aliciya Sure Verildi / Malin Satisinin Dusmesi / Ihale Sonucu Girilmemistir); no fifth status invented. Only Satildi is a completed sale; settlement-pending/missing-result are CENSORED (not sold=false); Malin Satisinin Dusmesi is reason-dependent (withdrawal/Satistan Vazgecilmesi is administrative, not a market no-trade). classify_auction_outcome + outcome_status/outcome_reason/trade_outcome_class fields; raw taxonomy preserved. Removed uyap_sale_prob from m_obs, simulated moments and the Jacobian (reason: public UYAP outcome taxonomy does not currently identify a comparable negative auction trade class). Not replaced with 0/1/guessed rate. Kept uyap_win_over_appraisal_mean/sd as conditional-on-completed-sale moments. Measured: m_obs 5->4, but condition number 1.7e17 -> 61.8 (degenerate sale_prob=1.0 removed the spurious ~0 singular value); rank(J_combined) stays 4/dim 6. New partial.py: admissible_set Theta_I={theta:Q(theta)<=Q_min+tol} with explicit sensitivity-tested tolerance tol=max(1e-4, rel*|Q_min|), common random numbers, reproducible global+local sampling; measured set-identified mu_s/sigma_s/eta, point-like mu_b/sigma_b/auction_shift, parameter trade-off correlations. PartiallyIdentifiedPredictor separates within-theta negotiation uncertainty from between-theta identification uncertainty (status=PARTIALLY_IDENTIFIED); never called observed price or measured accuracy. CLI: structural partial + value --partial. theta NOT shrunk for rank; TOKI stays external; no ML/weak-supervision/SaleProbability/fourth source. 187 tests passing.
1 parent 52ad512 commit 0473381

12 files changed

Lines changed: 669 additions & 39 deletions

File tree

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[![Data refresh](https://github.com/onatozmenn/sold/actions/workflows/kfe-refresh.yml/badge.svg)](https://github.com/onatozmenn/sold/actions/workflows/kfe-refresh.yml)
55
[![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
66
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7-
[![Tests](https://img.shields.io/badge/tests-182%20passing-brightgreen.svg)](tests/)
7+
[![Tests](https://img.shields.io/badge/tests-187%20passing-brightgreen.svg)](tests/)
88
[![Data](https://img.shields.io/badge/data-TCMB%20%C2%B7%20T%C3%9C%C4%B0K-informational.svg)](#data-sources)
99

1010
> Infer the **realized transaction price** of a Turkish home from its **asking** price — a provenance-aware valuation engine.
@@ -301,7 +301,7 @@ tests/ # offline unit / end-to-end tests
301301
## Testing
302302

303303
```bash
304-
pytest -q # 182 tests, fully offline (no network or API key required)
304+
pytest -q # 187 tests, fully offline (no network or API key required)
305305
```
306306

307307
## Methodology & References
@@ -332,6 +332,7 @@ Negotiation-margin figures from Turkish market reporting: İstanbul ≈ 10%, Ank
332332
- [x] **TOKİ reclassified as `external_cross_mechanism_benchmark` & KAP 265789→312317 audit (PENDING)** — the 5 genuine TOKİ cohort/composition moments are **not** labelled *unavailable* (they are observed and available); they are declared an **external cross-mechanism benchmark** that is deliberately **outside** the current SMM identification system (`moments_used_in_identification = 0`, reason: *no current model-implied primary-market counterpart*). `sold structural identify` reports this explicitly; **`rank(J_TOKİ)` stays 0 and was _not_ “fixed” by inventing a primary-market mechanism, and `θ` was _not_ shrunk to force rank**. Separately, a candidate second KAP negotiated disposal (records `265789→312317`, appraisal 15.487M TRY → sale 8.0M USD +VAT) is recorded under [`validation/structural/kap_candidates.json`](validation/structural/) as **`PENDING_AUDIT`** and **does not enter the genuine set / `kap_log_ratio` moments** — admission is blocked by conditions that cannot be verified without fabrication: same-transaction only *operator-linked* (#1), related-party *unverified* (#4), **currency mismatch** TRY vs USD with **no documented official TCMB rate** (#5,#6), and **VAT non-comparability** (#7,#8). Measured identification is therefore unchanged: `m_obs`=3, `J_UYAP` rank 1 / `J_KAP` rank 1 / `J_combined` rank 2, singular values `[1.73, 0.579, 0]`, condition →∞, **`NOT_IDENTIFIED` (rank 2 / dim 6)**. Still operator-blocked (never fabricated): 1 unsold + 1 additional sold UYAP auction, and an admissible same-currency/VAT-comparable second KAP disposal
333333
- [x] **Genuine audited second KAP disposal (currency + VAT + related-party source-audited) → `kap_log_ratio_sd` unlocked, rank 2→3** — the previously `PENDING_AUDIT` KAP chain `265789→312317` was manually source-audited against the official KAP disclosure chain (linked as **one** Kapadık/Esenyurt, 382 ada 11 parsel disposal via the previous-notification reference — **not** two transactions), the official valuation-report attachment (`KDV Hariç`), and the official TCMB EVDS series `TP.DK.USD.A.YTL`. Final realized consideration `7,533,161 USD + KDV` (from completion update `312317`, superseding the earlier `8,000,000 USD` **proposal**) normalized to TRY at the documented buying rate `2.03650000` on the completion/conversion date `2013-10-01` → `15,341,282.3765 TRY`; appraisal `15,487,102 TRY`, both compared **excluding VAT** (no VAT added to either side); related-party from the official old-form `Karşı Taraf İle Olan İlişkinin Niteliği = Yoktur` → `related_party=false` (old-form provenance preserved; **no** modern structured SPK boolean invented). `log(sale/appraisal) = −0.009460159132789749`. Admitted as one genuine negotiated-disposal observation (`corporate_negotiated_non_related`; excluded from `asking_to_closing_labels()`). **Measured genuine identification gain: KAP negotiated count 1→2, `kap_log_ratio_sd` unavailable→observable, `m_obs` 3→4, `rank(J_KAP)` 1→2, `rank(J_combined)` 2→3, singular values `[1.706, 0.678, 0.118, 1.3e-18]`, smallest non-zero sv `0.579→0.118`; status stays `NOT_IDENTIFIED` (rank 3 / dim 6) — real data raised the rank without touching θ, TOKİ stays `external_cross_mechanism_benchmark`, and no ML / weak-supervision / fourth-source layer was added.** UYAP still operator-blocked: 1 unsold + 1 additional sold auction
334334
- [x] **Genuine audited second sold UYAP auction (e-Satış `16662608597`) → `uyap_win_over_appraisal_sd` unlocked, rank 3→4** — manually source-audited from the public e-Satış portal + official auction documents (Ankara/Altındağ dükkan): `Takdir Olunan Değer/Kıymeti = 13,000,000 TRY` kept as `appraised_value = Q` (court-appraised value, **not** the reserve/floor), official result `İhale Bedeli 6,550,000 TRY` on `03/06/2026` with `En Yüksek Teklif Verene Malın İhale Edilmesi` → `sold=true`. `winning_bid/appraised_value = 0.5038461538461538` (auction ratio, **not** an ordinary-resale asking-to-closing discount; `domain=uyap`, `sale_mechanism=auction`, excluded from `asking_to_closing_labels()`). Area semantics preserved and **never interchanged**: `parcel_area_m2=1864.72`, `unit_net_m2=325.00`, `unit_gross_m2=350.00`. `priority_claims`/`realization_costs` not sufficiently observed → `legal_floor_exact=false` (50% of Q is a lower bound, not an exact floor). Privacy boundary: no party/representative/counsel/payment/case-party data transcribed — only non-personal economic/property/public-record fields. **Measured genuine identification gain (θ unchanged): UYAP genuine sold 1→2 (2 sold, 0 unsold, `sale_prob` still degenerate 1.0), `uyap_win_over_appraisal_sd` unavailable→observable (mean `0.7569`, sd `0.2531`), `m_obs` 4→5, `rank(J_UYAP)` 1→2, `rank(J_KAP)` 2, `rank(J_combined)` 3→4, singular values `[1.760, 0.975, 0.214, 0.0285, 1.0e-17]`, smallest non-zero sv `0.118→0.0285`, condition `1.7e17`, weak direction `{sigma_s:0.80, mu_s:0.59, eta:-0.07}`; every currently-modeled moment is now observed (`unavailable_moments` empty) yet status stays `NOT_IDENTIFIED` (rank 4 / dim 6) — the remaining gap is degenerate `sale_prob` + limited variation, not a missing moment. TOKİ stays `external_cross_mechanism_benchmark`; no ML / weak-supervision / fourth-source layer added.** UYAP still operator-blocked: 1 unsold auction (to break the degenerate sale probability)
335+
- [x] **UYAP outcome-taxonomy correction, invalid `uyap_sale_prob` removed, pivot to PARTIAL IDENTIFICATION + identification-aware prediction** — the actual authenticated e-Satış interface exposes four top-level states (`Satıldı`, `Birinci Alıcıya Süre Verildi`, `Malın Satışının Düşmesi`, `İhale Sonucu Girilmemiştir`); **no fifth status was invented** to unlock a sale probability. Only `Satıldı` is a terminal completed sale; settlement-pending / missing-result are **censored** (not `sold=false`), and `Malın Satışının Düşmesi` is reason-dependent (withdrawal/`Satıştan Vazgeçilmesi` is administrative, **not** a market no-trade). Because the public taxonomy cannot separate a comparable negative auction-trade class, **`uyap_sale_prob` was removed from `m_obs`, the simulated moments, and the Jacobian** (documented reason: *public UYAP outcome taxonomy does not currently identify a comparable negative auction trade class*; raw taxonomy + reason preserved for future research, never replaced with a guessed rate). The conditional moments `uyap_win_over_appraisal_mean/sd` are kept, explicitly interpreted as *winning_bid/appraised_value conditional on an observed completed sale*. **Measured effect: removing the degenerate `sale_prob=1.0` moment dropped `m_obs` 5→4 but improved conditioning — condition number `1.7e17 → 61.8` (the spurious ~0 singular value vanished), `rank(J_combined)` stays 4/dim 6.** The final inference gate pivots from forced point identification to **partial identification** `Θ_I = {θ : Q(θ) ≤ Q_min + tol}` (explicit, sensitivity-tested tolerance `tol = max(1e-4, rel·|Q_min|)`, common random numbers, reproducible sampling) via `sold structural partial` — measured `mu_b`/`sigma_b`/`auction_shift` point-like, `mu_s`/`sigma_s`/`eta` **set-identified**, with parameter trade-off correlations. `sold structural value --partial` produces an **identification-aware** closing range that separates *within-θ negotiation uncertainty* from *between-θ identification uncertainty* (`identification_status = PARTIALLY_IDENTIFIED`), never called an observed price or measured ordinary-resale accuracy. θ was **not** shrunk to recover rank; TOKİ stays external; no ML / weak-supervision / SaleProbability / fourth source added. The public-source UYAP no-trade hunt is closed
335336
- [ ] **SaleProbability** model (`P(sold ≤ N days)`) trained on collected outcomes
336337
- [ ] Live, ToS-reviewed fetchers for the public label sources
337338
- [ ] Broker-vs-benchmark analytics over an aggregate anonymized dataset

src/sold/cli.py

Lines changed: 113 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,6 +1392,7 @@ def structural_value_cmd(
13921392
province: str = typer.Option("İstanbul", help="İl"),
13931393
gross_m2: float = typer.Option(100.0, help="Brüt m²"),
13941394
tightness: float = typer.Option(0.0, help="Piyasa sıkılığı (TÜİK hacminden; 0=nötr)"),
1395+
partial: bool = typer.Option(False, "--partial", help="KİMLİKLENDİRME-FARKINDA: Θ_I kabul edilebilir küme üzerinde aralık"),
13951396
) -> None:
13961397
"""Sıradan ilan için YAPISAL-YÖNTEM PROTOTİPİ closing dağılımı — gözlenen fiyat DEĞİL.
13971398
@@ -1416,6 +1417,48 @@ def structural_value_cmd(
14161417
)
14171418
raise typer.Exit(code=1)
14181419

1420+
if partial:
1421+
# KİMLİKLENDİRME-FARKINDA: gerçek momentlerden Θ_I kur, her θ için simüle et.
1422+
from .structural import (
1423+
PartiallyIdentifiedPredictor,
1424+
admissible_set,
1425+
build_observed_moments,
1426+
context_from_datasets,
1427+
load_genuine_datasets,
1428+
)
1429+
1430+
g = load_genuine_datasets()
1431+
built = build_observed_moments(g["uyap"], g["kap"], g["toki_result"])
1432+
ctx = context_from_datasets(g["uyap"], g["kap"])
1433+
res = admissible_set(built["moments"], ctx, n_candidates=2500)
1434+
pred = PartiallyIdentifiedPredictor(res.admissible_params, res.best_params).predict(
1435+
asking, fv, tightness=tightness
1436+
)
1437+
typer.secho(
1438+
"KİMLİKLENDİRME-FARKINDA YAPISAL ÇIKARIM (PARTIALLY_IDENTIFIED)",
1439+
fg=typer.colors.CYAN, bold=True,
1440+
)
1441+
typer.echo(f" İlan: {asking:,.0f} TL · Fair value (TCMB çağdaş çıpa): {fv:,.0f} TL")
1442+
typer.echo(f" Kabul edilebilir parametre kümesi |Θ_I|: {pred['parameter_set_size']}")
1443+
ce = pred["central_structural_estimate"]
1444+
if ce is None:
1445+
typer.secho(" Bu senaryoda ticaret olasılığı ~0 (Θ_I çoğunda no-trade).", fg=typer.colors.YELLOW)
1446+
else:
1447+
wlo, whi = pred["within_model_interval"]
1448+
blo, bhi = pred["between_theta_median_band"]
1449+
ilo, ihi = pred["identification_aware_lower"], pred["identification_aware_upper"]
1450+
typer.echo(f" Merkezi yapısal tahmin: {ce:,.0f} TL")
1451+
typer.echo(f" within-θ (pazarlık belirsizliği) %80: {wlo:,.0f}{whi:,.0f} TL")
1452+
typer.echo(f" between-θ (kimliklendirme belirsizliği) medyan bandı: {blo:,.0f}{bhi:,.0f} TL")
1453+
typer.secho(
1454+
f" KİMLİKLENDİRME-FARKINDA ARALIK (iki belirsizlik birlikte): {ilo:,.0f}{ihi:,.0f} TL",
1455+
fg=typer.colors.GREEN,
1456+
)
1457+
tlo, thi = pred["trade_probability_band"]
1458+
typer.echo(f" Ticaret olasılığı bandı: {tlo:.3f}{thi:.3f}")
1459+
typer.secho(f" {pred['note']}", fg=typer.colors.YELLOW)
1460+
return
1461+
14191462
# identified=False → sensitivity mode (kimliklendirilmiş SMM tahmini yok)
14201463
out = StructuralClosingPredictor(StructuralParams(), identified=False).predict(
14211464
asking, fv, tightness=tightness
@@ -1576,6 +1619,7 @@ def structural_identify_cmd(
15761619
m_obs: dict = {}
15771620
provenance: dict = {}
15781621
unavailable: list = []
1622+
ineligible: list = []
15791623
sample_sizes: dict = {}
15801624

15811625
if demo:
@@ -1603,13 +1647,15 @@ def structural_identify_cmd(
16031647
auctions_df, kap_df, toki_res = genuine["uyap"], genuine["kap"], genuine["toki_result"]
16041648
built = build_observed_moments(auctions_df, kap_df, toki_res)
16051649
m_obs, provenance, unavailable = built["moments"], built["provenance"], built["unavailable"]
1650+
ineligible = built.get("ineligible", [])
16061651
sample_sizes = built["sample_sizes"]
16071652
ctx = context_from_datasets(auctions_df, kap_df)
16081653

16091654
rep = identification_report(
16101655
ctx, StructuralParams(), DEFAULT_FREE, m_obs=m_obs,
16111656
auctions=auctions_df, kap=kap_df, toki_result=toki_res,
1612-
provenance=provenance, unavailable=unavailable, sample_sizes=sample_sizes,
1657+
provenance=provenance, unavailable=unavailable, ineligible=ineligible,
1658+
sample_sizes=sample_sizes,
16131659
)
16141660
ds = rep["dataset"]
16151661
typer.secho("Yapısal kimliklendirme raporu", fg=typer.colors.CYAN, bold=True)
@@ -1627,6 +1673,12 @@ def structural_identify_cmd(
16271673
typer.echo(f" Moment provenance: {rep['moment_provenance']}")
16281674
for un in rep.get("unavailable_moments", []):
16291675
typer.echo(f" Eksik moment: {un['moment']} [{un['source']}] — {un['reason']}")
1676+
for il in rep.get("ineligible_moments", []):
1677+
typer.secho(
1678+
f" KALDIRILDI (SMM DIŞI) moment: {il['moment']} [{il['source']}] "
1679+
f"(gözlenen={il.get('observed_value')}) — {il['reason']}",
1680+
fg=typer.colors.YELLOW,
1681+
)
16301682
# Dış çapraz-mekanizma benchmark (gözlenir + kullanılabilir ama SMM DİŞI — unavailable DEĞİL)
16311683
for fam, eb in (rep.get("external_benchmarks") or {}).items():
16321684
typer.secho(
@@ -1690,13 +1742,70 @@ def structural_identify_cmd(
16901742
typer.echo(f" durum: {cmp['status']['before']}{cmp['status']['after']}")
16911743
if rep["status"] != "IDENTIFIED":
16921744
typer.secho(
1693-
" Not: rank < dim veya zayıf kimliklendirme → optimizer sonucu NOKTA TAHMİNİ olarak "
1694-
"SUNULMAZ; sensitivity/prototip mode. (Optimizer yakınsaması ≠ kimliklendirme.) "
1695-
"Sonraki iş: gerçek UYAP/KAP/tekrarlı TOKİ gözlem genişletmesi.",
1745+
" Not: rank < dim → optimizer sonucu tek NOKTA TAHMİNİ olarak SUNULMAZ. Ama artık "
1746+
"rank(J)=dim ZORUNLU değil: KISMİ KİMLİKLENDİRME (partial identification) kapısı "
1747+
"devrede — 'sold structural partial' ile kabul edilebilir yapısal parametre kümesi "
1748+
"Θ_I ve 'sold structural value --partial' ile kimliklendirme-farkında aralık üretilir.",
16961749
fg=typer.colors.YELLOW,
16971750
)
16981751

16991752

1753+
@structural_app.command("partial")
1754+
def structural_partial_cmd(
1755+
candidates: int = typer.Option(3000, "--candidates", help="Örneklenecek aday parametre vektörü sayısı"),
1756+
rel: float = typer.Option(0.25, "--rel", help="Tolerans göreli payı: tol=max(1e-4, rel·|Q_min|)"),
1757+
seed: int = typer.Option(12345, "--seed", help="Yeniden-üretilebilir örnekleme tohumu"),
1758+
sensitivity: bool = typer.Option(True, "--sensitivity/--no-sensitivity", help="Tolerans duyarlılık taraması"),
1759+
) -> None:
1760+
"""KISMİ KİMLİKLENDİRME: kabul edilebilir yapısal parametre kümesi Θ_I ve tanılamaları.
1761+
1762+
Θ_I = {θ : Q(θ) ≤ Q_min + tol}. Tolerans AÇIK (tol=max(1e-4, rel·|Q_min|)) ve duyarlılık
1763+
testli — gizlice dar aralık için seçilmez. Ortak rastgele sayılar; yeniden-üretilebilir
1764+
örnekleme. Hangi parametrelerin NOKTA yerine KÜME-kimliklendirildiği raporlanır.
1765+
"""
1766+
from .structural import (
1767+
admissible_set,
1768+
build_observed_moments,
1769+
context_from_datasets,
1770+
load_genuine_datasets,
1771+
tolerance_sensitivity,
1772+
)
1773+
1774+
g = load_genuine_datasets()
1775+
built = build_observed_moments(g["uyap"], g["kap"], g["toki_result"])
1776+
ctx = context_from_datasets(g["uyap"], g["kap"])
1777+
res = admissible_set(built["moments"], ctx, n_candidates=candidates, seed=seed, rel=rel)
1778+
1779+
typer.secho("Kısmi kimliklendirme (partial identification) — Θ_I", fg=typer.colors.CYAN, bold=True)
1780+
typer.echo(f" En iyi SMM hedefi (Q_min): {res.best_objective:.4e}")
1781+
typer.echo(f" Tolerans: {res.tolerance:.4e} ({res.tolerance_rule})")
1782+
typer.echo(f" Aday: {res.n_candidates} · kabul edilebilir |Θ_I|: {res.n_admissible}")
1783+
typer.echo(f" KÜME-kimliklendirilmiş (set-identified): {res.set_identified() or '—'}")
1784+
typer.echo(f" Nokta-benzeri (point-like): {res.point_like() or '—'}")
1785+
for p, r in res.param_ranges.items():
1786+
typer.echo(
1787+
f" {p}: [{r['min']:.3f}, {r['max']:.3f}] "
1788+
f"(bant payı {r['range_fraction']:.2f}) → {r['classification']}"
1789+
)
1790+
if res.correlations:
1791+
strong = {k: round(v, 2) for k, v in res.correlations.items() if abs(v) >= 0.5}
1792+
typer.echo(f" Güçlü parametre ödünleşimleri (|corr|≥0.5): {strong or '—'}")
1793+
if sensitivity:
1794+
typer.secho(" Tolerans duyarlılığı (gizli seçim YOK):", fg=typer.colors.CYAN)
1795+
for row in tolerance_sensitivity(built["moments"], ctx, rel_grid=(0.10, 0.25, 0.50, 1.00),
1796+
n_candidates=max(candidates // 2, 800), seed=seed):
1797+
typer.echo(
1798+
f" rel={row['rel']:.2f} → tol={row['tolerance']:.3e} · "
1799+
f"|Θ_I|={row['n_admissible']} · set-id={row['set_identified'] or '—'}"
1800+
)
1801+
typer.secho(
1802+
" DURUM: PARTIALLY_IDENTIFIED — rank(J)<dim; θ nokta olarak tanımlanmaz. Bu kabul "
1803+
"edilebilir küme dürüst yapısal belirsizliği taşır (θ rank için KÜÇÜLTÜLMEDİ).",
1804+
fg=typer.colors.YELLOW,
1805+
bold=True,
1806+
)
1807+
1808+
17001809
@app.command("serve")
17011810
def serve_cmd(
17021811
host: str = typer.Option("127.0.0.1", help="Dinlenecek adres"),

src/sold/structural/__init__.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515

1616
from .auction import (
1717
AUCTION_FIELDS,
18+
UYAP_OUTCOME_STATUSES,
1819
auction_moments,
20+
classify_auction_outcome,
1921
legal_floor,
2022
load_auctions,
2123
normalize_auction,
@@ -65,7 +67,15 @@
6567
simulated_moments,
6668
)
6769
from .params import DEFAULT_FREE, StructuralParams
68-
from .predict import StructuralClosingPredictor
70+
from .partial import (
71+
PARAM_BOUNDS,
72+
PartialIdentificationResult,
73+
admissible_set,
74+
identification_tolerance,
75+
objective_value,
76+
tolerance_sensitivity,
77+
)
78+
from .predict import PartiallyIdentifiedPredictor, StructuralClosingPredictor
6979
from .smm import SMMResult, estimate_smm, nelder_mead, smm_objective
7080
from .toki import difference_disclosures, toki_composition_moments
7181

@@ -90,6 +100,8 @@
90100
"simulate_auctions",
91101
"auction_moments",
92102
"uyap_observed_moments",
103+
"classify_auction_outcome",
104+
"UYAP_OUTCOME_STATUSES",
93105
"AUCTION_FIELDS",
94106
# KAP yapısal veri kümesi
95107
"normalize_kap_disposal",
@@ -128,6 +140,14 @@
128140
"save_snapshot",
129141
"load_snapshot",
130142
"compare_snapshots",
143+
# kısmi kimliklendirme (partial identification)
144+
"admissible_set",
145+
"PartialIdentificationResult",
146+
"PARAM_BOUNDS",
147+
"identification_tolerance",
148+
"tolerance_sensitivity",
149+
"objective_value",
131150
# tahmin
132151
"StructuralClosingPredictor",
152+
"PartiallyIdentifiedPredictor",
133153
]

0 commit comments

Comments
 (0)