diff --git a/permute_testbed.js b/permute_testbed.js index 630c475..09c109c 100644 --- a/permute_testbed.js +++ b/permute_testbed.js @@ -281,6 +281,85 @@ function make_120cell_vertices() { } + +// face detection for the 120-cell + +// NOTE: all of these return node ids, not nodes + +// return all the links which connect to a node + +function nodes_links(links, nodeid) { + return links.filter((l) => l.source === nodeid || l.target === nodeid); +} + +// filter to remove a link to a given id from a set of links + +function not_to_this(link, nodeid) { + return !(link.source === nodeid || link.target === nodeid); +} + +// given nodes n1, n2, return all neighbours of n2 which are not n1 + +function unmutuals(links, n1id, n2id) { + const nlinks = nodes_links(links, n2id).filter((l) => not_to_this(l, n1id)); + return nlinks.map((l) => { + if( l.source === n2id ) { + return l.target; + } else { + return l.source; + } + }) +} + + +function fingerprint(ids) { + const sids = [...ids]; + sids.sort(); + return sids.join(','); +} + + + +function auto_120cell_faces(links) { + const faces = []; + const seen = {}; + let id = 1; + for( const edge of links ) { + const v1 = edge.source; + const v2 = edge.target; + const n1 = unmutuals(links, v2, v1); + const n2 = unmutuals(links, v1, v2); + const shared = []; + for( const a of n1 ) { + const an = unmutuals(links, v1, a); + for( const d of n2 ) { + const dn = unmutuals(links, v2, d); + for( const x of an ) { + for( const y of dn ) { + if( x == y ) { + shared.push([v1, a, x, d, v2]) + } + } + } + } + } + if( shared.length !== 3 ) { + console.log(`Bad shared faces for ${edge.id} ${v1} ${v2}`); + } + for( const face of shared ) { + const fp = fingerprint(face); + if( !seen[fp] ) { + faces.push({ id: id, nodes: face }); + id++; + seen[fp] = true; + } + } + } + return faces; +} + + + const cell120 = () => { const nodes = make_120cell_vertices(); const links = auto_detect_edges(nodes, 4); @@ -362,6 +441,8 @@ const cell600 = () => { } +// bad stuff + function find_chords(chords, n) { return chords.filter((c) => c[0].id === n.id || c[1].id === n.id); } @@ -661,8 +742,49 @@ function iterate_graph(nodes, links, n, fn) { } -const nodes = make_120cell_vertices(); + +// stupid tetrahedral labelling +// keeps getting stuck + + +function naive_label_120cell(nodes, links, n) { + const nodes_id = {}; + nodes.map((n) => nodes_id[n.id] = n); + iterate_graph(nodes, links, nodes[0], (n) => { + const cols = new Set(); + const nbors = find_adjacent(links, n.id); + for( const nb of nbors ) { + if( nodes_id[nb].label > 0 ) { + cols.add(nodes_id[nb].label); + } + for( const nb2 of find_adjacent(links, nb) ) { + if( nb2 !== n.id && nodes_id[nb].label > 0 ) { + cols.add(nodes_id[nb2].label); + } + } + } + const pcols = [ 1, 2, 3, 4, 5 ].filter((c) => !cols.has(c)); + if( pcols.length < 1 ) { + console.log(`Got stuck, no options at ${n.id}`); + return false; + } else { + n.label = pcols[0]; + console.log(`found ${pcols.length} colors for node ${n.id}`); + console.log(`applied ${pcols[0]} to node ${n.id}`); + return true; + } + }); +} + + + + + + + + +const nodes = make_120cell_vertices(); const links = auto_detect_edges(nodes, 4); diff --git a/polytopes.js b/polytopes.js index 2f63dee..3454590 100644 --- a/polytopes.js +++ b/polytopes.js @@ -360,6 +360,7 @@ function naive_label_120cell(nodes, links, n) { return false; } else { n.label = pcols[0]; + console.log(`found ${pcols.length} colors for node ${n.id}`); console.log(`applied ${pcols[0]} to node ${n.id}`); return true; } @@ -384,7 +385,6 @@ export const cell120 = () => { node_size: 0.02, link_size: 0.02 }, - faces: faces } }