Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
vadere
vadere
Commits
5ae5481c
Commit
5ae5481c
authored
Nov 04, 2016
by
Jakob Schöttl
Browse files
Merge branch 'activecallbackmodel' into develop
parents
ea746e26
ea4c4583
Changes
18
Show whitespace changes
Inline
Side-by-side
VadereSimulator/src/org/vadere/simulator/control/ActiveCallback.java
deleted
100644 → 0
View file @
ea746e26
package
org.vadere.simulator.control
;
/**
* This interface defines a callbacks for the simulation loop.
* It's implementations define the major part of the simulation model's logic.
* It is called "active" since it's implementations do change the state.
*
*
*/
public
interface
ActiveCallback
{
void
preLoop
(
final
double
simTimeInSec
);
void
postLoop
(
final
double
simTimeInSec
);
void
update
(
final
double
simTimeInSec
);
}
VadereSimulator/src/org/vadere/simulator/control/Simulation.java
View file @
5ae5481c
...
...
@@ -4,6 +4,7 @@ import org.apache.log4j.LogManager;
import
org.apache.log4j.Logger
;
import
org.vadere.simulator.models.DynamicElementFactory
;
import
org.vadere.simulator.models.MainModel
;
import
org.vadere.simulator.models.Model
;
import
org.vadere.simulator.projects.ScenarioStore
;
import
org.vadere.simulator.projects.dataprocessing.ProcessorManager
;
import
org.vadere.state.attributes.AttributesSimulation
;
...
...
@@ -31,7 +32,7 @@ public class Simulation {
private
DynamicElementFactory
dynamicElementFactory
;
private
final
List
<
PassiveCallback
>
passiveCallbacks
;
private
List
<
ActiveCallback
>
activeCallback
s
;
private
List
<
Model
>
model
s
;
private
ProcessorManager
processorManager
;
...
...
@@ -72,7 +73,7 @@ public class Simulation {
this
.
startTimeInSec
=
startTimeInSec
;
this
.
simTimeInSec
=
startTimeInSec
;
this
.
activeCallback
s
=
mainModel
.
get
ActiveCallback
s
();
this
.
model
s
=
mainModel
.
get
Submodel
s
();
// TODO [priority=normal] [task=bugfix] - the attributesCar are missing in initialize' parameters
this
.
dynamicElementFactory
=
mainModel
;
...
...
@@ -112,8 +113,8 @@ public class Simulation {
runSimulation
=
true
;
simTimeInSec
=
startTimeInSec
;
for
(
ActiveCallback
ac
:
activeCallback
s
)
{
ac
.
preLoop
(
simTimeInSec
);
for
(
Model
m
:
model
s
)
{
m
.
preLoop
(
simTimeInSec
);
}
for
(
PassiveCallback
c
:
passiveCallbacks
)
{
...
...
@@ -126,8 +127,8 @@ public class Simulation {
private
void
postLoop
()
{
simulationState
=
new
SimulationState
(
name
,
topography
,
scenarioStore
,
simTimeInSec
,
step
,
mainModel
);
for
(
ActiveCallback
ac
:
activeCallback
s
)
{
ac
.
postLoop
(
simTimeInSec
);
for
(
Model
m
:
model
s
)
{
m
.
postLoop
(
simTimeInSec
);
}
for
(
PassiveCallback
c
:
passiveCallbacks
)
{
...
...
@@ -168,7 +169,7 @@ public class Simulation {
c
.
preUpdate
(
simTimeInSec
);
}
update
Active
Callbacks
(
simTimeInSec
);
updateCallbacks
(
simTimeInSec
);
updateWriters
(
simTimeInSec
);
processorManager
.
update
(
this
.
simulationState
);
...
...
@@ -217,7 +218,7 @@ public class Simulation {
this
.
simulationState
=
simulationState
;
}
private
void
update
Active
Callbacks
(
double
simTimeInSec
)
{
private
void
updateCallbacks
(
double
simTimeInSec
)
{
this
.
targetControllers
.
clear
();
for
(
Target
target
:
this
.
topographyController
.
getTopography
().
getTargets
())
{
...
...
@@ -235,8 +236,8 @@ public class Simulation {
topographyController
.
update
(
simTimeInSec
);
step
++;
for
(
ActiveCallback
ac
:
activeCallback
s
)
{
ac
.
update
(
simTimeInSec
);
for
(
Model
m
:
model
s
)
{
m
.
update
(
simTimeInSec
);
}
if
(
topographyController
.
getTopography
().
hasTeleporter
())
{
...
...
VadereSimulator/src/org/vadere/simulator/models/MainModel.java
View file @
5ae5481c
...
...
@@ -2,15 +2,12 @@ package org.vadere.simulator.models;
import
java.util.List
;
import
org.vadere.simulator.control.ActiveCallback
;
/**
* A main model of a simulation which can include submodels.
*
*/
public
interface
MainModel
extends
Model
,
ActiveCallback
,
DynamicElementFactory
{
public
interface
MainModel
extends
Model
,
DynamicElementFactory
{
List
<
ActiveCallback
>
getActiveCallback
s
();
List
<
Model
>
getSubmodel
s
();
}
VadereSimulator/src/org/vadere/simulator/models/Model.java
View file @
5ae5481c
...
...
@@ -10,8 +10,10 @@ import org.vadere.state.scenario.Topography;
import
org.vadere.util.data.FindByClass
;
/**
* Interface for a simulation model. The <code>initialize</code> method must be called before usage!
*
* Interface for a simulation model.
* The <code>initialize</code> method must be called before usage!
* This interface defines a callbacks for the simulation loop.
* It's implementations define the major part of the simulation model's logic.
*
*/
public
interface
Model
{
...
...
@@ -23,6 +25,12 @@ public interface Model {
void
initialize
(
List
<
Attributes
>
attributesList
,
Topography
topography
,
AttributesAgent
attributesPedestrian
,
Random
random
);
void
preLoop
(
final
double
simTimeInSec
);
void
postLoop
(
final
double
simTimeInSec
);
void
update
(
final
double
simTimeInSec
);
public
static
<
T
extends
Attributes
>
T
findAttributes
(
List
<
Attributes
>
attributesList
,
final
Class
<
T
>
type
)
{
try
{
final
T
a
=
FindByClass
.
findSingleObjectOfClass
(
attributesList
,
type
);
...
...
VadereSimulator/src/org/vadere/simulator/models/SubModelBuilder.java
View file @
5ae5481c
...
...
@@ -4,7 +4,6 @@ import java.util.LinkedList;
import
java.util.List
;
import
java.util.Random
;
import
org.vadere.simulator.control.ActiveCallback
;
import
org.vadere.state.attributes.Attributes
;
import
org.vadere.state.attributes.scenario.AttributesAgent
;
import
org.vadere.state.scenario.Topography
;
...
...
@@ -12,7 +11,7 @@ import org.vadere.util.reflection.DynamicClassInstantiator;
/**
* Helper class to build submodels of a main model and add them to a
*
ActiveCallback list
.
*
list of models
.
*/
public
class
SubModelBuilder
{
...
...
@@ -40,18 +39,11 @@ public class SubModelBuilder {
}
}
/**
* Add submodels to a ActiveCallback list.
*
* Maybe in future <code>getSubModels()</code> instead? Currently, this is
* the best way to avoid redundancy of adding them to the list.
*/
public
void
addSubModelsToActiveCallbacks
(
List
<
ActiveCallback
>
activeCallbacks
)
{
for
(
Model
model
:
subModels
)
{
if
(
model
instanceof
ActiveCallback
)
{
activeCallbacks
.
add
((
ActiveCallback
)
model
);
}
}
/** Add the builded submodels to the client's list of models. */
public
void
addBuildedSubModelsToList
(
List
<
Model
>
modelList
)
{
// Maybe in future getSubModels() instead? Currently, this is
// the best way to avoid the redundancy of adding them to the list.
modelList
.
addAll
(
subModels
);
}
}
VadereSimulator/src/org/vadere/simulator/models/gnm/GradientNavigationModel.java
View file @
5ae5481c
package
org.vadere.simulator.models.gnm
;
import
org.vadere.simulator.control.ActiveCallback
;
import
org.vadere.simulator.models.Model
;
import
org.vadere.simulator.models.ode.IntegratorFactory
;
import
org.vadere.simulator.models.ode.ODEModel
;
...
...
@@ -38,7 +37,7 @@ public class GradientNavigationModel extends ODEModel<Pedestrian, AttributesAgen
private
PotentialFieldObstacle
potentialFieldObstacle
;
private
PotentialFieldAgent
potentialFieldPedestrian
;
private
int
pedestrianIdCounter
;
private
List
<
ActiveCallback
>
activeCallback
s
=
new
LinkedList
<>();
private
List
<
Model
>
model
s
=
new
LinkedList
<>();
@Deprecated
public
GradientNavigationModel
(
final
Topography
scenario
,
...
...
@@ -83,7 +82,7 @@ public class GradientNavigationModel extends ODEModel<Pedestrian, AttributesAgen
modelAttributesList
,
topography
,
attributesPedestrian
,
attributes
.
getTargetPotentialModel
());
this
.
potentialFieldTarget
=
iPotentialTargetGrid
;
activeCallback
s
.
add
(
iPotentialTargetGrid
);
model
s
.
add
(
iPotentialTargetGrid
);
this
.
potentialFieldObstacle
=
PotentialFieldObstacle
.
createPotentialField
(
modelAttributesList
,
topography
,
random
,
attributes
.
getObstaclePotentialModel
());
...
...
@@ -91,7 +90,7 @@ public class GradientNavigationModel extends ODEModel<Pedestrian, AttributesAgen
this
.
potentialFieldPedestrian
=
PotentialFieldAgent
.
createPotentialField
(
modelAttributesList
,
topography
,
attributes
.
getPedestrianPotentialModel
());
activeCallback
s
.
add
(
this
);
model
s
.
add
(
this
);
}
public
void
rebuildFloorField
(
final
double
simTimeInSec
)
{
...
...
@@ -165,8 +164,8 @@ public class GradientNavigationModel extends ODEModel<Pedestrian, AttributesAgen
}
@Override
public
List
<
ActiveCallback
>
getActiveCallback
s
()
{
return
activeCallback
s
;
public
List
<
Model
>
getSubmodel
s
()
{
return
model
s
;
}
@Override
...
...
VadereSimulator/src/org/vadere/simulator/models/gnm/PotentialFieldObstacleGNM.java
View file @
5ae5481c
...
...
@@ -23,8 +23,7 @@ import org.vadere.util.potential.gradients.GradientProvider;
* calculating the distance to that point.
*
*/
public
class
PotentialFieldObstacleGNM
implements
GradientProvider
,
PotentialFieldObstacle
{
public
class
PotentialFieldObstacleGNM
implements
GradientProvider
,
PotentialFieldObstacle
{
private
Collection
<
Obstacle
>
obstacles
;
...
...
@@ -125,4 +124,5 @@ public class PotentialFieldObstacleGNM implements GradientProvider,
AttributesAgent
attributesPedestrian
,
Random
random
)
{
// TODO should be used to initialize the Model
}
}
VadereSimulator/src/org/vadere/simulator/models/gnm/PotentialFieldPedestrianGNM.java
View file @
5ae5481c
...
...
@@ -112,4 +112,5 @@ public class PotentialFieldPedestrianGNM implements PotentialFieldAgent {
AttributesAgent
attributesPedestrian
,
Random
random
)
{
// TODO should be used to initialize the Model
}
}
VadereSimulator/src/org/vadere/simulator/models/groups/CentroidGroupModel.java
View file @
5ae5481c
package
org.vadere.simulator.models.groups
;
import
org.vadere.simulator.control.ActiveCallback
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Random
;
import
org.vadere.simulator.models.Model
;
import
org.vadere.simulator.models.potential.fields.PotentialFieldTarget
;
import
org.vadere.state.attributes.Attributes
;
...
...
@@ -9,21 +12,8 @@ import org.vadere.state.attributes.scenario.AttributesAgent;
import
org.vadere.state.scenario.Pedestrian
;
import
org.vadere.state.scenario.ScenarioElement
;
import
org.vadere.state.scenario.Topography
;
import
org.vadere.util.data.Table
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Random
;
import
java.util.TreeMap
;
public
class
CentroidGroupModel
implements
GroupModel
,
ActiveCallback
{
/**
* A Container for all the output this Callback generate. The output will be used
* by the processor.
*/
private
Map
<
String
,
Table
>
outputTables
;
public
class
CentroidGroupModel
implements
GroupModel
{
private
GroupSizeDeterminator
groupSizeDeterminator
;
private
Map
<
Integer
,
CentroidGroupFactory
>
groupFactories
;
...
...
VadereSimulator/src/org/vadere/simulator/models/groups/CentroidGroupPotential.java
View file @
5ae5481c
...
...
@@ -123,4 +123,5 @@ public class CentroidGroupPotential implements PotentialFieldAgent {
AttributesAgent
attributesPedestrian
,
Random
random
)
{
// TODO [priority=medium] [task=refactoring] should be used to initialize the Model
}
}
VadereSimulator/src/org/vadere/simulator/models/osm/OptimalStepsModel.java
View file @
5ae5481c
package
org.vadere.simulator.models.osm
;
import
org.vadere.simulator.control.ActiveCallback
;
import
org.vadere.simulator.models.MainModel
;
import
org.vadere.simulator.models.Model
;
import
org.vadere.simulator.models.SpeedAdjuster
;
...
...
@@ -77,7 +76,7 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel {
private
PriorityQueue
<
PedestrianOSM
>
pedestrianEventsQueue
;
private
ExecutorService
executorService
;
private
List
<
ActiveCallback
>
activeCallback
s
=
new
LinkedList
<>();
private
List
<
Model
>
model
s
=
new
LinkedList
<>();
@Deprecated
public
OptimalStepsModel
(
final
Topography
topography
,
final
AttributesOSM
attributes
,
...
...
@@ -130,13 +129,13 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel {
final
SubModelBuilder
subModelBuilder
=
new
SubModelBuilder
(
modelAttributesList
,
topography
,
attributesPedestrian
,
random
);
subModelBuilder
.
buildSubModels
(
attributesOSM
.
getSubmodels
());
subModelBuilder
.
addSubModelsTo
ActiveCallbacks
(
activeCallback
s
);
subModelBuilder
.
add
Builded
SubModelsTo
List
(
model
s
);
IPotentialTargetGrid
iPotentialTargetGrid
=
IPotentialTargetGrid
.
createPotentialField
(
modelAttributesList
,
topography
,
attributesPedestrian
,
attributesOSM
.
getTargetPotentialModel
());
this
.
potentialFieldTarget
=
iPotentialTargetGrid
;
activeCallback
s
.
add
(
iPotentialTargetGrid
);
model
s
.
add
(
iPotentialTargetGrid
);
this
.
potentialFieldObstacle
=
PotentialFieldObstacle
.
createPotentialField
(
modelAttributesList
,
topography
,
random
,
attributesOSM
.
getObstaclePotentialModel
());
...
...
@@ -144,7 +143,7 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel {
this
.
potentialFieldPedestrian
=
PotentialFieldAgent
.
createPotentialField
(
modelAttributesList
,
topography
,
attributesOSM
.
getPedestrianPotentialModel
());
Optional
<
CentroidGroupModel
>
opCentroidGroupModel
=
activeCallback
s
.
stream
().
Optional
<
CentroidGroupModel
>
opCentroidGroupModel
=
model
s
.
stream
().
filter
(
ac
->
ac
instanceof
CentroidGroupModel
).
map
(
ac
->
(
CentroidGroupModel
)
ac
).
findAny
();
if
(
opCentroidGroupModel
.
isPresent
())
{
...
...
@@ -181,7 +180,7 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel {
this
.
executorService
=
null
;
}
activeCallback
s
.
add
(
this
);
model
s
.
add
(
this
);
}
private
StepCircleOptimizer
createStepCircleOptimizer
(
...
...
@@ -327,8 +326,8 @@ public class OptimalStepsModel implements MainModel, PotentialFieldModel {
}
@Override
public
List
<
ActiveCallback
>
getActiveCallback
s
()
{
return
activeCallback
s
;
public
List
<
Model
>
getSubmodel
s
()
{
return
model
s
;
}
@Override
...
...
VadereSimulator/src/org/vadere/simulator/models/ovm/OptimalVelocityModel.java
View file @
5ae5481c
...
...
@@ -9,7 +9,6 @@ import java.util.Collections;
import
java.util.List
;
import
java.util.Random
;
import
org.vadere.simulator.control.ActiveCallback
;
import
org.vadere.simulator.models.Model
;
import
org.vadere.simulator.models.ode.IntegratorFactory
;
import
org.vadere.simulator.models.ode.ODEModel
;
...
...
@@ -29,16 +28,11 @@ public class OptimalVelocityModel extends ODEModel<Car, AttributesCar> {
private
int
carIdCounter
=
10000000
;
// TODO [priority=low] [task=refactoring] hack, think about another way of separating car IDs and pedestrian IDs.
private
AttributesOVM
attributesOVM
;
private
OVMEquations
ovmEquations
;
private
List
<
ActiveCallback
>
activeCallback
s
;
private
List
<
Model
>
model
s
;
/**
* Constructor for OptimalVelocityModel used in the ModelCreator
*
* @param scenario
* @param ovmEquations
* @param attributesOVM
* @param elementAttributes
* @param random
*/
@Deprecated
public
OptimalVelocityModel
(
Topography
scenario
,
...
...
@@ -83,7 +77,7 @@ public class OptimalVelocityModel extends ODEModel<Car, AttributesCar> {
ovmEquations
.
setModelAttributes
(
attributesOVM
);
ovmEquations
.
setGradients
(
null
,
null
,
null
,
topography
);
activeCallback
s
=
Collections
.
singletonList
(
this
);
model
s
=
Collections
.
singletonList
(
this
);
}
...
...
@@ -137,8 +131,8 @@ public class OptimalVelocityModel extends ODEModel<Car, AttributesCar> {
}
@Override
public
List
<
ActiveCallback
>
getActiveCallback
s
()
{
return
activeCallback
s
;
public
List
<
Model
>
getSubmodel
s
()
{
return
model
s
;
}
}
VadereSimulator/src/org/vadere/simulator/models/potential/fields/PotentialFieldAgent.java
View file @
5ae5481c
...
...
@@ -30,6 +30,18 @@ public interface PotentialFieldAgent extends Model {
Logger
logger
=
LogManager
.
getLogger
(
PotentialFieldAgent
.
class
);
@Override
default
void
preLoop
(
double
simTimeInSec
)
{
}
@Override
default
void
postLoop
(
double
simTimeInSec
)
{
}
@Override
default
void
update
(
double
simTimeInSec
)
{
}
/**
* Computes the pedestrians possessing a potential that reaches into the
* given relevantArea.
...
...
@@ -98,4 +110,5 @@ public interface PotentialFieldAgent extends Model {
return
result
;
}
}
VadereSimulator/src/org/vadere/simulator/models/potential/fields/PotentialFieldObstacle.java
View file @
5ae5481c
...
...
@@ -25,6 +25,19 @@ import org.vadere.util.reflection.DynamicClassInstantiator;
import
org.vadere.util.reflection.VadereClassNotFoundException
;
public
interface
PotentialFieldObstacle
extends
Model
{
@Override
default
void
preLoop
(
double
simTimeInSec
)
{
}
@Override
default
void
postLoop
(
double
simTimeInSec
)
{
}
@Override
default
void
update
(
double
simTimeInSec
)
{
}
public
double
getObstaclePotential
(
VPoint
pos
,
Agent
pedestrian
);
public
Vector2D
getObstaclePotentialGradient
(
VPoint
pos
,
...
...
VadereSimulator/src/org/vadere/simulator/models/potential/fields/PotentialFieldTarget.java
View file @
5ae5481c
package
org.vadere.simulator.models.potential.fields
;
import
org.vadere.simulator.control.ActiveCallback
;
import
org.vadere.simulator.models.Model
;
import
org.vadere.state.scenario.Agent
;
import
org.vadere.util.geometry.Vector2D
;
import
org.vadere.util.geometry.shapes.VPoint
;
public
interface
PotentialFieldTarget
extends
ActiveCallback
,
Model
{
public
interface
PotentialFieldTarget
extends
Model
{
boolean
needsUpdate
();
double
getTargetPotential
(
final
VPoint
pos
,
final
Agent
ped
);
...
...
VadereSimulator/src/org/vadere/simulator/models/sfm/PotentialFieldObstacleSFM.java
View file @
5ae5481c
...
...
@@ -11,7 +11,6 @@ import org.vadere.state.attributes.models.AttributesPotentialSFM;
import
org.vadere.state.attributes.scenario.AttributesAgent
;
import
org.vadere.state.scenario.Agent
;
import
org.vadere.state.scenario.Obstacle
;
import
org.vadere.state.scenario.Pedestrian
;
import
org.vadere.state.scenario.Topography
;
import
org.vadere.util.geometry.GeometryUtils
;
import
org.vadere.util.geometry.Vector2D
;
...
...
VadereSimulator/src/org/vadere/simulator/models/sfm/PotentialFieldPedestrianSFM.java
View file @
5ae5481c
...
...
@@ -9,7 +9,6 @@ import org.vadere.state.attributes.Attributes;
import
org.vadere.state.attributes.models.AttributesPotentialSFM
;
import
org.vadere.state.attributes.scenario.AttributesAgent
;
import
org.vadere.state.scenario.Agent
;
import
org.vadere.state.scenario.Pedestrian
;
import
org.vadere.state.scenario.Topography
;
import
org.vadere.util.geometry.Vector2D
;
import
org.vadere.util.geometry.shapes.VCircle
;
...
...
@@ -138,4 +137,22 @@ public class PotentialFieldPedestrianSFM implements PotentialFieldAgent {
AttributesAgent
attributesPedestrian
,
Random
random
)
{
// TODO should be used to initialize the Model
}
@Override
public
void
preLoop
(
double
simTimeInSec
)
{
// TODO Auto-generated method stub
}
@Override
public
void
postLoop
(
double
simTimeInSec
)
{
// TODO Auto-generated method stub
}
@Override
public
void
update
(
double
simTimeInSec
)
{
// TODO Auto-generated method stub
}
}
VadereSimulator/src/org/vadere/simulator/models/sfm/SocialForceModel.java
View file @
5ae5481c
package
org.vadere.simulator.models.sfm
;
import
org.vadere.simulator.control.ActiveCallback
;
import
org.vadere.simulator.models.Model
;
import
org.vadere.simulator.models.ode.IntegratorFactory
;
import
org.vadere.simulator.models.ode.ODEModel
;
...
...
@@ -35,7 +34,7 @@ public class SocialForceModel extends ODEModel<Pedestrian, AttributesAgent> {
private
IPotentialTargetGrid
potentialFieldTarget
;
private
PotentialFieldObstacle
potentialFieldObstacle
;
private
PotentialFieldAgent
potentialFieldPedestrian
;
private
List
<
ActiveCallback
>
activeCallback
s
=
new
LinkedList
<>();
private
List
<
Model
>
model
s
=
new
LinkedList
<>();
private
int
pedestrianIdCounter
;
...
...
@@ -84,7 +83,7 @@ public class SocialForceModel extends ODEModel<Pedestrian, AttributesAgent> {
modelAttributesList
,
topography
,
attributesPedestrian
,
attributes
.
getTargetPotentialModel
());
this
.
potentialFieldTarget
=
iPotentialTargetGrid
;
activeCallback
s
.
add
(
iPotentialTargetGrid
);
model
s
.
add
(
iPotentialTargetGrid
);
this
.
potentialFieldObstacle
=
PotentialFieldObstacle
.
createPotentialField
(
modelAttributesList
,
topography
,
random
,
attributes
.
getObstaclePotentialModel
());
...
...
@@ -92,7 +91,7 @@ public class SocialForceModel extends ODEModel<Pedestrian, AttributesAgent> {
this
.
potentialFieldPedestrian
=
PotentialFieldAgent
.
createPotentialField
(
modelAttributesList
,
topography
,
attributes
.
getPedestrianPotentialModel
());
activeCallback
s
.
add
(
this
);
model
s
.
add
(
this
);
}
public
void
rebuildFloorField
(
final
double
simTimeInSec
)
{
...
...
@@ -158,8 +157,8 @@ public class SocialForceModel extends ODEModel<Pedestrian, AttributesAgent> {
}
@Override
public
List
<
ActiveCallback
>
getActiveCallback
s
()
{
return
activeCallback
s
;
public
List
<
Model
>
getSubmodel
s
()
{
return
model
s
;
}
}
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