/** * Строит решетку в явном виде эквивалентную исходной. Входная решетка должна удовлетворять * ограничениям создаваемой решетки класса Trellis. * * @param trellis решетка кода. * @return решетка кода, эквивалентная исходной. */ public static Trellis buildExplicitTrellis(ITrellis trellis) { Trellis newTrellis = new Trellis(); newTrellis.Layers = new Vertex[trellis.layersCount()][]; for (int layer = 0; layer < newTrellis.Layers.length; ++layer) { long layerSize = trellis.layerSize(layer); if (layerSize > Integer.MAX_VALUE) { throw new IllegalArgumentException( "Trellis contains layers of length more, then " + Integer.MAX_VALUE); } newTrellis.Layers[layer] = new Vertex[(int) layerSize]; for (int vertexIndex = 0; vertexIndex < newTrellis.Layers[layer].length; ++vertexIndex) { Vertex vertex = newTrellis.Layers[layer][vertexIndex] = new Vertex(); ITrellisIterator iterator = trellis.iterator(layer, vertexIndex); ITrellisEdge accessors[] = iterator.getAccessors(); vertex.Accessors = new IntEdge[accessors.length]; for (int e = 0; e < accessors.length; ++e) { if (accessors[e].src() != vertexIndex) { throw new IllegalArgumentException( "Wrong src index on the edge: " + layer + ", " + vertexIndex + ", " + e); } if (accessors[e].dst() >= Integer.MAX_VALUE || accessors[e].dst() < 0) { throw new IllegalArgumentException( "A dst index on the edge is not inside [0, " + Integer.MAX_VALUE + "]:" + layer + ", " + vertexIndex + ", " + e); } vertex.Accessors[e] = new IntEdge(accessors[e]); } ITrellisEdge predecessors[] = iterator.getPredecessors(); vertex.Predecessors = new IntEdge[predecessors.length]; for (int i = 0; i < predecessors.length; ++i) { vertex.Predecessors[i] = new IntEdge(predecessors[i]); } } } return newTrellis; }
@Override public int layersCount() { return codeTrellis.layersCount(); }