Documentando a lógica matemática no código

19

Às vezes, embora não frequentemente, tenho que incluir lógica matemática no meu código. Os conceitos usados ​​são geralmente muito simples, mas o código resultante não é - muitas variáveis ​​com objetivos pouco claros e algumas operações com intenções não tão óbvias. Não quero dizer que o código seja ilegível ou impossível de manter, apenas que é muitíssimo mais difícil de entender do que o problema real de matemática. Tento comentar as partes mais difíceis de entender, mas há o mesmo problema em apenas codificá-las - o texto não tem o poder expressivo da matemática .

Estou procurando uma maneira mais eficiente e fácil de entender de explicar a lógica por trás de parte do código complexo, de preferência no próprio código. Eu considerei o TeX - escrever a documentação e gerá-la separadamente do código. Mas então eu teria que aprender TeX, e a documentação não estará no próprio código. Outra coisa em que pensei foi tirar uma foto das notações matemáticas, equações e diagramas escritos em papel / quadro branco e incluí-los no javadoc.

Existe uma maneira mais simples e clara?



PS A atribuição de nomes descritivos (em timeOfFirstEventvez de t1) às variáveis ​​torna o código mais detalhado e ainda mais difícil de ler.

jmruc
fonte
5
Aprender TeX não é tão difícil assim. Se você tiver seu código on-line em qualquer lugar, o MathJax o imprimirá em pouco tempo. Lembre-se de que existem idiomas como HAL / S em que suas preocupações foram repetidas há muito tempo.
Deer Hunter
4
Não para tocar minha própria buzina, mas aqui está um exemplo: meta.stackexchange.com/a/49787/141513 A idéia é escrevê-la para que alguém que olhe para ela possa entender o que faz, mesmo que não entenda. a matemática por trás disso. Um bom nome de função / variável e um simples comentário ou dois são geralmente suficientes para fazer isso.
BlueRaja - Danny Pflughoeft

Respostas:

32

A coisa certa a se fazer nessas circunstâncias é implementar o algoritmo, a fórmula ou o que quer que seja exatamente com os mesmos nomes de variáveis ​​da fonte primária do mundo real (na medida em que a linguagem de programação permitir isso) e ter um comentário sucinto acima dizendo algo como "computação à distância de Levenshtein, como descrito em [Knuth1968]", onde a citação se vincula a uma descrição facilmente acessível da matemática.

(Se você não tem essa referência, mas sua matemática é sólida e útil, talvez você deva publicá-la. Basta dizer.)

Kilian Foth
fonte
4
@ JustinC não, eu acho que ele significa os mesmos nomes de variáveis, ou seja, se diz que y = m*x + cvocê usa m, x e c como variáveis
jk.
5
@ JustinC eu quis dizer: use apenas os nomes de variáveis ​​e constantes que estão na publicação - geralmente esses são nomes de uma letra como n, f, q ou talvez n_i. Eu concordo com o OP que EulerLinearMomentumé realmente menos legível então m. O ponto é que o código-fonte não é o meio preferido para expressar fórmulas; portanto, a ênfase deve estar em facilitar a verificação de que o código faz a mesma coisa que a fórmula impressa, não que o código atenda aos requisitos do programa.
Kilian Foth
1
Eu concordaria com essa estratégia; no entanto, o texto de que falamos é um código cujo código possui restrições subjacentes, incluindo uma precisão / escala e comportamento específicos (dado um host ou destino conhecido). Você não está especificando ou projetando um modelo matemático; está implementando-o no código (na maioria dos casos). Sem usar nomes próprios que descrevam o que é representado, é muito mais difícil verificar a intenção.
JustinC
2
+1. Se a referência for a uma publicação recente, forneça o hiperlink DOI para o artigo. Exemplo dx.doi.org/10.1000/182 . É exatamente para isso que o DOI foi projetado - um URL curto e padrão para uma publicação, que nunca será alterado.
MarkJ
2
O @KeithS depende totalmente, para uma pequena equação em que cada variável tem um significado físico adequado, mas e se você estiver implementando, diga um algoritmo FFT em que haverá vários resultados parciais sem significado físico. Nestas situações, você absolutamente deve estar de acordo com a literatura matemática, porque é a linguagem do domínio
jk.
8

Quando tive que implementar algoritmos assim, existem algumas coisas que faço.

  1. Tanto quanto possível, isole o algoritmo para seu próprio método ou de preferência classe. Meu projeto atual tem sua própria Mathclasse equivalente à qual adicionar algoritmos complexos.

  2. Forneça um resumo do que o algoritmo deve fazer em termos leigos, incluindo acrônimos comuns ou referências abreviadas ao termo. Eu faço isso no próprio método, para que ele viva com o código.

  3. Forneça um resumo do algoritmo em termos técnicos / matemáticos e inclua quaisquer referências externas que eu conheça. Mais uma vez, faço isso com o próprio método, para que tenha uma melhor chance de permanecer relevante. O texto sem formatação não é ótimo nesse caso, portanto, citarei o termo matemático da melhor maneira possível e esclarecerei em um comentário entre parênteses. Por exemplo, x^y (x raised to the power y)

  4. Documente como estou dividindo o algoritmo em componentes e indique o que cada variável representa no algoritmo. por exemplo.t1 is time of first event

  5. Codifique o algoritmo e comente as partes complexas. Basicamente, adicionarei um comentário em qualquer lugar que eu dê um passo que não fosse óbvio ou direto no próprio algoritmo. Eu especialmente garanto que comente quaisquer atalhos não óbvios e por que eles estão bem que eu possa usar na implementação.

  6. Escreva alguns testes de unidade que validarão a operação do algoritmo.

Finalmente, se é realmente, muito, muito complexo, então me resigno ao fato de possuir esse código pelo restante do meu tempo nesse projeto.

Não gosto de confiar em um documento externo para que outra pessoa entenda o código. Sim, às vezes pode ser necessário, especialmente quando entrar em detalhes misteriosos. Mas sempre que possível, tento manter tudo dentro do próprio código, para que ele tenha a chance de permanecer atualizado e facilmente localizado. Nesse caso, eu valorizo ​​a acessibilidade às informações sobre a expressividade da documentação.


fonte
6

Em nossos projetos, que estão girando em torno de pesquisas em economia financeira quantitativa, utilizamos MUITA matemática e seguimos uma combinação do que já foi publicado:

  1. Forneça um link para a fonte principal que você está usando. Para nós, a maneira mais fácil de fazer isso é usar o identificador BibTex, que é basicamente um ID para um artigo que pode ser consultado por todos os envolvidos. Dependendo da fonte específica, também adicionamos regularmente a referência da equação.

  2. Forneça explicações para todas as variáveis. Novamente, usamos Tex para isso, se o artigo original usa letras gregas ou outras. A razão para isso é que, com freqüência, papéis e livros usam notações diferentes. Se alguém precisar refazer a matemática, isso será muito mais fácil.

  3. Tente codificar a equação em uma peça. É muito mais fácil reconhecer dessa maneira. NÃO publique o código Tex da equação completa no código - a equação é muito curta e a postagem de tex é confusa e supérflua, ou a equação é enorme e o código tex é inútil, a menos que você o compile (use um referência). Desmontar uma equação em pedaços pequenos torna muito difícil entender o que está acontecendo (se você é bom em matemática, pelo menos).

IMHO, a percepção mais importante é que as fórmulas geralmente dependem do contexto. Todo trabalho de matemática que conheço leva tempo para configurar o ambiente do modelo; Você deveria fazer o mesmo.

zuiqo
fonte
1
Explicar o contexto em detalhes é uma ótima idéia, enfocando o 'porquê' antes do 'como' poderia realmente ser útil.
jmruc
3

o texto não tem o poder expressivo da matemática

Você está certo. Como você já está procurando uma maneira de fazê-lo fora do código, e Tex é um exagero além de ter uma curva de aprendizado acentuada, minha recomendação é a seguinte:

Use o OpenOffice.org/LibreOffice Math Equation Editor.

É grátis. Está aberto.

Você pode usá-lo visualmente ou escrever as equações em um idioma especial.

Você não precisa aprender o idioma imediatamente, porque quando você usa a GUI, o "código" é gerado em um painel para você ver.

No painel superior, você pode "desenhar" as equações usando uma paleta. No painel inferior, a notação equivalente é gerada. Você pode fazer o contrário, depois de entender a notação, escrevendo em notação no painel inferior e vendo a saída gráfica no painel superior.

insira a descrição da imagem aqui

Tulains Córdova
fonte
Então o que? Inclua o código de texto sem formatação para a notação matemática no código original como comentários, ou faça uma captura de tela e use Javadoc como o OP disse que ele poderia fazer com o TeX?
dodgethesteamroller
@dodgethesteamroller Sim, a minha resposta diz: "Desde que você já está procurando uma maneira de fazê-lo código fora, e Tex é um exagero .."
Tulains Córdova