A maior parte da minha programação são códigos de pesquisa pontuais em C para uso próprio. Nunca distribuí nenhum código para outros colaboradores que não sejam colaboradores próximos. Eu desenvolvi um algoritmo que estou publicando em uma revista científica. Desejo fornecer o código fonte e talvez o código executável no suplemento online do artigo. Um colega solicitou que eu fizesse uma generalização no algoritmo que exigia que eu escrevesse em C ++ (ack!) E que exige que eu resolva pequenos sistemas lineares densos. Se eu conseguir obter uma base de usuários para o algoritmo, será em parte porque a barra de entrada para usá-lo é baixa (como no chão). Usuários em potencial não instalam bibliotecas etc. para usar o código. Quero que o código seja totalmente independente e livre de qualquer licença. Eu poderia simplesmente escrever meu próprio solucionador tirando algo de Golub e van Loan, mas prefiro usar um solucionador de baunilha que alguém já tenha escrito, se houver algum por aí. Sugestões apreciadas. Obrigado!
fonte
Respostas:
Eu sugeriria duplicar exatamente a interface Lapack para a função que você precisa, provavelmente você só precisa
dgesv
. Dessa forma, as pessoas que possuem o Lapack instalado podem simplesmente criar um link para ele e ele simplesmente funcionará. Para pessoas que não possuem o Lapack instalado, você fornece sua própria implementação simples dessa função ou, possivelmente, a implementa usando Eigen ou FLENS, conforme sugerido por outros.Na terra de Fortran, a biblioteca Lapack é tão padrão que a maioria das pessoas simplesmente a usa e é isso, em vez de fornecer suas próprias implementações.
fonte
Um erro muito antigo que muitas pessoas cometem ao iniciar a computação científica está assumindo que você precisa escrever todo o seu código no mesmo idioma. Eu acho que isso se deve em grande parte a razões históricas, quando não ficou claro como fazer com que os programas compilados se comuniquem entre si, mesmo nas versões do mesmo compilador. Dito isto, neste caso, se você estiver usando C ++ de qualquer maneira, existem várias bibliotecas de modelos muito boas de cabeçalho C ++ que podem atender às suas necessidades.
Como você está distribuindo seu código por razões acadêmicas e gostaria de incorporar um solucionador de álgebra linear denso em seu código, eu recomendo fortemente que você considere Eigen . O Eigen foi licenciado sob a Mozilla Public License e é uma biblioteca somente de cabeçalho. Isso significa que você pode distribuir o Eigen com o seu código na forma de origem (isso não impõe restrições de licenciamento ao seu código) e você terá acesso a seus recursos gerais, incluindo solucionadores lineares densos e extremamente eficientes. Como o GertVdE menciona, você tem várias outras opções .
fonte
Se você deseja um solucionador confiável para sistemas de equações lineares, recomendo o FLENS . Ele contém uma reimplementação exata do LAPACK (até reproduz os mesmos erros de arredondamento que o LAPACK se uma implementação BLAS de thread único for usada). Isso é verdade para todos funções FLENS-LAPACK (junto com as funções utilitárias, cerca de 100 rotinas).
O FLENS está sob uma licença BSD e, portanto, permite ser incorporado em produtos proprietários.
FLENS é apenas cabeçalho e, se você precisar apenas de um subconjunto de FLENS, posso fornecer uma versão simplificada que contém apenas as funções necessárias. O FLENS vem com sua própria implementação de referência BLAS. Mas, opcionalmente, seus usuários podem vincular-se a bibliotecas BLAS otimizadas, como ATLAS, OpenBLAS ou GotoBALS. Para matrizes grandes, isso proporciona um ganho de desempenho de cerca de 40% em comparação com o Eigen.
E sim, Eigen também usa o conjunto de testes LAPACK para verificar seus resultados. Eles fazem isso para 3 funções (Lu, Cholesky e Autovalores / vetores de uma matriz simétrica). No entanto, o cálculo de autovalores / vetores de uma matriz não simétrica falharia no conjunto de testes LAPACK.
Disclaimer: Sim, FLENS é meu bebê! Isso significa que codifiquei cerca de 95% e todas as linhas de código valeram a pena.
fonte