Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/calcunits/QBits.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Wed Aug 3 10:14:23 2011 UTC (12 years, 9 months ago) by kaityo
File MIME type: text/x-c++src
File size: 12006 byte(s)
First commit
1 //---------------------------------------------------------------------------
2 // Represent bits states
3 //---------------------------------------------------------------------------
4 #ifdef __BORLANDC__
5 #include <vcl.h>
6 #pragma hdrstop
7 #endif //__BORLANDC__
8
9 #include <iostream>
10 #include <fstream>
11 #include <string>
12 #include <new>
13 #include <cstdlib>
14 #include <math.h>
15 #include "QBits.h"
16
17 using namespace std;
18
19 //---------------------------------------------------------------------------
20 #ifdef __BORLANDC__
21 #pragma package(smart_init)
22 #endif //__BORLANDC__
23 //---------------------------------------------------------------------------
24 /**
25 * operator<<
26 */
27 std::ostream &
28 operator<<(std::ostream &os, const QBits &qb) {
29
30 std::string s1;
31 for (int i = 0; i < qb.mNumberOfStates; i++) {
32 s1 = "";
33 for (int j = 0; j < qb.mNumberOfQbits; j++) {
34 if ((i >> j) & 1) {
35 s1 = "1" + s1;
36 } else {
37 s1 = "0" + s1;
38 }
39 }
40 s1 = "|" + s1 + "> = ";
41 os << s1 << qb.mBitsR[i]
42 << " + " << qb.mBitsI[i]
43 << "i\n";
44 }
45 return os;
46 }
47 //---------------------------------------------------------------------------
48 /**
49 * operator<<
50 */
51 std::ostream
52 &operator<<(std::ostream &os, const QBits *qb) {
53 return (os << *qb);
54 }
55 //---------------------------------------------------------------------------
56 /**
57 * Constructor
58 */
59 QBits::QBits(char * filename) {
60 LoadFromFile(filename);
61 }
62 //---------------------------------------------------------------------------
63 /**
64 * Constructor
65 */
66 QBits::QBits(void) {
67 mBitsR = NULL;
68 mBitsI = NULL;
69 mBitsM = NULL;
70 mMeasured =NULL;
71 bValid = false;
72 }
73 //---------------------------------------------------------------------------
74 /**
75 * Constructor
76 */
77 QBits::QBits(const int n) {
78 mBitsR = NULL;
79 mBitsI = NULL;
80 mBitsM = NULL;
81 mMeasured =NULL;
82 bValid = false;
83
84 Allocate(n);
85 }
86 //---------------------------------------------------------------------------
87 /**
88 * Copy constructor
89 */
90 QBits::QBits(const QBits &qubits)
91 {
92 mNumberOfQbits = qubits.mNumberOfQbits;
93 mNumberOfStates = qubits.mNumberOfStates;
94 try {
95 mBitsR = new double [mNumberOfStates];
96 mBitsI = new double [mNumberOfStates];
97 mMeasured = new bool [mNumberOfQbits];
98 mBitsM = new double[GetNumberOfMeasured()];
99 } catch (std::bad_alloc ex) {
100 #ifdef __BORLANDC__
101 ShowMessage("QBits: fatal error. Out of Memory.");
102 #endif //__BORLANDC__
103 std::exit(1);
104 }
105
106 for (int i = 0; i < mNumberOfStates; i++){
107 mBitsR[i] = qubits.mBitsR[i];
108 mBitsI[i] = qubits.mBitsI[i];
109 }
110
111 for (int i=0;i<mNumberOfQbits;i++){
112 mMeasured[i] = qubits.mMeasured[i];
113 mBitsM[i] = qubits.mBitsM[i];
114 }
115
116 }
117 //---------------------------------------------------------------------------
118 /**
119 * Destructor
120 */
121 QBits::~QBits() {
122 if (mBitsR != NULL) delete [] mBitsR;
123 if (mBitsI != NULL) delete [] mBitsI;
124 if (mBitsM != NULL) delete [] mBitsM;
125 if (mMeasured !=NULL) delete [] mMeasured;
126 }
127 //---------------------------------------------------------------------------
128 bool
129 QBits::Allocate(int n) {
130 mNumberOfQbits = n;
131 mNumberOfStates = 1 << n;
132
133 if (bValid) {
134 if (mBitsR != NULL) delete [] mBitsR;
135 if (mBitsI != NULL) delete [] mBitsI;
136 if (mMeasured !=NULL) delete [] mMeasured;
137 if (mBitsM != NULL) delete [] mBitsM;
138 }
139
140 bValid = false;
141 try {
142 mBitsR = new double [mNumberOfStates];
143 mBitsI = new double [mNumberOfStates];
144 mMeasured = new bool [mNumberOfQbits];
145 mBitsM = new double[GetNumberOfMeasured()];
146 } catch (std::bad_alloc ex) {
147 #ifdef __BORLANDC__
148 ShowMessage("Error: Out of Memory.");
149 #endif //__BORLANDC__
150 if (mBitsR != NULL) delete [] mBitsR;
151 if (mBitsI != NULL) delete [] mBitsI;
152 if (mMeasured !=NULL) delete [] mMeasured;
153 if (mBitsM != NULL) delete [] mBitsM;
154 return false;
155 }
156 bValid = true;
157
158 Init();
159 return true;
160 }
161 //---------------------------------------------------------------------------
162 /**
163 * Initialize
164 */
165 void
166 QBits::Init(void) {
167 for (int i = 0; i < mNumberOfStates; i++){
168 mBitsR[i] = 0.0;
169 mBitsI[i] = 0.0;
170 }
171 mBitsR[0] = 1.0;
172 for (int i = 0; i < mNumberOfQbits; i++){
173 mMeasured[i] = false;
174 }
175 }
176 //---------------------------------------------------------------------------
177 /**
178 * Get real part of nth state as reference
179 */
180 double &
181 QBits::NthStateR(const int nth) const {
182 if (nth < 0 || mNumberOfStates <= nth) {
183 #ifdef __BORLANDC__
184 ShowMessage("QBits: fatal error");
185 #endif //__BORLANDC__
186 std::exit(1);
187 }
188 return mBitsR[nth];
189 }
190 //---------------------------------------------------------------------------
191 /**
192 * Get imaginary part of nth state as reference
193 */
194 double &
195 QBits::NthStateI(const int nth) const {
196 if (nth < 0 || mNumberOfStates <= nth) {
197 #ifdef __BORLANDC__
198 ShowMessage("QBits: fatal error");
199 #endif //__BORLANDC__
200 std::exit(1);
201 }
202 return mBitsI[nth];
203 }
204 //---------------------------------------------------------------------------
205 /**
206 * Return Absolute Value of index state
207 */
208 double
209 QBits::GetAbsoluteValue(int index){
210 double re = NthStateR(index);
211 double im = NthStateI(index);
212 return re*re+im*im;
213 }
214 //---------------------------------------------------------------------------
215 // Measurement
216 //---------------------------------------------------------------------------
217 int
218 QBits::GetNumberOfMeasured(void){
219 int n = 0;
220 for (int i=0;i<GetNumberOfQBits();i++){
221 if (isMeasured(i)) {
222 n++;
223 }
224 }
225 return n;
226 }
227 //---------------------------------------------------------------------------
228 double
229 QBits::GetMeasuredValue(int index){
230 return mBitsM[index];
231 }
232 //---------------------------------------------------------------------------
233 string
234 QBits::GetMeasuredString(int index){
235
236 string s;
237 int t = 1;
238 for (int j=0;j<GetNumberOfQBits();j++){
239 if (isMeasured(j)){
240 if ( (index >> (t-1) )&1){
241 s = "1" + s;
242 }else{
243 s = "0" + s;
244 }
245 t++;
246 }else{
247 s = "?" + s;
248 }
249 }
250 s = "|" + s + ">";
251 return s;
252 }
253 //---------------------------------------------------------------------------
254 /**
255 * Perform Measurement
256 */
257 void
258 QBits::PerformMeasurement(void){
259 if (mBitsM !=NULL){
260 delete [] mBitsM;
261 }
262
263 int n = 1 << GetNumberOfMeasured();
264
265 try{
266 mBitsM = new double[n];
267 }catch (bad_alloc ex){
268 ShowMessage("QBits: fatal error. Out of Memory.");
269 return;
270 }
271
272 for (int i=0;i<n;i++){
273 mBitsM[i] = 0;
274 }
275
276 for (int i=0;i< GetNumberOfStates();i++){
277 int index = 0;
278 int t = 1;
279 for (int j=0;j<GetNumberOfQBits();j++){
280 if (isMeasured(j)){
281 index += (((i>>j)&1)<<(t-1));
282 t++;
283 }
284 }
285 mBitsM[index] += GetAbsoluteValue(i);
286 }
287 }
288 //---------------------------------------------------------------------------
289 #ifdef __BIG_ENDIAN__
290 #include "swap_endian.h"
291 #endif //__BIG_ENDIAN__
292 //---------------------------------------------------------------------------
293 /**
294 * Load data From File
295 */
296 void QBits::LoadFromFile(const char *filename) {
297 QResultInfo ri;
298 FILE *fp = fopen(filename,"rb");
299
300 #ifdef __BIG_ENDIAN__
301 char cbuf[8];
302 int dummyInt;
303 fread(&ri.header, sizeof(char), 4, fp);
304 fread(&ri.filename, sizeof(char), 4, fp);
305 fread(&dummyInt, sizeof(int), 1, fp);
306 qutil::swap_endian(&dummyInt, cbuf);
307 ri.bitnumber = *(int*)cbuf;
308 #else
309 fread(&ri,sizeof(ri),1,fp);
310 #endif //__BIG_ENDIAN__
311
312 mNumberOfQbits = ri.bitnumber;
313 mNumberOfStates = 1 << ri.bitnumber;
314
315 try {
316 mBitsR = new double [mNumberOfStates];
317 mBitsI = new double [mNumberOfStates];
318 } catch (std::bad_alloc ex) {
319
320 #ifdef __BORLANDC__
321 ShowMessage("QBits: fatal error");
322 #endif //__BORLANDC__
323
324 std::exit(1);
325 fclose(fp);
326 }
327
328 #ifdef __BIG_ENDIAN__
329 double dummyDouble;
330 for (int i = 0; i < mNumberOfStates; i++)
331 {
332 fread(&dummyDouble, sizeof(double), 1, fp);
333 qutil::swap_endian(&dummyDouble, cbuf);
334 mBitsR[i] = *(double*)cbuf;
335 }
336 for (int i = 0; i < mNumberOfStates; i++)
337 {
338 fread(&dummyDouble, sizeof(double), 1, fp);
339 qutil::swap_endian(&dummyDouble, cbuf);
340 mBitsI[i] = *(double*)cbuf;
341 }
342 #else
343 fread(mBitsR,sizeof(double),mNumberOfStates,fp);
344 fread(mBitsI,sizeof(double),mNumberOfStates,fp);
345 #endif //__BIG_ENDIAN__
346
347 fclose(fp);
348 }
349 //---------------------------------------------------------------------------
350 /**
351 * Save data to File
352 */
353 void
354 QBits::SaveToFile(const char *filename) {
355 QResultInfo ri;
356 ri.bitnumber = GetNumberOfQBits();
357 strcpy(ri.filename,filename);
358
359 int datasize = 1<<GetNumberOfQBits();
360 double *R = GetBitsR();
361 double *I = GetBitsI();
362
363 FILE *fp = fopen(filename,"wb");
364
365 #ifdef __BIG_ENDIAN__
366 char cbuf[8];
367 fwrite(ri.header, sizeof(char), 4, fp);
368 fwrite(ri.filename, sizeof(char), 256, fp);
369 qutil::swap_endian(&ri.bitnumber, cbuf);
370 fwrite(cbuf, sizeof(int), 1, fp);
371 for (int i = 0; i < datasize; i++) {
372 qutil::swap_endian(&R[i], cbuf);
373 fwrite(cbuf, sizeof(double), 1, fp);
374 }
375 for (int i = 0; i < datasize; i++) {
376 qutil::swap_endian(&I[i], cbuf);
377 fwrite(cbuf, sizeof(double), 1, fp);
378 }
379 #else
380 fwrite(&ri,sizeof(ri),1,fp);
381 fwrite(R,sizeof(double),datasize,fp);
382 fwrite(I,sizeof(double),datasize,fp);
383 #endif //__BIG_ENDIAN__
384 fclose(fp);
385 }
386 //---------------------------------------------------------------------------
387 /**
388 * Save data as Text File
389 */
390 void
391 QBits::SaveAsText(const char *filename) {
392
393 ofstream ofs;
394 ofs.open(filename);
395 ofs << "#QCAD Result file" << endl;
396 ofs << "#ex) Index), (Qubits conf.), (Abs. value), (Re. part), (Im. part)" << endl;
397 ofs << "#ex) 0, |00000> , 1.000 , 0.4455 , 0.23 " << endl;
398 SaveToStream(ofs);
399 ofs.close();
400 }
401 //---------------------------------------------------------------------------
402 void
403 QBits::SaveMeasurementToStream(ostream &os){
404 int n = 1 << GetNumberOfMeasured();
405 for (int i=0;i<n;i++){
406 os << i;
407 os << ", ";
408 os << GetMeasuredString(i);
409 os << ", ";
410 os.setf(ios::fixed | ios::floatfield);
411 os.precision(8);
412 os.setf(ios::showpoint);
413 os << GetMeasuredValue(i) << endl;
414 }
415 }
416 //---------------------------------------------------------------------------
417 /**
418 * Save data as Text File
419 */
420 void
421 QBits::SaveToStream(ostream &ss){
422 double *R = GetBitsR();
423 double *I = GetBitsI();
424
425 for (int i=0;i< GetNumberOfStates();i++){
426 string s;
427 for (int j=0;j<GetNumberOfQBits();j++){
428 if ((i>>j)&1) {
429 s = "1" + s;
430 } else {
431 s = "0" + s;
432 }
433 }
434 s = "|" + s + ">";
435 double a = sqrt(R[i]*R[i]+I[i]*I[i]); //abs. value
436 ss << i << "," << s << ",";
437 ss.width(10);
438 ss.setf(ios::fixed, ios::floatfield);
439 ss.setf(ios::showpoint);
440 ss << a << "," << R[i] << "," << I[i] << endl;
441 }
442 }
443 //---------------------------------------------------------------------------
444

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26