rodrigojmlourenco / Scout

CycleOurCity goes Mobile - Scout
0 stars 0 forks source link

ISSUE 042502 : MergingAll #8

Closed rodrigojmlourenco closed 9 years ago

rodrigojmlourenco commented 9 years ago

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).

rodrigojmlourenco commented 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.

rodrigojmlourenco commented 9 years ago

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.

rodrigojmlourenco commented 9 years ago

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.

rodrigojmlourenco commented 9 years ago
        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.