Страница 3 из 4

Re: Эффективность алгоритма

Добавлено: Пн дек 10, 2012 4:41 pm
sergejey
Alex, расскажи пожалуйста чуть подробнее про параметры
$period_refresh
&prec=1

я бы хотел от них по возможности избавиться -- может быть можно по истории данных вычислять их, а не задавать пользователю?

в старой версии есть тоже такой параметр как px (минимальное количество пискелей через которые отбражается новое значение на графике), который тоже не очень интуитивно понятный, но он не обязательный и можно обходиться дефолтным значением, если не нужно особо оптимизировать.

Re: Эффективность алгоритма

Добавлено: Пн дек 10, 2012 7:07 pm
Alex
Alex, расскажи пожалуйста чуть подробнее про параметры
$period_refresh
&prec=1

я бы хотел от них по возможности избавиться
Я тоже. :)

С $period_refresh всё просто. Поскольку мы имеем массив отсортированных, но не отмасштабированных по времени точек, то они равномерно заполняют всю ось времени, А $period_refresh вставляет «предыдущее» значение, если за период $period_refresh не пришло нового сигнала (датчик в реальности не работал). Т. е. «растягивает» ось времени на моменты, когда сигналов не было.

Можно, наверное, сделать как во второй части — сначала «растянуть» ось времени на ширину $wid, а потом понавтыкать точек пропорционально реальному времени.

С &prec=1 сложнее. Это отдельный алгоритм, несовместимый с первой частью. У меня есть подозрение, что совместить обе части можно на основе именно второй. Тогда и &prec=1 не понадобится.

Если не нужно ничего отображать кроме температуры можно вообще отказаться от второй части. Многие даже не заметят. :)

Re: Эффективность алгоритма

Добавлено: Ср дек 12, 2012 10:48 am
Alex
Потестировал несколько дней новый алгоритм. Как ни странно, но всё работает нормально. :)

Приделал второй канал. Никаких проблем. Всё работает. Загрузка минимальная. Без труда можно сделать 3-4-5-6-7 каналов и всё будет тянуть.

Почищу код и попозже выложу.

Re: Эффективность алгоритма

Добавлено: Ср дек 12, 2012 11:51 am
sergejey
Отлично!
У самого пока времени заняться этим нет, так что с радостью поставлю финальный код в проект :)

Re: Эффективность алгоритма

Добавлено: Ср дек 19, 2012 12:34 pm
sergejey
Я тут ещё одну версию алгоритма набросал... Может у кого будет возможность проверить :)
На моих графиках вроде показывает адекватные значения. Графики получаются без обрывов -- если данных не поступало, то будет прямая линия, соответствующая последнему известному значению. По идее работает одинаково для любых типов данных.

Код: Выделить всё

   $history=SQLSelect("SELECT ID, VALUE, UNIX_TIMESTAMP(ADDED) as UNX FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");
   $value=$history[0]['VALUE'];
   $next_index=1;
   $total_values=count($history);

   while($start_time<$end_time) {
     if ($next_index<$total_values) {
      for($i=$next_index;$i<$total_values;$i++) {
       $next_index=$i;
       if ($history[$i]['UNX']>=$start_time) {
        $value=$history[$i]['VALUE'];
        break;
       }
      }
     }
     $values[]=$value;
     if ($px_passed>30) {
      if (date('Y-m-d', $start_time)!=$dt) {
       $hours[]=date('d/m', $start_time);
       $dt=date('Y-m-d', $start_time);
      } else {
       $hours[]=date('H:i', $start_time);
      }
      $px_passed=0;
     } else {
      $hours[]='';
     }
     $start_time+=$period;
     $px+=$px_per_point;
     $px_passed+=$px_per_point;
   }

Re: Эффективность алгоритма

Добавлено: Ср дек 19, 2012 1:29 pm
tammat
@Alex
Выложи код для построения нескольких графиков на одной картинке

Re: Эффективность алгоритма

Добавлено: Ср дек 19, 2012 1:31 pm
Alex
Протестировал. Площадки нормальные, графики правильные. Это хорошо.

Выявленные проблемы. Непериодические сигналы отображаются по другому и иногда теряются. Т. е. сигнал был, а на графике его нет. Почему так пока не копал.

Почему то с новым алгоритмом перестали показываться графики на одной из страниц. Хотя должны бы. Может быть дело в параметрах вызова, пока не разобрался.

Re: Эффективность алгоритма

Добавлено: Ср дек 19, 2012 1:49 pm
Alex
@Alex
Выложи код для построения нескольких графиков на одной картинке
Код сырой и вам придётся разбираться почему что не работает. Это задача для программиста. Если это не пугает, то могу выложить.

Re: Эффективность алгоритма

Добавлено: Ср дек 19, 2012 2:23 pm
sergejey
Alex писал(а):Протестировал. Площадки нормальные, графики правильные. Это хорошо.
Выявленные проблемы. Непериодические сигналы отображаются по другому и иногда теряются. Т. е. сигнал был, а на графике его нет. Почему так пока не копал.
Догадываюсь, почему могут пропускаться разовые сигналы -- алгоритм разбивает время на мелкие дискретные участки, соответствующие разрешению графика, и берёт последнее значение из базы на этом участке (либо первое, точно не помню). Вполне возможно, что на одном участке совсем рядом есть два значения -- скажем сначало 1, потом 0 и из-за этой особенности, итоговое значение на участке будет одно из них. Как вариант, оставлять максимальное зачение на участке (если их несколько).

Re: Эффективность алгоритма

Добавлено: Ср дек 19, 2012 3:06 pm
Alex
Вполне возможно, что на одном участке совсем рядом есть два значения -- скажем сначала 1, потом 0 и из-за этой особенности, итоговое значение на участке будет одно из них.
А это нас не устраивает. Если это окажется 0, то мы пропустим сигнал.

Не лучше ли сначала растянуть массив на ширину графика, а потом втыкать ненулевые (значимые) отсчёты пропорционально времени. Гарантированно на график попадут _все_ значения. Потерять в этом случае ничего не получится, даже если очень захотеть.

И вообще...

Наверное не надо делать универсальный модуль графики. Нужно под каждую задачу делать отдельный модуль. Например.

index.php - “аналоговые” графики
s.php – индикаторы
sign.php – сигнальный (PIR...) модуль
stat.php – модуль статистики
и т.д...