Пример #1
0
    @Override
    public ITrellisIterator iterator(int layer, long vertexIndex) {
      int position = 0;

      for (int l = 0; l < layer; ++l) {
        position += codeTrellis.iterator(l, 0).getAccessors()[0].bits().getFixedSize();
      }

      return new Iterator(codeTrellis.iterator(layer, vertexIndex), position);
    }
Пример #2
0
  /**
   * Строит решетку в явном виде эквивалентную исходной. Входная решетка должна удовлетворять
   * ограничениям создаваемой решетки класса 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;
  }
Пример #3
0
 @Override
 public long layerSize(int layer) {
   return codeTrellis.layerSize(layer);
 }
Пример #4
0
 @Override
 public int layersCount() {
   return codeTrellis.layersCount();
 }