Changeset 3685:7447d9518d04 in orange


Ignore:
Timestamp:
05/23/07 14:15:40 (7 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
7e031484e9ffdd390110e75e4ec358a0fe2cb77d
Message:

speed up

Location:
source/orangeom
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source/orangeom/networkoptimization.cpp

    r3684 r3685  
    3535    height = 1000; 
    3636    links = NULL; 
    37     nodes = NULL; 
    3837    pos = NULL; 
    3938    temperature = sqrt((double)(width*width + height*height)) / 10; 
     
    5352    free_Links(); 
    5453    free_Carrayptrs(pos); 
    55     free((char*) nodes); 
    5654    Py_DECREF(coors); 
    57     Py_DECREF(filter); 
    58 } 
    59  
    60 double TNetworkOptimization::attractiveForce(double x) 
    61 { 
    62     return x * x / k; 
    63  
    64 } 
    65  
    66 double TNetworkOptimization::repulsiveForce(double x) 
    67 { 
    68     if (x == 0) 
    69         return k2 / 1; 
    70  
    71     return   k2 / x;  
    72 } 
    73  
    74 double TNetworkOptimization::cool(double t) 
    75 { 
    76     return t * 0.96; 
    7755} 
    7856 
     
    9371} 
    9472 
    95 bool TNetworkOptimization::isFilter() 
    96 { 
     73void TNetworkOptimization::random() 
     74{ 
     75    srand(time(NULL)); 
     76 
    9777    int i; 
    9878    for (i = 0; i < nVertices; i++) 
    99         if (nodes[i]) 
    100             return true; 
    101  
    102     return false; 
    103 } 
    104  
    105 void TNetworkOptimization::random() 
    106 { 
    107     srand(time(NULL)); 
    108     bool _isFilter = isFilter(); 
    109  
    110     int i; 
    111     for (i = 0; i < nVertices; i++) 
    112     { 
    113         if (!_isFilter || nodes[i]) 
    114         { 
     79    { 
    11580            pos[i][0] = rand() % width; 
    11681            pos[i][1] = rand() % height; 
    117         } 
    11882    } 
    11983} 
     
    12589    dumpCoordinates(pos, nVertices, 2); 
    12690    /**/ 
    127     bool _isFilter = isFilter(); 
    12891    int i = 0; 
    12992    int count = 0; 
     
    164127            for (int u = v + 1; u < nVertices; u++) 
    165128            { 
    166                 if (!_isFilter || (nodes[u] && nodes[v])) 
    167                 { 
    168                     double difX = pos[v][0] - pos[u][0]; 
    169                     double difY = pos[v][1] - pos[u][1]; 
    170  
    171                     double dif = sqrt(difX * difX + difY * difY); 
    172  
     129                double difX = pos[v][0] - pos[u][0]; 
     130                double difY = pos[v][1] - pos[u][1]; 
     131 
     132                double dif = sqrt(difX * difX + difY * difY); 
     133 
     134                if (dif < kk) 
     135                { 
    173136                    if (dif == 0) 
    174                         dif = 1; 
    175  
    176                     if (dif < kk) 
    177                     { 
    178                         disp[v][0] = disp[v][0] + ((difX / dif) * repulsiveForce(dif)); 
    179                         disp[v][1] = disp[v][1] + ((difY / dif) * repulsiveForce(dif)); 
    180  
    181                         disp[u][0] = disp[u][0] - ((difX / dif) * repulsiveForce(dif)); 
    182                         disp[u][1] = disp[u][1] - ((difY / dif) * repulsiveForce(dif)); 
    183                     } 
     137                        dif = 0.01; 
     138 
     139                    double d = dif * dif / k2; 
     140                    double dX = difX / d; 
     141                    double dY = difY / d; 
     142 
     143                    disp[v][0] = disp[v][0] + dX; 
     144                    disp[v][1] = disp[v][1] + dY; 
     145 
     146                    disp[u][0] = disp[u][0] - dX; 
     147                    disp[u][1] = disp[u][1] - dY; 
    184148                } 
    185149            } 
     
    195159 
    196160            // cout << "     v: " << v << " u: " << u << " w: " << edge->weights << endl; 
    197             if (!_isFilter || (nodes[u] && nodes[v])) 
    198             { 
    199                 double difX = pos[v][0] - pos[u][0]; 
    200                 double difY = pos[v][1] - pos[u][1]; 
    201  
    202                 double dif = sqrt(difX * difX + difY * difY); 
    203  
    204                 if (dif == 0) 
    205                     dif = 1; 
    206  
    207                 disp[v][0] = disp[v][0] - ((difX / dif) * attractiveForce(dif)); 
    208                 disp[v][1] = disp[v][1] - ((difY / dif) * attractiveForce(dif)); 
    209  
    210                 disp[u][0] = disp[u][0] + ((difX / dif) * attractiveForce(dif)); 
    211                 disp[u][1] = disp[u][1] + ((difY / dif) * attractiveForce(dif)); 
    212             } 
     161            double difX = pos[v][0] - pos[u][0]; 
     162            double difY = pos[v][1] - pos[u][1]; 
     163 
     164            double dif = sqrt(difX * difX + difY * difY); 
     165 
     166            if (dif == 0) 
     167                dif = 0.01; 
     168 
     169            double d = dif / k; 
     170            double dX = difX * d; 
     171            double dY = difY * d; 
     172 
     173            disp[v][0] = disp[v][0] - dX; 
     174            disp[v][1] = disp[v][1] - dY; 
     175 
     176            disp[u][0] = disp[u][0] + dX; 
     177            disp[u][1] = disp[u][1] + dY; 
    213178        } 
    214179 
     
    217182        for (v = 0; v < nVertices; v++) 
    218183        { 
    219             if (!_isFilter || nodes[v]) 
    220             { 
    221                 double dif = sqrt(disp[v][0] * disp[v][0] + disp[v][1] * disp[v][1]); 
    222  
    223                 if (dif == 0) 
    224                     dif = 1; 
    225  
    226                 pos[v][0] = pos[v][0] + ((disp[v][0] / dif) * min(fabs(disp[v][0]), temperature)); 
    227                 pos[v][1] = pos[v][1] + ((disp[v][1] / dif) * min(fabs(disp[v][1]), temperature)); 
    228  
    229                 //pos[v][0] = min((double)width,  max((double)0, pos[v][0])); 
    230                 //pos[v][1] = min((double)height, max((double)0, pos[v][1])); 
    231             } 
    232         } 
    233  
    234         temperature = cool(temperature); 
     184            double dif = sqrt(disp[v][0] * disp[v][0] + disp[v][1] * disp[v][1]); 
     185 
     186            if (dif == 0) 
     187                dif = 0.01; 
     188 
     189            pos[v][0] = pos[v][0] + (disp[v][0] / dif * min(fabs(disp[v][0]), temperature)); 
     190            pos[v][1] = pos[v][1] + (disp[v][1] / dif * min(fabs(disp[v][1]), temperature)); 
     191 
     192            //pos[v][0] = min((double)width,  max((double)0, pos[v][0])); 
     193            //pos[v][1] = min((double)height, max((double)0, pos[v][1])); 
     194        } 
     195 
     196        temperature = temperature * 0.96; 
    235197    } 
    236198 
     
    328290    //cout << "0" << endl; 
    329291    coors = (PyArrayObject *) PyArray_FromDims(2, dims, NPY_DOUBLE); 
    330     filter = (PyArrayObject *) PyArray_FromDims(1, dims, NPY_BOOL); 
    331292    pos = pymatrix_to_Carrayptrs(coors); 
    332     nodes = pyvector_to_Carrayptrs(filter); 
    333293 
    334294    random(); 
     
    501461} 
    502462 
    503 PyObject *NetworkOptimization_get_filter(PyObject *self, PyObject *args) /*P Y A RGS(METH_VARARGS, "() -> Filter")*/ 
    504 { 
    505     CAST_TO(TNetworkOptimization, graph);    
    506     Py_INCREF(graph->filter); 
    507     return (PyObject *)graph->filter;   
    508 } 
    509  
    510463PyObject *NetworkOptimization_random(PyObject *self, PyObject *args) PYARGS(METH_VARARGS, "() -> None") 
    511464{ 
     
    516469    RETURN_NONE; 
    517470} 
    518  
    519 PyObject *NetworkOptimization_selectAll(PyObject *self, PyObject *args) PYARGS(METH_VARARGS, "() -> None") 
    520 { 
    521     CAST_TO(TNetworkOptimization, graph); 
    522  
    523     int i; 
    524     for (i = 0; i < graph->nVertices; i++) 
    525         graph->nodes[i] = true; 
    526      
    527     RETURN_NONE; 
    528 } 
    529  
    530 PyObject *NetworkOptimization_unselectAll(PyObject *self, PyObject *args) PYARGS(METH_VARARGS, "() -> None") 
    531 { 
    532     CAST_TO(TNetworkOptimization, graph); 
    533  
    534     int i; 
    535     for (i = 0; i < graph->nVertices; i++) 
    536         graph->nodes[i] = false; 
    537      
    538     RETURN_NONE; 
    539 } 
    540  
     471/* 
    541472void temp(TGraph &graph) 
    542473{ 
    543474    graph = TGraphAsList(5, 0, false); 
    544475} 
    545  
     476*/ 
    546477WRAPPER(ExampleTable) 
    547478 
  • source/orangeom/networkoptimization.hpp

    r3684 r3685  
    9292    int height; //PR 
    9393    PyArrayObject *coors; 
    94     PyArrayObject *filter; 
    9594 
    9695    int nLinks; 
    9796    int nVertices; 
    9897    int **links; 
    99     bool *nodes; 
    10098    double **pos; 
    101     double attractiveForce(double x); 
    102     double repulsiveForce(double x); 
    103     double cool(double t); 
    104     bool isFilter(); 
    10599}; 
    106100 
Note: See TracChangeset for help on using the changeset viewer.