from enum import IntEnum
from typing import overload, NewType, Optional, Tuple

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.TColgp import *
from OCC.Core.TColStd import *
from OCC.Core.GeomAbs import *
from OCC.Core.math import *


class plib:
    @staticmethod
    def Bin(N: int, P: int) -> float: ...
    @overload
    @staticmethod
    def CoefficientsPoles(Coefs: TColgp_Array1OfPnt, WCoefs: TColStd_Array1OfReal, Poles: TColgp_Array1OfPnt, WPoles: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def CoefficientsPoles(Coefs: TColgp_Array1OfPnt2d, WCoefs: TColStd_Array1OfReal, Poles: TColgp_Array1OfPnt2d, WPoles: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def CoefficientsPoles(Coefs: TColStd_Array1OfReal, WCoefs: TColStd_Array1OfReal, Poles: TColStd_Array1OfReal, WPoles: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def CoefficientsPoles(dim: int, Coefs: TColStd_Array1OfReal, WCoefs: TColStd_Array1OfReal, Poles: TColStd_Array1OfReal, WPoles: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def CoefficientsPoles(Coefs: TColgp_Array2OfPnt, WCoefs: TColStd_Array2OfReal, Poles: TColgp_Array2OfPnt, WPoles: TColStd_Array2OfReal) -> None: ...
    @staticmethod
    def ConstraintOrder(NivConstr: int) -> GeomAbs_Shape: ...
    @staticmethod
    def EvalCubicHermite(U: float, DerivativeOrder: int, Dimension: int) -> Tuple[int, float, float, float, float]: ...
    @staticmethod
    def EvalLagrange(U: float, DerivativeOrder: int, Degree: int, Dimension: int) -> Tuple[int, float, float, float]: ...
    @overload
    @staticmethod
    def EvalLength(Degree: int, Dimension: int, U1: float, U2: float) -> Tuple[float, float]: ...
    @overload
    @staticmethod
    def EvalLength(Degree: int, Dimension: int, U1: float, U2: float, Tol: float) -> Tuple[float, float, float]: ...
    @staticmethod
    def EvalPoly2Var(U: float, V: float, UDerivativeOrder: int, VDerivativeOrder: int, UDegree: int, VDegree: int, Dimension: int) -> Tuple[float, float]: ...
    @staticmethod
    def EvalPolynomial(U: float, DerivativeOrder: int, Degree: int, Dimension: int) -> Tuple[float, float]: ...
    @overload
    @staticmethod
    def GetPoles(FP: TColStd_Array1OfReal, Poles: TColgp_Array1OfPnt) -> None: ...
    @overload
    @staticmethod
    def GetPoles(FP: TColStd_Array1OfReal, Poles: TColgp_Array1OfPnt, Weights: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def GetPoles(FP: TColStd_Array1OfReal, Poles: TColgp_Array1OfPnt2d) -> None: ...
    @overload
    @staticmethod
    def GetPoles(FP: TColStd_Array1OfReal, Poles: TColgp_Array1OfPnt2d, Weights: TColStd_Array1OfReal) -> None: ...
    @staticmethod
    def HermiteCoefficients(FirstParameter: float, LastParameter: float, FirstOrder: int, LastOrder: int, MatrixCoefs: math_Matrix) -> bool: ...
    @staticmethod
    def HermiteInterpolate(Dimension: int, FirstParameter: float, LastParameter: float, FirstOrder: int, LastOrder: int, FirstConstr: TColStd_Array2OfReal, LastConstr: TColStd_Array2OfReal, Coefficients: TColStd_Array1OfReal) -> bool: ...
    @staticmethod
    def JacobiParameters(ConstraintOrder: GeomAbs_Shape, MaxDegree: int, Code: int) -> Tuple[int, int]: ...
    @staticmethod
    def NivConstr(ConstraintOrder: GeomAbs_Shape) -> int: ...
    @staticmethod
    def NoDerivativeEvalPolynomial(U: float, Degree: int, Dimension: int, DegreeDimension: int) -> Tuple[float, float]: ...
    @staticmethod
    def NoWeights() -> TColStd_Array1OfReal: ...
    @staticmethod
    def NoWeights2() -> TColStd_Array2OfReal: ...
    @staticmethod
    def RationalDerivative(Degree: int, N: int, Dimension: int, All: Optional[bool] = True) -> Tuple[float, float]: ...
    @staticmethod
    def RationalDerivatives(DerivativesRequest: int, Dimension: int) -> Tuple[float, float, float]: ...
    @overload
    @staticmethod
    def SetPoles(Poles: TColgp_Array1OfPnt, FP: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def SetPoles(Poles: TColgp_Array1OfPnt, Weights: TColStd_Array1OfReal, FP: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def SetPoles(Poles: TColgp_Array1OfPnt2d, FP: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def SetPoles(Poles: TColgp_Array1OfPnt2d, Weights: TColStd_Array1OfReal, FP: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def Trimming(U1: float, U2: float, Coeffs: TColgp_Array1OfPnt, WCoeffs: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def Trimming(U1: float, U2: float, Coeffs: TColgp_Array1OfPnt2d, WCoeffs: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def Trimming(U1: float, U2: float, Coeffs: TColStd_Array1OfReal, WCoeffs: TColStd_Array1OfReal) -> None: ...
    @overload
    @staticmethod
    def Trimming(U1: float, U2: float, dim: int, Coeffs: TColStd_Array1OfReal, WCoeffs: TColStd_Array1OfReal) -> None: ...
    @staticmethod
    def UTrimming(U1: float, U2: float, Coeffs: TColgp_Array2OfPnt, WCoeffs: TColStd_Array2OfReal) -> None: ...
    @staticmethod
    def VTrimming(V1: float, V2: float, Coeffs: TColgp_Array2OfPnt, WCoeffs: TColStd_Array2OfReal) -> None: ...

class PLib_Base(Standard_Transient):
    def D0(self, U: float, BasisValue: TColStd_Array1OfReal) -> None: ...
    def D1(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal) -> None: ...
    def D2(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal, BasisD2: TColStd_Array1OfReal) -> None: ...
    def D3(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal, BasisD2: TColStd_Array1OfReal, BasisD3: TColStd_Array1OfReal) -> None: ...
    def ReduceDegree(self, Dimension: int, MaxDegree: int, Tol: float) -> Tuple[float, int, float]: ...
    def ToCoefficients(self, Dimension: int, Degree: int, CoeffinBase: TColStd_Array1OfReal, Coefficients: TColStd_Array1OfReal) -> None: ...
    def WorkDegree(self) -> int: ...

class PLib_DoubleJacobiPolynomial:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, JacPolU: PLib_JacobiPolynomial, JacPolV: PLib_JacobiPolynomial) -> None: ...
    def AverageError(self, Dimension: int, DegreeU: int, DegreeV: int, dJacCoeff: int, JacCoeff: TColStd_Array1OfReal) -> float: ...
    def MaxError(self, Dimension: int, MinDegreeU: int, MaxDegreeU: int, MinDegreeV: int, MaxDegreeV: int, dJacCoeff: int, JacCoeff: TColStd_Array1OfReal, Error: float) -> float: ...
    def MaxErrorU(self, Dimension: int, DegreeU: int, DegreeV: int, dJacCoeff: int, JacCoeff: TColStd_Array1OfReal) -> float: ...
    def MaxErrorV(self, Dimension: int, DegreeU: int, DegreeV: int, dJacCoeff: int, JacCoeff: TColStd_Array1OfReal) -> float: ...
    def ReduceDegree(self, Dimension: int, MinDegreeU: int, MaxDegreeU: int, MinDegreeV: int, MaxDegreeV: int, dJacCoeff: int, JacCoeff: TColStd_Array1OfReal, EpmsCut: float) -> Tuple[float, int, int]: ...
    def TabMaxU(self) -> TColStd_HArray1OfReal: ...
    def TabMaxV(self) -> TColStd_HArray1OfReal: ...
    def U(self) -> PLib_JacobiPolynomial: ...
    def V(self) -> PLib_JacobiPolynomial: ...
    def WDoubleJacobiToCoefficients(self, Dimension: int, DegreeU: int, DegreeV: int, JacCoeff: TColStd_Array1OfReal, Coefficients: TColStd_Array1OfReal) -> None: ...

class PLib_HermitJacobi(PLib_Base):
    def __init__(self, WorkDegree: int, ConstraintOrder: GeomAbs_Shape) -> None: ...
    def AverageError(self, Dimension: int, NewDegree: int) -> Tuple[float, float]: ...
    def D0(self, U: float, BasisValue: TColStd_Array1OfReal) -> None: ...
    def D1(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal) -> None: ...
    def D2(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal, BasisD2: TColStd_Array1OfReal) -> None: ...
    def D3(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal, BasisD2: TColStd_Array1OfReal, BasisD3: TColStd_Array1OfReal) -> None: ...
    def MaxError(self, Dimension: int, NewDegree: int) -> Tuple[float, float]: ...
    def NivConstr(self) -> int: ...
    def ReduceDegree(self, Dimension: int, MaxDegree: int, Tol: float) -> Tuple[float, int, float]: ...
    def ToCoefficients(self, Dimension: int, Degree: int, HermJacCoeff: TColStd_Array1OfReal, Coefficients: TColStd_Array1OfReal) -> None: ...
    def WorkDegree(self) -> int: ...

class PLib_JacobiPolynomial(PLib_Base):
    def __init__(self, WorkDegree: int, ConstraintOrder: GeomAbs_Shape) -> None: ...
    def AverageError(self, Dimension: int, NewDegree: int) -> Tuple[float, float]: ...
    def D0(self, U: float, BasisValue: TColStd_Array1OfReal) -> None: ...
    def D1(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal) -> None: ...
    def D2(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal, BasisD2: TColStd_Array1OfReal) -> None: ...
    def D3(self, U: float, BasisValue: TColStd_Array1OfReal, BasisD1: TColStd_Array1OfReal, BasisD2: TColStd_Array1OfReal, BasisD3: TColStd_Array1OfReal) -> None: ...
    def MaxError(self, Dimension: int, NewDegree: int) -> Tuple[float, float]: ...
    def MaxValue(self, TabMax: TColStd_Array1OfReal) -> None: ...
    def NivConstr(self) -> int: ...
    def Points(self, NbGaussPoints: int, TabPoints: TColStd_Array1OfReal) -> None: ...
    def ReduceDegree(self, Dimension: int, MaxDegree: int, Tol: float) -> Tuple[float, int, float]: ...
    def ToCoefficients(self, Dimension: int, Degree: int, JacCoeff: TColStd_Array1OfReal, Coefficients: TColStd_Array1OfReal) -> None: ...
    def Weights(self, NbGaussPoints: int, TabWeights: TColStd_Array2OfReal) -> None: ...
    def WorkDegree(self) -> int: ...

# harray1 classes
# harray2 classes
# hsequence classes

