updated libquantum 0.2.3 source files

This commit is contained in:
libquantum
2016-10-27 04:18:31 +09:00
parent 8f37efac24
commit 42c207188a
17 changed files with 11664 additions and 3901 deletions

View File

@@ -1,3 +1,10 @@
libquantum 0.2.3:
- Added density operator formalism
- Added functions for dot product and purity
- Usage of fabsf led to trouble on Solaris, replaced by fabs
- Qureg initialization does not seed RNG anymore
- Fixed some potential installation problems
libquantum 0.2.2:
- Added quantum object code interface
- Additional configure options for better portability

View File

@@ -1,6 +1,6 @@
# Makefile: Build libquantum
#
# Copyright 2003 Bjoern Butscher, Hendrik Weimer
# Copyright 2003, 2004 Bjoern Butscher, Hendrik Weimer
#
# This file is part of libquantum
#
@@ -25,15 +25,16 @@ SHELL=/bin/sh
# Target directory prefix
PREFIX=@prefix@
EPREFIX=${PREFIX}
PREFIX=$(DESTDIR)@prefix@
EPREFIX=$(PREFIX)
# Other directories
LIBDIR=${EPREFIX}/lib
INCLUDEDIR=${PREFIX}/include
BINDIR=${PREFIX}/bin
LIBDIR=$(EPREFIX)/lib
INCLUDEDIR=$(PREFIX)/include
BINDIR=$(PREFIX)/bin
top_builddir=.
ALLDIRS=$(LIBDIR) $(INCLUDEDIR) $(BINDIR)
# Version information
@@ -48,7 +49,7 @@ LIBTOOL=@LIBTOOL@
# Flags passed to C compiler
CFLAGS=@CFLAGS@
LDFLAGS=-rpath $(LIBDIR) -version-info 4:0:1
LDFLAGS=-rpath $(LIBDIR) -version-info 5:0:2
# Dependencies
@@ -59,85 +60,92 @@ Makefile: Makefile.in configure.in config.h.in types.h.in quantum.h.in
libquantum.la: complex.lo measure.lo matrix.lo gates.lo qft.lo classic.lo\
qureg.lo decoherence.lo oaddn.lo omuln.lo expn.lo qec.lo version.lo\
objcode.lo Makefile
$(LIBTOOL) $(CC) $(LDFLAGS) -o libquantum.la complex.lo measure.lo\
matrix.lo gates.lo oaddn.lo omuln.lo expn.lo qft.lo classic.lo\
qureg.lo decoherence.lo qec.lo version.lo objcode.lo -lm
objcode.lo density.lo Makefile
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o libquantum.la complex.lo\
measure.lo matrix.lo gates.lo oaddn.lo omuln.lo expn.lo qft.lo\
classic.lo qureg.lo decoherence.lo qec.lo version.lo objcode.lo\
density.lo -lm
complex.lo: complex.c complex.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c complex.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c complex.c
measure.lo: measure.c measure.h matrix.h qureg.h complex.h config.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c measure.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c measure.c
matrix.lo: matrix.c matrix.h complex.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c matrix.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c matrix.c
gates.lo: gates.c gates.h matrix.h defs.h qureg.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c gates.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c gates.c
oaddn.lo: oaddn.c matrix.h defs.h gates.h qureg.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c oaddn.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c oaddn.c
omuln.lo: omuln.c matrix.h gates.h oaddn.h defs.h qureg.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c omuln.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c omuln.c
expn.lo: expn.c expn.h matrix.h gates.h oaddn.h omuln.h qureg.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c expn.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c expn.c
qft.lo: qft.c qft.h matrix.h gates.h qureg.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c qft.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c qft.c
classic.lo: classic.c classic.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c classic.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c classic.c
qureg.lo: qureg.c qureg.h matrix.h config.h complex.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c qureg.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c qureg.c
decoherence.lo: decoherence.c decoherence.h measure.h gates.h qureg.h\
complex.h config.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c decoherence.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c decoherence.c
qec.lo: qec.c qec.h gates.h qureg.h decoherence.h measure.h config.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c qec.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c qec.c
version.lo: version.c version.h config.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c version.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c version.c
objcode.lo: objcode.c objcode.h matrix.h gates.h qureg.h measure.h config.h\
Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -c objcode.c
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c objcode.c
density.lo: density.c density.h matrix.h qureg.h complex.h config.h Makefile
$(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c density.c
# Build demos of Shor's and Grover's algorithms
demos: shor grover
shor: libquantum.la shor.c Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -o shor shor.c -I./ -lquantum -static -lm
$(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o shor shor.c -I./ -lquantum\
-static -lm
grover: libquantum.la grover.c Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -o grover grover.c -I./ -lquantum -static\
-lm
$(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o grover grover.c -I./\
-lquantum -static -lm
# Quantum object code tools
quobtools: quobprint quobdump
quobprint: libquantum.la quobprint.c objcode.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -o quobprint quobprint.c -lquantum
$(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o quobprint quobprint.c\
-lquantum
quobdump: libquantum.la quobdump.c objcode.h Makefile
$(LIBTOOL) $(CC) $(CFLAGS) -o quobdump quobdump.c -lquantum
$(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o quobdump quobdump.c -lquantum
# Bring this savage back home
install: libquantum.la
$(LIBTOOL) $(INSTALL) -m 0644 libquantum.la $(LIBDIR)
$(INSTALL) -d $(ALLDIRS)
$(LIBTOOL) --mode=install $(INSTALL) -m 0644 libquantum.la $(LIBDIR)
$(INSTALL) -m 0644 quantum.h $(INCLUDEDIR)
quobtools_install: quobtools
$(LIBTOOL) $(INSTALL) -m 0755 quobprint $(BINDIR)
$(LIBTOOL) $(INSTALL) -m 0755 quobdump $(BINDIR)
$(LIBTOOL) --mode=install $(INSTALL) -m 0755 quobprint $(BINDIR)
$(LIBTOOL) --mode=install $(INSTALL) -m 0755 quobdump $(BINDIR)
# Make everything neat and tidy
@@ -154,6 +162,6 @@ dist:
-rm quantum.h config.h types.h
mkdir libquantum-$(VERSION)
cp *.c *.h *.in configure COPYING install-sh ltmain.sh config.sub\
config.guess README INSTALL CHANGES libquantum-$(VERSION)
config.guess aclocal.m4 README INSTALL CHANGES libquantum-$(VERSION)
tar czf libquantum-$(VERSION).tar.gz libquantum-$(VERSION)/
rm -rf libquantum-$(VERSION)

4743
aclocal.m4 vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
/* classic.c: Classic operations used in libquantum
Copyright 2003 Bjoern Butscher, Hendrik Weimer
Copyright 2003, 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
@@ -80,7 +80,7 @@ quantum_frac_approx(int *a, int *b, int width)
num1 = num;
den1 = den;
} while(fabsf(((float) num / den) - f) > 1.0 / (2 * (1 << width)));
} while(fabs(((double) num / den) - f) > 1.0 / (2 * (1 << width)));
*a = num;
*b = den;

370
config.guess vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002 Free Software Foundation, Inc.
# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
timestamp='2002-05-29'
timestamp='2004-11-12'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
@@ -88,30 +88,42 @@ if test $# != 0; then
exit 1
fi
trap 'exit 1' 1 2 15
dummy=dummy-$$
trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
# compiler to aid in system detection is discouraged as it requires
# temporary files to be created and, as you can see below, it is a
# headache to deal with in a portable fashion.
# CC_FOR_BUILD -- compiler used by this script.
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
# use `HOST_CC' if defined, but it is deprecated.
set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
,,) echo "int dummy(){}" > $dummy.c ;
# Portable tmp directory creation inspired by the Autoconf team.
set_cc_for_build='
trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
: ${TMPDIR=/tmp} ;
{ tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
dummy=$tmp/dummy ;
tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
case $CC_FOR_BUILD,$HOST_CC,$CC in
,,) echo "int x;" > $dummy.c ;
for c in cc gcc c89 c99 ; do
($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
if test $? = 0 ; then
if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
CC_FOR_BUILD="$c"; break ;
fi ;
done ;
rm -f $dummy.c $dummy.o $dummy.rel ;
if test x"$CC_FOR_BUILD" = x ; then
CC_FOR_BUILD=no_compiler_found ;
fi
;;
,,*) CC_FOR_BUILD=$CC ;;
,*,*) CC_FOR_BUILD=$HOST_CC ;;
esac'
esac ;'
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 1994-08-24)
@@ -168,21 +180,38 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
;;
esac
# The OS release
release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
# Debian GNU/NetBSD machines have a different userland, and
# thus, need a distinct triplet. However, they do not need
# kernel version information, so it can be replaced with a
# suitable tag, in the style of linux-gnu.
case "${UNAME_VERSION}" in
Debian*)
release='-gnu'
;;
*)
release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
;;
esac
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
echo "${machine}-${os}${release}"
exit 0 ;;
amd64:OpenBSD:*:*)
echo x86_64-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
arc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
cats:OpenBSD:*:*)
echo arm-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
luna88k:OpenBSD:*:*)
echo m88k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
@@ -198,83 +227,76 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
mvmeppc:OpenBSD:*:*)
echo powerpc-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
pmax:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sgi:OpenBSD:*:*)
echo mipseb-unknown-openbsd${UNAME_RELEASE}
echo mips64-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sun3:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
wgrisc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
*:OpenBSD:*:*)
echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
*:ekkoBSD:*:*)
echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
exit 0 ;;
macppc:MirBSD:*:*)
echo powerppc-unknown-mirbsd${UNAME_RELEASE}
exit 0 ;;
*:MirBSD:*:*)
echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
exit 0 ;;
alpha:OSF1:*:*)
if test $UNAME_RELEASE = "V4.0"; then
case $UNAME_RELEASE in
*4.0)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
fi
;;
*5.*)
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
;;
esac
# According to Compaq, /usr/sbin/psrinfo has been available on
# OSF/1 and Tru64 systems produced since 1995. I hope that
# covers most systems running today. This code pipes the CPU
# types through head -n 1, so we only detect the type of CPU 0.
ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
case "$ALPHA_CPU_TYPE" in
"EV4 (21064)")
UNAME_MACHINE="alpha" ;;
"EV4.5 (21064)")
UNAME_MACHINE="alpha" ;;
"LCA4 (21066/21068)")
UNAME_MACHINE="alpha" ;;
"EV5 (21164)")
UNAME_MACHINE="alphaev5" ;;
"EV5.6 (21164A)")
UNAME_MACHINE="alphaev56" ;;
"EV5.6 (21164PC)")
UNAME_MACHINE="alphapca56" ;;
"EV5.7 (21164PC)")
UNAME_MACHINE="alphapca57" ;;
"EV6 (21264)")
UNAME_MACHINE="alphaev6" ;;
"EV6.7 (21264A)")
UNAME_MACHINE="alphaev67" ;;
"EV6.8CB (21264C)")
UNAME_MACHINE="alphaev68" ;;
"EV6.8AL (21264B)")
UNAME_MACHINE="alphaev68" ;;
"EV6.8CX (21264D)")
UNAME_MACHINE="alphaev68" ;;
"EV6.9A (21264/EV69A)")
UNAME_MACHINE="alphaev69" ;;
"EV7 (21364)")
UNAME_MACHINE="alphaev7" ;;
"EV7.9 (21364A)")
UNAME_MACHINE="alphaev79" ;;
esac
# A Pn.n version is a patched version.
# A Vn.n version is a released version.
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
cat <<EOF >$dummy.s
.data
\$Lformat:
.byte 37,100,45,37,120,10,0 # "%d-%x\n"
.text
.globl main
.align 4
.ent main
main:
.frame \$30,16,\$26,0
ldgp \$29,0(\$27)
.prologue 1
.long 0x47e03d80 # implver \$0
lda \$2,-1
.long 0x47e20c21 # amask \$2,\$1
lda \$16,\$Lformat
mov \$0,\$17
not \$1,\$18
jsr \$26,printf
ldgp \$29,0(\$26)
mov 0,\$16
jsr \$26,exit
.end main
EOF
eval $set_cc_for_build
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then
case `./$dummy` in
0-0)
UNAME_MACHINE="alpha"
;;
1-0)
UNAME_MACHINE="alphaev5"
;;
1-1)
UNAME_MACHINE="alphaev56"
;;
1-101)
UNAME_MACHINE="alphapca56"
;;
2-303)
UNAME_MACHINE="alphaev6"
;;
2-307)
UNAME_MACHINE="alphaev67"
;;
2-1307)
UNAME_MACHINE="alphaev68"
;;
esac
fi
rm -f $dummy.s $dummy
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
exit 0 ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
@@ -297,6 +319,12 @@ EOF
*:OS/390:*:*)
echo i370-ibm-openedition
exit 0 ;;
*:z/VM:*:*)
echo s390-ibm-zvmoe
exit 0 ;;
*:OS400:*:*)
echo powerpc-ibm-os400
exit 0 ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
exit 0;;
@@ -314,6 +342,13 @@ EOF
NILE*:*:*:dcosx)
echo pyramid-pyramid-svr4
exit 0 ;;
DRS?6000:unix:4.0:6*)
echo sparc-icl-nx6
exit 0 ;;
DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
case `/usr/bin/uname -p` in
sparc) echo sparc-icl-nx7 && exit 0 ;;
esac ;;
sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
@@ -382,6 +417,9 @@ EOF
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE}
exit 0 ;;
m68k:machten:*:*)
echo m68k-apple-machten${UNAME_RELEASE}
exit 0 ;;
powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE}
exit 0 ;;
@@ -420,16 +458,18 @@ EOF
exit (-1);
}
EOF
$CC_FOR_BUILD $dummy.c -o $dummy \
&& ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
&& rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy
$CC_FOR_BUILD -o $dummy $dummy.c \
&& $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
&& exit 0
echo mips-mips-riscos${UNAME_RELEASE}
exit 0 ;;
Motorola:PowerMAX_OS:*:*)
echo powerpc-motorola-powermax
exit 0 ;;
Night_Hawk:*:*:PowerMAX_OS)
Motorola:*:4.3:PL8-*)
echo powerpc-harris-powermax
exit 0 ;;
Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
echo powerpc-harris-powermax
exit 0 ;;
Night_Hawk:Power_UNIX:*:*)
@@ -504,8 +544,7 @@ EOF
exit(0);
}
EOF
$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy
$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
echo rs6000-ibm-aix3.2.5
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4
@@ -603,11 +642,21 @@ EOF
exit (0);
}
EOF
(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy`
if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
rm -f $dummy.c $dummy
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
test -z "$HP_ARCH" && HP_ARCH=hppa
fi ;;
esac
if [ ${HP_ARCH} = "hppa2.0w" ]
then
# avoid double evaluation of $set_cc_for_build
test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
then
HP_ARCH="hppa2.0w"
else
HP_ARCH="hppa64"
fi
fi
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit 0 ;;
ia64:HP-UX:*:*)
@@ -641,8 +690,7 @@ EOF
exit (0);
}
EOF
$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy
$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
echo unknown-hitachi-hiuxwe2
exit 0 ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
@@ -700,21 +748,26 @@ EOF
CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
CRAY*T3D:*:*:*)
echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
CRAY*T3E:*:*:*)
echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
CRAY*SV1:*:*:*)
echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
*:UNICOS/mp:*:*)
echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;;
5000:UNIX_System_V:4.*:*)
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;;
@@ -736,14 +789,17 @@ EOF
i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32
exit 0 ;;
x86:Interix*:3*)
echo i386-pc-interix3
x86:Interix*:[34]*)
echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
exit 0 ;;
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
echo i${UNAME_MACHINE}-pc-mks
exit 0 ;;
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
# UNAME_MACHINE based on the output of uname instead of i386?
echo i386-pc-interix
echo i586-pc-interix
exit 0 ;;
i*:UWIN*:*)
echo ${UNAME_MACHINE}-pc-uwin
@@ -755,17 +811,34 @@ EOF
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
*:GNU:*:*)
# the GNU system
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit 0 ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
exit 0 ;;
i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
exit 0 ;;
arm*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
cris:Linux:*:*)
echo cris-axis-linux-gnu
exit 0 ;;
crisv32:Linux:*:*)
echo crisv32-axis-linux-gnu
exit 0 ;;
frv:Linux:*:*)
echo frv-unknown-linux-gnu
exit 0 ;;
ia64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
m32r*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
m68*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
@@ -786,8 +859,26 @@ EOF
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
rm -f $dummy.c
test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0
test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
;;
mips64:Linux:*:*)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#undef CPU
#undef mips64
#undef mips64el
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
CPU=mips64el
#else
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
CPU=mips64
#else
CPU=
#endif
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
;;
ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu
@@ -823,6 +914,9 @@ EOF
s390:Linux:*:* | s390x:Linux:*:*)
echo ${UNAME_MACHINE}-ibm-linux
exit 0 ;;
sh64*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
sh*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
@@ -849,7 +943,7 @@ EOF
;;
a.out-i386-linux)
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
exit 0 ;;
exit 0 ;;
coff-i386)
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
exit 0 ;;
@@ -880,9 +974,11 @@ EOF
LIBC=gnuaout
#endif
#endif
#ifdef __dietlibc__
LIBC=dietlibc
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
rm -f $dummy.c
test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
;;
@@ -900,6 +996,26 @@ EOF
# Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit 0 ;;
i*86:OS/2:*:*)
# If we were able to find `uname', then EMX Unix compatibility
# is probably installed.
echo ${UNAME_MACHINE}-pc-os2-emx
exit 0 ;;
i*86:XTS-300:*:STOP)
echo ${UNAME_MACHINE}-unknown-stop
exit 0 ;;
i*86:atheos:*:*)
echo ${UNAME_MACHINE}-unknown-atheos
exit 0 ;;
i*86:syllable:*:*)
echo ${UNAME_MACHINE}-pc-syllable
exit 0 ;;
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
echo i386-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
i*86:*DOS:*:*)
echo ${UNAME_MACHINE}-pc-msdosdjgpp
exit 0 ;;
i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
@@ -934,9 +1050,6 @@ EOF
echo ${UNAME_MACHINE}-pc-sysv32
fi
exit 0 ;;
i*86:*DOS:*:*)
echo ${UNAME_MACHINE}-pc-msdosdjgpp
exit 0 ;;
pc:*:*:*)
# Left here for compatibility:
# uname -m prints for DJGPP always 'pc', but it prints nothing about
@@ -960,9 +1073,15 @@ EOF
# "miniframe"
echo m68010-convergent-sysv
exit 0 ;;
M68*:*:R3V[567]*:*)
mc68k:UNIX:SYSTEM5:3.51m)
echo m68k-convergent-sysv
exit 0 ;;
M680?0:D-NIX:5.3:*)
echo m68k-diab-dnix
exit 0 ;;
M68*:*:R3V[5678]*:*)
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)
3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
OS_REL=''
test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
@@ -979,9 +1098,6 @@ EOF
mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4
exit 0 ;;
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
echo i386-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
TSUNAMI:LynxOS:2.*:*)
echo sparc-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
@@ -1053,6 +1169,9 @@ EOF
SX-5:SUPER-UX:*:*)
echo sx5-nec-superux${UNAME_RELEASE}
exit 0 ;;
SX-6:SUPER-UX:*:*)
echo sx6-nec-superux${UNAME_RELEASE}
exit 0 ;;
Power*:Rhapsody:*:*)
echo powerpc-apple-rhapsody${UNAME_RELEASE}
exit 0 ;;
@@ -1060,7 +1179,12 @@ EOF
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
exit 0 ;;
*:Darwin:*:*)
echo `uname -p`-apple-darwin${UNAME_RELEASE}
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
case $UNAME_PROCESSOR in
*86) UNAME_PROCESSOR=i686 ;;
unknown) UNAME_PROCESSOR=powerpc ;;
esac
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
exit 0 ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
UNAME_PROCESSOR=`uname -p`
@@ -1073,7 +1197,7 @@ EOF
*:QNX:*:4*)
echo i386-pc-qnx
exit 0 ;;
NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)
NSR-?:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE}
exit 0 ;;
*:NonStop-UX:*:*)
@@ -1096,11 +1220,6 @@ EOF
fi
echo ${UNAME_MACHINE}-unknown-plan9
exit 0 ;;
i*86:OS/2:*:*)
# If we were able to find `uname', then EMX Unix compatibility
# is probably installed.
echo ${UNAME_MACHINE}-pc-os2-emx
exit 0 ;;
*:TOPS-10:*:*)
echo pdp10-unknown-tops10
exit 0 ;;
@@ -1119,11 +1238,21 @@ EOF
*:ITS:*:*)
echo pdp10-unknown-its
exit 0 ;;
i*86:XTS-300:*:STOP)
echo ${UNAME_MACHINE}-unknown-stop
SEI:*:*:SEIUX)
echo mips-sei-seiux${UNAME_RELEASE}
exit 0 ;;
i*86:atheos:*:*)
echo ${UNAME_MACHINE}-unknown-atheos
*:DragonFly:*:*)
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit 0 ;;
*:*VMS:*:*)
UNAME_MACHINE=`(uname -p) 2>/dev/null`
case "${UNAME_MACHINE}" in
A*) echo alpha-dec-vms && exit 0 ;;
I*) echo ia64-dec-vms && exit 0 ;;
V*) echo vax-dec-vms && exit 0 ;;
esac ;;
*:XENIX:*:SysV)
echo i386-pc-xenix
exit 0 ;;
esac
@@ -1245,8 +1374,7 @@ main ()
}
EOF
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy
$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
# Apollos put the system type in the environment.

236
config.sub vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002 Free Software Foundation, Inc.
# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
timestamp='2002-06-21'
timestamp='2004-11-30'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -70,7 +70,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
@@ -118,7 +118,8 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)
nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
@@ -144,7 +145,7 @@ case $os in
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple | -axis)
-apple | -axis | -knuth | -cray)
os=
basic_machine=$1
;;
@@ -228,39 +229,45 @@ case $basic_machine in
| a29k \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
| c4x | clipper \
| d10v | d30v | dlx | dsp16xx \
| fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \
| ip2k \
| m32r | m68000 | m68k | m88k | mcore \
| ip2k | iq2000 \
| m32r | m32rle | m68000 | m68k | m88k | mcore \
| mips | mipsbe | mipseb | mipsel | mipsle \
| mips16 \
| mips64 | mips64el \
| mips64vr | mips64vrel \
| mips64orion | mips64orionel \
| mips64vr4100 | mips64vr4100el \
| mips64vr4300 | mips64vr4300el \
| mips64vr5000 | mips64vr5000el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
| mipstx39 | mipstx39el \
| mn10200 | mn10300 \
| msp430 \
| ns16k | ns32k \
| openrisc | or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
| pyramid \
| sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
| strongarm \
| tahoe | thumb | tic80 | tron \
| tahoe | thumb | tic4x | tic80 | tron \
| v850 | v850e \
| we32k \
| x86 | xscale | xstormy16 | xtensa \
| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
| z8k)
basic_machine=$basic_machine-unknown
;;
@@ -292,44 +299,52 @@ case $basic_machine in
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* \
| bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c54x-* \
| clipper-* | cydra-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
| clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| elxsi-* \
| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* \
| m32r-* \
| ip2k-* | iq2000-* \
| m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | mcore-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips16-* \
| mips64-* | mips64el-* \
| mips64vr-* | mips64vrel-* \
| mips64orion-* | mips64orionel-* \
| mips64vr4100-* | mips64vr4100el-* \
| mips64vr4300-* | mips64vr4300el-* \
| mips64vr5000-* | mips64vr5000el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa32r2-* | mipsisa32r2el-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64r2-* | mipsisa64r2el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipstx39 | mipstx39el \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipstx39-* | mipstx39el-* \
| mmix-* \
| msp430-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
| pyramid-* \
| romp-* | rs6000-* \
| sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \
| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tron-* \
| v850-* | v850e-* | vax-* \
| we32k-* \
| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
| xtensa-* \
| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
| xstormy16-* | xtensa-* \
| ymp-* \
| z8k-*)
;;
@@ -349,6 +364,9 @@ case $basic_machine in
basic_machine=a29k-amd
os=-udi
;;
abacus)
basic_machine=abacus-unknown
;;
adobe68k)
basic_machine=m68010-adobe
os=-scout
@@ -363,6 +381,12 @@ case $basic_machine in
basic_machine=a29k-none
os=-bsd
;;
amd64)
basic_machine=x86_64-pc
;;
amd64-*)
basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
amdahl)
basic_machine=580-amdahl
os=-sysv
@@ -422,12 +446,27 @@ case $basic_machine in
basic_machine=j90-cray
os=-unicos
;;
craynv)
basic_machine=craynv-cray
os=-unicosmp
;;
cr16c)
basic_machine=cr16c-unknown
os=-elf
;;
crds | unos)
basic_machine=m68k-crds
;;
crisv32 | crisv32-* | etraxfs*)
basic_machine=crisv32-axis
;;
cris | cris-* | etrax*)
basic_machine=cris-axis
;;
crx)
basic_machine=crx-unknown
os=-elf
;;
da30 | da30-*)
basic_machine=m68k-da30
;;
@@ -450,6 +489,10 @@ case $basic_machine in
basic_machine=m88k-motorola
os=-sysv3
;;
djgpp)
basic_machine=i586-pc
os=-msdosdjgpp
;;
dpx20 | dpx20-*)
basic_machine=rs6000-bull
os=-bosx
@@ -628,10 +671,6 @@ case $basic_machine in
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
mmix*)
basic_machine=mmix-knuth
os=-mmixware
;;
monitor)
basic_machine=m68k-rom68k
os=-coff
@@ -723,6 +762,10 @@ case $basic_machine in
basic_machine=or32-unknown
os=-coff
;;
os400)
basic_machine=powerpc-ibm
os=-os400
;;
OSE68000 | ose68000)
basic_machine=m68000-ericsson
os=-ose
@@ -745,49 +788,55 @@ case $basic_machine in
pbb)
basic_machine=m68k-tti
;;
pc532 | pc532-*)
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pentium | p5 | k5 | k6 | nexgen | viac3)
basic_machine=i586-pc
;;
pentiumpro | p6 | 6x86 | athlon)
pentiumpro | p6 | 6x86 | athlon | athlon_*)
basic_machine=i686-pc
;;
pentiumii | pentium2)
pentiumii | pentium2 | pentiumiii | pentium3)
basic_machine=i686-pc
;;
pentium4)
basic_machine=i786-pc
;;
pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumpro-* | p6-* | 6x86-* | athlon-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumii-* | pentium2-*)
pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentium4-*)
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pn)
basic_machine=pn-gould
;;
power) basic_machine=power-ibm
;;
ppc) basic_machine=powerpc-unknown
;;
;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
;;
;;
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64) basic_machine=powerpc64-unknown
;;
;;
ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
basic_machine=powerpc64le-unknown
;;
;;
ppc64le-* | powerpc64little-*)
basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
@@ -818,6 +867,16 @@ case $basic_machine in
basic_machine=a29k-amd
os=-udi
;;
sb1)
basic_machine=mipsisa64sb1-unknown
;;
sb1el)
basic_machine=mipsisa64sb1el-unknown
;;
sei)
basic_machine=mips-sei
os=-seiux
;;
sequent)
basic_machine=i386-sequent
;;
@@ -825,6 +884,9 @@ case $basic_machine in
basic_machine=sh-hitachi
os=-hms
;;
sh64)
basic_machine=sh64-unknown
;;
sparclite-wrs | simso-wrs)
basic_machine=sparclite-wrs
os=-vxworks
@@ -883,7 +945,7 @@ case $basic_machine in
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
;;
sv1)
sv1)
basic_machine=sv1-cray
os=-unicos
;;
@@ -891,10 +953,6 @@ case $basic_machine in
basic_machine=i386-sequent
os=-dynix
;;
t3d)
basic_machine=alpha-cray
os=-unicos
;;
t3e)
basic_machine=alphaev5-cray
os=-unicos
@@ -907,6 +965,14 @@ case $basic_machine in
basic_machine=tic54x-unknown
os=-coff
;;
tic55x | c55x*)
basic_machine=tic55x-unknown
os=-coff
;;
tic6x | c6x*)
basic_machine=tic6x-unknown
os=-coff
;;
tx39)
basic_machine=mipstx39-unknown
;;
@@ -920,6 +986,10 @@ case $basic_machine in
tower | tower-32)
basic_machine=m68k-ncr
;;
tpf)
basic_machine=s390x-ibm
os=-tpf
;;
udi29k)
basic_machine=a29k-amd
os=-udi
@@ -941,8 +1011,8 @@ case $basic_machine in
os=-vms
;;
vpp*|vx|vx-*)
basic_machine=f301-fujitsu
;;
basic_machine=f301-fujitsu
;;
vxworks960)
basic_machine=i960-wrs
os=-vxworks
@@ -963,11 +1033,11 @@ case $basic_machine in
basic_machine=hppa1.1-winbond
os=-proelf
;;
windows32)
basic_machine=i386-pc
os=-windows32-msvcrt
xbox)
basic_machine=i686-pc
os=-mingw32
;;
xps | xps100)
xps | xps100)
basic_machine=xps100-honeywell
;;
ymp)
@@ -997,6 +1067,9 @@ case $basic_machine in
romp)
basic_machine=romp-ibm
;;
mmix)
basic_machine=mmix-knuth
;;
rs6000)
basic_machine=rs6000-ibm
;;
@@ -1013,16 +1086,16 @@ case $basic_machine in
we32k)
basic_machine=we32k-att
;;
sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele)
sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
basic_machine=sh-unknown
;;
sh64)
basic_machine=sh64-unknown
;;
sparc | sparcv9 | sparcv9b)
sparc | sparcv8 | sparcv9 | sparcv9b)
basic_machine=sparc-sun
;;
cydra)
cydra)
basic_machine=cydra-cydrome
;;
orion)
@@ -1037,10 +1110,6 @@ case $basic_machine in
pmac | pmac-mpw)
basic_machine=powerpc-apple
;;
c4x*)
basic_machine=c4x-none
os=-coff
;;
*-unknown)
# Make sure to match an already-canonicalized machine name.
;;
@@ -1096,18 +1165,20 @@ case $os in
| -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
| -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* | -powermax*)
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1119,8 +1190,10 @@ case $os in
;;
esac
;;
-nto-qnx*)
;;
-nto*)
os=-nto-qnx
os=`echo $os | sed -e 's|nto|nto-qnx|'`
;;
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* \
@@ -1129,6 +1202,9 @@ case $os in
-mac*)
os=`echo $os | sed -e 's|mac|macos|'`
;;
-linux-dietlibc)
os=-linux-dietlibc
;;
-linux*)
os=`echo $os | sed -e 's|linux|linux-gnu|'`
;;
@@ -1141,6 +1217,9 @@ case $os in
-opened*)
os=-openedition
;;
-os400*)
os=-os400
;;
-wince*)
os=-wince
;;
@@ -1162,6 +1241,9 @@ case $os in
-atheos*)
os=-atheos
;;
-syllable*)
os=-syllable
;;
-386bsd)
os=-bsd
;;
@@ -1172,7 +1254,7 @@ case $os in
os=-rtmk-nova
;;
-ns2 )
os=-nextstep2
os=-nextstep2
;;
-nsk*)
os=-nsk
@@ -1184,6 +1266,9 @@ case $os in
-sinix*)
os=-sysv4
;;
-tpf*)
os=-tpf
;;
-triton*)
os=-sysv3
;;
@@ -1211,8 +1296,17 @@ case $os in
-xenix)
os=-xenix
;;
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
os=-mint
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
os=-mint
;;
-aros*)
os=-aros
;;
-kaos*)
os=-kaos
;;
-zvmoe)
os=-zvmoe
;;
-none)
;;
@@ -1245,11 +1339,14 @@ case $basic_machine in
arm*-semi)
os=-aout
;;
c4x-* | tic4x-*)
os=-coff
;;
# This must come before the *-dec entry.
pdp10-*)
os=-tops20
;;
pdp11-*)
pdp11-*)
os=-none
;;
*-dec | vax-*)
@@ -1291,6 +1388,9 @@ case $basic_machine in
*-ibm)
os=-aix
;;
*-knuth)
os=-mmixware
;;
*-wec)
os=-proelf
;;
@@ -1342,19 +1442,19 @@ case $basic_machine in
*-next)
os=-nextstep3
;;
*-gould)
*-gould)
os=-sysv
;;
*-highlevel)
*-highlevel)
os=-bsd
;;
*-encore)
os=-bsd
;;
*-sgi)
*-sgi)
os=-irix
;;
*-siemens)
*-siemens)
os=-sysv4
;;
*-masscomp)
@@ -1423,9 +1523,15 @@ case $basic_machine in
-mvs* | -opened*)
vendor=ibm
;;
-os400*)
vendor=ibm
;;
-ptx*)
vendor=sequent
;;
-tpf*)
vendor=ibm
;;
-vxsim* | -vxworks* | -windiss*)
vendor=wrs
;;

6242
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
# Process this file with autoconf to produce a configure script.
AC_INIT([libquantum], [0.2.2], [libquantum@enyo.de])
AC_INIT([libquantum], [0.2.3], [libquantum@enyo.de])
AC_CONFIG_SRCDIR([classic.c])
AC_CONFIG_HEADER([config.h])
@@ -87,8 +87,9 @@ AC_SUBST(I)
# Profiling check
AC_ARG_ENABLE(profiling,
[ --enable-profiling compile with profiling support],
[CFLAGS="$CFLAGS -pg"],
[])
[if test $enableval = "yes"
then CFLAGS="$CFLAGS -pg -fprofile-arcs -ftest-coverage"
fi], [])
# Enable -Wall for gcc
if test $CC = "gcc"

272
density.c Normal file
View File

@@ -0,0 +1,272 @@
/* density.c: Density operator formalism
Copyright 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
libquantum is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
libquantum is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with libquantum; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
*/
#include <stdlib.h>
#include <stdio.h>
#include "density.h"
#include "qureg.h"
#include "config.h"
#include "matrix.h"
#include "complex.h"
/* Build a new density operator from multiple state vectors */
quantum_density_op
quantum_new_density_op(int num, float *prob, quantum_reg *reg)
{
int i;
quantum_density_op rho;
int *phash;
int hashw;
rho.num = num;
rho.prob = calloc(num, sizeof(float));
if(!rho.prob)
{
printf("Error allocating probability array!\n");
exit(1);
}
rho.reg = calloc(num, sizeof(quantum_reg));
if(!rho.reg)
{
printf("Error allocating state vector array!\n");
exit(1);
}
quantum_memman(num * (sizeof(float) + sizeof(quantum_reg)));
/* Take the hash table from the first quantum register */
rho.prob[0] = prob[0];
phash = reg[0].hash;
hashw = reg[0].hashw;
rho.reg[0] = reg[0];
/* Destroy the quantum register */
reg[0].size = 0;
reg[0].width = 0;
reg[0].node = 0;
reg[0].hash = 0;
for(i=1; i<num; i++)
{
rho.prob[i] = prob[i];
rho.reg[i] = reg[i];
rho.reg[i].hash = phash;
rho.reg[i].hashw = hashw;
reg[i].size = 0;
reg[i].width = 0;
reg[i].node = 0;
reg[i].hash = 0;
}
return rho;
}
/* Convert a state vector to a density operator */
quantum_density_op
quantum_qureg2density_op(quantum_reg *reg)
{
float f = 1;
return quantum_new_density_op(1, &f, reg);
}
/* Compute the reduced density operator of a system. Bit POS will be
traced out. */
void
quantum_reduced_density_op(int pos, quantum_density_op *rho)
{
int i, j;
double p0=0, ptmp;
MAX_UNSIGNED pos2;
quantum_reg rtmp;
rho->prob = realloc(rho->prob, 2*rho->num*sizeof(float));
if(!rho->prob)
{
printf("Error re-allocating probability array!\n");
exit(1);
}
rho->reg = realloc(rho->reg, 2*rho->num*sizeof(quantum_reg));
if(!rho->reg)
{
printf("Error re-allocating state vector array!\n");
exit(1);
}
quantum_memman(rho->num * (sizeof(float) + sizeof(quantum_reg)));
pos2 = (MAX_UNSIGNED) 1 << pos;
for(i=0; i<rho->num; i++)
{
ptmp = rho->prob[i];
rtmp = rho->reg[i];
p0 = 0;
/* Sum up the probability for 0 being the result for this state
vector */
for(j=0; j<rho->reg[i].size; j++)
{
if(!(rho->reg[i].node[j].state & pos2))
p0 += quantum_prob_inline(rho->reg[i].node[j].amplitude);
}
rho->prob[i] = ptmp * p0;
rho->prob[rho->num + i] = ptmp * (1-p0);
rho->reg[i] = quantum_state_collapse(pos, 0, rtmp);
rho->reg[rho->num + i] = quantum_state_collapse(pos, 1, rtmp);
quantum_delete_qureg_hashpreserve(&rtmp);
}
rho->num *= 2;
}
/* Print the whole density matrix. */
void
quantum_print_density_matrix(quantum_density_op *rho)
{
int i, j, k, dim;
quantum_matrix m;
COMPLEX_FLOAT f;
dim = 1 << rho->reg[0].width;
if(dim < 0)
{
printf("Density matrix is too big!\n");
exit(1);
}
m = quantum_new_matrix(dim, dim);
/* \rho_ij = \sum_k p_k <i|\psi_kX\psi_k|j> */
for(i=0; i<rho->num; i++)
{
for(j=0; j<rho->reg[i].size; j++)
{
M(m, rho->reg[i].node[j].state, rho->reg[i].node[j].state)
+= rho->prob[i]
* quantum_prob_inline(rho->reg[i].node[j].amplitude);
for(k=0; k<j; k++)
{
f = rho->prob[i] * quantum_conj(rho->reg[i].node[j].amplitude)
* rho->reg[i].node[k].amplitude;
M(m, rho->reg[i].node[j].state , rho->reg[i].node[k].state) += f;
M(m, rho->reg[i].node[k].state , rho->reg[i].node[j].state)
+= quantum_conj(f);
}
}
}
quantum_print_matrix(m);
quantum_delete_matrix(&m);
}
/* Delete a density operator */
void
quantum_delete_density_op(quantum_density_op *rho)
{
int i;
/* Destroy hash table only once */
quantum_destroy_hash(&rho->reg[0]);
for(i=0; i<rho->num; i++)
quantum_delete_qureg_hashpreserve(&rho->reg[i]);
free(rho->prob);
free(rho->reg);
quantum_memman(-rho->num * (sizeof(float) + sizeof(quantum_reg)));
rho->prob = 0;
rho->reg = 0;
}
/* Compute the purity of a density operator */
float
quantum_purity(quantum_density_op *rho)
{
int i, j , k, l;
float f = 0;
COMPLEX_FLOAT g, dp;
/* Diagonal elements */
for(i=0; i<rho->num; i++)
f += rho->prob[i]*rho->prob[i];
for(i=0; i<rho->num; i++)
{
for(j=0; j<i; j++)
{
dp = quantum_dot_product(&rho->reg[i], &rho->reg[j]);
for(k=0; k<rho->reg[i].size; k++)
{
/* quantum_dot_product makes sure that rho->reg[j] has a
correct hash table */
l = quantum_get_state(rho->reg[i].node[k].state, rho->reg[j]);
/* Compute p_i p_j <k|\psi_iX\psi_i|\psi_jX\psi_j|k> */
if(l > -1)
g = rho->prob[i] * rho->prob[j] * dp
* rho->reg[i].node[k].amplitude
* quantum_conj(rho->reg[j].node[l].amplitude);
else
g = 0;
f += 2 * quantum_real(g);
}
}
}
return f;
}

67
density.h Normal file
View File

@@ -0,0 +1,67 @@
/* density.h: Declarations for density.c
Copyright 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
libquantum is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
libquantum is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with libquantum; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
*/
#ifndef __DENSITY_H
#define __DENSITY_H
#include "qureg.h"
#define quantum_density_wrapper_ubt(reg, ctl, ...) \
quantum_unbounded_toffoli(ctl, reg, __VA_ARGS__)
#define quantum_density_operation(function, rho, ...) \
do{ \
int quantum_int; \
if ((void *) function == quantum_unbounded_toffoli) \
{ \
for(quantum_int=0; quantum_int < rho.num; quantum_int++) \
quantum_density_wrapper_ubt(&rho.reg[quantum_int], __VA_ARGS__); \
} \
else \
{ \
for(quantum_int=0; quantum_int < rho.num; quantum_int++) \
function(__VA_ARGS__, &rho.reg[quantum_int]); \
} \
} while(0)
struct quantum_density_op_struct
{
int num; /* total number of state vectors */
float *prob; /* probabilities of the state vectors */
quantum_reg *reg; /* state vectors */
};
typedef struct quantum_density_op_struct quantum_density_op;
extern quantum_density_op quantum_new_density_op(int num, float *prob,
quantum_reg *reg);
extern quantum_density_op quantum_qureg2density_op(quantum_reg *reg);
extern void quantum_reduced_density_op(int pos, quantum_density_op *rho);
extern void quantum_print_density_matrix(quantum_density_op *rho);
extern void quantum_delete_density_op(quantum_density_op *rho);
extern float quantum_purity(quantum_density_op *rho);
#endif

178
gates.c
View File

@@ -1,6 +1,6 @@
/* gates.c: Basic gates for quantum register manipulation
Copyright 2003 Bjoern Butscher, Hendrik Weimer
Copyright 2003, 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
@@ -283,8 +283,7 @@ quantum_swaptheleads_omuln_controlled(int control, int width, quantum_reg *reg)
}
}
/* Apply the 2x2 matrix M to the target bit. M should be unitary and
having a determinant of 1. */
/* Apply the 2x2 matrix M to the target bit. M should be unitary. */
void
quantum_gate1(int target, quantum_matrix m, quantum_reg *reg)
@@ -454,6 +453,179 @@ quantum_gate1(int target, quantum_matrix m, quantum_reg *reg)
quantum_decohere(reg);
}
/* Apply the 4x4 matrix M to the target bit, controlled by CONTROL. M
should be unitary. */
/* WARNING: THIS FUNCTION IS INCOMPLETE AND DOES NOT WORK AS INTENDED! */
void
quantum_gate2(int control, int target, quantum_matrix m, quantum_reg *reg)
{
int i, j, k, iset;
int addsize=0, decsize=0;
COMPLEX_FLOAT t, tnot=0;
float limit;
char *done;
if((m.cols != 4) || (m.rows != 4))
{
printf("Matrix is not a 4x4 matrix!\n");
exit(1);
}
/* Build hash table */
for(i=0; i<(1 << reg->hashw); i++)
reg->hash[i] = 0;
for(i=0; i<reg->size; i++)
quantum_add_hash(reg->node[i].state, i, reg);
/* calculate the number of basis states to be added */
for(i=0; i<reg->size; i++)
{
j = quantum_get_state(reg->node[i].state ^ ((MAX_UNSIGNED) 1 << target),
*reg);
if(j == -1)
{
if((m.t[1] != 0) && (reg->node[i].state
& ((MAX_UNSIGNED) 1 << target)))
addsize++;
if((m.t[2] != 0) && !(reg->node[i].state
& ((MAX_UNSIGNED) 1 << target)))
addsize++;
}
}
/* allocate memory for the new basis states */
reg->node = realloc(reg->node,
(reg->size + addsize) * sizeof(quantum_reg_node));
if(!reg->node)
{
printf("Not enough memory for %i-sized qubit!\n", reg->size + addsize);
exit(1);
}
quantum_memman(addsize*sizeof(quantum_reg_node));
for(i=0; i<addsize; i++)
{
reg->node[i+reg->size].state = 0;
reg->node[i+reg->size].amplitude = 0;
}
done = calloc(reg->size + addsize, sizeof(char));
if(!done)
{
printf("Not enough memory for %i bytes array!\n",
(reg->size + addsize) * sizeof(char));
exit(1);
}
quantum_memman(reg->size + addsize * sizeof(char));
k = reg->size;
limit = (1.0 / ((MAX_UNSIGNED) 1 << reg->width)) / 1000000;
/* perform the actual matrix multiplication */
for(i=0; i<reg->size; i++)
{
if(!done[i])
{
/* determine if the target of the basis state is set */
iset = reg->node[i].state & ((MAX_UNSIGNED) 1 << target);
tnot = 0;
j = quantum_get_state(reg->node[i].state
^ ((MAX_UNSIGNED) 1<<target), *reg);
t = reg->node[i].amplitude;
if(j >= 0)
tnot = reg->node[j].amplitude;
if(iset)
reg->node[i].amplitude = m.t[2] * tnot + m.t[3] * t;
else
reg->node[i].amplitude = m.t[0] * t + m.t[1] * tnot;
if(j >= 0)
{
if(iset)
reg->node[j].amplitude = m.t[0] * tnot + m.t[1] * t;
else
reg->node[j].amplitude = m.t[2] * t + m.t[3] * tnot;
}
else /* new basis state will be created */
{
if((m.t[1] == 0) && (iset))
break;
if((m.t[2] == 0) && !(iset))
break;
reg->node[k].state = reg->node[i].state
^ ((MAX_UNSIGNED) 1 << target);
if(iset)
reg->node[k].amplitude = m.t[1] * t;
else
reg->node[k].amplitude = m.t[2] * t;
k++;
}
if(j >= 0)
done[j] = 1;
}
}
reg->size += addsize;
free(done);
quantum_memman(-reg->size * sizeof(char));
/* remove basis states with extremely small amplitude */
for(i=0, j=0; i<reg->size; i++)
{
if(quantum_prob_inline(reg->node[i].amplitude) < limit)
{
j++;
decsize++;
}
else if(j)
{
reg->node[i-j].state = reg->node[i].state;
reg->node[i-j].amplitude = reg->node[i].amplitude;
}
}
if(decsize)
{
reg->size -= decsize;
reg->node = realloc(reg->node, reg->size * sizeof(quantum_reg_node));
if(!reg->node)
{
printf("Not enough memory for %i-sized qubit!\n",
reg->size + addsize);
exit(1);
}
quantum_memman(-decsize * sizeof(quantum_reg_node));
}
quantum_decohere(reg);
}
/* Apply a hadamard gate */
void

3115
ltmain.sh

File diff suppressed because it is too large Load Diff

View File

@@ -89,25 +89,25 @@ quantum_delete_matrix(quantum_matrix *m)
void
quantum_print_matrix(quantum_matrix m)
{
int i, j, l, z=0;
int i, j, z=0;
/* int l; */
while ((1 << z++) < m.rows);
z--;
for(i=0; i<m.rows; i++)
{
for (l=z-1; l>=0; l--)
/* for (l=z-1; l>=0; l--)
{
if ((l % 4 == 3))
printf(" ");
printf("%i", (i >> l) & 1);
}
printf(" | ");
} */
for(j=0; j<m.cols; j++)
printf("%f %fi ", quantum_real(M(m, j, i)), quantum_imag(M(m, j, i)));
printf("|\n");
printf("% f %+fi\t", quantum_real(M(m, j, i)),
quantum_imag(M(m, j, i)));
printf("\n");
}
printf("\n");
}

View File

@@ -1,6 +1,6 @@
/* measure.c: Quantum register measurement
Copyright 2003 Bjoern Butscher, Hendrik Weimer
Copyright 2003, 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
@@ -84,12 +84,12 @@ quantum_measure(quantum_reg reg)
int
quantum_bmeasure(int pos, quantum_reg *reg)
{
int i, j, k;
int size=0, result=0;
double d=0, pa=0, r;
MAX_UNSIGNED lpat=0, rpat=0, pos2;
int i;
int result=0;
double pa=0, r;
MAX_UNSIGNED pos2;
quantum_reg out;
if(quantum_objcode_put(BMEASURE, pos))
return 0;
@@ -111,73 +111,11 @@ quantum_bmeasure(int pos, quantum_reg *reg)
if (r > pa)
result = 1;
/* Eradicate all amplitudes of base states which have been ruled out
by the measurement and get the absolute of the new register */
for(i=0;i<reg->size;i++)
{
if(reg->node[i].state & pos2)
{
if(!result)
reg->node[i].amplitude = 0;
else
{
d += quantum_prob_inline(reg->node[i].amplitude);
size++;
}
}
else
{
if(result)
reg->node[i].amplitude = 0;
else
{
d += quantum_prob_inline(reg->node[i].amplitude);
size++;
}
}
}
/* Build the new quantum register */
out.width = reg->width-1;
out.size = size;
out.node = calloc(size, sizeof(quantum_reg_node));
if(!out.node)
{
printf("Not enough memory for %i-sized qubit!\n", size);
exit(1);
}
quantum_memman(size * sizeof(quantum_reg_node));
out.hashw = reg->hashw;
out.hash = reg->hash;
/* Determine the numbers of the new base states and norm the quantum
register */
for(i=0, j=0; i<reg->size; i++)
{
if(reg->node[i].amplitude)
{
for(k=0, rpat=0; k<pos; k++)
rpat += (MAX_UNSIGNED) 1 << k;
rpat &= reg->node[i].state;
for(k=sizeof(MAX_UNSIGNED)*8-1, lpat=0; k>pos; k--)
lpat += (MAX_UNSIGNED) 1 << k;
lpat &= reg->node[i].state;
out.node[j].state = (lpat >> 1) | rpat;
out.node[j].amplitude = reg->node[i].amplitude * 1 / (float) sqrt(d);
j++;
}
}
out = quantum_state_collapse(pos, result, *reg);
quantum_delete_qureg_hashpreserve(reg);
*reg = out;
return result;
}

View File

@@ -1,6 +1,6 @@
/* quantum.h: Header file for libquantum
Copyright 2003 Bjoern Butscher, Hendrik Weimer
Copyright 2003, 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
@@ -28,6 +28,24 @@
#define COMPLEX_FLOAT @CF_TYPE@
#define MAX_UNSIGNED @MU_TYPE@
#define quantum_density_wrapper_ubt(reg, ctl, ...) \
quantum_unbounded_toffoli(ctl, reg, __VA_ARGS__)
#define quantum_density_operation(function, rho, ...) \
do{ \
int quantum_int; \
if ((void *) function == quantum_unbounded_toffoli) \
{ \
for(quantum_int=0; quantum_int < rho.num; quantum_int++) \
quantum_density_wrapper_ubt(&rho.reg[quantum_int], __VA_ARGS__); \
} \
else \
{ \
for(quantum_int=0; quantum_int < rho.num; quantum_int++) \
function(__VA_ARGS__, &rho.reg[quantum_int]); \
} \
} while(0)
/* A ROWS x COLS matrix with complex elements */
struct quantum_matrix_struct {
@@ -59,6 +77,15 @@ struct quantum_reg_struct
typedef struct quantum_reg_struct quantum_reg;
struct quantum_density_op_struct
{
int num; /* total number of state vectors */
float *prob; /* probabilities of the state vectors */
quantum_reg *reg; /* state vectors */
};
typedef struct quantum_density_op_struct quantum_density_op;
extern quantum_reg quantum_new_qureg(MAX_UNSIGNED initval, int width);
extern void quantum_delete_qureg(quantum_reg *reg);
extern void quantum_print_qureg(quantum_reg reg);
@@ -112,6 +139,8 @@ extern void quantum_decohere(quantum_reg *reg);
extern quantum_reg quantum_matrix2qureg(quantum_matrix *m, int width);
extern quantum_matrix quantum_qureg2matrix(quantum_reg reg);
extern quantum_reg quantum_kronecker(quantum_reg *reg1, quantum_reg *reg2);
extern COMPLEX_FLOAT quantum_dot_product(quantum_reg *reg1, quantum_reg *reg2);
extern void quantum_qec_encode(int type, int width, quantum_reg *reg);
extern void quantum_qec_decode(int type, int width, quantum_reg *reg);
@@ -123,4 +152,12 @@ extern void quantum_objcode_stop();
extern int quantum_objcode_write(char *file);
extern void quantum_objcode_run(char *file, quantum_reg *reg);
extern quantum_density_op quantum_new_density_op(int num, float *prob,
quantum_reg *reg);
extern quantum_density_op quantum_qureg2density_op(quantum_reg *reg);
extern void quantum_reduced_density_op(int pos, quantum_density_op *rho);
extern void quantum_print_density_matrix(quantum_density_op *rho);
extern void quantum_delete_density_op(quantum_density_op *rho);
extern float quantum_purity(quantum_density_op *rho);
#endif

108
qureg.c
View File

@@ -1,6 +1,6 @@
/* qureg.c: Quantum register management
Copyright 2003 Bjoern Butscher, Hendrik Weimer
Copyright 2003, 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
@@ -23,7 +23,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "matrix.h"
#include "qureg.h"
@@ -91,10 +91,6 @@ quantum_matrix2qureg(quantum_matrix *m, int width)
}
}
/* Initialize the PRNG */
/* srandom(time(0)); */
return reg;
}
@@ -137,7 +133,7 @@ quantum_new_qureg(MAX_UNSIGNED initval, int width)
/* Initialize the PRNG */
srandom(time(0));
/* srandom(time(0)); */
c = getenv("QUOBFILE");
@@ -176,6 +172,7 @@ quantum_destroy_hash(quantum_reg *reg)
{
free(reg->hash);
quantum_memman(-(1 << reg->hashw) * sizeof(int));
reg->hash = 0;
}
/* Delete a quantum register */
@@ -208,7 +205,7 @@ quantum_print_qureg(quantum_reg reg)
for(i=0; i<reg.size; i++)
{
printf("%f %+fi|%lli> (%e) (|", quantum_real(reg.node[i].amplitude),
printf("% f %+fi|%lli> (%e) (|", quantum_real(reg.node[i].amplitude),
quantum_imag(reg.node[i].amplitude), reg.node[i].state,
quantum_prob_inline(reg.node[i].amplitude));
for(j=reg.width-1;j>=0;j--)
@@ -323,3 +320,98 @@ quantum_kronecker(quantum_reg *reg1, quantum_reg *reg2)
return reg;
}
/* Reduce the state vector after measurement or partial trace */
quantum_reg
quantum_state_collapse(int pos, int value, quantum_reg reg)
{
int i, j, k;
int size=0;
double d=0;
MAX_UNSIGNED lpat=0, rpat=0, pos2;
quantum_reg out;
pos2 = (MAX_UNSIGNED) 1 << pos;
/* Eradicate all amplitudes of base states which have been ruled out
by the measurement and get the norm of the new register */
for(i=0;i<reg.size;i++)
{
if(((reg.node[i].state & pos2) && value)
|| (!(reg.node[i].state & pos2) && !value))
{
d += quantum_prob_inline(reg.node[i].amplitude);
size++;
}
}
/* Build the new quantum register */
out.width = reg.width-1;
out.size = size;
out.node = calloc(size, sizeof(quantum_reg_node));
if(!out.node)
{
printf("Not enough memory for %i-sized quantum register!\n", size);
exit(1);
}
quantum_memman(size * sizeof(quantum_reg_node));
out.hashw = reg.hashw;
out.hash = reg.hash;
/* Determine the numbers of the new base states and norm the quantum
register */
for(i=0, j=0; i<reg.size; i++)
{
if(((reg.node[i].state & pos2) && value)
|| (!(reg.node[i].state & pos2) && !value))
{
for(k=0, rpat=0; k<pos; k++)
rpat += (MAX_UNSIGNED) 1 << k;
rpat &= reg.node[i].state;
for(k=sizeof(MAX_UNSIGNED)*8-1, lpat=0; k>pos; k--)
lpat += (MAX_UNSIGNED) 1 << k;
lpat &= reg.node[i].state;
out.node[j].state = (lpat >> 1) | rpat;
out.node[j].amplitude = reg.node[i].amplitude * 1 / (float) sqrt(d);
j++;
}
}
return out;
}
/* Compute the dot product of two quantum registers */
COMPLEX_FLOAT
quantum_dot_product(quantum_reg *reg1, quantum_reg *reg2)
{
int i, j;
COMPLEX_FLOAT f = 0;
for(i=0; i<(1 << reg2->hashw); i++)
reg2->hash[i] = 0;
for(i=0; i<reg2->size; i++)
quantum_add_hash(reg2->node[i].state, i, reg2);
for(i=0; i<reg1->size; i++)
{
j = quantum_get_state(reg1->node[i].state, *reg2);
if(j > -1) /* state exists in reg2 */
f += quantum_conj(reg1->node[i].amplitude) * reg2->node[j].amplitude;
}
return f;
}

View File

@@ -1,6 +1,6 @@
/* qureg.h: Declarations for qureg.c and inline hashing functions
Copyright 2003 Bjoern Butscher, Hendrik Weimer
Copyright 2003, 2004 Bjoern Butscher, Hendrik Weimer
This file is part of libquantum
@@ -67,6 +67,13 @@ extern void quantum_addscratch(int bits, quantum_reg *reg);
extern void quantum_print_hash(quantum_reg reg);
extern quantum_reg quantum_kronecker(quantum_reg *reg1, quantum_reg *reg2);
extern quantum_reg quantum_state_collapse(int bit, int value,
quantum_reg reg);
extern COMPLEX_FLOAT quantum_dot_product(quantum_reg *reg1, quantum_reg *reg2);
/* Our 64-bit multiplicative hash function */
static inline unsigned int