예제 #1
0
def iisignature_signature(path,
                          depth,
                          stream=False,
                          basepoint=False,
                          inverse=False):
    """Duplicates signatory.signature's functionality using iisignature, for testing purposes."""

    return r.iisignature_signature_or_logsignature(
        _IisignatureSignatureFunction.apply, path, depth, stream, basepoint,
        inverse)
예제 #2
0
def iisignature_signature(path, depth, stream, basepoint, inverse, initial):
    """Duplicates signatory.signature's functionality using iisignature, for testing purposes."""

    if isinstance(initial, torch.Tensor):

        def fn(path, depth):
            return signatory.signature_combine(
                initial, _IisignatureSignatureFunction.apply(path, depth),
                path.size(-1), depth, inverse)
    else:
        fn = _IisignatureSignatureFunction.apply

    return r.iisignature_signature_or_logsignature(fn, path, depth, stream,
                                                   basepoint, inverse)
예제 #3
0
def iisignature_signature(path, depth, stream, basepoint, inverse, initial, scalar_term):
    """Duplicates signatory.signature's functionality using iisignature, for testing purposes."""

    def fn(path, depth):
        signature = _IisignatureSignatureFunction.apply(path, depth)
        if scalar_term:
            out = torch.ones(signature.size(0), 1 + signature.size(1), dtype=signature.dtype,
                             device=signature.device)
            out[:, 1:] = signature
            signature = out
        if isinstance(initial, torch.Tensor):
            signature = signatory.signature_combine(initial, signature, path.size(-1), depth, inverse, scalar_term)
        return signature

    return r.iisignature_signature_or_logsignature(fn, path, depth, stream, basepoint, inverse)
예제 #4
0
def iisignature_logsignature(path, depth, stream, basepoint, inverse, mode):
    """Duplicates signatory.logsignature's functionality using iisignature, for testing purposes."""

    batch_size, input_stream, input_channels = path.shape
    device = path.device
    dtype = path.dtype

    if input_channels > 1:
        fn = lambda path, depth: _iisignature_logsignature(path, depth, mode)
        result = r.iisignature_signature_or_logsignature(fn, path, depth, stream, basepoint, inverse)
    else:
        # iisignature doesn't actually support channels == 1, but the logsignature is just the increment in this
        # case.

        # Add on the basepoint if necessary
        if basepoint is True:
            iisignature_path = torch.cat([torch.zeros(batch_size, 1, input_channels,
                                                      dtype=dtype, device=device), path], dim=1)
        elif isinstance(basepoint, torch.Tensor):
            iisignature_path = torch.cat([basepoint.unsqueeze(1), path], dim=1)
        else:
            iisignature_path = path

        # Calculate increments
        result = iisignature_path[:, 1:] - iisignature_path[:, 0].unsqueeze(1)

        # Extract final piece if necessary
        if not stream:
            result = result[:, -1]

        # Invert if necessary
        # (The simple code below works in this special case! Inverting is usually a bit trickier.)
        if inverse:
            result = -result

        if mode == h.expand_mode:
            result_ = result
            if stream:
                if basepoint is False:
                    stream_length = input_stream - 1
                else:
                    stream_length = input_stream
                result = torch.zeros(batch_size, stream_length, depth, dtype=dtype, device=device)
            else:
                result = torch.zeros(batch_size, depth, dtype=dtype, device=device)
            result[..., 0].unsqueeze(-1).copy_(result_)

    return result
예제 #5
0
def iisignature_signature(path,
                          depth,
                          stream=False,
                          basepoint=False,
                          inverse=False,
                          scalar_term=False):
    """Duplicates signatory.signature's functionality using iisignature, for testing purposes."""
    def fn(path, depth):
        signature = _IisignatureSignatureFunction.apply(path, depth)
        if scalar_term:
            out = torch.ones(signature.size(0),
                             1 + signature.size(1),
                             dtype=signature.dtype,
                             device=signature.device)
            out[:, 1:] = signature
            signature = out
        return signature

    return r.iisignature_signature_or_logsignature(fn, path, depth, stream,
                                                   basepoint, inverse)