Skip to content
This repository has been archived by the owner on Nov 29, 2023. It is now read-only.

Automatisierte Herleitung von Optional Annotations #443

Closed
GideonKoenig opened this issue Apr 22, 2022 · 3 comments · Fixed by #473
Closed

Automatisierte Herleitung von Optional Annotations #443

GideonKoenig opened this issue Apr 22, 2022 · 3 comments · Fixed by #473
Assignees
Labels
enhancement 💡 New feature or request

Comments

@GideonKoenig
Copy link
Contributor

GideonKoenig commented Apr 22, 2022

Is your feature request related to a problem? Please describe

Bisher müssen Annotations von Hand markiert werden.

Desired solution

Die Analyse der Daten, die in Form der usage.json und api.json Datei gegeben sind, soll daher nun automatisch geschehen und die Optional Annotations sollen als Teil der annotations.json datei exportiert werden.

Mehr Informationen zu den Details sind hier zu finden.

Additional context

Die Analazye eines Paramters ergeben das einer der Werte "überdurchschnittlich" oft verwendet wird.
Hier kann beispielweise die Anzahl der Aufrufe der beiden meist verwendeten Werte verglichen werden.

Der am meisten verwendete Wert sollte signifikant häufiger auftreten.
Sei n = Anzahl der Paramteter Werte.
Sei m die Anzahl der Aufrufe.
Die Differenz zwischen den Aufrufen des am meisten verwendete Wert und des zweit meist verwendeten Wert sollte dabei nicht kleiner als m/n sein.

Dieses Kriterium gilt als Orientierung und nicht als finale Bedingung. Das Kriterium muss leicht ersetzbar sein.

Implementations Informationen

In _generate_annotations.py:
def __get_optional_annotations(usages: UsageStore, api: API) -> dict["optionals", dict[str, dict[str, str]]]:
Rückgabetyp siehe Kommentar von Lars.
Der Aufruf soll anschließend den anderen in generate_annotations() beigefügt werden.

Edit: Change 2m/n to m/n since the first formula would not work for n=2.

@GideonKoenig GideonKoenig added the enhancement 💡 New feature or request label Apr 22, 2022
@lars-reimann
Copy link
Member

lars-reimann commented Apr 22, 2022

JSON-Format für erzeugte Annotationen (wie @Constant):

{
  "optionals": {
    "sklearn/sklearn._config/config_context/working_memory": {
      "target": "sklearn/sklearn._config/config_context/working_memory",
      "defaultType": "string",
      "defaultValue": "bla"
    }
  }
}

@lars-reimann
Copy link
Member

Usage-Daten auf sciebo: https://uni-bonn.sciebo.de/f/1825964771

@GideonKoenig
Copy link
Contributor Author

GideonKoenig commented Apr 22, 2022

from __future__  import annotations
from enum import Enum, auto

def __get_parameter_type(values: list[tuple[str, int]]) -> (ParameterType, str):
    if len(values) == 0:
        return ParameterType.Unused, None
    elif len(values) == 1:
        return ParameterType.Constant, values[0][0]

    n = len(values)
    m = sum([count for value, count in values])

    seconds_most_used_value, most_used_value = sorted(values, key=lambda tup: tup[1])[-2:]

    if most_used_value[1] - seconds_most_used_value[1] <= m/n:
        return ParameterType.Required, None
    else:
        return ParameterType.Optional, most_used_value[0]


class ParameterType(Enum):
    Constant = 0
    Optional = 1
    Required = 2
    Unused = 3

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement 💡 New feature or request
Projects
None yet
4 participants