1 //---------------------------------------------------------------------------
\r
2 // Represent bits states
\r
3 //---------------------------------------------------------------------------
\r
7 #endif //__BORLANDC__
\r
17 using namespace std;
\r
19 //---------------------------------------------------------------------------
\r
21 #pragma package(smart_init)
\r
22 #endif //__BORLANDC__
\r
23 //---------------------------------------------------------------------------
\r
28 operator<<(std::ostream &os, const QBits &qb) {
\r
31 for (int i = 0; i < qb.mNumberOfStates; i++) {
\r
33 for (int j = 0; j < qb.mNumberOfQbits; j++) {
\r
40 s1 = "|" + s1 + "> = ";
\r
41 os << s1 << qb.mBitsR[i]
\r
42 << " + " << qb.mBitsI[i]
\r
47 //---------------------------------------------------------------------------
\r
52 &operator<<(std::ostream &os, const QBits *qb) {
\r
55 //---------------------------------------------------------------------------
\r
59 QBits::QBits(char * filename) {
\r
60 LoadFromFile(filename);
\r
62 //---------------------------------------------------------------------------
\r
66 QBits::QBits(void) {
\r
73 //---------------------------------------------------------------------------
\r
77 QBits::QBits(const int n) {
\r
86 //---------------------------------------------------------------------------
\r
90 QBits::QBits(const QBits &qubits)
\r
92 mNumberOfQbits = qubits.mNumberOfQbits;
\r
93 mNumberOfStates = qubits.mNumberOfStates;
\r
95 mBitsR = new double [mNumberOfStates];
\r
96 mBitsI = new double [mNumberOfStates];
\r
97 mMeasured = new bool [mNumberOfQbits];
\r
98 mBitsM = new double[GetNumberOfMeasured()];
\r
99 } catch (std::bad_alloc ex) {
\r
100 #ifdef __BORLANDC__
\r
101 ShowMessage("QBits: fatal error. Out of Memory.");
\r
102 #endif //__BORLANDC__
\r
106 for (int i = 0; i < mNumberOfStates; i++){
\r
107 mBitsR[i] = qubits.mBitsR[i];
\r
108 mBitsI[i] = qubits.mBitsI[i];
\r
111 for (int i=0;i<mNumberOfQbits;i++){
\r
112 mMeasured[i] = qubits.mMeasured[i];
\r
113 mBitsM[i] = qubits.mBitsM[i];
\r
117 //---------------------------------------------------------------------------
\r
122 if (mBitsR != NULL) delete [] mBitsR;
\r
123 if (mBitsI != NULL) delete [] mBitsI;
\r
124 if (mBitsM != NULL) delete [] mBitsM;
\r
125 if (mMeasured !=NULL) delete [] mMeasured;
\r
127 //---------------------------------------------------------------------------
\r
129 QBits::Allocate(int n) {
\r
130 mNumberOfQbits = n;
\r
131 mNumberOfStates = 1 << n;
\r
134 if (mBitsR != NULL) delete [] mBitsR;
\r
135 if (mBitsI != NULL) delete [] mBitsI;
\r
136 if (mMeasured !=NULL) delete [] mMeasured;
\r
137 if (mBitsM != NULL) delete [] mBitsM;
\r
142 mBitsR = new double [mNumberOfStates];
\r
143 mBitsI = new double [mNumberOfStates];
\r
144 mMeasured = new bool [mNumberOfQbits];
\r
145 mBitsM = new double[GetNumberOfMeasured()];
\r
146 } catch (std::bad_alloc ex) {
\r
147 #ifdef __BORLANDC__
\r
148 ShowMessage("Error: Out of Memory.");
\r
149 #endif //__BORLANDC__
\r
150 if (mBitsR != NULL) delete [] mBitsR;
\r
151 if (mBitsI != NULL) delete [] mBitsI;
\r
152 if (mMeasured !=NULL) delete [] mMeasured;
\r
153 if (mBitsM != NULL) delete [] mBitsM;
\r
161 //---------------------------------------------------------------------------
\r
166 QBits::Init(void) {
\r
167 for (int i = 0; i < mNumberOfStates; i++){
\r
172 for (int i = 0; i < mNumberOfQbits; i++){
\r
173 mMeasured[i] = false;
\r
176 //---------------------------------------------------------------------------
\r
178 * Get real part of nth state as reference
\r
181 QBits::NthStateR(const int nth) const {
\r
182 if (nth < 0 || mNumberOfStates <= nth) {
\r
183 #ifdef __BORLANDC__
\r
184 ShowMessage("QBits: fatal error");
\r
185 #endif //__BORLANDC__
\r
188 return mBitsR[nth];
\r
190 //---------------------------------------------------------------------------
\r
192 * Get imaginary part of nth state as reference
\r
195 QBits::NthStateI(const int nth) const {
\r
196 if (nth < 0 || mNumberOfStates <= nth) {
\r
197 #ifdef __BORLANDC__
\r
198 ShowMessage("QBits: fatal error");
\r
199 #endif //__BORLANDC__
\r
202 return mBitsI[nth];
\r
204 //---------------------------------------------------------------------------
\r
206 * Return Absolute Value of index state
\r
209 QBits::GetAbsoluteValue(int index){
\r
210 double re = NthStateR(index);
\r
211 double im = NthStateI(index);
\r
212 return re*re+im*im;
\r
214 //---------------------------------------------------------------------------
\r
216 //---------------------------------------------------------------------------
\r
218 QBits::GetNumberOfMeasured(void){
\r
220 for (int i=0;i<GetNumberOfQBits();i++){
\r
221 if (isMeasured(i)) {
\r
227 //---------------------------------------------------------------------------
\r
229 QBits::GetMeasuredValue(int index){
\r
230 return mBitsM[index];
\r
232 //---------------------------------------------------------------------------
\r
234 QBits::GetMeasuredString(int index){
\r
238 for (int j=0;j<GetNumberOfQBits();j++){
\r
239 if (isMeasured(j)){
\r
240 if ( (index >> (t-1) )&1){
\r
253 //---------------------------------------------------------------------------
\r
255 * Perform Measurement
\r
258 QBits::PerformMeasurement(void){
\r
259 if (mBitsM !=NULL){
\r
263 int n = 1 << GetNumberOfMeasured();
\r
266 mBitsM = new double[n];
\r
267 }catch (bad_alloc ex){
\r
268 #ifdef __BORLANDC__
\r
269 ShowMessage("QBits: fatal error. Out of Memory.");
\r
274 for (int i=0;i<n;i++){
\r
278 for (int i=0;i< GetNumberOfStates();i++){
\r
281 for (int j=0;j<GetNumberOfQBits();j++){
\r
282 if (isMeasured(j)){
\r
283 index += (((i>>j)&1)<<(t-1));
\r
287 mBitsM[index] += GetAbsoluteValue(i);
\r
290 //---------------------------------------------------------------------------
\r
291 #ifdef __BIG_ENDIAN__
\r
292 #include "swap_endian.h"
\r
293 #endif //__BIG_ENDIAN__
\r
294 //---------------------------------------------------------------------------
\r
296 * Load data From File
\r
298 void QBits::LoadFromFile(const char *filename) {
\r
300 FILE *fp = fopen(filename,"rb");
\r
302 #ifdef __BIG_ENDIAN__
\r
305 fread(&ri.header, sizeof(char), 4, fp);
\r
306 fread(&ri.filename, sizeof(char), 4, fp);
\r
307 fread(&dummyInt, sizeof(int), 1, fp);
\r
308 qutil::swap_endian(&dummyInt, cbuf);
\r
309 ri.bitnumber = *(int*)cbuf;
\r
311 fread(&ri,sizeof(ri),1,fp);
\r
312 #endif //__BIG_ENDIAN__
\r
314 mNumberOfQbits = ri.bitnumber;
\r
315 mNumberOfStates = 1 << ri.bitnumber;
\r
318 mBitsR = new double [mNumberOfStates];
\r
319 mBitsI = new double [mNumberOfStates];
\r
320 } catch (std::bad_alloc ex) {
\r
322 #ifdef __BORLANDC__
\r
323 ShowMessage("QBits: fatal error");
\r
324 #endif //__BORLANDC__
\r
330 #ifdef __BIG_ENDIAN__
\r
331 double dummyDouble;
\r
332 for (int i = 0; i < mNumberOfStates; i++)
\r
334 fread(&dummyDouble, sizeof(double), 1, fp);
\r
335 qutil::swap_endian(&dummyDouble, cbuf);
\r
336 mBitsR[i] = *(double*)cbuf;
\r
338 for (int i = 0; i < mNumberOfStates; i++)
\r
340 fread(&dummyDouble, sizeof(double), 1, fp);
\r
341 qutil::swap_endian(&dummyDouble, cbuf);
\r
342 mBitsI[i] = *(double*)cbuf;
\r
345 fread(mBitsR,sizeof(double),mNumberOfStates,fp);
\r
346 fread(mBitsI,sizeof(double),mNumberOfStates,fp);
\r
347 #endif //__BIG_ENDIAN__
\r
351 //---------------------------------------------------------------------------
\r
353 * Save data to File
\r
356 QBits::SaveToFile(const char *filename) {
\r
358 ri.bitnumber = GetNumberOfQBits();
\r
359 strcpy(ri.filename,filename);
\r
361 int datasize = 1<<GetNumberOfQBits();
\r
362 double *R = GetBitsR();
\r
363 double *I = GetBitsI();
\r
365 FILE *fp = fopen(filename,"wb");
\r
367 #ifdef __BIG_ENDIAN__
\r
369 fwrite(ri.header, sizeof(char), 4, fp);
\r
370 fwrite(ri.filename, sizeof(char), 256, fp);
\r
371 qutil::swap_endian(&ri.bitnumber, cbuf);
\r
372 fwrite(cbuf, sizeof(int), 1, fp);
\r
373 for (int i = 0; i < datasize; i++) {
\r
374 qutil::swap_endian(&R[i], cbuf);
\r
375 fwrite(cbuf, sizeof(double), 1, fp);
\r
377 for (int i = 0; i < datasize; i++) {
\r
378 qutil::swap_endian(&I[i], cbuf);
\r
379 fwrite(cbuf, sizeof(double), 1, fp);
\r
382 fwrite(&ri,sizeof(ri),1,fp);
\r
383 fwrite(R,sizeof(double),datasize,fp);
\r
384 fwrite(I,sizeof(double),datasize,fp);
\r
385 #endif //__BIG_ENDIAN__
\r
388 //---------------------------------------------------------------------------
\r
390 * Save data as Text File
\r
393 QBits::SaveAsText(const char *filename) {
\r
396 ofs.open(filename);
\r
397 ofs << "#QCAD Result file" << endl;
\r
398 ofs << "#ex) Index), (Qubits conf.), (Abs. value), (Re. part), (Im. part)" << endl;
\r
399 ofs << "#ex) 0, |00000> , 1.000 , 0.4455 , 0.23 " << endl;
\r
403 //---------------------------------------------------------------------------
\r
405 QBits::SaveMeasurementToStream(ostream &os){
\r
406 int n = 1 << GetNumberOfMeasured();
\r
407 for (int i=0;i<n;i++){
\r
410 os << GetMeasuredString(i);
\r
412 os.setf(ios::fixed | ios::floatfield);
\r
414 os.setf(ios::showpoint);
\r
415 os << GetMeasuredValue(i) << endl;
\r
418 //---------------------------------------------------------------------------
\r
420 * Save data as Text File
\r
423 QBits::SaveToStream(ostream &ss){
\r
424 double *R = GetBitsR();
\r
425 double *I = GetBitsI();
\r
427 for (int i=0;i< GetNumberOfStates();i++){
\r
429 for (int j=0;j<GetNumberOfQBits();j++){
\r
437 double a = sqrt(R[i]*R[i]+I[i]*I[i]); //abs. value
\r
438 ss << i << "," << s << ",";
\r
440 ss.setf(ios::fixed, ios::floatfield);
\r
441 ss.setf(ios::showpoint);
\r
442 ss << a << "," << R[i] << "," << I[i] << endl;
\r
445 //---------------------------------------------------------------------------
\r