def _shape_tensor(self):
    domain_dimension = self.operators[0].domain_dimension_tensor()
    for operator in self.operators[1:]:
        domain_dimension *= operator.domain_dimension_tensor()
    range_dimension = self.operators[0].range_dimension_tensor()
    for operator in self.operators[1:]:
        range_dimension *= operator.range_dimension_tensor()
    matrix_shape = [range_dimension, domain_dimension]
    batch_shape = self.operators[0].batch_shape_tensor()
    for operator in self.operators[1:]:
        batch_shape = array_ops.broadcast_dynamic_shape(batch_shape, operator.batch_shape_tensor())
    return array_ops.concat((batch_shape, matrix_shape), 0)
def _shape_tensor(self):
    domain_dimension = self.operators[0].domain_dimension_tensor()
    for operator in self.operators[1:]:
        domain_dimension *= operator.domain_dimension_tensor()
    range_dimension = self.operators[0].range_dimension_tensor()
    for operator in self.operators[1:]:
        range_dimension *= operator.range_dimension_tensor()
    matrix_shape = [range_dimension, domain_dimension]
    batch_shape = self.operators[0].batch_shape_tensor()
    for operator in self.operators[1:]:
        batch_shape = array_ops.broadcast_dynamic_shape(batch_shape, operator.batch_shape_tensor())
    return array_ops.concat((batch_shape, matrix_shape), 0)