For metrics and citations, see Sandeep's Google Scholar profile.
Search publications
All
{%- for t in site.data.themes %}
{{ t.name }}
{%- endfor %}
Earlier & other
{% bibliography %}
No publications match. Clear filters
<script>
/* Progressive enhancement: without JS the filters stay hidden and every paper is listed. */
(function () {
var root = document.getElementById('publications');
var bar = root.querySelector('[data-pubs-filters]');
var pubs = [].slice.call(root.querySelectorAll('.pub'));
if (!bar || !pubs.length) return;
var input = bar.querySelector('.pubs-search');
var chips = [].slice.call(bar.querySelectorAll('.chip'));
var count = bar.querySelector('.pubs-count');
var empty = root.querySelector('.pubs-empty');
var groups = [].slice.call(root.querySelectorAll('h2.bibliography')).map(function (h) {
return { head: h, list: h.nextElementSibling, label: h.textContent.trim() };
});
var theme = '', query = '';
bar.hidden = false;
function apply() {
var terms = query.toLowerCase().split(/\s+/).filter(Boolean), shown = 0;
pubs.forEach(function (p) {
var themes = ' ' + (p.dataset.themes || '') + ' ';
var text = p.dataset.search || '';
var ok = (!theme || themes.indexOf(' ' + theme + ' ') > -1) &&
terms.every(function (t) { return text.indexOf(t) > -1; });
p.closest('li').hidden = !ok;
if (ok) shown++;
});
groups.forEach(function (g) {
var n = g.list ? g.list.querySelectorAll('li:not([hidden])').length : 0;
g.head.hidden = g.list.hidden = !n;
g.head.textContent = g.label + ' (' + n + ')';
});
count.textContent = (theme || terms.length ? shown + ' of ' + pubs.length : pubs.length) + ' publications';
empty.hidden = shown > 0;
chips.forEach(function (c) { c.setAttribute('aria-pressed', String(c.dataset.theme === theme)); });
var q = new URLSearchParams();
if (theme) q.set('theme', theme);
if (query) q.set('q', query);
history.replaceState(null, '', location.pathname + (q.toString() ? '?' + q : '') + location.hash);
}
input.addEventListener('input', function () { query = input.value.trim(); apply(); });
chips.forEach(function (c) { c.addEventListener('click', function () { theme = c.dataset.theme; apply(); }); });
empty.querySelector('.pubs-reset').addEventListener('click', function () { theme = query = input.value = ''; apply(); });
var params = new URLSearchParams(location.search);
theme = params.get('theme') || '';
query = input.value = params.get('q') || '';
apply();
})();
</script>