#include "fiko/zeka/sorgu.hpp" namespace fiko::zeka { Sorgu& Sorgu::tip(std::string_view t) { Kosul k; k.tur = Kosul::Tur::Tip; k.a = std::string(t); kosullar_.push_back(std::move(k)); return *this; } Sorgu& Sorgu::ozVar(std::string_view anahtar) { Kosul k; k.tur = Kosul::Tur::OzVar; k.a = std::string(anahtar); kosullar_.push_back(std::move(k)); return *this; } Sorgu& Sorgu::ozEsit(std::string_view anahtar, Deger v) { Kosul k; k.tur = Kosul::Tur::OzEsit; k.a = std::string(anahtar); k.deger = std::move(v); kosullar_.push_back(std::move(k)); return *this; } Sorgu& Sorgu::ozAralik(std::string_view anahtar, f64 enAz, f64 enCok) { Kosul k; k.tur = Kosul::Tur::OzAralik; k.a = std::string(anahtar); k.enAz = enAz; k.enCok = enCok; kosullar_.push_back(std::move(k)); return *this; } Sorgu& Sorgu::iliskili(std::string_view iliskiTip, std::string_view hedefTip, int yon) { Kosul k; k.tur = Kosul::Tur::Iliskili; k.a = std::string(iliskiTip); k.b = std::string(hedefTip); k.yon = yon; kosullar_.push_back(std::move(k)); return *this; } Sorgu& Sorgu::govdede(u64 govdeVarlik) { Kosul k; k.tur = Kosul::Tur::Govde; k.govde = govdeVarlik; kosullar_.push_back(std::move(k)); return *this; } bool Sorgu::uyar(u64 dugum, const Kosul& k) const { switch (k.tur) { case Kosul::Tur::Tip: { const ZDugum* d = graf_.dugum(dugum); return d && d->tip == graf_.adBul(k.a); } case Kosul::Tur::OzVar: return graf_.oz(dugum, k.a) != nullptr; case Kosul::Tur::OzEsit: { const Deger* v = graf_.oz(dugum, k.a); return v && degerEsit(*v, k.deger); } case Kosul::Tur::OzAralik: { const Deger* v = graf_.oz(dugum, k.a); f64 s; return v && degerSayi(*v, s) && s >= k.enAz && s <= k.enCok; } case Kosul::Tur::Iliskili: { u32 hedefTip = k.b.empty() ? 0 : graf_.adBul(k.b); if (!k.b.empty() && !hedefTip) return false; for (u64 komsu : graf_.komsular(dugum, k.a, k.yon)) { const ZDugum* h = graf_.dugum(komsu); if (h && (!hedefTip || h->tip == hedefTip)) return true; } return false; } case Kosul::Tur::Govde: { const ZDugum* d = graf_.dugum(dugum); return d && d->brep.govde == k.govde; } } return false; } std::vector Sorgu::bul() const { // İlk Tip koşulu başlangıç kümesi olur (indeksli); yoksa Govde koşulu; o da // yoksa tüm düğümler taranır (küçük graf/sorgu — sıcak yol değil). std::vector aday; int atlanan = -1; for (size_t i = 0; i < kosullar_.size(); ++i) { if (kosullar_[i].tur == Kosul::Tur::Tip) { aday = graf_.tipteki(kosullar_[i].a); atlanan = (int)i; break; } } if (atlanan < 0) { for (size_t i = 0; i < kosullar_.size(); ++i) { if (kosullar_[i].tur == Kosul::Tur::Govde) { aday = graf_.govdeDugumleri(kosullar_[i].govde); atlanan = (int)i; break; } } } if (atlanan < 0) { for (u64 k = 1; k <= graf_.dugumUst(); ++k) if (graf_.dugum(k)) aday.push_back(k); } std::vector sonuc; for (u64 dugum : aday) { if (!graf_.dugum(dugum)) continue; bool tamam = true; for (size_t i = 0; i < kosullar_.size() && tamam; ++i) { if ((int)i == atlanan) continue; tamam = uyar(dugum, kosullar_[i]); } if (tamam) sonuc.push_back(dugum); } return sonuc; } } // namespace fiko::zeka