Commit 66d1c0ff25344b0baaf4ad4a5a41bdc8b40c9c07
1 parent
3b14b0f5
fixed some cuda compilation errors regarding operator<< & operator>> for edge and vertex classes.
Showing
1 changed file
with
56 additions
and
33 deletions
Show diff stats
stim/biomodels/network.h
@@ -12,10 +12,9 @@ | @@ -12,10 +12,9 @@ | ||
12 | #include <stim/visualization/obj.h> | 12 | #include <stim/visualization/obj.h> |
13 | #include <stim/visualization/swc.h> | 13 | #include <stim/visualization/swc.h> |
14 | #include <stim/visualization/cylinder.h> | 14 | #include <stim/visualization/cylinder.h> |
15 | -#include <stim/structures/kdtree.cuh> | ||
16 | #include <stim/cuda/cudatools/timer.h> | 15 | #include <stim/cuda/cudatools/timer.h> |
17 | #include <stim/cuda/cudatools/callable.h> | 16 | #include <stim/cuda/cudatools/callable.h> |
18 | - | 17 | +#include <stim/structures/kdtree.cuh> |
19 | //********************help function******************** | 18 | //********************help function******************** |
20 | // gaussian_function | 19 | // gaussian_function |
21 | CUDA_CALLABLE float gaussianFunction(float x, float std = 25) { return exp(-x / (2 * std*std)); } // std default sigma value is 25 | 20 | CUDA_CALLABLE float gaussianFunction(float x, float std = 25) { return exp(-x / (2 * std*std)); } // std default sigma value is 25 |
@@ -64,13 +63,13 @@ class network{ | @@ -64,13 +63,13 @@ class network{ | ||
64 | class edge : public cylinder<T> | 63 | class edge : public cylinder<T> |
65 | { | 64 | { |
66 | public: | 65 | public: |
67 | - unsigned v[2]; //unique id's designating the starting and ending | 66 | + unsigned int v[2]; //unique id's designating the starting and ending |
68 | // default constructor | 67 | // default constructor |
69 | edge() : cylinder<T>() { | 68 | edge() : cylinder<T>() { |
70 | v[1] = (unsigned)(-1); v[0] = (unsigned)(-1); | 69 | v[1] = (unsigned)(-1); v[0] = (unsigned)(-1); |
71 | } | 70 | } |
72 | /// Constructor - creates an edge from a list of points by calling the stim::fiber constructor | 71 | /// Constructor - creates an edge from a list of points by calling the stim::fiber constructor |
73 | - | 72 | +/* |
74 | ///@param v0, the starting index. | 73 | ///@param v0, the starting index. |
75 | ///@param v1, the ending index. | 74 | ///@param v1, the ending index. |
76 | ///@param sz, the number of point in the fiber. | 75 | ///@param sz, the number of point in the fiber. |
@@ -78,7 +77,7 @@ class network{ | @@ -78,7 +77,7 @@ class network{ | ||
78 | { | 77 | { |
79 | 78 | ||
80 | } | 79 | } |
81 | - | 80 | +*/ |
82 | ///@param p is an array of positions in space | 81 | ///@param p is an array of positions in space |
83 | edge(stim::centerline<T> p) : cylinder<T>(p){} | 82 | edge(stim::centerline<T> p) : cylinder<T>(p){} |
84 | 83 | ||
@@ -114,11 +113,11 @@ class network{ | @@ -114,11 +113,11 @@ class network{ | ||
114 | return E; | 113 | return E; |
115 | } | 114 | } |
116 | /// operator for writing the edge information into a binary .nwt file. | 115 | /// operator for writing the edge information into a binary .nwt file. |
117 | - std::ofstream& operator<<(std::ofstream& out, const edge<T>& e) | 116 | + friend std::ofstream& operator<<(std::ofstream& out, const edge& e) |
118 | { | 117 | { |
119 | out.write(reinterpret_cast<const char*>(&e.v[0]), sizeof(unsigned int)); ///write the starting point. | 118 | out.write(reinterpret_cast<const char*>(&e.v[0]), sizeof(unsigned int)); ///write the starting point. |
120 | out.write(reinterpret_cast<const char*>(&e.v[1]), sizeof(unsigned int)); ///write the ending point. | 119 | out.write(reinterpret_cast<const char*>(&e.v[1]), sizeof(unsigned int)); ///write the ending point. |
121 | - unsigned int sz = size(); ///write the number of point in the edge. | 120 | + unsigned int sz = e.size(); ///write the number of point in the edge. |
122 | out.write(reinterpret_cast<const char*>(&sz), sizeof(unsigned int)); | 121 | out.write(reinterpret_cast<const char*>(&sz), sizeof(unsigned int)); |
123 | for(int i = 0; i < sz; i++) ///write each point | 122 | for(int i = 0; i < sz; i++) ///write each point |
124 | { | 123 | { |
@@ -133,25 +132,26 @@ class network{ | @@ -133,25 +132,26 @@ class network{ | ||
133 | } | 132 | } |
134 | 133 | ||
135 | /// operator for reading an edge from a binary .nwt file. | 134 | /// operator for reading an edge from a binary .nwt file. |
136 | - std::ofstream& operator>>(std::ofstream& in, edge<T>& e) | 135 | + friend std::ifstream& operator>>(std::ifstream& in, edge& e) |
137 | { | 136 | { |
138 | - unsigned int v0, v1, sz; | ||
139 | - in.read((reinterpret_cast<const char*>(&v[0]), sizeof(unsigned int)); //read the staring point. | ||
140 | - in.read((reinterpret_cast<const char*>(&v[1]), sizeof(unsigned int)); //read the ending point | ||
141 | - in.read((reinterpret_cast<const char*>(&sz), sizeof(unsigned int)); //read the number of points in the edge | ||
142 | - stim::centerline temp = stim::centerline(sz) //allocate the new edge | 137 | +// unsigned int v0, v1, sz; |
138 | + unsigned int sz; | ||
139 | + in.read(reinterpret_cast<char*>(&e.v[0]), sizeof(unsigned int)); //read the staring point. | ||
140 | + in.read(reinterpret_cast<char*>(&e.v[1]), sizeof(unsigned int)); //read the ending point | ||
141 | + in.read(reinterpret_cast<char*>(&sz), sizeof(unsigned int)); //read the number of points in the edge | ||
142 | + stim::centerline<T> temp = stim::centerline<T>(sz); //allocate the new edge | ||
143 | e = edge(temp); | 143 | e = edge(temp); |
144 | for(int i = 0; i < sz; i++) //set the points and radii to the newly read values | 144 | for(int i = 0; i < sz; i++) //set the points and radii to the newly read values |
145 | { | 145 | { |
146 | stim::vec3<T> point; | 146 | stim::vec3<T> point; |
147 | - in.read((reinterpret_cast<const char*>(&point[0]) 3*sizeof(T)); | 147 | + in.read(reinterpret_cast<char*>(&point[0]), 3*sizeof(T)); |
148 | e[i] = point; | 148 | e[i] = point; |
149 | T mag; | 149 | T mag; |
150 | -// for(int j = 0; j < nmags(); j++) ///future code for mags | ||
151 | -// { | ||
152 | - in.read(reinterpret_cast<const char*>(&mag), sizeof(T)); | 150 | + // for(int j = 0; j < nmags(); j++) ///future code for mags |
151 | + // { | ||
152 | + in.read(reinterpret_cast<char*>(&mag), sizeof(T)); | ||
153 | set_r(0, mag); | 153 | set_r(0, mag); |
154 | -// } | 154 | + // } |
155 | } | 155 | } |
156 | return in; | 156 | return in; |
157 | } | 157 | } |
@@ -169,7 +169,8 @@ class network{ | @@ -169,7 +169,8 @@ class network{ | ||
169 | vertex(stim::vec3<T> p) : stim::vec3<T>(p){} | 169 | vertex(stim::vec3<T> p) : stim::vec3<T>(p){} |
170 | 170 | ||
171 | /// Output the vertex information as a string | 171 | /// Output the vertex information as a string |
172 | - std::string str(){ | 172 | + std::string |
173 | + str(){ | ||
173 | std::stringstream ss; | 174 | std::stringstream ss; |
174 | ss<<"\t(x, y, z) = "<<stim::vec3<T>::str(); | 175 | ss<<"\t(x, y, z) = "<<stim::vec3<T>::str(); |
175 | 176 | ||
@@ -187,31 +188,35 @@ class network{ | @@ -187,31 +188,35 @@ class network{ | ||
187 | return ss.str(); | 188 | return ss.str(); |
188 | } | 189 | } |
189 | ///operator for writing the edge into the stream; | 190 | ///operator for writing the edge into the stream; |
190 | - std::ofstream& operator<<(std::ofstream& out, const vertex& v) | 191 | + friend std::ofstream& operator<<(std::ofstream& out, const vertex& v) |
191 | { | 192 | { |
193 | + unsigned int s0, s1; | ||
194 | + s0 = v.e[0].size(); | ||
195 | + s1 = v.e[1].size(); | ||
192 | out.write(reinterpret_cast<const char*>(&v[0]), 3*sizeof(T)); | 196 | out.write(reinterpret_cast<const char*>(&v[0]), 3*sizeof(T)); |
193 | - out.write(reinterpret_cast<const char*>(&v.e[0].size()), sizeof(unsigned int)); | ||
194 | - out.write(reinterpret_cast<const char*>(&v.e[1].size()), sizeof(unsigned int)); | 197 | + out.write(reinterpret_cast<const char*>(&s0), sizeof(unsigned int)); |
198 | + out.write(reinterpret_cast<const char*>(&s1), sizeof(unsigned int)); | ||
195 | out.write(reinterpret_cast<const char*>(&v.e[0][0]), sizeof(unsigned int)*v.e[0].size()); | 199 | out.write(reinterpret_cast<const char*>(&v.e[0][0]), sizeof(unsigned int)*v.e[0].size()); |
196 | out.write(reinterpret_cast<const char*>(&v.e[1][0]), sizeof(unsigned int)*v.e[1].size()); | 200 | out.write(reinterpret_cast<const char*>(&v.e[1][0]), sizeof(unsigned int)*v.e[1].size()); |
197 | return out; | 201 | return out; |
198 | } | 202 | } |
199 | 203 | ||
200 | ///operator for reading the edge out of the stream; | 204 | ///operator for reading the edge out of the stream; |
201 | - std::ofstream& operator<<(std::ofstream& in, vertex& v) | 205 | + friend std::ifstream& operator>>(std::ifstream& in, vertex& v) |
202 | { | 206 | { |
203 | - in.read(reinterpret_cast<const char*>(&v[0]), 3*sizeof(T)) | 207 | + in.read(reinterpret_cast<char*>(&v[0]), 3*sizeof(T)); |
204 | unsigned int s[2]; | 208 | unsigned int s[2]; |
205 | - in.read(reinterpret_cast<const char*>(&s[0]), 2*sizeof(unsigned int)); | 209 | + in.read(reinterpret_cast<char*>(&s[0]), 2*sizeof(unsigned int)); |
206 | 210 | ||
207 | std::vector<unsigned int> one(s[0]); | 211 | std::vector<unsigned int> one(s[0]); |
208 | std::vector<unsigned int> two(s[1]); | 212 | std::vector<unsigned int> two(s[1]); |
209 | v.e[0] = one; | 213 | v.e[0] = one; |
210 | v.e[1] = two; | 214 | v.e[1] = two; |
211 | - in.read(reinterpret_cast<const char*>(&v.e[0][0]),s[0]*sizeof(unsigned int)); | ||
212 | - in.read(reinterpret_cast<const char*>(&v.e[1][0]),s[1]*sizeof(unsigned int)); | 215 | + in.read(reinterpret_cast<char*>(&v.e[0][0]),s[0]*sizeof(unsigned int)); |
216 | + in.read(reinterpret_cast<char*>(&v.e[1][0]),s[1]*sizeof(unsigned int)); | ||
213 | return in; | 217 | return in; |
214 | } | 218 | } |
219 | + | ||
215 | }; | 220 | }; |
216 | 221 | ||
217 | protected: | 222 | protected: |
@@ -519,27 +524,45 @@ public: | @@ -519,27 +524,45 @@ public: | ||
519 | 524 | ||
520 | } | 525 | } |
521 | } | 526 | } |
527 | + | ||
522 | ///loads a .nwt file. Reads the header and loads the data into the network according to the header. | 528 | ///loads a .nwt file. Reads the header and loads the data into the network according to the header. |
523 | -/* void | 529 | + void |
524 | loadNwt(std::string filename) | 530 | loadNwt(std::string filename) |
525 | { | 531 | { |
526 | 532 | ||
527 | } | 533 | } |
528 | 534 | ||
529 | ///saves a .nwt file. Writes the header in raw text format, then saves the network as a binary file. | 535 | ///saves a .nwt file. Writes the header in raw text format, then saves the network as a binary file. |
530 | - /// | ||
531 | void | 536 | void |
532 | saveNwt(std::string filename) | 537 | saveNwt(std::string filename) |
533 | { | 538 | { |
534 | - | 539 | + std::ofstream file; |
540 | + file.open(filename, std::ios::out | std::ios::binary); | ||
541 | + for(int i = 0; i < V.size(); i++) | ||
542 | + { | ||
543 | + file << V[i]; | ||
544 | + } | ||
545 | + for(int i = 0; i < E.size(); i++) | ||
546 | + { | ||
547 | + file << E[i]; | ||
548 | + } | ||
535 | } | 549 | } |
536 | 550 | ||
551 | + | ||
552 | + ///Writes the header information to a .nwt file. | ||
537 | void | 553 | void |
538 | writeHeader(std::string filename) | 554 | writeHeader(std::string filename) |
539 | { | 555 | { |
540 | 556 | ||
541 | } | 557 | } |
542 | -*/ | 558 | + |
559 | + ///Reads the header information from a .nwt file. | ||
560 | + void | ||
561 | + readHeader(std::string filename, unsigned int &dims) | ||
562 | + { | ||
563 | + | ||
564 | + } | ||
565 | + | ||
543 | //load a network from an SWC file | 566 | //load a network from an SWC file |
544 | void load_swc(std::string filename) { | 567 | void load_swc(std::string filename) { |
545 | stim::swc<T> S; // create swc variable | 568 | stim::swc<T> S; // create swc variable |
@@ -819,7 +842,7 @@ public: | @@ -819,7 +842,7 @@ public: | ||
819 | T* query = new T[3 * n]; | 842 | T* query = new T[3 * n]; |
820 | T* m1 = new T[n]; | 843 | T* m1 = new T[n]; |
821 | T* dists = new T[n]; | 844 | T* dists = new T[n]; |
822 | - size* nnIdx = new size_t[n]; | 845 | + size_t* nnIdx = new size_t[n]; |
823 | 846 | ||
824 | edge2array(query, R.E[e]); | 847 | edge2array(query, R.E[e]); |
825 | 848 | ||
@@ -1097,7 +1120,7 @@ public: | @@ -1097,7 +1120,7 @@ public: | ||
1097 | stim::vec3<T> p0, p1; | 1120 | stim::vec3<T> p0, p1; |
1098 | T* queryPt = new T[3]; | 1121 | T* queryPt = new T[3]; |
1099 | 1122 | ||
1100 | - for(unsigned e = 0; e < R.E.size(); e++){ // for each edge in A | 1123 | + for(unsigned int e = 0; e < R.E.size(); e++){ // for each edge in A |
1101 | T M; // the sum of metrics of current edge | 1124 | T M; // the sum of metrics of current edge |
1102 | for(unsigned p = 0; p < R.E[e].size(); p++) | 1125 | for(unsigned p = 0; p < R.E[e].size(); p++) |
1103 | M += A.E[e].r(p); | 1126 | M += A.E[e].r(p); |