Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
TTool
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
mbe-tools
TTool
Commits
100ec0a5
Commit
100ec0a5
authored
1 year ago
by
Ludovic Apvrille
Browse files
Options
Downloads
Patches
Plain Diff
Adding AIStateMachine. Still not usable
parent
440499d6
No related branches found
No related tags found
No related merge requests found
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/main/java/ai/AIChatData.java
+1
-0
1 addition, 0 deletions
src/main/java/ai/AIChatData.java
src/main/java/ai/AIStateMachine.java
+78
-89
78 additions, 89 deletions
src/main/java/ai/AIStateMachine.java
with
79 additions
and
89 deletions
src/main/java/ai/AIChatData.java
+
1
−
0
View file @
100ec0a5
...
...
@@ -64,6 +64,7 @@ public class AIChatData {
public
boolean
knowledgeOnProperties
=
false
;
public
int
knowledgeOnBlockJSON
=
-
1
;
public
boolean
knowledgeOnAMULET
=
false
;
public
boolean
knowledgeOnStateMachines
=
false
;
public
AIFeedback
feedback
;
public
String
lastQuestion
;
...
...
This diff is collapsed.
Click to expand it.
src/main/java/ai/AIStateMachine.java
+
78
−
89
View file @
100ec0a5
...
...
@@ -56,50 +56,31 @@ import java.util.ArrayList;
*/
public
class
AIStateMachine
extends
AIInteract
{
public
class
AIStateMachine
extends
AIInteract
implements
AISysMLV2DiagramContent
{
private
static
String
[]
SUPPORTED_DIAGRAMS
=
{
"BD"
};
private
static
String
[]
EXCLUSIONS_IN_INPUT
=
{
"type"
};
public
static
String
KNOWLEDGE_ON_JSON_FOR_
BLOCKS_AND_ATTRIBUT
ES
=
"When you are asked to identify SysML block
s
, "
+
public
static
String
KNOWLEDGE_ON_JSON_FOR_
STATE_MACHIN
ES
=
"When you are asked to identify
the
SysML
state machine of a
block, "
+
"return them as a JSON specification "
+
"formatted as follows:"
+
"{blocks: [{ \"name\": \"Name of block\", \"attributes\": [\"name\": \"name of attribute\", \"type\": \"int or bool\" ...} ...]}"
+
"Use only attributes of type int or boolean. If you want to use \"String\" or another other attribute, use int."
+
"# Respect: each attribute must be of type \"int\" or \"bool\" only"
+
"# Respect: Any identifier (block, attribute, etc.) must no contain any space. Use \"_\" instead."
;
public
static
String
KNOWLEDGE_ON_JSON_FOR_BLOCKS_AND_CONNECTIONS
=
"When you are ask to identify signals of blocks, JSON is as follows: "
+
"{blocks: [{ \"name\": \"Name of block\", \"signals\": "
+
"[ ... signals ... ] ... (no need to relist the attributes of signals, nor to give a direction). "
+
"#Respect: signals are defined like this in JSON: {\"signal\": \"input sig1(int x, bool b)\"} if the signal is an input signal"
+
" and {\"signal\": \"output sig1(int x, bool b)\"} if the signal is an output signal"
+
"#Respect 2 signals with the same name are assumed to be connected: this is the only way to connect signals. "
+
"#Respect: Two connected signals must have "
+
"the same list of attributes, even if they are "
+
"defined in two different blocks. One of them must be output, the other one must be input"
+
"#Respect: all input signals must have exactly one corresponding output signal, i.e. a signal with the same name"
+
"#Respect: two signals with the same name must be defined in different blocks"
;
/*"and after " +
"the blocks, add the " +
"following JSON: " +
"connections: [{\"block1\" : name of first block, \"sig1\": name of first " +
"signal\", \"block2\" : name of second block" +
"\"sig2\": \"name of second signal\"}, ." +
"..]. " + ".#" +
"Respect: in a connection, sig1 and sig2 must be different. The name of the signal only include its identifier, so not " +
"\"input\" nor " +
"\"output\", nor its attributes.#" +
"Two connected signals must have the \" +\n" +
" \"same list of attributes." +
"# A signal must be involved in one connection exactly";*/
public
static
String
[]
KNOWLEDGE_STAGES
=
{
KNOWLEDGE_ON_JSON_FOR_BLOCKS_AND_ATTRIBUTES
,
KNOWLEDGE_ON_JSON_FOR_BLOCKS_AND_CONNECTIONS
};
AvatarSpecification
specification
;
private
String
[]
QUESTION_IDENTIFY_SYSTEM_BLOCKS
=
{
"From the following system specification, using the specified JSON format, identify the "
+
"typical system blocks and their attributes. Do respect the JSON format, and provide only JSON (no explanation before or after).\n"
,
"From the previous JSON and system specification, update "
+
"this JSON with"
+
" the signals you have to identify. If necessary, you can add new blocks and new attributes."
};
"{states: [{ \"name\": \"Name of state\", transitions [{ \"destinationstate\" : \"state name\", \"guard\": \"boolean condition\", "
+
"\"after\": \"time "
+
"value\", \"action\":"
+
" \"attribute action or signal receiving/sending\"}]}]} ."
+
"# Respect: in actions, use only attributes and signals already defined in the corresponding block"
+
"# Respect: at least one state must be called Start, which is the start state"
;
private
AvatarSpecification
specification
;
private
String
diagramContentInSysMLV2
;
private
String
[]
KNOWLEDGE_SYSTEM_SPECIFICATION
=
{
"The specification of the system is:"
};
private
String
[]
KNOWLEDGE_SYSTEM_BLOCKS
=
{
"The specification of the blocks in SysML V2 is:"
};
private
String
[]
QUESTION_IDENTIFY_STATE_MACHINE
=
{
"From the system specification, and from the definition of blocks and"
+
" their "
+
"connections, identify the state machine of block:"
};
public
AIStateMachine
(
AIChatData
_chatData
)
{
...
...
@@ -108,55 +89,63 @@ public class AIStateMachine extends AIInteract {
public
void
internalRequest
()
{
int
stage
=
0
;
String
questionT
=
QUESTION_IDENTIFY_SYSTEM_BLOCKS
[
stage
]
+
"\n"
+
chatData
.
lastQuestion
.
trim
()
+
"\n"
;
// Add the knowledge, retrieve the block names, attributes, etc.
if
(!
chatData
.
knowledgeOnStateMachines
)
{
chatData
.
aiinterface
.
addKnowledge
(
KNOWLEDGE_ON_JSON_FOR_STATE_MACHINES
,
"ok"
);
chatData
.
knowledgeOnStateMachines
=
true
;
}
chatData
.
aiinterface
.
addKnowledge
(
KNOWLEDGE_SYSTEM_SPECIFICATION
+
chatData
.
lastQuestion
,
"ok"
);
chatData
.
aiinterface
.
addKnowledge
(
KNOWLEDGE_SYSTEM_BLOCKS
+
diagramContentInSysMLV2
,
"ok"
);
makeKnowledge
(
stage
);
// Getting block names for SysMLV2 spec
ArrayList
<
String
>
blockNames
=
new
ArrayList
<>();
boolean
done
=
false
;
int
cpt
=
0
;
// Blocks and attributes
while
(!
done
&&
cpt
<
20
)
{
cpt
++;
boolean
ok
=
makeQuestion
(
questionT
);
if
(!
ok
)
{
done
=
true
;
TraceManager
.
addDev
(
"Make question failed"
);
}
ArrayList
<
String
>
errors
;
try
{
TraceManager
.
addDev
(
"Making specification from "
+
chatData
.
lastAnswer
);
specification
=
AvatarSpecification
.
fromJSON
(
extractJSON
(),
"design"
,
null
);
errors
=
AvatarSpecification
.
getJSONErrors
();
}
catch
(
org
.
json
.
JSONException
e
)
{
TraceManager
.
addDev
(
"Invalid JSON spec: "
+
extractJSON
()
+
" because "
+
e
.
getMessage
()
+
": INJECTING ERROR"
);
errors
=
new
ArrayList
<>();
errors
.
add
(
"There is an error in your JSON: "
+
e
.
getMessage
()
+
". probably the JSON spec was incomplete. Do correct it. I need "
+
"the full specification at once."
);
}
String
questionT
;
if
((
errors
!=
null
)
&&
(
errors
.
size
()
>
0
))
{
questionT
=
"Your answer was not correct because of the following errors:"
;
for
(
String
s
:
errors
)
{
questionT
+=
"\n- "
+
s
;
}
}
else
{
TraceManager
.
addDev
(
" Avatar spec="
+
specification
);
stage
++
;
if
(
stage
==
KNOWLEDGE_STAGES
.
length
)
{
for
(
String
blockName:
blockNames
)
{
while
(!
done
&&
cpt
<
3
)
{
cpt
++
;
questionT
=
QUESTION_IDENTIFY_STATE_MACHINE
+
blockName
;
boolean
ok
=
makeQuestion
(
questionT
)
;
if
(
!
ok
)
{
done
=
true
;
}
else
{
makeKnowledge
(
stage
);
questionT
=
QUESTION_IDENTIFY_SYSTEM_BLOCKS
[
stage
]
+
"\n"
;
TraceManager
.
addDev
(
"Make question failed"
);
}
// Checking if only correct attributes are used, only valid signals, that there is a "Start" state, etc.
ArrayList
<
String
>
errors
;
try
{
TraceManager
.
addDev
(
"Making specification from "
+
chatData
.
lastAnswer
);
specification
=
AvatarSpecification
.
fromJSON
(
extractJSON
(),
"design"
,
null
);
errors
=
AvatarSpecification
.
getJSONErrors
();
}
catch
(
org
.
json
.
JSONException
e
)
{
TraceManager
.
addDev
(
"Invalid JSON spec: "
+
extractJSON
()
+
" because "
+
e
.
getMessage
()
+
": INJECTING ERROR"
);
errors
=
new
ArrayList
<>();
errors
.
add
(
"There is an error in your JSON: "
+
e
.
getMessage
()
+
". probably the JSON spec was incomplete. Do correct it. I need "
+
"the full specification at once."
);
}
if
((
errors
!=
null
)
&&
(
errors
.
size
()
>
0
))
{
questionT
=
"Your answer was not correct because of the following errors:"
;
for
(
String
s
:
errors
)
{
questionT
+=
"\n- "
+
s
;
}
}
else
{
TraceManager
.
addDev
(
" Avatar spec="
+
specification
);
}
}
waitIfConditionTrue
(!
done
&&
cpt
<
20
);
waitIfConditionTrue
(!
done
&&
cpt
<
20
);
cpt
++;
cpt
++;
}
}
TraceManager
.
addDev
(
"Reached end of AIBlock internal request cpt="
+
cpt
);
...
...
@@ -170,20 +159,20 @@ public class AIStateMachine extends AIInteract {
return
specification
;
}
public
void
makeKnowledge
(
int
stage
)
{
TraceManager
.
addDev
(
"makeKnowledge. stage: "
+
stage
+
" chatData.knowledgeOnBlockJSON: "
+
chatData
.
knowledgeOnBlockJSON
);
if
(
stage
>
chatData
.
knowledgeOnBlockJSON
)
{
chatData
.
knowledgeOnBlockJSON
++;
String
[]
know
=
KNOWLEDGE_STAGES
[
chatData
.
knowledgeOnBlockJSON
].
split
(
"#"
);
public
void
setDiagramContentInSysMLV2
(
String
_diagramContentInSysMLV2
)
{
diagramContentInSysMLV2
=
_diagramContentInSysMLV2
;
};
for
(
String
s:
know
)
{
TraceManager
.
addDev
(
"\nKnowledge added: "
+
s
);
chatData
.
aiinterface
.
addKnowledge
(
s
,
"ok"
);
}
}
public
String
[]
getValidDiagrams
()
{
return
SUPPORTED_DIAGRAMS
;
}
public
String
[]
getDiagramExclusions
()
{
return
EXCLUSIONS_IN_INPUT
;
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment