') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); WIP: Optimise quaternion computations by jni · Pull Request #114 · MechMicroMan/DefDAP · GitHub
Skip to content

WIP: Optimise quaternion computations - #114

Draft
jni wants to merge 2 commits into
MechMicroMan:developfrom
jni:optimise-quats
Draft

WIP: Optimise quaternion computations#114
jni wants to merge 2 commits into
MechMicroMan:developfrom
jni:optimise-quats

Conversation

@jni

@jnijni commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Thanks @mikesmic for your guidance re quaternion product — that helped me understand the code in calc_sym_eqvs which is currently the slowest part of reading in a file. I've vectorised most of the operations and... See identical performance! 😅 So more work is needed. The other thing is that extract_quat_comps takes up ~50% of the runtime and that should be ~0 if the internal data structure was a NumPy array to begin with. The other target of optimisation is that operations like np.cross are more efficient when the coefficients are in certain axes... So I'll play with that too.

@rhysgt

Copy link
Copy Markdown
Contributor

There might be some more inspiration for improvements from these packages
https://github.com/moble/quaternion

I particularly like this, which adds a quaternion dtype to numpy
https://github.com/moble/quaternionic

@rhysgt

Copy link
Copy Markdown
Contributor

We're hoping to make a new release in the not too distant future! Would be nice to include any optimisation to runtime for quaternion operations.

I think the slow speeds we see are a consequence of using a list of quat objects for some operations, which is then slow to convert back to a numpy array for efficient vectorised calculations, as you mention.

@jni

jni commented Apr 26, 2024

Copy link
Copy Markdown
ContributorAuthor

Ah cool to hear @rhysgt! I will try to pick this up again (or happy to set up a time where we can pair up on it, as I am still a bit lost about the roles of all the data structures in DefDAP).

btw would you and/or @mikesmic mind checking the Zulip chat re reading Jie's data with overlapping bins? (The data is linked in the zip and I can't read it correctly with DefDAP — I get nan's for the strain maps.) (Maybe I should just open an issue 😅 but right now it's bedtime and I wanted to make sure it's on your radar before release. 😊)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jni@rhysgt