⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graph__vat_8h-source.html

📁 这是一个用于数据挖掘的常用算法的模板库(数据挖掘的C++模板库for UNIX)
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name="l00149"></a>00149 <a name="l00150"></a>00150   <span class="keywordtype">void</span> insert_occurrence(<span class="keyword">const</span> pair&lt;int, int&gt;&amp; new_occurrence) {<a name="l00151"></a>00151     _vat.back().second.back().push_back(new_occurrence);<a name="l00152"></a>00152   }<a name="l00153"></a>00153 <a name="l00154"></a>00154 <a name="l00155"></a>00155   <span class="keywordtype">void</span> insert_vid_hs(<span class="keyword">const</span> <span class="keywordtype">int</span>&amp; vid) { <a name="l00156"></a>00156     VSET vs;<a name="l00157"></a>00157     vs.insert(vid);<a name="l00158"></a>00158     _vids.back().push_back(vs);<a name="l00159"></a>00159   }<a name="l00160"></a>00160 <a name="l00161"></a>00161 <a name="l00162"></a>00162   <span class="keywordtype">void</span> insert_vid(<span class="keyword">const</span> <span class="keywordtype">int</span>&amp; vid) { <a name="l00163"></a>00163     _vids.back().back().insert(vid);<a name="l00164"></a>00164   }<a name="l00165"></a>00165 <a name="l00166"></a>00166 <a name="l00167"></a>00167   <span class="keywordtype">void</span> insert_vid_tid(<span class="keyword">const</span> <span class="keywordtype">int</span>&amp; vid) {<a name="l00168"></a>00168     VSET vset;<a name="l00169"></a>00169     vset.insert(vid);<a name="l00170"></a>00170     vector&lt;VSET, ALLOC&lt;VSET&gt; &gt; vsets;<a name="l00171"></a>00171     vsets.push_back(vset);<a name="l00172"></a>00172     _vids.push_back(vsets);      <a name="l00173"></a>00173   }<span class="comment">//insert_vid_tid()</span><a name="l00174"></a>00174 <a name="l00175"></a>00175 <a name="l00176"></a>00176   <span class="keywordtype">void</span> copy_vats(<span class="keyword">const</span> pair&lt;<span class="keywordtype">int</span>, ST&lt;<a class="code" href="classevat.html">evat&lt;ALLOC&gt;</a>, ALLOC&lt;<a class="code" href="classevat.html">evat&lt;ALLOC&gt;</a> &gt; &gt; &gt;&amp; v1, <span class="keyword">const</span> <span class="keywordtype">int</span>&amp; offset, <span class="keyword">const</span> <span class="keywordtype">int</span>&amp; sz, <span class="keywordtype">bool</span> swap=0) {<a name="l00177"></a>00177     <span class="keywordtype">int</span> i;<a name="l00178"></a>00178     <span class="keywordflow">for</span>(i=0; i&lt;sz; i++)<a name="l00179"></a>00179       <span class="keywordflow">if</span>(swap)<a name="l00180"></a>00180         _vat.back().second[i].push_back(make_pair(v1.second[i][offset].second, v1.second[i][offset].first));<a name="l00181"></a>00181       <span class="keywordflow">else</span><a name="l00182"></a>00182         _vat.back().second[i].push_back(v1.second[i][offset]);<a name="l00183"></a>00183   }<span class="comment">//copy_vats()</span><a name="l00184"></a>00184   <a name="l00185"></a>00185 <a name="l00186"></a>00186   <span class="keywordtype">void</span> copy_vats_tid(<span class="keyword">const</span> pair&lt;<span class="keywordtype">int</span>, ST&lt;<a class="code" href="classevat.html">evat&lt;ALLOC&gt;</a>, ALLOC&lt;<a class="code" href="classevat.html">evat&lt;ALLOC&gt;</a> &gt; &gt; &gt;&amp; v1, <span class="keyword">const</span> <span class="keywordtype">int</span>&amp; offset, <span class="keyword">const</span> <span class="keywordtype">int</span>&amp; sz, <span class="keywordtype">bool</span> swap=0) {<a name="l00187"></a>00187     <span class="keywordtype">int</span> i;<a name="l00188"></a>00188     ST&lt;EVAT, ALLOC&lt;EVAT&gt; &gt; new_entry;<a name="l00189"></a>00189   <a name="l00190"></a>00190     <span class="keywordflow">for</span>(i=0; i&lt;sz; i++) {<a name="l00191"></a>00191       <a class="code" href="classevat.html">evat&lt;ALLOC&gt;</a> tmp_evat;<a name="l00192"></a>00192       <span class="keywordflow">if</span>(swap)<a name="l00193"></a>00193         tmp_evat.push_back(make_pair(v1.second[i][offset].second, v1.second[i][offset].first));<a name="l00194"></a>00194       <span class="keywordflow">else</span><a name="l00195"></a>00195         tmp_evat.push_back(v1.second[i][offset]);<a name="l00196"></a>00196         new_entry.push_back(tmp_evat);<a name="l00197"></a>00197     }<a name="l00198"></a>00198     _vat.push_back(make_pair(v1.first, new_entry));<a name="l00199"></a>00199   }<span class="comment">//copy_vats_tid()</span><a name="l00200"></a>00200 <a name="l00201"></a>00201 <a name="l00202"></a>00202   <span class="keywordtype">void</span> copy_vids_hs(<span class="keyword">const</span> VSET&amp; v1_vids) {<a name="l00203"></a>00203     <a name="l00204"></a>00204     VSET vs;<a name="l00205"></a>00205     <span class="keyword">typename</span> VSET::const_iterator it;<a name="l00206"></a>00206     <span class="keywordflow">for</span>(it=v1_vids.begin(); it!=v1_vids.end(); it++)<a name="l00207"></a>00207       vs.insert(*it);<a name="l00208"></a>00208     _vids.back().push_back(vs);<a name="l00209"></a>00209   }<span class="comment">//copy_vids()</span><a name="l00210"></a>00210 <a name="l00211"></a>00211 <a name="l00212"></a>00212   <span class="keywordtype">void</span> copy_vids_tid(<span class="keyword">const</span> VSET&amp; v1_vids) {<a name="l00213"></a>00213     VSET vset;<a name="l00214"></a>00214     <span class="keyword">typename</span> VSET::const_iterator it;<a name="l00215"></a>00215     <span class="keywordflow">for</span>(it=v1_vids.begin(); it!=v1_vids.end(); it++)<a name="l00216"></a>00216       vset.insert(*it);<a name="l00217"></a>00217     vector&lt;VSET, ALLOC&lt;VSET&gt; &gt; vsets;<a name="l00218"></a>00218     vsets.push_back(vset);<a name="l00219"></a>00219     _vids.push_back(vsets);<a name="l00220"></a>00220   }<span class="comment">//copy_vids_tid()</span><a name="l00221"></a>00221 <a name="l00222"></a>00222 <a name="l00225"></a>00225   <span class="comment">// NOTE: only one candidate is generated in a FkxF1 join of graphs, </span><a name="l00226"></a>00226   <span class="comment">// hence only the first value in cand_pats should be inspected</span><a name="l00227"></a>00227   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> PATTERN, <span class="keyword">typename</span> PAT_SUP&gt;<a name="l00228"></a><a class="code" href="classvat_3_01GRAPH__PROP_00_01V__Fk1__MINE__PROP_00_01ALLOC_00_01ST_01_4.html#867248a3e91c6b8d64b30fd3e5988ef7">00228</a>   <span class="keyword">static</span> <a class="code" href="classvat_3_01GRAPH__PROP_00_01V__Fk1__MINE__PROP_00_01ALLOC_00_01ST_01_4.html">VAT</a>** intersection(<span class="keyword">const</span> <a class="code" href="classvat_3_01GRAPH__PROP_00_01V__Fk1__MINE__PROP_00_01ALLOC_00_01ST_01_4.html">VAT</a>* v1, <span class="keyword">const</span> <a class="code" href="classvat_3_01GRAPH__PROP_00_01V__Fk1__MINE__PROP_00_01ALLOC_00_01ST_01_4.html">VAT</a>* v2, PAT_SUP** cand_sups, PATTERN** cand_pats, <span class="keywordtype">bool</span>) {<a name="l00229"></a>00229 <span class="preprocessor">#ifdef PRINT</span><a name="l00230"></a>00230 <span class="preprocessor"></span>    cout&lt;&lt;<span class="stringliteral">"VAT intersection entered with v1="</span>&lt;&lt;v1&lt;&lt;endl;<a name="l00231"></a>00231     cout&lt;&lt;<span class="stringliteral">"v2="</span>&lt;&lt;v2&lt;&lt;endl;<a name="l00232"></a>00232 <span class="preprocessor">#endif</span><a name="l00233"></a>00233 <span class="preprocessor"></span><a name="l00234"></a>00234     tt_vat.<a class="code" href="classtime__tracker.html#cbe4e1e72cf61ff3f4c135e161fc5a50">start</a>();<a name="l00235"></a>00235 <a name="l00236"></a>00236     <span class="comment">// How it works</span><a name="l00237"></a>00237     <span class="comment">// 1. determine which edge of v1 is being extended and get its evat1</span><a name="l00238"></a>00238     <span class="comment">// 2. determine right-most-path of candidate (rmp)</span><a name="l00239"></a>00239     <span class="comment">// 3. find common occurrences in v2 and evat1</span><a name="l00240"></a>00240     <span class="comment">// 4. copy these common occurrences to new_vat, and also copy evats in </span><a name="l00241"></a>00241     <span class="comment">// rmp corresponding to these common occurrences</span><a name="l00242"></a>00242 <a name="l00243"></a>00243     <a class="code" href="classvat_3_01GRAPH__PROP_00_01V__Fk1__MINE__PROP_00_01ALLOC_00_01ST_01_4.html">VAT</a>* cand_vat=<span class="keyword">new</span> <a class="code" href="classvat_3_01GRAPH__PROP_00_01V__Fk1__MINE__PROP_00_01ALLOC_00_01ST_01_4.html">VAT</a>;<a name="l00244"></a>00244     <span class="keywordtype">bool</span> is_fwd;<a name="l00245"></a>00245     <span class="keywordtype">bool</span> is_fwd_chain=<span class="keyword">false</span>; <span class="comment">// flag to denote whether edge appended by </span><a name="l00246"></a>00246     <span class="comment">// intersection is at the root (which is when flag=0)</span><a name="l00247"></a>00247     <span class="keywordtype">bool</span> l2_eq=(cand_pats[0]-&gt;size()==3) &amp;&amp; (cand_pats[0]-&gt;label(0)==cand_pats[0]-&gt;label(1)); <span class="comment">// special case in evat intersection for L-2 with first edge </span><a name="l00248"></a>00248     <span class="comment">// with equal vertex labels</span><a name="l00249"></a>00249 <a name="l00250"></a>00250     <span class="keywordtype">int</span> rmp_index; <span class="comment">// index of last vid on rmp common to cand_pat and its </span><a name="l00251"></a>00251     <span class="comment">// parent's rmp</span><a name="l00252"></a>00252     <span class="keywordtype">int</span> new_edge_state=-1; <span class="comment">// flag to denote if the new edge to be added has </span><a name="l00253"></a>00253     <span class="comment">// same labeled vertices, of the form A-A (flag=0); or is of the form </span><a name="l00254"></a>00254     <span class="comment">// A-B (flag=1); or is not canonical at all, of the form B-A (flag=2).</span><a name="l00255"></a>00255     <span class="comment">// evat intersection needs to take this into account</span><a name="l00256"></a>00256 <a name="l00257"></a>00257     <span class="keywordtype">int</span> rvid=cand_pats[0]-&gt;rmost_vid();<a name="l00258"></a>00258     <span class="keywordtype">int</span> edge_vid=-1; <span class="comment">// vid of the other vertex (other than rvid) connected </span><a name="l00259"></a>00259     <span class="comment">// to rvid as to form the new edge</span><a name="l00260"></a>00260 <a name="l00261"></a>00261     <span class="keyword">typename</span> PATTERN::CONST_EIT_PAIR eit_p=cand_pats[0]-&gt;out_edges(rvid);<a name="l00262"></a>00262     <span class="keywordtype">int</span> back_idx=-1; <span class="comment">// this is used only for back extensions. It holds the </span><a name="l00263"></a>00263     <span class="comment">// index of edge_vid in rmp of cand_pats[0]</span><a name="l00264"></a>00264 <a name="l00265"></a>00265     <span class="keywordflow">if</span>(eit_p.second-eit_p.first&gt;1)<a name="l00266"></a>00266       is_fwd=<span class="keyword">false</span>; <span class="comment">// last edge was fwd edge only if outdegree of last vid=1</span><a name="l00267"></a>00267     <span class="keywordflow">else</span><a name="l00268"></a>00268       is_fwd=<span class="keyword">true</span>;<a name="l00269"></a>00269 <a name="l00270"></a>00270     <span class="comment">// get other vertex's vid</span><a name="l00271"></a>00271     <span class="keywordflow">if</span>(is_fwd) {<a name="l00272"></a>00272       edge_vid=eit_p.first-&gt;first;<a name="l00273"></a>00273       <span class="keywordflow">if</span>(!edge_vid) <span class="comment">// rvid is attached to the root</span><a name="l00274"></a>00274         is_fwd_chain=0;<a name="l00275"></a>00275       <span class="keywordflow">else</span><a name="l00276"></a>00276         is_fwd_chain=1;<a name="l00277"></a>00277     }<a name="l00278"></a>00278     <span class="keywordflow">else</span> {<a name="l00279"></a>00279       <span class="comment">//prev_vid=eit_p.first-&gt;first;</span><a name="l00280"></a>00280       eit_p.second--;<a name="l00281"></a>00281       edge_vid=eit_p.second-&gt;first;<a name="l00282"></a>00282 <a name="l00285"></a>00285       <span class="comment">// TO DO: this is currently a linear search through rmp, is there a </span><a name="l00286"></a>00286       <span class="comment">// more efficient way??</span><a name="l00287"></a>00287       <span class="keyword">const</span> <span class="keyword">typename</span> PATTERN::RMP_T&amp; cand_rmp=cand_pats[0]-&gt;rmost_path();<a name="l00288"></a>00288       <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;cand_rmp.size(); i++) {<a name="l00289"></a>00289         <span class="keywordflow">if</span>(cand_rmp[i]==edge_vid) {<a name="l00290"></a>00290           back_idx=i;<a name="l00291"></a>00291           <span class="keywordflow">break</span>;<a name="l00292"></a>00292         }<a name="l00293"></a>00293       }<a name="l00294"></a>00294 <a name="l00295"></a>00295       <span class="keywordflow">if</span>(back_idx==-1) {<a name="l00296"></a>00296         cerr&lt;&lt;<span class="stringliteral">"vat.intersect: back_idx not found for edge_vid="</span>&lt;&lt;edge_vid&lt;&lt;<span class="stringliteral">" in rmp.size="</span>&lt;&lt;cand_rmp.size()&lt;&lt;endl;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -