Skip to content

Instantly share code, notes, and snippets.

@amitkgupta
Last active August 29, 2015 14:06
Show Gist options
  • Save amitkgupta/30d1f6c8f49ba8d23124 to your computer and use it in GitHub Desktop.
Save amitkgupta/30d1f6c8f49ba8d23124 to your computer and use it in GitHub Desktop.
kNN Classifications on a large dataset with different packages.
Display the source blob
Display the rendered blob
Raw
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
-->
<!-- Title: aaa; 3786 samples Pages: 1 -->
<svg width="100%" height="100%"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<script type="text/ecmascript"><![CDATA[
// SVGPan
// http://www.cyberz.org/blog/2009/12/08/svgpan-a-javascript-svg-panzoomdrag-library/
// Local modification: if(true || ...) below to force panning, never moving.
// Local modification: add clamping to fix bug in handleMouseWheel.
/**
* SVGPan library 1.2
* ====================
*
* Given an unique existing element with id "viewport", including the
* the library into any SVG adds the following capabilities:
*
* - Mouse panning
* - Mouse zooming (using the wheel)
* - Object dargging
*
* Known issues:
*
* - Zooming (while panning) on Safari has still some issues
*
* Releases:
*
* 1.2, Sat Mar 20 08:42:50 GMT 2010, Zeng Xiaohui
* Fixed a bug with browser mouse handler interaction
*
* 1.1, Wed Feb 3 17:39:33 GMT 2010, Zeng Xiaohui
* Updated the zoom code to support the mouse wheel on Safari/Chrome
*
* 1.0, Andrea Leofreddi
* First release
*
* This code is licensed under the following BSD license:
*
* Copyright 2009-2010 Andrea Leofreddi <[email protected]>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of Andrea Leofreddi.
*/
var root = document.documentElement;
var state = 'none', stateTarget, stateOrigin, stateTf;
setupHandlers(root);
/**
* Register handlers
*/
function setupHandlers(root){
setAttributes(root, {
"onmouseup" : "add(evt)",
"onmousedown" : "handleMouseDown(evt)",
"onmousemove" : "handleMouseMove(evt)",
"onmouseup" : "handleMouseUp(evt)",
//"onmouseout" : "handleMouseUp(evt)", // Decomment this to stop the pan functionality when dragging out of the SVG element
});
if(navigator.userAgent.toLowerCase().indexOf('webkit') >= 0)
window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari
else
window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others
var g = svgDoc.getElementById("svg");
g.width = "100%";
g.height = "100%";
}
/**
* Instance an SVGPoint object with given event coordinates.
*/
function getEventPoint(evt) {
var p = root.createSVGPoint();
p.x = evt.clientX;
p.y = evt.clientY;
return p;
}
/**
* Sets the current transform matrix of an element.
*/
function setCTM(element, matrix) {
var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")";
element.setAttribute("transform", s);
}
/**
* Dumps a matrix to a string (useful for debug).
*/
function dumpMatrix(matrix) {
var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]";
return s;
}
/**
* Sets attributes of an element.
*/
function setAttributes(element, attributes){
for (i in attributes)
element.setAttributeNS(null, i, attributes[i]);
}
/**
* Handle mouse move event.
*/
function handleMouseWheel(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
var delta;
if(evt.wheelDelta)
delta = evt.wheelDelta / 3600; // Chrome/Safari
else
delta = evt.detail / -90; // Mozilla
var z = 1 + delta; // Zoom factor: 0.9/1.1
// Clamp to reasonable values.
// The 0.1 check is important because
// a very large scroll can turn into a
// negative z, which rotates the image 180 degrees.
if(z < 0.1)
z = 0.1;
if(z > 10.0)
z = 10.0;
var g = svgDoc.getElementById("viewport");
var p = getEventPoint(evt);
p = p.matrixTransform(g.getCTM().inverse());
// Compute new scale matrix in current mouse position
var k = root.createSVGMatrix().translate(p.x, p.y).scale(z).translate(-p.x, -p.y);
setCTM(g, g.getCTM().multiply(k));
stateTf = stateTf.multiply(k.inverse());
}
/**
* Handle mouse move event.
*/
function handleMouseMove(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
var g = svgDoc.getElementById("viewport");
if(state == 'pan') {
// Pan mode
var p = getEventPoint(evt).matrixTransform(stateTf);
setCTM(g, stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y));
} else if(state == 'move') {
// Move mode
var p = getEventPoint(evt).matrixTransform(g.getCTM().inverse());
setCTM(stateTarget, root.createSVGMatrix().translate(p.x - stateOrigin.x, p.y - stateOrigin.y).multiply(g.getCTM().inverse()).multiply(stateTarget.getCTM()));
stateOrigin = p;
}
}
/**
* Handle click event.
*/
function handleMouseDown(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
var g = svgDoc.getElementById("viewport");
if(true || evt.target.tagName == "svg") {
// Pan mode
state = 'pan';
stateTf = g.getCTM().inverse();
stateOrigin = getEventPoint(evt).matrixTransform(stateTf);
} else {
// Move mode
state = 'move';
stateTarget = evt.target;
stateTf = g.getCTM().inverse();
stateOrigin = getEventPoint(evt).matrixTransform(stateTf);
}
}
/**
* Handle mouse button release event.
*/
function handleMouseUp(evt) {
if(evt.preventDefault)
evt.preventDefault();
evt.returnValue = false;
var svgDoc = evt.target.ownerDocument;
if(state == 'pan' || state == 'move') {
// Quit pan mode
state = '';
}
}
]]></script>
<g id="viewport" transform="translate(0,0)">
<g id="viewport" class="graph" transform="scale(1 1) rotate(0) translate(4 2480)">
<title>aaa; 3786 samples</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-2480 2351,-2480 2351,4 -4,4"/>
<!-- Legend -->
<g id="node1" class="node"><title>Legend</title>
<text text-anchor="start" x="663" y="-2452.8" font-family="Times,serif" font-size="24.00">aaa</text>
<text text-anchor="start" x="663" y="-2426.8" font-family="Times,serif" font-size="24.00">Total samples: 3786</text>
<text text-anchor="start" x="663" y="-2400.8" font-family="Times,serif" font-size="24.00">Focusing on: 3786</text>
<text text-anchor="start" x="663" y="-2374.8" font-family="Times,serif" font-size="24.00">Dropped nodes with &lt;= 18 abs(samples)</text>
<text text-anchor="start" x="663" y="-2348.8" font-family="Times,serif" font-size="24.00">Dropped edges with &lt;= 3 samples</text>
</g>
<!-- N1 -->
<g id="node2" class="node"><title>N1</title>
<polygon fill="none" stroke="black" points="1150.25,-2424.5 1077.75,-2424.5 1077.75,-2389.5 1150.25,-2389.5 1150.25,-2424.5"/>
<text text-anchor="middle" x="1114" y="-2414.1" font-family="Times,serif" font-size="8.00">runtime.gosched0</text>
<text text-anchor="end" x="1142.5" y="-2405.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="1142.5" y="-2396.1" font-family="Times,serif" font-size="8.00">of 3600 (95.1%)</text>
</g>
<!-- N2 -->
<g id="node3" class="node"><title>N2</title>
<polygon fill="none" stroke="black" points="1148.25,-2285.5 1079.75,-2285.5 1079.75,-2250.5 1148.25,-2250.5 1148.25,-2285.5"/>
<text text-anchor="middle" x="1114" y="-2275.1" font-family="Times,serif" font-size="8.00">main.func·001</text>
<text text-anchor="end" x="1140.5" y="-2266.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="1140.5" y="-2257.1" font-family="Times,serif" font-size="8.00">of 3337 (88.1%)</text>
</g>
<!-- N1&#45;&gt;N2 -->
<g id="edge25" class="edge"><title>N1&#45;&gt;N2</title>
<path fill="none" stroke="black" stroke-width="2" d="M1114,-2389.47C1114,-2366.23 1114,-2323.61 1114,-2295.8"/>
<polygon fill="black" stroke="black" stroke-width="2" points="1117.5,-2295.58 1114,-2285.58 1110.5,-2295.58 1117.5,-2295.58"/>
<text text-anchor="middle" x="1128" y="-2308.3" font-family="Times,serif" font-size="14.00">3337</text>
</g>
<!-- N19 -->
<g id="node20" class="node"><title>N19</title>
<polygon fill="none" stroke="black" points="1349.5,-2285.5 1288.5,-2285.5 1288.5,-2250.5 1349.5,-2250.5 1349.5,-2285.5"/>
<text text-anchor="middle" x="1319" y="-2275.1" font-family="Times,serif" font-size="8.00">runtime.main</text>
<text text-anchor="end" x="1342" y="-2266.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="1342" y="-2257.1" font-family="Times,serif" font-size="8.00">of 254 (6.7%)</text>
</g>
<!-- N1&#45;&gt;N19 -->
<g id="edge24" class="edge"><title>N1&#45;&gt;N19</title>
<path fill="none" stroke="black" d="M1121.74,-2389.48C1129.55,-2374.34 1142.89,-2352.2 1160,-2338 1195.09,-2308.88 1244.35,-2290.05 1278.71,-2279.54"/>
<polygon fill="black" stroke="black" points="1279.83,-2282.86 1288.42,-2276.67 1277.84,-2276.15 1279.83,-2282.86"/>
<text text-anchor="middle" x="1222.5" y="-2308.3" font-family="Times,serif" font-size="14.00">254</text>
</g>
<!-- N3 -->
<g id="node4" class="node"><title>N3</title>
<polygon fill="none" stroke="black" points="1375,-2197.5 853,-2197.5 853,-2132.5 1375,-2132.5 1375,-2197.5"/>
<text text-anchor="middle" x="1114" y="-2179.74" font-family="Times,serif" font-size="17.20">github.com/amitkgupta/goodlearn/classifier/knn.(*kNNClassifier).Classify</text>
<text text-anchor="end" x="1367" y="-2160.74" font-family="Times,serif" font-size="17.20">128 (3.4%)</text>
<text text-anchor="end" x="1367" y="-2141.74" font-family="Times,serif" font-size="17.20">of 3335 (88.1%)</text>
</g>
<!-- N2&#45;&gt;N3 -->
<g id="edge5" class="edge"><title>N2&#45;&gt;N3</title>
<path fill="none" stroke="black" stroke-width="2" d="M1114,-2250.32C1114,-2238.76 1114,-2222.82 1114,-2207.91"/>
<polygon fill="black" stroke="black" stroke-width="2" points="1117.5,-2207.81 1114,-2197.81 1110.5,-2207.81 1117.5,-2207.81"/>
<text text-anchor="middle" x="1128" y="-2220.3" font-family="Times,serif" font-size="14.00">3335</text>
</g>
<!-- N4 -->
<g id="node5" class="node"><title>N4</title>
<polygon fill="none" stroke="black" points="1437,-2080 791,-2080 791,-2000 1437,-2000 1437,-2080"/>
<text text-anchor="middle" x="1114" y="-2058.8" font-family="Times,serif" font-size="21.50">github.com/amitkgupta/goodlearn/data/dataset.(*inMemoryDataset).Row</text>
<text text-anchor="end" x="1429" y="-2034.8" font-family="Times,serif" font-size="21.50">278 (7.3%)</text>
<text text-anchor="end" x="1429" y="-2010.8" font-family="Times,serif" font-size="21.50">of 2621 (69.2%)</text>
</g>
<!-- N3&#45;&gt;N4 -->
<g id="edge37" class="edge"><title>N3&#45;&gt;N4</title>
<path fill="none" stroke="black" stroke-width="2" d="M1114,-2132.32C1114,-2119.49 1114,-2104.38 1114,-2090.18"/>
<polygon fill="black" stroke="black" stroke-width="2" points="1117.5,-2090.04 1114,-2080.04 1110.5,-2090.04 1117.5,-2090.04"/>
<text text-anchor="middle" x="1128" y="-2102.3" font-family="Times,serif" font-size="14.00">2621</text>
</g>
<!-- N15 -->
<g id="node16" class="node"><title>N15</title>
<polygon fill="none" stroke="black" points="773,-2068 129,-2068 129,-2012 773,-2012 773,-2068"/>
<text text-anchor="middle" x="451" y="-2046.24" font-family="Times,serif" font-size="22.20">github.com/amitkgupta/goodlearn/classifier/knn/knnutilities.Euclidean</text>
<text text-anchor="end" x="765" y="-2022.24" font-family="Times,serif" font-size="22.20">307 (8.1%)</text>
</g>
<!-- N3&#45;&gt;N15 -->
<g id="edge26" class="edge"><title>N3&#45;&gt;N15</title>
<path fill="none" stroke="black" d="M944.122,-2132.48C840.064,-2113.18 707.877,-2088.66 606.561,-2069.86"/>
<polygon fill="black" stroke="black" points="607.015,-2066.38 596.544,-2068 605.738,-2073.27 607.015,-2066.38"/>
<text text-anchor="middle" x="852.5" y="-2102.3" font-family="Times,serif" font-size="14.00">307</text>
</g>
<!-- N26 -->
<g id="node27" class="node"><title>N26</title>
<polygon fill="none" stroke="black" points="110.25,-2065 3.75,-2065 3.75,-2015 110.25,-2015 110.25,-2065"/>
<text text-anchor="middle" x="57" y="-2051" font-family="Times,serif" font-size="12.50">runtime.assertI2I2</text>
<text text-anchor="end" x="102.5" y="-2037" font-family="Times,serif" font-size="12.50">31 (0.8%)</text>
<text text-anchor="end" x="102.5" y="-2023" font-family="Times,serif" font-size="12.50">of 159 (4.2%)</text>
</g>
<!-- N3&#45;&gt;N26 -->
<g id="edge42" class="edge"><title>N3&#45;&gt;N26</title>
<path fill="none" stroke="black" d="M852.95,-2155.68C604.998,-2145.31 251.185,-2123.37 120,-2080 112.615,-2077.56 105.203,-2074.09 98.1902,-2070.23"/>
<polygon fill="black" stroke="black" points="99.9483,-2067.2 89.552,-2065.16 96.4062,-2073.24 99.9483,-2067.2"/>
<text text-anchor="middle" x="292.5" y="-2102.3" font-family="Times,serif" font-size="14.00">159</text>
</g>
<!-- N32 -->
<g id="node33" class="node"><title>N32</title>
<polygon fill="none" stroke="black" points="1992.25,-2062 1455.75,-2062 1455.75,-2018 1992.25,-2018 1992.25,-2062"/>
<text text-anchor="middle" x="1724" y="-2045.12" font-family="Times,serif" font-size="16.10">github.com/amitkgupta/goodlearn/data/dataset.(*inMemoryDataset).NumRows</text>
<text text-anchor="end" x="1984.5" y="-2027.12" font-family="Times,serif" font-size="16.10">99 (2.6%)</text>
</g>
<!-- N3&#45;&gt;N32 -->
<g id="edge49" class="edge"><title>N3&#45;&gt;N32</title>
<path fill="none" stroke="black" d="M1270.3,-2132.48C1376.16,-2111.14 1513.66,-2083.41 1609.42,-2064.1"/>
<polygon fill="black" stroke="black" points="1610.31,-2067.49 1619.43,-2062.09 1608.93,-2060.63 1610.31,-2067.49"/>
<text text-anchor="middle" x="1444" y="-2102.3" font-family="Times,serif" font-size="14.00">99</text>
</g>
<!-- N5 -->
<g id="node6" class="node"><title>N5</title>
<polygon fill="none" stroke="black" points="1175.25,-1828 1052.75,-1828 1052.75,-1766 1175.25,-1766 1175.25,-1828"/>
<text text-anchor="middle" x="1114" y="-1811.2" font-family="Times,serif" font-size="16.00">runtime.new</text>
<text text-anchor="end" x="1167.5" y="-1793.2" font-family="Times,serif" font-size="16.00">98 (2.6%)</text>
<text text-anchor="end" x="1167.5" y="-1775.2" font-family="Times,serif" font-size="16.00">of 2188 (57.8%)</text>
</g>
<!-- N4&#45;&gt;N5 -->
<g id="edge52" class="edge"><title>N4&#45;&gt;N5</title>
<path fill="none" stroke="black" stroke-width="1.30586" d="M1312.16,-2000C1336.4,-1987.22 1358.16,-1970.33 1374,-1948 1391.49,-1923.35 1391.87,-1904.37 1374,-1880 1331.21,-1821.64 1246.78,-1803.74 1185.72,-1798.79"/>
<polygon fill="black" stroke="black" stroke-width="1.30586" points="1185.59,-1795.27 1175.37,-1798.05 1185.1,-1802.25 1185.59,-1795.27"/>
<text text-anchor="middle" x="1397.5" y="-1910.3" font-family="Times,serif" font-size="14.00">824</text>
</g>
<!-- N7 -->
<g id="node8" class="node"><title>N7</title>
<polygon fill="none" stroke="black" points="1365.25,-1948 862.75,-1948 862.75,-1880 1365.25,-1880 1365.25,-1948"/>
<text text-anchor="middle" x="1114" y="-1929.52" font-family="Times,serif" font-size="18.10">github.com/amitkgupta/goodlearn/data/slice.SliceFromRawValues</text>
<text text-anchor="end" x="1357.5" y="-1909.52" font-family="Times,serif" font-size="18.10">155 (4.1%)</text>
<text text-anchor="end" x="1357.5" y="-1889.52" font-family="Times,serif" font-size="18.10">of 1519 (40.1%)</text>
</g>
<!-- N4&#45;&gt;N7 -->
<g id="edge8" class="edge"><title>N4&#45;&gt;N7</title>
<path fill="none" stroke="black" stroke-width="2" d="M1114,-1999.77C1114,-1986.54 1114,-1971.7 1114,-1958.18"/>
<polygon fill="black" stroke="black" stroke-width="2" points="1117.5,-1958.15 1114,-1948.15 1110.5,-1958.15 1117.5,-1958.15"/>
<text text-anchor="middle" x="1128" y="-1970.3" font-family="Times,serif" font-size="14.00">1519</text>
</g>
<!-- N6 -->
<g id="node7" class="node"><title>N6</title>
<polygon fill="none" stroke="black" points="1217,-1513.5 1011,-1513.5 1011,-1418.5 1217,-1418.5 1217,-1513.5"/>
<text text-anchor="middle" x="1114" y="-1488.22" font-family="Times,serif" font-size="26.60">runtime.mallocgc</text>
<text text-anchor="end" x="1209" y="-1459.22" font-family="Times,serif" font-size="26.60">525 (13.9%)</text>
<text text-anchor="end" x="1209" y="-1430.22" font-family="Times,serif" font-size="26.60">of 2140 (56.5%)</text>
</g>
<!-- N5&#45;&gt;N6 -->
<g id="edge50" class="edge"><title>N5&#45;&gt;N6</title>
<path fill="none" stroke="black" stroke-width="2" d="M1114,-1765.93C1114,-1711.05 1114,-1593.84 1114,-1523.59"/>
<polygon fill="black" stroke="black" stroke-width="2" points="1117.5,-1523.58 1114,-1513.58 1110.5,-1523.58 1117.5,-1523.58"/>
<text text-anchor="middle" x="1128" y="-1636.3" font-family="Times,serif" font-size="14.00">2090</text>
</g>
<!-- N8 -->
<g id="node9" class="node"><title>N8</title>
<polygon fill="none" stroke="black" points="1164,-1343 1064,-1343 1064,-1305 1164,-1305 1164,-1343"/>
<text text-anchor="middle" x="1114" y="-1331.72" font-family="Times,serif" font-size="9.10">runtime.MCache_Refill</text>
<text text-anchor="end" x="1156" y="-1321.72" font-family="Times,serif" font-size="9.10">2 (0.1%)</text>
<text text-anchor="end" x="1156" y="-1311.72" font-family="Times,serif" font-size="9.10">of 1162 (30.7%)</text>
</g>
<!-- N6&#45;&gt;N8 -->
<g id="edge17" class="edge"><title>N6&#45;&gt;N8</title>
<path fill="none" stroke="black" stroke-width="1.84152" d="M1114,-1418.38C1114,-1396.84 1114,-1371.96 1114,-1353.3"/>
<polygon fill="black" stroke="black" stroke-width="1.84152" points="1117.5,-1353.1 1114,-1343.1 1110.5,-1353.1 1117.5,-1353.1"/>
<text text-anchor="middle" x="1128" y="-1388.3" font-family="Times,serif" font-size="14.00">1162</text>
</g>
<!-- N13 -->
<g id="node14" class="node"><title>N13</title>
<polygon fill="none" stroke="black" points="1363.25,-1365.5 1220.75,-1365.5 1220.75,-1282.5 1363.25,-1282.5 1363.25,-1365.5"/>
<text text-anchor="middle" x="1292" y="-1343.42" font-family="Times,serif" font-size="22.60">settype</text>
<text text-anchor="end" x="1355.5" y="-1318.42" font-family="Times,serif" font-size="22.60">322 (8.5%)</text>
<text text-anchor="end" x="1355.5" y="-1293.42" font-family="Times,serif" font-size="22.60">of 325 (8.6%)</text>
</g>
<!-- N6&#45;&gt;N13 -->
<g id="edge45" class="edge"><title>N6&#45;&gt;N13</title>
<path fill="none" stroke="black" d="M1181.91,-1418.21C1190.12,-1412.2 1198.31,-1406.04 1206,-1400 1217.03,-1391.33 1228.54,-1381.72 1239.41,-1372.35"/>
<polygon fill="black" stroke="black" points="1241.95,-1374.78 1247.21,-1365.59 1237.36,-1369.5 1241.95,-1374.78"/>
<text text-anchor="middle" x="1236.5" y="-1388.3" font-family="Times,serif" font-size="14.00">325</text>
</g>
<!-- N31 -->
<g id="node32" class="node"><title>N31</title>
<polygon fill="none" stroke="black" points="1516.25,-1346 1381.75,-1346 1381.75,-1302 1516.25,-1302 1516.25,-1346"/>
<text text-anchor="middle" x="1449" y="-1328.88" font-family="Times,serif" font-size="16.40">runtime.markscan</text>
<text text-anchor="end" x="1508.5" y="-1310.88" font-family="Times,serif" font-size="16.40">106 (2.8%)</text>
</g>
<!-- N6&#45;&gt;N31 -->
<g id="edge21" class="edge"><title>N6&#45;&gt;N31</title>
<path fill="none" stroke="black" d="M1217.21,-1428.7C1264.89,-1411.1 1321.91,-1388.84 1372,-1366 1382.02,-1361.43 1392.57,-1356.15 1402.52,-1350.92"/>
<polygon fill="black" stroke="black" points="1404.29,-1353.95 1411.47,-1346.17 1401,-1347.77 1404.29,-1353.95"/>
<text text-anchor="middle" x="1341.5" y="-1388.3" font-family="Times,serif" font-size="14.00">106</text>
</g>
<!-- N37 -->
<g id="node38" class="node"><title>N37</title>
<polygon fill="none" stroke="black" points="1077.5,-940 962.5,-940 962.5,-898 1077.5,-898 1077.5,-940"/>
<text text-anchor="middle" x="1020" y="-923.84" font-family="Times,serif" font-size="15.20">runtime.memclr</text>
<text text-anchor="end" x="1070" y="-906.84" font-family="Times,serif" font-size="15.20">78 (2.1%)</text>
</g>
<!-- N6&#45;&gt;N37 -->
<g id="edge31" class="edge"><title>N6&#45;&gt;N37</title>
<path fill="none" stroke="black" d="M1143.31,-1418.28C1153.15,-1401.96 1163.93,-1383.38 1173,-1366 1191.96,-1329.68 1189.61,-1316.95 1211,-1282 1244.84,-1226.71 1280.57,-1229.19 1302,-1168 1319.04,-1119.34 1329.67,-1095.5 1302,-1052 1277.53,-1013.53 1162.88,-968.45 1087.51,-942.17"/>
<polygon fill="black" stroke="black" points="1088.2,-938.706 1077.61,-938.747 1085.91,-945.322 1088.2,-938.706"/>
<text text-anchor="middle" x="1315" y="-1156.3" font-family="Times,serif" font-size="14.00">18</text>
</g>
<!-- N7&#45;&gt;N5 -->
<g id="edge63" class="edge"><title>N7&#45;&gt;N5</title>
<path fill="none" stroke="black" stroke-width="2" d="M1114,-1879.74C1114,-1866.73 1114,-1851.71 1114,-1838.11"/>
<polygon fill="black" stroke="black" stroke-width="2" points="1117.5,-1838.05 1114,-1828.05 1110.5,-1838.05 1117.5,-1838.05"/>
<text text-anchor="middle" x="1128" y="-1850.3" font-family="Times,serif" font-size="14.00">1364</text>
</g>
<!-- N9 -->
<g id="node10" class="node"><title>N9</title>
<polygon fill="none" stroke="black" points="1187,-1230 1041,-1230 1041,-1186 1187,-1186 1187,-1230"/>
<text text-anchor="middle" x="1114" y="-1217.36" font-family="Times,serif" font-size="10.80">runtime.MCentral_CacheSpan</text>
<text text-anchor="end" x="1179" y="-1205.36" font-family="Times,serif" font-size="10.80">12 (0.3%)</text>
<text text-anchor="end" x="1179" y="-1193.36" font-family="Times,serif" font-size="10.80">of 1153 (30.5%)</text>
</g>
<!-- N8&#45;&gt;N9 -->
<g id="edge35" class="edge"><title>N8&#45;&gt;N9</title>
<path fill="none" stroke="black" stroke-width="1.82726" d="M1114,-1304.94C1114,-1287.61 1114,-1261.1 1114,-1240.33"/>
<polygon fill="black" stroke="black" stroke-width="1.82726" points="1117.5,-1240.08 1114,-1230.08 1110.5,-1240.08 1117.5,-1240.08"/>
<text text-anchor="middle" x="1128" y="-1252.3" font-family="Times,serif" font-size="14.00">1153</text>
</g>
<!-- N10 -->
<g id="node11" class="node"><title>N10</title>
<polygon fill="none" stroke="black" points="1244,-661.5 984,-661.5 984,-566.5 1244,-566.5 1244,-661.5"/>
<text text-anchor="middle" x="1114" y="-636.7" font-family="Times,serif" font-size="26.00">runtime.MSpan_Sweep</text>
<text text-anchor="end" x="1236" y="-607.7" font-family="Times,serif" font-size="26.00">492 (13.0%)</text>
<text text-anchor="end" x="1236" y="-578.7" font-family="Times,serif" font-size="26.00">of 844 (22.3%)</text>
</g>
<!-- N9&#45;&gt;N10 -->
<g id="edge44" class="edge"><title>N9&#45;&gt;N10</title>
<path fill="none" stroke="black" stroke-width="1.27734" d="M1114,-1185.65C1114,-1166.19 1114,-1136.67 1114,-1111 1114,-1111 1114,-1111 1114,-735 1114,-714.421 1114,-691.856 1114,-671.902"/>
<polygon fill="black" stroke="black" stroke-width="1.27734" points="1117.5,-671.73 1114,-661.73 1110.5,-671.73 1117.5,-671.73"/>
<text text-anchor="middle" x="1124.5" y="-915.3" font-family="Times,serif" font-size="14.00">806</text>
</g>
<!-- N16 -->
<g id="node17" class="node"><title>N16</title>
<polygon fill="none" stroke="black" points="1084.25,-1133.5 991.75,-1133.5 991.75,-1086.5 1084.25,-1086.5 1084.25,-1133.5"/>
<text text-anchor="middle" x="1038" y="-1120.14" font-family="Times,serif" font-size="11.70">MCentral_Grow</text>
<text text-anchor="end" x="1076.5" y="-1107.14" font-family="Times,serif" font-size="11.70">21 (0.6%)</text>
<text text-anchor="end" x="1076.5" y="-1094.14" font-family="Times,serif" font-size="11.70">of 295 (7.8%)</text>
</g>
<!-- N9&#45;&gt;N16 -->
<g id="edge40" class="edge"><title>N9&#45;&gt;N16</title>
<path fill="none" stroke="black" d="M1094.32,-1185.9C1089.21,-1180.2 1083.79,-1173.95 1079,-1168 1072.35,-1159.74 1065.49,-1150.51 1059.32,-1141.92"/>
<polygon fill="black" stroke="black" points="1062.06,-1139.74 1053.42,-1133.61 1056.36,-1143.79 1062.06,-1139.74"/>
<text text-anchor="middle" x="1089.5" y="-1156.3" font-family="Times,serif" font-size="14.00">295</text>
</g>
<!-- N20 -->
<g id="node21" class="node"><title>N20</title>
<polygon fill="none" stroke="black" points="1150,-240.5 1078,-240.5 1078,-199.5 1150,-199.5 1150,-240.5"/>
<text text-anchor="middle" x="1114" y="-228.42" font-family="Times,serif" font-size="10.10">runtime.lock</text>
<text text-anchor="end" x="1142" y="-217.42" font-family="Times,serif" font-size="10.10">7 (0.2%)</text>
<text text-anchor="end" x="1142" y="-206.42" font-family="Times,serif" font-size="10.10">of 226 (6.0%)</text>
</g>
<!-- N9&#45;&gt;N20 -->
<g id="edge32" class="edge"><title>N9&#45;&gt;N20</title>
<path fill="none" stroke="black" d="M1132.24,-1185.9C1168.28,-1142.92 1248.39,-1040.73 1286,-940 1325.42,-834.423 1322,-801.697 1322,-689 1322,-689 1322,-689 1322,-314 1322,-243.701 1221.76,-226.187 1160.45,-222.05"/>
<polygon fill="black" stroke="black" points="1160.42,-218.542 1150.23,-221.458 1160.01,-225.53 1160.42,-218.542"/>
<text text-anchor="middle" x="1330" y="-732.3" font-family="Times,serif" font-size="14.00">10</text>
</g>
<!-- N23 -->
<g id="node24" class="node"><title>N23</title>
<polygon fill="none" stroke="black" points="920.25,-240.5 841.75,-240.5 841.75,-199.5 920.25,-199.5 920.25,-240.5"/>
<text text-anchor="middle" x="881" y="-228.66" font-family="Times,serif" font-size="9.80">runtime.unlock</text>
<text text-anchor="end" x="912.5" y="-217.66" font-family="Times,serif" font-size="9.80">5 (0.1%)</text>
<text text-anchor="end" x="912.5" y="-206.66" font-family="Times,serif" font-size="9.80">of 171 (4.5%)</text>
</g>
<!-- N9&#45;&gt;N23 -->
<g id="edge58" class="edge"><title>N9&#45;&gt;N23</title>
<path fill="none" stroke="black" d="M1040.64,-1201.83C937.477,-1192.51 762,-1168.25 762,-1111 762,-1111 762,-1111 762,-314 762,-276.413 799.313,-251.76 832.151,-237.341"/>
<polygon fill="black" stroke="black" points="833.816,-240.44 841.705,-233.368 831.128,-233.976 833.816,-240.44"/>
<text text-anchor="middle" x="769" y="-732.3" font-family="Times,serif" font-size="14.00">18</text>
</g>
<!-- N11 -->
<g id="node12" class="node"><title>N11</title>
<polygon fill="none" stroke="black" points="1175.25,-514 1052.75,-514 1052.75,-476 1175.25,-476 1175.25,-514"/>
<text text-anchor="middle" x="1114" y="-502.48" font-family="Times,serif" font-size="9.40">runtime.MCentral_FreeSpan</text>
<text text-anchor="end" x="1167.5" y="-492.48" font-family="Times,serif" font-size="9.40">3 (0.1%)</text>
<text text-anchor="end" x="1167.5" y="-482.48" font-family="Times,serif" font-size="9.40">of 346 (9.1%)</text>
</g>
<!-- N10&#45;&gt;N11 -->
<g id="edge46" class="edge"><title>N10&#45;&gt;N11</title>
<path fill="none" stroke="black" d="M1114,-566.422C1114,-552.227 1114,-537.055 1114,-524.441"/>
<polygon fill="black" stroke="black" points="1117.5,-524.105 1114,-514.105 1110.5,-524.105 1117.5,-524.105"/>
<text text-anchor="middle" x="1124.5" y="-536.3" font-family="Times,serif" font-size="14.00">346</text>
</g>
<!-- N12 -->
<g id="node13" class="node"><title>N12</title>
<polygon fill="none" stroke="black" points="1166.5,-424 1061.5,-424 1061.5,-386 1166.5,-386 1166.5,-424"/>
<text text-anchor="middle" x="1114" y="-412.96" font-family="Times,serif" font-size="8.80">MCentral_ReturnToHeap</text>
<text text-anchor="end" x="1159" y="-402.96" font-family="Times,serif" font-size="8.80">1 (0.0%)</text>
<text text-anchor="end" x="1159" y="-392.96" font-family="Times,serif" font-size="8.80">of 332 (8.8%)</text>
</g>
<!-- N11&#45;&gt;N12 -->
<g id="edge28" class="edge"><title>N11&#45;&gt;N12</title>
<path fill="none" stroke="black" d="M1114,-475.766C1114,-463.849 1114,-448.038 1114,-434.482"/>
<polygon fill="black" stroke="black" points="1117.5,-434.21 1114,-424.21 1110.5,-434.21 1117.5,-434.21"/>
<text text-anchor="middle" x="1124.5" y="-446.3" font-family="Times,serif" font-size="14.00">332</text>
</g>
<!-- N11&#45;&gt;N20 -->
<g id="edge29" class="edge"><title>N11&#45;&gt;N20</title>
<path fill="none" stroke="black" d="M1136.58,-475.81C1150.57,-463.003 1167.31,-444.53 1175,-424 1182.37,-404.315 1182.4,-327.503 1171,-296 1164.64,-278.425 1152.6,-261.595 1141.22,-248.347"/>
<polygon fill="black" stroke="black" points="1143.55,-245.704 1134.27,-240.587 1138.33,-250.373 1143.55,-245.704"/>
<text text-anchor="middle" x="1184.5" y="-356.3" font-family="Times,serif" font-size="14.00">5</text>
</g>
<!-- N14 -->
<g id="node15" class="node"><title>N14</title>
<polygon fill="none" stroke="black" points="1162.5,-334 1065.5,-334 1065.5,-296 1162.5,-296 1162.5,-334"/>
<text text-anchor="middle" x="1114" y="-322.48" font-family="Times,serif" font-size="9.40">runtime.MHeap_Free</text>
<text text-anchor="end" x="1155" y="-312.48" font-family="Times,serif" font-size="9.40">3 (0.1%)</text>
<text text-anchor="end" x="1155" y="-302.48" font-family="Times,serif" font-size="9.40">of 320 (8.5%)</text>
</g>
<!-- N12&#45;&gt;N14 -->
<g id="edge38" class="edge"><title>N12&#45;&gt;N14</title>
<path fill="none" stroke="black" d="M1114,-385.766C1114,-373.849 1114,-358.038 1114,-344.482"/>
<polygon fill="black" stroke="black" points="1117.5,-344.21 1114,-334.21 1110.5,-344.21 1117.5,-344.21"/>
<text text-anchor="middle" x="1124.5" y="-356.3" font-family="Times,serif" font-size="14.00">320</text>
</g>
<!-- N14&#45;&gt;N20 -->
<g id="edge12" class="edge"><title>N14&#45;&gt;N20</title>
<path fill="none" stroke="black" d="M1114,-295.626C1114,-282.847 1114,-265.529 1114,-250.792"/>
<polygon fill="black" stroke="black" points="1117.5,-250.62 1114,-240.62 1110.5,-250.62 1117.5,-250.62"/>
<text text-anchor="middle" x="1124.5" y="-266.3" font-family="Times,serif" font-size="14.00">174</text>
</g>
<!-- N14&#45;&gt;N23 -->
<g id="edge22" class="edge"><title>N14&#45;&gt;N23</title>
<path fill="none" stroke="black" d="M1066.74,-295.96C1030.56,-282.044 979.484,-262.167 935,-244 933.379,-243.338 931.732,-242.661 930.069,-241.974"/>
<polygon fill="black" stroke="black" points="931.039,-238.586 920.462,-237.969 928.345,-245.047 931.039,-238.586"/>
<text text-anchor="middle" x="1029.5" y="-266.3" font-family="Times,serif" font-size="14.00">122</text>
</g>
<!-- N51 -->
<g id="node52" class="node"><title>N51</title>
<polygon fill="none" stroke="black" points="1059.25,-243.5 944.75,-243.5 944.75,-196.5 1059.25,-196.5 1059.25,-243.5"/>
<text text-anchor="middle" x="1002" y="-230.06" font-family="Times,serif" font-size="11.80">MHeap_FreeLocked</text>
<text text-anchor="end" x="1051.5" y="-217.06" font-family="Times,serif" font-size="11.80">22 (0.6%)</text>
<text text-anchor="end" x="1051.5" y="-204.06" font-family="Times,serif" font-size="11.80">of 29 (0.8%)</text>
</g>
<!-- N14&#45;&gt;N51 -->
<g id="edge11" class="edge"><title>N14&#45;&gt;N51</title>
<path fill="none" stroke="black" d="M1092.14,-295.848C1076.57,-282.921 1055.31,-265.268 1037.35,-250.352"/>
<polygon fill="black" stroke="black" points="1039.29,-247.413 1029.36,-243.718 1034.82,-252.799 1039.29,-247.413"/>
<text text-anchor="middle" x="1076" y="-266.3" font-family="Times,serif" font-size="14.00">21</text>
</g>
<!-- N22 -->
<g id="node23" class="node"><title>N22</title>
<polygon fill="none" stroke="black" points="1085.25,-1032 990.75,-1032 990.75,-994 1085.25,-994 1085.25,-1032"/>
<text text-anchor="middle" x="1038" y="-1020.96" font-family="Times,serif" font-size="8.80">runtime.MHeap_Alloc</text>
<text text-anchor="end" x="1077.5" y="-1010.96" font-family="Times,serif" font-size="8.80">1 (0.0%)</text>
<text text-anchor="end" x="1077.5" y="-1000.96" font-family="Times,serif" font-size="8.80">of 196 (5.2%)</text>
</g>
<!-- N16&#45;&gt;N22 -->
<g id="edge62" class="edge"><title>N16&#45;&gt;N22</title>
<path fill="none" stroke="black" d="M1038,-1086.49C1038,-1073.28 1038,-1056.48 1038,-1042.37"/>
<polygon fill="black" stroke="black" points="1041.5,-1042.22 1038,-1032.22 1034.5,-1042.22 1041.5,-1042.22"/>
<text text-anchor="middle" x="1048.5" y="-1056.3" font-family="Times,serif" font-size="14.00">196</text>
</g>
<!-- N38 -->
<g id="node39" class="node"><title>N38</title>
<polygon fill="none" stroke="black" points="972,-1034 844,-1034 844,-992 972,-992 972,-1034"/>
<text text-anchor="middle" x="908" y="-1018" font-family="Times,serif" font-size="15.00">runtime.markspan</text>
<text text-anchor="end" x="964" y="-1001" font-family="Times,serif" font-size="15.00">75 (2.0%)</text>
</g>
<!-- N16&#45;&gt;N38 -->
<g id="edge53" class="edge"><title>N16&#45;&gt;N38</title>
<path fill="none" stroke="black" d="M1007.19,-1086.49C988.139,-1072.56 963.608,-1054.64 943.708,-1040.09"/>
<polygon fill="black" stroke="black" points="945.632,-1037.17 935.493,-1034.09 941.502,-1042.82 945.632,-1037.17"/>
<text text-anchor="middle" x="988" y="-1056.3" font-family="Times,serif" font-size="14.00">75</text>
</g>
<!-- N17 -->
<g id="node18" class="node"><title>N17</title>
<polygon fill="none" stroke="black" points="2241.25,-2059 2010.75,-2059 2010.75,-2021 2241.25,-2021 2241.25,-2059"/>
<text text-anchor="middle" x="2126" y="-2047.96" font-family="Times,serif" font-size="8.80">github.com/amitkgupta/goodlearn/csvparse.DatasetFromPath</text>
<text text-anchor="end" x="2233.5" y="-2037.96" font-family="Times,serif" font-size="8.80">1 (0.0%)</text>
<text text-anchor="end" x="2233.5" y="-2027.96" font-family="Times,serif" font-size="8.80">of 254 (6.7%)</text>
</g>
<!-- N24 -->
<g id="node25" class="node"><title>N24</title>
<polygon fill="none" stroke="black" points="2181.5,-1931.5 2070.5,-1931.5 2070.5,-1896.5 2181.5,-1896.5 2181.5,-1931.5"/>
<text text-anchor="middle" x="2126" y="-1921.1" font-family="Times,serif" font-size="8.00">encoding/csv.(*Reader).Read</text>
<text text-anchor="end" x="2174" y="-1912.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="2174" y="-1903.1" font-family="Times,serif" font-size="8.00">of 168 (4.4%)</text>
</g>
<!-- N17&#45;&gt;N24 -->
<g id="edge3" class="edge"><title>N17&#45;&gt;N24</title>
<path fill="none" stroke="black" d="M2126,-2020.97C2126,-2000.23 2126,-1965.98 2126,-1942.04"/>
<polygon fill="black" stroke="black" points="2129.5,-1941.86 2126,-1931.86 2122.5,-1941.86 2129.5,-1941.86"/>
<text text-anchor="middle" x="2136.5" y="-1970.3" font-family="Times,serif" font-size="14.00">168</text>
</g>
<!-- N36 -->
<g id="node37" class="node"><title>N36</title>
<polygon fill="none" stroke="black" points="2052,-1936 1652,-1936 1652,-1892 2052,-1892 2052,-1936"/>
<text text-anchor="middle" x="1852" y="-1923.28" font-family="Times,serif" font-size="10.90">github.com/amitkgupta/goodlearn/data/dataset.(*inMemoryDataset).AddRowFromStrings</text>
<text text-anchor="end" x="2044" y="-1911.28" font-family="Times,serif" font-size="10.90">13 (0.3%)</text>
<text text-anchor="end" x="2044" y="-1899.28" font-family="Times,serif" font-size="10.90">of 85 (2.2%)</text>
</g>
<!-- N17&#45;&gt;N36 -->
<g id="edge10" class="edge"><title>N17&#45;&gt;N36</title>
<path fill="none" stroke="black" d="M2086.16,-2020.97C2039.25,-1999.74 1961.04,-1964.35 1908.04,-1940.36"/>
<polygon fill="black" stroke="black" points="1909.33,-1937.1 1898.78,-1936.17 1906.45,-1943.48 1909.33,-1937.1"/>
<text text-anchor="middle" x="2004" y="-1970.3" font-family="Times,serif" font-size="14.00">85</text>
</g>
<!-- N18 -->
<g id="node19" class="node"><title>N18</title>
<polygon fill="none" stroke="black" points="1713.5,-2182.5 1652.5,-2182.5 1652.5,-2147.5 1713.5,-2147.5 1713.5,-2182.5"/>
<text text-anchor="middle" x="1683" y="-2172.1" font-family="Times,serif" font-size="8.00">main.main</text>
<text text-anchor="end" x="1706" y="-2163.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="1706" y="-2154.1" font-family="Times,serif" font-size="8.00">of 254 (6.7%)</text>
</g>
<!-- N18&#45;&gt;N17 -->
<g id="edge59" class="edge"><title>N18&#45;&gt;N17</title>
<path fill="none" stroke="black" d="M1713.82,-2156.34C1770.76,-2142.08 1896.19,-2110.18 2001,-2080 2020.35,-2074.43 2041.27,-2068.05 2060.36,-2062.08"/>
<polygon fill="black" stroke="black" points="2061.66,-2065.34 2070.16,-2059 2059.57,-2058.66 2061.66,-2065.34"/>
<text text-anchor="middle" x="1941.5" y="-2102.3" font-family="Times,serif" font-size="14.00">254</text>
</g>
<!-- N19&#45;&gt;N18 -->
<g id="edge1" class="edge"><title>N19&#45;&gt;N18</title>
<path fill="none" stroke="black" d="M1349.72,-2258.48C1415.36,-2240.26 1569.28,-2197.55 1642.68,-2177.19"/>
<polygon fill="black" stroke="black" points="1643.79,-2180.51 1652.49,-2174.47 1641.92,-2173.77 1643.79,-2180.51"/>
<text text-anchor="middle" x="1511.5" y="-2220.3" font-family="Times,serif" font-size="14.00">254</text>
</g>
<!-- N34 -->
<g id="node35" class="node"><title>N34</title>
<polygon fill="none" stroke="black" points="1170.25,-144 1057.75,-144 1057.75,-102 1170.25,-102 1170.25,-144"/>
<text text-anchor="middle" x="1114" y="-127.52" font-family="Times,serif" font-size="15.60">runtime.osyield</text>
<text text-anchor="end" x="1162.5" y="-110.52" font-family="Times,serif" font-size="15.60">88 (2.3%)</text>
</g>
<!-- N20&#45;&gt;N34 -->
<g id="edge33" class="edge"><title>N20&#45;&gt;N34</title>
<path fill="none" stroke="black" d="M1114,-199.316C1114,-186.371 1114,-169.17 1114,-154.475"/>
<polygon fill="black" stroke="black" points="1117.5,-154.314 1114,-144.314 1110.5,-154.314 1117.5,-154.314"/>
<text text-anchor="middle" x="1121" y="-166.3" font-family="Times,serif" font-size="14.00">88</text>
</g>
<!-- N39 -->
<g id="node40" class="node"><title>N39</title>
<polygon fill="none" stroke="black" points="1402,-142 1320,-142 1320,-104 1402,-104 1402,-142"/>
<text text-anchor="middle" x="1361" y="-130.72" font-family="Times,serif" font-size="9.10">runtime.futexsleep</text>
<text text-anchor="end" x="1394" y="-120.72" font-family="Times,serif" font-size="9.10">2 (0.1%)</text>
<text text-anchor="end" x="1394" y="-110.72" font-family="Times,serif" font-size="9.10">of 65 (1.7%)</text>
</g>
<!-- N20&#45;&gt;N39 -->
<g id="edge51" class="edge"><title>N20&#45;&gt;N39</title>
<path fill="none" stroke="black" d="M1150.16,-205.266C1189.52,-190.294 1254.28,-165.585 1310,-144 1310.1,-143.961 1310.2,-143.923 1310.3,-143.884"/>
<polygon fill="black" stroke="black" points="1311.76,-147.07 1319.82,-140.184 1309.23,-140.546 1311.76,-147.07"/>
<text text-anchor="middle" x="1269" y="-166.3" font-family="Times,serif" font-size="14.00">65</text>
</g>
<!-- N46 -->
<g id="node47" class="node"><title>N46</title>
<polygon fill="none" stroke="black" points="1301.25,-142 1188.75,-142 1188.75,-104 1301.25,-104 1301.25,-142"/>
<text text-anchor="middle" x="1245" y="-127.04" font-family="Times,serif" font-size="13.70">runtime.procyield</text>
<text text-anchor="end" x="1293.5" y="-112.04" font-family="Times,serif" font-size="13.70">49 (1.3%)</text>
</g>
<!-- N20&#45;&gt;N46 -->
<g id="edge68" class="edge"><title>N20&#45;&gt;N46</title>
<path fill="none" stroke="black" d="M1141.14,-199.316C1161.65,-184.442 1189.91,-163.951 1211.77,-148.097"/>
<polygon fill="black" stroke="black" points="1214.07,-150.756 1220.11,-142.052 1209.96,-145.089 1214.07,-150.756"/>
<text text-anchor="middle" x="1199" y="-166.3" font-family="Times,serif" font-size="14.00">49</text>
</g>
<!-- N48 -->
<g id="node49" class="node"><title>N48</title>
<polygon fill="none" stroke="black" points="1038.5,-142 951.5,-142 951.5,-104 1038.5,-104 1038.5,-142"/>
<text text-anchor="middle" x="995" y="-127.36" font-family="Times,serif" font-size="13.30">runtime.xchg</text>
<text text-anchor="end" x="1031" y="-112.36" font-family="Times,serif" font-size="13.30">43 (1.1%)</text>
</g>
<!-- N20&#45;&gt;N48 -->
<g id="edge36" class="edge"><title>N20&#45;&gt;N48</title>
<path fill="none" stroke="black" d="M1089.34,-199.316C1070.79,-184.508 1045.27,-164.132 1025.45,-148.307"/>
<polygon fill="black" stroke="black" points="1027.61,-145.556 1017.61,-142.052 1023.24,-151.026 1027.61,-145.556"/>
<text text-anchor="middle" x="1069" y="-166.3" font-family="Times,serif" font-size="14.00">14</text>
</g>
<!-- N21 -->
<g id="node22" class="node"><title>N21</title>
<polygon fill="none" stroke="black" points="942.25,-50 819.75,-50 819.75,-0 942.25,-0 942.25,-50"/>
<text text-anchor="middle" x="881" y="-30.4" font-family="Times,serif" font-size="19.50">runtime.futex</text>
<text text-anchor="end" x="934.5" y="-9.4" font-family="Times,serif" font-size="19.50">201 (5.3%)</text>
</g>
<!-- N22&#45;&gt;N20 -->
<g id="edge65" class="edge"><title>N22&#45;&gt;N20</title>
<path fill="none" stroke="black" d="M1085.31,-1003.66C1154.71,-990.048 1276,-960.478 1276,-920 1276,-920 1276,-920 1276,-783 1276,-675.43 1280,-648.57 1280,-541 1280,-541 1280,-541 1280,-314 1280,-258.796 1209.26,-236.035 1160.14,-226.884"/>
<polygon fill="black" stroke="black" points="1160.47,-223.389 1150.02,-225.131 1159.28,-230.286 1160.47,-223.389"/>
<text text-anchor="middle" x="1287" y="-610.3" font-family="Times,serif" font-size="14.00">29</text>
</g>
<!-- N22&#45;&gt;N23 -->
<g id="edge27" class="edge"><title>N22&#45;&gt;N23</title>
<path fill="none" stroke="black" d="M990.738,-995.368C987.444,-994.224 984.173,-993.092 981,-992 902.254,-964.891 808,-1003.28 808,-920 808,-920 808,-920 808,-314 808,-287.599 826.429,-264.25 844.767,-247.551"/>
<polygon fill="black" stroke="black" points="847.288,-249.999 852.567,-240.812 842.712,-244.702 847.288,-249.999"/>
<text text-anchor="middle" x="815" y="-610.3" font-family="Times,serif" font-size="14.00">22</text>
</g>
<!-- N35 -->
<g id="node36" class="node"><title>N35</title>
<polygon fill="none" stroke="black" points="943.25,-939.5 836.75,-939.5 836.75,-898.5 943.25,-898.5 943.25,-939.5"/>
<text text-anchor="middle" x="890" y="-927.5" font-family="Times,serif" font-size="10.00">MHeap_AllocLocked</text>
<text text-anchor="end" x="935.5" y="-916.5" font-family="Times,serif" font-size="10.00">6 (0.2%)</text>
<text text-anchor="end" x="935.5" y="-905.5" font-family="Times,serif" font-size="10.00">of 87 (2.3%)</text>
</g>
<!-- N22&#45;&gt;N35 -->
<g id="edge30" class="edge"><title>N22&#45;&gt;N35</title>
<path fill="none" stroke="black" d="M1008.76,-993.824C986.327,-979.879 955.103,-960.469 930.301,-945.052"/>
<polygon fill="black" stroke="black" points="931.822,-941.877 921.482,-939.57 928.127,-947.822 931.822,-941.877"/>
<text text-anchor="middle" x="980" y="-962.3" font-family="Times,serif" font-size="14.00">87</text>
</g>
<!-- N22&#45;&gt;N37 -->
<g id="edge61" class="edge"><title>N22&#45;&gt;N37</title>
<path fill="none" stroke="black" d="M1034.44,-993.824C1032,-981.351 1028.71,-964.506 1025.88,-950.056"/>
<polygon fill="black" stroke="black" points="1029.28,-949.197 1023.92,-940.055 1022.41,-950.541 1029.28,-949.197"/>
<text text-anchor="middle" x="1038" y="-962.3" font-family="Times,serif" font-size="14.00">57</text>
</g>
<!-- N27 -->
<g id="node28" class="node"><title>N27</title>
<polygon fill="none" stroke="black" points="932.25,-143.5 829.75,-143.5 829.75,-102.5 932.25,-102.5 932.25,-143.5"/>
<text text-anchor="middle" x="881" y="-131.66" font-family="Times,serif" font-size="9.80">runtime.futexwakeup</text>
<text text-anchor="end" x="924.5" y="-120.66" font-family="Times,serif" font-size="9.80">5 (0.1%)</text>
<text text-anchor="end" x="924.5" y="-109.66" font-family="Times,serif" font-size="9.80">of 137 (3.6%)</text>
</g>
<!-- N23&#45;&gt;N27 -->
<g id="edge41" class="edge"><title>N23&#45;&gt;N27</title>
<path fill="none" stroke="black" d="M881,-199.316C881,-186.196 881,-168.705 881,-153.881"/>
<polygon fill="black" stroke="black" points="884.5,-153.659 881,-143.659 877.5,-153.659 884.5,-153.659"/>
<text text-anchor="middle" x="891.5" y="-166.3" font-family="Times,serif" font-size="14.00">137</text>
</g>
<!-- N23&#45;&gt;N48 -->
<g id="edge4" class="edge"><title>N23&#45;&gt;N48</title>
<path fill="none" stroke="black" d="M904.621,-199.316C922.311,-184.574 946.624,-164.313 965.578,-148.519"/>
<polygon fill="black" stroke="black" points="967.896,-151.143 973.337,-142.052 963.415,-145.765 967.896,-151.143"/>
<text text-anchor="middle" x="956" y="-166.3" font-family="Times,serif" font-size="14.00">29</text>
</g>
<!-- N25 -->
<g id="node26" class="node"><title>N25</title>
<polygon fill="none" stroke="black" points="2211,-1817.5 2041,-1817.5 2041,-1776.5 2211,-1776.5 2211,-1817.5"/>
<text text-anchor="middle" x="2126" y="-1805.26" font-family="Times,serif" font-size="10.30">encoding/csv.(*Reader).parseRecord</text>
<text text-anchor="end" x="2203" y="-1794.26" font-family="Times,serif" font-size="10.30">8 (0.2%)</text>
<text text-anchor="end" x="2203" y="-1783.26" font-family="Times,serif" font-size="10.30">of 168 (4.4%)</text>
</g>
<!-- N24&#45;&gt;N25 -->
<g id="edge54" class="edge"><title>N24&#45;&gt;N25</title>
<path fill="none" stroke="black" d="M2126,-1896.03C2126,-1878.1 2126,-1849.46 2126,-1827.76"/>
<polygon fill="black" stroke="black" points="2129.5,-1827.74 2126,-1817.74 2122.5,-1827.74 2129.5,-1827.74"/>
<text text-anchor="middle" x="2136.5" y="-1850.3" font-family="Times,serif" font-size="14.00">168</text>
</g>
<!-- N33 -->
<g id="node34" class="node"><title>N33</title>
<polygon fill="none" stroke="black" points="2215.25,-1713.5 2036.75,-1713.5 2036.75,-1666.5 2215.25,-1666.5 2215.25,-1713.5"/>
<text text-anchor="middle" x="2126" y="-1700.38" font-family="Times,serif" font-size="11.40">encoding/csv.(*Reader).parseField</text>
<text text-anchor="end" x="2207.5" y="-1687.38" font-family="Times,serif" font-size="11.40">18 (0.5%)</text>
<text text-anchor="end" x="2207.5" y="-1674.38" font-family="Times,serif" font-size="11.40">of 89 (2.4%)</text>
</g>
<!-- N25&#45;&gt;N33 -->
<g id="edge16" class="edge"><title>N25&#45;&gt;N33</title>
<path fill="none" stroke="black" d="M2126,-1776.25C2126,-1761.49 2126,-1740.98 2126,-1723.78"/>
<polygon fill="black" stroke="black" points="2129.5,-1723.58 2126,-1713.58 2122.5,-1723.58 2129.5,-1723.58"/>
<text text-anchor="middle" x="2133" y="-1736.3" font-family="Times,serif" font-size="14.00">89</text>
</g>
<!-- N43 -->
<g id="node44" class="node"><title>N43</title>
<polygon fill="none" stroke="black" points="2018,-1709 1938,-1709 1938,-1671 2018,-1671 2018,-1709"/>
<text text-anchor="middle" x="1978" y="-1697.72" font-family="Times,serif" font-size="9.10">runtime.growslice</text>
<text text-anchor="end" x="2010" y="-1687.72" font-family="Times,serif" font-size="9.10">2 (0.1%)</text>
<text text-anchor="end" x="2010" y="-1677.72" font-family="Times,serif" font-size="9.10">of 56 (1.5%)</text>
</g>
<!-- N25&#45;&gt;N43 -->
<g id="edge19" class="edge"><title>N25&#45;&gt;N43</title>
<path fill="none" stroke="black" d="M2100.31,-1776.3C2083.36,-1763.44 2060.56,-1746.43 2040,-1732 2031.85,-1726.28 2022.97,-1720.28 2014.56,-1714.69"/>
<polygon fill="black" stroke="black" points="2016.27,-1711.63 2006,-1709.04 2012.42,-1717.47 2016.27,-1711.63"/>
<text text-anchor="middle" x="2068" y="-1736.3" font-family="Times,serif" font-size="14.00">40</text>
</g>
<!-- N50 -->
<g id="node51" class="node"><title>N50</title>
<polygon fill="none" stroke="black" points="1919.25,-1710.5 1800.75,-1710.5 1800.75,-1669.5 1919.25,-1669.5 1919.25,-1710.5"/>
<text text-anchor="middle" x="1860" y="-1698.66" font-family="Times,serif" font-size="9.80">runtime.slicebytetostring</text>
<text text-anchor="end" x="1911.5" y="-1687.66" font-family="Times,serif" font-size="9.80">5 (0.1%)</text>
<text text-anchor="end" x="1911.5" y="-1676.66" font-family="Times,serif" font-size="9.80">of 31 (0.8%)</text>
</g>
<!-- N25&#45;&gt;N50 -->
<g id="edge43" class="edge"><title>N25&#45;&gt;N50</title>
<path fill="none" stroke="black" d="M2076.59,-1776.5C2032.03,-1758.91 1966.43,-1733.01 1919.1,-1714.33"/>
<polygon fill="black" stroke="black" points="1920.18,-1710.99 1909.6,-1710.58 1917.61,-1717.5 1920.18,-1710.99"/>
<text text-anchor="middle" x="2007" y="-1736.3" font-family="Times,serif" font-size="14.00">31</text>
</g>
<!-- N29 -->
<g id="node30" class="node"><title>N29</title>
<polygon fill="none" stroke="black" points="110.25,-1945 3.75,-1945 3.75,-1883 110.25,-1883 110.25,-1945"/>
<text text-anchor="middle" x="57" y="-1928.04" font-family="Times,serif" font-size="16.20">itab</text>
<text text-anchor="end" x="102.5" y="-1910.04" font-family="Times,serif" font-size="16.20">103 (2.7%)</text>
<text text-anchor="end" x="102.5" y="-1892.04" font-family="Times,serif" font-size="16.20">of 128 (3.4%)</text>
</g>
<!-- N26&#45;&gt;N29 -->
<g id="edge14" class="edge"><title>N26&#45;&gt;N29</title>
<path fill="none" stroke="black" d="M57,-2014.8C57,-1997.95 57,-1975.08 57,-1955.48"/>
<polygon fill="black" stroke="black" points="60.5001,-1955.29 57,-1945.29 53.5001,-1955.29 60.5001,-1955.29"/>
<text text-anchor="middle" x="67.5" y="-1970.3" font-family="Times,serif" font-size="14.00">128</text>
</g>
<!-- N27&#45;&gt;N21 -->
<g id="edge55" class="edge"><title>N27&#45;&gt;N21</title>
<path fill="none" stroke="black" d="M881,-102.109C881,-90.1173 881,-74.5122 881,-60.5562"/>
<polygon fill="black" stroke="black" points="884.5,-60.2927 881,-50.2927 877.5,-60.2927 884.5,-60.2927"/>
<text text-anchor="middle" x="891.5" y="-72.3" font-family="Times,serif" font-size="14.00">132</text>
</g>
<!-- N28 -->
<g id="node29" class="node"><title>N28</title>
<polygon fill="none" stroke="black" points="777.5,-140.5 716.5,-140.5 716.5,-105.5 777.5,-105.5 777.5,-140.5"/>
<text text-anchor="middle" x="747" y="-130.1" font-family="Times,serif" font-size="8.00">System</text>
<text text-anchor="end" x="770" y="-121.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="770" y="-112.1" font-family="Times,serif" font-size="8.00">of 128 (3.4%)</text>
</g>
<!-- N28&#45;&gt;N21 -->
<g id="edge7" class="edge"><title>N28&#45;&gt;N21</title>
<path fill="none" stroke="black" d="M770.035,-105.497C789.029,-91.8895 816.463,-72.2356 839.3,-55.8748"/>
<polygon fill="black" stroke="black" points="841.39,-58.6825 847.481,-50.0134 837.314,-52.9921 841.39,-58.6825"/>
<text text-anchor="middle" x="826.5" y="-72.3" font-family="Times,serif" font-size="14.00">6</text>
</g>
<!-- N30 -->
<g id="node31" class="node"><title>N30</title>
<polygon fill="none" stroke="black" points="801.25,-48 692.75,-48 692.75,-2 801.25,-2 801.25,-48"/>
<text text-anchor="middle" x="747" y="-30.4" font-family="Times,serif" font-size="17.00">ExternalCode</text>
<text text-anchor="end" x="793.5" y="-11.4" font-family="Times,serif" font-size="17.00">122 (3.2%)</text>
</g>
<!-- N28&#45;&gt;N30 -->
<g id="edge13" class="edge"><title>N28&#45;&gt;N30</title>
<path fill="none" stroke="black" d="M747,-105.278C747,-92.4457 747,-74.3307 747,-58.6556"/>
<polygon fill="black" stroke="black" points="750.5,-58.2883 747,-48.2883 743.5,-58.2883 750.5,-58.2883"/>
<text text-anchor="middle" x="757.5" y="-72.3" font-family="Times,serif" font-size="14.00">121</text>
</g>
<!-- N54 -->
<g id="node55" class="node"><title>N54</title>
<polygon fill="none" stroke="black" points="114.25,-1814 -0.25,-1814 -0.25,-1780 114.25,-1780 114.25,-1814"/>
<text text-anchor="middle" x="57" y="-1800.32" font-family="Times,serif" font-size="12.10">runtime.atomicloadp</text>
<text text-anchor="end" x="106.5" y="-1787.32" font-family="Times,serif" font-size="12.10">25 (0.7%)</text>
</g>
<!-- N29&#45;&gt;N54 -->
<g id="edge69" class="edge"><title>N29&#45;&gt;N54</title>
<path fill="none" stroke="black" d="M57,-1882.79C57,-1864.6 57,-1841.67 57,-1824.25"/>
<polygon fill="black" stroke="black" points="60.5001,-1824.2 57,-1814.2 53.5001,-1824.2 60.5001,-1824.2"/>
<text text-anchor="middle" x="64" y="-1850.3" font-family="Times,serif" font-size="14.00">25</text>
</g>
<!-- N52 -->
<g id="node53" class="node"><title>N52</title>
<polygon fill="none" stroke="black" points="2342.25,-1610.5 2217.75,-1610.5 2217.75,-1569.5 2342.25,-1569.5 2342.25,-1610.5"/>
<text text-anchor="middle" x="2280" y="-1598.42" font-family="Times,serif" font-size="10.10">bytes.(*Buffer).WriteRune</text>
<text text-anchor="end" x="2334.5" y="-1587.42" font-family="Times,serif" font-size="10.10">7 (0.2%)</text>
<text text-anchor="end" x="2334.5" y="-1576.42" font-family="Times,serif" font-size="10.10">of 28 (0.7%)</text>
</g>
<!-- N33&#45;&gt;N52 -->
<g id="edge20" class="edge"><title>N33&#45;&gt;N52</title>
<path fill="none" stroke="black" d="M2161.72,-1666.27C2185.3,-1651.26 2216.22,-1631.59 2240.53,-1616.12"/>
<polygon fill="black" stroke="black" points="2242.6,-1618.95 2249.16,-1610.63 2238.84,-1613.04 2242.6,-1618.95"/>
<text text-anchor="middle" x="2219" y="-1636.3" font-family="Times,serif" font-size="14.00">28</text>
</g>
<!-- N53 -->
<g id="node54" class="node"><title>N53</title>
<polygon fill="none" stroke="black" points="2199.5,-1610.5 2042.5,-1610.5 2042.5,-1569.5 2199.5,-1569.5 2199.5,-1610.5"/>
<text text-anchor="middle" x="2121" y="-1598.26" font-family="Times,serif" font-size="10.30">encoding/csv.(*Reader).readRune</text>
<text text-anchor="end" x="2192" y="-1587.26" font-family="Times,serif" font-size="10.30">8 (0.2%)</text>
<text text-anchor="end" x="2192" y="-1576.26" font-family="Times,serif" font-size="10.30">of 28 (0.7%)</text>
</g>
<!-- N33&#45;&gt;N53 -->
<g id="edge23" class="edge"><title>N33&#45;&gt;N53</title>
<path fill="none" stroke="black" d="M2124.84,-1666.27C2124.15,-1652.71 2123.26,-1635.34 2122.52,-1620.71"/>
<polygon fill="black" stroke="black" points="2126.01,-1620.43 2122,-1610.63 2119.02,-1620.79 2126.01,-1620.43"/>
<text text-anchor="middle" x="2130" y="-1636.3" font-family="Times,serif" font-size="14.00">28</text>
</g>
<!-- N41 -->
<g id="node42" class="node"><title>N41</title>
<polygon fill="none" stroke="black" points="989.25,-845.5 918.75,-845.5 918.75,-810.5 989.25,-810.5 989.25,-845.5"/>
<text text-anchor="middle" x="954" y="-835.1" font-family="Times,serif" font-size="8.00">MHeap_Reclaim</text>
<text text-anchor="end" x="981.5" y="-826.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="981.5" y="-817.1" font-family="Times,serif" font-size="8.00">of 59 (1.6%)</text>
</g>
<!-- N35&#45;&gt;N41 -->
<g id="edge56" class="edge"><title>N35&#45;&gt;N41</title>
<path fill="none" stroke="black" d="M904.204,-898.248C913.597,-885.186 925.989,-867.953 936.061,-853.946"/>
<polygon fill="black" stroke="black" points="938.989,-855.87 941.986,-845.708 933.306,-851.783 938.989,-855.87"/>
<text text-anchor="middle" x="935" y="-868.3" font-family="Times,serif" font-size="14.00">59</text>
</g>
<!-- N35&#45;&gt;N51 -->
<g id="edge9" class="edge"><title>N35&#45;&gt;N51</title>
<path fill="none" stroke="black" d="M890,-898.205C890,-880.169 890,-852.795 890,-829 890,-829 890,-829 890,-314 890,-285.287 912.056,-263.744 936.593,-248.661"/>
<polygon fill="black" stroke="black" points="938.444,-251.634 945.344,-243.594 934.936,-245.576 938.444,-251.634"/>
<text text-anchor="middle" x="893.5" y="-536.3" font-family="Times,serif" font-size="14.00">8</text>
</g>
<!-- N36&#45;&gt;N43 -->
<g id="edge66" class="edge"><title>N36&#45;&gt;N43</title>
<path fill="none" stroke="black" d="M1886.22,-1891.91C1907.85,-1876.78 1934.54,-1854.44 1950,-1828 1969.77,-1794.18 1975.74,-1748.55 1977.45,-1719.45"/>
<polygon fill="black" stroke="black" points="1980.96,-1719.31 1977.92,-1709.16 1973.97,-1718.99 1980.96,-1719.31"/>
<text text-anchor="middle" x="1978" y="-1793.3" font-family="Times,serif" font-size="14.00">16</text>
</g>
<!-- N45 -->
<g id="node46" class="node"><title>N45</title>
<polygon fill="none" stroke="black" points="1941.5,-1817.5 1568.5,-1817.5 1568.5,-1776.5 1941.5,-1776.5 1941.5,-1817.5"/>
<text text-anchor="middle" x="1755" y="-1805.66" font-family="Times,serif" font-size="9.80">github.com/amitkgupta/goodlearn/data/columntype.(*floatType).PersistRawFromString</text>
<text text-anchor="end" x="1934" y="-1794.66" font-family="Times,serif" font-size="9.80">5 (0.1%)</text>
<text text-anchor="end" x="1934" y="-1783.66" font-family="Times,serif" font-size="9.80">of 50 (1.3%)</text>
</g>
<!-- N36&#45;&gt;N45 -->
<g id="edge15" class="edge"><title>N36&#45;&gt;N45</title>
<path fill="none" stroke="black" d="M1834.21,-1891.91C1818.47,-1873.25 1795.4,-1845.89 1778.21,-1825.52"/>
<polygon fill="black" stroke="black" points="1780.83,-1823.19 1771.71,-1817.81 1775.48,-1827.71 1780.83,-1823.19"/>
<text text-anchor="middle" x="1813" y="-1850.3" font-family="Times,serif" font-size="14.00">50</text>
</g>
<!-- N39&#45;&gt;N21 -->
<g id="edge67" class="edge"><title>N39&#45;&gt;N21</title>
<path fill="none" stroke="black" d="M1319.76,-105.037C1316.49,-103.932 1313.2,-102.902 1310,-102 1186.69,-67.2709 1038.77,-45.2296 952.775,-34.2886"/>
<polygon fill="black" stroke="black" points="952.959,-30.7843 942.6,-33.0093 952.086,-37.7296 952.959,-30.7843"/>
<text text-anchor="middle" x="1237" y="-72.3" font-family="Times,serif" font-size="14.00">63</text>
</g>
<!-- N40 -->
<g id="node41" class="node"><title>N40</title>
<polygon fill="none" stroke="black" points="1012,-758 918,-758 918,-714 1012,-714 1012,-758"/>
<text text-anchor="middle" x="965" y="-745.36" font-family="Times,serif" font-size="10.80">runtime.sweepone</text>
<text text-anchor="end" x="1004" y="-733.36" font-family="Times,serif" font-size="10.80">12 (0.3%)</text>
<text text-anchor="end" x="1004" y="-721.36" font-family="Times,serif" font-size="10.80">of 61 (1.6%)</text>
</g>
<!-- N40&#45;&gt;N10 -->
<g id="edge57" class="edge"><title>N40&#45;&gt;N10</title>
<path fill="none" stroke="black" d="M991.295,-713.823C1007.15,-701.052 1028.12,-684.169 1048.22,-667.977"/>
<polygon fill="black" stroke="black" points="1050.57,-670.575 1056.17,-661.577 1046.18,-665.124 1050.57,-670.575"/>
<text text-anchor="middle" x="1038" y="-684.3" font-family="Times,serif" font-size="14.00">38</text>
</g>
<!-- N41&#45;&gt;N40 -->
<g id="edge6" class="edge"><title>N41&#45;&gt;N40</title>
<path fill="none" stroke="black" d="M956.018,-810.493C957.451,-798.765 959.42,-782.652 961.15,-768.502"/>
<polygon fill="black" stroke="black" points="964.674,-768.519 962.413,-758.169 957.725,-767.67 964.674,-768.519"/>
<text text-anchor="middle" x="968" y="-780.3" font-family="Times,serif" font-size="14.00">53</text>
</g>
<!-- N42 -->
<g id="node43" class="node"><title>N42</title>
<polygon fill="none" stroke="black" points="1226.5,-2424.5 1169.5,-2424.5 1169.5,-2389.5 1226.5,-2389.5 1226.5,-2424.5"/>
<text text-anchor="middle" x="1198" y="-2414.1" font-family="Times,serif" font-size="8.00">GC</text>
<text text-anchor="end" x="1219" y="-2405.1" font-family="Times,serif" font-size="8.00">0 (0.0%)</text>
<text text-anchor="end" x="1219" y="-2396.1" font-family="Times,serif" font-size="8.00">of 58 (1.5%)</text>
</g>
<!-- N44 -->
<g id="node45" class="node"><title>N44</title>
<polygon fill="none" stroke="black" points="2008.5,-1609 1947.5,-1609 1947.5,-1571 2008.5,-1571 2008.5,-1609"/>
<text text-anchor="middle" x="1978" y="-1597.48" font-family="Times,serif" font-size="9.40">growslice1</text>
<text text-anchor="end" x="2001" y="-1587.48" font-family="Times,serif" font-size="9.40">3 (0.1%)</text>
<text text-anchor="end" x="2001" y="-1577.48" font-family="Times,serif" font-size="9.40">of 54 (1.4%)</text>
</g>
<!-- N43&#45;&gt;N44 -->
<g id="edge47" class="edge"><title>N43&#45;&gt;N44</title>
<path fill="none" stroke="black" d="M1978,-1670.57C1978,-1656.1 1978,-1635.72 1978,-1619.21"/>
<polygon fill="black" stroke="black" points="1981.5,-1619.02 1978,-1609.02 1974.5,-1619.02 1981.5,-1619.02"/>
<text text-anchor="middle" x="1985" y="-1636.3" font-family="Times,serif" font-size="14.00">54</text>
</g>
<!-- N44&#45;&gt;N6 -->
<g id="edge39" class="edge"><title>N44&#45;&gt;N6</title>
<path fill="none" stroke="black" d="M1947.45,-1575.81C1938.41,-1572.26 1928.41,-1568.67 1919,-1566 1838.15,-1543.08 1816.18,-1543.95 1733,-1532 1557.18,-1506.74 1351.94,-1487.12 1227.55,-1476.31"/>
<polygon fill="black" stroke="black" points="1227.52,-1472.79 1217.25,-1475.42 1226.91,-1479.77 1227.52,-1472.79"/>
<text text-anchor="middle" x="1849" y="-1536.3" font-family="Times,serif" font-size="14.00">33</text>
</g>
<!-- N55 -->
<g id="node56" class="node"><title>N55</title>
<polygon fill="none" stroke="black" points="2030.25,-1483 1925.75,-1483 1925.75,-1449 2030.25,-1449 2030.25,-1483"/>
<text text-anchor="middle" x="1978" y="-1469.56" font-family="Times,serif" font-size="11.80">runtime.memmove</text>
<text text-anchor="end" x="2022.5" y="-1456.56" font-family="Times,serif" font-size="11.80">22 (0.6%)</text>
</g>
<!-- N44&#45;&gt;N55 -->
<g id="edge18" class="edge"><title>N44&#45;&gt;N55</title>
<path fill="none" stroke="black" d="M1978,-1571C1978,-1550.51 1978,-1516.87 1978,-1493.41"/>
<polygon fill="black" stroke="black" points="1981.5,-1493.13 1978,-1483.13 1974.5,-1493.13 1981.5,-1493.13"/>
<text text-anchor="middle" x="1985" y="-1536.3" font-family="Times,serif" font-size="14.00">15</text>
</g>
<!-- N47 -->
<g id="node48" class="node"><title>N47</title>
<polygon fill="none" stroke="black" points="1782.25,-1710.5 1691.75,-1710.5 1691.75,-1669.5 1782.25,-1669.5 1782.25,-1710.5"/>
<text text-anchor="middle" x="1737" y="-1698.5" font-family="Times,serif" font-size="10.00">strconv.ParseFloat</text>
<text text-anchor="end" x="1774.5" y="-1687.5" font-family="Times,serif" font-size="10.00">6 (0.2%)</text>
<text text-anchor="end" x="1774.5" y="-1676.5" font-family="Times,serif" font-size="10.00">of 45 (1.2%)</text>
</g>
<!-- N45&#45;&gt;N47 -->
<g id="edge60" class="edge"><title>N45&#45;&gt;N47</title>
<path fill="none" stroke="black" d="M1751.61,-1776.25C1748.92,-1760.56 1745.12,-1738.37 1742.07,-1720.56"/>
<polygon fill="black" stroke="black" points="1745.51,-1719.93 1740.37,-1710.66 1738.61,-1721.11 1745.51,-1719.93"/>
<text text-anchor="middle" x="1753" y="-1736.3" font-family="Times,serif" font-size="14.00">45</text>
</g>
<!-- N49 -->
<g id="node50" class="node"><title>N49</title>
<polygon fill="none" stroke="black" points="1778.5,-1613.5 1695.5,-1613.5 1695.5,-1566.5 1778.5,-1566.5 1778.5,-1613.5"/>
<text text-anchor="middle" x="1737" y="-1599.98" font-family="Times,serif" font-size="11.90">strconv.atof64</text>
<text text-anchor="end" x="1771" y="-1586.98" font-family="Times,serif" font-size="11.90">23 (0.6%)</text>
<text text-anchor="end" x="1771" y="-1573.98" font-family="Times,serif" font-size="11.90">of 39 (1.0%)</text>
</g>
<!-- N47&#45;&gt;N49 -->
<g id="edge70" class="edge"><title>N47&#45;&gt;N49</title>
<path fill="none" stroke="black" d="M1737,-1669.17C1737,-1656.21 1737,-1638.96 1737,-1623.97"/>
<polygon fill="black" stroke="black" points="1740.5,-1623.54 1737,-1613.54 1733.5,-1623.54 1740.5,-1623.54"/>
<text text-anchor="middle" x="1744" y="-1636.3" font-family="Times,serif" font-size="14.00">39</text>
</g>
<!-- N50&#45;&gt;N55 -->
<g id="edge64" class="edge"><title>N50&#45;&gt;N55</title>
<path fill="none" stroke="black" d="M1865.41,-1669.43C1874.39,-1638.73 1894.18,-1578.02 1922,-1532 1930.95,-1517.19 1943.31,-1502.43 1954.15,-1490.73"/>
<polygon fill="black" stroke="black" points="1956.99,-1492.82 1961.34,-1483.16 1951.91,-1488 1956.99,-1492.82"/>
<text text-anchor="middle" x="1905.5" y="-1586.3" font-family="Times,serif" font-size="14.00">5</text>
</g>
<!-- N57 -->
<g id="node58" class="node"><title>N57</title>
<polygon fill="none" stroke="black" points="1871.25,-1610.5 1802.75,-1610.5 1802.75,-1569.5 1871.25,-1569.5 1871.25,-1610.5"/>
<text text-anchor="middle" x="1837" y="-1598.26" font-family="Times,serif" font-size="10.30">gostringsize</text>
<text text-anchor="end" x="1863.5" y="-1587.26" font-family="Times,serif" font-size="10.30">8 (0.2%)</text>
<text text-anchor="end" x="1863.5" y="-1576.26" font-family="Times,serif" font-size="10.30">of 21 (0.6%)</text>
</g>
<!-- N50&#45;&gt;N57 -->
<g id="edge71" class="edge"><title>N50&#45;&gt;N57</title>
<path fill="none" stroke="black" d="M1855.35,-1669.17C1852.07,-1655.22 1847.64,-1636.32 1843.95,-1620.59"/>
<polygon fill="black" stroke="black" points="1847.34,-1619.74 1841.65,-1610.8 1840.52,-1621.34 1847.34,-1619.74"/>
<text text-anchor="middle" x="1856" y="-1636.3" font-family="Times,serif" font-size="14.00">21</text>
</g>
<!-- N56 -->
<g id="node57" class="node"><title>N56</title>
<polygon fill="none" stroke="black" points="2347,-1488 2213,-1488 2213,-1444 2347,-1444 2347,-1488"/>
<text text-anchor="middle" x="2280" y="-1475.2" font-family="Times,serif" font-size="11.00">bytes.(*Buffer).WriteByte</text>
<text text-anchor="end" x="2339" y="-1463.2" font-family="Times,serif" font-size="11.00">14 (0.4%)</text>
<text text-anchor="end" x="2339" y="-1451.2" font-family="Times,serif" font-size="11.00">of 21 (0.6%)</text>
</g>
<!-- N52&#45;&gt;N56 -->
<g id="edge2" class="edge"><title>N52&#45;&gt;N56</title>
<path fill="none" stroke="black" d="M2280,-1569.4C2280,-1550.21 2280,-1520.67 2280,-1498.24"/>
<polygon fill="black" stroke="black" points="2283.5,-1498.19 2280,-1488.19 2276.5,-1498.19 2283.5,-1498.19"/>
<text text-anchor="middle" x="2287" y="-1536.3" font-family="Times,serif" font-size="14.00">21</text>
</g>
<!-- N58 -->
<g id="node59" class="node"><title>N58</title>
<polygon fill="none" stroke="black" points="2192.25,-1489.5 2049.75,-1489.5 2049.75,-1442.5 2192.25,-1442.5 2192.25,-1489.5"/>
<text text-anchor="middle" x="2121" y="-1476.38" font-family="Times,serif" font-size="11.40">bufio.(*Reader).ReadRune</text>
<text text-anchor="end" x="2184.5" y="-1463.38" font-family="Times,serif" font-size="11.40">17 (0.4%)</text>
<text text-anchor="end" x="2184.5" y="-1450.38" font-family="Times,serif" font-size="11.40">of 20 (0.5%)</text>
</g>
<!-- N53&#45;&gt;N58 -->
<g id="edge34" class="edge"><title>N53&#45;&gt;N58</title>
<path fill="none" stroke="black" d="M2121,-1569.4C2121,-1550.68 2121,-1522.1 2121,-1499.89"/>
<polygon fill="black" stroke="black" points="2124.5,-1499.88 2121,-1489.88 2117.5,-1499.88 2124.5,-1499.88"/>
<text text-anchor="middle" x="2128" y="-1536.3" font-family="Times,serif" font-size="14.00">20</text>
</g>
<!-- N57&#45;&gt;N6 -->
<g id="edge48" class="edge"><title>N57&#45;&gt;N6</title>
<path fill="none" stroke="black" d="M1802.52,-1571.61C1797.41,-1569.48 1792.13,-1567.52 1787,-1566 1595.23,-1509.07 1362.6,-1484.13 1227.13,-1473.78"/>
<polygon fill="black" stroke="black" points="1227.38,-1470.29 1217.15,-1473.03 1226.86,-1477.27 1227.38,-1470.29"/>
<text text-anchor="middle" x="1722" y="-1536.3" font-family="Times,serif" font-size="14.00">13</text>
</g>
</g>
</g></svg>
package main
import (
"fmt"
"github.com/amitkgupta/goodlearn/classifier/knn"
"github.com/amitkgupta/goodlearn/csvparse"
"github.com/amitkgupta/goodlearn/data/row"
"runtime"
"flag"
"log"
"os"
"runtime/pprof"
)
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
runtime.GOMAXPROCS(runtime.NumCPU())
println("parsing test")
validationSample, _ := csvparse.DatasetFromPath("many_features_test.csv", 0, 1)
println("parsed test")
println("parsing training")
trainingSample, _ := csvparse.DatasetFromPath("many_features_training.csv", 0, 1)
println("parsed training")
c, _ := knn.NewKNNClassifier(1)
c.Train(trainingSample)
var totalCorrect float32 = 0
successChannel := make(chan float32, 10000) //len(validationSample))
for i := 0; i < 10000; i++ {
test, _ := validationSample.Row(i)
go func(t row.Row, j int) {
if j%5 == 0 {
println("classifying", j)
}
cl, _ := c.Classify(test)
if cl.Equals(test.Target()) {
successChannel <- 1
} else {
successChannel <- 0
}
if j%5 == 0 {
println("classified", j)
}
}(test, i)
}
for i := 0; i < 10000; i++ { //len(validationSample); i++ {
totalCorrect += <-successChannel
}
fmt.Println(float32(totalCorrect)) // / float32(len(validationSample)))
}
// Takes about 50s on the beefy machine, *with* goodlearn optimized
// - replace math.Pow(x,2) with x*x in distance.go
// - SliceFromStrings was super slow, but assuming contiguous features and all of them are floats, much faster
// Outputs unreasonable answer: 10000
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
package main
import (
"bytes"
"flag"
"fmt"
"io/ioutil"
"log"
"math"
"os"
"runtime"
"runtime/pprof"
"strconv"
)
type LabelWithFeatures struct {
Label []byte
Features []float64
}
func NewLabelWithFeatures(parsedLine [][]byte) LabelWithFeatures {
label := parsedLine[0]
features := make([]float64, len(parsedLine)-1)
for i, feature := range parsedLine {
// skip label
if i == 0 {
continue
}
features[i-1] = byteSliceTofloat64(feature)
}
return LabelWithFeatures{label, features}
}
var newline = []byte("\n")
var comma = []byte(",")
func byteSliceTofloat64(b []byte) float64 {
x, _ := strconv.ParseFloat(string(b), 32)
return float64(x)
}
func parseCSVFile(filePath string) []LabelWithFeatures {
fileContent, _ := ioutil.ReadFile(filePath)
lines := bytes.Split(fileContent, newline)
numRows := len(lines)
labelsWithFeatures := make([]LabelWithFeatures, numRows-2)
for i, line := range lines {
// skip headers
if i == 0 || i == numRows-1 {
continue
}
labelsWithFeatures[i-1] = NewLabelWithFeatures(bytes.Split(line, comma))
}
return labelsWithFeatures
}
func squareDistanceWithBailout(features1, features2 []float64, bailout float64) (d float64) {
for i := 0; i < len(features1); i++ {
x := features1[i] - features2[i]
d += x * x
if d > bailout {
break
}
}
return
}
var trainingSample = parseCSVFile("many_features_training.csv")
func classify(features []float64) (label []byte) {
label = trainingSample[0].Label
d := squareDistanceWithBailout(features, trainingSample[0].Features, math.MaxFloat32)
for _, row := range trainingSample {
dNew := squareDistanceWithBailout(features, row.Features, d)
if dNew < d {
label = row.Label
d = dNew
}
}
return
}
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
runtime.GOMAXPROCS(runtime.NumCPU())
println("parsing test")
validationSample := parseCSVFile("many_features_test.csv")
println("parsed test")
var totalCorrect float64 = 0
successChannel := make(chan float64, 10000) //len(validationSample))
for i := 0; i < 10000; i++ {
test := validationSample[i]
go func(t LabelWithFeatures, j int) {
if j%5 == 0 {
println("classifying", j)
}
if string(t.Label) == string(classify(t.Features)) {
successChannel <- 1
} else {
successChannel <- 0
}
if j%5 == 0 {
println("classified", j)
}
}(test, i)
}
for i := 0; i < 10000; i++ { //len(validationSample); i++ {
totalCorrect += <-successChannel
}
fmt.Println(float64(totalCorrect)) // / float64(len(validationSample)))
}
// Runs in about 10s on the beefy machine
// Has some reasonable number of correct, like 98k
import numpy
from sklearn.neighbors import KNeighborsClassifier
f = open("many_features_test.csv")
f.readline() # ignore headers
test = numpy.loadtxt(f, delimiter=',')
ff = open("many_features_training.csv")
ff.readline() # ignore headers
training = numpy.loadtxt(ff, delimiter=',')
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(training[:, [1,128]], numpy.ravel(training[:, [0]]))
numpy.sum(knn.predict(test[:, [1,128]]) == numpy.ravel(test[:, [0]]))
# Lightning fast, but...
# Something shitty, like 534 (out of ~43000)
knn = KNeighborsClassifier(n_neighbors=1, algorithm='brute')
knn.fit(training[:, [1,128]], numpy.ravel(training[:, [0]]))
numpy.sum(knn.predict(test[:, [1,128]]) == numpy.ravel(test[:, [0]]))
# Takes a while, and then...
# Something shittier, like MemoryError
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment