- Adicionados novos métodos do OpenBLAS:
Redução de matrizes
- ReduceToHessenberg — transforma uma matriz geral real ou complexa A de dimensão n por n na forma superior de Hessenberg B usando uma transformação ortogonal de similaridade: Q**T \* A \* Q = H. Função LAPACK GEHRD.
- ReflecHessenbergToQ — gera uma matriz ortogonal Q definida como o produto de n-1 refletores elementares de ordem n, retornados pela função ReduceToHessenberg: Q = H(1) H(2) . . . H(n-1). Função LAPACK ORGHR.
Cálculo de autovalores e autovetores
- EigenHessenbergSchurQ — calcula os autovalores da matriz de Hessenberg H e as matrizes T e Z da decomposição de Schur: H = Z T Z**T. Aqui, T é uma matriz quase triangular superior (forma de Schur) e Z é a matriz ortogonal de vetores de Schur. Função LAPACK HSEQR.
Solução de sistemas de equações lineares
- SylvesterEquationTriangular — resolve a equação de Sylvester para matrizes quase triangulares reais ou triangulares complexas: op(A)*X + X*op(B) = scale*C ou op(A)*X - X*op(B) = scale*C, onde op(A) = A ou A**T ou A**H, e A e B são matrizes triangulares superiores. Função LAPACK TRSYL.
- SylvesterEquationTriangularBlocked — resolve a equação de Sylvester para matrizes quase triangulares reais ou triangulares complexas: op(A)*X + X*op(B) = scale*C ou op(A)*X - X*op(B) = scale*C, onde op(A) = A, A**T ou A**H, e A e B são matrizes triangulares superiores. Função LAPACK TRSYL3. Esta é a versão em blocos (BLAS nível 3) da TRSYL. Até 5 vezes mais rápida, porém menos precisa.
Cálculos fatorados
- SylvesterEquationSchur — resolve a equação de Sylvester para matrizes quase triangulares reais ou triangulares complexas: A*X + X*B = C, onde A e B são matrizes triangulares superiores. A tem dimensão m por m, e B tem dimensão n por n; o lado direito C e a solução X têm dimensão m por n. Função LAPACK TRSYL.
- SylvesterEquationSchurBlocked — resolve a equação de Sylvester para matrizes quase triangulares reais ou triangulares complexas: A*X + X*B = C, onde A e B são matrizes triangulares superiores. A tem dimensão m por m, e B tem dimensão n por n; o lado direito C e a solução X têm dimensão m por n. Função LAPACK TRSYL3. Esta é a versão em blocos (BLAS nível 3) da TRSYL. Até 5 vezes mais rápida, porém menos precisa.
Cálculo de normas de matrizes para diferentes estruturas
- MatrixNorm — retorna o valor da norma 1, norma infinita, norma de Frobenius ou o maior valor absoluto de qualquer elemento de uma matriz retangular de forma geral. Função LAPACK LANGE.
- MatrixNormGeTrid — retorna o valor da norma 1, norma infinita, norma de Frobenius ou o maior valor absoluto de qualquer elemento de uma matriz tridiagonal geral. Função LAPACK LANGT.
- MatrixNormHessenberg — retorna o valor da norma 1, norma infinita, norma de Frobenius ou o maior valor absoluto de qualquer elemento de uma matriz superior de Hessenberg. Função LAPACK LANHS.
- MatrixNormSy — retorna o valor da norma 1, norma infinita, norma de Frobenius ou o maior valor absoluto de qualquer elemento de uma matriz simétrica real ou hermitiana complexa. Funções LAPACK LANSY e LANHE.
- MatrixNormComplexSy — retorna o valor da norma 1, norma infinita, norma de Frobenius ou o maior valor absoluto de qualquer elemento de uma matriz simétrica complexa (não hermitiana). Função LAPACK LANSY.
- MatrixNormSyTrid — retorna o valor da norma 1, norma infinita, norma de Frobenius ou o maior valor absoluto de qualquer elemento de uma matriz simétrica real ou hermitiana complexa tridiagonal. Funções LAPACK LANST e LANHT.
- MatrixNormTriangular — retorna o valor da norma 1, norma infinita, norma de Frobenius ou o maior valor absoluto de qualquer elemento de uma matriz trapezoidal de dimensão m por n ou de uma matriz triangular. Função LAPACK LANTR.
Análise de propriedades estruturais de matrizes
- IsSymmetric — verifica se uma matriz quadrada é simétrica.
- IsHermitian — verifica se uma matriz quadrada complexa é hermitiana.
- IsUpperTriangular — verifica se uma matriz quadrada é triangular superior.
- IsLowerTriangular — verifica se uma matriz quadrada é triangular inferior.
- IsTrapezoidal — verifica se uma matriz retangular (não quadrada) de dimensão m por n é trapezoidal superior ou inferior.
- IsUpperHessenberg — verifica se uma matriz quadrada é uma matriz de Hessenberg superior.
- IsLowerHessenberg — verifica se uma matriz quadrada é uma matriz de Hessenberg inferior.
- IsTridiagonal — verifica se uma matriz quadrada é tridiagonal.
- IsUpperBidiagonal — verifica se uma matriz quadrada é bidiagonal superior.
- IsLowerBidiagonal — verifica se uma matriz quadrada é bidiagonal inferior.
- IsDiagonal — verifica se uma matriz quadrada é diagonal.
- IsScalar — verifica se uma matriz quadrada é escalar.
- Adicionado o método Conjugate para matrizes e vetores complexos. Ele inverte o sinal da parte imaginária do número complexo e retorna a matriz ou vetor alterado.
- Reforçadas as regras de ocultação de métodos. Se a classe derivada possuir um método com o mesmo nome da classe base, agora, por padrão, será chamada a versão da classe derivada. Para acessar o método da base, será necessário usar qualificadores:
struct A
{
int y;
string func(double x)
{
return(__FUNCSIG__);
}
};
struct B : public A
{
string func(int x)
{
return(__FUNCSIG__);
}
};
void OnStart(void)
{
B b;
b.func(M_PI);
b.A::func(M_PI);
}
Isso facilita a leitura do código e elimina a ambiguidade que antes gerava apenas um aviso do compilador.
Antes, a compilação emitia o aviso:
deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
Agora, essa mudança está em vigor.
Durante alguns builds, será exibido no log um aviso se houver um método oculto mais apropriado pelos parâmetros.
call resolves to 'string B::func(int)' instead of 'string A::func(double)' due to new rules of method hiding
see declaration of function 'B::func'
see declaration of function 'A::func'
truncation of constant value from 'double(3.141592653589793)' to 'int(3)'
- Foi proibida a duplicação de nomes em um mesmo escopo. Por exemplo, anteriormente era possível declarar um parâmetro input e uma função com o mesmo nome no mesmo arquivo. Agora, essa duplicação não é mais permitida:
input int somename=42;
int somename(int x)
{
return(42);
}
- Adicionada verificação rigorosa de tipos de valores padrão em enumerações. Para parâmetros de função que recebem enum, agora é verificado não apenas o valor, mas também a correspondência exata do tipo:
int somename(ENUM_TIMEFRAMES TF=PERIOD_CURRENT);
int somename(ENUM_TIMEFRAMES TF=0)
{
return(42);
}
- Proibidos identificadores iguais em diferentes enumerações. Um identificador dentro de uma enumeração agora não pode se repetir em outra dentro do mesmo escopo:
enum A
{
Value
};
enum B
{
Value
};
void OnStart(void)
{
enum C
{
Value
};
}
Em escopos diferentes, nomes iguais ainda podem ser usados.
- Ativadas exigências rigorosas para funções-inicializadoras com template. Ao criar matrizes/vetores com essas funções, foram desativados:
- Tipagem automática de funções com template
- Valores padrão de parâmetros.
Agora é necessário informar explicitamente os parâmetros de template e todos os argumentos:
template<typename T>
void Initializer(matrix<T>& mat,int method=0);
matrix<double> A(10,10,Initializer,42);
matrix<double> A(10,10,Initializer<double>);
matrix<double> A(10,10,Initializer<double>,42);
- Aprimorado o suporte ao ONNX. Adicionada conversão implícita de tipo com sinal ao passar arrays do tipo ulong em funções, facilitando a integração do MQL5 com modelos ONNX.
OnnxSetInputShape( … , ulong\_array );
OnnxSetOutputShape( … , ulong\_array );
- Corrigida a exibição de tipos nos avisos sobre conversão implícita de strings.
- Atualizado o pacote de integração com Python. Para instalar a atualização, execute o comando:
pip install --upgrade MetaTrader5