From 76641fec747e06d57ac40d89b8dd1d27473ba20f Mon Sep 17 00:00:00 2001 From: Fredrik Bakke Date: Thu, 5 Oct 2023 14:54:10 +0200 Subject: [PATCH] Omstrukturering og forbedring av kvalitetskontroll (#166) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * forbedre robusthet og lesbarhet i `tester.sh` - Legger til konstanter for feilkoder for å forbedre lesbarheten og vedlikeholdbarheten. - Inkluderer en funksjon for å sjekke om nødvendige verktøy som csvlint og Python3 er installert. - Legger til en sjekk for å se om databasefilen eksisterer før skriptet kjøres. - Qvoterer variabler for å gjøre skriptet mer robust mot spesielle tegn i strenger. * legg til standard `.gitignore` * alle variabler engelsk `tester.sh` * stilér `test.py` * navnbytter for skript * flytt alle termtabell sjekker til python skript * autodetekter flere duplikate oversettelser * fiks detekterte duplikater * forenkel `standardize_comment` * bytt til github action * Hent kode* * fjern byggemedalje * CI installer python 3 * mindre forbedringer til kvalitetskontroll --- .github/workflows/qc.yml | 2 +- .gitignore | 181 +++++++++++++++++++++++++++++ .travis.yml | 13 --- .vscode/tasks.json | 4 +- README.md | 3 - skript/kjor_sjekker.sh | 39 +++++++ skript/test.py | 101 ----------------- skript/tester.sh | 50 -------- skript/valider_termtabell.py | 214 +++++++++++++++++++++++++++++++++++ verifiserte_termer.csv | 24 ++-- 10 files changed, 447 insertions(+), 184 deletions(-) create mode 100644 .gitignore delete mode 100644 .travis.yml create mode 100755 skript/kjor_sjekker.sh delete mode 100755 skript/test.py delete mode 100755 skript/tester.sh create mode 100755 skript/valider_termtabell.py diff --git a/.github/workflows/qc.yml b/.github/workflows/qc.yml index 258fa9f..6baf083 100644 --- a/.github/workflows/qc.yml +++ b/.github/workflows/qc.yml @@ -22,4 +22,4 @@ jobs: python-version: '3.x' - name: Termtabell kvalitetskontroll - run: bash ./skript/tester.sh + run: bash ./skript/kjor_sjekker.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9bb938 --- /dev/null +++ b/.gitignore @@ -0,0 +1,181 @@ +### Egendefinerte + +/csvlint + +### VS Code + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### Python + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2058212..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: generic - -cache: - directories: - - csvlint-v0.2.0-linux-amd64 - -before_script: - - wget - "https://github.com/Clever/csvlint/releases/download/0.2.0/csvlint-v0.2.0-linux-amd64.tar.gz" - - tar xvf csvlint-v0.2.0-linux-amd64.tar.gz - -script: - - bash ./skript/tester.sh diff --git a/.vscode/tasks.json b/.vscode/tasks.json index d0805d5..d7b7dc2 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,9 +5,9 @@ "tasks": [ { "label": "test", - "type": "shell", + "type": "process", "command": "bash", - "args": ["./skript/tester.sh"], + "args": ["./skript/kjor_sjekker.sh"], "group": { "kind": "test", "isDefault": true diff --git a/README.md b/README.md index f3d988e..82e331a 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,6 @@ Denne ordlista er opprettet for å være et hjelpemiddel slik at både studenter faglig ansatte lettere kan kommunisere om matematikk på norsk. Prosjektet er et samarbeid mellom NTNU, UiO og UiA og har mottatt støtte fra Språkrådet. -Status på tester: -[![Build Status](https://travis-ci.com/jfremstad/matematisk_ordliste.svg?branch=master)](https://travis-ci.com/jfremstad/matematisk_ordliste) - ### Har du innspill? Ordlistas termbase er under stadig utvikling, og det er ønskelig at flest mulig diff --git a/skript/kjor_sjekker.sh b/skript/kjor_sjekker.sh new file mode 100755 index 0000000..3ee0c7f --- /dev/null +++ b/skript/kjor_sjekker.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +DATABASE="./verifiserte_termer.csv" + +ERR_DB_NOT_FOUND=1 +ERR_PYTHON_NOT_FOUND=2 + +EXITCODE=0 + +# Function to check if a command exists +command_exists () { + command -v "$1" >/dev/null 2>&1 +} + +# Check if database exists +if [[ ! -f "${DATABASE}" ]]; then + echo "FEIL: Databasefilen '${DATABASE}' ikke funnet." + EXITCODE=$((EXITCODE | ERR_DB_NOT_FOUND)) + exit ${EXITCODE} +fi + +# Validate term table with python script +if command_exists python3; then + python3 ./skript/valider_termtabell.py "${DATABASE}" + # Capture the exit code of the Python script + PYTHON_SCRIPT_EXITCODE=$? + # OR it with the existing EXITCODE + EXITCODE=$((EXITCODE | PYTHON_SCRIPT_EXITCODE)) +else + echo "FEIL: Python3 ikke funnet." + EXITCODE=$((EXITCODE | ERR_PYTHON_NOT_FOUND)) +fi + +# Check if EXITCODE is 0 +if [[ ${EXITCODE} -eq 0 ]]; then + echo "Alle sjekker ble gjennomført uten feil." +fi + +exit ${EXITCODE} diff --git a/skript/test.py b/skript/test.py deleted file mode 100755 index 5379319..0000000 --- a/skript/test.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import csv -import sys - -lineBreak = "
" -numberOfLanguageColumns = 3 - -# Fjerner gjentatte mellomrom og trimmer endene - - -def trim(s): - return " ".join(s.split()) - - -# Returns a list of lists. Each list is one row. - - -def readCsv(filename): - data = [] - with open(filename, encoding="utf-8", errors="ignore") as csvfile: - reader = csv.reader(csvfile, delimiter=",") - for row in reader: - data.append(list(map(str.casefold, row))) - return list(filter(None, data)) # Remove empty rows - - -# Standardiserer en celle - - -def standardizeCell(cell): - # Fjern alternative linjebytter - cell = ( - cell.replace("\r\n", lineBreak) - .replace("\n", lineBreak) - .replace("
", lineBreak) - .replace("
", lineBreak) - .replace("

", lineBreak) - ) - # Del opp - synonyms = cell.split(lineBreak) - # Trim mellomrom - synonyms = map(trim, synonyms) - # Fjern tomme synonymer - synonyms = filter(lambda x: x != "", synonyms) - # Fjern duplikater - synonyms = set(synonyms) - # Sorter - synonyms = sorted(synonyms) - # Sett sammen - return lineBreak.join(synonyms) - - -# Sjekker om alle celler er standardiserte - - -def checkStandardized(data): - errors = [] - for r, row in enumerate(data): - for c in range(numberOfLanguageColumns): - std = standardizeCell(row[c]) - if std != row[c]: - errors.append((r, c, row[c], std)) - return errors - - -# Sjekk for duplikate rader ved ignorering av kommentar - - -def checkDuplicateRows(data): - rows = tuple(",".join(row[:numberOfLanguageColumns]) for row in data) - duplicates = set(row for row in rows if rows.count(row) > 1) - return duplicates - - -def main(): - exitCode = 0 - data = readCsv(sys.argv[1]) - - nonstandard = checkStandardized(data) - - if nonstandard: - exitCode |= 32 - print("\nFølgende endringer må gjøres (merk mulig fjerning av mellomrom):\n") - for r, c, error, correct in nonstandard: - print("Rad", r + 1, "kolonne", c + 1, ":", error, "-->", correct) - print() - - duplicateRows = checkDuplicateRows(data) - - if duplicateRows: - exitCode |= 64 - print("\nFølgende rader er duplikater opp til kommentar:\n") - for row in duplicateRows: - print(row) - - sys.exit(exitCode) - - -main() diff --git a/skript/tester.sh b/skript/tester.sh deleted file mode 100755 index 5644b27..0000000 --- a/skript/tester.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -DATABASE="./verifiserte_termer.csv" -EXITCODE=0 - -# Check if CSV is valid -# csvlint-v0.2.0-linux-amd64/csvlint "${DATABASE}" || EXITCODE=$((EXITCODE | 1)) - -EMPTYCOMMENT="$(grep ',\s\+$' ${DATABASE})" -if [[ ${EMPTYCOMMENT} ]]; then - echo "=====================================" - echo "== Følgende linjer har tom merknad ==" - echo "=====================================" - echo "${EMPTYCOMMENT}" - echo - EXITCODE=$((EXITCODE | 2)) -fi - -if [[ "$(grep -Ec "^\s*$" ${DATABASE})" -ne 0 ]]; then - echo "==============================" - echo "== Følgende linjer er tomme ==" - echo "==============================" - grep -n '^\s*$' "${DATABASE}" - echo - EXITCODE=$((EXITCODE | 4)) -fi - -DUPLICATES="$(sort ${DATABASE} | uniq -d)" -if [[ ${DUPLICATES} ]]; then - echo "=============================================" - echo "== Ordlista inneholder følgende duplikater ==" - echo "=============================================" - echo "${DUPLICATES}" - echo - EXITCODE=$((EXITCODE | 8)) -fi - -MISSINGQUOTES="$(grep -v ',\s\+$' ${DATABASE} | cut -d',' -f 4- | grep -vE '^$|^".*"$')" -if [[ ${MISSINGQUOTES} ]]; then - echo "==============================================" - echo "== Følgende merknader mangler anførselstegn ==" - echo "==============================================" - echo "${MISSINGQUOTES}" - echo - EXITCODE=$((EXITCODE | 16)) -fi - -# Execute more complicated python tests -python3 ./skript/test.py "${DATABASE}" - -exit ${EXITCODE} diff --git a/skript/valider_termtabell.py b/skript/valider_termtabell.py new file mode 100755 index 0000000..add8948 --- /dev/null +++ b/skript/valider_termtabell.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import csv +import sys +import re +from collections import defaultdict + +LINE_BREAK = "
" + +NUMBER_OF_COLUMNS = 4 +NUMBER_OF_LANGUAGE_COLUMNS = 3 +COMMENT_COLUMN = NUMBER_OF_LANGUAGE_COLUMNS + +ERR_INVALID_CSV = 128 +ERR_INCOMPLETE_ROW = 64 +ERR_NONSTANDARD_ROW = 32 +ERR_DUPLICATE_TRANSLATION = 16 + + +def trim(s): + """Removes repeated spaces and trims the ends of the string.""" + return " ".join(s.split()) + + +line_break_pattern = re.compile( + r"((\\r)?\\n|<\s*(br|BR)\s*/>|<\s*(br|BR)\s*>)" +) + + +def standardize_line_breaks(s): + return line_break_pattern.sub(LINE_BREAK, s) + + +def process_csv_row(row): + """Processes a CSV file's rows.""" + if len(row) < NUMBER_OF_COLUMNS: + return tuple(map(str.casefold, row[:NUMBER_OF_LANGUAGE_COLUMNS])) + else: + return tuple(map(str.casefold, row[:NUMBER_OF_LANGUAGE_COLUMNS])) + ( + ",".join(row[NUMBER_OF_LANGUAGE_COLUMNS:]), + ) + + +def read_csv(filename): + """Reads a CSV file and returns a list of lists, each representing a row.""" + with open(filename, encoding="utf-8") as csvfile: + raw_data = None + try: + reader = csv.reader( + csvfile, delimiter=",", quotechar='"', quoting=csv.QUOTE_NONE + ) + raw_data = tuple(reader) + except: + print("FEIL: ugyldig CSV-fil.") + sys.exit(ERR_INVALID_CSV) + data = list(map(process_csv_row, raw_data)) + return data + + +def check_incomplete_rows(data): + """Checks for incomplete rows.""" + return tuple( + i + for i, row in enumerate(data) + if len(row) < NUMBER_OF_COLUMNS + or any(cell.strip() == "" for cell in row[:NUMBER_OF_LANGUAGE_COLUMNS]) + ) + + +def standardize_cell(cell, c): + """Standardizes a cell's content.""" + if c < NUMBER_OF_LANGUAGE_COLUMNS: + return standardize_translation(cell, c) + elif c == COMMENT_COLUMN: + return standardize_comment(cell) + else: + raise ValueError(f"Column index {c} not recognized.") + + +def standardize_translation(translation, c): + """Standardizes a translation cell's content.""" + # Remove alternate line breaks + cell = standardize_line_breaks(translation) + # Split up + synonyms = cell.split(LINE_BREAK) + # Trim spaces + synonyms = map(trim, synonyms) + # Remove empty synonyms + synonyms = filter(lambda x: x != "", synonyms) + # Remove duplicates + synonyms = set(synonyms) + # Sort + synonyms = sorted(synonyms) + # Combine + return LINE_BREAK.join(synonyms) + + +def standardize_comment(comment): + """Standardizes a comment's contents.""" + comment = comment.strip().strip('"') + + if not comment: + return comment + + comment = standardize_line_breaks(comment) + + return '"' + comment + '"' + + +def check_standardized(data): + """Checks if all cells are standardized and returns a list of non-standard cells.""" + errors = [] + for r, row in enumerate(data): + for c in range(len(row)): + std = standardize_cell(row[c], c) + if std != row[c]: + errors.append((r, c, row[c], std)) + + return errors + + +def check_duplicate_translations(data): + """Checks for duplicate translations by searching for overlap in terms in every column.""" + duplicates_groups = [] + columns_to_rows = [defaultdict(set) for _ in range(NUMBER_OF_LANGUAGE_COLUMNS)] + + checked_rows = set() + + for i, row in enumerate(data): + if i in checked_rows: + continue + + possible_duplicates = set() + duplicate_group = [] + + # Update tracking and find the set of possible duplicates for this row + for c, cell in enumerate(row[:NUMBER_OF_LANGUAGE_COLUMNS]): + translation_set = set(cell.split(LINE_BREAK)) + for translation in translation_set: + possible_duplicates.update(columns_to_rows[c][translation]) + + # Add this row to the set of rows that have this translation in column c + columns_to_rows[c][translation].add(i) + + # Remove the row itself from possible duplicates + possible_duplicates.discard(i) + + for j in possible_duplicates: + other_row = data[j] + if all( + set(cell.split(LINE_BREAK)) & set(other_cell.split(LINE_BREAK)) + for cell, other_cell in zip( + row[:NUMBER_OF_LANGUAGE_COLUMNS], + other_row[:NUMBER_OF_LANGUAGE_COLUMNS], + ) + ): + duplicate_group.append((i, row)) + duplicate_group.append((j, other_row)) + checked_rows.add(i) + checked_rows.add(j) + + if duplicate_group: + duplicates_groups.append( + list(set(duplicate_group)) + ) # Remove duplicate tuples + + return duplicates_groups + + +def main(): + exit_code = 0 + + data = read_csv(sys.argv[1]) + + # Check for incomplete rows + incomplete_rows = check_incomplete_rows(data) + + if incomplete_rows: + exit_code |= ERR_INCOMPLETE_ROW + print(f"\nFEIL: følgende rader ({len(incomplete_rows)}) er ufullstendige:") + print(*(i + 1 for i in incomplete_rows), sep=", ") + + # Compare to standardization + nonstandard = check_standardized(data) + + if nonstandard: + exit_code |= ERR_NONSTANDARD_ROW + print(f"\nFEIL: følgende korreksjoner ({len(nonstandard)}) må gjøres:\n") + for r, c, error, correct in nonstandard: + print( + f"Rad {r + 1} kolonne {c + 1}:\n Nåværende: {error}\n Korrigert: {correct}" + ) + print() + + # Check for duplicate translations + duplicate_translations = check_duplicate_translations(data) + + if duplicate_translations: + exit_code |= ERR_DUPLICATE_TRANSLATION + print( + f"\nFEIL: følgende duplikate oversettelser ({len(duplicate_translations)}) ble funnet:\n" + ) + for g, duplicate_group in enumerate(duplicate_translations, 1): + print(f"Gruppe {g} av duplikater:") + for r, row in duplicate_group: + print(f"Rad {r + 1}: {','.join(row)}") + print() + + sys.exit(exit_code) + + +if __name__ == "__main__": + main() diff --git a/verifiserte_termer.csv b/verifiserte_termer.csv index de016fa..a2c0b2b 100644 --- a/verifiserte_termer.csv +++ b/verifiserte_termer.csv @@ -323,7 +323,7 @@ moritaekvivalens,moritaekvivalens,Morita equivalence, avhengig variabel,avhengig variabel,dependent variable, ikke-tom,ikkje-tom,non-empty, eksponentiell vekst,eksponentiell vekst,exponential growth, -spredningsplott,spreiingsplott,scatter diagram, +spredningsplott,spreiingsplott,scatter diagram
scatter plot, prøvetakingsfordeling,prøvetakingsfordeling,sampling distribution, polynomiell vekst,polynomiell vekst,polynomial growth, preknippe,preknippe,presheaf, @@ -710,7 +710,7 @@ differensial,differensial,differential, variabel,variabel,variable, fornyelsesteori,fornyingsteori,renewal theory, pivotelement,pivotelement,pivot element,"Forstavelsen pivot uttales [pivå:’]." -stokastisk variabel
tilfeldig variabel,stokastisk variabel
tilfeldig variabel,random variable
stochastic variable, +tilfeldig variabel,tilfeldig variabel,random variable,"Synonym: stokastisk variabel" reduktiv liegruppe,reduktiv liegruppe,reductive Lie group, derivert kategori,derivert kategori,derived category, tak,tak,roof, @@ -864,7 +864,7 @@ binæroperasjon,binæroperasjon,binary operation, integraltransformasjon,integraltransformasjon,integral transform, prinsipalverdi,prinsipalverdi,principal value, lengde,lengd,length, -normalfordeling,normalfordeling,normal distribution, +normalfordeling,normalfordeling,normal distribution,"Synonym: gaussfordeling" diagonalisere,diagonalisere,diagonalize, wronskideterminant,wronskideterminant,Wronski determinant,"Wronskideterminant kalles ofte bare Wronskian på engelsk." fullstendig regulært rom,fullstendig regulært rom,completely regular space, @@ -908,7 +908,7 @@ p-adisk heltall,p-adisk heiltal,p-adic integer, kryssprodukt,kryssprodukt,cross product
vector product, beregnbarhet,bereknbarheit,computability, delhypotese,delhypotese,subhypothesis, -stokastisk variabel,stokastisk variabel,stochastic variable, +stokastisk variabel,stokastisk variabel,stochastic variable,"Synonym: tilfeldig variabel" transendent funksjon,transendent funksjon,transcendental function, invers,invers,inverse, glidespeiling,glidespegling,glide reflection, @@ -929,7 +929,7 @@ ikosaeder,ikosaeder,icosahedron, derivasjon,derivasjon,derivation,"De engelske termene derivation og differentiation er ikke synonymer, selv om begge oversettes til det samme på norsk. En derivasjon er en en lineæravbildning som tilfredsstiller Leibniz' regel." analytisk funksjon,analytisk funksjon,analytic function, fourierkoeffisient,fourierkoeffisient,Fourier coefficient, -gaussfordeling
normalfordeling,gaussfordeling
normalfordeling,Gaussian distribution
normal distribution, +gaussfordeling,gaussfordeling,Gaussian distribution,"Synonym: normalfordeling" gradert,gradert,graded, algebraisk gruppe,algebraisk gruppe,algebraic group, homotopigruppe,homotopigruppe,homotopy group, @@ -1469,7 +1469,7 @@ kvadratur,kvadratur,quadrature, gaussisk kvadraturmetode,gaussisk kvadraturmetode,Gaussian quadrature method, konvergensorden,konvergensorden,order of convergence, skrittlengde
steglengde,skrittlengd
steglengd,stepsize, -ettskrittsmetode
ettstegsmetode,eittskrittsmetode
eittstegsmetode,single step method, +ettskrittsmetode
ettstegsmetode,eittskrittsmetode
eittstegsmetode,one step method
single step method, flerskrittsmetode
flerstegsmetode,fleirskrittsmetode
fleirstegsmetode,multistep method, diagonaldominant matrise,diagonaldominant matrise,diagonally dominant matrix, strengt diagonaldominant matrise,strengt diagonaldominant matrise,strictly diagonally dominant matrix, @@ -1804,7 +1804,7 @@ differensialgradert kategori,differensialgradert kategori,differential graded ca dg-algebra,dg-algebra,dg algebra,"Dg-algebra er en forkortelse for differensialgradert algebra." dg-modul,dg-modul,dg module,"Dg-modul er en forkortelse for differensialgradert modul." dg-kategori,dg-kategori,dg category,"Dg-kategori er en forkortelse for differensialgradert kategori." -restklasse,restklasse,coset
residue class, +restklasse
sideklasse,restklasse
sideklasse,coset
residue class,"Både restklasse og sideklasse kan brukes på norsk, men restklasse er vesentlig mer utbredt." restklassekropp,restklassekropp,residue class field, ikke-voksende,ikkje-veksande,non-increasing, glissen matrise,glisen matrise,sparse matrix, @@ -2306,7 +2306,6 @@ ganging
multiplikasjon,ganging
multiplikasjon,multiplication, multiplikativ gruppe,multiplikativ gruppe,multiplicative group, divisor,divisor,divisor,"I mange tilfeller kan termene divisor og faktor brukes synonymt." faktor,faktor,factor,"I mange tilfeller kan termene faktor og divisor brukes synonymt." -restklasse
sideklasse,restklasse
sideklasse,coset
residue class,"Både restklasse og sideklasse kan brukes på norsk, men restklasse er vesentlig mer utbredt." legendresymbol,legendresymbol,Legendre symbol, dg-funktor,dg-funktor,dg functor,"Dg-funktor er en forkortelse for differensialgradert funktor." pivot,pivot,pivot,"Ordklasse: substantiv
Uttale: [pivå:´]
Genus: hankjønn" @@ -2525,7 +2524,8 @@ lognormalfordeling,lognormalfordeling,lognormal distribution, cauchyfordeling,cauchyfordeling,Cauchy distribution, dobbel-eksponentialfordeling
laplacefordeling,dobbel-eksponentialfordeling
laplacefordeling,double exponential distribution
Laplace distribution, logistisk fordeling,logistisk fordeling,logistical distribution, -invers gaussfordeling
invers normalfordeling,invers gaussfordeling
invers normalfordeling,inverse Gaussian distribution
inverse normal distribution, +invers gaussfordeling,invers gaussfordeling,inverse Gaussian distribution,"Synonym: invers normalfordeling" +invers normalfordeling,invers normalfordeling,inverse normal distribution,"Synonym: invers gaussfordeling" invers gammafordeling,invers gammafordeling,inverse gammadistribution, Jensens ulikhet,Jensens ulikskap,Jensen's inequality, skarp ulikhet,skarp ulikskap,tight inequality, @@ -2811,7 +2811,7 @@ venstrederivert,venstrederivert,left derivative,"Oversettelsen gjelder bruk i nu nedrederivert,nedrederivert,lower derivative, øvre semikontinuitet,øvre semikontinuitet,upper semicontinuity, nedre semikontinuitet,nedre semikontinuitet,lower semicontinuity, -linjeintegral,linjeintegral,curve integral
line integral
path integral, +linjeintegral,linjeintegral,curve integral
line integral,"Synonym: veiintegral" endelig variasjon,endeleg variasjon,bounded variation, perturbasjon,perturbasjon,perturbation, neglisjerbar,neglisjerbar,negligible, @@ -2864,8 +2864,6 @@ nivåkurve,nivåkurve,level curve, fargeplott,fargeplott,heat map
heatmap, fasediagram,fasediagram,phase diagram, bodeplott,bodeplott,Bode plot, -spredningsplott,spreiingsplott,scatter diagram
scatter plot, -ettskrittsmetode
ettstegsmetode,eittskrittsmetode
eittstegsmetode,one step method
single step method, mellomverdisetningen,mellomverdisetninga,intermediate value theorem,"Enkelte skiller mellom skjæringssetningen og mellomverdisetningen, der førstnevnte anses som et spesialtilfelle av sistnevnte. Mellomverdisetningen sier at en kontinuerlig reell funksjon på et lukket og begrenset intervall antar alle verdier mellom funksjonsverdiene i endepunktene, mens skjæringssetningen kan formuleres som at dersom funksjonsverdiene til en slik funksjon har motsatte fortegn i endepunktene, så har funksjonen et nullpunkt i intervallet. Skjæringssetningen benyttes ofte om begge disse teoremene." skrå asymptote,skrå asymptote,oblique asymptote
slant asymptote, lukket under utvidelser,lukka under utvidingar,closed under extensions,"Synonym: utvidelseslukket" @@ -2929,7 +2927,6 @@ uendelig løkkerom,uendeleg lykkjerom,infinite loop space, spiss-,spiss-,cuspidal,"Denne termen brukes som et adjektiv på engelsk, men som forstavelse på norsk." skjelett-
skjelettal-,skjelett-
skjelettal-,skeletal,"Denne termen brukes som et adjektiv på engelsk, men som forstavelse på norsk." veiintegral,vegintegral,path integral,"Synonym: linjeintegral" -linjeintegral,linjeintegral,line integral,"Synonym: veiintegral" konturintegral
kurveintegral
omrissintegral,konturintegral
kurveintegral
omrissintegral,contour integral, kovariantderivert,kovariantderivert,covariant derivative, kartesisk kvadrat,kartesisk kvadrat,Cartesian square,"Synonym: pullbackkvadrat" @@ -3021,7 +3018,6 @@ tredjegradsligning,tredjegradslikning,cubic equation, fjerdegradspolynom,fjerdegradspolynom,quartic polynomial, fjerdegradsligning,fjerdegradslikning,quartic equation, femtegradspolynom,femtegradspolynom,quintic polynomial, -femtegradsligning,femtegradslikning,quintic equation, klassifikasjonsrom,klassifikasjonsrom,classification space, klassifiseringsrom,klassifiseringsrom,classifying space, vinkelhastighet,vinkelhastigheit,angular velocity,