Changeset 1172 for applications/robust

Show
Ignore:
Timestamp:
08/31/10 19:25:53 (14 years ago)
Author:
sindj
Message:

Znova a lip, ted uz snad skoro dokoncena funkce create_statistic(). JS

Location:
applications/robust
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • applications/robust/robustlib.cpp

    r1171 r1172  
    11#include "robustlib.h" 
    22 
    3 point :: point(vec coordinates) 
    4 { 
    5         this->coordinates = coordinates; 
    6         this->twinpoint   = NULL; 
    7 } 
    8  
    9 point :: point(vec coordinates, point *twinpoint) 
    10 { 
    11         this->coordinates = coordinates; 
    12         this->twinpoint   = twinpoint; 
    13 } 
    14  
    15 segment :: segment(point *end1, point *end2) 
    16 { 
    17         this->end1 = end1; 
    18         this->end2 = end2; 
    19 } 
    20  
    21 leaf :: leaf(vec condition, leaf *parent)                       
    22 { 
    23         this->condition  = condition;                            
    24         this->parent     = parent; 
    25 } 
    26  
    27 leaf :: evolvechildren(vec condition) 
    28 { 
    29         this->condition = condition; 
    30  
    31  
    32 } 
    33  
    34 emlig :: emlig(leaf *tree) : eEF() 
    35 { 
    36         this->tree = tree; 
    37 } 
    38  
    39 emlig :: emlig(vec [] conditions) : eEF() 
    40 { 
    41         emlig::buildtree(conditions); 
    42 } 
    43  
    44 emlig :: buildtree() 
    45 {} 
  • applications/robust/robustlib.h

    r1171 r1172  
    1010#include <stat/exp_family.h> 
    1111#include <limits> 
     12#include <vector> 
     13#include <algorithm> 
    1214         
    1315using namespace bdm; 
    1416using namespace std; 
    1517 
    16 #include <vector> 
    17  
    18 public const max_range = numeric_limits<double>::max( )/10e-5.0; 
     18const double max_range = numeric_limits<double>::max()/10e-5; 
    1919 
    2020class polyhedron; 
    2121class vertex; 
    2222 
     23/// A class describing a single polyhedron of the split complex. From a collection of such classes a Hasse diagram 
     24/// of the structure in the exponent of a Laplace-Inverse-Gamma density will be created. 
    2325class polyhedron 
    2426{ 
    25         vector<&polyhedron> parents; 
    26  
    27         vector<&polyhedron> children; 
    28  
    29         vector<&vertex> vertices; 
    30  
    31         vector<&polyhedron> positivechildren; 
    32  
    33         vector<&polyhedron> negativechildren; 
    34  
    35         vector<&polyhedron> neutralchildren; 
    36  
    37         vector<vector<&vertex>> triangulations; 
    38  
    39         int multiplicity = 1;    
     27        /// A property having a value of 1 usually, with higher value only if the polyhedron arises as a coincidence of 
     28        /// more than just the necessary number of conditions. For example if a newly created line passes through an already 
     29        /// existing point, the points multiplicity will rise by 1. 
     30        int multiplicity;        
    4031 
    4132public: 
    42  
     33        /// A list of polyhedrons parents within the Hasse diagram. 
     34        vector<polyhedron*> parents; 
     35 
     36        /// A list of polyhedrons children withing the Hasse diagram. 
     37        vector<polyhedron*> children; 
     38 
     39        /// All the vertices of the given polyhedron 
     40        vector<vertex*> vertices; 
     41 
     42        /// A list used for storing children that lie in the positive region related to a certain condition 
     43        vector<polyhedron*> positivechildren; 
     44 
     45        /// A list used for storing children that lie in the negative region related to a certain condition 
     46        vector<polyhedron*> negativechildren; 
     47 
     48        /// Children intersecting the condition 
     49        vector<polyhedron*> neutralchildren; 
     50 
     51        /// List of triangulation polyhedrons of the polyhedron given by their relative vertices.  
     52        vector<vector<vertex*>> triangulations; 
     53 
     54        /// A list of relative addresses serving for Hasse diagram construction. 
    4355        vector<int> kids_rel_addresses; 
    4456 
     57        /// Default constructor 
    4558        polyhedron() 
    4659        { 
    47                 parents  = new vector<&polyhedron>(); 
    48                 children = new vector<&polyhedron>(); 
    49                 vertices = new vector<&vertex>(); 
    50                  
    51                 positivechildren = new vector(&polyhedron)(); 
    52                 negativechildren = new vector(&polyhedron)(); 
    53                 neutralchildren  = new vector(&polyhedron)(); 
    54  
    55                 triangulations = new vector<vector<&vertex>>(); 
    56  
    57                 kids_rel_addresses = new vector<int>(); 
    58          
    59         } 
    60          
    61  
     60                multiplicity = 1;        
     61        } 
     62         
     63        /// Setter for raising multiplicity 
    6264        void RaiseMultiplicity() 
    6365        { 
     
    6567        } 
    6668 
     69        /// Setter for lowering multiplicity 
    6770        void LowerMultiplicity() 
    6871        { 
     
    7073        } 
    7174         
    72          
    73 }; 
    74  
    75 class vertex : polyhedron 
     75        /// An obligatory operator, when the class is used within a C++ STL structure like a vector 
     76        int operator==(polyhedron polyhedron2) 
     77        { 
     78                return true; 
     79        } 
     80 
     81        /// An obligatory operator, when the class is used within a C++ STL structure like a vector 
     82        int operator<(polyhedron polyhedron2) 
     83        { 
     84                return false; 
     85        } 
     86}; 
     87 
     88/// A 
     89class vertex : public polyhedron 
    7690{ 
    7791        vector<double> coordinates; 
     
    8397        vertex(vector<double> coordinates) 
    8498        { 
    85                 this.coordinates = coordinates; 
     99                this->coordinates = coordinates; 
    86100        } 
    87101 
     
    93107        vector<double> get_coordinates() 
    94108        { 
    95                 return this.coordinates(); 
    96         } 
    97 } 
    98  
    99 class toprow : polyhedron 
     109                vector<double> returned_vec; 
     110 
     111                copy(this->coordinates.begin(),this->coordinates.end(),returned_vec.begin()); 
     112 
     113                return returned_vec; 
     114        } 
     115}; 
     116 
     117class toprow : public polyhedron 
    100118{ 
    101119        vector<double> condition; 
     
    105123        toprow(); 
    106124 
    107         toprow(double condition) 
    108         { 
    109                 this.condition = condition; 
    110         } 
    111  
    112 } 
     125        toprow(vector<double> condition) 
     126        { 
     127                this->condition = condition; 
     128        } 
     129 
     130}; 
    113131 
    114132 
     
    116134 
    117135//! Conditional(e) Multicriteria-Laplace-Inverse-Gamma distribution density 
    118 class emlig : public eEF{ 
    119  
    120         vector<vector<&polyhedron>> statistic; 
     136class emlig : public eEF 
     137{ 
     138 
     139        vector<vector<polyhedron*>> statistic; 
    121140         
    122141public:  
     
    124143        emlig(int number_of_parameters) 
    125144        { 
    126                 create_statistic(int number_of_parameters); 
    127         } 
    128  
    129         emlig(vector<vector<&polyhedron>> statistic) 
    130         { 
    131                 this.statistic = statistic; 
     145                create_statistic(number_of_parameters); 
     146        } 
     147 
     148        emlig(vector<vector<polyhedron*>> statistic) 
     149        { 
     150                this->statistic = statistic; 
    132151        } 
    133152 
     
    136155protected: 
    137156 
    138         create_statistic(int number_of parameters) 
    139         { 
    140                 vector<double> origin_coord = new vector<double>();      
    141  
    142                 origin = new vertex(origin_coord); 
    143  
    144                 origin.vertices.push_back(origin); 
    145  
    146                 vector<&polyhedron> origin_vec = new vector(&polyhedron)(1,); 
     157    void create_statistic(int number_of_parameters) 
     158        { 
     159                vector<double> origin_coord;     
     160 
     161                vertex *origin = new vertex(origin_coord); 
     162 
     163                origin->vertices.push_back(origin); 
     164 
     165                vector<polyhedron*> origin_vec; 
     166 
     167                origin_vec.push_back(origin); 
    147168 
    148169                statistic.push_back(origin_vec); 
    149170 
    150                 for(int i=0;i++;i<number_of_parameters) 
     171                for(int i=0;i<number_of_parameters;i++) 
    151172                { 
    152                         vertex new_point1 = new vertex(origin.get_coordinates().push_back(max_range)); 
    153                         vertex new_point2 = new vertex(origin.get_coordinates().push_back(-max_range));  
    154  
    155                         vector(vector(&polyhedron)) new_statistic1 = new vector(vector(&polyhedron)); 
    156                         vector(vector(&polyhedron)) new_statistic2 = new vector(vector(&polyhedron)); 
     173                        vector<double> origin_coord1 = origin->get_coordinates(); 
     174                        vector<double> origin_coord2 = origin->get_coordinates(); 
     175 
     176                        origin->push_coordinate(0); 
     177 
     178                        origin_coord1.push_back(max_range); 
     179                        origin_coord2.push_back(-max_range); 
     180 
     181                        vertex *new_point1 = new vertex(origin_coord1); 
     182                        vertex *new_point2 = new vertex(origin_coord2);  
     183 
     184                        vector<vector<polyhedron*>> new_statistic1; 
     185                        vector<vector<polyhedron*>> new_statistic2; 
    157186 
    158187                         
    159                         for(int j=0;j++;j<statistic.size()) 
     188                        for(int j=0;j<statistic.size();j++) 
    160189                        { 
    161                                 vector<&polyhedron>::iterator horiz_ref = statistic[j].begin(); 
    162  
    163190                                int element_number = 0; 
    164191 
    165                                 do 
     192                                for(vector<polyhedron*>::iterator horiz_ref = statistic[j].begin();horiz_ref<statistic[j].end();horiz_ref++) 
    166193                                {        
    167                                         if(!horiz_ref.parents.empty()) 
    168                                         { 
    169                                                 vector<&polyhedron>::iterator end_ref = horiz_ref.parents.end(); 
    170  
    171                                                 vector<&polyhedron>::iterator parent_ref = horiz_ref.parents.begin(); 
    172  
    173                                                 do 
     194                                        if(!(*horiz_ref)->parents.empty()) 
     195                                        { 
     196                                                for(vector<polyhedron*>::iterator parent_ref = (*horiz_ref)->parents.begin();parent_ref < (*horiz_ref)->parents.end();parent_ref++) 
    174197                                                { 
    175                                                         parent_ref.kids_rel_addresses.push_back(element_number); 
    176  
    177                                                         parent_ref++; 
    178                                                 } 
    179                                                 while(parent_ref!=end_ref) 
    180                                         } 
    181  
    182                                         toprow current_copy1 = new toprow(new vector<int>(i+2,0)); 
    183                                         toprow current_copy2 = new toprow(new vector<int>(i+2,0)); 
    184  
    185                                         vector<&vertex>::iterator vert_ref = horiz_ref.vertices.begin(); 
    186  
    187                                         do 
    188                                         { 
    189                                                 current_copy1.vertices.push_back(vert_ref); 
    190                                                 current_copy2.vertices.push_back(vert_ref); 
    191  
    192                                                 vert_ref++; 
    193                                         } 
    194                                         while(!vert_ref!=horiz_ref.vertices.end()) 
    195  
    196                                         current_copy1.vertices.push_back(new_point1); 
    197                                         current_copy2.vertices.push_back(new_point2); 
    198  
    199                                         current_copy1.triangulations.push_back(current_copy1.vertices); 
    200                                         current_copy2.triangulations.push_back(current_copy2.vertices); 
    201  
    202                                         vector<int>::iterator kid_ref = horiz_ref.kids_rel_addresses.begin(); 
    203  
    204                                         if(!horiz_ref.kids_rel_addresses.empty()) 
    205                                         { 
    206                                                 do 
     198                                                        (*parent_ref)->kids_rel_addresses.push_back(element_number);                                                     
     199                                                }                                                
     200                                        } 
     201 
     202                                        vector<double> vec1(i+2,0); 
     203                                        vector<double> vec2(i+2,0); 
     204 
     205                                        toprow *current_copy1 = new toprow(vec1); 
     206                                        toprow *current_copy2 = new toprow(vec2);                                        
     207 
     208                                        for(vector<vertex*>::iterator vert_ref = (*horiz_ref)->vertices.begin();vert_ref<(*horiz_ref)->vertices.end();vert_ref++) 
     209                                        { 
     210                                                current_copy1->vertices.push_back(*vert_ref); 
     211                                                current_copy2->vertices.push_back(*vert_ref);                                            
     212                                        } 
     213                                         
     214 
     215                                        current_copy1->vertices.push_back(new_point1); 
     216                                        current_copy2->vertices.push_back(new_point2); 
     217 
     218                                        current_copy1->triangulations.push_back(current_copy1->vertices); 
     219                                        current_copy2->triangulations.push_back(current_copy2->vertices); 
     220 
     221                                         
     222 
     223                                        if(!(*horiz_ref)->kids_rel_addresses.empty()) 
     224                                        { 
     225                                                for(vector<int>::iterator kid_ref = (*horiz_ref)->kids_rel_addresses.begin();kid_ref<(*horiz_ref)->kids_rel_addresses.end();kid_ref++) 
    207226                                                {                                                
    208                                                         current_copy1.children.push_back(new_statistic1[i,kid_ref]); 
    209                                                         current_copy2.children.push_back(new_statistic2[i,kid_ref]); 
    210  
    211                                                         new_statistic1[i,kid_ref].parents.push_back(current_copy1); 
    212                                                         new_statistic2[i,kid_ref].parents.push_back(current_copy2); 
    213  
    214                                                         kid_ref++; 
    215  
    216                                                 } 
    217                                                 while(kid_ref!=horiz_ref.kids_rel_addresses.end()) 
    218  
    219                                                 horiz_ref.kids_rel_addresses.clear(); 
     227                                                        current_copy1->children.push_back(new_statistic1[i][(*kid_ref)]); 
     228                                                        current_copy2->children.push_back(new_statistic2[i][(*kid_ref)]); 
     229 
     230                                                        new_statistic1[i][(*kid_ref)]->parents.push_back(current_copy1); 
     231                                                        new_statistic2[i][(*kid_ref)]->parents.push_back(current_copy2); 
     232                                                }                                                
     233 
     234                                                (*horiz_ref)->kids_rel_addresses.clear(); 
    220235                                        } 
    221236                                        else 
    222237                                        { 
    223                                                 current_copy1.children.push_back(new_point1); 
    224                                                 current_copy2.childern.push_back(new_point2); 
    225  
    226                                                 new_point1.parents.push_back(current_copy1); 
    227                                                 new_point2.parents.push_back(current_copy2); 
    228                                         } 
    229  
    230                                         current_copy1.children.push_back(horiz_ref); 
    231                                         current_copy2.children.push_back(horiz_ref); 
     238                                                current_copy1->children.push_back(new_point1); 
     239                                                current_copy2->children.push_back(new_point2); 
     240 
     241                                                new_point1->parents.push_back(current_copy1); 
     242                                                new_point2->parents.push_back(current_copy2); 
     243                                        } 
     244 
     245                                        current_copy1->children.push_back(*horiz_ref); 
     246                                        current_copy2->children.push_back(*horiz_ref); 
    232247 
    233248                                        new_statistic1[i+1].push_back(current_copy1); 
     
    235250                                         
    236251                                        element_number++; 
    237                                 } 
    238                                 while(statistic[j].end() != horiz_ptr++) 
     252                                }                                
    239253                        }                                
    240254