Skip to content

Center distance bug for metric = 1 or metric = np.inf #1

@GottiPaolo

Description

@GottiPaolo

Premessa

Ciao Riccardo,
mi chiamo Paolo ed ho appena iniziato la mia tesi magistrale con Erb.
Dovrei seguire il tuo stesso argomento quindi mi sono studiato la tua tesi e sto prendendo confidenza con il tuo codice. Un lavoro molto denso, complimenti.
Ho notato alcune piccole incongruenze che ti segnalo nel caso tu stia tenendo attivo il progetto.
Fammi sapere se ti fa piacere che ti segnali quello che incontro (oppure se hai chiuso questo progetto) e in che modalità preferisci che te le segnali (issue su GitHub, privatamente etc.).
Fammi anche sapere se per caso fosse possibile contattarti per alcune delucidazioni in caso di necessità, ma spero non ci sia bisogno.
In caso la mia mail universitaria è paolo.gotti@studenti.unipd.it

Contenuto

nella funzione center_distance del modulo image il calcolo viene effettuato lungo axis = 0 (singoli nodi) invece di axis = 1 (variabili geometriche). Immagino sia semplicemente un typo dato che negli altri casi è riportato correttamente.

Altre segnalazioni

Abbozzo qui, ma se preferisci un approccio ordinato apro una issue per ogni segnalazione

  • Incongruenza tra self.metric e metric in BinaryWedgePartitioningTree.wedgelet_encode. metric viene assegnata come variabile dell'oggetto self.metric: float = 2 if metric is None else metric ma poi in tutte le funzioni viene passata direttamente metric. Non genera errori direttamente ma molto confusionale e soprattuto bisogna verificare la coerenza nell'assegnazione nel caso metric non sia specificato (metric = None)
  • in graph.py nell'init della classe BinaryWedgePartitioningTree ad un certo punto si esegue il reshape (riga 221) della media self.mean_signal[: self.initial_partition_size].reshape((-1, 1)) questo è necessario solo se il segnale è unidimensionale, altrimenti non è necessario, anzi da proprio errore. A tal proposito suggerisco self.wavelet_coefficients[: self.initial_partition_size, :, 0] = ( self.mean_signal[: self.initial_partition_size].reshape((-1, 1)) if signal.ndim == 1 else self.mean_signal[: self.initial_partition_size])
  • Incontro un errore nel caso provi a generare partizioni molto fini. Non sono ancora riuscito ad identificarne di preciso la causa, ma credo che abbia a che fare con casi limite (partizioni di dimensione 1 oppure selezione casuale di nodi centrali) per riprodurre prova
    • im = Image.open("img/michael-kyule-etgNEj4M5Ew-unsplash.jpg")
    • nodes, signal, width, height = GWI.to_signal(im)
    • BWP: GWI.BinaryWedgePartitioningTree = GWI.BinaryWedgePartitioningTree(nodes, signal, 1, max_partition_size=500_000)
    • BWP.wedgelet_encode(signal, method="RA", method_parameter=1, tolerance=1e-5, max_partition_size= 500_000)
    • Dopo qualche tempo di calcoli senza errore (46s nel mio caso) ottengo IndexError: index 0 is out of bounds for axis 0 with size 0 alla riga 230 center_index: int = int(np.flatnonzero(current_partition == center_node)[0])
    • Probabilmente è dovuto al fatto che tutti gli aggiornamenti importatnti vengono fatti if error_new <= max_error: (riga 334-335) ma alla riga 374 self.partition_size += 1 viene eseguito a prescindere. In un caso limite dove l'errore varia davvero poco potrebbe risultare (per errori di approssimazione) error_new > max_error e dunque viene saltato lo split ma viene comunque (erroneamente) aumentato il conteggio delle partizioni. Ammetto però che è un bug che devo investigare ulteriormente.

Ovviamente queste segnalazioni sono interamente a scopo costruttivo, e sono finezze rispetto al grande lavoro che hai fatto!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions