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

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

Добавлено: Сб дек 08, 2012 6:08 pm
Alex
Протестировал.

Обновил файл index.php через RapidSVN. Новый код на месте. В результате все графики перестали строиться вообще. Вместо них — битые картинки.

Если я заменил только один файл index.php на новый, это должно работать?

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

Добавлено: Вс дек 09, 2012 12:40 am
Alex
Отчёт о тестировании в 3-х частях

Начну с хороших новостей. Новый файл я запустил, всё работает.

Игра несомненно стоит свеч. Посмотрите на загрузку со старым файлом и с новым. Комментарии излишни.

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

Добавлено: Вс дек 09, 2012 12:41 am
Alex
Теперь о грустном. У нового алгоритма, мягко говоря, гигантские проблемы с линейностью шкалы времени. А у старого всё в порядке с этим.

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

Добавлено: Вс дек 09, 2012 12:43 am
Alex
Ещё грустные новости. То, что он показывает, имеет очень небольшое отношение к реальности. Пока это температура на луне и доверять тому, что он рисует нельзя.

Но, учитывая показания загрузки процессора, доделать новый алгоритм надо обязательно.

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

Добавлено: Вс дек 09, 2012 10:01 am
Alex
Посмотрел я повнимательнее. Всё не так страшно. Нужно исправить всего одну небольшую ошибку.

У нового алгоритма проблема с тем, что когда данные с сенсоров не поступают (три прямые горизонтальные площадки на старом графике), от берёт значения (10:15, 10:19, 10:23...) идущие сразу после площадки и растягивает их в «прошлое» на всю ширину площадки. Отсюда «нелинейность» времени и «волны» с неправильной амплитудой вместо ровных линий.

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

Добавлено: Вс дек 09, 2012 10:34 pm
Alex
Посмотрел ещё повнимательнее и обнаружил ещё проблемы.

- когда мало точек — иногда не выдаёт время на шкале

- алгоритм не работает на непериодических сигналах. А PIR сенсоры и датчики открывания — это источники непериодических сигналов.


Что сделано. Соорудил жуткого монстра, но этот код решает все выявленные проблемы.

- Решена проблема с площадками на графике, правда ценой введения параметра $period_refresh=70. Это для датчиков с периодом обновления в 1 минуту. Для других периодов надо задавать другое значение. И, наверное, передавать его через параметры вызова графиков.

- Решена проблема с не выдачей времени на шкале.

- Решена проблема с «нелинейностью» времени.

- Решена проблема с отображением непериодических сигналов (параметр &prec=1). Алгоритм _не_пропускает_ни одного_ срабатывания датчика (даже длительностью в 1 сек.) и отображает факт срабатывания датчика на графике.

Ну и конечно фантастическая скорость и минимальная загрузка процессора.

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

  if ($total>0) {
   $px=0;
   $px_passed=0;
   $dt=date('Y-m-d', $start_time);

   $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");

   $total=count($history);
   $itm=0;

   $t1=date('H:i', $start_time);
   $t2=date('H:i', $end_time);
   $period_refresh=70;
   $not_empty=0;
   $tmp=0;
   $delta_time = $end_time - $start_time;
   
   if ($_GET['prec']=='1') {
     $prec=1;
   } else {
       $prec=0;
     }  
   
 if ($prec==0){
   
   for($i=0; $i<$total; $i++) {
     $unx = $history[$i]['UNX'];
	 
     if ($unx >= $start_time || $i==0) {
	   $not_empty=1;
	   if (($unx >= $start_time && $unx <= $start_time+$period_refresh) || $i==0) {
         $values[$itm] = (float)$history[$i]['VALUE'];
		 $tmp=$values[$itm];
       }else{
	      $values[$itm] = $tmp;
        }	   
		
       $itm++;
	   $temp_time=$start_time;
       $start_time+=$period;
	   
       if ($px_passed > 40) {
         if (date('Y-m-d', $unx)!=$dt) {
           $hours[] = date('d/m', $unx);
           $dt = date('Y-m-d', $unx);
         } else {
             $hours[] = date('H:i', $temp_time);
           }
         $px_passed=0;
       } else {
           $hours[]='';
         }
       $px += $px_per_point;
       $px_passed += $px_per_point;
     }
   }

   if ($not_empty==0){
	 $values[0] = 0; 
     $hours[0] = $t1;
     $values[2] = 0; 
     $hours[2] = $t2;
   }    
   
 } else { // end if ($prec==0)

//---------------------------- Precesion  

   $ar=0;
   $u=0;
   $wid=$w-90;
   $shk=$wid/10;
   $shk2=$delta_time/10;
  
   for($z=0; $z<$wid; $z++) {
     $values[$z] = 0;
	 if ($z==$shk*$u) {
	   $hours[$z]=date('H:i', $start_time+$shk2*$u);
	   $u++;
	 } else {
	     $hours[$z]="";
       }
   }//end for $z
 
   for($i=0; $i<$total; $i++) {
     $unx = $history[$i]['UNX'];
	 $sm=$unx-$start_time;
	 $k=$delta_time/$sm;
	 $ar=$wid/$k;
	 
	 if ($values[$ar]==0){
	   $values[$ar] = (float)$history[$i]['VALUE'];
	 }
   }//end for $i

 }//end if ($prec==0) else
   
   $DataSet->AddPoint($values,"Serie1");  
   $DataSet->AddPoint($hours,"Serie3");  

   } else {

   $DataSet->AddPoint(0,"Serie1");
   $DataSet->AddPoint(0,"Serie3");
  } //end if ($total>0)

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

Добавлено: Пн дек 10, 2012 11:03 am
sergejey
Alex, здорово! Обязательно сегодня поразбираюсь и обновлю основную ветку :)

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

Добавлено: Пн дек 10, 2012 1:00 pm
Urbas81
Можно узнать, что за непереодические сигналы, и как это используется, на графике это что?

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

Добавлено: Пн дек 10, 2012 2:08 pm
Alex
От температурного датчика идут сигналы с периодом, к примеру, в 1 минуту. А от PIR сенсора или датчика открывания двери 1 раз в час или 1 раз в день. Это и есть непериодические сигналы. Причём PIR сенсор может выдать сигнал всего в 1-2 секунды, который старый алгоритм просто может пропустить. Если это охранный датчик, а на графике всё спокойно, то это, сами понимаете, не дело. :)

А на графике срабатывание датчиков присутствия и датчика открывания двери.

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

Добавлено: Пн дек 10, 2012 3:42 pm
Urbas81
Я так и думал. спасибо. А старой код, я так понимаю, мог не пропустить данный сигнал.
Причём PIR сенсор может выдать сигнал всего в 1-2 секунды, который старый алгоритм просто может не пропустить.