Files
boc/iom/reality_signals/__pycache__/semantic_graph.cpython-39.pyc
T

101 lines
16 KiB
Plaintext
Raw Normal View History

a
kV>jKTã@sˆdZddlmZmZmZmZmZddlmZddl m Z ddl
Z
eGdddƒƒZ Gdd „d ƒZ Gd
d d ƒZ
d d
Zedkr„eƒdS)u
Semantic Graph — Connects Reality Signals into a knowledge graph
Enables AI to discover relationships and build custom indexes
é)ÚDictÚListÚOptionalÚSetÚTuple)Ú dataclass)ÚdatetimeNc@sheZdZUdZeed<eed<eed<eed<eed<eeed<eed<e eed <ed
œd d Z
d
S)Ú
SignalNodezA node in the semantic graphÚ signal_idÚ signal_typeÚcategoryÚvalueÚunitÚlocationÚ timestampÚ
relationships©Úreturnc Cs,|j|j|jt|jdƒ|j|j|j|jdœS)©r
r r r
rrrr) r
r r Úroundr
rrrr©Úself©rúE/home/bernt/.openclaw/workspace/iom/reality_signals/semantic_graph.pyÚto_dicts
øzSignalNode.to_dictN) Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚstrÚ__annotations__Úfloatrrrrrrrrr s
  r c@eZdZdZddZeedœddZeeeedœdd „Z d ee
ee ed œd d
Z ee edœddZ
d!eee edœddZe eedœddZe edœddZeedœddZedœddZd
S)"Ú
SemanticGraphz#Knowledge graph for reality signalscCsi|_g|_i|_i|_dS©N)ÚnodesÚedgesÚsignal_type_indexÚlocation_indexrrrrÚ__init__(szSemanticGraph.__init__)Úsignalrc C|dd| dt ¡ ¡¡}t||d|d|d|d| d¡| dt ¡ ¡¡gd}||j|<|j|jvrg|j|j<|j|j |¡|j rÊ| 
|j ¡}||j vrºg|j |<|j | |¡|S) zAdd a signal to the graphr Ú_rr r
rrr) ÚgetrÚutcnowÚ isoformatr r%r r'ÚappendrÚ_hash_locationr()rr*r
ÚnodeÚloc_hashrrrÚ
add_signal.s*"ø
   

zSemanticGraph.add_signal)Ú source_idÚ target_idÚ
relation_typeÚstrengthcCsX||jvrT||jvrT|j |||t|dƒdœ¡|j|j |¡|j|j |¡dS)z&Add a relationship between two signalsr)ÚsourceÚtargetÚtyper7N)r%r&r/rr)rr4r5r6r7rrrÚadd_relationshipMsüzSemanticGraph.add_relationshipN)r
r6rcCs˜||jvrgSg}|jD]z}|d|ks4|d|kr|dusH|d|kr|d|kr\|dn|d}||jvr| |j| ¡|d|ddœ¡q|S)z&Find signals related to a given signalr8r9Nr:r7)r*Z relationshipr7)r%r&r/r)rr
r6ÚrelatedÚedgeZother_idrrrÚ find_related[s


 ý
zSemanticGraph.find_related)r rcs ˆj |g¡}fdd|DƒS)z Find all signals of a given typecs$g|]}|ˆjvrˆj| ¡qSr©r%r©Ú.0ZsidrrrÚ
<listcomp>qóz.SemanticGraph.find_by_type.<locals>.<listcomp>)r'r,)rr Ú
signal_idsrrrÚ find_by_typenszSemanticGraph.find_by_typeéd)rÚ
radius_metersrcs*ˆ |¡}ˆj |g¡}fdd|DƒS)zFind signals near a locationcs$g|]}|ˆjvrˆj| ¡qSrr?r@rrrrByrCz2SemanticGraph.find_by_location.<locals>.<listcomp>)r0r(r,)rrrGr2rDrrrÚfind_by_locationss
zSemanticGraph.find_by_location)Ú signal_typesrcCi}g}|D]4}|j |g¡D] }||jvr|j| ¡||<qq t| ¡ƒ}|jD]&}|d|vrT|d|vrT| |¡qTt|  ¡ƒ|t
|ƒt
|ƒdœS)z5Get a subgraph containing only specified signal typesr8r9)r%r&Ú
node_countZ
edge_count) r'r,r%rÚsetÚkeysr&r/ÚlistÚvaluesÚlen)rrIr%r&r r
Znode_idsr=rrrÚ get_subgraph{s
 
 
üzSemanticGraph.get_subgraphrc
s g}tˆj ¡ƒ}t|ƒD]î\}}||ddD]Ô}fddˆj |g¡Dƒ}fddˆj |g¡Dƒ}|r2|r2tdd|Dƒƒt|ƒ}tdd|Dƒƒt|ƒ} dt|| ƒt|| dƒ}
|
d kr2|  ||t
|
d
ƒt
|d
ƒt
| d
ƒt t|ƒt|ƒƒd œ¡q2q|j d d
dd|S)z*Discover correlations between signal typeséNcs g|]}|ˆjvrˆj|qSr©r%r@rrrrBœrCz7SemanticGraph.discover_correlations.<locals>.<listcomp>cs g|]}|ˆjvrˆj|qSrrRr@rrrrBrCcss|] }|jVqdSr$©r
©rAÚsrrrÚ <genexpr>¡rCz6SemanticGraph.discover_correlations.<locals>.<genexpr>css|] }|jVqdSr$rSrTrrrrV¢rCçà?r)Útype_aÚtype_bÚ correlationÚavg_aÚavg_bÚ sample_sizecSs|dS)NrZr)ÚxrrrÚ<lambda>²rCz5SemanticGraph.discover_correlations.<locals>.<lambda>T)ÚkeyÚreverse)
rMr'rLÚ enumerater,ÚsumrOÚabsÚmaxr/rÚminÚsort) rÚ correlationsÚtypesÚirXrYZ signals_aZ signals_br[r\rZrrrÚdiscover_correlationss*ú
z#SemanticGraph.discover_correlations)rrcCsB| d| dd¡¡}| d| dd¡¡}t|dƒdt|dƒS)zHash location for indexingÚlatÚlatituderÚlngÚ longitudeér+)r,r)rrrlrnrrrr0szSemanticGraph._hash_locationcCs8t|jƒt|jƒt|jƒt|jƒdd|j ¡DƒdœS)zGet graph statisticscSsi|]\}}|t|ƒqSr)rO)rAÚstypeZsidsrrrÚ
<dictcomp>Äsÿz+SemanticGraph.get_stats.<locals>.<dictcomp>)Ú total_nodesÚ total_edgesrIÚ locationsZtype_distribution)rOr%r&r'r(ÚitemsrrrrÚ get_stats½sþûzSemanticGraph.get_stats)N)rF)rrrrr)rr r3r"r;rrr>rErHrPrkr0rwrrrrr#%s$r#c@seZdZdZedœddZedœddZeedœd d
Z eeed œd d
Z
eedœddZ ee eedœddZ
eedœddZeeedœddZdS)ÚAIReasoningLayerz-AI reasoning layer for dynamic index creation)Úsemantic_graphcCs||_| ¡|_dSr$)ÚgraphÚ_load_index_templatesÚindex_templates)rryrrrr)ÎszAIReasoningLayer.__init__rcCs`gd¢gd¢ddœgd¢gd¢ddœgd¢gd ¢d
dœgd ¢gd ¢d
dœgd¢gd¢ddœdœS)z'Load index templates for common queries)
Útraffic_intensityÚsidewalk_widthÚ noise_levelZ air_qualityÚ
playgroundÚgreeneryZschoolsÚlightingZ
crosswalksZ
accessibility)
ç333333Ã?çš™™™™™¹?r„r„r„r„r„çš™™™™™©?r…z2Measures attractiveness for families with children)ÚsignalsÚweightsÚ description)Úpedestrian_flowÚevening_lightingZshade_coverageZpublic_transitÚ
dwell_timeZcompetition_densityZ rent_burdenÚparking)çš™™™™™É?rƒr„r„r„r…z+Predicts commercial success for restaurants)Zinfrastructure_reliabilityZmaintenance_qualityZurban_contradictionZinformal_economyZmobile_connectivityZroad_integrityZstreet_lighting_reliability)rr„r„z0Measures readiness for infrastructure investment)Z public_lifeZnight_activityZ walkabilityÚ shade_indexZpublic_toilet_indexZwifi_availabilityZ safety_indexZvisual_maintenance)r„r„r„r„zMeasures tourism attractiveness)Z heat_stressrŽZdrainage_performanceZ
tree_coverageZsurface_temperatureZ green_spaceZwater_retention)rrr„r…z!Measures urban climate resilience)Úfamily_friendlyÚrestaurant_successÚinvestment_readinessZtourism_potentialZclimate_resiliencerrrrrr{Òs*ýýýýýëz&AIReasoningLayer._load_index_templates)Úqueryrcsh| ¡d}|j ¡D],\}}tfdd| d¡Dƒƒr|}qDq|sR| |¡S|j|}| ||¡S)a
Answer a natural language query by building a custom index
Examples:
- "How attractive is this area for families?"
- "What signals correlate with restaurant success?"
- "Show me a climate resilience index"
Nc3s|]}|ˆvVqdSr$r)rAÚkeyword©Z query_lowerrrrVÿrCz0AIReasoningLayer.answer_query.<locals>.<genexpr>r+)Úlowerr|rvÚanyÚsplitÚ_infer_index_from_queryÚ_build_index_from_template)rrZmatched_templateZ
template_nameÚtemplaterr”rÚ answer_queryðs


zAIReasoningLayer.answer_query)Únameršrc
Cs,|d}|d}g}g}t||ƒD]r\}}|j |¡} | rŠtdd| Dƒƒt| ƒ}
tdd| Dƒƒt| ƒ} | ||
|| t| ƒdœ¡q"| |¡q"|s¨d||dd œStd
d|Dƒƒ} | d krÆd } td
d|Dƒƒ| }
tdd|Dƒƒ| }d|t|
dƒt|dƒt|ƒt|ƒ|||d| ||
¡dœ
S)zBuild an index from a templater†r‡css|]}|dVqdS©r