Closed ssardina closed 3 years ago
A variation of the planner could be any Clingo encoding, where we would expect it uses the state sample information to output atoms policy(State, Action). Then, the input to the encoding would be atoms:
state(S): S is a state
initialState(S): S is the initial state
goal(S): S is a goal state
action(A): A is an action
transition(S1, A, S2): S2 belongs to F(S1, A) (F being the transition function)
con_A(A, I): action A belongs to set of constraints A_I
con_B(A, I): action A belongs to set of constraints B_I
The specializations of the planner are examples of variations, and could be passed to the -planner option.
Added new section to the README explaining the requirements for variations of the Clingo encoding.
ahh entiendo. OK no es una modificacion de el planner, sino la especificacion del problema de planning + fariness directamente y explicitamente en ASAP. O sea no desde un PDDL sino explicitamente como un sistema de transiciones, que es lo que usa el ASP planner.
Correcto?
Ivan, genial, me gusto la seccion que agregaste al README, era necesaria.
Una pregunta, que tal el predicado id/2
, no se necesita?
Hace pull que hize algunas mejoras pequeñas en el README (e.g., font, etc)
Sí puede ser una modificación del planner, solo que ponemos como especificación que debería tener dichos símbolos como expected inputs, pues es lo que recibirá el programa al traducir un PDDL y son los atoms que estamos usando para representar FOND+ problems.
El predicado id/2 se usa solo para display final de la policy. El PDDL parser lo usa para asignar una descripción a los estados y acciones, que están representados con integer ids, y al encontrar un modelo se usan los id/2 para sacar un output más legible. Ej:
policy("<n-gr0()>","pick-above-x()") policy("<n-gr0(),holding()>","putaway()")
en vez de
policy(0,0) policy(1,2)
Para conseguir esto solo hace falta conservar una regla
#show policy(State, Action): policy(IdS, IdA), id(state(State), IdS), id(action(Action), IdA), reach(IdS). %only for display purposes
La lógica del programa no usa los id/2, pero sí añadiré algún comentario al README.
mmm a ver dejame enterder bien esto:
Sí puede ser una modificación del planner, solo que ponemos como especificación que debería tener dichos símbolos como expected inputs, pues es lo que recibirá el programa al traducir un PDDL y son los atoms que estamos usando para representar FOND+ problems.
Claro, entonces el planner en si queda igual, lo que cambia es la forma en que especificas el problema. En vez de dar el PDDL, lo que das es la representacion en ASP format already; lo que el traductor generaria de un PDDL.
Pero el planner solver no lo tocas, queda igual. Correcto? Pregunto porque decis "Sí puede ser una modificación del planner" y el comando dice:
suguiriendo que uno puede dar su propio planner, cuando en realidad lo que da es el problema en ASP encoding en vez de en PDDL. Es correcto lo que digo?
Seria bueno decir como seria exactamente una llamada de esta forma, usando uno de los varios ejemplos que ya tenemos en el repo. Como seria la llamada?
Perfecto lo de id/2
.
No no, el input [PLANNER] en el comando arriba puede ser un clingo encoding que exprese reglas para buscar una policy, ej: nuestro planer base, o los planners especializados para strong/strong cyclic FONDs. Lo que quiero decir en la sección es que si se quiere probar un encoding diferente del planner, se debería tomar en cuenta que estos átomos serán el input a recibir. Pero entiendo la confusión, porque esto al mismo tiempo expresa cómo alguien debería escribir un FOND+ domain en un clingo file para pasarselo al planner. De hecho, hay una opción "-clingo ..." a la que se le puede pasar un domain expresado en clingo directamente al planner Digamos que tenemos:
Quizás se puede expresar de una forma más clara. Avísame si aun tienes dudas.
mm si es un poco confuso todo, pero lo vamos a arreglar juntos :-)
[PLANNER]
puede ser otro planner cualqueira entonces lo unico que ofrecemos es cierto API para encodear un PDDl problem? Vos decis que puede ser uno de nuestros especializados, pero yo veo que lo llamamos con la opcion --strongcyclic
. Como seria el ejemplo para usar strong specialization por ejemplo?
2.Me podes dar ejemplos de todos los casos? O sea como uso mi sistema sobre una especificacion usando los atomos que decimos usando --clingo
? Y como uso usando --planner
Tenemos que hacer bien claro las opciones porque por lo que veo para usar el especializado strong, usamos directamente --strong
, y no --planner strong
, o me equivoco?
Todo esto es facil, solo tenemos que homogenizarlo y ponerlo claro en el README. Si me das ejemplos concretos que pueda correr yo lo armo facil.
Gracias Ivan!
Exacto con --strong ya basta para llamar al specialized, pero también funcionaría usar
--planner fcfond/planner_clingo/specialized/planner_strong.lp
Que es el encoding para strong planning. Por otro lado, si no se especifica la opción --planner
(ni --strong
o --strongcyclic
), se usa por defecto nuestro encoding general para resolver FOND+ problems.
Por poner algunos ejemplos de las opciones:
--clingo
, en la carpeta fcfond/domains/clingo hay algunos dominios ya traducidos a clingo. Yo podría por ejemplo llamar al programa con la opción --clingo fcfond/domains/clingo/clear.lp
para pasar de input el dominio QNP clear, que sería lo mismo que pasar como argumento clear_qnp, que está en la lista de experimentos de la repo.--planner
está por ejemplo --planner fcfond/planner_clingo/specialized/planner_strong.lp
, que como decía arriba es igual que la opción --strong. Como dices, lo que especifican los símbolos son una especie de API a tomar en cuenta si quiero hacer cambios al encoding.--clingo
como --planner
, no estoy usando ni el planner base ni el PDDL parser, así que en este caso las consideraciones sobre cuáles son los input symbols no importan, porque estoy especificando los dos programas que clingo recibe como input. Es prácticamente como si llamara directamente clingo PLANNER DOMAIN
.Quizás una forma de distinguir mejor ambas cosas sería tener una sección donde se explique los input symbols así como lo tenemos ahora, pero sin mencionar que se puede pasar el planner, y esto comentarlo aparte. La idea de tener la opción --planner
era más que nada poder probar cambios en el encoding cuando ibamos teniendo ideas, manteniendo cosas en files diferentes sobre los que se pudiera escoger por command line.
Brillante Ivan, gracias por la explicación clara. Si entiendo ahora la idea atras de --planner
.
Voy a ver hoy como dejar todo esto claro en el README, me diste todo el material.
Quizas tengas razon, quizas estaria bueno tener una seccion para el encoding mismo.
Hoy veo si lo empujo. Gracias!
Hola @idrave . OK al fin pude ponerme con esto. Estoy mejorando el README y poniendo ejemplos concretos.
Mientras hacia eso encontre un par de "issues" pequeños, quizas porque no entiendo el sistema..
Ante todo quiero correr un ejemplo directamente. Entonces puse:
python -m fcfond.main -pddl fcfond/domains/pddl/fond-sat/blocksworld-ipc08/domain.pddl,fcfond/domains/pddl/fond-sat/blocksworld-ipc08/p01.pddl
Traceback (most recent call last):
File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/ssardina/git/soft/planning/FOND/FOND-ASP.git/fcfond/main.py", line 70, in <module>
main()
File "/home/ssardina/git/soft/planning/FOND/FOND-ASP.git/fcfond/main.py", line 54, in main
run_pddl(args.pddl, args.timeout, args.memout,
File "/home/ssardina/git/soft/planning/FOND/FOND-ASP.git/fcfond/run.py", line 59, in run_pddl
out_path = Path(output)
File "/usr/lib/python3.8/pathlib.py", line 1038, in __new__
self = cls._from_parts(args, init=False)
File "/usr/lib/python3.8/pathlib.py", line 679, in _from_parts
drv, root, parts = self._parse_args(args)
File "/usr/lib/python3.8/pathlib.py", line 663, in _parse_args
a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not NoneType
El problema es que run_pddl
no tiene ningun output por defecto creo, que en el README no parece indicar que uno tenga que usar si o si -out
. Lo arregle asi (hice push):
out_path = Path(output) if output != None else Path(OUTPUT)
De todas formas, aun asi luego me da error:
python -m fcfond.main -pddl fcfond/domains/pddl/fond-sat/blocksworld-ipc08/domain.pddl,fcfond/domains/pddl/fond-sat/blocksworld-ipc08/p01.pddl
['fcfond/domains/pddl/fond-sat/blocksworld-ipc08/domain.pddl,fcfond/domains/pddl/fond-sat/blocksworld-ipc08/p01.pddl']
Traceback (most recent call last):
File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/ssardina/git/soft/planning/FOND/FOND-ASP.git/fcfond/main.py", line 70, in <module>
main()
File "/home/ssardina/git/soft/planning/FOND/FOND-ASP.git/fcfond/main.py", line 54, in main
run_pddl(args.pddl, args.timeout, args.memout,
File "/home/ssardina/git/soft/planning/FOND/FOND-ASP.git/fcfond/run.py", line 63, in run_pddl
for domain, problem in pddl_files:
ValueError: too many values to unpack (expected 2)
claramente no puede hacer la linea
for domain, problem in pddl_files:
en run_pddl
La pregunta es: cual es el formato que esperas en -pddl
? No es una lista de PDDL files?
OK progrese bastante este issue. hice un refactoring del README importante y puse muchas cosas que charlamos aca.
Pero aun no me funcionan los comandos de ejemplo que quiero poner. Para cada caso quiero poner un ejemplo.
A ver @idrave si me ayudas aca; o hay un par de bugs dando vuelta, o mi laptop esta caprichosa! ;-)
Mira los issues #7 y #8 tambien..
Dame un ejemplo concreto de como usarlo con la opcion -pddl
;-)
Ví el update del README, genial!
Sí habían un par de bugs pequeños por ahí. Cambié algunas cosas e hice pruebas y de momento me funcionan las diferentes combinaciones de opciones.
Con la opción -pddl es como el ejemplo que añadiste al README, pero sin ,
:
$ python -m fcfond.main -pddl fcfond/domains/pddl/fond-sat/blocksworld-ipc08/domain.pddl fcfond/domains/pddl/fond-sat/blocksworld-ipc08/p01.pddl
Si te da algún otro problema lo vemos.
All good, I think all this has been resolved, bugs have been fixed, and everything is reflected in the README now!
The readme says:
What does it mean "own variation" of the planner? Can we explain to the user what this means, and even give what an example would be of that?
In particular, are the specializations one such variations?