Closed rodrigojmlourenco closed 9 years ago
Este aparenta ser um problema de precisão, em que quando o timestamp
é obtido (sample.get(SensingUtils.TIMESTAMP).getAsLong()
) o valor retornado tem apenas 5 casas decimais.
Mesmo com o aumento de precisão, através da utilização de doubles
, as diferenças temporiais entre amostras são mínimas, por exemplo mesmo entre 2000 amostras capturadas a diferença temporal não chegou os 500ns.
Por exemplo, com o MobileSensingPipeline
a executar-se a cada 5s e o PressureSensorPipeline
a processar 149 amostras, numa das suas iterações, o timestamp da primeira amostra foi 1430554314.976445 e o da 100º 1430554318.333378, o que amontoa a uma diferença apenas de 3.35693311691ns.
public boolean areCloselyRelated(JsonObject sample1, JsonObject sample2) {
//Avoid NullPointerException
if(sample1 == null || sample2 == null) return false;
BigDecimal b1 = new BigDecimal(sample1.get(SensingUtils.TIMESTAMP).getAsString());
BigDecimal b2 = new BigDecimal(sample2.get(SensingUtils.TIMESTAMP).getAsString());
BigDecimal e = b2.subtract(b1).multiply(SECOND_2_NANOS).abs();
return (e.compareTo(MAX_TIME_FRAME)<= 0);
}
O problema foi resolvido a dois níveis. Primeiro BigDecimal
passou a ser usado, este não só assegura a precisão mas evita a transformação dos valores em números exponenciais. Em segundo lugar, existe uma conversão final para nanosegundos.
De forma a testar o pipeline principal, foi incrementado o tamanho da janela. Isto levou à identificação de um problema, possivelmente nas funções
closelyRelated
dos diferentes pipelines, em que mesmo para intervalos de 10s estão a concatenar as amostras como se tivessem todas ocorrido ao mesmo tempo (dentro de uma janela de 1s).