#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Diese Datei soll NUR importiert (mit import Aufgabenkontrolle12 oder from 
# Aufgabenkontrolle12 import ...), aber WEDER bearbeitet NOCH kopiert werden!

import numpy as np

####
def TestOrthoL2(liste):
    print('Teste Orthonormalität der Basispolynome bezüglich des L2-Skalarprodukts:')
    m = len(liste)
    for i in range(m):
        if not np.allclose((liste[i]*liste[i]).integral(-1,1), 1):
            print('Test ist fehlgeschlagen!')
            return
        for j in range(i+1, m):
            if not np.allclose((liste[i]*liste[j]).integral(-1,1), 0):
                print('Test ist fehlgeschlagen!')
                return
    print('Test war erfolgreich!')
    return


####
def QTbTest(testfunktion):
    m, n = 20, 15
    print(f'Ihre Funktion wird jetzt mit einer ({m}x{m})- '\
          +f'und einer ({m}x{n})-Matrix getestet:');
    t = 0
    for mm, nn in zip([m, m], [m, n]):   
        Vtest = np.tril(np.random.rand(mm, nn))
        Vtest = Vtest/np.linalg.norm(Vtest, axis=0)
        btest = np.random.rand(mm,1)
        Qb1 = testfunktion(Vtest, btest)
        Qb2 = _Qblang(Vtest, btest)
        if np.allclose(Qb1, Qb2):
            t += 1
    print('{0} von {1} Tests erfolgreich'.format(t, 2));
    
def _Qblang(V, b):
    m, n = V.shape
    QT = np.eye(m)
    for k in range(n):
        v = V[k:, [k]]
        Qk = np.eye(m)
        Qk[k:, k:] = np.eye(m-k) - 2*(v @ v.T)
        QT = Qk @ QT
    return QT@b

