package wcet.mrtc;
/**
* Search in a multi-dimensional array. Test of deeply nested loops and non-local exits.
*
* WCET aspect: Return from the middle of a loop nest, deep loop nesting (4 levels).
*
* Ported from C code written by Jan Gustafsson for the <a
* href="http://www.mrtc.mdh.se/projects/wcet/benchmarks.html">Maelardalen WCET
* Benchmarks</a>.
*/
public class NestedSearch
{
// Array of keys, 4-dimensional just for the fun of it.
private static final int[][][][] keys =
{
// [0]
{
// [0][0]
{
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}
},
// [0][1]
{
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}
},
// [0][2]
{
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}
},
// [0][3]
{
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}
},
// [0][4]
{
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}
}
},
// [1]
{
// [1][0]
{
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1}
},
// [1][1]
{
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1}
},
// [1][2]
{
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1}
},
// [1][3]
{
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1}
},
// [1][4]
{
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1}
}
},
// [2]
{
// [2][0]
{
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2}
},
// [2][1]
{
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2}
},
// [2][2]
{
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2}
},
// [2][3]
{
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2}
},
// [2][4]
{
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2},
{2, 2, 2, 2, 2}
}
},
// [3]
{
// [3][0]
{
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3}
},
// [3][1]
{
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3}
},
// [3][2]
{
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3}
},
// [3][3]
{
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3}
},
// [3][4]
{
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3},
{3, 3, 3, 3, 3}
}
},
// [4]
{
// [4][0]
{
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4}
},
// [4][1]
{
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4}
},
// [4][2]
{
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4}
},
// [4][3]
{
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4}
},
// [4][4]
{
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 4},
{4, 4, 4, 4, 401} // not found
}
}
};
// Array of values, 4-dimensional just for the fun of it.
private static final int[][][][] answer =
{
// [0]
{
// [0][0]
{
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123}
},
// [0][1]
{
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123}
},
// [0][2]
{
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123}
},
// [0][3]
{
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123}
},
// [0][4]
{
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123},
{123, 123, 123, 123, 123}
}
},
// [1]
{
// [1][0]
{
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234}
},
// [1][1]
{
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234}
},
// [1][2]
{
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234}
},
// [1][3]
{
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234}
},
// [1][4]
{
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234},
{234, 234, 234, 234, 234}
}
},
// [2]
{
// [2][0]
{
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345}
},
// [2][1]
{
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345}
},
// [2][2]
{
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345}
},
// [2][3]
{
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345}
},
// [2][4]
{
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345},
{345, 345, 345, 345}
}
},
// [3]
{
// [3][0]
{
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456}
},
// [3][1]
{
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456}
},
// [3][2]
{
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456}
},
// [3][3]
{
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456}
},
// [3][4]
{
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456},
{456, 456, 456, 456, 456}
}
},
// [4]
{
// [4][0]
{
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567}
},
// [4][1]
{
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567}
},
// [4][2]
{
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567}
},
// [4][3]
{
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567}
},
// [4][4]
{
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 567},
{567, 567, 567, 567, 1111}
}
}
};
public int foo(int x)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
if (keys[i][j][k][l] == x)
{
return answer[i][j][k][l] + keys[i][j][k][l];
}
}
}
}
}
return -1;
}
public static void main(String[] args)
{
NestedSearch n = new NestedSearch();
n.foo(400);
}
}