import networkx as nx

# Kode Anda di sini

"""
Explanation: Artificial Intelligence & Machine Learning
Ujian Akhir Semester
Mekanisme
Anda hanya diwajibkan untuk mengumpulkan file ini saja ke uploader yang disediakan di https://elearning.uai.ac.id/. Ganti nama file ini saat pengumpulan menjadi uas_NIM.ipynb.
Keterlambatan: Pengumpulan ujian yang melebihi tenggat yang telah ditentukan tidak akan diterima. Keterlambatan akan berakibat pada nilai nol untuk ujian ini.
Kolaborasi: Anda tidak diperbolehkan untuk berdiskusi dengan teman Anda. Dilarang keras menyalin kode maupun tulisan dari teman Anda. Kecurangan akan berakibat pada nilai nol untuk ujian ini.
Petunjuk
Untuk kelancaran Anda, gunakan Python 3 dalam ujian ini. Anda diperbolehkan (jika dirasa perlu) untuk mengimpor modul tambahan untuk tugas ini. Namun, seharusnya modul yang tersedia sudah cukup untuk memenuhi kebutuhan Anda. Untuk kode yang Anda ambil dari sumber lain, cantumkan URL menuju referensi tersebut jika diambil dari internet!
1. Markov Decision Processes
Diberikan definisi permainan sebagai berikut:
Untuk setiap ronder $r = 1, 2, ...$

Anda dapat memilih opsi A atau B.
Jika Anda memilih A, Anda akan mendapatkan \$7 dan akan dilempar sebuah dadu enam muka.
Jika yang keluar adalah angka 1, 2, 3, atau 4, maka permainan berhenti.
Jika yang keluar adalah angka 5 atau 6, maka kita akan lanjut ke ronde berikutnya.


Jika Anda memilih B, Anda akan mendapatkan \$3 dan akan dilempar sebuah koin dengan muka angka atau gambar.
Jika yang keluar adalah angka, maka permainan berhenti.
Jika yang keluar adalah gambar, maka kita akan lanjut ke ronde berikutnya.



Tugas Anda adalah mendapatkan uang sebanyak-banyaknya.
Soal 1.1 (3 poin)
Gambarkan MDP-nya, i.e. states, actions, dan rewards-nya dengan pustaka networkx. States yang Anda bisa kontrol adalah main dan selesai.
Tips: Anda bisa memanfaatkan modul MultiDiGraph dari networkx.
End of explanation
"""


# Kode Anda di sini

"""
Explanation: Soal 1.2.a (2 poin)
Diberikan $\pi(main) = A$. Formulasikan $V_{\pi}(main)$ dan $V_{\pi}(selesai)$.
$$
V_{\pi}(main) = ...
$$
$$
V_{\pi}(selesai) = ...
$$
Soal 1.2.b (2 poin)
Implementasikan algoritma value iteration dari formula di atas untuk mendapatkan $V_{\pi}(main)$ dan $V_{\pi}(selesai)$.
End of explanation
"""


import numpy as np

class ExplodingGame(object):
    def __init__(self, N):
        self.N = N

    # state = (player, number)
    def start(self):
        return (+1, 1)

    def actions(self, state):
        player, number = state
        return ['+', '*']

    def succ(self, state, action):
        player, number = state
        if action == '+':
            return (-player, number + 2)
        elif action == '*':
            return (-player, np.ceil(number * 1.1))
        assert False

    def is_end(self, state):
        player, number = state
        return number > self.N

    def utility(self, state):
        player, number = state
        assert self.is_end(state)
        return player * float('inf')

    def player(self, state):
        player, number = state
        return player

def add_policy(game, state):
    action = '+'
    print(f"add policy: state {state} => action {action}")
    return action

def multiply_policy(game, state):
    action = '*'
    print(f"multiply policy: state {state} => action {action}")
    return action

"""
Explanation: Soal 1.3 (2 poin)
Dengan $\pi(main) = A$, tuliskan formula $Q_{\pi}(main, B)$ dan tentukan nilainya.
Jawaban Anda di sini
Soal 1.4 (1 poin)
Apa yang menjadi nilai $\pi_{opt}(main)$?
Jawaban Anda di sini
2. Game Playing
Diberikan permainan seperti di bawah ini.

Diberikan ambang batas $N$ dan permainan dimulai dari nilai 1.
Para pemain secara bergantian dapat memilih untuk menambahkan nilai dengan 2 atau mengalikan nilai dengan 1.1.
Pemain yang melebihi ambang batas akan kalah.
End of explanation
"""


def random_policy(game, state):
    pass

"""
Explanation: Soal 2.1 (2 poin)
Implementasikan random policy yang akan memilih aksi dengan rasio peluang 50%:50%.
End of explanation
"""


def minimax_policy(game, state):
    pass

"""
Explanation: Soal 2.2 (3 poin)
Implementasikan fungsi minimax policy.
End of explanation
"""


def expectimax_policy(game, state):
    pass

# Kasus uji
game = ExplodingGame(N=10)

policies = {
    +1: add_policy,
    -1: multiply_policy
}

state = game.start()
while not game.is_end(state):
    # Who controls this state?
    player = game.player(state)
    policy = policies[player]
    # Ask policy to make a move
    action = policy(game, state)
    # Advance state
    state = game.succ(state, action)
print(f"Utility di akhir permainan {game.utility(state)}")

"""
Explanation: Soal 2.3 (2 poin)
Implementasikan fungsi expectimax policy untuk melawan random policy yang didefinisikan pada soal 2.1.
End of explanation
"""


!pip install pomegranate

from pomegranate import *

observed = [2,3,3,2,3,2,3,2,2,3,1,3,3,1,1,1,2,1,1,1,3,1,2,1,1,1,2,3,3,2,3,2,2]

"""
Explanation: Soal 2.4 (3 poin)
Sebutkan policy terbaik untuk melawan:

random policy
expectimax policy
minimax policy

Jawaban Anda di sini
3. Bayesian Network
Bayangkan Anda adalah seorang klimatolog yang bekerja untuk BMKG di tahun 3021 yang sedang mempelajari kasus pemanasan global. Anda tidak mengetahui catatan cuaca di tahun 2021 di Jakarta, tapi Anda punya diari milik Pak Ali yang memberikan keterangan berapa jumlah es krim yang dimakan Pak Ali tiap harinya di musim kemarau. Tujuan Anda adalah mengestimasi perubahan cuaca dari hari ke hari - panas (H) atau sejuk (C). Dengan kata lain,

Jika diberikan observasi $O$ (bilangan bulat yang merepresentasikan jumlah es krim yang dimakan Pak Ali di suatu hari), temukan urutan kondisi cuaca $Q$ dari hari-hari tersebut.

Definisi variabelnya adalah sebagai berikut: $Q \in {H, C}$ dan $O \in {1, 2, 3}$. Untuk bagian ini, Anda diminta untuk mengimplementasikan kode dengan memanfaatkan pustaka pomegranate.
Masalah ini diadaptasi dari makalah oleh Eisner (2002).
Petunjuk: Lihat kembali tugas 4 Anda. Penggunaan pustaka pomegranate sangat mirip dengan implementasi pada tugas tersebut.
End of explanation
"""


# Kode anda di sini

"""
Explanation: Soal 3.1 (2 poin)
Jika diketahui bahwa
\begin{align}
P(1|H) = 0.2 \
P(2|H) = 0.4 \
P(3|H) = 0.4
\end{align}
dan
\begin{align}
P(1|C) = 0.5 \
P(2|C) = 0.4 \
P(3|C) = 0.1
\end{align}
Definisikan probabilitas emisinya.
End of explanation
"""


# Kode Anda di sini

"""
Explanation: Soal 3.2 (2 poin)
Diketahui bahwa
\begin{align}
P(Q_t=H|Q_{t-1}=H) &= 0.6 \
P(Q_t=C|Q_{t-1}=H) &= 0.4 \
P(Q_t=H|Q_{t-1}=C) &= 0.5 \
P(Q_t=C|Q_{t-1}=C) &= 0.5 \
\end{align}
Definisikan probabilitas transisinya.
End of explanation
"""


# Kode Anda di sini

"""
Explanation: Soal 3.3 (2 poin)
Diketahui bahwa
$$
P(Q_1 = H) = 0.8
$$
Definisikan probabilitas inisiasinya.
End of explanation
"""


# Kode Anda di sini

"""
Explanation: Soal 3.4 (2 poin)
Berapa log probability dari observasi (observed) di atas?
End of explanation
"""


# Kode Anda di sini

"""
Explanation: Soal 3.5 (2 poin)
Tunjukkan urutan $Q$ yang paling mungkin.
End of explanation
"""


