Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
program-training
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
yuki.yahagi
program-training
Commits
5aa235c1
Commit
5aa235c1
authored
May 30, 2018
by
yuki.yahagi
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop'
* develop: アニーリングマシンのverilogでなぜかエネルギーをreg宣言して計算していたところを直し,pythonコードでおんなじこと書いてみた
parents
5001b378
731c7ac1
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
124 additions
and
63 deletions
+124
-63
annealer_2x2.py
semi_annealing_2x2/annealer_2x2.py
+72
-0
annealer_2x2.v
semi_annealing_2x2/annealer_2x2.v
+48
-61
annealerについて.md
semi_annealing_2x2/annealerについて.md
+4
-2
No files found.
semi_annealing_2x2/annealer_2x2.py
0 → 100644
View file @
5aa235c1
def
annealer
(
list_spin
,
interact0
,
interact1
,
interact2
,
interact3
,
interact4
,
interact5
,
):
spin
=
[
0
,
0
,
0
,
0
]
spin
[
0
]
=
list_spin
[
0
]
*
2
-
1
spin
[
1
]
=
list_spin
[
1
]
*
2
-
1
spin
[
2
]
=
list_spin
[
2
]
*
2
-
1
spin
[
3
]
=
list_spin
[
3
]
*
2
-
1
H
=
[
0
,
0
,
0
,
0
,
0
]
while
1
:
H
[
4
]
=
(
-
1
*
interact0
*
spin
[
0
]
*
spin
[
1
]
)
\
+
(
-
1
*
interact1
*
spin
[
0
]
*
spin
[
2
]
)
\
+
(
-
1
*
interact2
*
spin
[
0
]
*
spin
[
3
]
)
\
+
(
-
1
*
interact3
*
spin
[
1
]
*
spin
[
2
]
)
\
+
(
-
1
*
interact4
*
spin
[
1
]
*
spin
[
3
]
)
\
+
(
-
1
*
interact5
*
spin
[
2
]
*
spin
[
3
]
)
H
[
0
]
=
(
interact0
*
spin
[
0
]
*
spin
[
1
]
)
\
+
(
interact1
*
spin
[
0
]
*
spin
[
2
]
)
\
+
(
interact2
*
spin
[
0
]
*
spin
[
3
]
)
\
+
(
-
1
*
interact3
*
spin
[
1
]
*
spin
[
2
]
)
\
+
(
-
1
*
interact4
*
spin
[
1
]
*
spin
[
3
]
)
\
+
(
-
1
*
interact5
*
spin
[
2
]
*
spin
[
3
]
)
H
[
1
]
=
(
interact0
*
spin
[
0
]
*
spin
[
1
]
)
\
+
(
-
1
*
interact1
*
spin
[
0
]
*
spin
[
2
]
)
\
+
(
-
1
*
interact2
*
spin
[
0
]
*
spin
[
3
]
)
\
+
(
interact3
*
spin
[
1
]
*
spin
[
2
]
)
\
+
(
interact4
*
spin
[
1
]
*
spin
[
3
]
)
\
+
(
-
1
*
interact5
*
spin
[
2
]
*
spin
[
3
]
)
H
[
2
]
=
(
-
1
*
interact0
*
spin
[
0
]
*
spin
[
1
]
)
\
+
(
interact1
*
spin
[
0
]
*
spin
[
2
]
)
\
+
(
-
1
*
interact2
*
spin
[
0
]
*
spin
[
3
]
)
\
+
(
interact3
*
spin
[
1
]
*
spin
[
2
]
)
\
+
(
-
1
*
interact4
*
spin
[
1
]
*
spin
[
3
]
)
\
+
(
interact5
*
spin
[
2
]
*
spin
[
3
]
)
H
[
3
]
=
(
-
1
*
interact0
*
spin
[
0
]
*
spin
[
1
]
)
\
+
(
-
1
*
interact1
*
spin
[
0
]
*
spin
[
2
]
)
\
+
(
interact2
*
spin
[
0
]
*
spin
[
3
]
)
\
+
(
-
1
*
interact3
*
spin
[
1
]
*
spin
[
2
]
)
\
+
(
interact4
*
spin
[
1
]
*
spin
[
3
]
)
\
+
(
interact5
*
spin
[
2
]
*
spin
[
3
]
)
if
(
H
[
0
]
<
H
[
1
]
):
invert_tmp0
=
0
else
:
invert_tmp0
=
1
if
(
H
[
2
]
<
H
[
3
]
):
invert_tmp1
=
2
else
:
invert_tmp1
=
3
if
(
H
[
invert_tmp0
]
<
H
[
invert_tmp1
]
):
invert
=
invert_tmp0
else
:
invert
=
invert_tmp1
if
(
H
[
4
]
>
H
[
invert
]
):
spin
[
invert
]
=
-
spin
[
invert
]
else
:
return
spin
semi_annealing_2x2/annealer_2x2.v
View file @
5aa235c1
...
...
@@ -18,10 +18,10 @@ module annealer_2x2( // 2x2のアニーリングマシン,外部磁場を考
reg
[
3
:
0
]
spin
;
// スピンの値,今回は1, 0で表す(+1 --> 1, -1 --> 0)
reg
[
3
:
0
]
J0
,
J1
,
J2
,
J3
,
J4
,
J5
;
// 相互作用係数
reg
[
6
:
0
]
H
[
4
:
0
]
;
// ハミルトニアン(エネルギー),相互作用係数から42 ~ -42の値をとるので7ビット必要,
wire
[
6
:
0
]
H
[
4
:
0
]
;
// ハミルトニアン(エネルギー),相互作用係数から42 ~ -42の値をとるので7ビット必要,
// また,現在の状態 + ある1つのスピンの値が反転した場合の合計5通りの計算をしておく.
reg
state_init
,
state_busy
,
state_end
;
reg
invert
;
// どのスピンを反転させるか
wire
[
1
:
0
]
invert
,
invert_tmp
;
// どのスピンを反転させるか
wire
[
6
:
0
]
Jscale
[
5
:
0
]
;
// Jを7ビットに拡張する,7ビットのwireが6本
wire
[
6
:
0
]
Sscale
[
3
:
0
]
;
// スピンの値を7ビットに拡張する,スピンの値を符号ビットのように扱う.
...
...
@@ -40,6 +40,51 @@ module annealer_2x2( // 2x2のアニーリングマシン,外部磁場を考
assign
Sscale
[
1
]
=
{
spin
[
1
]
,
6'b000000
};
assign
Sscale
[
2
]
=
{
spin
[
2
]
,
6'b000000
};
assign
Sscale
[
3
]
=
{
spin
[
3
]
,
6'b000000
};
assign
H
[
4
]
=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
^
7'b1000000
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
^
7'b1000000
)
;
// ハミルトニアンの計算,シグマの前の符号は各項に分配している(7'b1000000でXORを取ることで符号を反転させている)
assign
H
[
0
]
=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
^
7'b1000000
)
;
// spin[0]が反転した時を想定したハミルトニアンの計算,
// spin[0]が使われている(Sscale[0]を含む)項の符号を反転させなければ良い
assign
H
[
1
]
=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
^
7'b1000000
)
;
// spin[1]の反転
assign
H
[
2
]
=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
^
7'b1000000
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
)
;
// spin[2]の反転
assign
H
[
3
]
=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
^
7'b1000000
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
)
;
// spin[3]の反転
// ハミルトニアンが最小となる反転を見つける.
// Hはunsignedなので,キャストしてから比較
assign
invert_tmp
[
0
]
=
($
signed
(
H
[
0
])
>
$
signed
(
H
[
1
]))
;
assign
invert_tmp
[
1
]
=
($
signed
(
H
[
2
])
>
$
signed
(
H
[
3
]))
;
assign
invert
[
1
]
=
($
signed
(
H
[
{
1'b0
,
invert_tmp
[
0
]
}
])
>
$
signed
(
H
[
{
1'b1
,
invert_tmp
[
1
]
}
]))
;
assign
invert
[
0
]
=
invert_tmp
[
invert
[
1
]]
;
always
@
(
posedge
clk
or
negedge
reset_N
)
begin
if
(
!
reset_N
)
...
...
@@ -53,65 +98,7 @@ module annealer_2x2( // 2x2のアニーリングマシン,外部磁場を考
{
state_init
,
state_busy
,
state_end
}
<=
3'b010
;
end
else
if
(
{
state_init
,
state_busy
,
state_end
}
==
3'b010
)
begin
H
[
0
]
<=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
^
7'b1000000
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
^
7'b1000000
)
;
// ハミルトニアンの計算,シグマの前の符号は各項に分配している(7'b1000000でXORを取ることで符号を反転させている)
H
[
1
]
<=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
^
7'b1000000
)
;
// spin[0]が反転した時を想定したハミルトニアンの計算,
// spin[0]が使われている(Sscale[0]を含む)項の符号を反転させなければ良い
H
[
2
]
<=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
^
7'b1000000
)
;
// spin[1]の反転
H
[
3
]
<=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
^
7'b1000000
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
^
7'b1000000
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
)
;
// spin[2]の反転
H
[
3
]
<=
(
Jscale
[
0
]
^
Sscale
[
0
]
^
Sscale
[
1
]
^
7'b1000000
)
+
(
Jscale
[
1
]
^
Sscale
[
0
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
2
]
^
Sscale
[
0
]
^
Sscale
[
3
]
)
+
(
Jscale
[
3
]
^
Sscale
[
1
]
^
Sscale
[
2
]
^
7'b1000000
)
+
(
Jscale
[
4
]
^
Sscale
[
1
]
^
Sscale
[
3
]
)
+
(
Jscale
[
5
]
^
Sscale
[
2
]
^
Sscale
[
3
]
)
;
// spin[3]の反転
// ハミルトニアンが最小となる反転を見つける.
if
(
$
signed
(
H
[
1
])
<
$
signed
(
H
[
2
])
)
// Hはunsignedなので,キャストしてから比較
if
(
$
signed
(
H
[
1
])
<
$
signed
(
H
[
3
])
)
if
(
$
signed
(
H
[
1
])
<
$
signed
(
H
[
4
])
)
invert
<=
1
;
else
invert
<=
4
;
else
if
(
$
signed
(
H
[
3
])
<
$
signed
(
H
[
4
])
)
invert
<=
3
;
else
invert
<=
4
;
else
if
(
$
signed
(
H
[
2
])
<
$
signed
(
H
[
3
])
)
if
(
$
signed
(
H
[
2
])
<
$
signed
(
H
[
4
])
)
invert
<=
2
;
else
invert
<=
4
;
else
if
(
$
signed
(
H
[
3
])
<
$
signed
(
H
[
4
])
)
invert
<=
3
;
else
invert
<=
4
;
if
(
$
signed
(
H
[
invert
])
<
$
signed
(
H
[
0
])
)
// 反転させた方がエネルギーが小さくなった場合
if
(
$
signed
(
H
[
invert
])
<
$
signed
(
H
[
4
])
)
// 反転させた方がエネルギーが小さくなった場合
spin
[
invert
]
<=
~
spin
[
invert
]
;
else
{
state_init
,
state_busy
,
state_end
}
<=
3'b001
;
...
...
semi_annealing_2x2/annealerについて.md
View file @
5aa235c1
# annealerについて
2x2,4つのスピンがそれぞれ他の3つのスピンと繋がっている想定で作ってみた.構文エラーは無くしたが,果たして意図した通りに動くかは謎.もっと言えば,エネルギーが悪化するスピンの反転を認めていないので,アニーリングにもなってない代物.
\ No newline at end of file
2x2,4つのスピンがそれぞれ他の3つのスピンと繋がっている想定で作ってみた.構文エラーは無くしたが,果たして意図した通りに動くかは謎.もっと言えば,エネルギーが悪化するスピンの反転を認めていないので,アニーリングにもなってない代物.
verilogの内容を一応pythonでも書いてみたり.
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment