X-DataInitiative / tick

Module for statistical learning, with a particular emphasis on time-dependent modelling
https://x-datainitiative.github.io/tick/
BSD 3-Clause "New" or "Revised" License
480 stars 105 forks source link

Error in HawkesBasisKernels when n_basis is not specified #474

Open Jbollenbacher opened 3 years ago

Jbollenbacher commented 3 years ago

I've encountered a critical error in HawkesBasisKernels in tick version 0.7.0.1.

Minimal error reproduction example:

import numpy as np
from tick.hawkes import HawkesBasisKernels

hawkes_model = HawkesBasisKernels(kernel_support = 4)
ticks = [[np.array([1.,2.,3.,4.,5.])]]

hawkes_model = hawkes_model.fit(ticks)

Error:

RuntimeError                              Traceback (most recent call last)
<ipython-input-7-0a26049ca8d2> in <module>
      5 ticks = [[np.array([1.,2.,3.,4.,5.])]]
      6 
----> 7 hawkes_model = hawkes_model.fit(ticks)

~/.local/lib/python3.8/site-packages/tick/hawkes/inference/hawkes_basis_kernels.py in fit(self, events, end_times, baseline_start, amplitudes_start, basis_kernels_start)
    204         """
    205         LearnerHawkesNoParam.fit(self, events, end_times=end_times)
--> 206         self.solve(baseline_start=baseline_start,
    207                    amplitudes_start=amplitudes_start,
    208                    basis_kernels_start=basis_kernels_start)

~/.local/lib/python3.8/site-packages/tick/solver/base/solver.py in solve(self, *args, **kwargs)
    107     def solve(self, *args, **kwargs):
    108         self._start_solve()
--> 109         self._solve(*args, **kwargs)
    110         self._end_solve()
    111         return self.solution

~/.local/lib/python3.8/site-packages/tick/hawkes/inference/hawkes_basis_kernels.py in _solve(self, baseline_start, amplitudes_start, basis_kernels_start)
    260                 prev_basis_kernels = self.basis_kernels.copy()
    261 
--> 262             rel_ode = self._learner.solve(self.baseline, self.basis_kernels,
    263                                           self._amplitudes_2d,
    264                                           self.ode_max_iter, self.ode_tol)

~/.local/lib/python3.8/site-packages/tick/hawkes/inference/build/hawkes_inference.py in solve(self, mu, gdm, auvd, max_iter_gdm, max_tol_gdm)
    934     def solve(self, mu: 'ArrayDouble &', gdm: 'ArrayDouble2d &', auvd: 'ArrayDouble2d &', max_iter_gdm: 'ulong', max_tol_gdm: 'double') -> "double":
    935         r"""solve(HawkesBasisKernels self, ArrayDouble & mu, ArrayDouble2d & gdm, ArrayDouble2d & auvd, ulong max_iter_gdm, double max_tol_gdm) -> double"""
--> 936         return _hawkes_inference.HawkesBasisKernels_solve(self, mu, gdm, auvd, max_iter_gdm, max_tol_gdm)
    937 
    938     def get_kernel_support(self) -> "double":

RuntimeError: basis functions / gdm argument must be an array of shape (1, 10)

This error for some reason does not effect the example here, despite having the same type for ticks.

Jbollenbacher commented 3 years ago

This problem appears to occur only when n_basis=None (which is the default value). If you specify n_basis, then the error does not occur.