Skip to content

Commit

Permalink
LT is working again. Almost.
Browse files Browse the repository at this point in the history
  • Loading branch information
julianjensen committed Dec 13, 2017
1 parent 8061d90 commit 61968ce
Show file tree
Hide file tree
Showing 7 changed files with 279 additions and 120 deletions.
Empty file added data/medium.txt
Empty file.
2 changes: 1 addition & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
const { frontiers_from_preds, frontiers_from_succs, reverse_flow } = require( './src/frontiers' );

module.exports = {
yalt: require( './src/yalt' ),
lt: require( './src/lt' ),
iterative: require( './src/fast-iterative' ),
frontiers_from_preds,
frontiers_from_succs,
Expand Down
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,16 @@
},
"homepage": "https://github.com/julianjensen/dominators#readme",
"devDependencies": {
"eslint": "^4.4.0",
"istanbul": "^0.4.5",
"mocha": "^3.5.0",
"chai": "^4.1.1",
"coveralls": "^2.13.1",
"rimraf": "^2.4.2",
"dependency-check": "^2.5.1",
"doctoc": "^0.15.0",
"mocha-lcov-reporter": "^1.3.0"
"eslint": "^4.4.0",
"get-stdin": "^5.0.1",
"istanbul": "^0.4.5",
"mocha": "^3.5.0",
"mocha-lcov-reporter": "^1.3.0",
"rimraf": "^2.4.2"
},
"dependencies": {
"traversals": "^1.0.8"
Expand Down
72 changes: 72 additions & 0 deletions reader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/** ****************************************************************************************************
* File: reader (dominators)
* @author julian on 12/13/17
* @version 1.0.0
* @copyright Planet3, Inc.
*******************************************************************************************************/
'use strict';

const
promisify = require( 'util' ).promisify,
fs = require( 'fs' ),
readFile = promisify( fs.readFile ),
getStdin = require( 'get-stdin' );

let _read,
result = {
graph: []
};

if ( process.argv[ 2 ] )
{
_read = readFile( process.argv[ 2 ], 'utf8' );
}
else
{
_read = getStdin();
}

_read.then( src => {
const lines = src.split( /[\r\n]+/ ).map( s => s.trim() ).filter( l => !!l );

let mode = 'graph',
index = 0;

for ( const line of lines )
{
let m = line.match( /^\s*(\w+)\s*:\s*$/ );

if ( m )
{
mode = m[ 1 ].toLowerCase();
result[ mode ] = [];
index = 0;
}
else
{
if ( index === 11 )
debugger;
m = line.match( /^(\d+)(?:([^-\d]+)(.*))?/ );

if ( m[ 1 ] && m[ 2 ] && !m[ 3 ] )
result[ mode ][ index = Number( m[ 1 ] ) - 1 ] = [];
else if ( m[ 1 ] && m[ 2 ] && m[ 3 ].trim() === '-' )
result[ mode ][ index = Number( m[ 1 ] ) - 1 ] = null;
else if ( m[ 1 ] && !m[ 2 ] && !m[ 3 ] )
result[ mode ][ index++ ] = Number( m[ 1 ] ) - 1;
else
{
const vals = m[ 3 ].split( /[\s,:]+/ ).map( s => s.trim() ).filter( s => !!s ).map( v => v === '-' ? null : Number( v ) - 1 );

result[ mode ][ index = Number( m[ 1 ] ) - 1 ] = vals.length === 1 ? vals[ 0 ] : vals;
}
}
}

Object.entries( result ).forEach( ( [ key, value ] ) => {
if ( !value.length ) delete result[ key ];
} );

console.log( JSON.stringify( result, null, 4 ) );
} );

215 changes: 147 additions & 68 deletions src/lt.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,102 @@
const
{ DFS } = require( 'traversals' );

function lt( nodes )
/**
*
* @param {Array<Array<number>>} nodes
* @param {number} [startIndex=0]
* @param {boolean} [flat=true]
*/
function lt( { nodes, startIndex = 0, flat = true } )
{
nodes = nodes.map( n => typeof n === 'number' ? [ n ] : n );

const
_link = w => w.ancestor = w.parent,
_compress = v => {
const u = v.ancestor;
_link = ( v, w ) => w.ancestor = v,

if ( u === null ) return;
simple_eval = v => {
let a = v.ancestor;

_compress( u );
if ( a === null ) return v;

if ( v.best.semi.pre > u.best.semi.pre )
v.best = u.best;
while ( a.ancestor !== null )
{
if ( v.semi.pre > a.semi.pre )
v = a;
a = a.ancestor;
}

v.ancestor = u.ancestor;
return v;
},

_eval = v => {
flat_compress = v => {

if ( !v.ancestor || !v.ancestor.ancestor ) return;

const stack = [];

for ( let b = v; b; b = b.ancestor )
stack.push( b );

for ( let i = stack.length - 2; i--; )
{
const
b = stack[ i ],
a = b.ancestor;

if ( a.best.semi.pre < b.best.semi.pre )
b.best = a.best;

b.ancestor = a.ancestor;
}

},

flat_eval = v => {
if ( v.ancestor === null ) return v;
_compress( v );
flat_compress( v );
return v.best;
},

recur_compress = v => {
const a = v.ancestor;

if ( a === null || a.ancestor === null ) return;

recur_compress( a );

if ( a.best.semi.pre < v.best.semi.pre )
v.best = a.best;

v.ancestor = a.ancestor;
},

recur_eval = v => {
if ( v.ancestor === null ) return v;
recur_compress( v );
return v.best;
},
_eval = flat ? flat_eval : recur_eval,

listOrder = nodes.map( ( succs, id ) => ( {
id,
pre: -1,
pre: id,
succs,
preds: [],
parent: null,
semi: null,
preds: [],
parent: null,
semi: null,
best: null,
bucket: [],

idom: null,
ancestor: null,
best: null,
bucket: []
} ) ),
preOrder = [];
toString()
{
return `id: ${this.id + 1}, pre: ${this.pre + 1}, semi: ${this.semi ? this.semi.pre : '-'}, idom: ${this.idom ? this.idom.pre : '-'}`;
}
} ) );

let preOrder = [];

DFS( listOrder.map( n => n.succs ), {
edge: {
Expand All @@ -63,13 +123,15 @@ function lt( nodes )

listOrder.forEach( node => node.succs.forEach( s => listOrder[ s ].preds.push( node ) ) );

// preOrder.forEach( p => console.log( `${p}` ) );

for ( let i = preOrder.length - 1; i > 0; --i )
{
const
w = preOrder[ i ],
p = w.parent;

if ( !p ) continue;
if ( !w.id ) continue;

w.preds.forEach( v => {
const u = _eval( v );
Expand All @@ -80,7 +142,7 @@ function lt( nodes )

w.semi.bucket.push( w );

_link( w );
_link( p, w );

p.bucket.forEach( v => {
const u = _eval( v );
Expand All @@ -96,53 +158,70 @@ function lt( nodes )
w.idom = w.idom.idom;
} );

return listOrder.map( n => n.idom ? n.idom.pre : '-' );
preOrder[ 0 ].idom = null;
return listOrder.map( n => n.idom ? n.idom.pre : null );
// return listOrder;
}

const
testGraph = [
[ 1, 8 ], // start
[ 2, 3 ], // a
[ 3 ], // b
[ 4, 5 ], // c
[ 6 ], // d
[ 6 ], // e
[ 7, 2 ], // f
[ 8 ], // g
[] // end
],
r = 0,
a = 1,
b = 2,
c = 3,
d = 4,
e = 5,
f = 6,
g = 7,
h = 8,
i = 9,
j = 10,
k = 11,
l = 12,

rlarger = [
[ c, b, a ], // r
[ d ], // a
[ e, a, d ], // b
[ f, g ], // c
[ l ], // d,
[ h ], // e
[ i ], // f
[ j, i ], // g
[ e, k ], // h
[ k ], // i
[ i ], // j
[ i, r ], // k
[ h ] // l
],
result = lt( rlarger );
// result = lt( testGraph );

console.log( result );

// const
// // testGraph = [
// // [ 1, 8 ], // start
// // [ 2, 3 ], // a
// // [ 3 ], // b
// // [ 4, 5 ], // c
// // [ 6 ], // d
// // [ 6 ], // e
// // [ 7, 2 ], // f
// // [ 8 ], // g
// // [] // end
// // ],
// // r = 0,
// // a = 1,
// // b = 2,
// // c = 3,
// // d = 4,
// // e = 5,
// // f = 6,
// // g = 7,
// // h = 8,
// // i = 9,
// // j = 10,
// // k = 11,
// // l = 12,
// //
// // rlarger = [
// // [ c, b, a ], // r
// // [ d ], // a
// // [ e, a, d ], // b
// // [ f, g ], // c
// // [ l ], // d,
// // [ h ], // e
// // [ i ], // f
// // [ j, i ], // g
// // [ e, k ], // h
// // [ k ], // i
// // [ i ], // j
// // [ i, r ], // k
// // [ h ] // l
// // ],
//
// const
// graph = require( '../data/lengtarj.json' ),
// result = lt( { nodes: graph.graph, startIndex: 0, flat: true } );
// // result = lt( testGraph );s
//
// // console.log( result.map( n => typeof n === 'number' ? n + 1 : n ) );
// // console.log( graph.idom.map( n => n === null ? '-' : n + 1 ) );
//
// result.forEach( ( node, i ) => {
// const
// two = n => n < 10 ? ' ' + n : n,
// data = n => n === null ? ' -' : two( n + 1 ),
// res = n => typeof n === 'number' ? two( n + 1 ) : ' ' + n,
// idom = node.idom ? node.idom.pre : '-',
// sdom = node.semi ? node.semi.pre + 1: '-';
//
// console.log( `${two( i + 1 )}: ${res( idom )} => ${data( graph.idom[ i ] )}, semi: ${two( sdom )} => ${data( graph.semi[ i ] )}` );
// } );
// console.log( 'result:', result );
module.exports = lt;
Loading

0 comments on commit 61968ce

Please sign in to comment.