UNPKG

finitedomain

Version:

A fast feature rich finite domain solver

1,457 lines (1,416 loc) 55.6 kB
import expect from '../fixtures/mocha_proxy.fixt'; import Solver from '../../src/solver'; import importer from '../../src/importer'; import { SUB, SUP, } from '../../src/helpers'; // each test is an array [desc:string, result:Solver, tests:string] // // the solver should be configured to the result of the tests. a deep // comparison will be made with the result and this solver. // // the tests string is preprocessed to remove anything up to and // including the first newline and anything after and including the // last newline, If a line is only whitespace plus |-- then the // while line (including surrounded newlines) is stripped. This way // you can declare multiple whitespace test cases for the same // output with backticks. let unitTests = [ '- vars', [ 'basic whitespace tests', s => s.decl('A', [0, 1]), ` : A [0 1] |-- : A [0 1] |-- : A [0 1] |-- : A [0 1] |-- : A [0 1] |-- : A [0 1] |-- : A [0 1]${' '} `, ], ' - var names', [ 'simple var decl with range one pair', s => s.declRange('A', 0, 1), ` : A [0 1] `, ], [ 'simple var decl with range one pair', s => s.declRange('foobar', 0, 1), ` : foobar [0 1] `, ], [ 'simple var decl with range one pair', s => s.declRange('anything@goes', 0, 1), ` : anything@goes [0 1] `, ], [ 'simple var decl with range one pair', s => s.declRange('even_weird!@##$%&^&chars', 0, 1), ` : even_weird!@##$%&^&chars [0 1] `, ], [ 'simple var decl with range one pair', s => s.declRange('andnum63r50987654321aswell', 0, 1), ` : andnum63r50987654321aswell [0 1] `, ], ' - quoted idents', [ 'simple quoted ident', s => s.declRange('A', 0, 1), ` : 'A' [0 1] `, ], [ 'quoted ident otherwise illegal', s => s.declRange('[({#=]})', 0, 1), ` : '[({#=]})' [0 1] `, ], [ 'quoted ident in constraint', // make sure constraints are parsed properly too... s => { s.declRange('[({#=]})', 0, 1); s.eq('[({#=]})', 0); }, ` : '[({#=]})' [0 1] '[({#=]})' == 0 `, ], ' - domain', [ 'simple var decl with range one pair', s => s.declRange('A', 1, 2), ` : A [1 2] |-- : A [ 1 2] |-- : A [1 2 ] |-- : A [1 2] |-- : A [ 1 2 ] |-- : A [1 2] |-- : A [1 2] |-- : A [ 1 2 ] `, ], [ 'simple var decl with range multiple pairs', s => s.decl('A', [0, 1, 10, 20, 100, 3000]), ` : A [[0 1] [10 20] [100 3000]] |-- : A [[0 1] [10 20] [100 3000]] |-- : A [ [0 1] [10 20] [100 3000]] |-- : A [[ 0 1] [10 20 ] [ 100 3000]] |-- : A [[ 0 1 ] [ 10 20 ] [ 100 3000]] |-- : A [[ 0 1] [10 20 ] [100 3000]] |-- : A [[ 0 1] [10 20 ] [ 100 3000]] `, ], [ 'wide domain', s => s.declRange('A', SUB, SUP), ` : A * |-- : A * |-- : A * \t `, ], [ 'literal domains', s => s.declRange('A', SUB, SUP), ` : A 15 |-- : A 1000 |-- : A 0 \t |-- : A 100000000 \t `, ], [ 'empty domain', s => s.declRange('A', SUB, SUP), ` : A [] |-- : A [ ] `, ], //' - alias', //[ // 'single alias', // // TODO: unable to test this as finitedomain currently doesn't really support this // // for now just check that the parser doesnt blow up // s => true, // ` // : A [0 1] alias(foo) // |-- // : A [0 1] alias(hello#world) // |-- // : A [0 1] alias(foo=bar) // |-- // : A [0 1] alias(@markov) // |-- // : A [0 1] alias(foo) // `, //], ' - list', [ ' - var with priority list', s => s.decl('A', [0, 10], {valtype: 'list', list: [5, 8, 10, 1]}), ` : A [0 10] @list prio(5 8 10 1) |-- : A [0 10] @list prio(5 8 10 1) |-- : A [0 10] @list prio(5, 8, 10, 1) |-- : A [0 10] @list prio(5, 8 10, 1) |-- : A [0 10] @list prio( 5, 8 10, 1 ) |-- : A [0 10] @list prio(5 8 10 1) `, ], ' - markov', [ ' - var with markov distribution with normal matrix and legend in any order', s => s.decl('A', [0, 10], {valtype: 'markov', matrix: [{vector: [1, 0]}], legend: [1, 0]}), ` : A [0 10] @markov matrix([{vector: [10, 1]}]) legend(1, 0) |-- : A [0 10] @markov matrix([{vector: [10, 1]}]) legend(1 0) |-- : A [0 10] @markov legend(1, 0) matrix([{vector: [10, 1]}]) |-- : A [0 10] @markov legend(1 0) matrix([{vector: [10, 1]}]) `, ], [ ' - var with markov distribution with matrix and expand in any order', s => s.decl('A', [0, 10], {valtype: 'markov', matrix: [{vector: [1, 0]}], expandVectorsWith: 1}), ` : A [0 10] @markov matrix([{vector: [10, 1]}]) expand(1) |-- : A [0 10] @markov expand(1) matrix([{vector: [10, 1]}]) `, ], [ ' - var with markov distribution with matrix, legend, and expand in any order', s => s.decl('A', [0, 10], {valtype: 'markov', matrix: [{vector: [1, 0]}], legend: [1], expandVectorsWith: 1}), ` : A [0 10] @markov matrix([{vector: [10, 1]}]) legend(1) expand(1) |-- : A [0 10] @markov matrix([{vector: [10, 1]}]) expand(1) legend(1) |-- : A [0 10] @markov legend(1) matrix([{vector: [10, 1]}]) expand(1) |-- : A [0 10] @markov expand(1) matrix([{vector: [10, 1]}]) legend(1) |-- : A [0 10] @markov legend(1) expand(1) matrix([{vector: [10, 1]}]) |-- : A [0 10] @markov expand(1) legend(1) matrix([{vector: [10, 1]}]) `, ], '- constraint', ' - distinct', [ 'simple distincts', s => { s.declRange('A', 0, 10); s.declRange('B', 0, 10); s.declRange('C', 0, 10); s.distinct(['A', 'B', 'C']); }, ` : A [0 10] : B [0 10] : C [0 10] distinct(A B C) |-- : A [0 10] : B [0 10] : C [0 10] distinct( A, B C) `, ], [ 'distinct with one constant', s => { s.declRange('A', 0, 10); s.declRange('B', 0, 10); s.distinct(['A', 5, 'B']); }, ` : A [0 10] : B [0 10] distinct(A 5 B) |-- : A [0 10] : B [0 10] distinct( A, 5 B) `, ], [ 'distinct with two constants', s => { s.declRange('A', 0, 10); s.distinct([3, 'A', 8]); }, ` : A [0 10] distinct( 3 A 8) |-- : A [0 10] distinct( 3, A 8 ) `, ], [ 'distinct with one var', s => { s.declRange('A', 0, 10); s.distinct(['A']); }, ` : A [0 10] distinct(A) `, ], [ 'distinct with two vars', s => { s.declRange('A', 0, 10); s.declRange('B', 0, 10); s.distinct(['A', 'B']); }, ` : A [0 10] : B [0 10] distinct(A B) |-- : A [0 10] : B [0 10] distinct(A ,B) `, ], ' - nall', [ 'simple nalls', s => { s.declRange('A', 0, 10); s.declRange('B', 0, 10); s.declRange('C', 0, 10); s.declRange('R', 0, 0); s.product(['A', 'B', 'C'], 'R'); }, ` : A [0 10] : B [0 10] : C [0 10] : R [0 0] R = product(A B C) |-- : A [0 10] : B [0 10] : C [0 10] nall(A B C) `, ], ' - simply cops', ...[ ['==', 'eq'], ['!=', 'neq'], ['<', 'lt'], ['<=', 'lte'], ['>', 'gt'], ['>=', 'gte'], ].reduce((arr, [opSymbol, methodName]) => { arr.push( ' - method=' + methodName, [ 'simple var args', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 1); s[methodName]('A', 'B'); }, ` : A [0 1] : B [0 1] A ${opSymbol} B `, ], [ 'var and constant args', s => { s.declRange('A', 0, 1); s[methodName]('A', 5); }, ` : A [0 1] A ${opSymbol} 5 `, ], [ 'constant and var args', s => { s.declRange('B', 0, 1); s[methodName](5, 'B'); }, ` : B [0 1] 5 ${opSymbol} B `, ], [ 'two constants', s => { s[methodName](5, 5); }, ` 5 ${opSymbol} 5 `, ], [ 'domain literal left', s => { s.declRange('A', 1, 10); s[methodName](s.declRange(undefined, 0, 1), 'A'); }, ` : A [1 10] [0 1] ${opSymbol} A `, ], [ 'domain literal right', s => { s.declRange('A', 1, 10); s[methodName]('A', s.declRange(undefined, 0, 1)); }, ` : A [1 10] A ${opSymbol} [0 1] `, ] ); return arr; }, []), ' - simple assignments', ...[ ['==?', 'isEq'], ['!=?', 'isNeq'], ['<?', 'isLt'], ['<=?', 'isLte'], ['>?', 'isGt'], ['>=?', 'isGte'], ].reduce((arr, [opSymbol, methodName]) => { arr.push( [ 'assignment with vars', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 1); s.declRange('C', 0, 1); s[methodName]('A', 'B', 'C'); }, ` : A [0 1] : B [0 1] : C [0 1] C = A ${opSymbol} B `, ], [ 'assignment where A is a constant', s => { s.declRange('B', 0, 1); s.declRange('C', 0, 1); s[methodName](5, 'B', 'C'); }, ` : B [0 1] : C [0 1] C = 5 ${opSymbol} B `, ], [ 'assignment where B is a constant', s => { s.declRange('A', 0, 1); s.declRange('C', 0, 1); s[methodName]('A', 5, 'C'); }, ` : A [0 1] : C [0 1] C = A ${opSymbol} 5 `, ], [ 'assignment where C is a constant', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 1); s[methodName]('A', 'B', 1); }, ` : A [0 1] : B [0 1] 1 = A ${opSymbol} B `, ], [ 'assignment where A and B are constants', s => { s.declRange('C', 0, 1); s[methodName](5, 8, 'C'); }, ` : C [0 1] C = 5 ${opSymbol} 8 `, ], [ 'assignment where B and C are constants', s => { s.declRange('A', 0, 1); s[methodName]('A', 8, 1); }, ` : A [0 1] 1 = A ${opSymbol} 8 `, ], [ 'assignment where A and C are constants', s => { s.declRange('B', 0, 1); s[methodName](4, 'B', 1); }, ` : B [0 1] 1 = 4 ${opSymbol} B `, ], [ 'assignment with only constants', s => { s[methodName](4, 4, 1); }, ` 1 = 4 ${opSymbol} 4 `, ], [ 'assignment where C explicit', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 1); s.declRange('C', 0, 1); s.eq(s[methodName]('A', 'B', 'C'), s.decl(undefined, [0, 1])); }, ` : A [0 1] : B [0 1] C = A ${opSymbol} B C == [0 1] `, ], [ 'assignment where C implicit', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 1); s.eq(s[methodName]('A', 'B'), s.decl(undefined, [0, 1])); }, ` : A [0 1] : B [0 1] C = A ${opSymbol} B C == [0 1] `, ] ); return arr; }, []), ' - groups', ...[ ['==?', 'isEq'], ['!=?', 'isNeq'], ['<?', 'isLt'], ['<=?', 'isLte'], ['>?', 'isGt'], ['>=?', 'isGte'], ].reduce((arr, [opSymbol, methodName]) => { arr.push( [ ' - unnecessary group', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 10); s.declRange('C', 0, 10); s[methodName]('B', 'C', 'A'); }, ` : A [0 1] : B [0 10] : C [0 10] (A) = B ${opSymbol} C |-- : A [0 1] : B [0 10] : C [0 10] A = (B) ${opSymbol} C |-- : A [0 1] : B [0 10] : C [0 10] A = B ${opSymbol} (C) `, ], [ ' - nested reifier left', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 10); s.declRange('C', 0, 10); s.declRange('D', 0, 10); s[methodName](s[methodName]('B', 'C'), 'D', 'A'); }, ` : A [0 1] : B [0 10] : C [0 10] : D [0 10] A = (B ${opSymbol} C) ${opSymbol} D `, ], [ ' - nested reifier right', s => { s.declRange('A', 0, 1); s.declRange('B', 0, 3); s.declRange('C', 0, 3); s.declRange('D', 0, 3); s[methodName]('B', s[methodName]('C', 'D'), 'A'); }, ` : A [0 1] : B [0 3] : C [0 3] : D [0 3] A = B ${opSymbol} (C ${opSymbol} D) |-- : A [0 1] : B [0 3] : C [0 3] : D [0 3] A = (B ${opSymbol} (C ${opSymbol} D)) `, ], [ ' - nested reifier result', s => { s.declRange('A', 0, 3); s.declRange('B', 0, 3); s.declRange('C', 0, 3); s.declRange('D', 0, 3); s[methodName]('C', 'D', s[methodName]('A', 'B')); }, ` : A [0 3] : B [0 3] : C [0 3] : D [0 3] (A ${opSymbol} B) = (C ${opSymbol} D) |-- : A [0 3] : B [0 3] : C [0 3] : D [0 3] (A ${opSymbol} B) = C ${opSymbol} D `, ], [ ' - not to be confused with eq', s => { s.declRange('A', 0, 3); s.declRange('B', 0, 3); s.declRange('C', 0, 3); s.declRange('D', 0, 3); s.eq(s[methodName]('A', 'B'), s[methodName]('C', 'D')); }, ` : A [0 3] : B [0 3] : C [0 3] : D [0 3] (A ${opSymbol} B) == (C ${opSymbol} D) `, ] ); return arr; }, []), ...['product', 'sum'].reduce((arr, op) => { arr.push( ' - ' + op, [ 'one arg', s => { s.declRange('A', 0, 10); s.declRange('S', 0, 100); s[op](['A'], 'S'); }, ` : A [0 10] : S [0 100] S = ${op}(A) `, ], [ 'two args', s => { s.declRange('A', 0, 10); s.declRange('B', 0, 10); s.declRange('S', 0, 100); s[op](['A', 'B'], 'S'); }, ` : A [0 10] : B [0 10] : S [0 100] S = ${op}(A B) `, ], [ 'three args', s => { s.declRange('A', 0, 10); s.declRange('B', 0, 10); s.declRange('C', 0, 10); s.declRange('S', 0, 100); s[op](['A', 'B', 'C'], 'S'); }, ` : A [0 10] : B [0 10] : C [0 10] : S [0 100] S = ${op}(A B C) `, ], [ 'with a constant', s => { s.declRange('A', 0, 10); s.declRange('C', 0, 10); s.declRange('S', 0, 100); s[op](['A', 5, 'C'], 'S'); }, ` : A [0 10] : C [0 10] : S [0 100] S = ${op}(A 5 C) `, ], [ 'only constants', s => { s.declRange('S', 0, 100); s[op]([1, 2, 3], 'S'); }, ` : S [0 100] S = ${op}( 1 2 3) `, ], [ 'op=op with constants without result', s => { s.eq(s[op]([1, 2, 3]), s[op]([1, 2, 3])); }, ` ${op}(1 2 3) = ${op}( 1 2 3) `, ], [ 'op=op with vars', s => { s.declRange('A', 0, 10); s.declRange('B', 0, 10); s.declRange('C', 0, 10); s.declRange('D', 0, 10); s.declRange('E', 0, 10); s.declRange('F', 0, 10); s.eq(s[op](['A', 'B', 'C']), s[op](['D', 'E', 'F'])); }, ` : A [0 10] : B [0 10] : C [0 10] : D [0 10] : E [0 10] : F [0 10] ${op}(A B C) = ${op}(D E F) `, ] ); return arr; }, []), '- @rules', [ 'var-strat', s => {}, ` @custom var-strat {} |-- @custom var-strat = {} `, ], [ 'val-strat', s => {}, ` @custom val-strat max |-- @custom val-strat = max `, ], [ 'targets', s => {}, ` @custom targets all |-- @custom targets = all `, ], [ 'targets', s => {}, ` @custom targets (A B C) `, ], [ 'constraints mode', s => {}, ` @mode constraints : A [0 1] : B [0 1] C = A + B |-- @mode = constraints : A [0 1] : B [0 1] C = A + B `, ], [ 'propagators mode', s => {}, ` @mode propagators : A [0 1] : B [0 1] C = A + B |-- @mode = propagators : A [0 1] : B [0 1] C = A + B `, ], ]; describe('src/importer.spec', function() { // to focus on a specific unit test find the `test #xxx` number from the target test // below in the inner forEach, return unless the index isn't that number. describe.skip('unit tests (heavy! dont enable for travis!)', function() { let COMPARE_RESULT = false; // this is too heavy so disable it. still good to check every now and then. let ONLY_TEST = 0; let section = ''; let n = 0; unitTests.forEach((test, i) => { if (typeof test === 'string') return section = test; let desc = test[0]; let expectFunc = test[1]; let inputs = test[2]; let n1 = inputs.indexOf('\n'); let n2 = inputs.lastIndexOf('\n'); if (n1 >= 0) inputs = inputs.slice(n1 + 1, n2); inputs = inputs.split(/\n\s*?\|\-\-.*?\n/g); if (!ONLY_TEST) { it(section + ' | ' + i + ' should have proper test layout', function() { expect((n1 >= 0) === (n2 >= 0), 'either no newlines or have trimmable bumper lines').to.eql(true); expect(inputs.length, 'at least one test').to.be.above(0); expect(inputs.filter(x => x.indexOf('|--') >= 0), 'no separators').to.eql([]); }); } describe(section + ' | ' + desc, function() { let expectation; before(function() { expectation = new Solver(); expectFunc(expectation); if (COMPARE_RESULT) expectation = expectation.solve(); }); inputs.forEach(input => { let ok = false; ++n; if (ONLY_TEST && n !== ONLY_TEST) return; it('[test #' + n + '] input=`' + input.replace(/[\n\r]/g, '\u23CE') + '`', function() { let output = importer(input); expect(output).to.be.an('object'); if (COMPARE_RESULT) expect(output.solve()).to.eql(expectation); ok = true; }); if (ONLY_TEST) return; it('[test #' + n + '] with tabs', function() { if (!ok) return; let inputTabbed = input.replace(/ /g, '\t'); let solver = importer(inputTabbed); expect(solver).to.be.an('object'); if (COMPARE_RESULT) expect(solver.solve(), 'tabbed').to.eql(expectation); }); it('[test #' + n + '] with padded newlines', function() { if (!ok) return; let inputNewlined = '\n\r\n' + input.replace(/([\r\n])/g, '$1\n\r\n') + '\n\r\n'; let solver = importer(inputNewlined); expect(solver).to.be.an('object'); if (COMPARE_RESULT) expect(solver.solve(), 'newlined').to.eql(expectation); }); it('[test #' + n + '] with comment padding', function() { if (!ok) return; let inputCommented = input.replace(/([\n\r]|$)/g, _ => ' # foo!\n'); let solver = importer(inputCommented); expect(solver).to.be.an('object'); if (COMPARE_RESULT) expect(solver.solve(), 'padded1').to.eql(expectation); }); it('[test #' + n + '] with whitespace padding', function() { if (!ok) return; let inputPadded = input.replace(/([)+*\/\[\],\n\r])/g, ' $1 '); let s = importer(inputPadded); expect(s).to.be.an('object'); if (COMPARE_RESULT) expect(s.solve(), 'padded1').to.eql(expectation); let x = 0; let ip1 = inputPadded.replace(/ /g, _ => ++x % 2 === 0 ? ' ' : '\t'); let s1 = importer(ip1); expect(s1).to.be.an('object'); if (COMPARE_RESULT) expect(s1.solve(), 'padded1').to.eql(expectation); let ip2 = inputPadded.replace(/ /g, _ => ++x % 2 === 1 ? ' ' : '\t'); let s2 = importer(ip2); expect(s2).to.be.an('object'); if (COMPARE_RESULT) expect(s2.solve(), 'padded2').to.eql(expectation); }); }); }); }); }); describe('regressions', function() { // skip: too heavy for code coverage :/ it.skip('should not reduce SECTION to empty', function() { let dsl = ` : '_ROOT_BRANCH_' = [1,1] : 'SECTION' = [1,1] 'SECTION' >= 1 # [1,1] >= 1 '_ROOT_BRANCH_' == 1 # ? == 1 : 'VERSE_INDEX' = [3,3] 'VERSE_INDEX' >= 1 # [3,3] >= 1 'SECTION' == 1 # ? == 1 : 'ITEM_INDEX' = [1,1] 'ITEM_INDEX' >= 1 # [1,1] >= 1 'SECTION' == 1 # ? == 1 : 'CLUSTER' = [1,3] 'CLUSTER' >= 1 # [1,3] >= 1 'SECTION' == 1 # ? == 1 : 'CLUSTER_START?' = [0,1] : 'CLUSTER_END?' = [0,1] : 'item' = [1,6] 'item' >= 1 # [1,6] >= 1 'SECTION' == 1 # ? == 1 : 'SECTION&n=1' = [1,1] 'SECTION&n=1' >= 1 # [1,1] >= 1 '_ROOT_BRANCH_' == 1 # ? == 1 : 'VERSE_INDEX&n=1' = [2,2] 'VERSE_INDEX&n=1' >= 1 # [2,2] >= 1 'SECTION&n=1' == 1 # ? == 1 : 'ITEM_INDEX&n=1' = [2,2] 'ITEM_INDEX&n=1' >= 1 # [2,2] >= 1 'SECTION&n=1' == 1 # ? == 1 : 'CLUSTER&n=1' = [1,3] 'CLUSTER&n=1' >= 1 # [1,3] >= 1 'SECTION&n=1' == 1 # ? == 1 : 'CLUSTER_START?&n=1' = [0,1] : 'CLUSTER_END?&n=1' = [0,1] : 'item&n=1' = [1,6] 'item&n=1' >= 1 # [1,6] >= 1 'SECTION&n=1' == 1 # ? == 1 : 'SECTION&n=2' = [1,1] 'SECTION&n=2' >= 1 # [1,1] >= 1 '_ROOT_BRANCH_' == 1 # ? == 1 : 'VERSE_INDEX&n=2' = [6,6] 'VERSE_INDEX&n=2' >= 1 # [6,6] >= 1 'SECTION&n=2' == 1 # ? == 1 : 'ITEM_INDEX&n=2' = [3,3] 'ITEM_INDEX&n=2' >= 1 # [3,3] >= 1 'SECTION&n=2' == 1 # ? == 1 : 'CLUSTER&n=2' = [1,3] 'CLUSTER&n=2' >= 1 # [1,3] >= 1 'SECTION&n=2' == 1 # ? == 1 : 'CLUSTER_START?&n=2' = [0,1] : 'CLUSTER_END?&n=2' = [0,1] : 'item&n=2' = [1,6] 'item&n=2' >= 1 # [1,6] >= 1 'SECTION&n=2' == 1 # ? == 1 : 'SECTION&n=3' = [1,1] 'SECTION&n=3' >= 1 # [1,1] >= 1 '_ROOT_BRANCH_' == 1 # ? == 1 : 'VERSE_INDEX&n=3' = [1,1] 'VERSE_INDEX&n=3' >= 1 # [1,1] >= 1 'SECTION&n=3' == 1 # ? == 1 : 'ITEM_INDEX&n=3' = [4,4] 'ITEM_INDEX&n=3' >= 1 # [4,4] >= 1 'SECTION&n=3' == 1 # ? == 1 : 'CLUSTER&n=3' = [1,3] 'CLUSTER&n=3' >= 1 # [1,3] >= 1 'SECTION&n=3' == 1 # ? == 1 : 'CLUSTER_START?&n=3' = [0,1] : 'CLUSTER_END?&n=3' = [0,1] : 'item&n=3' = [1,6] 'item&n=3' >= 1 # [1,6] >= 1 'SECTION&n=3' == 1 # ? == 1 : 'SECTION&n=4' = [1,1] 'SECTION&n=4' >= 1 # [1,1] >= 1 '_ROOT_BRANCH_' == 1 # ? == 1 : 'VERSE_INDEX&n=4' = [5,5] 'VERSE_INDEX&n=4' >= 1 # [5,5] >= 1 'SECTION&n=4' == 1 # ? == 1 : 'ITEM_INDEX&n=4' = [5,5] 'ITEM_INDEX&n=4' >= 1 # [5,5] >= 1 'SECTION&n=4' == 1 # ? == 1 : 'CLUSTER&n=4' = [1,3] 'CLUSTER&n=4' >= 1 # [1,3] >= 1 'SECTION&n=4' == 1 # ? == 1 : 'CLUSTER_START?&n=4' = [0,1] : 'CLUSTER_END?&n=4' = [0,1] : 'item&n=4' = [1,6] 'item&n=4' >= 1 # [1,6] >= 1 'SECTION&n=4' == 1 # ? == 1 : 'SECTION&n=5' = [1,1] 'SECTION&n=5' >= 1 # [1,1] >= 1 '_ROOT_BRANCH_' == 1 # ? == 1 : 'VERSE_INDEX&n=5' = [4,4] 'VERSE_INDEX&n=5' >= 1 # [4,4] >= 1 'SECTION&n=5' == 1 # ? == 1 : 'ITEM_INDEX&n=5' = [6,6] 'ITEM_INDEX&n=5' >= 1 # [6,6] >= 1 'SECTION&n=5' == 1 # ? == 1 : 'CLUSTER&n=5' = [1,3] 'CLUSTER&n=5' >= 1 # [1,3] >= 1 'SECTION&n=5' == 1 # ? == 1 : 'CLUSTER_START?&n=5' = [0,1] : 'CLUSTER_END?&n=5' = [0,1] : 'item&n=5' = [1,6] 'item&n=5' >= 1 # [1,6] >= 1 'SECTION&n=5' == 1 # ? == 1 distinct('ITEM_INDEX','ITEM_INDEX&n=1','ITEM_INDEX&n=2','ITEM_INDEX&n=3','ITEM_INDEX&n=4','ITEM_INDEX&n=5') # distinct([1,1],[2,2],[3,3],[4,4],[5,5],[6,6]) distinct('item','item&n=1','item&n=2','item&n=3','item&n=4','item&n=5') # distinct(?,?,?,?,?,?) 'anon_1' = 'CLUSTER' ==? 1 # ? = [1,3] ==? 1 'anon_2' = 'CLUSTER&n=1' ==? 1 # ? = [1,3] ==? 1 'anon_3' = 'CLUSTER&n=2' ==? 1 # ? = [1,3] ==? 1 'anon_4' = 'CLUSTER&n=3' ==? 1 # ? = [1,3] ==? 1 'anon_5' = 'CLUSTER&n=4' ==? 1 # ? = [1,3] ==? 1 'anon_6' = 'CLUSTER&n=5' ==? 1 # ? = [1,3] ==? 1 'anon_7' = 'CLUSTER' ==? 2 # ? = [1,3] ==? 2 'anon_8' = 'CLUSTER&n=1' ==? 2 # ? = [1,3] ==? 2 'anon_9' = 'CLUSTER&n=2' ==? 2 # ? = [1,3] ==? 2 'anon_10' = 'CLUSTER&n=3' ==? 2 # ? = [1,3] ==? 2 'anon_11' = 'CLUSTER&n=4' ==? 2 # ? = [1,3] ==? 2 'anon_12' = 'CLUSTER&n=5' ==? 2 # ? = [1,3] ==? 2 'anon_13' = 'CLUSTER' ==? 3 # ? = [1,3] ==? 3 'anon_14' = 'CLUSTER&n=1' ==? 3 # ? = [1,3] ==? 3 'anon_15' = 'CLUSTER&n=2' ==? 3 # ? = [1,3] ==? 3 'anon_16' = 'CLUSTER&n=3' ==? 3 # ? = [1,3] ==? 3 'anon_17' = 'CLUSTER&n=4' ==? 3 # ? = [1,3] ==? 3 'anon_18' = 'CLUSTER&n=5' ==? 3 # ? = [1,3] ==? 3 'anon_7' == 1 # ? == 1 'anon_6' == 0 # ? == 0 'anon_19' = 'CLUSTER_START?' ==? 1 # ? = [0,1] ==? 1 'anon_20' = 'CLUSTER_START?&n=1' ==? 1 # ? = [0,1] ==? 1 'anon_21' = 'CLUSTER_START?&n=2' ==? 1 # ? = [0,1] ==? 1 'anon_22' = 'CLUSTER_START?&n=3' ==? 1 # ? = [0,1] ==? 1 'anon_23' = 'CLUSTER_START?&n=4' ==? 1 # ? = [0,1] ==? 1 'anon_24' = 'CLUSTER_START?&n=5' ==? 1 # ? = [0,1] ==? 1 'anon_25' = sum('anon_19','anon_1') # ? = sum(?,?) 'anon_26' = 'anon_25' ==? 2 # ? = ? ==? 2 'anon_27' = sum('anon_20','anon_2') # ? = sum(?,?) 'anon_28' = 'anon_27' ==? 2 # ? = ? ==? 2 'anon_29' = sum('anon_21','anon_3') # ? = sum(?,?) 'anon_30' = 'anon_29' ==? 2 # ? = ? ==? 2 'anon_31' = sum('anon_22','anon_4') # ? = sum(?,?) 'anon_32' = 'anon_31' ==? 2 # ? = ? ==? 2 'anon_33' = sum('anon_23','anon_5') # ? = sum(?,?) 'anon_34' = 'anon_33' ==? 2 # ? = ? ==? 2 'anon_35' = sum('anon_24','anon_6') # ? = sum(?,?) 'anon_36' = 'anon_35' ==? 2 # ? = ? ==? 2 'anon_37' = 'CLUSTER_END?' ==? 1 # ? = [0,1] ==? 1 'anon_38' = 'CLUSTER_END?&n=1' ==? 1 # ? = [0,1] ==? 1 'anon_39' = 'CLUSTER_END?&n=2' ==? 1 # ? = [0,1] ==? 1 'anon_40' = 'CLUSTER_END?&n=3' ==? 1 # ? = [0,1] ==? 1 'anon_41' = 'CLUSTER_END?&n=4' ==? 1 # ? = [0,1] ==? 1 'anon_42' = 'CLUSTER_END?&n=5' ==? 1 # ? = [0,1] ==? 1 'anon_43' = 'anon_37' ==? 0 # ? = ? ==? 0 'anon_44' = 'anon_38' ==? 0 # ? = ? ==? 0 'anon_45' = 'anon_39' ==? 0 # ? = ? ==? 0 'anon_46' = 'anon_40' ==? 0 # ? = ? ==? 0 'anon_47' = 'anon_41' ==? 0 # ? = ? ==? 0 'anon_48' = 'anon_42' ==? 0 # ? = ? ==? 0 'anon_49' = sum('anon_1','anon_43') # ? = sum(?,?) 'anon_50' = 'anon_49' ==? 2 # ? = ? ==? 2 'anon_51' = sum('anon_2','anon_44') # ? = sum(?,?) 'anon_52' = 'anon_51' ==? 2 # ? = ? ==? 2 'anon_53' = sum('anon_3','anon_45') # ? = sum(?,?) 'anon_54' = 'anon_53' ==? 2 # ? = ? ==? 2 'anon_55' = sum('anon_4','anon_46') # ? = sum(?,?) 'anon_56' = 'anon_55' ==? 2 # ? = ? ==? 2 'anon_57' = sum('anon_5','anon_47') # ? = sum(?,?) 'anon_58' = 'anon_57' ==? 2 # ? = ? ==? 2 'anon_59' = sum('anon_6','anon_48') # ? = sum(?,?) 'anon_60' = 'anon_59' ==? 2 # ? = ? ==? 2 'anon_61' = sum('anon_37','anon_1') # ? = sum(?,?) 'anon_62' = 'anon_61' ==? 2 # ? = ? ==? 2 'anon_63' = sum('anon_38','anon_2') # ? = sum(?,?) 'anon_64' = 'anon_63' ==? 2 # ? = ? ==? 2 'anon_65' = sum('anon_39','anon_3') # ? = sum(?,?) 'anon_66' = 'anon_65' ==? 2 # ? = ? ==? 2 'anon_67' = sum('anon_40','anon_4') # ? = sum(?,?) 'anon_68' = 'anon_67' ==? 2 # ? = ? ==? 2 'anon_69' = sum('anon_41','anon_5') # ? = sum(?,?) 'anon_70' = 'anon_69' ==? 2 # ? = ? ==? 2 'anon_71' = sum('anon_42','anon_6') # ? = sum(?,?) 'anon_72' = 'anon_71' ==? 2 # ? = ? ==? 2 'anon_73' = sum('anon_19','anon_7') # ? = sum(?,?) 'anon_74' = 'anon_73' ==? 2 # ? = ? ==? 2 'anon_75' = sum('anon_20','anon_8') # ? = sum(?,?) 'anon_76' = 'anon_75' ==? 2 # ? = ? ==? 2 'anon_77' = sum('anon_21','anon_9') # ? = sum(?,?) 'anon_78' = 'anon_77' ==? 2 # ? = ? ==? 2 'anon_79' = sum('anon_22','anon_10') # ? = sum(?,?) 'anon_80' = 'anon_79' ==? 2 # ? = ? ==? 2 'anon_81' = sum('anon_23','anon_11') # ? = sum(?,?) 'anon_82' = 'anon_81' ==? 2 # ? = ? ==? 2 'anon_83' = sum('anon_24','anon_12') # ? = sum(?,?) 'anon_84' = 'anon_83' ==? 2 # ? = ? ==? 2 'anon_85' = sum('anon_7','anon_43') # ? = sum(?,?) 'anon_86' = 'anon_85' ==? 2 # ? = ? ==? 2 'anon_87' = sum('anon_8','anon_44') # ? = sum(?,?) 'anon_88' = 'anon_87' ==? 2 # ? = ? ==? 2 'anon_89' = sum('anon_9','anon_45') # ? = sum(?,?) 'anon_90' = 'anon_89' ==? 2 # ? = ? ==? 2 'anon_91' = sum('anon_10','anon_46') # ? = sum(?,?) 'anon_92' = 'anon_91' ==? 2 # ? = ? ==? 2 'anon_93' = sum('anon_11','anon_47') # ? = sum(?,?) 'anon_94' = 'anon_93' ==? 2 # ? = ? ==? 2 'anon_95' = sum('anon_12','anon_48') # ? = sum(?,?) 'anon_96' = 'anon_95' ==? 2 # ? = ? ==? 2 'anon_97' = sum('anon_37','anon_7') # ? = sum(?,?) 'anon_98' = 'anon_97' ==? 2 # ? = ? ==? 2 'anon_99' = sum('anon_38','anon_8') # ? = sum(?,?) 'anon_100' = 'anon_99' ==? 2 # ? = ? ==? 2 'anon_101' = sum('anon_39','anon_9') # ? = sum(?,?) 'anon_102' = 'anon_101' ==? 2 # ? = ? ==? 2 'anon_103' = sum('anon_40','anon_10') # ? = sum(?,?) 'anon_104' = 'anon_103' ==? 2 # ? = ? ==? 2 'anon_105' = sum('anon_41','anon_11') # ? = sum(?,?) 'anon_106' = 'anon_105' ==? 2 # ? = ? ==? 2 'anon_107' = sum('anon_42','anon_12') # ? = sum(?,?) 'anon_108' = 'anon_107' ==? 2 # ? = ? ==? 2 'anon_109' = 'item' ==? 3 # ? = [1,6] ==? 3 'anon_110' = 'item&n=1' ==? 3 # ? = [1,6] ==? 3 'anon_111' = 'item&n=2' ==? 3 # ? = [1,6] ==? 3 'anon_112' = 'item&n=3' ==? 3 # ? = [1,6] ==? 3 'anon_113' = 'item&n=4' ==? 3 # ? = [1,6] ==? 3 'anon_114' = 'item&n=5' ==? 3 # ? = [1,6] ==? 3 'anon_109' == 'anon_7' # ? == ? 'anon_110' == 'anon_8' # ? == ? 'anon_111' == 'anon_9' # ? == ? 'anon_112' == 'anon_10' # ? == ? 'anon_113' == 'anon_11' # ? == ? 'anon_114' == 'anon_12' # ? == ? 'anon_115' = sum('anon_19','anon_13') # ? = sum(?,?) 'anon_116' = 'anon_115' ==? 2 # ? = ? ==? 2 'anon_117' = sum('anon_20','anon_14') # ? = sum(?,?) 'anon_118' = 'anon_117' ==? 2 # ? = ? ==? 2 'anon_119' = sum('anon_21','anon_15') # ? = sum(?,?) 'anon_120' = 'anon_119' ==? 2 # ? = ? ==? 2 'anon_121' = sum('anon_22','anon_16') # ? = sum(?,?) 'anon_122' = 'anon_121' ==? 2 # ? = ? ==? 2 'anon_123' = sum('anon_23','anon_17') # ? = sum(?,?) 'anon_124' = 'anon_123' ==? 2 # ? = ? ==? 2 'anon_125' = sum('anon_24','anon_18') # ? = sum(?,?) 'anon_126' = 'anon_125' ==? 2 # ? = ? ==? 2 'anon_127' = sum('anon_13','anon_43') # ? = sum(?,?) 'anon_128' = 'anon_127' ==? 2 # ? = ? ==? 2 'anon_129' = sum('anon_14','anon_44') # ? = sum(?,?) 'anon_130' = 'anon_129' ==? 2 # ? = ? ==? 2 'anon_131' = sum('anon_15','anon_45') # ? = sum(?,?) 'anon_132' = 'anon_131' ==? 2 # ? = ? ==? 2 'anon_133' = sum('anon_16','anon_46') # ? = sum(?,?) 'anon_134' = 'anon_133' ==? 2 # ? = ? ==? 2 'anon_135' = sum('anon_17','anon_47') # ? = sum(?,?) 'anon_136' = 'anon_135' ==? 2 # ? = ? ==? 2 'anon_137' = sum('anon_18','anon_48') # ? = sum(?,?) 'anon_138' = 'anon_137' ==? 2 # ? = ? ==? 2 'anon_139' = sum('anon_37','anon_13') # ? = sum(?,?) 'anon_140' = 'anon_139' ==? 2 # ? = ? ==? 2 'anon_141' = sum('anon_38','anon_14') # ? = sum(?,?) 'anon_142' = 'anon_141' ==? 2 # ? = ? ==? 2 'anon_143' = sum('anon_39','anon_15') # ? = sum(?,?) 'anon_144' = 'anon_143' ==? 2 # ? = ? ==? 2 'anon_145' = sum('anon_40','anon_16') # ? = sum(?,?) 'anon_146' = 'anon_145' ==? 2 # ? = ? ==? 2 'anon_147' = sum('anon_41','anon_17') # ? = sum(?,?) 'anon_148' = 'anon_147' ==? 2 # ? = ? ==? 2 'anon_149' = sum('anon_42','anon_18') # ? = sum(?,?) 'anon_150' = 'anon_149' ==? 2 # ? = ? ==? 2 'anon_19' == 1 # ? == 1 'anon_20' >= 'anon_37' # ? >= ? 'anon_21' >= 'anon_38' # ? >= ? 'anon_22' >= 'anon_39' # ? >= ? 'anon_23' >= 'anon_40' # ? >= ? 'anon_24' >= 'anon_41' # ? >= ? 'anon_42' == 1 # ? == 1 : 'verse-val($cluster-size)&col=0&count=0' = [0 1] 'anon_151' = 'CLUSTER' ==? 1 # ? = ? ==? 1 'anon_152' = 'verse-val($cluster-size)&col=0&count=0' ==? 1 # ? = ? ==? 1 'anon_151' == 'anon_152' # ? == ? : 'verse-val($cluster-size)&col=0&count=1' = [0 1] 'anon_153' = 'CLUSTER' ==? 2 # ? = ? ==? 2 'anon_154' = 'verse-val($cluster-size)&col=0&count=1' ==? 1 # ? = ? ==? 1 'anon_153' == 'anon_154' # ? == ? : 'verse-val($cluster-size)&col=0&count=2' = [0,0,2,2] 'anon_155' = 'CLUSTER' ==? 3 # ? = ? ==? 3 'anon_156' = 'verse-val($cluster-size)&col=0&count=2' ==? 2 # ? = ? ==? 2 'anon_155' == 'anon_156' # ? == ? 'anon_157' = sum('verse-val($cluster-size)&col=0&count=0','verse-val($cluster-size)&col=0&count=1','verse-val($cluster-size)&col=0&count=2') # ? = sum(?,?,?) : 'verse-val($cluster-size)&col=1&count=0' = [0 1] 'anon_158' = 'CLUSTER&n=1' ==? 1 # ? = ? ==? 1 'anon_159' = 'verse-val($cluster-size)&col=1&count=0' ==? 1 # ? = ? ==? 1 'anon_158' == 'anon_159' # ? == ? : 'verse-val($cluster-size)&col=1&count=1' = [0 1] 'anon_160' = 'CLUSTER&n=1' ==? 2 # ? = ? ==? 2 'anon_161' = 'verse-val($cluster-size)&col=1&count=1' ==? 1 # ? = ? ==? 1 'anon_160' == 'anon_161' # ? == ? : 'verse-val($cluster-size)&col=1&count=2' = [0,0,2,2] 'anon_162' = 'CLUSTER&n=1' ==? 3 # ? = ? ==? 3 'anon_163' = 'verse-val($cluster-size)&col=1&count=2' ==? 2 # ? = ? ==? 2 'anon_162' == 'anon_163' # ? == ? 'anon_164' = sum('verse-val($cluster-size)&col=1&count=0','verse-val($cluster-size)&col=1&count=1','verse-val($cluster-size)&col=1&count=2') # ? = sum(?,?,?) : 'verse-val($cluster-size)&col=2&count=0' = [0 1] 'anon_165' = 'CLUSTER&n=2' ==? 1 # ? = ? ==? 1 'anon_166' = 'verse-val($cluster-size)&col=2&count=0' ==? 1 # ? = ? ==? 1 'anon_165' == 'anon_166' # ? == ? : 'verse-val($cluster-size)&col=2&count=1' = [0 1] 'anon_167' = 'CLUSTER&n=2' ==? 2 # ? = ? ==? 2 'anon_168' = 'verse-val($cluster-size)&col=2&count=1' ==? 1 # ? = ? ==? 1 'anon_167' == 'anon_168' # ? == ? : 'verse-val($cluster-size)&col=2&count=2' = [0,0,2,2] 'anon_169' = 'CLUSTER&n=2' ==? 3 # ? = ? ==? 3 'anon_170' = 'verse-val($cluster-size)&col=2&count=2' ==? 2 # ? = ? ==? 2 'anon_169' == 'anon_170' # ? == ? 'anon_171' = sum('verse-val($cluster-size)&col=2&count=0','verse-val($cluster-size)&col=2&count=1','verse-val($cluster-size)&col=2&count=2') # ? = sum(?,?,?) : 'verse-val($cluster-size)&col=3&count=0' = [0 1] 'anon_172' = 'CLUSTER&n=3' ==? 1 # ? = ? ==? 1 'anon_173' = 'verse-val($cluster-size)&col=3&count=0' ==? 1 # ? = ? ==? 1 'anon_172' == 'anon_173' # ? == ? : 'verse-val($cluster-size)&col=3&count=1' = [0 1] 'anon_174' = 'CLUSTER&n=3' ==? 2 # ? = ? ==? 2 'anon_175' = 'verse-val($cluster-size)&col=3&count=1' ==? 1 # ? = ? ==? 1 'anon_174' == 'anon_175' # ? == ? : 'verse-val($cluster-size)&col=3&count=2' = [0,0,2,2] 'anon_176' = 'CLUSTER&n=3' ==? 3 # ? = ? ==? 3 'anon_177' = 'verse-val($cluster-size)&col=3&count=2' ==? 2 # ? = ? ==? 2 'anon_176' == 'anon_177' # ? == ? 'anon_178' = sum('verse-val($cluster-size)&col=3&count=0','verse-val($cluster-size)&col=3&count=1','verse-val($cluster-size)&col=3&count=2') # ? = sum(?,?,?) : 'verse-val($cluster-size)&col=4&count=0' = [0 1] 'anon_179' = 'CLUSTER&n=4' ==? 1 # ? = ? ==? 1 'anon_180' = 'verse-val($cluster-size)&col=4&count=0' ==? 1 # ? = ? ==? 1 'anon_179' == 'anon_180' # ? == ? : 'verse-val($cluster-size)&col=4&count=1' = [0 1] 'anon_181' = 'CLUSTER&n=4' ==? 2 # ? = ? ==? 2 'anon_182' = 'verse-val($cluster-size)&col=4&count=1' ==? 1 # ? = ? ==? 1 'anon_181' == 'anon_182' # ? == ? : 'verse-val($cluster-size)&col=4&count=2' = [0,0,2,2] 'anon_183' = 'CLUSTER&n=4' ==? 3 # ? = ? ==? 3 'anon_184' = 'verse-val($cluster-size)&col=4&count=2' ==? 2 # ? = ? ==? 2 'anon_183' == 'anon_184' # ? == ? 'anon_185' = sum('verse-val($cluster-size)&col=4&count=0','verse-val($cluster-size)&col=4&count=1','verse-val($cluster-size)&col=4&count=2') # ? = sum(?,?,?) : 'verse-val($cluster-size)&col=5&count=0' = [0 1] 'anon_186' = 'CLUSTER&n=5' ==? 1 # ? = ? ==? 1 'anon_187' = 'verse-val($cluster-size)&col=5&count=0' ==? 1 # ? = ? ==? 1 'anon_186' == 'anon_187' # ? == ? : 'verse-val($cluster-size)&col=5&count=1' = [0 1] 'anon_188' = 'CLUSTER&n=5' ==? 2 # ? = ? ==? 2 'anon_189' = 'verse-val($cluster-size)&col=5&count=1' ==? 1 # ? = ? ==? 1 'anon_188' == 'anon_189' # ? == ? : 'verse-val($cluster-size)&col=5&count=2' = [0,0,2,2] 'anon_190' = 'CLUSTER&n=5' ==? 3 # ? = ? ==? 3 'anon_191' = 'verse-val($cluster-size)&col=5&count=2' ==? 2 # ? = ? ==? 2 'anon_190' == 'anon_191' # ? == ? 'anon_192' = sum('verse-val($cluster-size)&col=5&count=0','verse-val($cluster-size)&col=5&count=1','verse-val($cluster-size)&col=5&count=2') # ? = sum(?,?,?) 'anon_193' = 'anon_19' ==? 0 # ? = ? ==? 0 'anon_194' = 'anon_20' ==? 0 # ? = ? ==? 0 'anon_195' = 'anon_21' ==? 0 # ? = ? ==? 0 'anon_196' = 'anon_22' ==? 0 # ? = ? ==? 0 'anon_197' = 'anon_23' ==? 0 # ? = ? ==? 0 'anon_198' = 'anon_24' ==? 0 # ? = ? ==? 0 'anon_199' = 'anon_157' ==? 1 # ? = ? ==? 1 'anon_200' = 'anon_164' ==? 1 # ? = ? ==? 1 'anon_201' = 'anon_171' ==? 1 # ? = ? ==? 1 'anon_202' = 'anon_178' ==? 1 # ? = ? ==? 1 'anon_203' = 'anon_185' ==? 1 # ? = ? ==? 1 'anon_204' = 'anon_192' ==? 1 # ? = ? ==? 1 'anon_205' = sum('anon_199','anon_19') # ? = sum(?,?) 'anon_206' = 'anon_205' ==? 2 # ? = ? ==? 2 'anon_207' = sum('anon_200','anon_20') # ? = sum(?,?) 'anon_208' = 'anon_207' ==? 2 # ? = ? ==? 2 'anon_209' = sum('anon_201','anon_21') # ? = sum(?,?) 'anon_210' = 'anon_209' ==? 2 # ? = ? ==? 2 'anon_211' = sum('anon_202','anon_22') # ? = sum(?,?) 'anon_212' = 'anon_211' ==? 2 # ? = ? ==? 2 'anon_213' = sum('anon_203','anon_23') # ? = sum(?,?) 'anon_214' = 'anon_213' ==? 2 # ? = ? ==? 2 'anon_215' = sum('anon_204','anon_24') # ? = sum(?,?) 'anon_216' = 'anon_215' ==? 2 # ? = ? ==? 2 'anon_217' = sum('anon_37') # ? = sum(?) 'anon_218' = 'anon_217' ==? 1 # ? = ? ==? 1 'anon_218' >= 'anon_206' # ? >= ? 'anon_219' = sum('anon_38') # ? = sum(?) 'anon_220' = 'anon_219' ==? 1 # ? = ? ==? 1 'anon_220' >= 'anon_208' # ? >= ? 'anon_221' = sum('anon_39') # ? = sum(?) 'anon_222' = 'anon_221' ==? 1 # ? = ? ==? 1 'anon_222' >= 'anon_210' # ? >= ? 'anon_223' = sum('anon_40') # ? = sum(?) 'anon_224' = 'anon_223' ==? 1 # ? = ? ==? 1 'anon_224' >= 'anon_212' # ? >= ? 'anon_225' = sum('anon_41') # ? = sum(?) 'anon_226' = 'anon_225' ==? 1 # ? = ? ==? 1 'anon_226' >= 'anon_214' # ? >= ? 'anon_227' = sum('anon_42') # ? = sum(?) 'anon_228' = 'anon_227' ==? 1 # ? = ? ==? 1 'anon_228' >= 'anon_216' # ? >= ? 'anon_229' = 'anon_157' ==? 2 # ? = ? ==? 2 'anon_230' = 'anon_164' ==? 2 # ? = ? ==? 2 'anon_231' = 'anon_171' ==? 2 # ? = ? ==? 2 'anon_232' = 'anon_178' ==? 2 # ? = ? ==? 2 'anon_233' = 'anon_185' ==? 2 # ? = ? ==? 2 'anon_234' = 'anon_192' ==? 2 # ? = ? ==? 2 'anon_235' = sum('anon_229','anon_19') # ? = sum(?,?) 'anon_236' = 'anon_235' ==? 2 # ? = ? ==? 2 'anon_237' = sum('anon_230','anon_20') # ? = sum(?,?) 'anon_238' = 'anon_237' ==? 2 # ? = ? ==? 2 'anon_239' = sum('anon_231','anon_21') # ? = sum(?,?) 'anon_240' = 'anon_239' ==? 2 # ? = ? ==? 2 'anon_241' = sum('anon_232','anon_22') # ? = sum(?,?) 'anon_242' = 'anon_241' ==? 2 # ? = ? ==? 2 'anon_243' = sum('anon_233','anon_23') # ? = sum(?,?) 'anon_244' = 'anon_243' ==? 2 # ? = ? ==? 2 'anon_245' = sum('anon_234','anon_24') # ? = sum(?,?) 'anon_246' = 'anon_245' ==? 2 # ? = ? ==? 2 'anon_247' = sum('anon_43','anon_38') # ? = sum(?,?) 'anon_248' = 'anon_247' ==? 2 # ? = ? ==? 2 'anon_249' = sum('anon_44','anon_39') # ? = sum(?,?) 'anon_250' = 'anon_249' ==? 2 # ? = ? ==? 2 'anon_251' = sum('anon_45','anon_40') # ? = sum(?,?) 'anon_252' = 'anon_251' ==? 2 # ? = ? ==? 2 'anon_253' = sum('anon_46','anon_41') # ? = sum(?,?) 'anon_254' = 'anon_253' ==? 2 # ? = ? ==? 2 'anon_255' = sum('anon_47','anon_42') # ? = sum(?,?) 'anon_256' = 'anon_255' ==? 2 # ? = ? ==? 2 'anon_257' = sum('anon_248') # ? = sum(?) 'anon_258' = 'anon_257' ==? 1 # ? = ? ==? 1 'anon_258' >= 'anon_236' # ? >= ? 'anon_259' = sum('anon_250') # ? = sum(?) 'anon_260' = 'anon_259' ==? 1 # ? = ? ==? 1 'anon_260' >= 'anon_238' # ? >= ? 'anon_261' = sum('anon_252') # ? = sum(?) 'anon_262' = 'anon_261' ==? 1 # ? = ? ==? 1 'anon_262' >= 'anon_240' # ? >= ? 'anon_263' = sum('anon_254') # ? = sum(?) 'anon_264' = 'anon_263' ==? 1 # ? = ? ==? 1 'anon_264' >= 'anon_242' # ? >= ? 'anon_265' = sum('anon_256') # ? = sum(?) 'anon_266' = 'anon_265' ==? 1 # ? = ? ==? 1 'anon_266' >= 'anon_244' # ? >= ? 'anon_267' = sum(0) # ? = sum(0) 'anon_268' = 'anon_267' ==? 1 # ? = ? ==? 1 'anon_268' >= 'anon_246' # ? >= ? 'anon_269' = sum('anon_19','anon_194') # ? = sum(?,?) 'anon_270' = 'anon_269' ==? 2 # ? = ? ==? 2 'anon_271' = sum('anon_20','anon_195') # ? = sum(?,?) 'anon_272' = 'anon_271' ==? 2 # ? = ? ==? 2 'anon_273' = sum('anon_21','anon_196') # ? = sum(?,?) 'anon_274' = 'anon_273' ==? 2 # ? = ? ==? 2 'anon_275' = sum('anon_22','anon_197') # ? = sum(?,?) 'anon_276' = 'anon_275' ==? 2 # ? = ? ==? 2 'anon_277' = sum('anon_23','anon_198') # ? = sum(?,?) 'anon_278' = 'anon_277' ==? 2 # ? = ? ==? 2 'anon_279' = sum('anon_270') # ? = sum(?) 'anon_280' = 'anon_279' ==? 1 # ? = ? ==? 1 'anon_280' >= 'anon_236' # ? >= ? 'anon_281' = sum('anon_272') # ? = sum(?) 'anon_282' = 'anon_281' ==? 1 # ? = ? ==? 1 'anon_282' >= 'anon_238' # ? >= ? 'anon_283' = sum('anon_274') # ? = sum(?) 'anon_284' = 'anon_283' ==? 1 # ? = ? ==? 1 'anon_284' >= 'anon_240' # ? >= ? 'anon_285' = sum('anon_276') # ? = sum(?) 'anon_286' = 'anon_285' ==? 1 # ? = ? ==? 1 'anon_286' >= 'anon_242' # ? >= ? 'anon_287' = sum('anon_278') # ? = sum(?) 'anon_288' = 'anon_287' ==? 1 # ? = ? ==? 1 'anon_288' >= 'anon_244' # ? >= ? 'anon_289' = sum(0) # ? = sum(0) 'anon_290' = 'anon_289' ==? 1 # ? = ? ==? 1 'anon_290' >= 'anon_246' # ? >= ? 'anon_291' = 'CLUSTER' ==? 'CLUSTER&n=1' # ? =