Advertisement
MagnusArias

SBO | Kowariancja/Korelacja C#

Dec 14th, 2019
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.27 KB | None | 0 0
  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. using System.Data.SqlTypes;
  5. using Microsoft.SqlServer.Server;
  6. using System.Collections.Generic;
  7. using System.Collections;
  8.  
  9. [Serializable]
  10. [SqlUserDefinedAggregate(Format.Native)]
  11. public struct GEOAVE
  12. {
  13.     private int licznik;  // field to count the not null rows
  14.     private double iloczyn;
  15.     private double temp;
  16.     public void Init()
  17.     {
  18.         licznik = 0;
  19.         iloczyn = 1;// initialization
  20.     }
  21.     public void Accumulate(double? Value)
  22.     {
  23.         if (Value != null)  // count just the rows that are not equal to NULL
  24.         {
  25.             licznik++;
  26.             iloczyn = iloczyn * (double)Value;
  27.         }
  28.     }
  29.     public void Merge(GEOAVE Group)
  30.     {
  31.         this.licznik += Group.licznik;
  32.         this.iloczyn *= Group.iloczyn; // when merge is needed the counter of other groups should be added
  33.     }
  34.  
  35.     public double? Terminate() //SqlString
  36.     {
  37.         //return new SqlString(Counter.ToString());
  38.         temp = 1.0 / licznik;
  39.         iloczyn = Math.Pow(iloczyn, temp);
  40.         return (double?)this.iloczyn;//returning the results
  41.     }
  42. }
  43.  
  44. [Serializable]
  45. [SqlUserDefinedAggregate(Format.Native)]
  46. public struct LiczZnaki
  47. {
  48.     private int licznik;  // field to count the not null rows
  49.     private double temp;
  50.     public void Init()
  51.     {
  52.         licznik = 0;
  53.     }
  54.     public void Accumulate(SqlString Value)
  55.     {
  56.         if (!Value.IsNull)  // count just the rows that are not equal to NULL
  57.         {
  58.             //licznik++;
  59.             licznik = licznik + Value.ToString().Length;
  60.         }
  61.     }
  62.     public void Merge(LiczZnaki Group)
  63.     {
  64.         this.licznik += Group.licznik;
  65.     }
  66.  
  67.     public int? Terminate() //SqlString
  68.     {
  69.  
  70.         return (int?)this.licznik;//returning the results
  71.     }
  72. }
  73.  
  74. [Serializable]
  75. [SqlUserDefinedAggregate(Format.UserDefined,
  76. IsInvariantToDuplicates = false,
  77. IsInvariantToOrder = false,
  78. MaxByteSize = -1, Name = "OdchylenieStandardowe")]
  79. public struct OdchStd : IBinarySerialize
  80. {
  81.     public List<double> posr;
  82.     private int licznik; // zmienna zliczająca liczbę wierszy nie mających wartości NULL
  83.     private double suma; // zmienna przechowująca sumę pól
  84.     private double temp; // zmienna pomocnicza
  85.  
  86.     public void Init()
  87.     {
  88.         posr = new List<double>();
  89.         licznik = 0;
  90.         suma = 0;
  91.     }
  92.     public void Accumulate(double? value)
  93.     {
  94.         if (value != null) // wyznaczanie sumy dla pól nie mających wartości NULL
  95.         {
  96.             licznik++;
  97.             temp = (double)value;
  98.             suma = suma + temp;
  99.             posr.Add(temp);
  100.         }
  101.     }
  102.     public void Merge(OdchStd Group)
  103.     {
  104.         this.suma += Group.suma;
  105.         this.licznik += Group.licznik;
  106.         this.temp += Group.temp;
  107.         // kiedy obliczenia równoległe suma staje się sumą z wszystkich procesów
  108.     }
  109.     public double? Terminate() //SqString
  110.     {
  111.         if (licznik <= 1)
  112.         {
  113.             return null;
  114.         }
  115.         else
  116.         {
  117.             return (double?)(this.temp); //zwrócenie ostatecznej wartości obliczeń
  118.         }
  119.     }
  120.     public void Write(System.IO.BinaryWriter w)
  121.     {
  122.         temp = 0;
  123.         double sr = suma / licznik;
  124.         foreach (double d in posr)
  125.         {
  126.             temp = temp + Math.Pow((d - sr), 2);
  127.         }
  128.         temp = temp / licznik;
  129.         temp = Math.Pow(temp, 0.5);
  130.         w.Write(temp);
  131.         //w.Write(suma);
  132.         w.Write(licznik);
  133.     }
  134.     public void Read(System.IO.BinaryReader r)
  135.     {
  136.         temp = r.ReadDouble();
  137.         //suma = r.ReadDouble();
  138.         licznik = r.ReadInt32();
  139.     }
  140. }
  141.  
  142.  
  143.  
  144. [Serializable]
  145. [SqlUserDefinedAggregate(Format.UserDefined,
  146. IsInvariantToDuplicates = false,
  147. IsInvariantToOrder = false,
  148. MaxByteSize = 8000, Name = "Kowariancja")]
  149. public struct Kowariancja : IBinarySerialize
  150. {
  151.     //double[] a;
  152.     //public ArrayList posr;
  153.     private int licznik;
  154.     private double sumaX;
  155.     private double sumaY;
  156.     private double sumaXY;
  157.     //private double tempX;
  158.     //private double tempY;
  159.     private double temp;
  160.  
  161.     public void Init()
  162.     {
  163.         //a = new double[2];
  164.         //posr = new ArrayList(a);
  165.         //posr.Clear();
  166.         temp = 0;
  167.         licznik = 0;
  168.         sumaX = 0;
  169.         sumaY = 0;
  170.     }
  171.  
  172.     public void Accumulate(double? valueX, double? valueY)
  173.     {
  174.         if (valueX != null && valueY != null)
  175.         {
  176.             licznik++;
  177.             //a[0] = (double)valueX;
  178.             //a[1] = (double)valueY;
  179.             sumaX = sumaX + (double)valueX;
  180.             sumaY = sumaY + (double)valueY;
  181.             sumaXY = sumaXY + (double)valueX * (double)valueY;
  182.             //posr.Add(a.Clone());
  183.         }
  184.     }
  185.     public void Merge(Kowariancja Group)
  186.     {
  187.         this.sumaX += Group.sumaX;
  188.         this.sumaY += Group.sumaY;
  189.         this.sumaXY += Group.sumaXY;
  190.         this.licznik += Group.licznik;
  191.         //posr.AddRange(Group.posr);
  192.     }
  193.  
  194.     public double? Terminate()
  195.     {
  196.         if (licznik == 0)
  197.         { return null; }
  198.         else
  199.         {
  200.             return (double?)(this.temp); //zwrócenie ostatecznej wartości obliczeń
  201.         }
  202.     }
  203.     public void Read(System.IO.BinaryReader r)
  204.     {
  205.         temp = r.ReadDouble();
  206.         licznik = r.ReadInt32();
  207.     }
  208.  
  209.  
  210.     public void Write(System.IO.BinaryWriter w)
  211.     {
  212.         //temp = 0;
  213.         if (licznik > 0)
  214.         {
  215.             double srX = sumaX / licznik;
  216.             double srY = sumaY / licznik;
  217.             double srXY = sumaXY / licznik;
  218.             /*
  219.             foreach (double[] d in posr)
  220.             {
  221.                 tempX = (d[0] - srX);
  222.                 tempY = (d[1] - srY);
  223.                 temp = temp + (tempX * tempY);
  224.             }
  225.             temp = temp / licznik;
  226.             */
  227.             temp = srXY - (srX * srY);
  228.         }
  229.         w.Write(temp);
  230.         w.Write(licznik);
  231.  
  232.     }
  233. }
  234.  
  235. [Serializable]
  236. [SqlUserDefinedAggregate(Format.UserDefined,
  237. IsInvariantToDuplicates = false,
  238. IsInvariantToOrder = false,
  239. MaxByteSize = 8000, Name = "Korelacja")]
  240. public struct Korelacja : IBinarySerialize
  241. {
  242.     double[] a;
  243.     public ArrayList posr;
  244.  
  245.     private int licznik;
  246.     private double sumaX;
  247.     private double sumaY;
  248.     private double sumaXY;
  249.     private double tempX;
  250.     private double tempY;
  251.     private double temp;
  252.  
  253.     public void Init()
  254.     {
  255.         a = new double[2];
  256.         posr = new ArrayList(a);
  257.         posr.Clear();
  258.         temp = 0;
  259.         licznik = 0;
  260.         sumaX = 0;
  261.         sumaY = 0;
  262.     }
  263.  
  264.     public void Accumulate(double? valueX, double? valueY)
  265.     {
  266.         if (valueX != null && valueY != null)
  267.         {
  268.             licznik++;
  269.             a[0] = (double)valueX;
  270.             a[1] = (double)valueY;
  271.             sumaX = sumaX + (double)valueX;
  272.             sumaY = sumaY + (double)valueY;
  273.             sumaXY = sumaXY + (double)valueX * (double)valueY;
  274.             posr.Add(a.Clone());
  275.         }
  276.     }
  277.     public void Merge(Korelacja Group)
  278.     {
  279.         this.sumaX += Group.sumaX;
  280.         this.sumaY += Group.sumaY;
  281.         this.sumaXY += Group.sumaXY;
  282.         this.licznik += Group.licznik;
  283.  
  284.         posr.AddRange(Group.posr);
  285.     }
  286.  
  287.     public double? Terminate()
  288.     {
  289.         if (licznik == 0)
  290.         { return null; }
  291.         else
  292.         {
  293.             return (double?)(this.temp); //zwrócenie ostatecznej wartości obliczeń
  294.         }
  295.     }
  296.     public void Read(System.IO.BinaryReader r)
  297.     {
  298.         temp = r.ReadDouble();
  299.         licznik = r.ReadInt32();
  300.     }
  301.  
  302.  
  303.     public void Write(System.IO.BinaryWriter w)
  304.     {
  305.         //temp = 0;
  306.         if (licznik > 0)
  307.         {
  308.             double srX = sumaX / licznik;
  309.             double srY = sumaY / licznik;
  310.             double srXY = sumaXY / licznik;
  311.  
  312.  
  313.             foreach (double[] d in posr)
  314.             {
  315.                 tempX += Math.Pow(d[0] - srX, 2);
  316.                 tempY += Math.Pow(d[1] - srY, 2);
  317.  
  318.             }
  319.             tempX = Math.Pow(tempX / licznik, 0.5);
  320.             tempY = Math.Pow(tempY / licznik, 0.5);
  321.  
  322.             temp = (srXY - (srX * srY)) / (tempX * tempY);
  323.  
  324.         }
  325.         w.Write(temp);
  326.         w.Write(licznik);
  327.  
  328.     }
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement