KR-IST - Lecture 5b Game play in Java
Transcript of KR-IST - Lecture 5b Game play in Java
![Page 1: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/1.jpg)
KR-IST - Lecture 5b
Game play in Java
Chris Thornton
October 30, 2014
![Page 2: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/2.jpg)
Introduction
This lecture will look at a program for playing noughts and crosses(tic-tac-toe).
The implementation makes use of ‘negmax’ evaluation but doesnot use alpha-beta pruning.
![Page 3: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/3.jpg)
Step-by-step guide for writing a search program
![Page 4: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/4.jpg)
Step-by-step guide for writing a search program
(1) Informally characterise states, goals and transitions.
![Page 5: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/5.jpg)
Step-by-step guide for writing a search program
(1) Informally characterise states, goals and transitions.
(2) Choose a representation for states.
![Page 6: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/6.jpg)
Step-by-step guide for writing a search program
(1) Informally characterise states, goals and transitions.
(2) Choose a representation for states.
(3) Sketch out a method for generating successors. (Goback to step 2 if this is difficult.)
![Page 7: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/7.jpg)
Step-by-step guide for writing a search program
(1) Informally characterise states, goals and transitions.
(2) Choose a representation for states.
(3) Sketch out a method for generating successors. (Goback to step 2 if this is difficult.)
(4) Write Java code to implement the successor method.(Go back to step 2 if this is difficult.)
![Page 8: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/8.jpg)
Step-by-step guide for writing a search program
(1) Informally characterise states, goals and transitions.
(2) Choose a representation for states.
(3) Sketch out a method for generating successors. (Goback to step 2 if this is difficult.)
(4) Write Java code to implement the successor method.(Go back to step 2 if this is difficult.)
(5) Write code for the main search loop (i.e., procesingof nodes on OPEN).
![Page 9: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/9.jpg)
Step-by-step guide for writing a search program
(1) Informally characterise states, goals and transitions.
(2) Choose a representation for states.
(3) Sketch out a method for generating successors. (Goback to step 2 if this is difficult.)
(4) Write Java code to implement the successor method.(Go back to step 2 if this is difficult.)
(5) Write code for the main search loop (i.e., procesingof nodes on OPEN).
(6) Add everything else.
![Page 10: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/10.jpg)
Step-by-step guide for writing a search program
(1) Informally characterise states, goals and transitions.
(2) Choose a representation for states.
(3) Sketch out a method for generating successors. (Goback to step 2 if this is difficult.)
(4) Write Java code to implement the successor method.(Go back to step 2 if this is difficult.)
(5) Write code for the main search loop (i.e., procesingof nodes on OPEN).
(6) Add everything else.
![Page 11: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/11.jpg)
Node class
import java.util.*;
class Node {
int state[] = new int[9];
int evaluation = -1;
Node parent = null;
Node(int s[], Node parent) {
for (int i = 0; i < 9; i++) state[i] = s[i];
this.parent = parent;
}
public String toString() {
String s = "";
for (int i = 0; i < 9; i++) s = s + state[i] + " ";
return s;
}
![Page 12: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/12.jpg)
Node class cont.
int[] getStateCopy() {
int[] s = state, copy = {s[0], s[1], s[2], s[3],
s[4], s[5], s[6], s[7], s[8]};
return copy;
}
Vector<Node> getPath(Vector<Node> v) {
v.insertElementAt(this, 0);
if (parent != null) v = parent.getPath(v);
return v;
}
Vector<Node> getPath() { return(getPath(new Vector<Node>())); }
}
![Page 13: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/13.jpg)
NoughtsAndCrossesSpace class
class NoughtsAndCrossesSpace {
Node getRoot() {
int state[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
return new Node(state, null);
}
Vector<Node> getSuccessors(Node parent, int player) {
Vector<Node> successors = new Vector<Node>();
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
if (parent.state[(r * 3) + c] == 0) { /* empty cell here */
int state[] = parent.getStateCopy();
state[(r * 3) + c] = player;
successors.add(new Node(state, parent)); }
}
}
return successors;
}
}
![Page 14: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/14.jpg)
Search space
public class NoughtsAndCrossesSearch {
NoughtsAndCrossesSpace space = new NoughtsAndCrossesSpace();
String name(int player) {
String s = "_";
if (player == 1) {
s = "X"; }
else if (player == -1) {
s = "O"; }
return s;
}
void pr(String s) {
System.out.println(s);
}
void printState(Node node) { /* print board state */
System.out.println("\n");
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
int player = node.state[(r * 3) + c];
pr(" " + name(player)); }
![Page 15: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/15.jpg)
Static evaluation
/** decide whether board state s is won for player p */
boolean wonFor(int s[], int p) {
boolean b = (s[0] == p && s[1] == p && s[2] == p)
|| (s[3] == p && s[4] == p && s[5] == p)
|| (s[6] == p && s[7] == p && s[8] == p)
|| (s[0] == p && s[3] == p && s[6] == p)
|| (s[1] == p && s[4] == p && s[7] == p)
|| (s[2] == p && s[5] == p && s[8] == p)
|| (s[0] == p && s[4] == p && s[8] == p)
|| (s[2] == p && s[4] == p && s[6] == p);
return b;
}
int winnerOf(int state[]) {
int player = 0;
if (wonFor(state, 1)) {
player = 1; }
else if (wonFor(state, -1)) {
player = -1; }
return player;
}
![Page 16: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/16.jpg)
Dynamic evaluation
int evaluate(Node node, int player) { /* using NEGMAX */
int value = 0;
if (wonFor(node.state, player)) {
value = 1; }
else if (wonFor(node.state, -player)) {
value = -1; }
else {
Vector<Node> successors = space.getSuccessors(node, -player);
if (successors.size() == 0) { /* draw */
value = 0; }
else {
for (int i = 0; i < successors.size(); i++) {
Node successor = successors.get(i);
successor.evaluation = evaluate(successor, -player);
if (successor.evaluation > value) {
value = successor.evaluation; } }
value = -value; } }
return(value);
}
![Page 17: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/17.jpg)
Main loop
void run() {
int p, player = 1;
Node node = space.getRoot();
Vector<Node> bestNodes = new Vector<Node>();
printState(node);
while ((p = winnerOf(node.state)) == 0) { /* while no winner */
Vector<Node> successors = space.getSuccessors(node, player);
int maxValue = -Integer.MAX_VALUE;
bestNodes.clear();
for (int i = 0; i < successors.size(); i++) {
Node newNode = successors.get(i);
int value = evaluate(newNode, player);
if (value == maxValue || player == -1) {
bestNodes.add(newNode); } /* ensure random opponent */
else if (value > maxValue) {
bestNodes.clear();
bestNodes.add(newNode);
maxValue = value; } }
![Page 18: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/18.jpg)
Main loop cont.
if (successors.size() == 0) { /* game drawn */
break; }
else {
pr("State after new " + name(player) + " (" + player + ")");
int randomIndex = (int)(Math.random() * bestNodes.size());
node = bestNodes.get(randomIndex);
printState(node);
player = -player; }
}
pr(p == 0 ? "DRAW" : "GAME WON FOR " + name(p) + "\n\n");
}
public static void main(String args[]) { // do the search
new NoughtsAndCrossesSearch().run();
}
}
![Page 19: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/19.jpg)
Simulated game
Initial node: (X never errs, 0 plays randomly)
_ _ _
_ _ _
_ _ _
State after new X (1)
_ _ _
X _ _
_ _ _
State after new O (-1)
_ _ _
X _ _
O _ _
![Page 20: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/20.jpg)
Cont.
State after new X (1)
_ X _
X _ _
O _ _
State after new O (-1)
_ X _
X _ _
O O _
State after new X (1)
_ X _
X _ _
O O X
![Page 21: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/21.jpg)
Underlying evaluations for prev move
Evaluations
|-- 0 for O -1 1 0 1 0 0 -1 -1 1
| |-- 0 for X -1 1 1 1 0 0 -1 -1 1
| | |-- -1 for O -1 1 1 1 -1 0 -1 -1 1
| | | |-- 1 for X -1 1 1 1 -1 1 -1 -1 1
| | |-- 0 for O -1 1 1 1 0 -1 -1 -1 1
| | |-- 0 for X -1 1 1 1 1 -1 -1 -1 1
| |-- 0 for X -1 1 0 1 1 0 -1 -1 1
| | |-- -1 for O -1 1 -1 1 1 0 -1 -1 1
| | | |-- 1 for X -1 1 -1 1 1 1 -1 -1 1
| | |-- 0 for O -1 1 0 1 1 -1 -1 -1 1
| | |-- 0 for X -1 1 1 1 1 -1 -1 -1 1
| |-- 0 for X -1 1 0 1 0 1 -1 -1 1
| |-- -1 for O -1 1 -1 1 0 1 -1 -1 1
| | |-- 1 for X -1 1 -1 1 1 1 -1 -1 1
| |-- -1 for O -1 1 0 1 -1 1 -1 -1 1
| |-- 1 for X -1 1 1 1 -1 1 -1 -1 1
![Page 22: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/22.jpg)
Evaluations cont.
|-- 0 for O 0 1 -1 1 0 0 -1 -1 1
| |-- -1 for X 1 1 -1 1 0 0 -1 -1 1
| | |-- 1 for O 1 1 -1 1 -1 0 -1 -1 1
| | |-- -1 for O 1 1 -1 1 0 -1 -1 -1 1
| | |-- 1 for X 1 1 -1 1 1 -1 -1 -1 1
| |-- 0 for X 0 1 -1 1 1 0 -1 -1 1
| | |-- -1 for O -1 1 -1 1 1 0 -1 -1 1
| | | |-- 1 for X -1 1 -1 1 1 1 -1 -1 1
| | |-- -1 for O 0 1 -1 1 1 -1 -1 -1 1
| | |-- 1 for X 1 1 -1 1 1 -1 -1 -1 1
| |-- -1 for X 0 1 -1 1 0 1 -1 -1 1
| |-- -1 for O -1 1 -1 1 0 1 -1 -1 1
| | |-- 1 for X -1 1 -1 1 1 1 -1 -1 1
| |-- 1 for O 0 1 -1 1 -1 1 -1 -1 1
![Page 23: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/23.jpg)
Evaluations cont.
|-- 0 for O 0 1 0 1 -1 0 -1 -1 1
| |-- -1 for X 1 1 0 1 -1 0 -1 -1 1
| | |-- 1 for O 1 1 -1 1 -1 0 -1 -1 1
| | |-- -1 for O 1 1 0 1 -1 -1 -1 -1 1
| | |-- 1 for X 1 1 1 1 -1 -1 -1 -1 1
| |-- 0 for X 0 1 1 1 -1 0 -1 -1 1
| | |-- -1 for O -1 1 1 1 -1 0 -1 -1 1
| | | |-- 1 for X -1 1 1 1 -1 1 -1 -1 1
| | |-- -1 for O 0 1 1 1 -1 -1 -1 -1 1
| | |-- 1 for X 1 1 1 1 -1 -1 -1 -1 1
| |-- -1 for X 0 1 0 1 -1 1 -1 -1 1
| |-- -1 for O -1 1 0 1 -1 1 -1 -1 1
| | |-- 1 for X -1 1 1 1 -1 1 -1 -1 1
| |-- 1 for O 0 1 -1 1 -1 1 -1 -1 1
![Page 24: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/24.jpg)
Evaluations cont.
|-- 0 for O 0 1 0 1 0 -1 -1 -1 1
|-- 0 for X 1 1 0 1 0 -1 -1 -1 1
| |-- -1 for O 1 1 -1 1 0 -1 -1 -1 1
| | |-- 1 for X 1 1 -1 1 1 -1 -1 -1 1
| |-- -1 for O 1 1 0 1 -1 -1 -1 -1 1
| |-- 1 for X 1 1 1 1 -1 -1 -1 -1 1
|-- 0 for X 0 1 1 1 0 -1 -1 -1 1
| |-- 0 for O -1 1 1 1 0 -1 -1 -1 1
| | |-- 0 for X -1 1 1 1 1 -1 -1 -1 1
| |-- -1 for O 0 1 1 1 -1 -1 -1 -1 1
| |-- 1 for X 1 1 1 1 -1 -1 -1 -1 1
|-- 0 for X 0 1 0 1 1 -1 -1 -1 1
|-- 0 for O -1 1 0 1 1 -1 -1 -1 1
| |-- 0 for X -1 1 1 1 1 -1 -1 -1 1
|-- -1 for O 0 1 -1 1 1 -1 -1 -1 1
|-- 1 for X 1 1 -1 1 1 -1 -1 -1 1
![Page 25: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/25.jpg)
Game continues
State after new O (-1)
_ X _
X _ O
O O X
State after new X (1)
_ X X
X _ O
O O X
Evaluations
|-- 0 for O -1 1 1 1 0 -1 -1 -1 1
| |-- 0 for X -1 1 1 1 1 -1 -1 -1 1
|-- -1 for O 0 1 1 1 -1 -1 -1 -1 1
|-- 1 for X 1 1 1 1 -1 -1 -1 -1 1
![Page 26: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/26.jpg)
Game concludes
State after new O (-1)
_ X X
X O O
O O X
Evaluations
|-- 1 for X 1 1 1 1 -1 -1 -1 -1 1
State after new X (1)
X X X
X O O
O O X
GAME WON FOR X
![Page 27: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/27.jpg)
Summary
![Page 28: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/28.jpg)
Summary
◮ Node class
![Page 29: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/29.jpg)
Summary
◮ Node class
◮ NoughtsAndCrossesSpace class
![Page 30: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/30.jpg)
Summary
◮ Node class
◮ NoughtsAndCrossesSpace class
◮ Static evaluations
![Page 31: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/31.jpg)
Summary
◮ Node class
◮ NoughtsAndCrossesSpace class
◮ Static evaluations
◮ Dynamic evaluation
![Page 32: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/32.jpg)
Summary
◮ Node class
◮ NoughtsAndCrossesSpace class
◮ Static evaluations
◮ Dynamic evaluation
◮ Tree generation
![Page 33: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/33.jpg)
Summary
◮ Node class
◮ NoughtsAndCrossesSpace class
◮ Static evaluations
◮ Dynamic evaluation
◮ Tree generation
◮ Main loop
![Page 34: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/34.jpg)
Summary
◮ Node class
◮ NoughtsAndCrossesSpace class
◮ Static evaluations
◮ Dynamic evaluation
◮ Tree generation
◮ Main loop
◮ main method
![Page 35: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/35.jpg)
Summary
◮ Node class
◮ NoughtsAndCrossesSpace class
◮ Static evaluations
◮ Dynamic evaluation
◮ Tree generation
◮ Main loop
◮ main method
![Page 36: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/36.jpg)
Questions
![Page 37: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/37.jpg)
Questions
◮ Why does this program use an evaluation parameter for nodesrather than a cost parameter?
![Page 38: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/38.jpg)
Questions
◮ Why does this program use an evaluation parameter for nodesrather than a cost parameter?
◮ How easy would it be to rewrite the wonFor method so as tomake use of iterative constructs.
![Page 39: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/39.jpg)
Questions
◮ Why does this program use an evaluation parameter for nodesrather than a cost parameter?
◮ How easy would it be to rewrite the wonFor method so as tomake use of iterative constructs.
![Page 40: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/40.jpg)
Exercises
![Page 41: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/41.jpg)
Exercises
◮ Modify the NoughtsAndCrossesSearch program so that itprefers wins which involve fewer moves.
![Page 42: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/42.jpg)
Exercises
◮ Modify the NoughtsAndCrossesSearch program so that itprefers wins which involve fewer moves.
◮ Modify the NoughtsAndCrossesSearch program so that it usesordinary minimax evaluation.
![Page 43: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/43.jpg)
Exercises
◮ Modify the NoughtsAndCrossesSearch program so that itprefers wins which involve fewer moves.
◮ Modify the NoughtsAndCrossesSearch program so that it usesordinary minimax evaluation.
◮ Modify the NoughtsAndCrossesSearch program so as toimplement alpha-beta pruning.
![Page 44: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/44.jpg)
Exercises
◮ Modify the NoughtsAndCrossesSearch program so that itprefers wins which involve fewer moves.
◮ Modify the NoughtsAndCrossesSearch program so that it usesordinary minimax evaluation.
◮ Modify the NoughtsAndCrossesSearch program so as toimplement alpha-beta pruning.
◮ Modify the NoughtsAndCrossesSearch program so that it isinteractive, i.e., moves by the second player are chosen by theuser.
![Page 45: KR-IST - Lecture 5b Game play in Java](https://reader031.fdocuments.us/reader031/viewer/2022030122/621d58f97ab5012c7c6a18d5/html5/thumbnails/45.jpg)
Exercises
◮ Modify the NoughtsAndCrossesSearch program so that itprefers wins which involve fewer moves.
◮ Modify the NoughtsAndCrossesSearch program so that it usesordinary minimax evaluation.
◮ Modify the NoughtsAndCrossesSearch program so as toimplement alpha-beta pruning.
◮ Modify the NoughtsAndCrossesSearch program so that it isinteractive, i.e., moves by the second player are chosen by theuser.