O workflow para em caso de erro do algoritmo
gmgall opened this issue · comments
O workflow para de executar em pontos arbitrários caso exista alguma espécie no arquivo de ocorrências que gere um erro com o algoritmo e parâmetros escolhidos. Reproduzo um exemplo do problema abaixo.
Considere o seguinte arquivo de ocorrências:
id especies longitude latitude pres
1 Abarema adenophora -59.974722 -2.929444 1
2 Abarema arenaria -65.63333333 1.516666667 1
3 Abarema brachystachya -48.501389 -25.652222 1
4 Abarema brachystachya -46.063889 -23.809444 1
5 Abarema brachystachya -38 -12.05 1
6 Abarema cochleata -59.974722 -2.929444 1
7 Abarema cochliacarpos -41.8 -12.283333 1
8 Abarema cochliacarpos -41.794444 -12.247778 1
9 Abarema cochliacarpos -41.793611 -12.2425 1
10 Abarema cochliacarpos -41.514722 -12.467222 1
11 Abarema cochliacarpos -41.514167 -12.86 1
12 Abarema cochliacarpos -41.5 -12.716667 1
13 Abarema cochliacarpos -41.5 -12.433333 1
14 Abarema cochliacarpos -41.4725 -12.4575 1
15 Abarema cochliacarpos -41.466667 -12.633333 1
16 Abarema cochliacarpos -41.466667 -12.45 1
17 Abarema cochliacarpos -41.383333 -12.533333 1
18 Abarema cochliacarpos -41.366667 -12.516667 1
19 Abarema cochliacarpos -41.333889 -13.559722 1
20 Abarema cochliacarpos -41.266667 -11.516667 1
21 Abarema cochliacarpos -41.258611 -11.520833 1
22 Abarema cochliacarpos -41.208056 -11.591389 1
23 Abarema cochliacarpos -41.206667 -11.590833 1
24 Abarema cochliacarpos -41.203333 -11.584722 1
25 Abarema cochliacarpos -41.2 -11.866667 1
26 Abarema cochliacarpos -41.188611 -11.445 1
27 Abarema cochliacarpos -41.185556 -11.833056 1
28 Abarema cochliacarpos -41.181667 -11.573056 1
29 Abarema cochliacarpos -41.179444 -11.482222 1
30 Abarema cochliacarpos -41.158333 -11.638056 1
31 Abarema cochliacarpos -41.141944 -11.761667 1
32 Abarema cochliacarpos -41.133333 -11.75 1
33 Abarema cochliacarpos -41.053611 -11.76 1
34 Abarema cochliacarpos -41.033333 -12.016667 1
35 Abarema cochliacarpos -40.992778 -11.625278 1
36 Abarema cochliacarpos -40.884444 -11.466111 1
37 Abarema cochliacarpos -40.75 -11.383333 1
38 Abarema cochliacarpos -40.423056 -13.485 1
39 Abarema cochliacarpos -39.884167 -13.120556 1
40 Abarema cochliacarpos -39.603333 -14.705833 1
41 Abarema cochliacarpos -39.154444 -13.7725 1
42 Abarema cochliacarpos -39.045278 -13.689444 1
43 Abarema cochliacarpos -38.433333 -9.966667 1
44 Abarema cochliacarpos -38.428056 -12.185 1
45 Abarema cochliacarpos -38.416667 -12.95 1
46 Abarema cochliacarpos -38.4 -12.166667 1
47 Abarema cochliacarpos -38.35 -12.933333 1
48 Abarema cochliacarpos -37.916667 -11.716667 1
49 Abarema cochliacarpos -37.866667 -12.216667 1
E o seguinte request file, gerado pelo próprio workflow (a maior parte das linhas comentadas foi apagada por concisão):
#####################
### Input section ###
WKT Coord System = GEOGCS[WGS84, DATUM[WGS84, SPHEROID[WGS84, 6378137.0, 298.257223563]], PRIMEM[Greenwich, 0.0], UNIT[degree, 0.017453292519943295], AXIS[Longitude,EAST], AXIS[Latitude,NORTH]]
Occurrences source = teste.txt
Occurrences group = Abarema arenaria
Map = workshop/Brasil_ASC/alt.asc
Map = workshop/Brasil_ASC/bio1.asc
Map = workshop/Brasil_ASC/bio12.asc
Mask = workshop/Brasil_ASC/bio12.asc
######################
### Output section ###
Output format = workshop/Brasil_ASC/bio12.asc
Output map = workshop/Brasil_ASC/alt.asc
Output map = workshop/Brasil_ASC/bio1.asc
Output map = workshop/Brasil_ASC/bio12.asc
Output mask = workshop/Brasil_ASC/bio12.asc
Output model = output_Abarema arenaria.xml
Output file = output_Abarema arenaria.img
Output file type = GreyBMP
########
# SVM
#
Algorithm = SVM
Parameter = SvmType 0
Parameter = KernelType 2
Parameter = Degree 3
Parameter = Gamma 0
Parameter = C 1
Parameter = Coef0 0
Parameter = Nu 0.5
Parameter = ProbabilisticOutput 0
Parameter = NumberOfPseudoAbsences 500
O resultado da execução do workflow é o seguinte:
$ ~/swift-0.93/bin/swift -tc.file tc.data -sites.file sites.xml workflow-openmodeller.swift -o=teste.txt
Swift 0.93 swift-r5483 cog-r3339
RunID: 20140121-1545-vk9vin9a
(input): found 20 files
Progress: time: Ter, 21 Jan 2014 15:45:19 -0200
Progress: time: Ter, 21 Jan 2014 15:45:21 -0200 Checking status:1
Progress: time: Ter, 21 Jan 2014 15:45:22 -0200 Stage in:4 Submitting:1 Finished successfully:1
Progress: time: Ter, 21 Jan 2014 15:45:25 -0200 Active:4 Checking status:1 Finished successfully:1
Progress: time: Ter, 21 Jan 2014 15:45:27 -0200 Active:4 Checking status:1 Finished successfully:1
Progress: time: Ter, 21 Jan 2014 15:45:30 -0200 Active:4 Checking status:1 Finished successfully:1
Execution failed:
File not found: /var/tmp/gmgall/swiftwork/workflow-openmodeller-20140121-1545-vk9vin9a/shared/output_Abarema arenaria.xml
E nenhum arquivo de saída é gerado (arquivos nomeados output_
):
$ ls output*
ls: impossível acessar output*: Arquivo ou diretório não encontrado
Uma execução isolada do om_console
mostra que foi um erro específico do algoritmo:
$ om_console request_Abarema\ arenaria.txt
[Info] openModeller version 1.4.0
[Info] Reading occurrences...done
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/alt.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/bio1.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Info] Reading layers...done
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Warn] Presence Point "2" at (-65.633333,1.516667) has no environment. It will be discarded.
[Info] Creating model
[Error] Cannot create model without any presence or absence point.
[Info] Exception occurred: Cannot create model without any presence or absence point.
Removendo a linha referente à espécie problemática (Abarema arenaria
), o workflow executa até o fim e gera os arquivos de saída:
$ # Remove as linhas contendo Abarema arenaria
$ sed '/Abarema arenaria/d' -i teste.txt
$ # Reexecuta o workflow
$ ~/swift-0.93/bin/swift -tc.file tc.data -sites.file sites.xml workflow-openmodeller.swift -o=teste.txt
Swift 0.93 swift-r5483 cog-r3339
RunID: 20140121-1559-i2sh2hif
(input): found 20 files
Progress: time: Ter, 21 Jan 2014 15:59:50 -0200
Progress: time: Ter, 21 Jan 2014 15:59:51 -0200 Checking status:1
Progress: time: Ter, 21 Jan 2014 15:59:53 -0200 Stage in:3 Submitting:1 Finished successfully:1
Progress: time: Ter, 21 Jan 2014 16:00:20 -0200 Active:4 Finished successfully:1
Progress: time: Ter, 21 Jan 2014 16:00:41 -0200 Active:3 Checking status:1 Finished successfully:1
Progress: time: Ter, 21 Jan 2014 16:00:50 -0200 Active:2 Finished successfully:3
Progress: time: Ter, 21 Jan 2014 16:00:52 -0200 Active:1 Checking status:1 Finished successfully:3
Progress: time: Ter, 21 Jan 2014 16:01:20 -0200 Active:1 Finished successfully:4
Progress: time: Ter, 21 Jan 2014 16:01:23 -0200 Checking status:1 Finished successfully:4
Final status: time: Ter, 21 Jan 2014 16:01:23 -0200 Finished successfully:5
$ # Os arquivos de saída são gerados normalmente
$ ls output*
output_Abarema adenophora.img output_Abarema brachystachya.img output_Abarema cochleata.img output_Abarema cochliacarpos.img
output_Abarema adenophora.xml output_Abarema brachystachya.xml output_Abarema cochleata.xml output_Abarema cochliacarpos.xml
Portanto, atualmente o workflow só executará até o fim se for garantido que a combinação algoritmo + pontos de ocorrência não gerará erros para todas as espécies que aparecerem no arquivo de ocorrências.
Tentei verificar o código de retorno do om_console
em caso de erro, mas ele sempre retorna 0
(sucesso) independente da modelagem ter sido concluída ou não.
Mudar para MAXENT (commit e28f288) não muda muito a situação. Só resolve o problema no caso específico do erro ser a existência de apenas um ponto de ocorrência para a espécie. Se existir um ponto, mas ele precisar ser excluído pelo openModeller por falta de camadas ambientais, por exemplo, o erro permanece.
É isso que acontece com a espécie Abarema arenaria
no exemplo acima, mesmo mudando o algoritmo:
$ om_console request_Abarema\ arenaria.txt
[Info] openModeller version 1.4.0
[Info] Reading occurrences...done
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/alt.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/bio1.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Info] Reading layers...done
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Warn] The raster workshop/Brasil_ASC/bio12.asc is not georeferenced. Assuming LatLong WGS84
[Warn] Presence Point "2" at (-65.633333,1.516667) has no environment. It will be discarded.
[Info] Creating model
[Error] Cannot create model without any presence or absence point.
[Info] Exception occurred: Cannot create model without any presence or absence point.
Para o workflow executar até o fim do jeito que está hoje, ainda é preciso garantir que o algoritmo escolhido não gerará nenhum erro no openModeller para todas as espécies que aparecem no arquivo de ocorrências.
Parar é o comportamento desejado para garantir consistência na execução dos workflows em vários casos.
Para fazer o laço foreach
continuar mesmo em caso de erro, basta setar lazy.errors=true
no arquivo swift.properties
.