|
|
|
|
|
function enhanceSVGContent(originalContent) { |
|
const parser = new DOMParser(); |
|
const doc = parser.parseFromString(originalContent, 'image/svg+xml'); |
|
|
|
|
|
const styleElement = doc.createElementNS('http://www.w3.org/2000/svg', 'style'); |
|
styleElement.textContent = ` |
|
path[data-element-type="layer"] { |
|
transition: all 0.3s; |
|
cursor: pointer; |
|
} |
|
path[data-element-type="layer"]:hover { |
|
fill: #b197fc !important; |
|
transform: translate(0, -2px); |
|
} |
|
|
|
path[data-element-type="layer-updated"] { |
|
transition: all 0.3s; |
|
cursor: pointer; |
|
} |
|
|
|
path[data-element-type="layer-updated"]:hover { |
|
fill:rgb(103, 56, 244) !important; |
|
transform: scale(1.02); |
|
transform: translate(0, -2px); |
|
} |
|
|
|
path[data-element-type="gradient"] { |
|
transition: all 0.3s; |
|
cursor: pointer; |
|
} |
|
path[data-element-type="gradient"]:hover { |
|
fill: #f06595 !important; |
|
transform: translate(0, -2px); |
|
} |
|
|
|
path[data-element-type="forward"] { |
|
transition: all 0.3s; |
|
cursor: pointer; |
|
} |
|
path[data-element-type="forward"]:hover { |
|
stroke: #0c8599 !important; |
|
stroke-width: 4 !important; |
|
} |
|
|
|
path[data-element-type="backward"] { |
|
transition: all 0.3s; |
|
cursor: pointer; |
|
} |
|
path[data-element-type="backward"]:hover { |
|
stroke: #e8590c !important; |
|
stroke-width: 4 !important; |
|
} |
|
|
|
path[data-element-type="optimization"] { |
|
transition: all 0.3s; |
|
cursor: pointer; |
|
} |
|
path[data-element-type="optimization"]:hover { |
|
stroke: #087f5b !important; |
|
stroke-width: 4 !important; |
|
} |
|
`; |
|
doc.documentElement.insertBefore(styleElement, doc.documentElement.firstChild); |
|
|
|
|
|
doc.querySelectorAll('path[fill="#d0bfff"]').forEach((node, index) => { |
|
node.setAttribute('data-element-id', `layer-${index}`); |
|
node.setAttribute('data-element-type', 'layer'); |
|
}); |
|
|
|
doc.querySelectorAll('path[fill="#9775fa"]').forEach((node, index) => { |
|
node.setAttribute('data-element-id', `layer-updated-${index}`); |
|
node.setAttribute('data-element-type', 'layer-updated'); |
|
}); |
|
|
|
|
|
doc.querySelectorAll('path[fill="#f783ac"]').forEach((node, index) => { |
|
node.setAttribute('data-element-id', `gradient-${index}`); |
|
node.setAttribute('data-element-type', 'gradient'); |
|
}); |
|
|
|
|
|
const arrowTypes = { |
|
'#15aabf': 'forward', |
|
'#fd7e14': 'backward', |
|
'#099268': 'optimization' |
|
}; |
|
|
|
Object.entries(arrowTypes).forEach(([color, type]) => { |
|
doc.querySelectorAll(`path[stroke="${color}"]`).forEach((arrow, index) => { |
|
arrow.setAttribute('data-element-id', `${type}-${index}`); |
|
arrow.setAttribute('data-element-type', type); |
|
}); |
|
}); |
|
|
|
|
|
doc.documentElement.setAttribute('width', '100%'); |
|
doc.documentElement.setAttribute('height', '100%'); |
|
doc.documentElement.setAttribute('preserveAspectRatio', 'xMidYMid meet'); |
|
|
|
return new XMLSerializer().serializeToString(doc); |
|
} |
|
|
|
|
|
async function loadSVG(url, containerId) { |
|
try { |
|
const response = await fetch(url); |
|
if (!response.ok) { |
|
throw new Error(`HTTP error! Status: ${response.status}`); |
|
} |
|
const svgText = await response.text(); |
|
const enhancedSVG = enhanceSVGContent(svgText); |
|
document.getElementById(containerId).innerHTML = enhancedSVG; |
|
} catch (error) { |
|
console.error('Error loading SVG:', error); |
|
document.getElementById(containerId).innerHTML = '<p>Error loading SVG.</p>'; |
|
} |
|
} |
|
|
|
|
|
loadSVG('../assets/images/activation_recomputation.svg', 'svg-activation_recomputation'); |
|
|
|
|
|
const svgContainer3 = document.getElementById('svg-activation_recomputation'); |
|
|
|
svgContainer3.addEventListener('mouseover', function (event) { |
|
const target = event.target; |
|
if (target.tagName.toLowerCase() === 'path' && target.hasAttribute('data-element-id')) { |
|
const elementId = target.getAttribute('data-element-id'); |
|
const elementType = target.getAttribute('data-element-type'); |
|
const descriptions = { |
|
layer: 'Neural Network Layer', |
|
'layer-updated': 'Neural Network Layer (updated)', |
|
gradient: 'Gradient Update Layer', |
|
forward: 'Forward Pass Connection', |
|
backward: 'Backward Pass Connection', |
|
optimization: 'Optimization Step' |
|
}; |
|
const description = descriptions[elementType] || elementType; |
|
document.getElementById('svg-activation_recomputation-info').textContent = `Hovering over: ${description} (${elementId})`; |
|
} |
|
}); |
|
|
|
svgContainer3.addEventListener('mouseout', function () { |
|
document.getElementById('svg-activation_recomputation-info').textContent = 'Hover over the network elements to see their details'; |
|
}); |
|
|